LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY0eHhfaGFsX2NyeXAuYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENyeXB0b2dyYXBoeSAoQ1JZUCkgcGVyaXBoZXJhbDoKICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uLCBkZS1pbml0aWFsaXphdGlvbiwgc2V0IGNvbmZpZyBhbmQgZ2V0IGNvbmZpZyAgZnVuY3Rpb25zCiAgKiAgICAgICAgICAgKyBERVMvVERFUywgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zCiAgKiAgICAgICAgICAgKyBETUEgY2FsbGJhY2sgZnVuY3Rpb25zCiAgKiAgICAgICAgICAgKyBDUllQIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCiAgKgogIEB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICAgIFRoZSBDUllQIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgaW4gQ1JZUCBvciBUaW55QUVTIElQIGFzIGZvbGxvd3M6CgogICAgICAoIylJbml0aWFsaXplIHRoZSBDUllQIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZSBIQUxfQ1JZUF9Nc3BJbml0KCk6CiAgICAgICAgICgjIykgRW5hYmxlIHRoZSBDUllQIGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfQ1JZUF9DTEtfRU5BQkxFKClvciBfX0hBTF9SQ0NfQUVTX0NMS19FTkFCTEUgZm9yIFRpbnlBRVMgSVAKICAgICAgICAgKCMjKSBJbiBjYXNlIG9mIHVzaW5nIGludGVycnVwdHMgKGUuZy4gSEFMX0NSWVBfRW5jcnlwdF9JVCgpKQogICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBDUllQIGludGVycnVwdCBwcmlvcml0eSB1c2luZyBIQUxfTlZJQ19TZXRQcmlvcml0eSgpCiAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIENSWVAgSVJRIGhhbmRsZXIgdXNpbmcgSEFMX05WSUNfRW5hYmxlSVJRKCkKICAgICAgICAgICAgICgrKyspIEluIENSWVAgSVJRIGhhbmRsZXIsIGNhbGwgSEFMX0NSWVBfSVJRSGFuZGxlcigpCiAgICAgICAgICgjIykgSW4gY2FzZSBvZiB1c2luZyBETUEgdG8gY29udHJvbCBkYXRhIHRyYW5zZmVyIChlLmcuIEhBTF9DUllQX0VuY3J5cHRfRE1BKCkpCiAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIERNQXggaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fUkNDX0RNQXhfQ0xLX0VOQUJMRSgpCiAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgYW5kIGVuYWJsZSB0d28gRE1BIHN0cmVhbXMgb25lIGZvciBtYW5hZ2luZyBkYXRhIHRyYW5zZmVyIGZyb20KICAgICAgICAgICAgICAgICBtZW1vcnkgdG8gcGVyaXBoZXJhbCAoaW5wdXQgc3RyZWFtKSBhbmQgYW5vdGhlciBzdHJlYW0gZm9yIG1hbmFnaW5nIGRhdGEKICAgICAgICAgICAgICAgICB0cmFuc2ZlciBmcm9tIHBlcmlwaGVyYWwgdG8gbWVtb3J5IChvdXRwdXQgc3RyZWFtKQogICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBDUllQIERNQSBoYW5kbGUKICAgICAgICAgICAgICAgICB1c2luZyAgX19IQUxfTElOS0RNQSgpCiAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZQogICAgICAgICAgICAgICAgIGludGVycnVwdCBvbiB0aGUgdHdvIERNQSBTdHJlYW1zLiBUaGUgb3V0cHV0IHN0cmVhbSBzaG91bGQgaGF2ZSBoaWdoZXIKICAgICAgICAgICAgICAgICBwcmlvcml0eSB0aGFuIHRoZSBpbnB1dCBzdHJlYW0gSEFMX05WSUNfU2V0UHJpb3JpdHkoKSBhbmQgSEFMX05WSUNfRW5hYmxlSVJRKCkKCiAgICAgICgjKUluaXRpYWxpemUgdGhlIENSWVAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyA6CiAgICAgICAgICgjIykgVGhlIGRhdGEgdHlwZTogMS1iaXQsIDgtYml0LCAxNi1iaXQgb3IgMzItYml0LgogICAgICAgICAoIyMpIFRoZSBrZXkgc2l6ZTogMTI4LCAxOTIgb3IgMjU2LgogICAgICAgICAoIyMpIFRoZSBBbGdvTW9kZSBERVMvIFRERVMgQWxnb3JpdGhtIEVDQi9DQkMgb3IgQUVTIEFsZ29yaXRobSBFQ0IvQ0JDL0NUUi9HQ00gb3IgQ0NNLgogICAgICAgICAoIyMpIFRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKGNvdW50ZXIpLiBJdCBpcyBub3QgdXNlZCBpbiBFQ0IgbW9kZS4KICAgICAgICAgKCMjKSBUaGUga2V5IGJ1ZmZlciB1c2VkIGZvciBlbmNyeXB0aW9uL2RlY3J5cHRpb24uCiAgICAgICAgICgjIykgVGhlIEhlYWRlciB1c2VkIG9ubHkgaW4gQUVTIEdDTSBhbmQgQ0NNIEFsZ29yaXRobSBmb3IgYXV0aGVudGljYXRpb24uCiAgICAgICAgICgjIykgVGhlIEhlYWRlclNpemUgVGhlIHNpemUgb2YgaGVhZGVyIGJ1ZmZlciBpbiB3b3JkLgogICAgICAgICAoIyMpIFRoZSBCMCBibG9jayBpcyB0aGUgZmlyc3QgYXV0aGVudGljYXRpb24gYmxvY2sgdXNlZCBvbmx5ICBpbiBBRVMgQ0NNIG1vZGUuCgogICAgICAoIylUaHJlZSBwcm9jZXNzaW5nIChlbmNyeXB0aW9uL2RlY3J5cHRpb24pIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlOgogICAgICAgICAoIyMpIFBvbGxpbmcgbW9kZTogZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBBUElzIGFyZSBibG9ja2luZyBmdW5jdGlvbnMKICAgICAgICAgICAgICBpLmUuIHRoZXkgcHJvY2VzcyB0aGUgZGF0YSBhbmQgd2FpdCB0aWxsIHRoZSBwcm9jZXNzaW5nIGlzIGZpbmlzaGVkLAogICAgICAgICAgICAgIGUuZy4gSEFMX0NSWVBfRW5jcnlwdCAmIEhBTF9DUllQX0RlY3J5cHQKICAgICAgICAgKCMjKSBJbnRlcnJ1cHQgbW9kZTogZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBBUElzIGFyZSBub3QgYmxvY2tpbmcgZnVuY3Rpb25zCiAgICAgICAgICAgICAgaS5lLiB0aGV5IHByb2Nlc3MgdGhlIGRhdGEgdW5kZXIgaW50ZXJydXB0LAogICAgICAgICAgICAgIGUuZy4gSEFMX0NSWVBfRW5jcnlwdF9JVCAmIEhBTF9DUllQX0RlY3J5cHRfSVQKICAgICAgICAgKCMjKSBETUEgbW9kZTogZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBBUElzIGFyZSBub3QgYmxvY2tpbmcgZnVuY3Rpb25zCiAgICAgICAgICAgICAgaS5lLiB0aGUgZGF0YSB0cmFuc2ZlciBpcyBlbnN1cmVkIGJ5IERNQSwKICAgICAgICAgICAgICBlLmcuIEhBTF9DUllQX0VuY3J5cHRfRE1BICYgSEFMX0NSWVBfRGVjcnlwdF9ETUEKCiAgICAgICgjKVdoZW4gdGhlIHByb2Nlc3NpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IGZpcnN0IHRpbWUgYWZ0ZXIgSEFMX0NSWVBfSW5pdCgpCiAgICAgICAgIHRoZSBDUllQIHBlcmlwaGVyYWwgaXMgY29uZmlndXJlZCBhbmQgcHJvY2Vzc2VzIHRoZSBidWZmZXIgaW4gaW5wdXQuCiAgICAgICAgIEF0IHNlY29uZCBjYWxsLCBubyBuZWVkIHRvIEluaXRpYWxpemUgdGhlIENSWVAsIHVzZXIgaGF2ZSB0byBnZXQgY3VycmVudCBjb25maWd1cmF0aW9uIHZpYQogICAgICAgICBIQUxfQ1JZUF9HZXRDb25maWcoKSBBUEksIHRoZW4gb25seSAgSEFMX0NSWVBfU2V0Q29uZmlnKCkgaXMgcmVxdWVzdGVkIHRvIHNldAogICAgICAgICBuZXcgcGFyYW1ldHJlcywgZmluYWxseSB1c2VyIGNhbiAgc3RhcnQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLgoKICAgICAgICgjKUNhbGwgSEFMX0NSWVBfRGVJbml0KCkgdG8gZGVpbml0aWFsaXplIHRoZSBDUllQIHBlcmlwaGVyYWwuCgogICAgICAgKCMpVG8gcHJvY2VzcyBhIHNpbmdsZSBtZXNzYWdlIHdpdGggY29uc2VjdXRpdmUgY2FsbHMgdG8gSEFMX0NSWVBfRW5jcnlwdCgpIG9yIEhBTF9DUllQX0RlY3J5cHQoKQogICAgICAgICAgd2l0aG91dCBoYXZpbmcgdG8gY29uZmlndXJlIGFnYWluIHRoZSBLZXkgb3IgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciBiZXR3ZWVuIGVhY2ggQVBJIGNhbGwsCiAgICAgICAgICB0aGUgZmllbGQgS2V5SVZDb25maWdTa2lwIG9mIHRoZSBpbml0aWFsaXphdGlvbiBzdHJ1Y3R1cmUgbXVzdCBiZSBzZXQgdG8gQ1JZUF9LRVlJVkNPTkZJR19PTkNFLgogICAgICAgICAgU2FtZSBpcyB0cnVlIGZvciBjb25zZWN1dGl2ZSBjYWxscyBvZiBIQUxfQ1JZUF9FbmNyeXB0X0lUKCksIEhBTF9DUllQX0RlY3J5cHRfSVQoKSwgSEFMX0NSWVBfRW5jcnlwdF9ETUEoKQogICAgICAgICAgb3IgSEFMX0NSWVBfRGVjcnlwdF9ETUEoKS4KCiAgICBbLi5dCiAgICAgIFRoZSBjcnlwdG9ncmFwaGljIHByb2Nlc3NvciBzdXBwb3J0cyBmb2xsb3dpbmcgc3RhbmRhcmRzOgogICAgICAoIykgVGhlIGRhdGEgZW5jcnlwdGlvbiBzdGFuZGFyZCAoREVTKSBhbmQgVHJpcGxlLURFUyAoVERFUykgc3VwcG9ydGVkIG9ubHkgYnkgQ1JZUDEgSVA6CiAgICAgICAgICgjIyk2NC1iaXQgZGF0YSBibG9jayBwcm9jZXNzaW5nCiAgICAgICAgICgjIykgY2hhaW5pbmcgbW9kZXMgc3VwcG9ydGVkIDoKICAgICAgICAgICAgICgrKyspICBFbGVjdHJvbmljIENvZGUgQm9vayhFQ0IpCiAgICAgICAgICAgICAoKysrKSAgQ2lwaGVyIEJsb2NrIENoYWluaW5nIChDQkMpCiAgICAgICAgICgjIykga2V5cyBsZW5ndGggc3VwcG9ydGVkIDo2NC1iaXQsIDEyOC1iaXQgYW5kIDE5Mi1iaXQuCiAgICAgICgjKSBUaGUgYWR2YW5jZWQgZW5jcnlwdGlvbiBzdGFuZGFyZCAoQUVTKSBzdXBwb3J0ZWQgIGJ5IENSWVAxICYgVGlueUFFUyBJUDoKICAgICAgICAgKCMjKTEyOC1iaXQgZGF0YSBibG9jayBwcm9jZXNzaW5nCiAgICAgICAgICgjIykgY2hhaW5pbmcgbW9kZXMgc3VwcG9ydGVkIDoKICAgICAgICAgICAgICgrKyspICBFbGVjdHJvbmljIENvZGUgQm9vayhFQ0IpCiAgICAgICAgICAgICAoKysrKSAgQ2lwaGVyIEJsb2NrIENoYWluaW5nIChDQkMpCiAgICAgICAgICAgICAoKysrKSAgQ291bnRlciBtb2RlIChDVFIpCiAgICAgICAgICAgICAoKysrKSAgR2Fsb2lzL2NvdW50ZXIgbW9kZSAoR0NNL0dNQUMpCiAgICAgICAgICAgICAoKysrKSAgQ291bnRlciB3aXRoIENpcGhlciBCbG9jayBDaGFpbmluZy1NZXNzYWdlKENDTSkKICAgICAgICAgKCMjKSBrZXlzIGxlbmd0aCBTdXBwb3J0ZWQgOgogICAgICAgICAgICAgKCsrKykgZm9yIENSWVAxIElQOiAxMjgtYml0LCAxOTItYml0IGFuZCAyNTYtYml0LgogICAgICAgICAgICAgKCsrKykgZm9yIFRpbnlBRVMgSVA6ICAxMjgtYml0IGFuZCAyNTYtYml0CgogICAgWy4uXSAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgQUVTIEdhbG9pcy9jb3VudGVyIG1vZGUgKEdDTSkgc3VwcG9ydGVkIGJ5IGJvdGggQ1JZUDEgSVA6CiAgICAgICgjKSAgQWxnb3JpdGhtIHN1cHBvcnRlZCA6CiAgICAgICAgICgjIykgR2Fsb2lzL2NvdW50ZXIgbW9kZSAoR0NNKQogICAgICAgICAoIyMpIEdhbG9pcyBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUgKEdNQUMpIDppcyBleGFjdGx5IHRoZSBzYW1lIGFzCiAgICAgICAgICAgICAgR0NNIGFsZ29yaXRobSBjb21wb3NlZCBvbmx5IGJ5IGFuIGhlYWRlci4KICAgICAgKCMpICBGb3VyIHBoYXNlcyBhcmUgcGVyZm9ybWVkIGluIEdDTSA6CiAgICAgICAgICgjIykgSW5pdCBwaGFzZTogSVAgcHJlcGFyZXMgdGhlIEdDTSBoYXNoIHN1YmtleSAoSCkgYW5kIGRvIHRoZSBJViBwcm9jZXNzaW5nCiAgICAgICAgICgjIykgSGVhZGVyIHBoYXNlOiBJUCBwcm9jZXNzZXMgdGhlIEFkZGl0aW9uYWwgQXV0aGVudGljYXRlZCBEYXRhIChBQUQpLCB3aXRoIGhhc2gKICAgICAgICAgIGNvbXB1dGF0aW9uIG9ubHkuCiAgICAgICAgICgjIykgUGF5bG9hZCBwaGFzZTogSVAgcHJvY2Vzc2VzIHRoZSBwbGFpbnRleHQgKFApIHdpdGggaGFzaCBjb21wdXRhdGlvbiArIGtleXN0cmVhbQogICAgICAgICAgZW5jcnlwdGlvbiArIGRhdGEgWE9SaW5nLiBJdCB3b3JrcyBpbiBhIHNpbWlsYXIgd2F5IGZvciBjaXBoZXJ0ZXh0IChDKS4KICAgICAgICAgKCMjKSBGaW5hbCBwaGFzZTogSVAgZ2VuZXJhdGVzIHRoZSBhdXRoZW50aWNhdGVkIHRhZyAoVCkgdXNpbmcgdGhlIGxhc3QgYmxvY2sgb2YgZGF0YS4KICAgICAgKCMpICBzdHJ1Y3R1cmUgb2YgbWVzc2FnZSBjb25zdHJ1Y3Rpb24gaW4gR0NNIGlzIGRlZmluZWQgYXMgYmVsb3cgIDoKICAgICAgICAgKCMjKSAxNiBieXRlcyBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQiljb21wb3NlZCBvZiBJViBhbmQgY291bnRlcgogICAgICAgICAoIyMpIFRoZSBhdXRoZW50aWNhdGVkIGhlYWRlciBBIChhbHNvIGtub3dzIGFzIEFkZGl0aW9uYWwgQXV0aGVudGljYXRpb24gRGF0YSBBQUQpCiAgICAgICAgICB0aGlzIHBhcnQgb2YgdGhlIG1lc3NhZ2UgaXMgb25seSBhdXRoZW50aWNhdGVkLCBub3QgZW5jcnlwdGVkLgogICAgICAgICAoIyMpIFRoZSBwbGFpbnRleHQgbWVzc2FnZSBQIGlzIGJvdGggYXV0aGVudGljYXRlZCBhbmQgZW5jcnlwdGVkIGFzIGNpcGhlcnRleHQuCiAgICAgICAgICBHQ00gc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgY2lwaGVydGV4dCBoYXMgc2FtZSBiaXQgbGVuZ3RoIGFzIHRoZSBwbGFpbnRleHQuCiAgICAgICAgICgjIykgVGhlIGxhc3QgYmxvY2sgaXMgY29tcG9zZWQgb2YgdGhlIGxlbmd0aCBvZiBBIChvbiA2NCBiaXRzKSBhbmQgdGhlIGxlbmd0aCBvZiBjaXBoZXJ0ZXh0CiAgICAgICAgICAob24gNjQgYml0cykKCiAgICBbLi5dICBUaGlzIHNlY3Rpb24gZGVzY3JpYmUgVGhlIEFFUyBDb3VudGVyIHdpdGggQ2lwaGVyIEJsb2NrIENoYWluaW5nLU1lc3NhZ2UKICAgICAgICAgIEF1dGhlbnRpY2F0aW9uIENvZGUgKENDTSkgc3VwcG9ydGVkIGJ5IGJvdGggQ1JZUDEgSVA6CiAgICAgICgjKSAgU3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgQ0NNICA6CgogICAgICAgICAoIyMpIEIwIGJsb2NrICA6IEFjY29yZGluZyB0byBOSVNUIFNwZWNpYWwgUHVibGljYXRpb24gODAwLTM4QywKICAgICAgICAgICAgVGhlIGZpcnN0IGJsb2NrIEIwIGlzIGZvcm1hdHRlZCBhcyBmb2xsb3dzLCB3aGVyZSBsKG0pIGlzIGVuY29kZWQgaW4KICAgICAgICAgICAgbW9zdC1zaWduaWZpY2FudC1ieXRlIGZpcnN0IG9yZGVyKHNlZSBiZWxvdyB0YWJsZSAzKQoKICAgICAgICAgICAgICAoKysrKSAgUTogYSBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvY3RldCBsZW5ndGggb2YgUCAocGxhaW50ZXh0KQogICAgICAgICAgICAgICgrKyspICBxIFRoZSBvY3RldCBsZW5ndGggb2YgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2N0ZXQgbGVuZ3RoIG9mIHRoZSBwYXlsb2FkCiAgICAgICAgICAgICAgKCsrKykgIEEgbm9uY2UgKE4pLCBuIFRoZSBvY3RldCBsZW5ndGggb2YgdGhlIHdoZXJlIG4rcT0xNS4KICAgICAgICAgICAgICAoKysrKSAgRmxhZ3M6IG1vc3Qgc2lnbmlmaWNhbnQgb2N0ZXQgY29udGFpbmluZyBmb3VyIGZsYWdzIGZvciBjb250cm9sIGluZm9ybWF0aW9uLAogICAgICAgICAgICAgICgrKyspICB0IFRoZSBvY3RldCBsZW5ndGggb2YgdGhlIE1BQy4KICAgICAgICAgKCMjKSBCMSBibG9jayAoaGVhZGVyKSA6IGFzc29jaWF0ZWQgZGF0YSBsZW5ndGgoYSkgY29uY2F0ZW5hdGVkIHdpdGggQXNzb2NpYXRlZCBEYXRhIChBKQogICAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGRhdGEgbGVuZ3RoIGV4cHJlc3NlZCBpbiBieXRlcyAoYSkgZGVmaW5lZCBhcyBiZWxvdzoKICAgICAgICAgICAgKCsrKykgIElmIDAgPCBhIDwgMjE2LTI4LCB0aGVuIGl0IGlzIGVuY29kZWQgYXMgW2FdMTYsIGkuZS4gdHdvIG9jdGV0cwogICAgICAgICAgICAoKysrKSAgSWYgMjE2LTI4IDwgYSA8IDIzMiwgdGhlbiBpdCBpcyBlbmNvZGVkIGFzIDB4ZmYgfHwgMHhmZSB8fCBbYV0zMiwgaS5lLiBzaXggb2N0ZXRzCiAgICAgICAgICAgICgrKyspICBJZiAyMzIgPCBhIDwgMjY0LCB0aGVuIGl0IGlzIGVuY29kZWQgYXMgMHhmZiB8fCAweGZmIHx8IFthXTY0LCBpLmUuIHRlbiBvY3RldHMKICAgICAgICAgKCMjKSBDVFJ4IGJsb2NrICA6IGNvbnRyb2wgYmxvY2tzCiAgICAgICAgICAgICgrKyspIEdlbmVyYXRpb24gb2YgQ1RSMSBmcm9tIGZpcnN0IGJsb2NrIEIwIGluZm9ybWF0aW9uIDoKICAgICAgICAgICAgICBlcXVhbCB0byBCMCB3aXRoIGZpcnN0IDUgYml0cyB6ZXJvZWQgYW5kIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBzdG9yaW5nIG9jdGV0CiAgICAgICAgICAgICAgbGVuZ3RoIG9mIFAgYWxzbyB6ZXJvZWQsIHRoZW4gaW5jcmVtZW50ZWQgYnkgb25lICggc2VlIGJlbG93IFRhYmxlIDQpCiAgICAgICAgICAgICgrKyspIEdlbmVyYXRpb24gb2YgQ1RSMDogc2FtZSBhcyBDVFIxIHdpdGggYml0WzBdIHNldCB0byB6ZXJvLgoKICAgICAgKCMpICBGb3VyIHBoYXNlcyBhcmUgcGVyZm9ybWVkIGluIENDTSBmb3IgQ1JZUDEgSVA6CiAgICAgICAgICgjIykgSW5pdCBwaGFzZTogSVAgcHJlcGFyZXMgdGhlIEdDTSBoYXNoIHN1YmtleSAoSCkgYW5kIGRvIHRoZSBJViBwcm9jZXNzaW5nCiAgICAgICAgICgjIykgSGVhZGVyIHBoYXNlOiBJUCBwcm9jZXNzZXMgdGhlIEFkZGl0aW9uYWwgQXV0aGVudGljYXRlZCBEYXRhIChBQUQpLCB3aXRoIGhhc2gKICAgICAgICAgIGNvbXB1dGF0aW9uIG9ubHkuCiAgICAgICAgICgjIykgUGF5bG9hZCBwaGFzZTogSVAgcHJvY2Vzc2VzIHRoZSBwbGFpbnRleHQgKFApIHdpdGggaGFzaCBjb21wdXRhdGlvbiArIGtleXN0cmVhbQogICAgICAgICAgZW5jcnlwdGlvbiArIGRhdGEgWE9SaW5nLiBJdCB3b3JrcyBpbiBhIHNpbWlsYXIgd2F5IGZvciBjaXBoZXJ0ZXh0IChDKS4KICAgICAgICAgKCMjKSBGaW5hbCBwaGFzZTogSVAgZ2VuZXJhdGVzIHRoZSBhdXRoZW50aWNhdGVkIHRhZyAoVCkgdXNpbmcgdGhlIGxhc3QgYmxvY2sgb2YgZGF0YS4KCiAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSAgVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCiAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KICBVc2UgRnVuY3Rpb25zIEByZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjaygpIG9yIEhBTF9DUllQX1JlZ2lzdGVyWFhYQ2FsbGJhY2soKQogIHRvIHJlZ2lzdGVyIGFuIGludGVycnVwdCBjYWxsYmFjay4KCiAgRnVuY3Rpb24gQHJlZiBIQUxfQ1JZUF9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CiAgICAoKykgSW5DcGx0Q2FsbGJhY2sgICAgIDogIElucHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgogICAgKCspIE91dENwbHRDYWxsYmFjayAgICA6IE91dHB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgZXJyb3IgZGV0ZWN0aW9uLgogICAgKCspIE1zcEluaXRDYWxsYmFjayAgICA6IENSWVAgTXNwSW5pdC4KICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgOiBDUllQIE1zcERlSW5pdC4KICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECiAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KCiAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX0NSWVBfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAogIHdlYWsgZnVuY3Rpb24uCiAgQHJlZiBIQUxfQ1JZUF9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCiAgYW5kIHRoZSBDYWxsYmFjayBJRC4KICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgogICAgKCspIEluQ3BsdENhbGxiYWNrICAgICA6ICBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KICAgICgrKSBPdXRDcGx0Q2FsbGJhY2sgICAgOiBPdXRwdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCiAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBDUllQIE1zcEluaXQuCiAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgIDogQ1JZUCBNc3BEZUluaXQuCgogIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9DUllQX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgSEFMX0NSWVBfU1RBVEVfUkVTRVQKICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMgOgogIGV4YW1wbGVzIEByZWYgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soKSAsIEByZWYgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKCkuCiAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUKICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgZnVuY3Rpb24gaW4gdGhlIEByZWYgSEFMX0NSWVBfSW5pdCgpLyBAcmVmIEhBTF9DUllQX0RlSW5pdCgpIG9ubHkgd2hlbgogIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCiAgaWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9DUllQX0luaXQoKSAvIEByZWYgSEFMX0NSWVBfRGVJbml0KCkKICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgZnVuY3Rpb25zIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpCgogIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX0NSWVBfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKICBpbiBIQUxfQ1JZUF9TVEFURV9SRUFEWSBvciBIQUxfQ1JZUF9TVEFURV9SRVNFVCBzdGF0ZSwKICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgogIEluIHRoYXQgY2FzZSBmaXJzdCByZWdpc3RlciB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKICB1c2luZyBAcmVmIEhBTF9DUllQX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9DUllQX0RlSW5pdCgpCiAgb3IgQHJlZiBIQUxfQ1JZUF9Jbml0KCkgZnVuY3Rpb24uCgogIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCiAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZCBhbGwgY2FsbGJhY2tzCiAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KCiAgVGFibGUgMS4gSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpCiAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgIHwgICAgICAgSW5pdGlhbGl6YXRpb24gdmVjdG9yIChJVikgICAgICB8ICBDb3VudGVyICAgICAgfAogICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS18CiAgICAgICAgIDEyNyAgICAgICAgICAgICAgOTUgICAgICAgICAgICAgICAgNjMgICAgICAgICAgICAzMSAgICAgICAwCgoKICAgICAgICAgICAgICBCaXQgTnVtYmVyICAgIFJlZ2lzdGVyICAgICAgICAgICBDb250ZW50cwogICAgICAgICAgICAgIC0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAxMjcgLi4uOTYgICAgQ1JZUF9JVjFSWzMxOjBdICAgICBJQ0JbMTI3Ojk2XQogICAgICAgICAgICAgIDk1ICAuLi42NCAgICBDUllQX0lWMUxbMzE6MF0gICAgIEIwWzk1OjY0XQogICAgICAgICAgICAgIDYzIC4uLiAzMiAgICBDUllQX0lWMFJbMzE6MF0gICAgIElDQls2MzozMl0KICAgICAgICAgICAgICAzMSAuLi4gMCAgICAgQ1JZUF9JVjBMWzMxOjBdICAgICBJQ0JbMzE6MF0sIHdoZXJlIDMyLWJpdCBjb3VudGVyPSAweDIKCiAgVGFibGUgMi4gIEdDTSBsYXN0IGJsb2NrIGRlZmluaXRpb24KCiAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgIHwgIEJpdFswXSAgIHwgIEJpdFszMl0gICAgICAgICAgIHwgIEJpdFs2NF0gIHwgQml0Wzk2XSAgICAgICAgICAgICAgfAogICAgICAgICAgfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CiAgICAgICAgICB8ICAgMHgwICAgICB8IEhlYWRlciBsZW5ndGhbMzE6MF18ICAgICAweDAgICB8IFBheWxvYWQgbGVuZ3RoWzMxOjBdIHwKICAgICAgICAgIHwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAoKICBUYWJsZSAzLiBCMCBibG9jawogICAgICAgICAgICAgICAgT2N0ZXQgTnVtYmVyICAgQ29udGVudHMKICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLQogICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgRmxhZ3MKICAgICAgICAgICAgICAgIDEgLi4uIDE1LXEgICAgIE5vbmNlIE4KICAgICAgICAgICAgICAgIDE2LXEgLi4uIDE1ICAgIFEKCiAgICAgICAgICAgIHRoZSBGbGFncyBmaWVsZCBpcyBmb3JtYXR0ZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBCaXQgTnVtYmVyICAgQ29udGVudHMKICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICA3ICAgICAgICAgICAgUmVzZXJ2ZWQgKGFsd2F5cyB6ZXJvKQogICAgICAgICAgICAgICAgNiAgICAgICAgICAgIEFkYXRhCiAgICAgICAgICAgICAgICA1IC4uLiAzICAgICAgKHQtMikvMgogICAgICAgICAgICAgICAgMiAuLi4gMCAgICAgIFtxLTFdMwoKIFRhYmxlIDQuIENUUnggYmxvY2sKICAgICAgICAgICAgICAgIEJpdCBOdW1iZXIgICAgUmVnaXN0ZXIgICAgICAgICAgIENvbnRlbnRzCiAgICAgICAgICAgICAgICAtLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tICAgICAgIC0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAxMjcgLi4uOTYgICAgQ1JZUF9JVjFSWzMxOjBdICAgICBCMFsxMjc6OTZdLCB3aGVyZSBRIGxlbmd0aCBiaXRzIGFyZSBzZXQgdG8gMCwgZXhjZXB0IGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDAgdGhhdCBpcyBzZXQgdG8gMQogICAgICAgICAgICAgICAgOTUgIC4uLjY0ICAgIENSWVBfSVYxTFszMTowXSAgICAgQjBbOTU6NjRdCiAgICAgICAgICAgICAgICA2MyAuLi4gMzIgICAgQ1JZUF9JVjBSWzMxOjBdICAgICBCMFs2MzozMl0KICAgICAgICAgICAgICAgIDMxIC4uLiAwICAgICBDUllQX0lWMExbMzE6MF0gICAgIEIwWzMxOjBdLCB3aGVyZSBmbGFnIGJpdHMgc2V0IHRvIDAKCiAgQGVuZHZlcmJhdGltCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAYXR0ZW50aW9uCiAgKgogICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCiAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwoKLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2luY2x1ZGUgInN0bTMyZjR4eF9oYWwuaCIKCi8qKiBAYWRkdG9ncm91cCBTVE0zMkY0eHhfSEFMX0RyaXZlcgogICogQHsKICAqLwoKI2lmIGRlZmluZWQgKEFFUykgIHx8IGRlZmluZWQgKENSWVApCgovKiogQGRlZmdyb3VwIENSWVAgQ1JZUAogICogQGJyaWVmIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiBAewogICovCgoKI2lmZGVmIEhBTF9DUllQX01PRFVMRV9FTkFCTEVECgovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgQ1JZUF9Qcml2YXRlX0RlZmluZXMKICAqIEB7CiAgKi8KI2RlZmluZSBDUllQX1RJTUVPVVRfS0VZUFJFUEFSQVRJT04gICAgICA4MlUgICAgICAgICAvKlRoZSBsYXRlbmN5IG9mIGtleSBwcmVwYXJhdGlvbiBvcGVyYXRpb24gaXMgODIgY2xvY2sgY3ljbGVzLiovCiNkZWZpbmUgQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRSAgICAgMjk5VSAgICAgICAgLyogIFRoZSBsYXRlbmN5IG9mICBHQ00vQ0NNIGluaXQgcGhhc2UgdG8gcHJlcGFyZSBoYXNoIHN1YmtleSBpcyAyOTkgY2xvY2sgY3ljbGVzLiovCiNkZWZpbmUgQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFICAgMjkwVSAgICAgICAgLyogIFRoZSBsYXRlbmN5IG9mICBHQ00vQ0NNIGhlYWRlciBwaGFzZSBpcyAyOTAgY2xvY2sgY3ljbGVzLiovCgojZGVmaW5lICBDUllQX1BIQVNFX1JFQURZICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVIC8qITwgQ1JZUCBwZXJpcGhlcmFsIGlzIHJlYWR5IGZvciBpbml0aWFsaXphdGlvbi4gKi8KI2RlZmluZSAgQ1JZUF9QSEFTRV9QUk9DRVNTICAgICAgICAgICAgICAweDAwMDAwMDAyVSAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyBpbiBwcm9jZXNzaW5nIHBoYXNlICovCgojaWYgZGVmaW5lZChBRVMpCiNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgIC8qITwgRW5jcnlwdGlvbiBtb2RlKE1vZGUgMSkgICovCiNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04gICAgICAgICAgICAgQUVTX0NSX01PREVfMCAgIC8qITwgS2V5IGRlcml2YXRpb24gbW9kZSAgb25seSB1c2VkIHdoZW4gcGVyZm9ybWluZyBFQ0IgYW5kIENCQyBkZWNyeXB0aW9ucyAoTW9kZSAyKSAqLwojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUICAgICAgICAgICAgICAgICAgIEFFU19DUl9NT0RFXzEgICAvKiE8IERlY3J5cHRpb24gICAgKE1vZGUgMykgICAgKi8KI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUICAgICBBRVNfQ1JfTU9ERSAgICAgLyohPCBLZXkgZGVyaXZhdGlvbiBhbmQgZGVjcnlwdGlvbiBvbmx5IHVzZWQgd2hlbiBwZXJmb3JtaW5nIEVDQiBhbmQgQ0JDIGRlY3J5cHRpb25zIChNb2RlIDQpICovCiNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgR0NNL0dNQUMgKG9yIENDTSkgaW5pdCBwaGFzZSAqLwojZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSF8wICAgICAvKiE8IEdDTS9HTUFDIG9yIENDTSBoZWFkZXIgcGhhc2UgKi8KI2RlZmluZSBDUllQX1BIQVNFX1BBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMSAgICAgLyohPCBHQ00oL0NDTSkgcGF5bG9hZCBwaGFzZSAgICAgICovCiNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNICBmaW5hbCBwaGFzZSAqLwojZWxzZSAgLyogQ1JZUCAqLwojZGVmaW5lIENSWVBfUEhBU0VfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgR0NNL0dNQUMgKG9yIENDTSkgaW5pdCBwaGFzZSAqLwojZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBfQ1JfR0NNX0NDTVBIXzAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLwojZGVmaW5lIENSWVBfUEhBU0VfUEFZTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBfQ1JfR0NNX0NDTVBIXzEgICAgIC8qITwgR0NNKC9DQ00pIHBheWxvYWQgcGhhc2UgICAgICAqLwojZGVmaW5lIENSWVBfUEhBU0VfRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBfQ1JfR0NNX0NDTVBIICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNICBmaW5hbCBwaGFzZSAqLwojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRW5jcnlwdGlvbiBtb2RlICAgKi8KI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCAgICAgICAgICAgICAgICAgICBDUllQX0NSX0FMR09ESVIgICAgICAgICAvKiE8IERlY3J5cHRpb24gICAgICAgICovCiNlbmRpZiAvKiBFbmQgQ1JZUCBvciAgQUVTICovCgovKiAgQ1RSMSBpbmZvcm1hdGlvbiB0byB1c2UgaW4gQ0NNIGFsZ29yaXRobSAqLwojZGVmaW5lIENSWVBfQ0NNX0NUUjFfMCAgICAgICAgICAgICAgICAgIDB4MDdGRkZGRkZVCiNkZWZpbmUgQ1JZUF9DQ01fQ1RSMV8xICAgICAgICAgICAgICAgICAgMHhGRkZGRkYwMFUKI2RlZmluZSBDUllQX0NDTV9DVFIxXzIgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVQoKCi8qKgogICogQH0KICAqLwoKCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qKiBAYWRkdG9ncm91cCBDUllQX1ByaXZhdGVfTWFjcm9zCiAgKiBAewogICovCgojaWYgZGVmaW5lZChDUllQKQoKI2RlZmluZSBDUllQX1NFVF9QSEFTRShfX0hBTkRMRV9fLCBfX1BIQVNFX18pICBkb3soX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSAodWludDMyX3QpKH5DUllQX0NSX0dDTV9DQ01QSCk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdCkoX19QSEFTRV9fKTtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMCkKCiNkZWZpbmUgSEFMX0NSWVBfRklGT19GTFVTSChfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIENSWVBfQ1JfRkZMVVNIKQoKI2Vsc2UgLypBRVMqLwojZGVmaW5lIENSWVBfU0VUX1BIQVNFKF9fSEFORExFX18sIF9fUEhBU0VfXykgIGRveyhfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCkofkFFU19DUl9HQ01QSCk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdCkoX19QSEFTRV9fKTtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMCkKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCovCgoKLyoqCiAgKiBAfQogICovCgovKiBQcml2YXRlIHN0cnVjdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyoqIEBhZGR0b2dyb3VwIENSWVBfUHJpdmF0ZV9GdW5jdGlvbnNfcHJvdG90eXBlcwogICogQHsKICAqLwoKc3RhdGljIHZvaWQgQ1JZUF9TZXRETUFDb25maWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgaW5wdXRhZGRyLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBvdXRwdXRhZGRyKTsKc3RhdGljIHZvaWQgQ1JZUF9ETUFJbkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwpzdGF0aWMgdm9pZCBDUllQX0RNQU91dENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwpzdGF0aWMgdm9pZCBDUllQX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKc3RhdGljIHZvaWQgQ1JZUF9TZXRLZXkoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgS2V5U2l6ZSk7CnN0YXRpYyB2b2lkIENSWVBfQUVTX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwojaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKXx8IGRlZmluZWQgKEFFUykKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOwpzdGF0aWMgdm9pZCBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CnN0YXRpYyB2b2lkIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwpzdGF0aWMgdm9pZCBDUllQX1dvcmthcm91bmQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNDQ01fUHJvY2VzcyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKI2VuZGlmIC8qIEFFUyBvciBHQ00gQ0NNIGRlZmluZWQqLwpzdGF0aWMgdm9pZCBDUllQX0FFU19Qcm9jZXNzRGF0YShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwdCwgdWludDMyX3QgVGltZW91dCk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19FbmNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0RlY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19FbmNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRGVjcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CiNpZiBkZWZpbmVkIChDUllQKQpzdGF0aWMgdm9pZCBDUllQX1RERVNfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CiNpZiBkZWZpbmVkIChDUllQX0NSX0FMR09NT0RFX0FFU19HQ00pCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX1dhaXRPbklGRU1GbGFnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOwojZW5kaWYgLyogR0NNIENDTSBkZWZpbmVkKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfV2FpdE9uQlVTWUZsYWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX1dhaXRPbk9GTkVGbGFnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9UREVTX1Byb2Nlc3MoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CiNlbHNlIC8qQUVTKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfV2FpdE9uQ0NGbGFnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOwojZW5kaWYgLyogRW5kIENSWVAgb3IgQUVTICovCgovKioKICAqIEB9CiAgKi8KCi8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9ucyBDUllQIEV4cG9ydGVkIEZ1bmN0aW9ucwogICogQHsKICAqLwoKCi8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgogICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICMjIyMjIEluaXRpYWxpemF0aW9uLCBkZS1pbml0aWFsaXphdGlvbiBhbmQgU2V0IGFuZCBHZXQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgogICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JZUAogICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBDUllQCiAgICAgICgrKSBJbml0aWFsaXplIHRoZSBDUllQIE1TUAogICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBDUllQIE1TUAogICAgICAoKykgY29uZmlndXJlIENSWVAgKEhBTF9DUllQX1NldENvbmZpZykgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIENSWVBfQ29uZmlnVHlwZURlZgogICAgICAgICAgUGFyYW1ldGVycyB3aGljaCBhcmUgY29uZmlndXJlZCBpbiBUaGlzIHNlY3Rpb24gYXJlIDoKICAgICAgICAgICgrKSBLZXkgc2l6ZQogICAgICAgICAgKCspIERhdGEgVHlwZSA6IDMyLDE2LCA4IG9yIDFiaXQKICAgICAgICAgICgrKSBBbGdvTW9kZSA6CiAgICAgICAgICAgICAgLSBmb3IgQ1JZUDEgSVAgOgogICAgICAgICAgICAgICAgIEVDQiBhbmQgQ0JDIGluIERFUy9UREVTIFN0YW5kYXJkCiAgICAgICAgICAgICAgICAgRUNCLENCQyxDVFIsR0NNL0dNQUMgYW5kIENDTSBpbiBBRVMgU3RhbmRhcmQuCiAgICAgICAgICAgICAgLSBmb3IgVGlueUFFUzIgSVAsIG9ubHkgRUNCLENCQyxDVFIsR0NNL0dNQUMgYW5kIENDTSBpbiBBRVMgU3RhbmRhcmQgYXJlIHN1cHBvcnRlZC4KICAgICAgKCspIEdldCBDUllQIGNvbmZpZ3VyYXRpb24gKEhBTF9DUllQX0dldENvbmZpZykgZnJvbSB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIENSWVBfSGFuZGxlVHlwZURlZgoKCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKCi8qKgogICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ1JZUCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAogICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDUllQX0NvbmZpZ1R5cGVEZWYgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0luaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIENoZWNrIHRoZSBDUllQIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYgKGhjcnlwID09IE5VTEwpCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9LRVlTSVpFKGhjcnlwLT5Jbml0LktleVNpemUpKTsKICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9EQVRBVFlQRShoY3J5cC0+SW5pdC5EYXRhVHlwZSkpOwogIGFzc2VydF9wYXJhbShJU19DUllQX0FMR09SSVRITShoY3J5cC0+SW5pdC5BbGdvcml0aG0pKTsKICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9JTklUKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCkpOwoKI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKICB7CiAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCiAgICBoY3J5cC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKCiAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2sgID0gSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBJbkNwbHRDYWxsYmFjayAgICovCiAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrID0gSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBPdXRDcGx0Q2FsbGJhY2sgICovCiAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayAgID0gSEFMX0NSWVBfRXJyb3JDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICovCgogICAgaWYgKGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKICAgIHsKICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCiAgICB9CgogICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCiAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrKGhjcnlwKTsKICB9CiNlbHNlCiAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKICB7CiAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCiAgICBoY3J5cC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKCiAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KICAgIEhBTF9DUllQX01zcEluaXQoaGNyeXApOwogIH0KI2VuZGlmIC8qIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLwoKICAvKiBTZXQgdGhlIGtleSBzaXplKFRoaXMgYml0IGZpZWxkIGlzIGRvbpJ0IGNhcmUgaW4gdGhlIERFUyBvciBUREVTIG1vZGVzKSBkYXRhIHR5cGUgYW5kIEFsZ29yaXRobSAqLwojaWYgZGVmaW5lZCAoQ1JZUCkKCiAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0RBVEFUWVBFIHwgQ1JZUF9DUl9LRVlTSVpFIHwgQ1JZUF9DUl9BTEdPTU9ERSwKICAgICAgICAgICAgIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7CgojZWxzZSAvKkFFUyovCgogIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFIHwgQUVTX0NSX0tFWVNJWkUgfCBBRVNfQ1JfQ0hNT0QsCiAgICAgICAgICAgICBoY3J5cC0+SW5pdC5EYXRhVHlwZSB8IGhjcnlwLT5Jbml0LktleVNpemUgfCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOwoKI2VuZGlmICAvKiBFbmQgQUVTIG9yIENSWVAqLwoKICAvKiBSZXNldCBFcnJvciBDb2RlIGZpZWxkICovCiAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX05PTkU7CgogIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAvKiBTZXQgdGhlIGRlZmF1bHQgQ1JZUCBwaGFzZSAqLwogIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUkVBRFk7CgogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgRGUtSW5pdGlhbGl6ZXMgdGhlIENSWVAgcGVyaXBoZXJhbC4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZUluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIENoZWNrIHRoZSBDUllQIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYgKGhjcnlwID09IE5VTEwpCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIC8qIFNldCB0aGUgZGVmYXVsdCBDUllQIHBoYXNlICovCiAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9SRUFEWTsKCiAgLyogUmVzZXQgQ3J5cEluQ291bnQgYW5kIENyeXBPdXRDb3VudCAqLwogIGhjcnlwLT5DcnlwSW5Db3VudCA9IDA7CiAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDA7CiAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDA7CgogIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKCiAgaWYgKGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQogIHsKICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcERlSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAqLwogIH0KICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLwogIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayhoY3J5cCk7CgojZWxzZQoKICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogQ0xPQ0ssIE5WSUMuKi8KICBIQUxfQ1JZUF9Nc3BEZUluaXQoaGNyeXApOwoKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KCiAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVTRVQ7CgogIC8qIFJlbGVhc2UgTG9jayAqLwogIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBDUllQIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCiAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIENSWVBfQ29uZmlnVHlwZURlZgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUKICAqIEBwYXJhbSAgcENvbmY6IHBvaW50ZXIgdG8gYSBDUllQX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9TZXRDb25maWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgQ1JZUF9Db25maWdUeXBlRGVmICpwQ29uZikKewogIC8qIENoZWNrIHRoZSBDUllQIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYgKChoY3J5cCA9PSBOVUxMKSB8fCAocENvbmYgPT0gTlVMTCkpCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9LRVlTSVpFKHBDb25mLT5LZXlTaXplKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfREFUQVRZUEUocENvbmYtPkRhdGFUeXBlKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfQUxHT1JJVEhNKHBDb25mLT5BbGdvcml0aG0pKTsKCiAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICB7CiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CgogICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgIF9fSEFMX0xPQ0soaGNyeXApOwoKICAgIC8qIFNldCAgQ1JZUCBwYXJhbWV0ZXJzICAqLwogICAgaGNyeXAtPkluaXQuRGF0YVR5cGUgICA9IHBDb25mLT5EYXRhVHlwZTsKICAgIGhjcnlwLT5Jbml0LnBLZXkgICAgICAgPSBwQ29uZi0+cEtleTsKICAgIGhjcnlwLT5Jbml0LkFsZ29yaXRobSAgPSBwQ29uZi0+QWxnb3JpdGhtOwogICAgaGNyeXAtPkluaXQuS2V5U2l6ZSAgICA9IHBDb25mLT5LZXlTaXplOwogICAgaGNyeXAtPkluaXQucEluaXRWZWN0ICA9IHBDb25mLT5wSW5pdFZlY3Q7CiAgICBoY3J5cC0+SW5pdC5IZWFkZXIgICAgID0gcENvbmYtPkhlYWRlcjsKICAgIGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPSBwQ29uZi0+SGVhZGVyU2l6ZTsKICAgIGhjcnlwLT5Jbml0LkIwICAgICAgICAgPSBwQ29uZi0+QjA7CiAgICBoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID0gcENvbmYtPkRhdGFXaWR0aFVuaXQ7CgogICAgLyogU2V0IHRoZSBrZXkgc2l6ZShUaGlzIGJpdCBmaWVsZCBpcyBkb26SdCBjYXJlIGluIHRoZSBERVMgb3IgVERFUyBtb2RlcykgZGF0YSB0eXBlLCBBbGdvTW9kZSBhbmQgb3BlcmF0aW5nIG1vZGUqLwojaWYgZGVmaW5lZCAoQ1JZUCkKCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfREFUQVRZUEUgfCBDUllQX0NSX0tFWVNJWkUgfCBDUllQX0NSX0FMR09NT0RFLAogICAgICAgICAgICAgICBoY3J5cC0+SW5pdC5EYXRhVHlwZSB8IGhjcnlwLT5Jbml0LktleVNpemUgfCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOwoKI2Vsc2UgLypBRVMqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUgfCBBRVNfQ1JfS0VZU0laRSB8IEFFU19DUl9DSE1PRCwKICAgICAgICAgICAgICAgaGNyeXAtPkluaXQuRGF0YVR5cGUgfCBoY3J5cC0+SW5pdC5LZXlTaXplIHwgaGNyeXAtPkluaXQuQWxnb3JpdGhtKTsKCiAgICAvKmNsZWFyIGVycm9yIGZsYWdzKi8KICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9FUlJfQ0xFQVIpOwoKI2VuZGlmICAvKiBFbmQgQUVTIG9yIENSWVAgKi8KCiAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwoKICAgIC8qIFJlc2V0IEVycm9yIENvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgPSBIQUxfQ1JZUF9FUlJPUl9OT05FOwoKICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgLyogU2V0IHRoZSBkZWZhdWx0IENSWVAgcGhhc2UgKi8KICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUkVBRFk7CgogICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICAgcmV0dXJuIEhBTF9PSzsKICB9CiAgZWxzZQogIHsKICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KfQoKLyoqCiAgKiBAYnJpZWYgIEdldCBDUllQIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbiBhc3NvY2lhdGVkIGhhbmRsZS4KICAqIEBwYXJhbSAgcENvbmY6IHBvaW50ZXIgdG8gYSBDUllQX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfR2V0Q29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIENSWVBfQ29uZmlnVHlwZURlZiAqcENvbmYpCnsKICAvKiBDaGVjayB0aGUgQ1JZUCBoYW5kbGUgYWxsb2NhdGlvbiAqLwogIGlmICgoaGNyeXAgPT0gTlVMTCkgfHwgKHBDb25mID09IE5VTEwpKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsKICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKCiAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgX19IQUxfTE9DSyhoY3J5cCk7CgogICAgLyogR2V0ICBDUllQIHBhcmFtZXRlcnMgICovCiAgICBwQ29uZi0+RGF0YVR5cGUgICAgICAgID0gaGNyeXAtPkluaXQuRGF0YVR5cGU7CiAgICBwQ29uZi0+cEtleSAgICAgICAgICAgID0gaGNyeXAtPkluaXQucEtleTsKICAgIHBDb25mLT5BbGdvcml0aG0gICAgICAgPSBoY3J5cC0+SW5pdC5BbGdvcml0aG07CiAgICBwQ29uZi0+S2V5U2l6ZSAgICAgICAgID0gaGNyeXAtPkluaXQuS2V5U2l6ZSA7CiAgICBwQ29uZi0+cEluaXRWZWN0ICAgICAgID0gaGNyeXAtPkluaXQucEluaXRWZWN0OwogICAgcENvbmYtPkhlYWRlciAgICAgICAgICA9IGhjcnlwLT5Jbml0LkhlYWRlciA7CiAgICBwQ29uZi0+SGVhZGVyU2l6ZSAgICAgID0gaGNyeXAtPkluaXQuSGVhZGVyU2l6ZTsKICAgIHBDb25mLT5CMCAgICAgICAgICAgICAgPSBoY3J5cC0+SW5pdC5CMDsKICAgIHBDb25mLT5EYXRhV2lkdGhVbml0ICAgID0gaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdDsKCiAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwoKICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICAgcmV0dXJuIEhBTF9PSzsKICB9CiAgZWxzZQogIHsKICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KfQovKioKICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENSWVAgTVNQLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgTm9uZQogICovCl9fd2VhayB2b2lkIEhBTF9DUllQX01zcEluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaGNyeXApOwoKICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKLyoqCiAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgQ1JZUCBNU1AuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX0NSWVBfTXNwRGVJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGhjcnlwKTsKCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICB0aGUgSEFMX0NSWVBfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCi8qKgogICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgQ1JZUCBDYWxsYmFjawogICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjawogICogQHBhcmFtIGhjcnlwIGNyeXAgaGFuZGxlCiAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAogICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfSU5QVVRfQ09NUExFVEVfQ0JfSUQgSW5wdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECiAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECiAgKiBAcGFyYW0gcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCiAgKiBAcmV0dmFsIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1JlZ2lzdGVyQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgSEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1JZUF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQp7CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwoKICBpZiAocENhbGxiYWNrID09IE5VTEwpCiAgewogICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CgogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhjcnlwKTsKCiAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICB7CiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICB7CiAgICAgIGNhc2UgSEFMX0NSWVBfSU5QVVRfQ09NUExFVEVfQ0JfSUQgOgogICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgSEFMX0NSWVBfT1VUUFVUX0NPTVBMRVRFX0NCX0lEIDoKICAgICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIQUxfQ1JZUF9FUlJPUl9DQl9JRCA6CiAgICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgogICAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCA6CiAgICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdCA6CiAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KICBlbHNlIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVTRVQpCiAgewogICAgc3dpdGNoIChDYWxsYmFja0lEKQogICAgewogICAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgogICAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCA6CiAgICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdCA6CiAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KICBlbHNlCiAgewogICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCiAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogIH0KCiAgLyogUmVsZWFzZSBMb2NrICovCiAgX19IQUxfVU5MT0NLKGhjcnlwKTsKCiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gQ1JZUCBDYWxsYmFjawogICogICAgICAgICBDUllQIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjawogICogQHBhcmFtIGhjcnlwIGNyeXAgaGFuZGxlCiAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCiAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX09VVFBVVF9DT01QTEVURV9DQl9JRCBPdXRwdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKICAqIEByZXR2YWwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfVW5SZWdpc3RlckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIEhBTF9DUllQX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CgogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoY3J5cCk7CgogIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgewogICAgc3dpdGNoIChDYWxsYmFja0lEKQogICAgewogICAgICBjYXNlIEhBTF9DUllQX0lOUFVUX0NPTVBMRVRFX0NCX0lEIDoKICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrICBJbkNwbHRDYWxsYmFjayAgKi8KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgSEFMX0NSWVBfT1VUUFVUX0NPTVBMRVRFX0NCX0lEIDoKICAgICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrID0gSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE91dENwbHRDYWxsYmFjayAgICAgICAqLwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIQUxfQ1JZUF9FUlJPUl9DQl9JRCA6CiAgICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2sgPSBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCA6CiAgICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcEluaXQ7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCA6CiAgICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwRGVJbml0OwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdCA6CiAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KICBlbHNlIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVTRVQpCiAgewogICAgc3dpdGNoIChDYWxsYmFja0lEKQogICAgewogICAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgogICAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BJbml0OwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgogICAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcERlSW5pdDsKICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQgOgogICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCiAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgICBicmVhazsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwogICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICB9CgogIC8qIFJlbGVhc2UgTG9jayAqLwogIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogIHJldHVybiBzdGF0dXM7Cn0KI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLyoqCiAgKiBAfQogICovCgovKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiAgRW5jcnlwdCBEZWNyeXB0IGZ1bmN0aW9ucwogICogIEBicmllZiAgIHByb2Nlc3NpbmcgZnVuY3Rpb25zLgogICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBFbmNyeXB0IERlY3J5cHQgIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIEFQSSBhbGxvd2luZyB0byBFbmNyeXB0L0RlY3J5cHQgRGF0YSBmb2xsb3dpbmcKICAgICAgICAgIFN0YW5kYXJkIERFUy9UREVTIG9yIEFFUywgYW5kIEFsZ29yaXRobSBjb25maWd1cmVkIGJ5IHRoZSB1c2VyOgogICAgICAoKykgU3RhbmRhcmQgREVTL1RERVMgb25seSBzdXBwb3J0ZWQgYnkgQ1JZUDEgSVAsIGJlbG93IGxpc3Qgb2YgQWxnb3JpdGhtIHN1cHBvcnRlZCA6CiAgICAgICAgICAgLSBFbGVjdHJvbmljIENvZGUgQm9vayhFQ0IpCiAgICAgICAgICAgLSBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgKENCQykKICAgICAgKCspIFN0YW5kYXJkIEFFUyAgc3VwcG9ydGVkIGJ5IENSWVAxIElQICYgVGlueUFFUywgbGlzdCBvZiBBbGdvcml0aG0gc3VwcG9ydGVkOgogICAgICAgICAgIC0gRWxlY3Ryb25pYyBDb2RlIEJvb2soRUNCKQogICAgICAgICAgIC0gQ2lwaGVyIEJsb2NrIENoYWluaW5nIChDQkMpCiAgICAgICAgICAgLSBDb3VudGVyIG1vZGUgKENUUikKICAgICAgICAgICAtIENpcGhlciBCbG9jayBDaGFpbmluZyAoQ0JDKQogICAgICAgICAgIC0gQ291bnRlciBtb2RlIChDVFIpCiAgICAgICAgICAgLSBHYWxvaXMvY291bnRlciBtb2RlIChHQ00pCiAgICAgICAgICAgLSBDb3VudGVyIHdpdGggQ2lwaGVyIEJsb2NrIENoYWluaW5nLU1lc3NhZ2UoQ0NNKQogICAgWy4uXSAgVGhyZWUgcHJvY2Vzc2luZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZToKICAgICAgKCspIFBvbGxpbmcgbW9kZSA6IEhBTF9DUllQX0VuY3J5cHQgJiBIQUxfQ1JZUF9EZWNyeXB0CiAgICAgICgrKSBJbnRlcnJ1cHQgbW9kZSA6IEhBTF9DUllQX0VuY3J5cHRfSVQgJiBIQUxfQ1JZUF9EZWNyeXB0X0lUCiAgICAgICgrKSBETUEgbW9kZSA6IEhBTF9DUllQX0VuY3J5cHRfRE1BICYgSEFMX0NSWVBfRGVjcnlwdF9ETUEKCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKCi8qKgogICogQGJyaWVmICBFbmNyeXB0aW9uIG1vZGUuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBJbnB1dDogUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChwbGFpbnRleHQpCiAgKiBAcGFyYW0gIFNpemU6IExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiB3b3JkLgogICogQHBhcmFtICBPdXRwdXQ6IFBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIoY2lwaGVydGV4dCkKICAqIEBwYXJhbSAgVGltZW91dDogU3BlY2lmeSBUaW1lb3V0IHZhbHVlCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9FbmNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgYWxnbzsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CgogIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgewogICAgLyogQ2hhbmdlIHN0YXRlIEJ1c3kgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CgogICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgIF9fSEFMX0xPQ0soaGNyeXApOwoKICAgIC8qICBSZXNldCBDcnlwSW5Db3VudCwgQ3J5cE91dENvdW50IGFuZCBJbml0aWFsaXplIHBDcnlwSW5CdWZmUHRyIGFuZCBwQ3J5cE91dEJ1ZmZQdHIgcGFyYW1ldGVycyovCiAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciA9IElucHV0OwogICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKCiAgICAvKiAgQ2FsY3VsYXRlIFNpemUgcGFyYW1ldGVyIGluIEJ5dGUqLwogICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpCiAgICB7CiAgICAgIGhjcnlwLT5TaXplID0gU2l6ZSAqIDRVOwogICAgfQogICAgZWxzZQogICAgewogICAgICBoY3J5cC0+U2l6ZSA9IFNpemU7CiAgICB9CgojaWYgZGVmaW5lZCAoQ1JZUCkKICAgIC8qIFNldCBFbmNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CgogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCiAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREU7CgogICAgc3dpdGNoIChhbGdvKQogICAgewogICAgICBjYXNlIENSWVBfREVTX0VDQjoKICAgICAgY2FzZSBDUllQX0RFU19DQkM6CiAgICAgIGNhc2UgQ1JZUF9UREVTX0VDQjoKICAgICAgY2FzZSBDUllQX1RERVNfQ0JDOgoKICAgICAgICAvKlNldCBLZXkgKi8KICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOwogICAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCiAgICAgICAgewogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMik7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAzKTsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNSk7CiAgICAgICAgfQoKICAgICAgICAvKlNldCBJbml0aWFsaXphdGlvbiBWZWN0b3IgKElWKSovCiAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQogICAgICAgIHsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKICAgICAgICB9CgogICAgICAgIC8qIEZsdXNoIEZJRk8gKi8KICAgICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKCiAgICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKCiAgICAgICAgLyogU3RhdHJ0IERFUy9UREVTIGVuY3J5cHRpb24gcHJvY2VzcyAqLwogICAgICAgIHN0YXR1cyA9IENSWVBfVERFU19Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgogICAgICBjYXNlIENSWVBfQUVTX0NCQzoKICAgICAgY2FzZSBDUllQX0FFU19DVFI6CgogICAgICAgIC8qIEFFUyBlbmNyeXB0aW9uICovCiAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdChoY3J5cCwgVGltZW91dCk7CiAgICAgICAgYnJlYWs7CiAgICAgICAgI2lmIGRlZmluZWQgKENSWVBfQ1JfQUxHT01PREVfQUVTX0dDTSkKICAgICAgY2FzZSBDUllQX0FFU19HQ006CgogICAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLwogICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpOwoKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgoKICAgICAgICAvKiBBRVMgQ0NNIGVuY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKICAgICAgICBicmVhazsKICAgICAgICAjZW5kaWYgLyogR0NNIENDTSBkZWZpbmVkKi8KICAgICAgZGVmYXVsdDoKICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CiAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgfQoKI2Vsc2UgLypBRVMqLwoKICAgIC8qIFNldCB0aGUgb3BlcmF0aW5nIG1vZGUqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOwoKICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLwogICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CgogICAgc3dpdGNoIChhbGdvKQogICAgewoKICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CiAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgogICAgICBjYXNlIENSWVBfQUVTX0NUUjoKCiAgICAgICAgLyogQUVTIGVuY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19FbmNyeXB0KGhjcnlwLCBUaW1lb3V0KTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CgogICAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLwogICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpIDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgoKICAgICAgICAvKiBBRVMgQ0NNIGVuY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwogICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KI2VuZGlmIC8qZW5kIEFFUyBvciBDUllQICovCgogICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICB7CiAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgfQogIH0KICBlbHNlCiAgewogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBEZWNyeXB0aW9uIG1vZGUuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBJbnB1dDogUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChjaXBoZXJ0ZXh0ICkKICAqIEBwYXJhbSAgU2l6ZTogTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQuCiAgKiBAcGFyYW0gIE91dHB1dDogUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihwbGFpbnRleHQpCiAgKiBAcGFyYW0gIFRpbWVvdXQ6IFNwZWNpZnkgVGltZW91dCB2YWx1ZQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCkKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKICB1aW50MzJfdCBhbGdvOwoKICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsKICAgIC8qIENoYW5nZSBzdGF0ZSBCdXN5ICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOwoKICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICBfX0hBTF9MT0NLKGhjcnlwKTsKCiAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciBhbmQgcENyeXBPdXRCdWZmUHRyICBwYXJhbWV0ZXJzKi8KICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOwogICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOwogICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CiAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OwoKICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCiAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKICAgIHsKICAgICAgaGNyeXAtPlNpemUgPSBTaXplICogNFU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKICAgIH0KCiNpZiBkZWZpbmVkIChDUllQKQoKICAgIC8qIFNldCBEZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CgogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCiAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREU7CgogICAgc3dpdGNoIChhbGdvKQogICAgewogICAgICBjYXNlIENSWVBfREVTX0VDQjoKICAgICAgY2FzZSBDUllQX0RFU19DQkM6CiAgICAgIGNhc2UgQ1JZUF9UREVTX0VDQjoKICAgICAgY2FzZSBDUllQX1RERVNfQ0JDOgoKICAgICAgICAvKlNldCBLZXkgKi8KICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOwogICAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCiAgICAgICAgewogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMik7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAzKTsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNSk7CiAgICAgICAgfQoKICAgICAgICAvKlNldCBJbml0aWFsaXphdGlvbiBWZWN0b3IgKElWKSovCiAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQogICAgICAgIHsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKICAgICAgICB9CgogICAgICAgIC8qIEZsdXNoIEZJRk8gKi8KICAgICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKCiAgICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKCiAgICAgICAgLyogU3RhcnQgREVTL1RERVMgZGVjcnlwdGlvbiBwcm9jZXNzICovCiAgICAgICAgc3RhdHVzID0gQ1JZUF9UREVTX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpOwoKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgogICAgICBjYXNlIENSWVBfQUVTX0NCQzoKICAgICAgY2FzZSBDUllQX0FFU19DVFI6CgogICAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovCiAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdChoY3J5cCwgVGltZW91dCk7CiAgICAgICAgYnJlYWs7CiAgICAgICAgI2lmIGRlZmluZWQgKENSWVBfQ1JfQUxHT01PREVfQUVTX0dDTSkKICAgICAgY2FzZSBDUllQX0FFU19HQ006CgogICAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLwogICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpIDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgoKICAgICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKICAgICAgICBicmVhazsKICAgICAgICAjZW5kaWYgLyogR0NNIENDTSBkZWZpbmVkKi8KICAgICAgZGVmYXVsdDoKICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CiAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgfQoKI2Vsc2UgLypBRVMqLwoKICAgIC8qIFNldCBEZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKCiAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOwoKICAgIHN3aXRjaCAoYWxnbykKICAgIHsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgogICAgICBjYXNlIENSWVBfQUVTX0NCQzoKICAgICAgY2FzZSBDUllQX0FFU19DVFI6CgogICAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovCiAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdChoY3J5cCwgVGltZW91dCk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOgoKICAgICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KSA7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIENSWVBfQUVTX0NDTToKCiAgICAgICAgLyogQUVTIENDTSBkZWNyeXB0aW9uICovCiAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICB9CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KCiAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgIHsKICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHRpb24gaW4gaW50ZXJydXB0IG1vZGUuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBJbnB1dDogUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChwbGFpbnRleHQpCiAgKiBAcGFyYW0gIFNpemU6IExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiB3b3JkCiAgKiBAcGFyYW0gIE91dHB1dDogUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihjaXBoZXJ0ZXh0KQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpCnsKICB1aW50MzJfdCBhbGdvOwogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKCiAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICB7CiAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKCiAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgX19IQUxfTE9DSyhoY3J5cCk7CgogICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciBwYXJhbWV0ZXJzKi8KICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOwogICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOwogICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CiAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OwoKICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCiAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKICAgIHsKICAgICAgaGNyeXAtPlNpemUgPSBTaXplICogNFU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKICAgIH0KCiNpZiBkZWZpbmVkIChDUllQKQoKICAgIC8qIFNldCBlbmNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CgogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCiAgICBhbGdvID0gKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09NT0RFKTsKCiAgICBzd2l0Y2ggKGFsZ28pCiAgICB7CiAgICAgIGNhc2UgQ1JZUF9ERVNfRUNCOgogICAgICBjYXNlIENSWVBfREVTX0NCQzoKICAgICAgY2FzZSBDUllQX1RERVNfRUNCOgogICAgICBjYXNlIENSWVBfVERFU19DQkM6CgogICAgICAgIC8qU2V0IEtleSAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSk7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CiAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKICAgICAgICB7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyKTsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNCk7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA1KTsKICAgICAgICB9CiAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLwogICAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKICAgICAgICB7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CiAgICAgICAgfQoKICAgICAgICAvKiBGbHVzaCBGSUZPICovCiAgICAgICAgSEFMX0NSWVBfRklGT19GTFVTSChoY3J5cCk7CgogICAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CgogICAgICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JIHwgQ1JZUF9JVF9PVVRJKTsKCiAgICAgICAgLyogRW5hYmxlIENSWVAgdG8gc3RhcnQgREVTL1RERVMgcHJvY2VzcyovCiAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CiAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgogICAgICBjYXNlIENSWVBfQUVTX0NUUjoKCiAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdF9JVChoY3J5cCk7CiAgICAgICAgYnJlYWs7CiAgICAgICAgI2lmIGRlZmluZWQgKENSWVBfQ1JfQUxHT01PREVfQUVTX0dDTSkKICAgICAgY2FzZSBDUllQX0FFU19HQ006CgogICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoaGNyeXApIDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgoKICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKGhjcnlwKTsKICAgICAgICBicmVhazsKICAgICAgICAjZW5kaWYgLyogR0NNIENDTSBkZWZpbmVkKi8KICAgICAgZGVmYXVsdDoKICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CiAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgfQoKI2Vsc2UgLyogQUVTICovCgogICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOwoKICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLwogICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CgogICAgc3dpdGNoIChhbGdvKQogICAgewogICAgICBjYXNlIENSWVBfQUVTX0VDQjoKICAgICAgY2FzZSBDUllQX0FFU19DQkM6CiAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgoKICAgICAgICAvKiBBRVMgZW5jcnlwdGlvbiAqLwogICAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0VuY3J5cHRfSVQoaGNyeXApOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBDUllQX0FFU19HQ01fR01BQzoKCiAgICAgICAgLyogQUVTIEdDTSBlbmNyeXB0aW9uICovCiAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVChoY3J5cCkgOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBDUllQX0FFU19DQ006CgogICAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLwogICAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoaGNyeXApOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CiAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgfQojZW5kaWYgLyplbmQgQUVTIG9yIENSWVAqLwoKICB9CiAgZWxzZQogIHsKICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICB9CgogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gc3RhdHVzOwp9CgovKioKICAqIEBicmllZiAgRGVjcnlwdGlvbiBpbiBpdG50ZXJydXB0IG1vZGUuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBJbnB1dDogUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChjaXBoZXJ0ZXh0ICkKICAqIEBwYXJhbSAgU2l6ZTogTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQuCiAgKiBAcGFyYW0gIE91dHB1dDogUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihwbGFpbnRleHQpCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZWNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCkKewogIHVpbnQzMl90IGFsZ287CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwoKICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsKICAgIC8qIENoYW5nZSBzdGF0ZSBCdXN5ICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOwoKICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICBfX0hBTF9MT0NLKGhjcnlwKTsKCiAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciBhbmQgcENyeXBPdXRCdWZmUHRyIHBhcmFtZXRlcnMqLwogICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CiAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CiAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKICAgIGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgPSBPdXRwdXQ7CgogICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID09IENSWVBfREFUQVdJRFRIVU5JVF9XT1JEKQogICAgewogICAgICBoY3J5cC0+U2l6ZSA9IFNpemUgKiA0VTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwogICAgfQoKI2lmIGRlZmluZWQgKENSWVApCgogICAgLyogU2V0IGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09ESVIsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKCiAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPTU9ERTsKCiAgICBzd2l0Y2ggKGFsZ28pCiAgICB7CiAgICAgIGNhc2UgQ1JZUF9ERVNfRUNCOgogICAgICBjYXNlIENSWVBfREVTX0NCQzoKICAgICAgY2FzZSBDUllQX1RERVNfRUNCOgogICAgICBjYXNlIENSWVBfVERFU19DQkM6CgogICAgICAgIC8qU2V0IEtleSAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSk7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CiAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKICAgICAgICB7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyKTsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNCk7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA1KTsKICAgICAgICB9CgogICAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KICAgICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCiAgICAgICAgewogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOwogICAgICAgIH0KICAgICAgICAvKiBGbHVzaCBGSUZPICovCiAgICAgICAgSEFMX0NSWVBfRklGT19GTFVTSChoY3J5cCk7CgogICAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CgogICAgICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JIHwgQ1JZUF9JVF9PVVRJKTsKCiAgICAgICAgLyogRW5hYmxlIENSWVAgYW5kIHN0YXJ0IERFUy9UREVTIHByb2Nlc3MqLwogICAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIENSWVBfQUVTX0VDQjoKICAgICAgY2FzZSBDUllQX0FFU19DQkM6CiAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgoKICAgICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLwogICAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0RlY3J5cHRfSVQoaGNyeXApOwogICAgICAgIGJyZWFrOwogICAgICAgICNpZiBkZWZpbmVkIChDUllQX0NSX0FMR09NT0RFX0FFU19HQ00pCiAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNOgoKICAgICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0lUKGhjcnlwKSA7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIENSWVBfQUVTX0NDTToKCiAgICAgICAgLyogQUVTIENDTWRlY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKGhjcnlwKTsKICAgICAgICBicmVhazsKICAgICAgICAjZW5kaWYgLyogR0NNIENDTSBkZWZpbmVkKi8KICAgICAgZGVmYXVsdDoKICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CiAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgfQoKI2Vsc2UgLypBRVMqLwoKICAgIC8qIFNldCBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKCiAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOwoKICAgIHN3aXRjaCAoYWxnbykKICAgIHsKICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CiAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgogICAgICBjYXNlIENSWVBfQUVTX0NUUjoKCiAgICAgICAgLyogQUVTIGRlY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0X0lUKGhjcnlwKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CgogICAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLwogICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoaGNyeXApIDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgoKICAgICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKGhjcnlwKTsKICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwogICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgICBicmVhazsKICAgIH0KI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwoKICB9CiAgZWxzZQogIHsKICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICB9CgogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gc3RhdHVzOwp9CgovKioKICAqIEBicmllZiAgRW5jcnlwdGlvbiBpbiBETUEgbW9kZS4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIElucHV0OiBQb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKHBsYWludGV4dCkKICAqIEBwYXJhbSAgU2l6ZTogTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQuCiAgKiBAcGFyYW0gIE91dHB1dDogUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihjaXBoZXJ0ZXh0KQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KQp7CiAgdWludDMyX3QgYWxnbzsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KCiAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICB7CiAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKCiAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgX19IQUxfTE9DSyhoY3J5cCk7CgogICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciBwYXJhbWV0ZXJzKi8KICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOwogICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOwogICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CiAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OwoKICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCiAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKICAgIHsKICAgICAgaGNyeXAtPlNpemUgPSBTaXplICogNFU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKICAgIH0KCiNpZiBkZWZpbmVkIChDUllQKQoKICAgIC8qIFNldCBlbmNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CgogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCiAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREU7CgogICAgc3dpdGNoIChhbGdvKQogICAgewogICAgICBjYXNlIENSWVBfREVTX0VDQjoKICAgICAgY2FzZSBDUllQX0RFU19DQkM6CiAgICAgIGNhc2UgQ1JZUF9UREVTX0VDQjoKICAgICAgY2FzZSBDUllQX1RERVNfQ0JDOgoKICAgICAgICAvKlNldCBLZXkgKi8KICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOwogICAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCiAgICAgICAgewogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMik7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAzKTsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNSk7CiAgICAgICAgfQoKICAgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCiAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQogICAgICAgIHsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKICAgICAgICB9CgogICAgICAgIC8qIEZsdXNoIEZJRk8gKi8KICAgICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKCiAgICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKCiAgICAgICAgLyogU3RhcnQgRE1BIHByb2Nlc3MgdHJhbnNmZXIgZm9yIERFUy9UREVTICovCiAgICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpIC8gNFUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CiAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgogICAgICBjYXNlIENSWVBfQUVTX0NUUjoKCiAgICAgICAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgICAgICAgewogICAgICAgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKICAgICAgICAgIHsKICAgICAgICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKICAgICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLwogICAgICAgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCiAgICAgICAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCiAgICAgICAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLwogICAgICAgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQogICAgICAgIHsKICAgICAgICAgIC8qICBTZXQgdGhlIEtleSovCiAgICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CgogICAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLwogICAgICAgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCiAgICAgICAgICB7CiAgICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDFVKTsKICAgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMlUpOwogICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzVSk7CiAgICAgICAgICB9CiAgICAgICAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KCiAgICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKCiAgICAgICAgLyogU3RhcnQgRE1BIHByb2Nlc3MgdHJhbnNmZXIgZm9yIEFFUyAqLwogICAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksICgodWludDE2X3QpKGhjcnlwLT5TaXplKSAvIDRVKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKICAgICAgICBicmVhazsKICAgICAgICAjaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKQogICAgICBjYXNlIENSWVBfQUVTX0dDTToKICAgICAgICAvKiBBRVMgR0NNIGVuY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQShoY3J5cCkgOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBDUllQX0FFU19DQ006CiAgICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovCiAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoaGNyeXApOwogICAgICAgIGJyZWFrOwogICAgICAgICNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLwogICAgICBkZWZhdWx0OgogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgICAgICAgYnJlYWs7CiAgICB9CgojZWxzZSAvKkFFUyovCiAgICAvKiBTZXQgZW5jcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CgogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCiAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKCiAgICBzd2l0Y2ggKGFsZ28pCiAgICB7CgogICAgICBjYXNlIENSWVBfQUVTX0VDQjoKICAgICAgY2FzZSBDUllQX0FFU19DQkM6CiAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgoKICAgICAgICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICAgICAgICB7CiAgICAgICAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQogICAgICAgICAgewogICAgICAgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQogICAgICAgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCiAgICAgICAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKICAgICAgICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKICAgICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCiAgICAgICAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCiAgICAgICAgewogICAgICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKCiAgICAgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCiAgICAgICAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0VDQikKICAgICAgICAgIHsKICAgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOwogICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOwogICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOwogICAgICAgICAgfQogICAgICAgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCiAgICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKCiAgICAgICAgLyogU3RhcnQgRE1BIHByb2Nlc3MgdHJhbnNmZXIgZm9yIEFFUyAqLwogICAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIChoY3J5cC0+U2l6ZSAvIDRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOgogICAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLwogICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfRE1BKGhjcnlwKSA7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIENSWVBfQUVTX0NDTToKICAgICAgICAvKiBBRVMgQ0NNIGVuY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgICAgICAgYnJlYWs7CiAgICB9CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KCiAgfQogIGVsc2UKICB7CiAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgfQoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAYnJpZWYgIERlY3J5cHRpb24gaW4gRE1BIG1vZGUuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBJbnB1dDogUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChjaXBoZXJ0ZXh0ICkKICAqIEBwYXJhbSAgU2l6ZTogTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQKICAqIEBwYXJhbSAgT3V0cHV0OiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyKHBsYWludGV4dCkKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0RlY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCkKewogIHVpbnQzMl90IGFsZ287CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwoKICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsKCiAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKCiAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgX19IQUxfTE9DSyhoY3J5cCk7CgogICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIsIHBDcnlwT3V0QnVmZlB0ciBhbmQgU2l6ZSBwYXJhbWV0ZXJzKi8KICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOwogICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOwogICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CiAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OwoKICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCiAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKICAgIHsKICAgICAgaGNyeXAtPlNpemUgPSBTaXplICogNFU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKICAgIH0KCiNpZiBkZWZpbmVkIChDUllQKQoKICAgIC8qIFNldCBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CgogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCiAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREU7CgogICAgc3dpdGNoIChhbGdvKQogICAgewogICAgICBjYXNlIENSWVBfREVTX0VDQjoKICAgICAgY2FzZSBDUllQX0RFU19DQkM6CiAgICAgIGNhc2UgQ1JZUF9UREVTX0VDQjoKICAgICAgY2FzZSBDUllQX1RERVNfQ0JDOgoKICAgICAgICAvKlNldCBLZXkgKi8KICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOwogICAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCiAgICAgICAgewogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMik7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAzKTsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNSk7CiAgICAgICAgfQoKICAgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCiAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQogICAgICAgIHsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKICAgICAgICB9CgogICAgICAgIC8qIEZsdXNoIEZJRk8gKi8KICAgICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKCiAgICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKCiAgICAgICAgLyogU3RhcnQgRE1BIHByb2Nlc3MgdHJhbnNmZXIgZm9yIERFUy9UREVTICovCiAgICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpIC8gNFUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CiAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgogICAgICBjYXNlIENSWVBfQUVTX0NUUjoKCiAgICAgICAgLyogQUVTIGRlY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0X0RNQShoY3J5cCk7CiAgICAgICAgYnJlYWs7CiAgICAgICAgI2lmIGRlZmluZWQgKENSWVBfQ1JfQUxHT01PREVfQUVTX0dDTSkKICAgICAgY2FzZSBDUllQX0FFU19HQ006CiAgICAgICAgLyogQUVTIEdDTSBkZWNyeXB0aW9uICovCiAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEoaGNyeXApIDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgogICAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLwogICAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfRE1BKGhjcnlwKTsKICAgICAgICBicmVhazsKICAgICAgICAjZW5kaWYgLyogR0NNIENDTSBkZWZpbmVkKi8KICAgICAgZGVmYXVsdDoKICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CiAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgfQoKI2Vsc2UgLypBRVMqLwoKICAgIC8qIFNldCBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKCiAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOwoKICAgIHN3aXRjaCAoYWxnbykKICAgIHsKCiAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgogICAgICBjYXNlIENSWVBfQUVTX0NCQzoKICAgICAgY2FzZSBDUllQX0FFU19DVFI6CgogICAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovCiAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdF9ETUEoaGNyeXApOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBDUllQX0FFU19HQ01fR01BQzoKICAgICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8KICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQShoY3J5cCkgOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBDUllQX0FFU19DQ006CiAgICAgICAgLyogQUVTIENDTSBkZWNyeXB0aW9uICovCiAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoaGNyeXApOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CiAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgfQojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiAgfQogIGVsc2UKICB7CiAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgfQoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAfQogICovCgovKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBDUllQIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKICAqICBAYnJpZWYgICBDUllQIElSUSBoYW5kbGVyLgogICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAjIyMjIyBDUllQIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIENSWVAgSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrIGZ1bmN0aW9ucy4KICAgICAgKCspIEhBTF9DUllQX0lSUUhhbmRsZXIgQ1JZUCBpbnRlcnJ1cHQgcmVxdWVzdAogICAgICAoKykgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2sgaW5wdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjawogICAgICAoKykgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrIG91dHB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrCiAgICAgICgrKSBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrICBDUllQIGVycm9yIGNhbGxiYWNrCiAgICAgICgrKSBIQUxfQ1JZUF9HZXRTdGF0ZSByZXR1cm4gdGhlIENSWVAgc3RhdGUKICAgICAgKCspIEhBTF9DUllQX0dldEVycm9yIHJldHVybiB0aGUgQ1JZUCBlcnJvciBjb2RlCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKLyoqCiAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBjcnlwdG9ncmFwaGljIGludGVycnVwdCByZXF1ZXN0LgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX0NSWVBfSVJRSGFuZGxlcihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CgojaWYgZGVmaW5lZCAoQ1JZUCkKCiAgdWludDMyX3QgaXRzdGF0dXMgPSBoY3J5cC0+SW5zdGFuY2UtPk1JU1I7CgogIGlmICgoaXRzdGF0dXMgJiAoQ1JZUF9JVF9JTkkgfCBDUllQX0lUX09VVEkpKSAhPSAwVSkKICB7CiAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKQogICAgICAgIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKICAgIHsKICAgICAgQ1JZUF9UREVTX0lUKGhjcnlwKTsgLyogREVTIG9yIFRERVMqLwogICAgfQogICAgZWxzZSBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0JDKQogICAgICAgICAgICAgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DVFIpKQogICAgewogICAgICBDUllQX0FFU19JVChoY3J5cCk7IC8qQUVTKi8KICAgIH0KICAgICNpZiBkZWZpbmVkIChDUllQX0NSX0FMR09NT0RFX0FFU19HQ00pCiAgICBlbHNlIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTSkgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0NSX0FMR09NT0RFX0FFU19DQ00pKQogICAgewogICAgICAvKiBpZiBoZWFkZXIgcGhhc2UgKi8KICAgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9QSEFTRV9IRUFERVIpID09IENSWVBfUEhBU0VfSEVBREVSKQogICAgICB7CiAgICAgICAgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoaGNyeXApOwogICAgICB9CiAgICAgIGVsc2UgIC8qIGlmIHBheWxvYWQgcGhhc2UgKi8KICAgICAgewogICAgICAgIENSWVBfR0NNQ0NNX1NldFBheWxvYWRQaGFzZV9JVChoY3J5cCk7CiAgICAgIH0KICAgIH0KICAgICNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLwogICAgZWxzZQogICAgewogICAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgICB9CiAgfQoKI2Vsc2UgLypBRVMqLwogIGlmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLCBDUllQX0lUX0NDRikgIT0gUkVTRVQpCiAgewogICAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUX1NPVVJDRShoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSkgIT0gUkVTRVQpCiAgICB7CgogICAgICAvKiBDbGVhciBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnICovCiAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwoKICAgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKICAgICAgewoKICAgICAgICAvKiBpZiBoZWFkZXIgcGhhc2UgKi8KICAgICAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX1BIQVNFX0hFQURFUikgPT0gQ1JZUF9QSEFTRV9IRUFERVIpCiAgICAgICAgewogICAgICAgICAgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoaGNyeXApOwogICAgICAgIH0KICAgICAgICBlbHNlICAvKiBpZiBwYXlsb2FkIHBoYXNlICovCiAgICAgICAgewogICAgICAgICAgQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUKGhjcnlwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkKICAgICAgewogICAgICAgIC8qIGlmIGhlYWRlciBwaGFzZSAqLwogICAgICAgIGlmIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplID49ICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KQogICAgICAgIHsKICAgICAgICAgIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0lUKGhjcnlwKTsKICAgICAgICB9CiAgICAgICAgZWxzZSAgIC8qIGlmIHBheWxvYWQgcGhhc2UgKi8KICAgICAgICB7CiAgICAgICAgICBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoaGNyeXApOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlICAvKiBBRVMgQWxnb3JpdGhtIEVDQixDQkMgb3IgQ1RSKi8KICAgICAgewogICAgICAgIENSWVBfQUVTX0lUKGhjcnlwKTsKICAgICAgfQogICAgfQogIH0KICAvKiBDaGVjayBpZiBlcnJvciBvY2N1cnJlZCAqLwogIGlmIChfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoaGNyeXAsIENSWVBfSVRfRVJSSUUpICE9IFJFU0VUKQogIHsKICAgIC8qIElmIHdyaXRlIEVycm9yIG9jY3VycmVkICovCiAgICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9JVF9XUkVSUikgIT0gUkVTRVQpCiAgICB7CiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfV1JJVEU7CiAgICB9CiAgICAvKiBJZiByZWFkIEVycm9yIG9jY3VycmVkICovCiAgICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9JVF9SREVSUikgIT0gUkVTRVQpCiAgICB7CiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfUkVBRDsKICAgIH0KICB9CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KfQoKLyoqCiAgKiBAYnJpZWYgIFJldHVybiB0aGUgQ1JZUCBlcnJvciBjb2RlLgogICogQHBhcmFtICBoY3J5cCA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlICBDUllQIElQCiAgKiBAcmV0dmFsIENSWVAgZXJyb3IgY29kZQogICovCnVpbnQzMl90IEhBTF9DUllQX0dldEVycm9yKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICByZXR1cm4gaGNyeXAtPkVycm9yQ29kZTsKfQoKLyoqCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIENSWVAgc3RhdGUuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KICAqIEByZXR2YWwgSEFMIHN0YXRlCiAgKi8KSEFMX0NSWVBfU1RBVEVUeXBlRGVmIEhBTF9DUllQX0dldFN0YXRlKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICByZXR1cm4gaGNyeXAtPlN0YXRlOwp9CgovKioKICAqIEBicmllZiAgSW5wdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KICAqIEByZXR2YWwgTm9uZQogICovCl9fd2VhayB2b2lkIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGhjcnlwKTsKCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICB0aGUgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEBicmllZiAgT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaGNyeXApOwoKICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEBicmllZiAgQ1JZUCBlcnJvciBjYWxsYmFjay4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChoY3J5cCk7CgogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9Ci8qKgogICogQH0KICAqLwoKLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyoqIEBhZGR0b2dyb3VwIENSWVBfUHJpdmF0ZV9GdW5jdGlvbnMKICAqIEB7CiAgKi8KCiNpZiBkZWZpbmVkIChDUllQKQoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHRpb24gaW4gRUNCL0NCQyBBbGdvcml0aG0gd2l0aCBERVMvVERFUyBzdGFuZGFyZC4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIFRpbWVvdXQ6IHNwZWNpZnkgVGltZW91dCB2YWx1ZQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfVERFU19Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCnsKICB1aW50MzJfdCB0ZW1wWzJdOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCiAgdWludDE2X3QgaW5jb3VudDsgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCiAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCiAgdWludDMyX3QgaTsKCiAgLyogRW5hYmxlIENSWVAgKi8KICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CgogIC8qU3RhcnQgcHJvY2Vzc2luZyovCiAgd2hpbGUgKChoY3J5cC0+Q3J5cEluQ291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkpCiAgewogICAgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCiAgICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OwogICAgLyogV3JpdGUgcGxhaW4gZGF0YSBhbmQgZ2V0IGNpcGhlciBkYXRhICovCiAgICBpZiAoKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX0lGTkYpICE9IDB4MFUpICYmIChpbmNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSkKICAgIHsKICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICB9CgogICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgaWYgKENSWVBfV2FpdE9uT0ZORUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgIHsKICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvckNvZGUqLwogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCiAgICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgfQoKICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CgogICAgaWYgKCgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FKSAhPSAweDBVKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpKQogICAgewogICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgT3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBCdWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLwogICAgICBmb3IgKGkgPSAwVTsgaSA8IDJVOyBpKyspCiAgICAgIHsKICAgICAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgICB9CiAgICAgIGkgPSAwVTsKICAgICAgd2hpbGUgKCgoaGNyeXAtPkNyeXBPdXRDb3VudCA8ICgoaGNyeXAtPlNpemUpIC8gNFUpKSkgJiYgKGkgPCAyVSkpCiAgICAgIHsKICAgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXBbaV07CiAgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwogICAgICAgIGkrKzsKICAgICAgfQogICAgfQogICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICB9CiAgLyogRGlzYWJsZSBDUllQICovCiAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBDUllQIGJsb2NrIGlucHV0L291dHB1dCBkYXRhIGhhbmRsaW5nIHVuZGVyIGludGVycnVwdGlvbiB3aXRoIERFUy9UREVTIHN0YW5kYXJkLgogICogQG5vdGUgICBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCiAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgQ1JZUF9EZWNyeXB0X0lUKCkgYW5kIENSWVBfRW5jcnlwdF9JVCgpLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCiAgKiBAcmV0dmFsIG5vbmUKICAqLwpzdGF0aWMgdm9pZCBDUllQX1RERVNfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIHVpbnQzMl90IHRlbXBbMl07ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KICB1aW50MzJfdCBpOwoKICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX0JVU1kpCiAgewogICAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUKGhjcnlwLCBDUllQX0lUX0lOSSkgIT0gMHgwVSkKICAgIHsKICAgICAgaWYgKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsIENSWVBfRkxBR19JTlJJUykgIT0gMHgwVSkKICAgICAgewogICAgICAgIC8qIFdyaXRlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CgogICAgICAgIGlmIChoY3J5cC0+Q3J5cEluQ291bnQgPT0gKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpIC8gNFUpKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0aW9uICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKICAgICAgICAgIC8qIENhbGwgdGhlIGlucHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoX19IQUxfQ1JZUF9HRVRfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSkgIT0gMHgwVSkKICAgIHsKICAgICAgaWYgKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsIENSWVBfRkxBR19PVVRSSVMpICE9IDB4MFUpCiAgICAgIHsKICAgICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgT3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBCdWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLwogICAgICAgIGZvciAoaSA9IDBVOyBpIDwgMlU7IGkrKykKICAgICAgICB7CiAgICAgICAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgICAgIH0KICAgICAgICBpID0gMFU7CiAgICAgICAgd2hpbGUgKCgoaGNyeXAtPkNyeXBPdXRDb3VudCA8ICgoaGNyeXAtPlNpemUpIC8gNFUpKSkgJiYgKGkgPCAyVSkpCiAgICAgICAgewogICAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOwogICAgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwogICAgICAgICAgaSsrOwogICAgICAgIH0KICAgICAgICBpZiAoaGNyeXAtPkNyeXBPdXRDb3VudCA9PSAoKHVpbnQxNl90KShoY3J5cC0+U2l6ZSkgLyA0VSkpCiAgICAgICAgewogICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRpb24gKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9PVVRJKTsKCiAgICAgICAgICAvKiBEaXNhYmxlIENSWVAgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKCiAgICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICAgIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogIH0KfQoKI2VuZGlmIC8qIENSWVAgKi8KCi8qKgogICogQGJyaWVmICBFbmNyeXB0aW9uIGluIEVDQi9DQkMgJiBDVFIgQWxnb3JpdGhtIHdpdGggQUVTIFN0YW5kYXJkCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZQogICogQHBhcmFtICBUaW1lb3V0OiBzcGVjaWZ5IFRpbWVvdXQgdmFsdWUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19FbmNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCnsKICB1aW50MTZfdCBvdXRjb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUgKi8KICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLwoKICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICB7CiAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQogICAgewogICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQogICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCiAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCiAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOwogICAgfQogIH0KCiAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCiAgewoKICAgIC8qICBTZXQgdGhlIEtleSovCiAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CgogICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCiAgICB7CiAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KI2lmIGRlZmluZWQgKEFFUykKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOwojZWxzZSAvKiBDUllQICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KICAgIH0KICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLwoKICAvKiBTZXQgdGhlIHBoYXNlICovCiAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwoKICAvKiBFbmFibGUgQ1JZUCAqLwogIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CgogIHdoaWxlICgoaGNyeXAtPkNyeXBJbkNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpKQogIHsKICAgIC8qIFdyaXRlIHBsYWluIERkdGEgYW5kIGdldCBjaXBoZXIgZGF0YSAqLwogICAgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoaGNyeXAsIFRpbWVvdXQpOwogICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICB9CgogIC8qIERpc2FibGUgQ1JZUCAqLwogIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHRpb24gaW4gRUNCL0NCQyAmIENUUiBtb2RlIHdpdGggQUVTIFN0YW5kYXJkIHVzaW5nIGludGVycnVwdCBtb2RlCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0VuY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCgogIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQogIHsKICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCiAgICB7CiAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCiAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOwogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQogICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZwogICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CiAgICB9CiAgfQoKICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKICB7CiAgICAvKiAgU2V0IHRoZSBLZXkqLwogICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwoKICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQogICAgewogICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCiNpZiBkZWZpbmVkIChBRVMpCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKCiNlbHNlIC8qIENSWVAgKi8KICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogICAgfQogIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCgogIC8qIFNldCB0aGUgcGhhc2UgKi8KICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CgogIGlmIChoY3J5cC0+U2l6ZSAhPSAwVSkKICB7CiNpZiBkZWZpbmVkIChBRVMpCgogICAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CgogICAgLyogRW5hYmxlIENSWVAgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKCiNlbHNlIC8qIENSWVAgKi8KCiAgICAvKiBFbmFibGUgaW50ZXJydXB0cyAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JIHwgQ1JZUF9JVF9PVVRJKTsKCiAgICAvKiBFbmFibGUgQ1JZUCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKI2VuZGlmIC8qICBFbmQgQUVTIG9yIENSWVAgICovCiAgfQogIGVsc2UKICB7CiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgfQoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIERlY3J5cHRpb24gaW4gRUNCL0NCQyAmIENUUiBtb2RlIHdpdGggQUVTIFN0YW5kYXJkCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZQogICogQHBhcmFtICBUaW1lb3V0OiBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCnsKICB1aW50MTZfdCBvdXRjb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUgKi8KICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLwoKICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICB7CiAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQogICAgewogICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQogICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCiAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCiAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOwogICAgfQogIH0KCiAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCiAgewogICAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLwogICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19DVFIpCiAgICB7CiNpZiBkZWZpbmVkIChBRVMpCiAgICAgIGlmIChoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPT0gRElTQUJMRSkvKk1vZGUgMiBLZXkgcHJlcGFyYXRpb24qLwogICAgICB7CiAgICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCiAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04pOwoKICAgICAgICAvKiAgU2V0IHRoZSBLZXkqLwogICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKCiAgICAgICAgLyogRW5hYmxlIENSWVAgKi8KICAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogICAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvciBjb2RlKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLwogICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwoKICAgICAgICAvKiBSZXR1cm4gdG8gZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZShNb2RlIDMpKi8KICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CiAgICAgIH0KICAgICAgZWxzZSAvKk1vZGUgNCA6IGRlY3J5cHRpb24gJiBLZXkgcHJlcGFyYXRpb24qLwogICAgICB7CiAgICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CgogICAgICAgIC8qIFNldCBkZWNyeXB0aW9uICYgS2V5IHByZXBhcmF0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUKTsKICAgICAgfQojZWxzZSAvKiBDUllQICovCiAgICAgIC8qIGNoYW5nZSBBTEdPTU9ERSB0byBrZXkgcHJlcGFyYXRpb24gZm9yIGRlY3J5cHRpb24qLwogICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQ1JfQUxHT01PREVfQUVTX0tFWSk7CgogICAgICAvKiAgU2V0IHRoZSBLZXkqLwogICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CgogICAgICAvKiBFbmFibGUgQ1JZUCAqLwogICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogICAgICAvKiBXYWl0IGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICAgIGlmIChDUllQX1dhaXRPbkJVU1lGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgICAgLyogVHVybiBiYWNrIHRvIEFMR09NT0RFIG9mIHRoZSBjb25maWd1cmF0aW9uICovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgaGNyeXAtPkluaXQuQWxnb3JpdGhtKTsKCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCiAgICB9CiAgICBlbHNlICAvKkFsZ29yaXRobSBDVFIgKi8KICAgIHsKICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwogICAgfQoKICAgIC8qIFNldCBJViAqLwogICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCiAgICB7CiAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KI2lmIGRlZmluZWQgKEFFUykKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOwojZWxzZSAvKiBDUllQICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KICAgIH0KICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLwogIC8qIFNldCB0aGUgcGhhc2UgKi8KICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CgogIC8qIEVuYWJsZSBDUllQICovCiAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKCiAgd2hpbGUgKChoY3J5cC0+Q3J5cEluQ291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkpCiAgewogICAgLyogV3JpdGUgcGxhaW4gZGF0YSBhbmQgZ2V0IGNpcGhlciBkYXRhICovCiAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCwgVGltZW91dCk7CiAgICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwogIH0KCiAgLyogRGlzYWJsZSBDUllQICovCiAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9Ci8qKgogICogQGJyaWVmICBEZWNyeXB0aW9uIGluIEVDQi9DQkMgJiBDVFIgbW9kZSB3aXRoIEFFUyBTdGFuZGFyZCB1c2luZyBpbnRlcnJ1cHQgbW9kZQogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CiAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KCiAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgewogICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKICAgIHsKICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLwogICAgICBEb0tleUlWQ29uZmlnID0gMFU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCiAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCiAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLwogICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKICAgIH0KICB9CgogIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQogIHsKICAgIC8qICBLZXkgcHJlcGFyYXRpb24gZm9yIEVDQi9DQkMgKi8KICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKQogICAgewojaWYgZGVmaW5lZCAoQUVTKQogICAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIgS2V5IHByZXBhcmF0aW9uKi8KICAgICAgewogICAgICAgIC8qIFNldCBrZXkgcHJlcGFyYXRpb24gZm9yIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwogICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OKTsKCiAgICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CgogICAgICAgIC8qIEVuYWJsZSBDUllQICovCiAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAgICAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKICAgICAgICBkbwogICAgICAgIHsKICAgICAgICAgIGNvdW50LS0gOwogICAgICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICAgICAgewogICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKCiAgICAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKCiAgICAgICAgLyogUmV0dXJuIHRvIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUoTW9kZSAzKSovCiAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOwogICAgICB9CiAgICAgIGVsc2UgLypNb2RlIDQgOiBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uKi8KICAgICAgewogICAgICAgIC8qICBTZXQgdGhlIEtleSovCiAgICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwoKICAgICAgICAvKiBTZXQgZGVjcnlwdGlvbiAmIGtleSBwcmVwYXJhdGlvbiBvcGVyYXRpbmcgbW9kZSovCiAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCk7CiAgICAgIH0KI2Vsc2UgLyogQ1JZUCAqLwoKICAgICAgLyogY2hhbmdlIEFMR09NT0RFIHRvIGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfS0VZKTsKCiAgICAgIC8qICBTZXQgdGhlIEtleSovCiAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKCiAgICAgIC8qIEVuYWJsZSBDUllQICovCiAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgICAgIC8qIFdhaXQgZm9yIEJVU1kgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfS0VZUFJFUEFSQVRJT047CiAgICAgIGRvCiAgICAgIHsKICAgICAgICBjb3VudC0tIDsKICAgICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgICAgewogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfU0VUKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19CVVNZKSk7CgogICAgICAvKiBUdXJuIGJhY2sgdG8gQUxHT01PREUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOwoKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogICAgfQoKICAgIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLwogICAgewogICAgICAvKiAgU2V0IHRoZSBLZXkqLwogICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CiAgICB9CgogICAgLyogU2V0IElWICovCiAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0VDQikKICAgIHsKICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLwojaWYgZGVmaW5lZCAoQUVTKQogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMik7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CiNlbHNlIC8qIENSWVAgKi8KICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogICAgfQogIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCgogIC8qIFNldCB0aGUgcGhhc2UgKi8KICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CiAgaWYgKGhjcnlwLT5TaXplICE9IDBVKQogIHsKCiNpZiBkZWZpbmVkIChBRVMpCgogICAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CgogICAgLyogRW5hYmxlIENSWVAgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKCiNlbHNlIC8qIENSWVAgKi8KCiAgICAvKiBFbmFibGUgaW50ZXJydXB0cyAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JIHwgQ1JZUF9JVF9PVVRJKTsKCiAgICAvKiBFbmFibGUgQ1JZUCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogIH0KICBlbHNlCiAgewogICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICB9CgogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9Ci8qKgogICogQGJyaWVmICBEZWNyeXB0aW9uIGluIEVDQi9DQkMgJiBDVFIgbW9kZSB3aXRoIEFFUyBTdGFuZGFyZCB1c2luZyBETUEgbW9kZQogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgX19JTyB1aW50MzJfdCBjb3VudCA9IDBVOwogIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCgogIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQogIHsKICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCiAgICB7CiAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCiAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOwogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQogICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZwogICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CiAgICB9CiAgfQogIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQogIHsKICAgIC8qICBLZXkgcHJlcGFyYXRpb24gZm9yIEVDQi9DQkMgKi8KICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKQogICAgewojaWYgZGVmaW5lZCAoQUVTKQogICAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIga2V5IHByZXBhcmF0aW9uKi8KICAgICAgewogICAgICAgIC8qIFNldCBrZXkgcHJlcGFyYXRpb24gZm9yIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwogICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OKTsKCiAgICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CgogICAgICAgIC8qIEVuYWJsZSBDUllQICovCiAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAgICAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKICAgICAgICBkbwogICAgICAgIHsKICAgICAgICAgIGNvdW50LS0gOwogICAgICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICAgICAgewogICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKCiAgICAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKCiAgICAgICAgLyogUmV0dXJuIHRvIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUoTW9kZSAzKSovCiAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOwogICAgICB9CiAgICAgIGVsc2UgLypNb2RlIDQgOiBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uKi8KICAgICAgewogICAgICAgIC8qICBTZXQgdGhlIEtleSovCiAgICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwoKICAgICAgICAvKiBTZXQgZGVjcnlwdGlvbiAmIEtleSBwcmVwYXJhdGlvbiBvcGVyYXRpbmcgbW9kZSovCiAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCk7CiAgICAgIH0KI2Vsc2UgLyogQ1JZUCAqLwogICAgICAvKiBjaGFuZ2UgQUxHT01PREUgdG8ga2V5IHByZXBhcmF0aW9uIGZvciBkZWNyeXB0aW9uKi8KICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0NSX0FMR09NT0RFX0FFU19LRVkpOwoKICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwoKICAgICAgLyogRW5hYmxlIENSWVAgKi8KICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAgICAgLyogV2FpdCBmb3IgQlVTWSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKICAgICAgZG8KICAgICAgewogICAgICAgIGNvdW50LS0gOwogICAgICAgIGlmIChjb3VudCA9PSAwVSkKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfU0VUKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19CVVNZKSk7CgogICAgICAvKiBUdXJuIGJhY2sgdG8gQUxHT01PREUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOwoKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAgKi8KICAgIH0KICAgIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLwogICAgewogICAgICAvKiAgU2V0IHRoZSBLZXkqLwogICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CiAgICB9CgogICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCiAgICB7CiAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KI2lmIGRlZmluZWQgKEFFUykKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOwojZWxzZSAvKiBDUllQICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCiAgICB9CiAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KCiAgLyogU2V0IHRoZSBwaGFzZSAqLwogIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKCiAgaWYgKGhjcnlwLT5TaXplICE9IDBVKQogIHsKICAgIC8qIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzZXMgYW5kIHN0YXJ0IERNQSB0cmFuc2ZlciAqLwogICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKGhjcnlwLT5TaXplIC8gNFUpLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKICB9CiAgZWxzZQogIHsKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICB9CgogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgoKLyoqCiAgKiBAYnJpZWYgIERNQSBDUllQIGlucHV0IGRhdGEgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KICAqIEBwYXJhbSAgaGRtYTogRE1BIGhhbmRsZQogICogQHJldHZhbCBOb25lCiAgKi8Kc3RhdGljIHZvaWQgQ1JZUF9ETUFJbkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCnsKICBDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwID0gKENSWVBfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OwoKICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIGlucHV0IEZJRk8gcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERJRU4gYml0CiAgaW4gdGhlIERNQUNSIHJlZ2lzdGVyICovCiNpZiBkZWZpbmVkIChDUllQKQogIGhjcnlwLT5JbnN0YW5jZS0+RE1BQ1IgJj0gKHVpbnQzMl90KSh+Q1JZUF9ETUFDUl9ESUVOKTsKCiNlbHNlIC8qIEFFUyAqLwogIENMRUFSX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfRE1BSU5FTik7CgogIC8qIFRpbnlBRVMyLCBObyBvdXRwdXQgb24gQ0NNIEFFUywgdW5sb2NrIHNob3VsZCBiZSBkb25lIHdoZW4gaW5wdXQgZGF0YSBwcm9jZXNzIGNvbXBsZXRlICovCiAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19DQ00pID09IENSWVBfQUVTX0NDTSkKICB7CiAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CgogICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlIHRvIHJlYWR5ICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogIH0KI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwoKICAvKiBDYWxsIGlucHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCn0KCi8qKgogICogQGJyaWVmICBETUEgQ1JZUCBvdXRwdXQgZGF0YSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgogICogQHBhcmFtICBoZG1hOiBETUEgaGFuZGxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpzdGF0aWMgdm9pZCBDUllQX0RNQU91dENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCnsKICBDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwID0gKENSWVBfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OwoKICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIG91dHB1dCBGSUZPIHJlcXVlc3QgYnkgcmVzZXR0aW5nCiAgdGhlIERPRU4gYml0IGluIHRoZSBETUFDUiByZWdpc3RlciAqLwoKI2lmIGRlZmluZWQgKENSWVApCgogIGhjcnlwLT5JbnN0YW5jZS0+RE1BQ1IgJj0gKHVpbnQzMl90KSh+Q1JZUF9ETUFDUl9ET0VOKTsKICAjaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKQogIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfR0NNKSAhPSBDUllQX0FFU19HQ00pCiAgewogICAgLyogRGlzYWJsZSBDUllQICAobm90IGFsbG93ZWQgaW4gIEdDTSkqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICB9CgogICNlbHNlIC8qTk8gR0NNIENDTSAqLwogIC8qIERpc2FibGUgQ1JZUCAqLwogIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgI2VuZGlmIC8qIEdDTSBDQ00gZGVmaW5lZCovCiNlbHNlIC8qIEFFUyAqLwoKICBDTEVBUl9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RNQU9VVEVOKTsKCiAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKCiAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19HQ01fR01BQykgIT0gQ1JZUF9BRVNfR0NNX0dNQUMpCiAgewogICAgLyogRGlzYWJsZSBDUllQIChub3QgYWxsb3dlZCBpbiAgR0NNKSovCiAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogIH0KI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwoKICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgdG8gcmVhZHkgKi8KICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgLyogQ2FsbCBvdXRwdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAvKkNhbGwgcmVnaXN0ZXJlZCBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLwogIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZWxzZQogIC8qQ2FsbCBsZWdhY3kgd2VhayBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLwogIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCn0KCi8qKgogICogQGJyaWVmICBETUEgQ1JZUCBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgogICogQHBhcmFtICBoZG1hOiBETUEgaGFuZGxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpzdGF0aWMgdm9pZCBDUllQX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQp7CiAgQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCA9IChDUllQX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKCiAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsKCiNpZiBkZWZpbmVkIChBRVMpCgogIC8qIENsZWFyIENDRiBmbGFnICovCiAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CgojZW5kaWYgLyogQUVTICovCgogIC8qIENhbGwgZXJyb3IgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwp9CgovKioKICAqIEBicmllZiAgU2V0IHRoZSBETUEgY29uZmlndXJhdGlvbiBhbmQgc3RhcnQgdGhlIERNQSB0cmFuc2ZlcgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgaW5wdXRhZGRyOiBhZGRyZXNzIG9mIHRoZSBpbnB1dCBidWZmZXIKICAqIEBwYXJhbSAgU2l6ZTogc2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuCiAgKiBAcGFyYW0gIG91dHB1dGFkZHI6IGFkZHJlc3Mgb2YgdGhlIG91dHB1dCBidWZmZXIKICAqIEByZXR2YWwgTm9uZQogICovCnN0YXRpYyB2b2lkIENSWVBfU2V0RE1BQ29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IGlucHV0YWRkciwgdWludDE2X3QgU2l6ZSwgdWludDMyX3Qgb3V0cHV0YWRkcikKewogIC8qIFNldCB0aGUgQ1JZUCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KICBoY3J5cC0+aGRtYWluLT5YZmVyQ3BsdENhbGxiYWNrID0gQ1JZUF9ETUFJbkNwbHQ7CgogIC8qIFNldCB0aGUgRE1BIGlucHV0IGVycm9yIGNhbGxiYWNrICovCiAgaGNyeXAtPmhkbWFpbi0+WGZlckVycm9yQ2FsbGJhY2sgPSBDUllQX0RNQUVycm9yOwoKICAvKiBTZXQgdGhlIENSWVAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiAgaGNyeXAtPmhkbWFvdXQtPlhmZXJDcGx0Q2FsbGJhY2sgPSBDUllQX0RNQU91dENwbHQ7CgogIC8qIFNldCB0aGUgRE1BIG91dHB1dCBlcnJvciBjYWxsYmFjayAqLwogIGhjcnlwLT5oZG1hb3V0LT5YZmVyRXJyb3JDYWxsYmFjayA9IENSWVBfRE1BRXJyb3I7CgojaWYgZGVmaW5lZCAoQ1JZUCkKCiAgLyogRW5hYmxlIENSWVAgKi8KICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogIC8qIEVuYWJsZSB0aGUgaW5wdXQgRE1BIFN0cmVhbSAqLwogIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhjcnlwLT5oZG1haW4sIGlucHV0YWRkciwgKHVpbnQzMl90KSZoY3J5cC0+SW5zdGFuY2UtPkRJTiwgU2l6ZSkgIT0gSEFMX09LKQogIHsKICAgIC8qIERNQSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsKCiAgICAvKiBDYWxsIGVycm9yIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogIH0KICAvKiBFbmFibGUgdGhlIG91dHB1dCBETUEgU3RyZWFtICovCiAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFvdXQsICh1aW50MzJfdCkmaGNyeXAtPkluc3RhbmNlLT5ET1VULCBvdXRwdXRhZGRyLCBTaXplKSAhPSBIQUxfT0spCiAgewogICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOwoKICAgIC8qIENhbGwgZXJyb3IgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgfQogIC8qIEVuYWJsZSBJbi9PdXQgRE1BIHJlcXVlc3QgKi8KICBoY3J5cC0+SW5zdGFuY2UtPkRNQUNSID0gQ1JZUF9ETUFDUl9ET0VOIHwgQ1JZUF9ETUFDUl9ESUVOOwoKI2Vsc2UgLyogQUVTICovCgogIGlmICgoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0dDTV9HTUFDKSAhPSBDUllQX0FFU19HQ01fR01BQykKICAgICAgJiYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19DQ00pICE9IENSWVBfQUVTX0NDTSkpCiAgewogICAgLyogRW5hYmxlIENSWVAgKG5vdCBhbGxvd2VkIGluICBHQ00gJiBDQ00pKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICB9CgogIC8qIEVuYWJsZSB0aGUgRE1BIGlucHV0IHN0cmVhbSAqLwogIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhjcnlwLT5oZG1haW4sIGlucHV0YWRkciwgKHVpbnQzMl90KSZoY3J5cC0+SW5zdGFuY2UtPkRJTlIsIFNpemUpICE9IEhBTF9PSykKICB7CiAgICAvKiBETUEgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9ETUE7CgogICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCiAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICB9CiAgLyogRW5hYmxlIHRoZSBETUEgb3V0cHV0IHN0cmVhbSAqLwogIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhjcnlwLT5oZG1hb3V0LCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RE9VVFIsIG91dHB1dGFkZHIsIFNpemUpICE9IEhBTF9PSykKICB7CiAgICAvKiBETUEgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9ETUE7CgogICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCiAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICB9CiAgLypBRVMydjEuMS4xIDogQ0NNIGF1dGhlbnRpY2F0aW9uIDogbm8gaW5pdCBwaGFzZSwgb25seSBoZWFkZXIgYW5kIGZpbmFsIHBoYXNlICovCiAgLyogRW5hYmxlIEluIGFuZCBPdXQgRE1BIHJlcXVlc3RzICovCiAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19DQ00pID09IENSWVBfQUVTX0NDTSkKICB7CiAgICAvKiBFbmFibGUgb25seSBJbiBETUEgcmVxdWVzdHMgZm9yIENDTSovCiAgICBTRVRfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIChBRVNfQ1JfRE1BSU5FTikpOwogIH0KICBlbHNlCiAgewogICAgLyogRW5hYmxlIEluIGFuZCBPdXQgRE1BIHJlcXVlc3RzICovCiAgICBTRVRfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIChBRVNfQ1JfRE1BSU5FTiB8IEFFU19DUl9ETUFPVVRFTikpOwogIH0KI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwp9CgovKioKICAqIEBicmllZiAgUHJvY2VzcyBEYXRhOiBXcml0ZSBJbnB1dCBkYXRhIGluIHBvbGxpbmcgbW9kZSBhbmQgdXNlZCBpbiBBRVMgZnVuY3Rpb25zLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgVGltZW91dDogU3BlY2lmeSBUaW1lb3V0IHZhbHVlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpzdGF0aWMgdm9pZCBDUllQX0FFU19Qcm9jZXNzRGF0YShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQp7CgogIHVpbnQzMl90IHRlbXBbNF07ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KICB1aW50MzJfdCBpOwojaWYgZGVmaW5lZCAoQ1JZUCkKICB1aW50MTZfdCBpbmNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCiAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCiNlbmRpZgoKI2lmIGRlZmluZWQgKENSWVApCgogIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgaW5jb3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudDsKCiAgaWYgKCgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19JRk5GKSAhPSAweDBVKSAmJiAoaW5jb3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkpCiAgewogICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICB9CgogIC8qIFdhaXQgZm9yIE9GTkUgZmxhZyB0byBiZSByYWlzZWQgKi8KICBpZiAoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQogIHsKICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvciBjb2RlKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogIH0KCiAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CgogIGlmICgoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSkgIT0gMHgwVSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSkKICB7CiAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgT3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLwogICAgZm9yIChpID0gMFU7IGkgPCA0VTsgaSsrKQogICAgewogICAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgfQogICAgaSA9IDBVOwogICAgd2hpbGUgKCgoaGNyeXAtPkNyeXBPdXRDb3VudCA8ICgoaGNyeXAtPlNpemUpIC8gNFUpKSkgJiYgKGkgPCA0VSkpCiAgICB7CiAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcFtpXTsKICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwogICAgICBpKys7CiAgICB9CiAgfQoKI2Vsc2UgLyogQUVTICovCgogIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CgogIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwogIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQogIHsKICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogIH0KCiAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKCiAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovCiAgZm9yIChpID0gMFU7IGkgPCA0VTsgaSsrKQogIHsKICAgIHRlbXBbaV0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogIH0KICBpID0gMFU7CiAgd2hpbGUgKChoY3J5cC0+Q3J5cE91dENvdW50IDwgKChoY3J5cC0+U2l6ZSArIDNVKSAvIDRVKSkgJiYgKGkgPCA0VSkpCiAgewogICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOwogICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwogICAgaSsrOwogIH0KI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwp9CgovKioKICAqIEBicmllZiAgSGFuZGxlIENSWVAgYmxvY2sgaW5wdXQvb3V0cHV0IGRhdGEgaGFuZGxpbmcgdW5kZXIgaW50ZXJydXB0aW9uLgogICogQG5vdGUgICBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCiAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX0NSWVBfRW5jcnlwdF9JVCBvciBIQUxfQ1JZUF9EZWNyeXB0X0lULgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpzdGF0aWMgdm9pZCBDUllQX0FFU19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgdWludDMyX3QgdGVtcFs0XTsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLwogIHVpbnQzMl90IGk7CiNpZiBkZWZpbmVkIChDUllQKQogIHVpbnQxNl90IGluY291bnQ7IC8qIFRlbXBvcmFyeSBDcnlwSW5Db3VudCBWYWx1ZSAqLwogIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLwojZW5kaWYKCiAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9CVVNZKQogIHsKI2lmIGRlZmluZWQgKENSWVApCgogICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgIGluY291bnQgPSBoY3J5cC0+Q3J5cEluQ291bnQ7CiAgICBpZiAoKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX0lGTkYpICE9IDB4MFUpICYmIChpbmNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSkKICAgIHsKICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgIGlmIChoY3J5cC0+Q3J5cEluQ291bnQgPT0gKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpIC8gNFUpKQogICAgICB7CiAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7CgogICAgICAgIC8qIENhbGwgdGhlIGlucHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgIH0KICAgIH0KICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CgogICAgaWYgKCgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FKSAhPSAweDBVKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpKQogICAgewogICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLwogICAgICBmb3IgKGkgPSAwVTsgaSA8IDRVOyBpKyspCiAgICAgIHsKICAgICAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgICB9CiAgICAgIGkgPSAwVTsKICAgICAgd2hpbGUgKCgoaGNyeXAtPkNyeXBPdXRDb3VudCA8ICgoaGNyeXAtPlNpemUpIC8gNFUpKSkgJiYgKGkgPCA0VSkpCiAgICAgIHsKICAgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXBbaV07CiAgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwogICAgICAgIGkrKzsKICAgICAgfQogICAgICBpZiAoaGNyeXAtPkNyeXBPdXRDb3VudCA9PSAoKHVpbnQxNl90KShoY3J5cC0+U2l6ZSkgLyA0VSkpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSk7CgogICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAvKiBEaXNhYmxlIENSWVAgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKCiAgICAgICAgLyogQ2FsbCBPdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgICB9CiAgICB9CgojZWxzZSAvKkFFUyovCgogICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovCiAgICBmb3IgKGkgPSAwVTsgaSA8IDRVOyBpKyspCiAgICB7CiAgICAgIHRlbXBbaV0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgfQogICAgaSA9IDBVOwogICAgd2hpbGUgKChoY3J5cC0+Q3J5cE91dENvdW50IDwgKChoY3J5cC0+U2l6ZSArIDNVKSAvIDRVKSkgJiYgKGkgPCA0VSkpCiAgICB7CiAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcFtpXTsKICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwogICAgICBpKys7CiAgICB9CgogICAgaWYgKGhjcnlwLT5DcnlwT3V0Q291bnQgPT0gKGhjcnlwLT5TaXplIC8gNFUpKQogICAgewogICAgICAvKiBEaXNhYmxlIENvbXB1dGF0aW9uIENvbXBsZXRlIGZsYWcgYW5kIGVycm9ycyBpbnRlcnJ1cHRzICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOwoKICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgLyogRGlzYWJsZSBDUllQICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogICAgICAvKiBDYWxsIE91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CgogICAgICBpZiAoaGNyeXAtPkNyeXBJbkNvdW50ID09IChoY3J5cC0+U2l6ZSAvIDRVKSkKICAgICAgewogICAgICAgIC8qIENhbGwgSW5wdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgICB9CiAgICB9CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCgogIH0KICBlbHNlCiAgewogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogIH0KfQoKLyoqCiAgKiBAYnJpZWYgIFdyaXRlcyBLZXkgaW4gS2V5IHJlZ2lzdGVycy4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIEtleVNpemU6IFNpemUgb2YgS2V5CiAgKiBAcmV0dmFsIE5vbmUKICAqLwpzdGF0aWMgdm9pZCBDUllQX1NldEtleShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBLZXlTaXplKQp7CiNpZiBkZWZpbmVkIChDUllQKQoKICBzd2l0Y2ggKEtleVNpemUpCiAgewogICAgY2FzZSBDUllQX0tFWVNJWkVfMjU2QjoKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAzKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNCk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA2KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDUllQX0tFWVNJWkVfMTkyQjoKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAzKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNCk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOwogICAgICBicmVhazsKICAgIGNhc2UgQ1JZUF9LRVlTSVpFXzEyOEI6CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMyk7CgogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGJyZWFrOwogIH0KI2Vsc2UgLypBRVMqLwogIHN3aXRjaCAoS2V5U2l6ZSkKICB7CiAgICBjYXNlIENSWVBfS0VZU0laRV8yNTZCOgogICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI3ID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI1ID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMik7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjQgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAzKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA2KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDcpOwogICAgICBicmVhazsKICAgIGNhc2UgQ1JZUF9LRVlTSVpFXzEyOEI6CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOwoKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBicmVhazsKICB9CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCn0KCiNpZiBkZWZpbmVkIChDUllQX0NSX0FMR09NT0RFX0FFU19HQ00pfHwgZGVmaW5lZCAoQUVTKQovKioKICAqIEBicmllZiAgRW5jcnlwdGlvbi9EZWNyeXB0aW9uIHByb2Nlc3MgaW4gQUVTIEdDTSBtb2RlIGFuZCBwcmVwYXJlIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcKICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCnsKICB1aW50MzJfdCB0aWNrc3RhcnQ7CiAgdWludDMyX3Qgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKSAvIDRVIDsKICB1aW50MTZfdCBvdXRjb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUgKi8KICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLwoKICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICB7CiAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQogICAgewogICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQogICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCiAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKICAgICAgaGNyeXAtPlNpemVzU3VtICs9IGhjcnlwLT5TaXplOyAvKiBDb21wdXRlIG1lc3NhZ2UgdG90YWwgcGF5bG9hZCBsZW5ndGggKi8KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCiAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOwogICAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsgLyogTWVyZWx5IHN0b3JlIHBheWxvYWQgbGVuZ3RoICovCiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsKICB9CgogIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQogIHsKICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwVTsKCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9JTklUKTsKCiAgICAvKiBTZXQgdGhlIGtleSAqLwogICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwoKI2lmIGRlZmluZWQoQ1JZUCkKCiAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMik7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKCiAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAgIC8qIEdldCB0aWNrICovCiAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwoKICAgIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCiAgICB3aGlsZSAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0NSWVBFTikgPT0gQ1JZUF9DUl9DUllQRU4pCiAgICB7CiAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgICB7CiAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgICAgewogICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CiAgICB9CgojZWxzZSAvKiBBRVMgKi8KICAgIC8qIFdvcmthcm91bmQgMSA6IG9ubHkgQUVTLgogICAgRGF0YXR5cGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIDMyIGJpdHMgZHVyaW5nIEluaXQgcGhhc2UuIE9ubHksIGFmdGVyIEluaXQsIGFuZCBiZWZvcmUgcmUKICAgIGVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgZGlmZmVyZW50IGZyb20gMzIgYml0cyBjYW4gYmUgY29uZmlndXJlZC4qLwogICAgLyogU2VsZWN0IERBVEFUWVBFIDMyICAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIENSWVBfREFUQVRZUEVfMzJCKTsKCiAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMik7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOwoKICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogICAgLyoganVzdCB3YWl0IGZvciBoYXNoIGNvbXB1dGF0aW9uICovCiAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgIHsKICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICYgcmV0dXJuIGVycm9yICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICB9CiAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CgojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLwoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgaWYgKENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlKGhjcnlwLCAgVGltZW91dCkgIT0gSEFMX09LKQogICAgewogICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgfQoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqUGF5bG9hZCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwoKI2lmIGRlZmluZWQoQ1JZUCkKCiAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLwogICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CgogICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiNlbHNlIC8qIEFFUyAqLwoKICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOwoKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAgKi8KICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLwoKICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkKICB7CiAgICAvKiByZWNhbGN1bGF0ZSAgd29yZHNpemUgKi8KICAgIHdvcmRzaXplID0gKCh3b3Jkc2l6ZSAvIDRVKSAqIDRVKSA7CiAgfQoKICAvKiBHZXQgdGljayAqLwogIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CgogIC8qIFdyaXRlIGlucHV0IGRhdGEgYW5kIGdldCBvdXRwdXQgRGF0YSAqLwogIHdoaWxlICgoaGNyeXAtPkNyeXBJbkNvdW50IDwgd29yZHNpemUpICYmIChvdXRjb3VudCA8IHdvcmRzaXplKSkKICB7CiAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLCBUaW1lb3V0KTsKCiAgICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwoKICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgIHsKICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvciBjb2RlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICB9CiAgICB9CiAgfQoKICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkKICB7CiAgICAvKiAgV29ya2Fyb3VuZCAyIDogIENSWVAxICYgQUVTIGdlbmVyYXRlcyBjb3JyZWN0IFRBRyBmb3IgR0NNIG1vZGUgb25seSB3aGVuIGlucHV0IGJsb2NrIHNpemUgaXMgbXVsdGlwbGUgb2YKICAgIDEyOCBiaXRzLiBJZiBsdGhlIHNpemUgb2YgdGhlIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCBpcyBpbmZlcmlvciB0byAxMjggYml0cywgd2hlbiBHQ00gZW5jcnlwdGlvbgogICAgaXMgc2VsZWN0ZWQsIHRoZW4gdGhlIFRBRyBtZXNzYWdlIHdpbGwgYmUgd3JvbmcuKi8KICAgIENSWVBfV29ya2Fyb3VuZChoY3J5cCwgVGltZW91dCk7CiAgfQoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHRpb24vRGVjcnlwdGlvbiBwcm9jZXNzIGluIEFFUyBHQ00gbW9kZSBhbmQgcHJlcGFyZSB0aGUgYXV0aGVudGljYXRpb24gVEFHIGluIGludGVycnVwdCBtb2RlCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLwojaWYgZGVmaW5lZChBRVMpCiAgdWludDMyX3QgbG9vcGNvdW50ZXI7CiAgdWludDMyX3QgbGFzdHdvcmRzaXplOwogIHVpbnQzMl90IG5wYmxiOwojZW5kaWYgLyogQUVTICovCgogIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQogIHsKICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCiAgICB7CiAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCiAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOwogICAgICBoY3J5cC0+U2l6ZXNTdW0gKz0gaGNyeXAtPlNpemU7IC8qIENvbXB1dGUgbWVzc2FnZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCAqLwogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQogICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZwogICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CiAgICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOyAvKiBNZXJlbHkgc3RvcmUgcGF5bG9hZCBsZW5ndGggKi8KICAgIH0KICB9CiAgZWxzZQogIHsKICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOwogIH0KCiAgLyogQ29uZmlndXJlIEtleSwgSVYgYW5kIHByb2Nlc3MgbWVzc2FnZSAoaGVhZGVyIGFuZCBwYXlsb2FkKSAqLwogIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQogIHsKICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwVTsKCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9JTklUKTsKCiAgICAvKiBTZXQgdGhlIGtleSAqLwogICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwoKI2lmIGRlZmluZWQoQ1JZUCkKICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOwoKICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogICAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKICAgIGRvCiAgICB7CiAgICAgIGNvdW50LS0gOwogICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0gd2hpbGUgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKTsKCiNlbHNlIC8qIEFFUyAqLwoKICAgIC8qIFdvcmthcm91bmQgMSA6IG9ubHkgQUVTCiAgICBEYXRhdHlwZSBjb25maWd1cmF0aW9uIG11c3QgYmUgMzIgYml0cyBkdXJpbmcgSU5JVCBwaGFzZS4gT25seSwgYWZ0ZXIgSU5JVCwgYW5kIGJlZm9yZSByZQogICAgZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBkaWZmZXJlbnQgZnJvbSAzMiBiaXRzIGNhbiBiZSBjb25maWd1cmVkLiovCiAgICAvKiBTZWxlY3QgREFUQVRZUEUgMzIgICovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgQ1JZUF9EQVRBVFlQRV8zMkIpOwoKICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CgogICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKICAgIGRvCiAgICB7CiAgICAgIGNvdW50LS0gOwogICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKCiAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CgojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCgogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWYgZGVmaW5lZChDUllQKQoKICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CgogICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7CgogICAgLyogRW5hYmxlIENSWVAgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiNlbHNlIC8qIEFFUyAqLwoKICAgIC8qIFdvcmthcm91bmQgMTogb25seSBBRVMgLCBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZCovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgaGNyeXAtPkluaXQuRGF0YVR5cGUpOwoKICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CgogICAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CgogICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgICBpZiAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA9PSAwVSkgLypoZWFkZXIgcGhhc2UgaXMgIHNraXBwZWQqLwogICAgewogICAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKCiAgICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfUEFZTE9BRCk7CgogICAgICAvKiBXcml0ZSB0aGUgcGF5bG9hZCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgICBpZiAoaGNyeXAtPlNpemUgPT0gMFUpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKCiAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGhjcnlwLT5TaXplID49IDE2VSkKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgICAgaWYgKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAoaGNyeXAtPlNpemUgLyA0VSkpCiAgICAgICAgewogICAgICAgICAgLyogQ2FsbCBJbnB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIC8qIFNpemUgPCAxNkJ5dGVzICA6IGZpcnN0IGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrKi8KICAgICAgewogICAgICAgIC8qIFdvcmthcm91bmQgbm90IGltcGxlbWVudGVkKi8KICAgICAgICAvKiBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uOgogICAgICAgIFdvcmthcm91bmQgaXMgaW1wbGVtZW50ZWQgaW4gcG9sbGluZyBtb2RlLCBzbyBpZiBsYXN0IGJsb2NrIG9mCiAgICAgICAgcGF5bG9hZCA8MTI4Yml0IGRvbid0IHVzZSBDUllQX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiAqLwoKICAgICAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KICAgICAgICBucGJsYiA9IDE2VSAtICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOwoKICAgICAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLwogICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCiAgICAgICAgewogICAgICAgICAgbGFzdHdvcmRzaXplID0gKDE2VSAtIG5wYmxiKSAvIDRVOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKICAgICAgICB9CgogICAgICAgIC8qICBsYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwogICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemUgOyBsb29wY291bnRlcisrKQogICAgICAgIHsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICAgIH0KICAgICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKICAgICAgICB7CiAgICAgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CiAgICAgICAgICBsb29wY291bnRlcisrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIDwgNFUpCiAgICB7CiAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplIDsgbG9vcGNvdW50ZXIrKykKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgfQogICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKICAgICAgewogICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CiAgICAgICAgbG9vcGNvdW50ZXIrKzsKICAgICAgfQogICAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKCiAgICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICAgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CgogICAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgIH0KICAgIGVsc2UgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSA+PSA0VSkKICAgIHsKICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgIH0KCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KICB9IC8qIGVuZCBvZiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCgovKioKICAqIEBicmllZiAgRW5jcnlwdGlvbi9EZWNyeXB0aW9uIHByb2Nlc3MgaW4gQUVTIEdDTSBtb2RlIGFuZCBwcmVwYXJlIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcgdXNpbmcgRE1BCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTR0NNX1Byb2Nlc3NfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CiAgdWludDMyX3Qgd29yZHNpemU7CiAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KCiAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgewogICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKICAgIHsKICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLwogICAgICBEb0tleUlWQ29uZmlnID0gMFU7CiAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCiAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCiAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLwogICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLwogICAgfQogIH0KICBlbHNlCiAgewogICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CiAgfQoKICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKICB7CiAgICAvKiAgUmVzZXQgQ3J5cEhlYWRlckNvdW50ICovCiAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CgogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9JTklUKTsKCiAgICAvKiBTZXQgdGhlIGtleSAqLwogICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwoKI2lmIGRlZmluZWQoQ1JZUCkKICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOwoKICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogICAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKICAgIGRvCiAgICB7CiAgICAgIGNvdW50LS0gOwogICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0gd2hpbGUgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKTsKCiNlbHNlIC8qIEFFUyAqLwoKICAgIC8qV29ya2Fyb3VuZCAxIDogb25seSBBRVMKICAgIERhdGF0eXBlIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSAzMiBiaXRzIGR1cmluZyBJbml0IHBoYXNlLiBPbmx5LCBhZnRlciBJbml0LCBhbmQgYmVmb3JlIHJlCiAgICBlbmFibGluZyB0aGUgSVAsIGRhdGF0eXBlIGRpZmZlcmVudCBmcm9tIDMyIGJpdHMgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KICAgIC8qIFNlbGVjdCBEQVRBVFlQRSAzMiAgKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBDUllQX0RBVEFUWVBFXzMyQik7CgogICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYW5kIHRoZSBjb3VudGVyIDogSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKCiAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAgIC8qIGp1c3Qgd2FpdCBmb3IgaGFzaCBjb21wdXRhdGlvbiAqLwogICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOwogICAgZG8KICAgIHsKICAgICAgY291bnQtLSA7CiAgICAgIGlmIChjb3VudCA9PSAwVSkKICAgICAgewogICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwoKICAgIC8qIENsZWFyIENDRiBmbGFnICovCiAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgIGlmIChDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoaGNyeXApICE9IEhBTF9PSykKICAgIHsKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqIFBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKCiNpZiBkZWZpbmVkKENSWVApCgogICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKI2VuZGlmIC8qIENSWVAgKi8KCiAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCiAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKCiAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KCiAgaWYgKGhjcnlwLT5TaXplICE9IDBVKQogIHsKICAgIC8qIENSWVAxIElQIFYgPCAyLjIuMSAgU2l6ZSBzaG91bGQgYmUgJTQgIG90aGVyd2lzZSBUYWcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbjoKICAgIFdvcmthcm91bmQgaXMgaW1wbGVtZW50ZWQgaW4gcG9sbGluZyBtb2RlLCBzbyBpZiBsYXN0IGJsb2NrIG9mCiAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIERNQSBtb2RlIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIC4gKi8KICAgIC8qIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzZXMgYW5kIHN0YXJ0IERNQSB0cmFuc2ZlciAqLwogICAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpCiAgICB7CiAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIChoY3J5cC0+U2l6ZSAvIDRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CiAgICB9CiAgICBlbHNlIC8qdG8gY29tcHV0ZSBsYXN0IHdvcmQ8MTI4Yml0cywgb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGJlIGVuY3J5cHRlZC9kZWNyeXB0ZWQgKi8KICAgIHsKICAgICAgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKSArICgxNlUgLSAoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgJSAxNlUpKSA7CgogICAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIsIHBDcnlwT3V0QnVmZlB0ciBzaXplIHNob3VsZCBiZSAlNCAqLwogICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoKHVpbnQxNl90KXdvcmRzaXplIC8gNFUpLAogICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIC8qIFByb2Nlc3MgdW5Mb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlIGFuZCBwaGFzZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CiAgfQoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKCi8qKgogICogQGJyaWVmICBBRVMgQ0NNIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm9jZXNzaW5nIGluIHBvbGxpbmcgbW9kZQogICogICAgICAgICBmb3IgVGlueUFFUyBJUCwgbm8gZW5jcnlwdC9kZWNyeXB0IHBlcmZvcm1lZCwgb25seSBhdXRoZW50aWNhdGlvbiBwcmVwYXJhdGlvbi4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0NDTV9Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCnsKICB1aW50MzJfdCB0aWNrc3RhcnQ7CiAgdWludDMyX3Qgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKSAvIDRVOwogIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLwogIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCiNpZiBkZWZpbmVkKEFFUykKICB1aW50MzJfdCBsb29wY291bnRlcjsKICB1aW50MzJfdCBucGJsYjsKICB1aW50MzJfdCBsYXN0d29yZHNpemU7CiNlbmRpZiAvKiBBRVMgKi8KCiAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgewogICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKICAgIHsKICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLwogICAgICBEb0tleUlWQ29uZmlnID0gMFU7CiAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCiAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCiAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLwogICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLwogICAgfQogIH0KICBlbHNlCiAgewogICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CiAgfQoKICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKICB7CgogICAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOwoKI2lmIGRlZmluZWQoQ1JZUCkKCiAgICAvKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9JTklUKTsKCiAgICAvKiBTZXQgdGhlIGtleSAqLwogICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwoKICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIChJVikgd2l0aCBDVFIxIGluZm9ybWF0aW9uICovCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjFfMDsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSBoY3J5cC0+SW5pdC5CMFsxXTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSBoY3J5cC0+SW5pdC5CMFsyXTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAoaGNyeXAtPkluaXQuQjBbM10gJiBDUllQX0NDTV9DVFIxXzEpIHwgIENSWVBfQ0NNX0NUUjFfMjsKCgogICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgICAvKldyaXRlICBCMCBwYWNrZXQgaW50byBDUllQX0RJTiBSZWdpc3RlciovCiAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMikpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKSk7CiAgICB9CiAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKSwgMTYpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKSwgMTYpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKSwgMTYpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKSwgMTYpOwogICAgfQogICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xQikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCkpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSkpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMikpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMykpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMik7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpOwogICAgfQogICAgLyogR2V0IHRpY2sgKi8KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CgogICAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KICAgIHdoaWxlICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTikKICAgIHsKICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgIHsKICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KI2Vsc2UgLyogQUVTICovCiAgICAvKkFFUzJ2MS4xLjEgOiBDQ00gYXV0aGVudGljYXRpb24gOiBubyBpbml0IHBoYXNlLCBvbmx5IGhlYWRlciBhbmQgZmluYWwgcGhhc2UgKi8KICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CgogICAgLyogY29uZmlndXJlZCBlbmNyeXB0aW9uIG1vZGUgKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKCiAgICAvKiBTZXQgdGhlIGtleSAqLwogICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwoKICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHdpdGggemVybyB2YWx1ZXMqLwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gMFU7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAwVTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9IDBVOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gMFU7CgogICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgICAvKldyaXRlIHRoZSBCMCBwYWNrZXQgaW50byBDUllQX0RJTiovCiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKTsKCiAgICAvKiAgd2FpdCB1bnRpbCB0aGUgZW5kIG9mIGNvbXB1dGF0aW9uICovCiAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgIHsKICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICYgcmV0dXJuIGVycm9yICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICB9CiAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CgogICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwoKICAgIC8qIEZyb20gdGhhdCBwb2ludCB0aGUgd2hvbGUgbWVzc2FnZSBtdXN0IGJlIHByb2Nlc3NlZCwgZmlyc3QgdGhlIEhlYWRlciB0aGVuIHRoZSBwYXlsb2FkLgogICAgRmlyc3QgdGhlICBIZWFkZXIgYmxvY2soQjEpIDogYXNzb2NpYXRlZCBkYXRhIGxlbmd0aCBleHByZXNzZWQgaW4gYnl0ZXMgY29uY2F0ZW5hdGVkIHdpdGggQXNzb2NpYXRlZCBEYXRhIChBKSovCgogICAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgIT0gMFUpCiAgICB7CiAgICAgIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSA9PSAwVSkKICAgICAgewogICAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8KICAgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IGhjcnlwLT5Jbml0LkhlYWRlclNpemUpOyBsb29wY291bnRlciArPSA0VSkKICAgICAgICB7CiAgICAgICAgICAvKiBXcml0ZSB0aGUgSW5wdXQgYmxvY2sgaW4gdGhlIERhdGEgSW5wdXQgcmVnaXN0ZXIgKi8KICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKCiAgICAgICAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgICAgICAgIHsKICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgIH0KICAgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCiAgICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLypXcml0ZSBIZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCiAgICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpKTsgbG9vcGNvdW50ZXIgKz0gNFUpCiAgICAgICAgewogICAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CgogICAgICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCiAgICAgICAgICB7CiAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgICB9CiAgICAgICAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLwogICAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CiAgICAgICAgfQogICAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwogICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpOyBsb29wY291bnRlcisrKQogICAgICAgIHsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIH0KICAgICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKICAgICAgICB7CiAgICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CiAgICAgICAgICBsb29wY291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCiAgICAgICAgewogICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCiAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CiAgICAgIH0KICAgIH0KICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLwogIC8qIFRoZW4gdGhlIHBheWxvYWQ6IGNsZWFydGV4dCBwYXlsb2FkIChub3QgdGhlIGNpcGhlcnRleHQgcGF5bG9hZCkuCiAgV3JpdGUgaW5wdXQgRGF0YSwgbm8gb3V0cHV0IERhdGEgdG8gZ2V0ICovCiAgaWYgKGhjcnlwLT5TaXplICE9IDBVKQogIHsKICAgIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpICE9IDBVKQogICAgewogICAgICAvKiByZWNhbGN1bGF0ZSAgd29yZHNpemUgKi8KICAgICAgd29yZHNpemUgPSAoKHdvcmRzaXplIC8gNFUpICogNFUpIDsKICAgIH0KCiAgICAvKiBHZXQgdGljayAqLwogICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CgogICAgd2hpbGUgKChoY3J5cC0+Q3J5cEluQ291bnQgPCB3b3Jkc2l6ZSkgJiYgKG91dGNvdW50IDwgd29yZHNpemUpKQogICAgewogICAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KICAgICAgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoaGNyeXAsIFRpbWVvdXQpOwoKICAgICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwoKICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgIHsKICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkKICAgIHsKICAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCiAgICAgIG5wYmxiID0gKCgoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgLyAxNlUpICsgMVUpICogMTZVKSAtICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOwoKICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKICAgICAgewogICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VSAtIG5wYmxiKSAvIDRVKSArIDFVOwogICAgICB9CiAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwogICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplOyBsb29wY291bnRlciArKykKICAgICAgewogICAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgfQogICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKICAgICAgewogICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAwVTsKICAgICAgICBsb29wY291bnRlcisrOwogICAgICB9CiAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgICAgewogICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKCiAgICB9CiAgfQojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCgojaWYgZGVmaW5lZChDUllQKQoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgLyogSGVhZGVyIGJsb2NrKEIxKSA6IGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggZXhwcmVzc2VkIGluIGJ5dGVzIGNvbmNhdGVuYXRlZAogICAgd2l0aCBBc3NvY2lhdGVkIERhdGEgKEEpKi8KCiAgICBpZiAoQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2UoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgIHsKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KCiAgICAvKioqKioqKioqKioqKioqKioqKioqKiBQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CgogICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOwoKICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCgogIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpICE9IDBVKQogIHsKICAgIC8qIHJlY2FsY3VsYXRlICB3b3Jkc2l6ZSAqLwogICAgd29yZHNpemUgPSAoKHdvcmRzaXplIC8gNFUpICogNFUpIDsKICB9CiAgLyogR2V0IHRpY2sgKi8KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwoKICAvKiBXcml0ZSBpbnB1dCBkYXRhIGFuZCBnZXQgb3V0cHV0IGRhdGEgKi8KICB3aGlsZSAoKGhjcnlwLT5DcnlwSW5Db3VudCA8IHdvcmRzaXplKSAmJiAob3V0Y291bnQgPCB3b3Jkc2l6ZSkpCiAgewogICAgLyogV3JpdGUgcGxhaW4gZGF0YSBhbmQgZ2V0IGNpcGhlciBkYXRhICovCiAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCwgVGltZW91dCk7CgogICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgewogICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgewogICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgfQogIH0KCiAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpCiAgewogICAgLyogQ1JZUCBXb3JrYXJvdW5kIDogIENSWVAxIGdlbmVyYXRlcyBjb3JyZWN0IFRBRyAgZHVyaW5nIENDTSBkZWNyeXB0aW9uIG9ubHkgd2hlbiBjaXBoZXJ0ZXh0IGJsb2NrcyBzaXplIGlzIG11bHRpcGxlIG9mCiAgICAxMjggYml0cy4gSWYgbHRoZSBzaXplIG9mIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxvYWQgaXMgaW5mZXJpb3IgdG8gMTI4IGJpdHMsIHdoZW4gQ0NNIGRlY3J5cHRpb24KICAgIGlzIHNlbGVjdGVkLCB0aGVuIHRoZSBUQUcgbWVzc2FnZSB3aWxsIGJlIHdyb25nLiovCiAgICBDUllQX1dvcmthcm91bmQoaGNyeXAsIFRpbWVvdXQpOwogIH0KI2VuZGlmIC8qIENSWVAgKi8KCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBBRVMgQ0NNIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm9jZXNzIGluIGludGVycnVwdCBtb2RlCiAgKiAgICAgICAgIGZvciBUaW55QUVTIElQLCBubyBlbmNyeXB0L2RlY3J5cHQgcGVyZm9ybWVkLCBvbmx5IGF1dGhlbnRpY2F0aW9uIHByZXBhcmF0aW9uLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLwojaWYgZGVmaW5lZChDUllQKQogIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKI2VuZGlmIC8qIENSWVAgKi8KCiAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgewogICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKICAgIHsKICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLwogICAgICBEb0tleUlWQ29uZmlnID0gMFU7CiAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCiAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCiAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLwogICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLwogICAgfQogIH0KICBlbHNlCiAgewogICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CiAgfQoKICAvKiBDb25maWd1cmUgS2V5LCBJViBhbmQgcHJvY2VzcyBtZXNzYWdlIChoZWFkZXIgYW5kIHBheWxvYWQpICovCiAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCiAgewogICAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOwoKI2lmIGRlZmluZWQoQ1JZUCkKCiAgICAvKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqLwoKICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0lOSVQpOwoKICAgIC8qIFNldCB0aGUga2V5ICovCiAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CgogICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSB3aXRoIENUUjEgaW5mb3JtYXRpb24gKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAoaGNyeXAtPkluaXQuQjBbMF0pICYgQ1JZUF9DQ01fQ1RSMV8wOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9IGhjcnlwLT5Jbml0LkIwWzFdOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9IGhjcnlwLT5Jbml0LkIwWzJdOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9IChoY3J5cC0+SW5pdC5CMFszXSAmIENSWVBfQ0NNX0NUUjFfMSkgfCAgQ1JZUF9DQ01fQ1RSMV8yOwoKICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogICAgLypXcml0ZSB0aGUgQjAgcGFja2V0IGludG8gQ1JZUF9ESU4gUmVnaXN0ZXIqLwogICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCkpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMykpOwogICAgfQogICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCksIDE2KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSksIDE2KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMiksIDE2KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMyksIDE2KTsKICAgIH0KICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKTsKICAgIH0KICAgIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCiAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CiAgICBkbwogICAgewogICAgICBjb3VudC0tIDsKICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICB7CiAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICB9CiAgICB9IHdoaWxlICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7CgogICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKCiAgfSAvKiBlbmQgb2YgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCgogIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKCiAgLyogRW5hYmxlIENSWVAgKi8KICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgojZWxzZSAvKiBBRVMgKi8KCiAgICAvKkFFUzJ2MS4xLjEgOiBDQ00gYXV0aGVudGljYXRpb24gOiBubyBpbml0IHBoYXNlLCBvbmx5IGhlYWRlciBhbmQgZmluYWwgcGhhc2UgKi8KICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CgogICAgLyogY29uZmlndXJlZCBtb2RlIGFuZCBlbmNyeXB0aW9uIG1vZGUgKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKCiAgICAvKiBTZXQgdGhlIGtleSAqLwogICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwoKICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHdpdGggemVybyB2YWx1ZXMqLwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gMFU7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAwVTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9IDBVOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gMFU7CgogICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CiAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAgIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpOwoKICB9IC8qIGVuZCBvZiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQovKioKICAqIEBicmllZiAgQUVTIENDTSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcHJvY2VzcyBpbiBETUEgbW9kZQogICogICAgICAgICBmb3IgVGlueUFFUyBJUCwgbm8gZW5jcnlwdC9kZWNyeXB0IHBlcmZvcm1lZCwgb25seSBhdXRoZW50aWNhdGlvbiBwcmVwYXJhdGlvbi4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIHVpbnQzMl90IHdvcmRzaXplOwogIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLwojaWYgZGVmaW5lZChBRVMpCiAgdWludDMyX3QgbG9vcGNvdW50ZXI7CiAgdWludDMyX3QgbnBibGI7CiAgdWludDMyX3QgbGFzdHdvcmRzaXplOwojZW5kaWYKCiAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgewogICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKICAgIHsKICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLwogICAgICBEb0tleUlWQ29uZmlnID0gMFU7CiAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCiAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCiAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLwogICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLwogICAgfQogIH0KICBlbHNlCiAgewogICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CiAgfQoKICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKICB7CgogICAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOwoKI2lmIGRlZmluZWQoQ1JZUCkKCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9JTklUKTsKCiAgICAvKiBTZXQgdGhlIGtleSAqLwogICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwoKICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIChJVikgd2l0aCBDVFIxIGluZm9ybWF0aW9uICovCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjFfMDsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSBoY3J5cC0+SW5pdC5CMFsxXTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSBoY3J5cC0+SW5pdC5CMFsyXTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAoaGNyeXAtPkluaXQuQjBbM10gJiBDUllQX0NDTV9DVFIxXzEpIHwgIENSWVBfQ0NNX0NUUjFfMjsKCiAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAgIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOIFJlZ2lzdGVyKi8KICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzhCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSkpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpKTsKICAgIH0KICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApLCAxNik7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpLCAxNik7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpLCAxNik7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpLCAxNik7CiAgICB9CiAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMyk7CiAgICB9CgogICAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKICAgIGRvCiAgICB7CiAgICAgIGNvdW50LS0gOwogICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0gd2hpbGUgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKTsKCiNlbHNlIC8qIEFFUyAqLwoKICAgIC8qQUVTMnYxLjEuMSA6IENDTSBhdXRoZW50aWNhdGlvbiA6IG5vIGluaXQgcGhhc2UsIG9ubHkgaGVhZGVyIGFuZCBmaW5hbCBwaGFzZSAqLwogICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKCiAgICAvKiBjb25maWd1cmVkIGVuY3J5cHRpb24gbW9kZSAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOwoKICAgIC8qIFNldCB0aGUga2V5ICovCiAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CgogICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3Igd2l0aCB6ZXJvIHZhbHVlcyovCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAwVTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9IDBVOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gMFU7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAwVTsKCiAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAgIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpOwoKICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKICAgIGRvCiAgICB7CiAgICAgIGNvdW50LS0gOwogICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKICAgIC8qIENsZWFyIENDRiBmbGFnICovCiAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKCiAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CgogICAgLyogRnJvbSB0aGF0IHBvaW50IHRoZSB3aG9sZSBtZXNzYWdlIG11c3QgYmUgcHJvY2Vzc2VkLCBmaXJzdCB0aGUgSGVhZGVyIHRoZW4gdGhlIHBheWxvYWQuCiAgICBGaXJzdCB0aGUgIEhlYWRlciBibG9jayhCMSkgOiBhc3NvY2lhdGVkIGRhdGEgbGVuZ3RoIGV4cHJlc3NlZCBpbiBieXRlcyBjb25jYXRlbmF0ZWQgd2l0aCBBc3NvY2lhdGVkIERhdGEgKEEpKi8KCiAgICBpZiAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAhPSAwVSkKICAgIHsKICAgICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpID09IDBVKQogICAgICB7CiAgICAgICAgLyogSGVhZGVyU2l6ZSAlNCwgbm8gcGFkZGluZyAqLwogICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyICs9IDRVKQogICAgICAgIHsKICAgICAgICAgIC8qIFdyaXRlIHRoZSBJbnB1dCBibG9jayBpbiB0aGUgRGF0YSBJbnB1dCByZWdpc3RlciAqLwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwoKICAgICAgICAgIC8qICB3YWl0IHVudGlsIHRoZSBlbmQgb2YgY29tcHV0YXRpb24gKi8KICAgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKICAgICAgICAgIGRvCiAgICAgICAgICB7CiAgICAgICAgICAgIGNvdW50LS0gOwogICAgICAgICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKICAgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCiAgICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLypXcml0ZSBIZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCiAgICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpKTsgbG9vcGNvdW50ZXIgKz0gNFUpCiAgICAgICAgewogICAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CgogICAgICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOwogICAgICAgICAgZG8KICAgICAgICAgIHsKICAgICAgICAgICAgY291bnQtLSA7CiAgICAgICAgICAgIGlmIChjb3VudCA9PSAwVSkKICAgICAgICAgICAgewogICAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwogICAgICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgICAgIH0KICAgICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KICAgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKTsgbG9vcGNvdW50ZXIrKykKICAgICAgICB7CiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCiAgICAgICAgewogICAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCiAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOwogICAgICAgICAgbG9vcGNvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKICAgICAgICBkbwogICAgICAgIHsKICAgICAgICAgIGNvdW50LS0gOwogICAgICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICAgICAgewogICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgICB9CiAgICB9CiAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KICAvKiBUaGVuIHRoZSBwYXlsb2FkOiBjbGVhcnRleHQgcGF5bG9hZCAobm90IHRoZSBjaXBoZXJ0ZXh0IHBheWxvYWQpLgogIFdyaXRlIGlucHV0IERhdGEsIG5vIG91dHB1dCBEYXRhIHRvIGdldCAqLwogIGlmIChoY3J5cC0+U2l6ZSAhPSAwVSkKICB7CiAgICBpZiAoaGNyeXAtPlNpemUgPj0gMTZVKQogICAgewogICAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSA9PSAwVSkKICAgICAgewogICAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIChoY3J5cC0+U2l6ZSAvIDRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CiAgICAgIH0KICAgICAgZWxzZSAvKnRvIGNvbXB1dGUgbGFzdCB3b3JkPDEyOGJpdHMsIG90aGVyd2lzZSBpdCB3aWxsIG5vdCBiZSBlbmNyeXB0ZWQvZGVjcnlwdGVkICovCiAgICAgIHsKICAgICAgICB3b3Jkc2l6ZSA9ICh1aW50MzJfdCkoaGNyeXAtPlNpemUpICsgKDE2VSAtICgodWludDMyX3QpKGhjcnlwLT5TaXplKSAlIDE2VSkpIDsKCiAgICAgICAgLyogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3NlcyBhbmQgc3RhcnQgRE1BIHRyYW5zZmVyLCBwQ3J5cE91dEJ1ZmZQdHIgc2l6ZSBzaG91bGQgYmUgJTQgKi8KICAgICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoKHVpbnQxNl90KXdvcmRzaXplIC8gNFUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOwogICAgICB9CiAgICB9CiAgICBpZiAoKGhjcnlwLT5TaXplIDwgMTZVKSAhPSAwVSkKICAgIHsKICAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCiAgICAgIG5wYmxiID0gKCgoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgLyAxNlUpICsgMVUpICogMTZVKSAtICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOwoKICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKICAgICAgewogICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VSAtIG5wYmxiKSAvIDRVKSArIDFVOwogICAgICB9CiAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwogICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplOyBsb29wY291bnRlciArKykKICAgICAgewogICAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgfQogICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKICAgICAgewogICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAwVTsKICAgICAgICBsb29wY291bnRlcisrOwogICAgICB9CiAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKICAgICAgZG8KICAgICAgewogICAgICAgIGNvdW50LS0gOwogICAgICAgIGlmIChjb3VudCA9PSAwVSkKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CgogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgYW5kIHBoYXNlICovCiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgfQogIH0KICBlbHNlCiAgewogICAgLyogUHJvY2VzcyB1bkxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgYW5kIHBoYXNlICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICB9CiNlbmRpZiAvKiBBRVMgKi8KI2lmIGRlZmluZWQoQ1JZUCkKICAgIC8qKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgIGlmIChDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoaGNyeXApICE9IEhBTF9PSykKICAgIHsKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KCiAgICAvKioqKioqKioqKioqKioqKioqKiogUGF5bG9hZCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CgogICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOwoKICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLwogIGlmIChoY3J5cC0+U2l6ZSAhPSAwVSkKICB7CiAgICAvKiBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uICYgQ0NNIERlY3J5cHRpb24KICAgIFdvcmthcm91bmQgaXMgaW1wbGVtZW50ZWQgaW4gcG9sbGluZyBtb2RlLCBzbyBpZiBsYXN0IGJsb2NrIG9mCiAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIEhBTF9DUllQX0FFU0dDTV9ETUEgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiAqLwogICAgLyogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3NlcyBhbmQgc3RhcnQgRE1BIHRyYW5zZmVyICovCiAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSA9PSAwVSkKICAgIHsKICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgaGNyeXAtPlNpemUgLyA0VSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHdvcmRzaXplID0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgKyAxNlUgLSAoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgJSAxNlUpIDsKCiAgICAgIC8qIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzZXMgYW5kIHN0YXJ0IERNQSB0cmFuc2ZlciwgcENyeXBPdXRCdWZmUHRyIHNpemUgc2hvdWxkIGJlICU0Ki8KICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKHVpbnQxNl90KXdvcmRzaXplIC8gNFUsCiAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOwogICAgfQogIH0KICBlbHNlIC8qU2l6ZSA9IDAqLwogIHsKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlIGFuZCBwaGFzZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CiAgfQojZW5kaWYgLyogQ1JZUCAqLwogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgU2V0cyB0aGUgcGF5bG9hZCBwaGFzZSBpbiBpdGVycnVwdCBtb2RlCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBzdGF0ZQogICovCnN0YXRpYyB2b2lkIENSWVBfR0NNQ0NNX1NldFBheWxvYWRQaGFzZV9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgdWludDMyX3QgbG9vcGNvdW50ZXI7CiAgdWludDMyX3QgdGVtcFs0XTsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLwogIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKICB1aW50MzJfdCBucGJsYjsKICB1aW50MzJfdCBpOwojaWYgZGVmaW5lZChBRVMpCiAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCiNlbmRpZiAvKiBBRVMgKi8KCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiBkZWZpbmVkKENSWVApCiAgaWYgKGhjcnlwLT5TaXplID09IDBVKQogIHsKICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSk7CgogICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogIH0KCiAgZWxzZSBpZiAoKChoY3J5cC0+U2l6ZSAvIDRVKSAtIChoY3J5cC0+Q3J5cEluQ291bnQpKSA+PSA0VSkKICB7CiAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgaWYgKCgoaGNyeXAtPlNpemUgLyA0VSkgPT0gaGNyeXAtPkNyeXBJbkNvdW50KSAmJiAoKGhjcnlwLT5TaXplICUgMTZVKSA9PSAwVSkpCiAgICB7CiAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKCiAgICAgIC8qIENhbGwgdGhlIGlucHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgIH0KICAgIGlmIChoY3J5cC0+Q3J5cE91dENvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKQogICAgewogICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgT3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLwogICAgICBmb3IgKGkgPSAwVTsgaSA8IDRVOyBpKyspCiAgICAgIHsKICAgICAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgICB9CiAgICAgIGkgPSAwVTsKICAgICAgd2hpbGUgKCgoaGNyeXAtPkNyeXBPdXRDb3VudCA8ICgoaGNyeXAtPlNpemUpIC8gNFUpKSkgJiYgKGkgPCA0VSkpCiAgICAgIHsKICAgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXBbaV07CiAgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwogICAgICAgIGkrKzsKICAgICAgfQogICAgICBpZiAoKChoY3J5cC0+U2l6ZSAvIDRVKSA9PSBoY3J5cC0+Q3J5cE91dENvdW50KSAmJiAoKGhjcnlwLT5TaXplICUgMTZVKSA9PSAwVSkpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSk7CgogICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAvKiBEaXNhYmxlIENSWVAgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKCiAgICAgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgICB9CiAgICB9CiAgfQogIGVsc2UgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpCiAgewogICAgLyogU2l6ZSBzaG91bGQgYmUgJTQgaW4gd29yZCBhbmQgJTE2IGluIGJ5dGUgIG90aGVyd2lzZSBUQUcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uCiAgICBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZgogICAgcGF5bG9hZCA8MTI4Yml0IGRvbid0IHVzZSBDUllQX0FFU0dDTV9FbmNyeXB0X0lUIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkLiAqLwoKICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLwogICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKSAvIDE2VSkgKyAxVSkgKiAxNlUpIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7CgogICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCiAgICB7CiAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKICAgIH0KCiAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIH0KICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQogICAgewogICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAweDBVOwogICAgICBsb29wY291bnRlcisrOwogICAgfQogICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7CgogICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUpICE9IDB4MFUpCiAgICB7CiAgICAgIGZvciAoaSA9IDBVOyBpIDwgNFU7IGkrKykKICAgICAgewogICAgICAgIHRlbXBbaV0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CiAgICAgIH0KICAgICAgaWYgKCgoaGNyeXAtPlNpemUpIC8gNFUpID09IDBVKQogICAgICB7CiAgICAgICAgZm9yIChpID0gMFU7IGkgPCAoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgJSA0VSk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXBbaV07CiAgICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGkgPSAweDBVOwogICAgICB3aGlsZSAoKChoY3J5cC0+Q3J5cE91dENvdW50IDwgKChoY3J5cC0+U2l6ZSkgLyA0VSkpKSAmJiAoaSA8IDRVKSkKICAgICAgewogICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcFtpXTsKICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgICAgICAgaSsrOwogICAgICB9CiAgICB9CiAgICBpZiAoaGNyeXAtPkNyeXBPdXRDb3VudCA+PSAoaGNyeXAtPlNpemUgLyA0VSkpCiAgICB7CiAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSB8IENSWVBfSVRfSU5JKTsKCiAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwoKICAgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgIH0KICB9CiAgZWxzZQogIHsKICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICB9CiNlbHNlIC8qIEFFUyAqLwoKICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyKi8KICBmb3IgKGkgPSAwVTsgaSA8IDRVOyBpKyspCiAgewogICAgdGVtcFtpXSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgfQogIGkgPSAwVTsKICB3aGlsZSAoKGhjcnlwLT5DcnlwT3V0Q291bnQgPCAoKGhjcnlwLT5TaXplICsgM1UpIC8gNFUpKSAmJiAoaSA8IDRVKSkKICB7CiAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXBbaV07CiAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgICBpKys7CiAgfQogIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwoKICBpZiAoKGhjcnlwLT5DcnlwT3V0Q291bnQgPj0gKGhjcnlwLT5TaXplIC8gNFUpKSAmJiAoKG91dGNvdW50ICogNFUpID49ICBoY3J5cC0+U2l6ZSkpCiAgewogICAgLyogRGlzYWJsZSBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnIGFuZCBlcnJvcnMgaW50ZXJydXB0cyAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CgogICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwoKICAgIC8qIENhbGwgb3V0cHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgLypDYWxsIGxlZ2FjeSB3ZWFrIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogIH0KCiAgZWxzZSBpZiAoKChoY3J5cC0+U2l6ZSAvIDRVKSAtIChoY3J5cC0+Q3J5cEluQ291bnQpKSA+PSA0VSkKICB7CiAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGlmICgoaGNyeXAtPkNyeXBJbkNvdW50ID09ICBoY3J5cC0+U2l6ZSkgJiYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykpCiAgICB7CiAgICAgIC8qIENhbGwgSW5wdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgfQogIH0KICBlbHNlIC8qIExhc3QgYmxvY2sgb2YgcGF5bG9hZCA8IDEyOGJpdCovCiAgewogICAgLyogV29ya2Fyb3VuZCBub3QgaW1wbGVtZW50ZWQsIFNpemUgc2hvdWxkIGJlICU0ICBvdGhlcndpc2UgVGFnIHdpbGwgIGJlIGluY29ycmVjdGx5CiAgICBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uICYgQ0NNIERlY3J5cHRpb24uIFdvcmthcm91bmQgaXMgaW1wbGVtZW50ZWQgaW4gcG9sbGluZyBtb2RlLCBzbyBpZiBsYXN0IGJsb2NrIG9mCiAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIENSWVBfRW5jcnlwdF9JVCBvdGhlcndpc2UgVEFHIGlzIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgR0NNIEVuY3J5cHRpb24gJiBDQ00gRGVjcnlwdGlvbi4gKi8KCiAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KICAgIG5wYmxiID0gKCgoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgLyAxNlUpICsgMVUpICogMTZVKSAtICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOwoKICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCiAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQogICAgewogICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CiAgICB9CgogICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCiAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplOyBsb29wY291bnRlcisrKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgfQogICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCiAgICB7CiAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOwogICAgICBsb29wY291bnRlcisrOwogICAgfQogIH0KI2VuZGlmIC8qIEFFUyAqLwoKfQoKCi8qKgogICogQGJyaWVmICBTZXRzIHRoZSBoZWFkZXIgcGhhc2UgaW4gcG9sbGluZyBtb2RlCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZShIZWFkZXIgJiBIZWFkZXJTaXplKQogICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IHZhbHVlCiAgKiBAcmV0dmFsIHN0YXRlCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCnsKICB1aW50MzJfdCBsb29wY291bnRlcjsKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSBmb3IgR0NNL0dNQUMgb3IgQ0NNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICE9IDBVKSkKICB7CgojaWYgZGVmaW5lZChDUllQKQoKICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CgogICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkgPT0gMFUpCiAgICB7CiAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8KICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIgKz0gNFUpCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKCiAgICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KICAgICAgICBpZiAoQ1JZUF9XYWl0T25JRkVNRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpKTsgbG9vcGNvdW50ZXIgKz0gNFUpCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKCiAgICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KICAgICAgICBpZiAoQ1JZUF9XYWl0T25JRkVNRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSk7IGxvb3Bjb3VudGVyKyspCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgfQogICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKICAgICAgewogICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMHgwVTsKICAgICAgICBsb29wY291bnRlcisrOwogICAgICB9CiAgICAgIC8qIFdhaXQgZm9yIENDRiBJRkVNIHRvIGJlIHJhaXNlZCAqLwogICAgICBpZiAoQ1JZUF9XYWl0T25JRkVNRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQogICAgICB7CiAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICB9CiAgICB9CiAgICAvKiBXYWl0IHVudGlsIHRoZSBjb21wbGV0ZSBtZXNzYWdlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwogICAgaWYgKENSWVBfV2FpdE9uQlVTWUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgIHsKICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgJiByZXR1cm4gZXJyb3IgKi8KICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KCiNlbHNlIC8qIEFFUyAqLwoKICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCiAgICB7CiAgICAgIC8qIFdvcmthcm91bmQgMSA6b25seSBBRVMgYmVmb3JlIHJlLWVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsKCiAgICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KICAgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKCiAgICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgICB9CiAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkgPT0gMFUpCiAgICB7CiAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8KICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIgKz0gNFUpCiAgICAgIHsKICAgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIGRhdGEgaW5wdXQgcmVnaXN0ZXIgKi8KICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwoKICAgICAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpKTsgbG9vcGNvdW50ZXIgKz0gNFUpCiAgICAgIHsKICAgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIGRhdGEgaW5wdXQgcmVnaXN0ZXIgKi8KICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwoKICAgICAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAgICAgfQogICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSk7IGxvb3Bjb3VudGVyKyspCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgIH0KICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCiAgICAgIHsKICAgICAgICAvKlBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CiAgICAgICAgbG9vcGNvdW50ZXIrKzsKICAgICAgfQoKICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CiAgICB9CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KICB9CiAgZWxzZQogIHsKI2lmIGRlZmluZWQoQUVTKQogICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKICAgIHsKICAgICAgLypXb3JrYXJvdW5kIDE6IG9ubHkgQUVTLCBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZC4qLwogICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgaGNyeXAtPkluaXQuRGF0YVR5cGUpOwoKICAgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOwoKICAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgfQojZW5kaWYgLyogQUVTICovCiAgfQogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgU2V0cyB0aGUgaGVhZGVyIHBoYXNlIHdoZW4gdXNpbmcgRE1BIGluIHByb2Nlc3MKICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlKEhlYWRlciAmIEhlYWRlclNpemUpCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ICA9IDBVOwogIHVpbnQzMl90IGxvb3Bjb3VudGVyOwoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlIGZvciBHQ00vR01BQyBvciBDQ00gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAhPSAwVSkpCiAgewoKI2lmIGRlZmluZWQoQ1JZUCkKCiAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCiAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOwoKICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpID09IDBVKQogICAgewogICAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovCiAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyICs9IDRVKQogICAgICB7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CgogICAgICAgIC8qIFdhaXQgZm9yIElGRU0gdG8gYmUgcmFpc2VkICovCiAgICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgICAgZG8KICAgICAgICB7CiAgICAgICAgICBjb3VudC0tIDsKICAgICAgICAgIGlmIChjb3VudCA9PSAwVSkKICAgICAgICAgIHsKICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfSUZFTSkpOwogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qV3JpdGUgaGVhZGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPIHdpdGhvdXQgbGFzdCBibG9jayAqLwogICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8ICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgLSAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSkpOyBsb29wY291bnRlciArPSA0VSkKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwoKICAgICAgICAvKiBXYWl0IGZvciBJRkVNIHRvIGJlIHJhaXNlZCAqLwogICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgY291bnQtLSA7CiAgICAgICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgICAgICB7CiAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0lGRU0pKTsKICAgICAgfQogICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSk7IGxvb3Bjb3VudGVyKyspCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgfQogICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKICAgICAgewogICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMHgwVTsKICAgICAgICBsb29wY291bnRlcisrOwogICAgICB9CiAgICAgIC8qIFdhaXQgZm9yIElGRU0gdG8gYmUgcmFpc2VkICovCiAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFOwogICAgICBkbwogICAgICB7CiAgICAgICAgY291bnQtLSA7CiAgICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0lGRU0pKTsKICAgIH0KICAgIC8qIFdhaXQgdW50aWwgdGhlIGNvbXBsZXRlIG1lc3NhZ2UgaGFzIGJlZW4gcHJvY2Vzc2VkICovCiAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRTsKICAgIGRvCiAgICB7CiAgICAgIGNvdW50LS0gOwogICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfU0VUKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19CVVNZKSk7CgojZWxzZSAvKiBBRVMgKi8KCiAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKQogICAgewogICAgICAvKiBXb3JrYXJvdW5kIDE6IG9ubHkgQUVTLCBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZC4qLwogICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgaGNyeXAtPkluaXQuRGF0YVR5cGUpOwoKICAgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOwoKICAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgfQogICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpID09IDBVKQogICAgewogICAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovCiAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyICs9IDRVKQogICAgICB7CiAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKCiAgICAgICAgLypXYWl0IG9uIENDRiBmbGFnKi8KICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRTsKICAgICAgICBkbwogICAgICAgIHsKICAgICAgICAgIGNvdW50LS0gOwogICAgICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICAgICAgewogICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKCiAgICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpKTsgbG9vcGNvdW50ZXIgKz0gNFUpCiAgICAgIHsKICAgICAgICAvKiBXcml0ZSB0aGUgSW5wdXQgYmxvY2sgaW4gdGhlIERhdGEgSW5wdXQgcmVnaXN0ZXIgKi8KICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwoKICAgICAgICAvKldhaXQgb24gQ0NGIGZsYWcqLwogICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgY291bnQtLSA7CiAgICAgICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgICAgICB7CiAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwoKICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgICB9CiAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwogICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKTsgbG9vcGNvdW50ZXIrKykKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgfQogICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKICAgICAgewogICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CiAgICAgICAgbG9vcGNvdW50ZXIrKzsKICAgICAgfQoKICAgICAgLypXYWl0IG9uIENDRiBmbGFnKi8KICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgIGRvCiAgICAgIHsKICAgICAgICBjb3VudC0tIDsKICAgICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgICAgewogICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9IHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CgogICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAgIH0KI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAgKi8KICB9CiAgZWxzZQogIHsKI2lmIGRlZmluZWQoQUVTKQogICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKICAgIHsKICAgICAgLypXb3JrYXJvdW5kIDE6IG9ubHkgQUVTLCBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZC4qLwogICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgaGNyeXAtPkluaXQuRGF0YVR5cGUpOwoKICAgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOwoKICAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgfQojZW5kaWYgLyogQUVTICovCiAgfQogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgU2V0cyB0aGUgaGVhZGVyIHBoYXNlIGluIGludGVycnVwdCBtb2RlCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZShIZWFkZXIgJiBIZWFkZXJTaXplKQogICogQHJldHZhbCBOb25lCiAgKi8Kc3RhdGljIHZvaWQgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIHVpbnQzMl90IGxvb3Bjb3VudGVyOwojaWYgZGVmaW5lZChBRVMpCiAgdWludDMyX3QgbGFzdHdvcmRzaXplOwogIHVpbnQzMl90IG5wYmxiOwojZW5kaWYKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiBkZWZpbmVkKENSWVApCiAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPT0gIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpCiAgewogICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKCiAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwoKICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOwoKICAgIC8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCiAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkgfCBDUllQX0lUX09VVEkpOwoKICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgfQogIGVsc2UgaWYgKCgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgLSAoaGNyeXAtPkNyeXBIZWFkZXJDb3VudCkpID49IDRVKQoKICB7CiAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovCiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrICA7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICB9CiAgZWxzZQogIHsKICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwogICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpOyBsb29wY291bnRlcisrKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICB9CiAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKICAgIHsKICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMHgwVTsKICAgICAgbG9vcGNvdW50ZXIrKzsKICAgIH0KICB9CiNlbHNlIC8qIEFFUyAqLwoKICBpZiAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA9PSAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCkKICB7CiAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CgogICAgLyogIFBheWxvYWQgcGhhc2Ugbm90IHN1cHBvcnRlZCBpbiBDQ00gQUVTMiAgKi8KICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCiAgICB7CiAgICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfUEFZTE9BRCk7CiAgICB9CiAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkKICAgIHsKICAgICAgLyogSW5jcmVtZW50IENyeXBIZWFkZXJDb3VudCB0byBwYXNzIGluIENSWVBfR0NNQ0NNX1NldFBheWxvYWRQaGFzZV9JVCAqLwogICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CiAgICB9CiAgICAvKiBXcml0ZSB0aGUgcGF5bG9hZCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgaWYgKGhjcnlwLT5TaXplID09IDBVKQogICAgewogICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CgogICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICB9CiAgICBlbHNlIGlmIChoY3J5cC0+U2l6ZSA+PSAxNlUpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwoKICAgICAgaWYgKChoY3J5cC0+Q3J5cEluQ291bnQgPT0gKGhjcnlwLT5TaXplIC8gNFUpKSAmJiAoKGhjcnlwLT5TaXplICUgMTZVKSA9PSAwVSkpCiAgICAgIHsKICAgICAgICAvKiBDYWxsIHRoZSBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgICB9CiAgICB9CiAgICBlbHNlIC8qIFNpemUgPCA0IHdvcmRzICA6IGZpcnN0IGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrKi8KICAgIHsKICAgICAgLyogV29ya2Fyb3VuZCBub3QgaW1wbGVtZW50ZWQsIFNpemUgc2hvdWxkIGJlICU0ICBvdGhlcndpc2UgVGFnIHdpbGwgIGJlIGluY29ycmVjdGx5CiAgICAgIGdlbmVyYXRlZCBmb3IgR0NNIEVuY3J5cHRpb24uIFdvcmthcm91bmQgaXMgaW1wbGVtZW50ZWQgaW4gcG9sbGluZyBtb2RlLCBzbyBpZiBsYXN0IGJsb2NrIG9mCiAgICAgIHBheWxvYWQgPDEyOGJpdCBkb24ndCB1c2UgQ1JZUF9FbmNyeXB0X0lUIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbi4gKi8KCiAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLwogICAgICBucGJsYiA9ICgoKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpIC8gMTZVKSArIDFVKSAqIDE2VSkgLSAodWludDMyX3QpKGhjcnlwLT5TaXplKTsKCiAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCiAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCiAgICAgIHsKICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKICAgICAgfQoKICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCiAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgIH0KICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCiAgICAgIHsKICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOwogICAgICAgIGxvb3Bjb3VudGVyKys7CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZSBpZiAoKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+Q3J5cEhlYWRlckNvdW50KSkgPj0gNFUpCiAgewogICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKICB9CiAgZWxzZSAvKkhlYWRlclNpemUgPCA0IG9yIEhlYWRlclNpemUgPjQgJiBIZWFkZXJTaXplICU0ICE9IDAqLwogIHsKICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwogICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpOyBsb29wY291bnRlcisrKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgfQogICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCiAgICB7CiAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOwogICAgICBsb29wY291bnRlcisrOwogICAgfQogIH0KI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwp9CgoKLyoqCiAgKiBAYnJpZWYgIFdvcmthcm91bmQgdXNlZCBmb3IgR0NNL0NDTSBtb2RlLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgVGltZW91dDogc3BlY2lmeSBUaW1lb3V0IHZhbHVlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpzdGF0aWMgdm9pZCBDUllQX1dvcmthcm91bmQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKewogIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKICB1aW50MzJfdCBucGJsYjsKI2lmIGRlZmluZWQoQ1JZUCkKICB1aW50MzJfdCAgaXYxdGVtcDsKICB1aW50MzJfdCAgdGVtcFs0XSA9IHswfTsKICB1aW50MzJfdCAgdGVtcDJbNF0gPSB7MH07CiNlbmRpZiAvKiBDUllQICovCiAgdWludDMyX3QgaW50ZXJtZWRpYXRlX2RhdGFbNF0gPSB7MH07CiAgdWludDMyX3QgaW5kZXg7CgogIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLwogIG5wYmxiID0gKCgoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgLyAxNlUpICsgMVUpICogMTZVKSAtICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOwoKICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLwogIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCiAgewogICAgbGFzdHdvcmRzaXplID0gKDE2VSAtIG5wYmxiKSAvIDRVOwogIH0KICBlbHNlCiAgewogICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKICB9CgojaWYgZGVmaW5lZChDUllQKQoKICAvKiBXb3JrYXJvdW5kIDIsIGNhc2UgR0NNIGVuY3J5cHRpb24gKi8KICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTSkKICB7CiAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09ESVIpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQogICAgewogICAgICAvKldvcmthcm91bmQgaW4gb3JkZXIgdG8gcHJvcGVybHkgY29tcHV0ZSBhdXRoZW50aWNhdGlvbiB0YWdzIHdoaWxlIGRvaW5nCiAgICAgICBhIEdDTSBlbmNyeXB0aW9uIHdpdGggdGhlIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCBzaXplIGluZmVyaW9yIHRvIDEyOCBiaXRzKi8KICAgICAgLyogRGlzYWJsZSBDUllQIHRvIHN0YXJ0IHRoZSBmaW5hbCBwaGFzZSAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgLypVcGRhdGUgQ1JZUF9JVjFSIHJlZ2lzdGVyIGFuZCBBTEdPTU9ERSovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAoKGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ003UikgLSAxVSk7CiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgQ1JZUF9BRVNfQ1RSKTsKCiAgICAgIC8qIEVuYWJsZSBDUllQIHRvIHN0YXJ0IHRoZSBmaW5hbCBwaGFzZSAqLwogICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgICB9CiAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCiAgICB7CiAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICB9CiAgICB3aGlsZSAoaW5kZXggPCA0VSkKICAgIHsKICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9IDBVOwogICAgICBpbmRleCsrOwogICAgfQogICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgaWYgKENSWVBfV2FpdE9uT0ZORUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgIHsKICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgIH0KICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FKSAhPSAweDBVKQogICAgewogICAgICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgNFU7IGluZGV4KyspCiAgICAgIHsKICAgICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gKi8KICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CgogICAgICAgIC8qIEludGVybWVkaWF0ZSBkYXRhIGJ1ZmZlciB0byBiZSB1c2VkIGluIGZvciB0aGUgd29ya2Fyb3VuZCovCiAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IGludGVybWVkaWF0ZV9kYXRhW2luZGV4XTsKICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09ESVIpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQogICAgewogICAgICAvKndvcmthcm91bmQgaW4gb3JkZXIgdG8gcHJvcGVybHkgY29tcHV0ZSBhdXRoZW50aWNhdGlvbiB0YWdzIHdoaWxlIGRvaW5nCiAgICAgIGEgR0NNIGVuY3J5cHRpb24gd2l0aCB0aGUgbGFzdCBibG9jayBvZiBwYXlsb2FkIHNpemUgaW5mZXJpb3IgdG8gMTI4IGJpdHMqLwogICAgICAvKiBDaGFuZ2UgdGhlIEFFUyBtb2RlIHRvIEdDTSBtb2RlIGFuZCBTZWxlY3QgRmluYWwgcGhhc2UgKi8KICAgICAgLyogY29uZmlndXJlZCAgQ0hNT0QgR0NNICAgKi8KICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0FFU19HQ00pOwoKICAgICAgLyogY29uZmlndXJlZCAgZmluYWwgcGhhc2UgICovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOwoKICAgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9EQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV8zMkIpCiAgICAgIHsKICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDFVKQogICAgICAgIHsKICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSAweEZGRkZGRjAwVTsKICAgICAgICB9CiAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKICAgICAgICB7CiAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gMHhGRkZGMDAwMFU7CiAgICAgICAgfQogICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gM1UpCiAgICAgICAgewogICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IDB4RkYwMDAwMDBVOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfOEIpCiAgICAgIHsKICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDFVKQogICAgICAgIHsKICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JFVigweEZGRkZGRjAwVSk7CiAgICAgICAgfQogICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMlUpCiAgICAgICAgewogICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUkVWKDB4RkZGRjAwMDBVKTsKICAgICAgICB9CiAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAzVSkKICAgICAgICB7CiAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SRVYoMHhGRjAwMDAwMFUpOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfMTZCKQogICAgICB7CiAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKICAgICAgICB7CiAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19ST1IoKDB4RkZGRkZGMDBVKSwgMTYpOwogICAgICAgIH0KICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDJVKQogICAgICAgIHsKICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JPUigoMHhGRkZGMDAwMFUpLCAxNik7CiAgICAgICAgfQogICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gM1UpCiAgICAgICAgewogICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUk9SKCgweEZGMDAwMDAwVSksIDE2KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSAvKkNSWVBfREFUQVRZUEVfMUIqLwogICAgICB7CiAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKICAgICAgICB7CiAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SQklUKDB4RkZGRkZGMDBVKTsKICAgICAgICB9CiAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKICAgICAgICB7CiAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SQklUKDB4RkZGRjAwMDBVKTsKICAgICAgICB9CiAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAzVSkKICAgICAgICB7CiAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SQklUKDB4RkYwMDAwMDBVKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCiAgICAgIHsKICAgICAgICAvKldyaXRlIHRoZSBpbnRlcm1lZGlhdGVfZGF0YSBpbiB0aGUgSU4gRklGTyAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOwogICAgICB9CiAgICAgIHdoaWxlIChpbmRleCA8IDRVKQogICAgICB7CiAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gMHgwVTsKICAgICAgICBpbmRleCsrOwogICAgICB9CiAgICAgIC8qIFdhaXQgZm9yIE9GTkUgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgICAgaWYgKENSWVBfV2FpdE9uT0ZORUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgICAgewogICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICAgfQoKICAgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUpICE9IDB4MFUpCiAgICAgIHsKICAgICAgICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgNFU7IGluZGV4KyspCiAgICAgICAgewogICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0gLyogRW5kIG9mIEdDTSBlbmNyeXB0aW9uICovCiAgZWxzZQogIHsKICAgIC8qIFdvcmthcm91bmQgMiwgY2FzZSBDQ00gZGVjcnlwdGlvbiwgaW4gb3JkZXIgdG8gcHJvcGVybHkgY29tcHV0ZQogICAgICBhdXRoZW50aWNhdGlvbiB0YWdzIHdoaWxlIGRvaW5nIGEgQ0NNIGRlY3J5cHRpb24gd2l0aCB0aGUgbGFzdCBibG9jawogICAgICBvZiBwYXlsb2FkIHNpemUgaW5mZXJpb3IgdG8gMTI4IGJpdHMqLwoKICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT0RJUikgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpCiAgICB7CiAgICAgIGl2MXRlbXAgPSBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNN1I7CgogICAgICAvKiBEaXNhYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICB0ZW1wWzBdID0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00wUjsKICAgICAgdGVtcFsxXSA9ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMVI7CiAgICAgIHRlbXBbMl0gPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTJSOwogICAgICB0ZW1wWzNdID0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00zUjsKCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSBpdjF0ZW1wOwoKICAgICAgLyogQ29uZmlndXJlZCAgQ0hNT0QgQ1RSICAgKi8KICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0FFU19DVFIpOwoKICAgICAgLyogRW5hYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAgIH0KICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwogICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykKICAgIHsKICAgICAgLyogV3JpdGUgdGhlIGxhc3QgSW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIH0KICAgIHdoaWxlIChpbmRleCA8IDRVKQogICAgewogICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gMFU7CiAgICAgIGluZGV4Kys7CiAgICB9CiAgICAvKiBXYWl0IGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICBpZiAoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQogICAgewogICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgIH0KCiAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSkgIT0gMHgwVSkKICAgIHsKICAgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IDRVOyBpbmRleCsrKQogICAgICB7CiAgICAgICAgLyogUmVhZCB0aGUgT3V0cHV0IGJsb2NrIGZyb20gdGhlIE91dHB1dCBGSUZPICovCiAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwoKICAgICAgICAvKmludGVybWVkaWF0ZSBkYXRhIGJ1ZmZlciB0byBiZSB1c2VkIGluIGZvciB0aGUgd29ya2Fyb3VuZCovCiAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IGludGVybWVkaWF0ZV9kYXRhW2luZGV4XTsKICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09ESVIpID09IENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKQogICAgewogICAgICB0ZW1wMlswXSA9ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMFI7CiAgICAgIHRlbXAyWzFdID0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00xUjsKICAgICAgdGVtcDJbMl0gPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTJSOwogICAgICB0ZW1wMlszXSA9ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNM1I7CgogICAgICAvKiBjb25maWd1cmVkICBDSE1PRCBDQ00gICAqLwogICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQUVTX0NDTSk7CgogICAgICAvKiBjb25maWd1cmVkICBIZWFkZXIgcGhhc2UgICovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEgsIENSWVBfUEhBU0VfSEVBREVSKTsKCiAgICAgIC8qc2V0IHRvIHplcm8gdGhlIGJpdHMgY29ycmVzcG9uZGluZyB0byB0aGUgcGFkZGVkIGJpdHMqLwogICAgICBmb3IgKGluZGV4ID0gbGFzdHdvcmRzaXplOyBpbmRleCA8IDRVOyBpbmRleCArKykKICAgICAgewogICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSA9IDBVOwogICAgICB9CiAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMVUpCiAgICAgIHsKICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gMHhGRkZGRkYwMFU7CiAgICAgIH0KICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKICAgICAgewogICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSAweEZGRkYwMDAwVTsKICAgICAgfQogICAgICBpZiAoKG5wYmxiICUgNFUpID09IDNVKQogICAgICB7CiAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IDB4RkYwMDAwMDBVOwogICAgICB9CiAgICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCA0VSA7IGluZGV4ICsrKQogICAgICB7CiAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdIF49ICB0ZW1wW2luZGV4XTsKICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gXj0gIHRlbXAyW2luZGV4XTsKICAgICAgfQogICAgICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgNFU7IGluZGV4ICsrKQogICAgICB7CiAgICAgICAgLyogV3JpdGUgdGhlIGxhc3QgSW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gOwogICAgICB9CgogICAgICAvKiBXYWl0IGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICAgIGlmIChDUllQX1dhaXRPbkJVU1lGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgICB9CiAgICB9CiAgfSAvKiBFbmQgb2YgQ0NNIFdLQSovCgogIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGNyeXApOwoKI2Vsc2UgLyogQUVTICovCgogIC8qV29ya2Fyb3VuZCAyOiBjYXNlIEdDTSBlbmNyeXB0aW9uLCBkdXJpbmcgcGF5bG9hZCBwaGFzZSBhbmQgYmVmb3JlIGluc2VydGluZwogIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxhb2QsIHdoaWNoIHNpemUgaXMgaW5mZXJpb3IgdG8gIDEyOCBiaXRzICAqLwoKICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfTU9ERSkgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpCiAgewogICAgLyogY29uZmlndXJlZCAgQ0hNT0QgQ1RSICAgKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0NITU9ELCBDUllQX0FFU19DVFIpOwogIH0KICAvKiAgbGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykKICB7CiAgICAvKiBXcml0ZSB0aGUgbGFzdCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogIH0KICB3aGlsZSAoaW5kZXggPCA0VSkKICB7CiAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAwVTsKICAgIGluZGV4Kys7CiAgfQogIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwogIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQogIHsKICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogIH0KCiAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKCiAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IDRVOyBpbmRleCsrKQogIHsKICAgIC8qIFJlYWQgdGhlIE91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyAqLwogICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKCiAgICAvKmludGVybWVkaWF0ZSBkYXRhIGJ1ZmZlciB0byBiZSB1c2VkIGluICB0aGUgd29ya2Fyb3VuZCovCiAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOwogICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwogIH0KCiAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQogIHsKICAgIC8qIGNvbmZpZ3VyZWQgIENITU9EIEdDTSAgICovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9DSE1PRCwgQ1JZUF9BRVNfR0NNX0dNQUMpOwoKICAgIC8qIFNlbGVjdCBmaW5hbCBwaGFzZSAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOwoKICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9EQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV8zMkIpCiAgICB7CiAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMVUpCiAgICAgIHsKICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gMHhGRkZGRkYwMFU7CiAgICAgIH0KICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKICAgICAgewogICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSAweEZGRkYwMDAwVTsKICAgICAgfQogICAgICBpZiAoKG5wYmxiICUgNFUpID09IDNVKQogICAgICB7CiAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IDB4RkYwMDAwMDBVOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9EQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgIHsKICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKICAgICAgewogICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JFVigweEZGRkZGRjAwVSk7CiAgICAgIH0KICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKICAgICAgewogICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JFVigweEZGRkYwMDAwVSk7CiAgICAgIH0KICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAzVSkKICAgICAgewogICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JFVigweEZGMDAwMDAwVSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0RBVEFUWVBFKSA9PSBDUllQX0RBVEFUWVBFXzE2QikKICAgIHsKICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKICAgICAgewogICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JPUigoMHhGRkZGRkYwMFUpLCAxNik7CiAgICAgIH0KICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKICAgICAgewogICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JPUigoMHhGRkZGMDAwMFUpLCAxNik7CiAgICAgIH0KICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAzVSkKICAgICAgewogICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JPUigoMHhGRjAwMDAwMFUpLCAxNik7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgLypDUllQX0RBVEFUWVBFXzFCKi8KICAgIHsKICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKICAgICAgewogICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JCSVQoMHhGRkZGRkYwMFUpOwogICAgICB9CiAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMlUpCiAgICAgIHsKICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SQklUKDB4RkZGRjAwMDBVKTsKICAgICAgfQogICAgICBpZiAoKG5wYmxiICUgNFUpID09IDNVKQogICAgICB7CiAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUkJJVCgweEZGMDAwMDAwVSk7CiAgICAgIH0KICAgIH0KCiAgICAvKldyaXRlIHRoZSBpbnRlcm1lZGlhdGVfZGF0YSBpbiB0aGUgSU4gRklGTyAqLwogICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF07CiAgICB9CiAgICB3aGlsZSAoaW5kZXggPCA0VSkKICAgIHsKICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICBpbmRleCsrOwogICAgfQogICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKICAgIHsKICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICB9CiAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLwogICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CgogICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IDRVOyBpbmRleCsrKQogICAgewogICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgfQogIH0vKkVuZCBvZiBXb3JrYXJvdW5kIDIqLwojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCn0KI2VuZGlmIC8qIEFFUyBvciBHQ00gQ0NNIGRlZmluZWQqLwojaWYgZGVmaW5lZCAoQ1JZUCkKI2lmIGRlZmluZWQgKENSWVBfQ1JfQUxHT01PREVfQUVTX0dDTSkKLyoqCiAgKiBAYnJpZWYgIEhhbmRsZSBDUllQIGhhcmR3YXJlIGJsb2NrIFRpbWVvdXQgd2hlbiB3YWl0aW5nIGZvciBJRkVNIGZsYWcgdG8gYmUgcmFpc2VkLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCiAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24uCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9XYWl0T25JRkVNRmxhZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgdGlja3N0YXJ0OwoKICAvKiBHZXQgdGltZW91dCAqLwogIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CgogIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfSUZFTSkpCiAgewogICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgewogICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgewogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIEhBTF9PSzsKfQojZW5kaWYgLyogR0NNIENDTSBkZWZpbmVkKi8KLyoqCiAgKiBAYnJpZWYgIEhhbmRsZSBDUllQIGhhcmR3YXJlIGJsb2NrIFRpbWVvdXQgd2hlbiB3YWl0aW5nIGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCiAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24uCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9XYWl0T25CVVNZRmxhZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgdGlja3N0YXJ0OwoKICAvKiBHZXQgdGltZW91dCAqLwogIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CgogIHdoaWxlIChIQUxfSVNfQklUX1NFVChoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfQlVTWSkpCiAgewogICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgewogICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgewogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIEhBTF9PSzsKfQoKCi8qKgogICogQGJyaWVmICBIYW5kbGUgQ1JZUCBoYXJkd2FyZSBibG9jayBUaW1lb3V0IHdoZW4gd2FpdGluZyBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZC4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgogICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfV2FpdE9uT0ZORUZsYWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKewogIHVpbnQzMl90IHRpY2tzdGFydDsKCiAgLyogR2V0IHRpbWVvdXQgKi8KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwoKICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX09GTkUpKQogIHsKICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgIHsKICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgIHsKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBIQUxfT0s7Cn0KCiNlbHNlIC8qIEFFUyAqLwoKLyoqCiAgKiBAYnJpZWYgIEhhbmRsZSBDUllQIGhhcmR3YXJlIGJsb2NrIFRpbWVvdXQgd2hlbiB3YWl0aW5nIGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbi4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX1dhaXRPbkNDRmxhZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgdGlja3N0YXJ0OwoKICAvKiBHZXQgdGltZW91dCAqLwogIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CgogIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSkKICB7CiAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICB7CiAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQogICAgICB7CiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gSEFMX09LOwp9CgojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLwoKCi8qKgogICogQH0KICAqLwoKCgovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKI2VuZGlmIC8qIEhBTF9DUllQX01PRFVMRV9FTkFCTEVEICovCgoKLyoqCiAgKiBAfQogICovCiNlbmRpZiAvKiBUaW55QUVTIG9yIENSWVAqLwovKioKICAqIEB9CiAgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCg==