LyoKICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKCiAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQogIEFsbCBSaWdodHMgUmVzZXJ2ZWQKCiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgoKICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCiAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCiAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgogIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCiAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKICBvZiB0aGUgc29mdHdhcmUuCgogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCiAgd3JpdHRlbiBjb25zZW50LgoKICA6PgoqLwoKLyoqIEBmaWxlIG1rYS5jCiAqICBAYnJpZWYgUHVibGljbHkgYWNjZXNzaWJsZSBBUElzIHByb3ZpZGVkIHRvIHByb2Nlc3MgTUtBIHJlcXVlc3QvcmVzcG9uc2VzLgogKgogKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBvZiB0aGUgcHVibGljL3ByaXZhdGUgQVBJcyB1c2VkIHRvIHByb2Nlc3MgTUtBIGZyYW1lcy4KICoKICogTUtBIEV4Y2hhbmdlIFNlcXVlbmNlIDoKICoKICogMS4gIElmIGJpZGlyZWN0aW9uYWwgZW5jcnlwdGlvbiBpcyBlbmFibGVkLCB0aGUgT0xUIHdpbGwgZ2VuZXJhdGUgYW4gTUtQRFUKICogICAgIGNvbnRhaW5pbmcgdGhlIGJhc2ljIHBhcmFtZXRlciBzZXQgYW5kIGVtcHR5IGxpdmUgYW5kIHBvdGVudGlhbCBwZWVyCiAqICAgICBsaXN0cy4KICogMi4gIFdoZW4gdGhlIE9OVSByZWNlaXZlcyB0aGlzLCBpdCB3aWxsIGFkZCB0aGUgT0xUIHRvIGl0cyBwb3RlbnRpYWwgcGVlcnMKICogICAgIGxpc3QuCiAqIDMuICBIYXZpbmcgZGlzY292ZXJlZCBhIG5ldyBwb3RlbnRpYWwgcGVlciwgdGhlIE9OVSB3aWxsIHRyYW5zbWl0IGFuIE1LUERVCiAqICAgICBjb250YWluaW5nIHRoZSBiYXNpYyBwYXJhbWV0ZXIgc2V0LCBhbmQgZW1wdHkgbGl2ZSBwZWVycyBsaXN0LCBhbmQgYQogKiAgICAgcG90ZW50aWFsIHBlZXIgbGlzdCBjb250YWluaW5nIHRoZSBPTFQuCiAqIDQuICBXaGVuIHRoZSBPTFQgcmVjZWl2ZXMgdGhpcywgaXQgd2lsbCBhZGQgdGhlIE9OVSB0byBpdHMgbGl2ZSBwZWVycyBsaXN0LgogKiA1LiAgSGF2aW5nIGFkZGVkIGEgbmV3IGxpdmUgcGVlciwgdGhlIE9MVCB3aWxsIGdlbmVyYXRlIGEgbmV3IFNBSyBhbmQgaW5zdGFsbAogKiAgICAgaXQgZm9yIHJlY2VpdmUgKHVzaW5nIHRoZSBPTlVzIFNDSSkuCiAqIDYuICBUaGUgT0xUIHRoZW4gdHJhbnNtaXRzIGFuIE1LUERVIGNvbnRhaW5pbmcgdGhlIGJhc2ljIHBhcmFtZXRlciBzZXQsIGEKICogICAgIGxpdmUgcGVlciBsaXN0IGNvbnRhaW5pbmcgdGhlIE9OVSwgYW4gZW1wdHkgcG90ZW50aWFsIHBlZXIgbGlzdCwgYQogKiAgICAgZGlzdHJpYnV0ZWQgU0FLLCBhbmQgYSBTQUsgdXNhZ2UgcGFyYW1ldGVyIHNldCBpbmRpY2F0aW5nIHRoYXQgdGhlIG5ldwogKiAgICAgU0FLIGhhcyBiZWVuIGluc3RhbGxlZCBmb3IgcmVjZWl2ZS4KICogNy4gIFdoZW4gdGhlIE9OVSByZWNlaXZlcyB0aGlzLCBpdCB3aWxsOgogKiAgICAgYS4gQWRkIHRoZSBPTFQgdG8gaXRzIGxpdmUgcGVlcnMgbGlzdAogKiAgICAgYi4gSW5zdGFsbCB0aGUgbmV3IFNBSyBmb3IgcmVjZWl2ZSAodXNpbmcgdGhlIE9MVHMgU0NJKQogKiAgICAgYy4gQmVjYXVzZSB0aGUgT0xUIHJlcG9ydGVkIHRoZSBTQUsgaW4gdXNlIGZvciByZWNlaXZlLCB0aGUgT05VIHdpbGwKICogICAgICAgIGluc3RhbGwgdGhlIFNBSyBmb3IgdHJhbnNtaXQgKHVzaW5nIHRoZSBPTlVzIFNDSSkuCiAqIDguICBUaGUgT05VIHdpbGwgdGhlbiB0cmFuc21pdCBhbiBNS1BEVSBjb250YWluaW5nIHRoZSBiYXNpYyBwYXJhbWV0ZXIgc2V0LAogKiAgICAgYSBsaXZlIHBlZXJzIGxpc3QgY29udGFpbmluZyB0aGUgT0xULCBhbiBlbXB0eSBwb3RlbnRpYWwgcGVlciBsaXN0LAogKiAgICAgYW5kIGEgU0FLIHVzYWdlIHBhcmFtZXRlciBzZXQgaW5kaWNhdGluZyB0aGF0IHRoZSBTQUsgaGFzIGJlZW4gaW5zdGFsbGVkCiAqICAgICBmb3IgcmVjZWl2ZSBhbmQgdHJhbnNtaXQuCiAqIDkuICBXaGVuIHRoZSBPTFQgcmVjZWl2ZXMgdGhpcywgaXQgd2lsbCBzZWUgdGhhdCB0aGUgT05VIGhhcyBpbnN0YWxsZWQgdGhlCiAqICAgICBTQUsgZm9yIHJlY2VpdmUgYW5kIHdpbGwgaW5zdGFsbCB0aGUgU0FLIGZvciB0cmFuc21pdAogKiAgICAgKHVzaW5nIHRoZSBPTFRzIFNDSSkuCiAqIDEwLiBUaGUgT0xUIHdpbGwgdGhlbiB0cmFuc21pdCBhbiBNS1BEVSBjb250YWluaW5nIHRoZSBiYXNpYyBwYXJhbWV0ZXIgc2V0LAogKiAgICAgYSBsaXZlIHBlZXIgbGlzdCBjb250YWluaW5nIHRoZSBPTlUsIGFuIGVtcHR5IHBvdGVudGlhbCBwZWVyIGxpc3QgYW5kCiAqICAgICBhIFNBSyB1c2FnZSBwYXJhbWV0ZXIgc2V0IGluZGljYXRpbmcgdGhlIFNBSyBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yCiAqICAgICByZWNlaXZlIGFuZCB0cmFuc21pdC4gIChJoa5tIG5vdCBzdXJlIGlmIHRoaXMgc3RlcCBpcyBuZWNlc3NhcnkpCiAqIDExLiBUaGlzIG1lc3NhZ2Ugd2lsbCBwcm9kdWNlIG5vIHN0YXRlIGNoYW5nZSBhdCB0aGUgT05VLCBzbyBpdCB3aWxsIG5vdAogKiAgICAgcmVzcG9uZCBpbW1lZGlhdGVseS4gKGJvdGggdGhlIE9OVSBhbmQgT0xUIHdpbGwgbmVlZCB0byBzdGFydCBhIDIgc2Vjb25kCiAqICAgICB0aW1lciBldmVyeSB0aW1lIGFuIE1LUERVIGlzIHRyYW5zbWl0dGVkID8gaWYgdGhleSBoYXZlIG5vdCB0cmFuc21pdHRlZAogKiAgICAgYW4gTUtQRFUgZHVlIHRvIGEgc3RhdGUgY2hhbmdlIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMsIHRoZXkgd2lsbAogKiAgICAgdHJhbnNtaXQgYW4gTUtQRFUgY29udGFpbmluZyB0aGUgYmFzaWMgcGFyYW1ldGVyIHNldCBhbmQgbGl2ZSBhbmQKICogICAgIHBvdGVudGlhbCBwZWVyIGxpc3RzLiAgSWYgZWl0aGVyIHNpZGUgZG9lcyBub3QgcmVjZWl2ZSBhbiBNS1BEVSBmcm9tCiAqICAgICB0aGUgb3RoZXIgZm9yIDYgc2Vjb25kcyB0aGV5IG11c3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGVpciBwZWVyIGxpc3RzLikKICogMTIuIFdoZW4gdGhlIE9MVCBkZXRlcm1pbmVzIHRoYXQgYSBuZXcgU0FLIGlzIG5lZWRlZCB0aGlzIHByb3RvY29sIHdpbGwKICogICAgIHJlcGVhdCBzdGVwcyA1LTExLiAobW9kaWZpY2F0aW9ucyB0byB0aGUgcGVlciBsaXN0cywgc3VjaCBhcyA3YSwgc2hvdWxkCiAqICAgICBub3QgYmUgcmVxdWlyZWQpCiAqCiAqICBAZGVmZ3JvdXAgbWthIE1LQQogKiAgQGluZ3JvdXAgY21DdHJsCiAqCiAqLwoKI2luY2x1ZGUgIm1rYS5oIgojaW5jbHVkZSAiZHBvZV9zZWNfdXRpbC5oIgojaW5jbHVkZSAiZHBvZV9zZWNfZnNtLmgiCgovKiBUaGUgZGVzdGluYXRpb24gbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZvciBNS0EgcGFja2V0cy4gKi8Kc3RhdGljIGNvbnN0IGJjbW9zX21hY19hZGRyZXNzIG1rYV9kc3RfbWFjX2FkZHIgPSB7IC51OCA9IHsgMHgwMSwgMHg4MCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMyB9IH07CgojaWYgMApzdGF0aWMgY29uc3QgY2hhciAqbWthX3N0YXRlX25hbWVzW01LQV9TVEFURV9fQ09VTlRdID0KewogICAgIkluaXRpYWwiLAogICAgIldhaXRpbmdJbml0aWFsUGVlclJlc3AiLAogICAgIlNha1NlbnQiLAogICAgIk1rYURvbmUiCn07CiNlbmRpZgoKI2RlZmluZSBNS0FfVkVSU0lPTiAgICAgICAgICAgICAgICAgMQojZGVmaW5lIE1LQV9TRVJWRVJfUFJJT1JJVFkgICAgICAgICAweDMwCiNkZWZpbmUgTUtBX0lOSVRfUkVUUllfQ05UICAgICAgICAgIDMKI2RlZmluZSBNS0FfQkFTSUNfUEFSQU1fU0VUX0xFTiAgICAgNDQgLyogNDggLSBoZWFkZXIgbGVuICg0IGJ5dGUpICovCiNkZWZpbmUgTUtBX0JBU0lDX1BBUkFNX1NFVF9PUFQgICAgIDB4NjAgLyogS2V5U2VydmVyOjAsIE1BQ3NlY0Rlc2lyZWQ6MSwgTUFDc2VjIENhcGFiaWxpdHk6MiAmIGhpZ2ggNCBiaXRzIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHNldCBib2R5IGxlbmd0aCAoMCkgKi8KCiNkZWZpbmUgTUtBX0FMR09SSVRITV9BR0lMSVRZICAgICAgIDB4MDA4MGMyMDEKI2RlZmluZSBNS0FfTU5fTEVOICAgICAgICAgICAgICAgICAgNCAvKiBNZXNzYWdlIE51bWJlciAqLwojZGVmaW5lIE1LQV9LTl9MRU4gICAgICAgICAgICAgICAgICA0IC8qIEtleSBOdW1iZXIgKi8KI2RlZmluZSBNS0FfUERVX01BWF9GUkFNRV9MRU4gICAgICAgMzAwCiNkZWZpbmUgTUtBX0hFTExPX1RJTUUgICAgICAgICAgICAgIDIwMDAgLyogTXMsIDIgc2Vjb25kcyAqLwojZGVmaW5lIE1LQV9NQVhfSEVMTE9fUkVUUklFUyAgICAgICAzIC8qIE1heCBIZWxsbyByZXRyaWVzICovCiNkZWZpbmUgTUtBX09MVF9JTklUX0ZSQU1FX0xFTiAgICAgIDc2IC8qIGJhc2ljIHBhcmFtIHNldCg0OCkgKyBudWxsIGxpdmUgcGVlciBsaXN0ICg0KSArIG51bGwgcG90ZW50aWFsIHBlZXIgbGlzdCAoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJY3YgSW5kaWNhdG9yICg0KSArIElDVigxNikgKi8KI2RlZmluZSBNS0FfT05FX1BFRVJfTEVOICAgICAgICAgICAgMTYgLyogb25lIGxpdmUgcGVlciBsZW4gKi8KI2RlZmluZSBNS0FfRElTVFJJQlVURURfU0FLX0xFTiAgICAgMzIKI2RlZmluZSBNS0FfSUNWX0xFTiAgICAgICAgICAgICAgICAgMTYKI2RlZmluZSBNS0FfUERVX01JTl9MRU5HVEggICAgICAgICAgMzIKI2RlZmluZSBNS0FfS0VZX1dSQVBQRURfU0FLX0xFTiAgICAgMjQKI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9CT0RZX0xFTiAgNDAKI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9MRU0gICAgICAgNDQKI2RlZmluZSBNS0FfTUFYX0FDQ0VQVEFCTEVfUE4gICAgICAgMHhDMDAwMDAwMAoKI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9BTl9TSElGVCAgICAgICAgICA2CiNkZWZpbmUgTUtBX1NBS19VU0VfUEFSQU1fTEtfVFhfU0hJRlQgICAgICAgNQojZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX0xLX1JYX1NISUZUICAgICAgIDQKI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9PTERfS0VZX0FOX01BU0sgICAzCiNkZWZpbmUgTUtBX1NBS19VU0VfUEFSQU1fT0xEX0tFWV9BTl9TRlQgICAgMgojZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX09MRF9LRVlfVFhfUlggICAgIDMKI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9TRUNPTkRfT1BUX0JZVEUgICAweEMwCgojZGVmaW5lIE1LQV9LRVlfTEVOICAgICAgICAgICAgICAgICAxNiAvKiBjb21tb24ga2V5IHNpemUgKi8KCiNkZWZpbmUgTUtBX0tFS19MQUJFTF9MRU4gICAgICAgICAgIDEyIC8qIGxhYmVsIGxlbmd0aCAqLwojZGVmaW5lIE1LQV9LRUtfQ09OVEVYVF9MRU4gICAgICAgICAxNgoKI2RlZmluZSBNS0FfU0FLX0tFWV9XUkFQUEVEX0xFTiAgICAgMjQKCiNkZWZpbmUgTUtBX0lDS19MQUJFTF9MRU4gICAgICAgICAgIDEyIC8qIGxhYmVsIGxlbmd0aCAqLwojZGVmaW5lIE1LQV9JQ0tfQ09OVEVYVF9MRU4gICAgICAgICAxNgoKI2RlZmluZSBNS0FfQ0tOX0xBQkVMX0xFTiAgICAgICAgICAgMTYgLyogbGFiZWwgbGVuZ3RoICovCiNkZWZpbmUgTUtBX0NLTl9DT05URVhUX0xFTiAgICAgICAgIChTSVpFX09GX0VBUF9TRVNTSU9OX0lEICsgKEJDTU9TX0VUSF9BTEVOICogMikpIC8qIDc3ICovCgojZGVmaW5lIE1LQV9DQUtfTEFCRUxfTEVOICAgICAgICAgICAxNiAvKiBsYWJlbCBsZW5ndGggKi8KI2RlZmluZSBNS0FfQ0FLX0NPTlRFWFRfTEVOICAgICAgICAgMTIgLyogY29udGV4dCBsZW5ndGggKi8KCi8qIE1LUERVIFBhcmFtZXRlciBzZXQgdHlwZSAqLwp0eXBlZGVmIGVudW0KewogICAgTUtQRFVfUEFSQU1fU0VUX0xJVkVfUEVFUl9MSVNUICAgICAgPSAxLAogICAgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QgPSAyLAogICAgTUtQRFVfUEFSQU1fU0VUX01BQ1NFQ19TQUtfVVNFICAgICAgPSAzLAogICAgTUtQRFVfUEFSQU1fU0VUX0RJU1RfU0FLICAgICAgICAgICAgPSA0LAogICAgTUtQRFVfUEFSQU1fU0VUX0RJU1RfQ0FLICAgICAgICAgICAgPSA1LAogICAgTUtQRFVfUEFSQU1fU0VUX0tNRCAgICAgICAgICAgICAgICAgPSA2LAogICAgTUtQRFVfUEFSQU1fU0VUX0FOTk9VTkNFTUVOVCAgICAgICAgPSA3LAogICAgTUtQRFVfUEFSQU1fU0VUX0lDVl9JTkRJQ0FUT1IgICAgICAgPSAyNTUsCn0gbWtwZHVfcGFyYW1fc2V0X3R5cGU7Cgp0eXBlZGVmIGVudW0KewogICAgTUtBX01TR19USU1FT1VULAogICAgTUtBX01TR19EQVRBX0lORAp9IG1rYV9tc2dfdHlwZTsKCnR5cGVkZWYgc3RydWN0CnsKICAgIG1rYV9tc2dfdHlwZSB0eXBlOwogICAgZWFwb2xfbXNnX2hkciAqbXNnOwogICAgYmNtb2x0X2J1ZiAqYnVmOwp9IG1rYV9ldmVudDsKCi8qIENhbGN1bGF0ZSBLZXkgRW5jcnlwdGlvbiBLZXkgKi8Kc3RhdGljIHZvaWQgX21rYV9jYWxjX2tlayh1aW50OF90ICprZWssIHVpbnQ4X3QgKmNhaywgdWludDhfdCAqY2tuKQp7CiAgICBjaGFyIGtla19sYWJlbFtNS0FfS0VLX0xBQkVMX0xFTiArIDFdID0gIklFRUU4MDIxIEtFSyI7CgogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihrZWsgPT0gTlVMTCk7CiAgICBCVUdfT04oY2FrID09IE5VTEwpOwogICAgQlVHX09OKGNrbiA9PSBOVUxMKTsKCiAgICBkcG9lX3NlY19hZXNfY21hY19rZGYoY2FrLCBrZWtfbGFiZWwsIGNrbiwgTUtBX0tFS19DT05URVhUX0xFTiwga2VrKTsKfQoKLyogQ2FsY3VsYXRlIEludGVncml0eSBDaGVjayB2YWx1ZSBLZXkgKi8Kc3RhdGljIHZvaWQgX21rYV9jYWxjX2ljayh1aW50OF90ICppY2ssIHVpbnQ4X3QgKmNhaywgdWludDhfdCAqY2tuKQp7CiAgICBjaGFyIGlja19sYWJlbFtNS0FfSUNLX0xBQkVMX0xFTiArIDFdID0gIklFRUU4MDIxIElDSyI7CgogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihpY2sgPT0gTlVMTCk7CiAgICBCVUdfT04oY2FrID09IE5VTEwpOwogICAgQlVHX09OKGNrbiA9PSBOVUxMKTsKCiAgICBkcG9lX3NlY19hZXNfY21hY19rZGYoY2FrLCBpY2tfbGFiZWwsIGNrbiwgTUtBX0lDS19DT05URVhUX0xFTiwgaWNrKTsKfQoKLyogY2FsY3VsYXRlIEludGVncml0eSBDaGVjayBWYWx1ZSAqLwpzdGF0aWMgdm9pZCBfbWthX2NhbGNfaWN2KHVpbnQ4X3QgKmljdiwgdWludDhfdCAqaWNrLCB1aW50OF90ICptc2R1LCB1aW50MTZfdCBtc2R1X2xlbikKewogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihpY3YgPT0gTlVMTCk7CiAgICBCVUdfT04oaWNrID09IE5VTEwpOwogICAgQlVHX09OKG1zZHUgPT0gTlVMTCk7CgogICAgZHBvZV9zZWNfYWVzX2NtYWMoaWNrLCBtc2R1LCBtc2R1X2xlbiwgaWN2KTsKfQoKLyogQ2FsY3VsYXRlIFNlY3VyZSBDb25uZWN0aXZpdHkgQXNzb2NpYXRpb24gS2V5IE5hbWUgKi8Kc3RhdGljIHZvaWQgX21rYV9jYWxjX2NrbihkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIHVpbnQ4X3QgZWFwX3Nlc3NfaWRfbGVuKQp7CiAgICBjaGFyIGNrbl9sYWJlbFtNS0FfQ0tOX0xBQkVMX0xFTiArIDFdID0gIklFRUU4MDIxIEVBUCBDS04iOwogICAgdWludDhfdCBja25fY29udGV4dFtNS0FfQ0tOX0NPTlRFWFRfTEVOXTsKCiAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLwogICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOwogICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNrbiA9PSBOVUxMKTsKICAgIEJVR19PTihsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEubWFzdGVyX3Nlc3Npb25fa2V5ID09IE5VTEwpOwogICAgQlVHX09OKGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXNzaW9uX2lkID09IE5VTEwpOwoKICAgIG1lbWNweSgmY2tuX2NvbnRleHRbMF0sIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXNzaW9uX2lkLCBlYXBfc2Vzc19pZF9sZW4pOwogICAgbWVtY3B5KCZja25fY29udGV4dFtlYXBfc2Vzc19pZF9sZW5dLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxlc3Nlcl9tYWMudTgsIEJDTU9TX0VUSF9BTEVOKTsKICAgIG1lbWNweSgmY2tuX2NvbnRleHRbZWFwX3Nlc3NfaWRfbGVuICsgQkNNT1NfRVRIX0FMRU5dLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmdyZWF0ZXJfbWFjLnU4LCBCQ01PU19FVEhfQUxFTik7CiAgICBkcG9lX3NlY19hZXNfY21hY19rZGYobGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1hc3Rlcl9zZXNzaW9uX2tleSwgY2tuX2xhYmVsLCBja25fY29udGV4dCwgTUtBX0NLTl9DT05URVhUX0xFTiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5ja24pOwp9CgovKiBDYWxjdWxhdGUgU2VjdXJlIENvbm5lY3Rpdml0eSBBc3NvY2lhdGlvbiBLZXkgKi8Kc3RhdGljIHZvaWQgX21rYV9jYWxjX2NhayhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCnsKICAgIGNoYXIgY2FrX2xhYmVsW01LQV9DQUtfTEFCRUxfTEVOICsgMV0gPSAiSUVFRTgwMjEgRUFQIENBSyI7CiAgICB1aW50OF90IGNha19jb250ZXh0W01LQV9DQUtfQ09OVEVYVF9MRU5dOwoKICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCiAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CiAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOwogICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrID09IE5VTEwpOwogICAgQlVHX09OKGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5tYXN0ZXJfc2Vzc2lvbl9rZXkgPT0gTlVMTCk7CgogICAgbWVtY3B5KCZjYWtfY29udGV4dFswXSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5sZXNzZXJfbWFjLnU4LCBCQ01PU19FVEhfQUxFTik7CiAgICBtZW1jcHkoJmNha19jb250ZXh0W0JDTU9TX0VUSF9BTEVOXSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5ncmVhdGVyX21hYy51OCwgQkNNT1NfRVRIX0FMRU4pOwogICAgZHBvZV9zZWNfYWVzX2NtYWNfa2RmKGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5tYXN0ZXJfc2Vzc2lvbl9rZXksIGNha19sYWJlbCwgY2FrX2NvbnRleHQsIE1LQV9DQUtfQ09OVEVYVF9MRU4sIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrKTsKfQoKLyogR2V0IE9MVCBwb3J0IE1hYyBhbmQgbGluayBNYWMgJiBjb21wYXJlLiBUaGlzIGlzIG5lZWRlZCBmb3IgY2FsY3VsYXRpbmcgQ0FLICovCnN0YXRpYyB2b2lkIF9ta2FfZ2V0X29sdF9hbmRfbGlua19tYWMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQp7CiAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLwogICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOwogICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKCiAgICAvKiBjb21wYXJlIE9MVCBhbmQgTGluayBNQUMgYWRkcmVzc2VzICovCiAgICBpZiAobWVtY21wKGxpbmtfcmVjLT5uaV9tYWMudTgsIGxpbmtfcmVjLT5rZXkubWFjX2FkZHJlc3MudTgsIHNpemVvZihCQ01PU19FVEhfQUxFTikpID49IDApCiAgICB7CiAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5sZXNzZXJfbWFjID0gbGlua19yZWMtPmtleS5tYWNfYWRkcmVzczsKICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmdyZWF0ZXJfbWFjID0gbGlua19yZWMtPm5pX21hYzsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxlc3Nlcl9tYWMgPSBsaW5rX3JlYy0+bmlfbWFjOwogICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Z3JlYXRlcl9tYWMgPSBsaW5rX3JlYy0+a2V5Lm1hY19hZGRyZXNzOwogICAgfQp9CgovKiBJbml0aWFsaXplIGxpbmsgTUtBIGluZm8gc3RydWN0dXJlICovCnN0YXRpYyB2b2lkIF9ta2FfaW5pdF9saW5rX2luZm8oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQp7CiAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLwogICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOwogICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKCiAgICAvKiBpbml0aWFsaXplIGFsbCBsb2NhbCB2YWx1ZXMgKi8KICAgIG1lbXNldChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sIDAsIHNpemVvZigqbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvKSk7CiAgICBkcG9lX3NlY19nZW5lcmF0ZV9uX2J5dGVfcmFuZG9tX251bWJlcihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9sdF9tZW1iZXJfaWQsIE1LQV9NSV9MRU4pOwogICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5jdXJyX21zZ19udW0gPSAxOyAvKiBzdGFydCBmcm9tIDEgKi8KICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlciA9IDE7IC8qIHN0YXJ0IGZyb20gMSAqLwogICAgX21rYV9nZXRfb2x0X2FuZF9saW5rX21hYyhsaW5rX3JlYyk7CiAgICBfbWthX2NhbGNfY2FrKGxpbmtfcmVjKTsKICAgIF9ta2FfY2FsY19ja24obGlua19yZWMsIFNJWkVfT0ZfRUFQX1NFU1NJT05fSUQpOwogICAgX21rYV9jYWxjX2ljayhsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmljaywgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5jYWssIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2tuKTsKICAgIF9ta2FfY2FsY19rZWsobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZWssIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNrbik7Cn0KCnN0YXRpYyB2b2lkIF9ta2FfY2xlYXJfbGlua19pbmZvKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKewogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CgogICAgbWVtc2V0KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgMCwgc2l6ZW9mKCpsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8pKTsKfQoKLyogQnVpbGQgRUFQT0wgaGVhZGVyIGZvciBNS1BEVSAqLwpzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2J1aWxkX2VhcG9sX2hlYWRlcihkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKm91dF9idWYsIHVpbnQxNl90IGxlbmd0aCkKewogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOwoKICAgIHJldHVybgogICAgICAgIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3Mob3V0X2J1ZiwgbWthX2RzdF9tYWNfYWRkcikgJiYKICAgICAgICBiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKG91dF9idWYsIGxpbmtfcmVjLT5uaV9tYWMpICYmCiAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUob3V0X2J1ZiwgRVRIRVJUWVBFX0VBUE9MKSAmJgogICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgRUFQT0xfUFJPVE9DT0xfVkVSU0lPTl9EUE9FKSAmJgogICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgRUFQT0xfVFlQRV9NS0EpICYmCiAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUob3V0X2J1ZiwgbGVuZ3RoKTsKfQoKLyogQnVpbGQgQmFzaWMgcGFyYW1ldGVyIHNldC4gVGhpcyBwYXJhbWV0ZXIgc2V0IGlzIHJlcXVpcmVkIGZvciBldmVyeSBNS1BEVSAqLwpzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2J1aWxkX2Jhc2ljX3BhcmFtZXRlcl9zZXQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpvdXRfYnVmKQp7CiAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLwogICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOwogICAgQlVHX09OKG91dF9idWYgPT0gTlVMTCk7CiAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOwoKICAgIHJldHVybgogICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtBX1ZFUlNJT04pICYmIC8qIFZlcnNpb24gTnVtYmVyLCA4MDIuMVggUGcuOTggKi8KICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIE1LQV9TRVJWRVJfUFJJT1JJVFkpICYmIC8qIEtleSBTZXJ2ZXIgUHJpb3JpdHkgKi8KICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIE1LQV9CQVNJQ19QQVJBTV9TRVRfT1BUKSAmJgogICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtBX0JBU0lDX1BBUkFNX1NFVF9MRU4pICYmCiAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhvdXRfYnVmLCBsaW5rX3JlYy0+bmlfbWFjKSAmJiAvKiA2IGJ5dGUgb2YgU0NJICovCiAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUob3V0X2J1ZiwgbGlua19yZWMtPmxsaWQpICYmIC8qIGxvd2VyIDIgYnl0ZSBTQ0kgKi8KICAgICAgICBiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b2x0X21lbWJlcl9pZCwgTUtBX01JX0xFTikgJiYKICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UzMl9iZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmN1cnJfbXNnX251bSsrKSAmJiAvKiBJbXBvcnRhbnQgISEgKi8KICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UzMl9iZShvdXRfYnVmLCBNS0FfQUxHT1JJVEhNX0FHSUxJVFkpICYmCiAgICAgICAgYmNtb2x0X2J1Zl93cml0ZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNrbiwgTUtBX0NLTl9MRU4gLyA4KTsgLyogQ0FLIE5hbWUoQ0tOKSAqLwp9CgovKiBCdWlsZCBhbiBlbXB0eSBMaXZlIFBlZXIgb3IgUG90ZW50aWFsIFBlZXIgbGlzdCBwYXJhbWV0ZXIgc2V0ICovCnN0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfZW1wdHlfcGVlcl9saXN0KGJjbW9sdF9idWYgKm91dF9idWYsIHVpbnQ4X3QgdHlwZSkKewogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOwoKICAgIHJldHVybgogICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgdHlwZSkgJiYgLyogUGFyYW1ldGVyIHNldCB0eXBlICovCiAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCAwKSAmJgogICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCkgJiYgLyogb3B0aW9ucyAmIDQgYml0IGxlbmd0aCAqLwogICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCk7IC8qIFBhcmFtZXRlciBzZXQgYm9keSBsZW5ndGguICovCn0KCi8qIEJ1aWxkIExpdmUgUGVlciBMaXN0IG9yIFBvdGVudGlhbCBQZWVyIExpc3QgcGFyYW1ldGVyIHNldCAqLwpzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2J1aWxkX3BlZXJfbGlzdCgKICAgIGJjbW9sdF9idWYgKm91dF9idWYsCiAgICB1aW50OF90IHR5cGUsCiAgICBjb25zdCB1aW50OF90ICptZW1iZXJfaWQsCiAgICB1aW50MzJfdCBtZXNzYWdlX251bSkKewogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOwogICAgQlVHX09OKG1lbWJlcl9pZCA9PSBOVUxMKTsKCiAgICByZXR1cm4KICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIHR5cGUpICYmIC8qIFBhcmFtZXRlciBzZXQgdHlwZSAqLwogICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCkgJiYKICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIDApICYmIC8qIG9wdGlvbnMgJiA0IGJpdCBsZW5ndGggKi8KICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIE1LQV9NSV9MRU4gKyBzaXplb2YodWludDMyX3QpKSAmJiAvKiBQYXJhbWV0ZXIgc2V0IGJvZHkgbGVuZ3RoLiAqLwogICAgICAgIGJjbW9sdF9idWZfd3JpdGUob3V0X2J1ZiwgbWVtYmVyX2lkLCBNS0FfTUlfTEVOKSAmJgogICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKG91dF9idWYsIG1lc3NhZ2VfbnVtKTsKfQoKLyogQnVpbGQgSUNWIEluZGljYXRvciBwYXJhbWV0ZXIgc2V0ICovCnN0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfaWN2X2luZGljYXRvcihiY21vbHRfYnVmICpvdXRfYnVmKQp7CiAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLwogICAgQlVHX09OKG91dF9idWYgPT0gTlVMTCk7CgogICAgcmV0dXJuCiAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS1BEVV9QQVJBTV9TRVRfSUNWX0lORElDQVRPUikgJiYKICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIDApICYmCiAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCAwKSAmJiAvKiBvcHRpb25zICYgNCBiaXQgbGVuZ3RoICovCiAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfSUNWX0xFTik7IC8qIFBhcmFtZXRlciBzZXQgYm9keSBsZW5ndGguICovCn0KCi8qIEJ1aWxkIERpc3RyaWJ1dGVkIFNBSyBwYXJhbWV0ZXIgc2V0IChHQ00tQUVTLTEyOCkgKi8Kc3RhdGljIGJjbW9zX2Jvb2wgX21rYV9idWlsZF9kaXN0cmlidXRlZF9zYWsoCiAgICBjb25zdCBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsCiAgICBiY21vbHRfYnVmICpvdXRfYnVmLAogICAgY29uc3QgdWludDhfdCAqa2V5X3dyYXBwZWRfc2FrKQp7CiAgICB1aW50OF90IG9wdGlvbjsKCiAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLwogICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOwogICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOwogICAgQlVHX09OKGtleV93cmFwcGVkX3NhayA9PSBOVUxMKTsKCiAgICAvKiBuZWVkIERpc3RyaWJ1dGVkIEFOICYgQ29uZmlkZW50aWFsaXR5IE9mZnNldCAoYml0IDUsNC4gdXNlIDApICovCiAgICBvcHRpb24gPSBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlcjsKCiAgICBvcHRpb24gPDw9IE1LQV9TQUtfVVNFX1BBUkFNX0FOX1NISUZUOyAvKiBtb3ZlIHRvIGJpdCA3LDYgKi8KCiAgICAvKiBrZXkgbnVtYmVyICYgQU4gd2lsbCBiZSBpbmNyZWFzZWQgZnJvbSB0aGUgY2FsbGVyICovCiAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX0RJU1RfU0FLKSB8fAogICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIG9wdGlvbikgfHwKICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCAwKSB8fCAvKiBvcHRpb25zICYgNCBiaXQgbGVuZ3RoICovCiAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtBX0tFWV9XUkFQUEVEX1NBS19MRU4gKyBNS0FfS05fTEVOKSB8fAogICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3UzMl9iZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIpIHx8CiAgICAgICAgIWJjbW9sdF9idWZfd3JpdGUob3V0X2J1Ziwga2V5X3dyYXBwZWRfc2FrLCBNS0FfS0VZX1dSQVBQRURfU0FLX0xFTikpCiAgICB7CiAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOwogICAgfQogICAgcmV0dXJuIEJDTU9TX1RSVUU7Cn0KCi8qIEJ1aWxkIE1BQ3NlYyBTQUsgVXNlIHBhcmFtYXRlciBzZXQgKi8Kc3RhdGljIGJjbW9zX2Jvb2wgX21rYV9idWlsZF9zYWtfdXNlX3BhcmFtKAogICAgY29uc3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLAogICAgYmNtb2x0X2J1ZiAqb3V0X2J1ZiwKICAgIGJjbW9zX2Jvb2wgc2V0X3R4LAogICAgYmNtb3NfYm9vbCBzZXRfcngpCnsKICAgIHVpbnQ4X3Qgb3B0aW9uMSA9IDA7CiAgICB1aW50OF90IG9wdGlvbjIgPSAwOwogICAgdWludDhfdCB0bXAgPSAwOwogICAgdWludDMyX3Qgb2xkX2tuOwoKICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCiAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CiAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOwogICAgQlVHX09OKG91dF9idWYgPT0gTlVMTCk7CgogICAgLyogb3B0aW9uIDE6IExhdGVzdCBLZXkgQU4oNzo2KSwgTGF0ZXN0IEtleSBUeCg1KSwgTGF0ZXN0IEtleSBSeCg0KSBPbGQgS2V5IEFOKDM6MiksIE9sZCBLZXkgVHgoMSksIE9sZCBLZXkgUngoMCkgKi8KICAgIG9wdGlvbjEgPSBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlcjsKICAgIG9wdGlvbjEgPDw9IE1LQV9TQUtfVVNFX1BBUkFNX0FOX1NISUZUOyAvKiBtb3ZlIHRvIGJpdCA3LDYgKEFOKSAqLwoKICAgIGlmIChzZXRfdHgpCiAgICB7CiAgICAgICAgdG1wID0gMSA8PCBNS0FfU0FLX1VTRV9QQVJBTV9MS19UWF9TSElGVDsgLyogTGF0ZXN0IEtleSBUWCAqLwogICAgfQogICAgaWYgKHNldF9yeCkKICAgIHsKICAgICAgICB0bXAgPSB0bXAgfCAoMSA8PCBNS0FfU0FLX1VTRV9QQVJBTV9MS19SWF9TSElGVCk7IC8qIExhdGVzdCBLZXkgUnggKi8KICAgIH0KCiAgICAvKiBmb3IgZmlyc3QgZnJhbWUsIGFsbCAwIGlzIHVzZWQgZm9yIG9sZCBrZXkgaW5mbyAqLwogICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmVmcmVzaF9jbnQgIT0gMCkKICAgIHsKICAgICAgICAvKiBmb3IgT0xEIEFOLCB0eCwgcnggYml0cyAqLwogICAgICAgIHRtcCA9IHRtcCB8ICgobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5hc3NvY2lhdGlvbl9udW1iZXIgJiBNS0FfU0FLX1VTRV9QQVJBTV9PTERfS0VZX0FOX01BU0spIDw8IE1LQV9TQUtfVVNFX1BBUkFNX09MRF9LRVlfQU5fU0ZUKTsKICAgICAgICB0bXAgPSB0bXAgfCBNS0FfU0FLX1VTRV9QQVJBTV9PTERfS0VZX1RYX1JYOyAvKiBzaG91bGQgaGF2ZSBiZWVuIHR4ICYgcnggKi8KICAgIH0KICAgIG9wdGlvbjEgfD0gdG1wOwoKICAgIC8qIG9wdGlvbiAyOiBvbmx5IHNldCBiaXQgNyw2KHBsYWluIHR4ICYgcGxhaW4gcngpLiBhbGwgb3RoZXIgYml0cyBpbmNsdWRpbmcgNCBiaXRzIGxlbmd0aCBmaWVsZCBzaG91bGQgYmUgMCAqLwogICAgb3B0aW9uMiA9IE1LQV9TQUtfVVNFX1BBUkFNX1NFQ09ORF9PUFRfQllURTsKCiAgICAvKiBuZWVkIHRvIGRlY3JlbWVudCBrZXkgbnVtYmVyIGZvciBvbGQga2V5IChiZWNhdXNlIGtleSBudW1lciBtYXkgYmUgYWxyZWFkeSBpbmNyZW1lbnRlZCkgKi8KICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIgPT0gMSkgLyogaW5pdGlhbCBudW1iZXIgKi8KICAgIHsKICAgICAgICBvbGRfa24gPSAxOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG9sZF9rbiA9IGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlciAtIDE7CiAgICB9CgogICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9NQUNTRUNfU0FLX1VTRSkgfHwKICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBvcHRpb24xKSB8fAogICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIG9wdGlvbjIpIHx8CiAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtBX1NBS19VU0VfUEFSQU1fQk9EWV9MRU4pIHx8CiAgICAgICAgIWJjbW9sdF9idWZfd3JpdGUob3V0X2J1ZiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbHRfbWVtYmVyX2lkLCBNS0FfTUlfTEVOKSB8fAogICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3UzMl9iZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIpIHx8CiAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKG91dF9idWYsIDEpIHx8IC8qIExvd2VzdCBhY2NlcHRhYmxlIFBOLCBzdGFydCBmcm9tIDEgKi8KICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9sdF9tZW1iZXJfaWQsIE1LQV9NSV9MRU4pIHx8CiAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKG91dF9idWYsIG9sZF9rbikgfHwKICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUob3V0X2J1ZiwgMSkpCiAgICB7CiAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOwogICAgfQoKICAgIHJldHVybiBCQ01PU19UUlVFOwp9CgovKiBDYWxjdWxhdGUgSUNWIGFuZCBhdHRhY2ggaXQgYXQgdGhlIGVuZCBvZiBNS1BEVSAqLwpzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2NhbGNfYW5kX2F0dGFjaF9pY3YobWthX2xpbmtfaW5mbyAqbWthX2luZm8sIGJjbW9sdF9idWYgKm91dF9idWYpCnsKICAgIHVpbnQ4X3QgaWNrW01LQV9LRVlfTEVOXTsKICAgIHVpbnQ4X3QgaWN2W01LQV9LRVlfTEVOXTsKCiAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLwogICAgQlVHX09OKG1rYV9pbmZvID09IE5VTEwpOwogICAgQlVHX09OKG91dF9idWYgPT0gTlVMTCk7CgogICAgX21rYV9jYWxjX2ljayhpY2ssIG1rYV9pbmZvLT5jYWssIG1rYV9pbmZvLT5ja24pOwoKICAgIC8qIElDViB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBEQSB0byBlbmQgb2YgSUNWIGluZGljYXRvciAqLwogICAgX21rYV9jYWxjX2ljdihpY3YsIGljaywgb3V0X2J1Zi0+c3RhcnQsICh1aW50MTZfdCliY21vbHRfYnVmX2dldF91c2VkKG91dF9idWYpKTsKCiAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZShvdXRfYnVmLCBpY3YsIE1LQV9LRVlfTEVOKTsKfQoKLyogU2VuZCB0aGUgZmlyc3QgTUtBIGZyYW1lIHRvIE9OVSAqLwpzdGF0aWMgYmNtb3NfYm9vbCBfbWthX3NlbmRfaW5pdF9mcmFtZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCnsKICAgIGJjbW9sdF9idWYgb3V0X2J1ZjsKICAgIHVpbnQ4X3QgZnJhbWVbTUtBX1BEVV9NQVhfRlJBTUVfTEVOXTsKICAgIGJjbW9zX2Jvb2wgcmV0ID0gQkNNT1NfRkFMU0U7CgogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CgogICAgYmNtb2x0X2J1Zl9pbml0KCZvdXRfYnVmLCBNS0FfUERVX01BWF9GUkFNRV9MRU4sIGZyYW1lLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CiAgICAvKiBjb25zdHJ1Y3QgZnJhbWUgKi8KICAgIGlmICghX21rYV9idWlsZF9lYXBvbF9oZWFkZXIobGlua19yZWMsICZvdXRfYnVmLCBNS0FfT0xUX0lOSVRfRlJBTUVfTEVOKSB8fAogICAgICAgICFfbWthX2J1aWxkX2Jhc2ljX3BhcmFtZXRlcl9zZXQobGlua19yZWMsICZvdXRfYnVmKSB8fAogICAgICAgICFfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdCgmb3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX0xJVkVfUEVFUl9MSVNUKSB8fAogICAgICAgICFfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdCgmb3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpIHx8CiAgICAgICAgIV9ta2FfYnVpbGRfaWN2X2luZGljYXRvcigmb3V0X2J1ZikgfHwKICAgICAgICAhX21rYV9jYWxjX2FuZF9hdHRhY2hfaWN2KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgJm91dF9idWYpKSAvKiBsYXN0IGltcG9ydGFudCBzdGVwLiBDYWxjICYgYXR0YWNoIElDViAqLwogICAgewogICAgICAgIHJldHVybiByZXQ7CiAgICB9CgogICAgaWYgKEJDTV9FUlJfT0sgPT0gZHBvZV9zZWNfc2VuZF9lYXBvbChsaW5rX3JlYy0+ZGV2aWNlLCAmbGlua19yZWMtPmtleSwgZnJhbWUsIGJjbW9sdF9idWZfZ2V0X3VzZWQoJm91dF9idWYpKSkKICAgIHsKICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+cnhfdGltZXIsIE1LQV9MSUZFX1RJTUUgKiAxMDAwKTsKICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+dHhfdGltZXIsIE1LQV9IRUxMT19USU1FICogMTAwMCk7CiAgICAgICAgcmV0ID0gQkNNT1NfVFJVRTsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgovKiBHZW5lcmF0ZSBhIFNBSyB1c2luZyBSTkcgKi8Kdm9pZCBta2FfZ2VuZXJhdGVfc2FrKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb3NfYm9vbCBpbml0aWFsKQp7CiAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLwogICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOwogICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKCiAgICAvKiBHZW5lcmF0ZSBTQUsgKi8KICAgIGlmIChpbml0aWFsKQogICAgewogICAgICAgIF9ta2FfY2FsY19rZWsobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZWssIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNrbik7CiAgICAgICAgZHBvZV9zZWNfZ2VuZXJhdGVfbl9ieXRlX3JhbmRvbV9udW1iZXIobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5zYWssIE1LQV9LRVlfTEVOKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBkcG9lX3NlY19nZW5lcmF0ZV9uX2J5dGVfcmFuZG9tX251bWJlcihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm5ld19zYWssIE1LQV9LRVlfTEVOKTsKICAgIH0KfQoKLyogU2VuZCB0aGUgU0FLIHRvIHRoZSBPTlUgKi8KYmNtb3NfZXJybm8gbWthX3NlbmRfc2FrKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgdWludDhfdCAqc2FrKQp7CiAgICBiY21vbHRfYnVmIG91dF9idWY7CiAgICB1aW50OF90IGZyYW1lW01LQV9QRFVfTUFYX0ZSQU1FX0xFTl07CiAgICB1aW50OF90IGtleV93cmFwcGVkX3Nha1tNS0FfS0VZX0xFTiAqIDJdID0ge307CiAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfQ09NTV9GQUlMOwogICAgZHBvZV9zZWNfYWVzX2tleSBhZXNfa2V5OwoKICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCiAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CiAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOwoKICAgIGJjbW9sdF9idWZfaW5pdCgmb3V0X2J1ZiwgTUtBX1BEVV9NQVhfRlJBTUVfTEVOLCBmcmFtZSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOwogICAgLyoga2V5IHdyYXAgc2FrIHVzaW5nIGtlayAqLwogICAgZHBvZV9zZWNfYWVzX3NldF9lbmNyeXB0X2tleShsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtlaywgTUtBX0tFS19MRU4sICZhZXNfa2V5KTsKICAgIGRwb2Vfc2VjX2Flc193cmFwX2tleSgmYWVzX2tleSwga2V5X3dyYXBwZWRfc2FrLCBzYWssIE1LQV9TQUtfTEVOKTsKCiAgICAvKiBjb25zdHJ1Y3QgZnJhbWUgKi8KICAgIGlmICghX21rYV9idWlsZF9lYXBvbF9oZWFkZXIoCiAgICAgICAgICAgIGxpbmtfcmVjLAogICAgICAgICAgICAmb3V0X2J1ZiwKICAgICAgICAgICAgTUtBX09MVF9JTklUX0ZSQU1FX0xFTiArIE1LQV9PTkVfUEVFUl9MRU4gKyBNS0FfRElTVFJJQlVURURfU0FLX0xFTiArIE1LQV9TQUtfVVNFX1BBUkFNX0xFTSkgfHwKICAgICAgICAhX21rYV9idWlsZF9iYXNpY19wYXJhbWV0ZXJfc2V0KGxpbmtfcmVjLCAmb3V0X2J1ZikgfHwKICAgICAgICAhX21rYV9idWlsZF9wZWVyX2xpc3QoCiAgICAgICAgICAgICZvdXRfYnVmLAogICAgICAgICAgICBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QsCiAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tZW1lYmVyX2lkLAogICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbXNnX251bSkgfHwKICAgICAgICAhX21rYV9idWlsZF9lbXB0eV9wZWVyX2xpc3QoJm91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9QT1RFTlRJQUxfUEVFUl9MSVNUKSB8fAogICAgICAgICFfbWthX2J1aWxkX2Rpc3RyaWJ1dGVkX3NhayhsaW5rX3JlYywgJm91dF9idWYsIGtleV93cmFwcGVkX3NhaykgfHwKICAgICAgICAhX21rYV9idWlsZF9zYWtfdXNlX3BhcmFtKGxpbmtfcmVjLCAmb3V0X2J1ZiwgQkNNT1NfRkFMU0UsIEJDTU9TX1RSVUUpIHx8IC8qIHNldCBSWCBvbmx5ICovCiAgICAgICAgIV9ta2FfYnVpbGRfaWN2X2luZGljYXRvcigmb3V0X2J1ZikpCiAgICB7CiAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CiAgICB9CgogICAgLyogbGFzdCBpbXBvcnRhbnQgc3RlcC4gQ2FsYyAmIGF0dGFjaCBJQ1YgKi8KICAgIF9ta2FfY2FsY19hbmRfYXR0YWNoX2ljdihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sICZvdXRfYnVmKTsKCiAgICBpZiAoQkNNX0VSUl9PSyA9PSBkcG9lX3NlY19zZW5kX2VhcG9sKGxpbmtfcmVjLT5kZXZpY2UsICZsaW5rX3JlYy0+a2V5LCBmcmFtZSwgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmb3V0X2J1ZikpKQogICAgewogICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT50eF90aW1lciwgTUtBX0hFTExPX1RJTUUgKiAxMDAwKTsKICAgICAgICByYyA9IEJDTV9FUlJfT0s7CiAgICB9CgogICAgcmV0dXJuIHJjOwp9CgovKiBSZWNlaXZlZCBTQUsgcmVzcG9uc2UuIFNlbmQgY29uZmlybSBmcmFtZSB0byBPTlUgKi8Kc3RhdGljIGJjbW9zX2Jvb2wgX21rYV9zZW5kX3Nha19jb25maXJtX2ZyYW1lKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKewogICAgYmNtb2x0X2J1ZiBvdXRfYnVmOwogICAgdWludDhfdCBmcmFtZVtNS0FfUERVX01BWF9GUkFNRV9MRU5dOwoKICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCiAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CiAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOwoKICAgIGJjbW9sdF9idWZfaW5pdCgmb3V0X2J1ZiwgTUtBX1BEVV9NQVhfRlJBTUVfTEVOLCBmcmFtZSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOwogICAgaWYgKCFfbWthX2J1aWxkX2VhcG9sX2hlYWRlcihsaW5rX3JlYywgJm91dF9idWYsIE1LQV9PTFRfSU5JVF9GUkFNRV9MRU4gKyBNS0FfT05FX1BFRVJfTEVOICsgTUtBX1NBS19VU0VfUEFSQU1fTEVNKSB8fAogICAgICAgICFfbWthX2J1aWxkX2Jhc2ljX3BhcmFtZXRlcl9zZXQobGlua19yZWMsICZvdXRfYnVmKSB8fAogICAgICAgICFfbWthX2J1aWxkX3BlZXJfbGlzdCgKICAgICAgICAgICAgJm91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9MSVZFX1BFRVJfTElTVCwKICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21lbWViZXJfaWQsCiAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tc2dfbnVtKSB8fAogICAgICAgICFfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdCgmb3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpIHx8CiAgICAgICAgIV9ta2FfYnVpbGRfc2FrX3VzZV9wYXJhbShsaW5rX3JlYywgJm91dF9idWYsIEJDTU9TX1RSVUUsIEJDTU9TX1RSVUUpIHx8CiAgICAgICAgIV9ta2FfYnVpbGRfaWN2X2luZGljYXRvcigmb3V0X2J1ZikpCiAgICB7CiAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOwogICAgfQoKICAgIC8qIGxhc3QgaW1wb3J0YW50IHN0ZXAuIENhbGMgJiBhdHRhY2ggSUNWICovCiAgICBfbWthX2NhbGNfYW5kX2F0dGFjaF9pY3YobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLCAmb3V0X2J1Zik7CgogICAgcmV0dXJuIEJDTV9FUlJfT0sgPT0gZHBvZV9zZWNfc2VuZF9lYXBvbChsaW5rX3JlYy0+ZGV2aWNlLCAmbGlua19yZWMtPmtleSwgZnJhbWUsIGJjbW9sdF9idWZfZ2V0X3VzZWQoJm91dF9idWYpKTsKfQoKLyogc2VuZCBrZWVwLWFsaXZlIGZyYW1lIGV2ZXJ5IDIgc2Vjb25kcyAqLwpzdGF0aWMgYmNtb3NfYm9vbCBfbWthX3NlbmRfa2VlcGFsaXZlX2ZyYW1lKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKewogICAgYmNtb2x0X2J1ZiBvdXRfYnVmOwogICAgdWludDhfdCBmcmFtZVtNS0FfUERVX01BWF9GUkFNRV9MRU5dOwoKICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCiAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CiAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOwoKICAgIGJjbW9sdF9idWZfaW5pdCgmb3V0X2J1ZiwgTUtBX1BEVV9NQVhfRlJBTUVfTEVOLCBmcmFtZSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOwogICAgaWYgKCFfbWthX2J1aWxkX2VhcG9sX2hlYWRlcihsaW5rX3JlYywgJm91dF9idWYsIE1LQV9PTFRfSU5JVF9GUkFNRV9MRU4gKyBNS0FfT05FX1BFRVJfTEVOKSB8fAogICAgICAgICFfbWthX2J1aWxkX2Jhc2ljX3BhcmFtZXRlcl9zZXQobGlua19yZWMsICZvdXRfYnVmKSB8fAogICAgICAgICFfbWthX2J1aWxkX3BlZXJfbGlzdCgKICAgICAgICAgICAgJm91dF9idWYsCiAgICAgICAgICAgIE1LUERVX1BBUkFNX1NFVF9MSVZFX1BFRVJfTElTVCwKICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21lbWViZXJfaWQsCiAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tc2dfbnVtKSB8fAogICAgICAgICFfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdCgmb3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpIHx8CiAgICAgICAgIV9ta2FfYnVpbGRfaWN2X2luZGljYXRvcigmb3V0X2J1ZikpCiAgICB7CiAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOwogICAgfQoKICAgIC8qIGxhc3QgaW1wb3J0YW50IHN0ZXAuIENhbGMgJiBhdHRhY2ggSUNWICovCiAgICBfbWthX2NhbGNfYW5kX2F0dGFjaF9pY3YobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLCAmb3V0X2J1Zik7CgogICAgcmV0dXJuIEJDTV9FUlJfT0sgPT0gZHBvZV9zZWNfc2VuZF9lYXBvbChsaW5rX3JlYy0+ZGV2aWNlLCAmbGlua19yZWMtPmtleSwgZnJhbWUsIGJjbW9sdF9idWZfZ2V0X3VzZWQoJm91dF9idWYpKTsKfQoKLyogRW50cnkgcG9pbnQgZm9yIE1LQSBwcm9jZXNzLiBJdCBpcyBjYWxsZWQgdG8gc3RhcnQgdGhlIE1LQSBleGNoYW5nZSB3aXRoIHRoZSBPTlUgdGhhdCBvd25zIHRoZSBzcGVjaWZpZWQgbGluay4gKi8KYmNtb3NfZXJybm8gbWthX3N0YXJ0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKewogICAgYmNtb3NfZXJybm8gcmM7CgogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CgogICAgLyogaW5pdGlhbGl6ZSBsaW5rIE1LQSBpbmZvICovCiAgICBfbWthX2luaXRfbGlua19pbmZvKGxpbmtfcmVjKTsKCiAgICAvKiBzZW5kIGluaXRpYWwgZnJhbWUgKGJhc2ljIHBhcmFtICsgZW1wdHkgbGl2ZSAmIHBvdGVudGlhbCBwZWVyIGxpc3QgKi8KICAgIGlmIChfbWthX3NlbmRfaW5pdF9mcmFtZShsaW5rX3JlYykpCiAgICB7CiAgICAgICAgcmMgPSBCQ01fRVJSX09LOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJjID0gQkNNX0VSUl9DT01NX0ZBSUw7CiAgICB9CgogICAgcmV0dXJuIHJjOwp9CgovKiBDYWxjdWxhdGUgdGhlIElDViBvdmVyIHRoZSBtZXNzYWdlIGFuZCBjb21wYXJlIHdpdGggdGhlIElDViBpbiB0aGUgbWVzc2FnZS4gKi8Kc3RhdGljIGJjbW9zX2Vycm5vIF9ta2FfY29tcGFyZV9pY3YobWthX2xpbmtfaW5mbyAqaW5mbywgY29uc3QgbWthX2V2ZW50ICptc2csIHVpbnQ4X3QgKnJ4X2ljdikKewogICAgdWludDE2X3QgbGVuID0gMDsKICAgIHVpbnQ4X3QgaWN2W01LQV9JQ1ZfTEVOXTsKCiAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLwogICAgQlVHX09OKGluZm8gPT0gTlVMTCk7CiAgICBCVUdfT04obXNnID09IE5VTEwpOwoKICAgIC8qIElmIHRoZSBJQ1YgcG9pbnRlciBpcyBOVUxMLCB0aGVuIHRoZXJlIHdhcyBubyBJQ1YgaW4gdGhlIHJlY2VpdmVkIE1LQSBwYWNrZXQuIEp1c3QgcmV0dXJuIGFuIGVycm9yLiAqLwogICAgaWYgKHJ4X2ljdiA9PSBOVUxMKQogICAgewogICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CiAgICB9CgogICAgLyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBvdmVyIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgSUNWLiAqLwogICAgbGVuID0gKEVBUE9MX01TR19IRFJfU0laRSArIG1zZy0+bXNnLT5lYXBvbF9sZW5ndGgpIC0gTUtBX0lDVl9MRU47CgogICAgX21rYV9jYWxjX2ljdihpY3YsIGluZm8tPmljaywgbXNnLT5idWYtPnN0YXJ0LCBsZW4pOwoKICAgIGlmIChtZW1jbXAoaWN2LCByeF9pY3YsIHNpemVvZihpY3YpKSAhPSAwKQogICAgewogICAgICAgIHJldHVybiBCQ01fRVJSX09OVV9FUlJfUkVTUDsKICAgIH0KCiAgICByZXR1cm4gQkNNX0VSUl9PSzsKfQoKLyogUGFyc2UgdGhlIEJhc2ljIFBhcmFtZXRlciBTZXQgaW4gTUtBIFBEVXMgKi8Kc3RhdGljIGJjbW9zX2Vycm5vIF9ta2FfcGFyc2VfYmFzaWNfcGFyYW1fc2V0KAogICAgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLAogICAgYmNtb2x0X2J1ZiAqYnVmLAogICAgdWludDE2X3QgKmJ5dGVzX3JlYWQsCiAgICB1aW50MTZfdCBib2R5X2xlbiwKICAgIHVpbnQ4X3QgKnNjaSwKICAgIHVpbnQ4X3QgKm1lbWJlcl9pZCwKICAgIHVpbnQzMl90ICptc2dfbnVtKQp7CiAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLwogICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOwogICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKICAgIEJVR19PTihieXRlc19yZWFkID09IE5VTEwpOwoKICAgIC8qIFJlYWQgdGhlIE9OVSBTQ0kgKi8KICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1Ziwgc2NpLCBNS0FfU0NJX0xFTikpCiAgICB7CiAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CiAgICB9CgogICAgLyogUmVhZCB0aGUgTWVtYmVyIElEICovCiAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIG1lbWJlcl9pZCwgTUtBX01JX0xFTikpCiAgICB7CiAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CiAgICB9CgogICAgLyogUmVhZCB0aGUgT05VIG1lc3NhZ2UgbnVtYmVyLiAqLwogICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyX2JlKGJ1ZiwgbXNnX251bSkpCiAgICB7CiAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CiAgICB9CgogICAgLyogVGhlIFNDSSwgTUksIGFuZCBNTiB3ZXJlIHJlYWQgZnJvbSB0aGUgcGFja2V0LiAqLwogICAgKmJ5dGVzX3JlYWQgPSBNS0FfU0NJX0xFTiArIE1LQV9NSV9MRU4gKyBNS0FfTU5fTEVOOwoKICAgIC8qIFNraXAgdGhlIHJlc3QgKi8KICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKGJ1ZiwgYm9keV9sZW4gLSAqYnl0ZXNfcmVhZCkpCiAgICB7CiAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CiAgICB9CgogICAgcmV0dXJuIEJDTV9FUlJfT0s7Cn0KCnN0YXRpYyBiY21vc19lcnJubyBfbWthX3dhaXRpbmdfaW5pdGlhbF9yZXNwb25zZV9kYXRhX2luZChta2FfZXZlbnQgKm1zZywgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQp7CiAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfUEFSU0U7CiAgICB1aW50OF90ICppY3ZfcHRyOwogICAgdWludDhfdCBwYXJhbV9zZXRfdHlwZTsKICAgIHVpbnQxNl90IGJvZHlfbGVuOwogICAgYmNtb3NfYm9vbCBiYXNpY19wYXJhbV9zZXRfZXhpc3QgPSBCQ01PU19GQUxTRTsKICAgIGJjbW9zX2Jvb2wgbGl2ZV9wZWVyX2xpc3RfZXhpc3QgPSBCQ01PU19GQUxTRTsKICAgIGJjbW9zX2Jvb2wgcG90ZW50aWFsX3BlZXJfbGlzdF9leGlzdCA9IEJDTU9TX0ZBTFNFOwogICAgdWludDE2X3QgYnl0ZXNfcmVhZDsKCiAgICAvKiBWYWxpZGF0ZSB0aGUgbXNnIHBvaW50ZXIuICovCiAgICBCVUdfT04obXNnLT5idWYgPT0gTlVMTCk7CiAgICBCVUdfT04obXNnLT5tc2cgPT0gTlVMTCk7CgogICAgLyogbWFyayBJQ1YgZmllbGQgb2Zmc2V0ICovCiAgICBpY3ZfcHRyID0gbXNnLT5idWYtPmN1cnIgKyAobXNnLT5tc2ctPmVhcG9sX2xlbmd0aCAtIE1LQV9JQ1ZfTEVOKTsKCiAgICAvKiBWYWxpZGF0ZSB0aGUgSW50ZWdyaXR5IENoZWNrIFZhbHVlIGJlZm9yZSBjb250aW51aW5nIHRvIHByb2Nlc3MgdGhlIHBhY2tldC4gKi8KICAgIHJjID0gX21rYV9jb21wYXJlX2ljdihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sIG1zZywgaWN2X3B0cik7CiAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSByYywgcmMpOwoKICAgIHdoaWxlIChiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZShtc2ctPmJ1ZikgPiAwKQogICAgewogICAgICAgIC8qIERvbid0IHBhcnNlIHBhc3QgdGhlIElDViBQYXJhbWV0ZXIgU2V0ICovCiAgICAgICAgaWYgKGJjbW9sdF9idWZfc25hcF9nZXQobXNnLT5idWYpID49IGljdl9wdHIpCiAgICAgICAgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIC8qIFJlYWQgd2hhdCBzaG91bGQgYmUgdGhlIEJhc2ljIFBhcmFtZXRlciBTZXQgaGVhZGVyLiAqLwogICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KG1zZy0+YnVmLCAmcGFyYW1fc2V0X3R5cGUpIHx8CiAgICAgICAgICAgICFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIDEpIHx8CiAgICAgICAgICAgICFiY21vbHRfYnVmX3JlYWRfdTE2X2JlKG1zZy0+YnVmLCAmYm9keV9sZW4pKQogICAgICAgIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvKiBUaGUgYm9keSBsZW5ndGggaXMgcmVhbGx5IDEyLWJpdHMuICovCiAgICAgICAgYm9keV9sZW4gJj0gMHgwZmZmOwoKICAgICAgICBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX0xJVkVfUEVFUl9MSVNUKQogICAgICAgIHsKICAgICAgICAgICAgLyogbmVlZCB0byBmaW5kIG91dCB3aGV0aGVyIGl0IGlzIEJhc2ljIHBhcmFtZXRlciBzZXQgT1IgTGl2ZSBQZWVyIExpc3QgKi8KICAgICAgICAgICAgaWYgKGJvZHlfbGVuID49IE1LQV9CQVNJQ19QQVJBTV9TRVRfTEVOKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByYyA9IF9ta2FfcGFyc2VfYmFzaWNfcGFyYW1fc2V0KAogICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLAogICAgICAgICAgICAgICAgICAgIG1zZy0+YnVmLAogICAgICAgICAgICAgICAgICAgICZieXRlc19yZWFkLAogICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuLAogICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b251X3NjaSwKICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbWVtZWJlcl9pZCwKICAgICAgICAgICAgICAgICAgICAmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0pOwogICAgICAgICAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAicGFyc2UgYmFzaWMgcGFyYW0gc2V0IGZhaWxlZCFcbiIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhhdCB0aGUgQmFzaWMgUGFyYW1ldGVyIFNldCB3YXMgZm91bmQuICovCiAgICAgICAgICAgICAgICBiYXNpY19wYXJhbV9zZXRfZXhpc3QgPSBCQ01PU19UUlVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogTGl2ZSBQZWVyIExpc3QuIHNraXAgKi8KICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBib2R5X2xlbikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAicGFyc2UgbGl2ZSBwZWVyIGxpc3QgZmFpbGVkIVxuIik7CiAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhhdCB0aGUgTGl2ZSBQZWVyIExpc3QgUGFyYW1ldGVyIFNldCB3YXMgZm91bmQuICovCiAgICAgICAgICAgICAgICBsaXZlX3BlZXJfbGlzdF9leGlzdCA9IEJDTU9TX1RSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpCiAgICAgICAgewogICAgICAgICAgICB1aW50OF90IG1pW01LQV9NSV9MRU5dOwoKICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQobXNnLT5idWYsIG1pLCBzaXplb2YobWkpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAicGFyc2UgcG90ZW50aWFsIHBlZXIgbGlzdCBmYWlsZWQhXG4iKTsKICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCB0aGUgT0xUIG1lbWJlciBJRCBpbiB0aGUgUG90ZW50aWFsIFBlZXIgTGlzdCBQYXJhbWV0ZXIgU2V0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIE9MVCBtZW1iZXIKICAgICAgICAgICAgICAgSUQuICovCiAgICAgICAgICAgIGlmIChtZW1jbXAobWksIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b2x0X21lbWJlcl9pZCwgTUtBX01JX0xFTikgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAid3JvbmcgbWVtYmVyIElEIVxuIik7CiAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIFNraXAgdGhlIHJlbWFpbmluZyBieXRlcy4gKi8KICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuIC0gTUtBX01JX0xFTikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgImJ1ZmZlciBvdmVyZmxvdyFcbiIpOwogICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIE1hcmsgdGhhdCB0aGUgUG90ZW50aWFsIFBlZXIgTGlzdCBQYXJhbWV0ZXIgU2V0IHdhcyBmb3VuZC4gKi8KICAgICAgICAgICAgcG90ZW50aWFsX3BlZXJfbGlzdF9leGlzdCA9IEJDTU9TX1RSVUU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIFNraXAgb3RoZXIgUGFyYW1ldGVyIFNldCBkYXRhLiAqLwogICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJidWZmZXIgb3ZlcmZsb3chXG4iKTsKICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICgocmMgPT0gQkNNX0VSUl9PSykgJiYKICAgICAgICBiYXNpY19wYXJhbV9zZXRfZXhpc3QgJiYKICAgICAgICBsaXZlX3BlZXJfbGlzdF9leGlzdCAmJgogICAgICAgIHBvdGVudGlhbF9wZWVyX2xpc3RfZXhpc3QgJiYKICAgICAgICAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5wZWVyX3N0YXRlICE9IE1LQV9QRUVSX1NUQVRFX0xJVkUpKQogICAgewogICAgICAgIC8qIHByb2NlZWQgdG8gbmV4dCBzdGF0ZSAqLwogICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cGVlcl9zdGF0ZSA9IE1LQV9QRUVSX1NUQVRFX0xJVkU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKICAgIH0KCiAgICByZXR1cm4gcmM7Cn0KCi8qIEhhbmRsZXIgZm9yIGluaXRpYWwgcmVzcG9uc2UgZnJvbSB0aGUgT05VICovCnN0YXRpYyBiY21vc19lcnJubyBfbWthX3dhaXRpbmdfaW5pdGlhbF9yZXNwb25zZShta2FfZXZlbnQgKm1zZywgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQp7CiAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CgogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CiAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CiAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOwoKICAgIHN3aXRjaCAobXNnLT50eXBlKQogICAgewogICAgICAgIGNhc2UgTUtBX01TR19USU1FT1VUOgogICAgICAgICAgICAvKiByZXRyeSAzIHRpbWVzICovCiAgICAgICAgICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnJldHJ5X2NudCA8IE1LQV9JTklUX1JFVFJZX0NOVCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5yZXRyeV9jbnQrKzsKICAgICAgICAgICAgICAgICh2b2lkKV9ta2Ffc2VuZF9pbml0X2ZyYW1lKGxpbmtfcmVjKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9ta2FfY2xlYXJfbGlua19pbmZvKGxpbmtfcmVjKTsKICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9USU1FT1VUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE1LQV9NU0dfREFUQV9JTkQ6CiAgICAgICAgICAgIHJjID0gX21rYV93YWl0aW5nX2luaXRpYWxfcmVzcG9uc2VfZGF0YV9pbmQobXNnLCBsaW5rX3JlYyk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOwogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gcmM7Cn0KCnN0YXRpYyBiY21vc19lcnJubyBfbWthX2luaXRpYWxfc2FrX3NlbnRfZGF0YV9pbmQobWthX2V2ZW50ICptc2csIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKewogICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX1BBUlNFOwogICAgdWludDhfdCAqaWN2X3B0cjsKICAgIHVpbnQ4X3QgcGFyYW1fc2V0X3R5cGU7CiAgICB1aW50OF90IGtzX3ByaW9yaXR5OwogICAgdWludDE2X3QgYm9keV9sZW47CiAgICBiY21vc19ib29sIGJhc2ljX3BhcmFtX29rID0gQkNNT1NfRkFMU0U7CiAgICBiY21vc19ib29sIGxpdmVfcGVlcl9saXN0X29rID0gQkNNT1NfRkFMU0U7CiAgICBiY21vc19ib29sIHBvdGVudGlhbF9wZWVyX2xpc3Rfb2sgPSBCQ01PU19GQUxTRTsKICAgIGJjbW9zX2Jvb2wgc2FrX3VzZV9wYXJhbV9vayA9IEJDTU9TX0ZBTFNFOwogICAgdWludDE2X3QgYnl0ZXNfcmVhZDsKCiAgICAvKiBWYWxpZGF0ZSB0aGUgbXNnIHBvaW50ZXIuICovCiAgICBCVUdfT04obXNnLT5tc2cgPT0gTlVMTCk7CiAgICBCVUdfT04obXNnLT5idWYgPT0gTlVMTCk7CgogICAgLyogbWFyayBJQ1YgZmllbGQgb2Zmc2V0ICovCiAgICBpY3ZfcHRyID0gbXNnLT5idWYtPmN1cnIgKyAobXNnLT5tc2ctPmVhcG9sX2xlbmd0aCAtIE1LQV9JQ1ZfTEVOKTsKCiAgICAvKiBWYWxpZGF0ZSB0aGUgSW50ZWdyaXR5IENoZWNrIFZhbHVlIGJlZm9yZSBjb250aW51aW5nIHRvIHByb2Nlc3MgdGhlIHBhY2tldC4gKi8KICAgIHJjID0gX21rYV9jb21wYXJlX2ljdihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sIG1zZywgaWN2X3B0cik7CiAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSByYywgcmMpOwoKICAgIHdoaWxlIChiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZShtc2ctPmJ1ZikgPiAwKQogICAgewogICAgICAgIC8qIERvbid0IHBhcnNlIHBhc3QgdGhlIElDViBQYXJhbWV0ZXIgU2V0ICovCiAgICAgICAgaWYgKGJjbW9sdF9idWZfc25hcF9nZXQobXNnLT5idWYpID49IGljdl9wdHIpCiAgICAgICAgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIC8qIFJlYWQgd2hhdCBzaG91bGQgYmUgdGhlIEJhc2ljIFBhcmFtZXRlciBTZXQgaGVhZGVyLiAqLwogICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KG1zZy0+YnVmLCAmcGFyYW1fc2V0X3R5cGUpIHx8CiAgICAgICAgICAgICFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZrc19wcmlvcml0eSkgfHwKICAgICAgICAgICAgIWJjbW9sdF9idWZfcmVhZF91MTZfYmUobXNnLT5idWYsICZib2R5X2xlbikpCiAgICAgICAgewogICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLyogVGhlIGJvZHkgbGVuZ3RoIGlzIHJlYWxseSAxMi1iaXRzLiAqLwogICAgICAgIGJvZHlfbGVuICY9IDB4MGZmZjsKCiAgICAgICAgaWYgKHBhcmFtX3NldF90eXBlID09IE1LUERVX1BBUkFNX1NFVF9MSVZFX1BFRVJfTElTVCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIG5lZWQgdG8gZmluZCBvdXQgd2hldGhlciBpdCBpcyBCYXNpYyBwYXJhbWV0ZXIgc2V0IE9SIExpdmUgUGVlciBMaXN0ICovCiAgICAgICAgICAgIGlmIChib2R5X2xlbiA+PSBNS0FfQkFTSUNfUEFSQU1fU0VUX0xFTikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogaW4gb3VyIGVudmlyb25tZW50LCBPTlUgY2FuIG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgbGl2ZSBwZWVyLiBTbywganVzdCBzZWVpbmcgcGFyYW0gc2V0IGJvZHkgbGVuCiAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgZ29vZCBlbm91Z2guICovCiAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW5rX21uOwogICAgICAgICAgICAgICAgdWludDhfdCBzY2lbTUtBX1NDSV9MRU5dOwogICAgICAgICAgICAgICAgdWludDhfdCBtaVtNS0FfTUlfTEVOXTsKCiAgICAgICAgICAgICAgICByYyA9IF9ta2FfcGFyc2VfYmFzaWNfcGFyYW1fc2V0KGxpbmtfcmVjLCBtc2ctPmJ1ZiwgJmJ5dGVzX3JlYWQsIGJvZHlfbGVuLCBzY2ksIG1pLCAmbGlua19tbik7CiAgICAgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCBPTlUgU0NJIGlzIHdoYXQncyBleHBlY3RlZC4gKi8KICAgICAgICAgICAgICAgIGlmIChtZW1jbXAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbnVfc2NpLCBzY2ksIE1LQV9TQ0lfTEVOKSAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogVmVyaWZ5IHRoYXQgT05VIE1JIGlzIHdoYXQncyBleHBlY3RlZC4gKi8KICAgICAgICAgICAgICAgIGlmIChtZW1jbXAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21lbWViZXJfaWQsIG1pLCBNS0FfTUlfTEVOKSAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogVmVyaWZ5IHRoYXQgdGhlIE1OIGlzIHdoYXQncyBleHBlY3RlZC4gKi8KICAgICAgICAgICAgICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbXNnX251bSA8IGxpbmtfbW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyogY29ycmVjdCBNTiEgKi8KICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbXNnX251bSA9IGxpbmtfbW47CiAgICAgICAgICAgICAgICAgICAgYmFzaWNfcGFyYW1fb2sgPSBCQ01PU19UUlVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogTGl2ZSBQZWVyIExpc3QuIHNraXAgKi8KICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBib2R5X2xlbikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhhdCB0aGUgTGl2ZSBQZWVyIExpc3QgUGFyYW1ldGVyIFNldCB3YXMgZm91bmQuICovCiAgICAgICAgICAgICAgICBsaXZlX3BlZXJfbGlzdF9vayA9IEJDTU9TX1RSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpCiAgICAgICAgewogICAgICAgICAgICAvKiBTa2lwIFBvdGVudGlhbCBQZWVyIExpc3QgUGFyYW1ldGVyIFNldC4gKi8KICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIE1hcmsgdGhhdCB0aGUgUG90ZW50aWFsIFBlZXIgTGlzdCBQYXJhbWV0ZXIgU2V0IHdhcyBmb3VuZC4gKi8KICAgICAgICAgICAgcG90ZW50aWFsX3BlZXJfbGlzdF9vayA9IEJDTU9TX1RSVUU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHBhcmFtX3NldF90eXBlID09IE1LUERVX1BBUkFNX1NFVF9NQUNTRUNfU0FLX1VTRSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIGNoZWNrIG9ubHkgTGF0ZXN0IGtleSB0eCAmIHJ4IGJpdHMgKGJpdCA0ICYgNSkgKi8KICAgICAgICAgICAgaWYgKChrc19wcmlvcml0eSAmIDB4MzApID09IDB4MzApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNha191c2VfcGFyYW1fb2sgPSBCQ01PU19UUlVFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBTa2lwIHRoZSBNS0EgU0FLIFVzZSBQYXJhbWV0ZXIgU2V0LiAqLwogICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKiBTa2lwIGFsbCBvdGhlciBQYXJhbWV0ZXIgU2V0IGRhdGEuICovCiAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBib2R5X2xlbikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgZ29vZCBzbyBmYXI/ICovCiAgICBpZiAoKHJjID09IEJDTV9FUlJfT0spICYmCiAgICAgICAgYmFzaWNfcGFyYW1fb2sgJiYKICAgICAgICBsaXZlX3BlZXJfbGlzdF9vayAmJgogICAgICAgIHBvdGVudGlhbF9wZWVyX2xpc3Rfb2sgJiYKICAgICAgICBzYWtfdXNlX3BhcmFtX29rKQogICAgewogICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkdvdCBnb29kIE1LQSBTQUsgcmVzcG9uc2VcbiIpOwogICAgfQoKICAgIHJldHVybiByYzsKfQoKLyogUmVzcG9uc2UgZnJhbWUgaGFuZGxlciBmb3IgdGhlIGZpcnN0IFNBSyBmcm9tIHRoZSBPTFQgKi8Kc3RhdGljIGJjbW9zX2Vycm5vIF9ta2FfaW5pdGlhbF9zYWtfc2VudChta2FfZXZlbnQgKm1zZywgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQp7CiAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CgogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CiAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CiAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOwoKICAgIHN3aXRjaCAobXNnLT50eXBlKQogICAgewogICAgICAgIGNhc2UgTUtBX01TR19USU1FT1VUOgogICAgICAgICAgICBfbWthX2NsZWFyX2xpbmtfaW5mbyhsaW5rX3JlYyk7CiAgICAgICAgICAgIHJjID0gQkNNX0VSUl9USU1FT1VUOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBNS0FfTVNHX0RBVEFfSU5EOgogICAgICAgICAgICByYyA9IF9ta2FfaW5pdGlhbF9zYWtfc2VudF9kYXRhX2luZChtc2csIGxpbmtfcmVjKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiByYzsKfQoKc3RhdGljIGJjbW9zX2Vycm5vIF9ta2Ffc2FrX2RvbmVfZGF0YV9pbmQobWthX2V2ZW50ICptc2csIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKewogICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX1BBUlNFOwogICAgdWludDhfdCAqaWN2X3B0cjsKICAgIHVpbnQ4X3QgcGFyYW1fc2V0X3R5cGU7CiAgICB1aW50MTZfdCBib2R5X2xlbjsKICAgIHVpbnQ4X3Qga3NfcHJpb3JpdHk7CiAgICB1aW50MTZfdCBieXRlc19yZWFkOwoKICAgIC8qIFZhbGlkYXRlIHRoZSBtc2cgcG9pbnRlci4gKi8KICAgIEJVR19PTihtc2ctPm1zZyA9PSBOVUxMKTsKICAgIEJVR19PTihtc2ctPmJ1ZiA9PSBOVUxMKTsKCiAgICAvKiBtYXJrIElDViBmaWVsZCBvZmZzZXQgKi8KICAgIGljdl9wdHIgPSBtc2ctPmJ1Zi0+Y3VyciArIChtc2ctPm1zZy0+ZWFwb2xfbGVuZ3RoIC0gTUtBX0lDVl9MRU4pOwoKICAgIC8qIFZhbGlkYXRlIHRoZSBJbnRlZ3JpdHkgQ2hlY2sgVmFsdWUgYmVmb3JlIGNvbnRpbnVpbmcgdG8gcHJvY2VzcyB0aGUgcGFja2V0LiAqLwogICAgcmMgPSBfbWthX2NvbXBhcmVfaWN2KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgbXNnLCBpY3ZfcHRyKTsKICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IHJjLCByYyk7CgogICAgd2hpbGUgKGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKG1zZy0+YnVmKSA+IDApCiAgICB7CiAgICAgICAgLyogRG9uJ3QgcGFyc2UgcGFzdCB0aGUgSUNWIFBhcmFtZXRlciBTZXQgKi8KICAgICAgICBpZiAoYmNtb2x0X2J1Zl9zbmFwX2dldChtc2ctPmJ1ZikgPj0gaWN2X3B0cikKICAgICAgICB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLyogUmVhZCB3aGF0IHNob3VsZCBiZSB0aGUgQmFzaWMgUGFyYW1ldGVyIFNldCBoZWFkZXIuICovCiAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZwYXJhbV9zZXRfdHlwZSkgfHwKICAgICAgICAgICAgIWJjbW9sdF9idWZfcmVhZF91OChtc2ctPmJ1ZiwgJmtzX3ByaW9yaXR5KSB8fAogICAgICAgICAgICAhYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShtc2ctPmJ1ZiwgJmJvZHlfbGVuKSkKICAgICAgICB7CiAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvKiBUaGUgYm9keSBsZW5ndGggaXMgcmVhbGx5IDEyLWJpdHMuICovCiAgICAgICAgYm9keV9sZW4gJj0gMHgwZmZmOwoKICAgICAgICBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX0xJVkVfUEVFUl9MSVNUKQogICAgICAgIHsKICAgICAgICAgICAgLyogbmVlZCB0byBmaW5kIG91dCB3aGV0aGVyIGl0IGlzIEJhc2ljIHBhcmFtZXRlciBzZXQgT1IgTGl2ZSBQZWVyIExpc3QgKi8KICAgICAgICAgICAgaWYgKGJvZHlfbGVuID49IE1LQV9CQVNJQ19QQVJBTV9TRVRfTEVOKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBpbiBvdXIgZW52aXJvbm1lbnQsIE9OVSBjYW4gbm90IGhhdmUgbW9yZSB0aGFuIG9uZSBsaXZlIHBlZXIuIFNvLCBqdXN0IHNlZWluZyBwYXJhbSBzZXQgYm9keSBsZW4KICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBnb29kIGVub3VnaC4gKi8KICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmtfbW47CiAgICAgICAgICAgICAgICB1aW50OF90IHNjaVtNS0FfU0NJX0xFTl07CiAgICAgICAgICAgICAgICB1aW50OF90IG1pW01LQV9NSV9MRU5dOwoKICAgICAgICAgICAgICAgIHJjID0gX21rYV9wYXJzZV9iYXNpY19wYXJhbV9zZXQobGlua19yZWMsIG1zZy0+YnVmLCAmYnl0ZXNfcmVhZCwgYm9keV9sZW4sIHNjaSwgbWksICZsaW5rX21uKTsKICAgICAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIFZlcmlmeSB0aGF0IE9OVSBTQ0kgaXMgd2hhdCdzIGV4cGVjdGVkLiAqLwogICAgICAgICAgICAgICAgaWYgKG1lbWNtcChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9udV9zY2ksIHNjaSwgTUtBX1NDSV9MRU4pICE9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCBPTlUgTUkgaXMgd2hhdCdzIGV4cGVjdGVkLiAqLwogICAgICAgICAgICAgICAgaWYgKG1lbWNtcChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbWVtZWJlcl9pZCwgbWksIE1LQV9NSV9MRU4pICE9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0gPCBsaW5rX21uKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qIGNvcnJlY3QgTU4hICovCiAgICAgICAgICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0gPSBsaW5rX21uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogTGl2ZSBQZWVyIExpc3QuIHNraXAgKi8KICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBib2R5X2xlbikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHBhcmFtX3NldF90eXBlID09IE1LUERVX1BBUkFNX1NFVF9NQUNTRUNfU0FLX1VTRSkKICAgICAgICB7CiAgICAgICAgICAgIHVpbnQzMl90IGxscG47CgogICAgICAgICAgICAvKiBTa2lwIHRvIHRoZSBMTFBOLiAqLwogICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgTUtBX01JX0xFTiArIE1LQV9LTl9MRU4pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogcmVhZCBMYXRlc3QgTG93ZXN0IEFjY2VwdGFibGUgUE4gKi8KICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyX2JlKG1zZy0+YnVmLCAmbGxwbikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAobGxwbiA+IE1LQV9NQVhfQUNDRVBUQUJMRV9QTikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogU2V0IGZsYWcgdG8gaW5kaWNhdGUgU0FLIHJlZnJlc2ggaXMgbmVlZGVkLiAqLwogICAgICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5zYWtfcmVmcmVzaF9uZWVkZWQgPSBCQ01PU19UUlVFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBjaGVjayBvbmx5IExhdGVzdCBrZXkgdHggJiByeCBiaXRzIChiaXQgNCAmIDUpICovCiAgICAgICAgICAgIGlmICgoa3NfcHJpb3JpdHkgJiAweDMwKSAhPSAweDMwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBXcm9uZyBMSyBGbGFnICovIC8qIFRPRE86IHdoeSBpc24ndCB0aGlzIGFuIGVycm9yPyAqLwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBUaGUgTUksIEtOLCBhbmQgTExQTiB3ZXJlIHJlYWQuICovCiAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSBib2R5X2xlbiAtIChNS0FfTUlfTEVOICsgTUtBX0tOX0xFTiArIHNpemVvZih1aW50MzJfdCkpOwoKICAgICAgICAgICAgLyogU2tpcCB0aGUgcmVzdCAqLwogICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYnl0ZXNfcmVhZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIFNraXAgYWxsIG90aGVyIFBhcmFtZXRlciBTZXQgZGF0YS4gKi8KICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogcmVmcmVzaCByZXRyeSBjb3VudC4gVGhpcyBpcyBhIENyaXRpY2FsIGNvdW50ZXIgKi8KICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmV0cnlfY250ID0gMDsKCiAgICByZXR1cm4gcmM7Cn0KCi8qIE1LQSBmcmFtZSBoYW5kbGVyIGZvciBzdGFibGUgc3RhdGUgKi8Kc3RhdGljIGJjbW9zX2Vycm5vIF9ta2Ffc2FrX2RvbmUobWthX2V2ZW50ICptc2csIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKewogICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOwoKICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCiAgICBCVUdfT04obXNnID09IE5VTEwpOwogICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOwogICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKCiAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKICAgIHsKICAgICAgICBjYXNlIE1LQV9NU0dfVElNRU9VVDoKICAgICAgICAgICAgLyogc2VuZCBrZWVwYWxpdmUgZnJhbWUgYXQgZXZlcnkgMiBzZWNvbmRzICovCiAgICAgICAgICAgICh2b2lkKV9ta2Ffc2VuZF9rZWVwYWxpdmVfZnJhbWUobGlua19yZWMpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBNS0FfTVNHX0RBVEFfSU5EOgogICAgICAgICAgICByYyA9IF9ta2Ffc2FrX2RvbmVfZGF0YV9pbmQobXNnLCBsaW5rX3JlYyk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOwogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gcmM7Cn0KCi8qIFZhbGlkYXRlIHRoZSBNS0EgcGFja2V0LiAqLwpzdGF0aWMgYmNtb3NfYm9vbCBfbWthX3ZhbGlkYXRlX3BrdChiY21vbHRfdThfbGlzdF91MTYgbWthX21zZywgZWFwb2xfbXNnX2hkciAqZWFwb2wpCnsKICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCiAgICBCVUdfT04oZWFwb2wgPT0gTlVMTCk7CgogICAgLyogVGhpcyBoYWQgYmV0dGVyIGJlIGFuIE1LQSBwYWNrZXQuICovCiAgICBpZiAoZWFwb2wtPmVhcG9sX3BhY2tldF90eXBlICE9IEVBUE9MX1RZUEVfTUtBKQogICAgewogICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKICAgIH0KCiAgICAvKiBUaGUgRUFQT0wgbGVuZ3RoIHBsdXMgdGhlIHNpemUgb2YgdGhlIEVhcG9sTXNnSGRyIG11c3QgZXF1YWwgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0LiAqLwogICAgaWYgKG1rYV9tc2cubGVuICE9IChlYXBvbC0+ZWFwb2xfbGVuZ3RoICsgRUFQT0xfTVNHX0hEUl9TSVpFKSkKICAgIHsKICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CiAgICB9CgogICAgLyogVGhlIEVBUE9MIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bSBzdXBwb3J0ZWQgbGVuZ3RoLCBFdGhlcm5ldCArIEVBUE9MIGhlYWRlciBsZW5ndGguICovCiAgICBpZiAoZWFwb2wtPmVhcG9sX2xlbmd0aCA8IE1LQV9QRFVfTUlOX0xFTkdUSCkKICAgIHsKICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CiAgICB9CgogICAgLyogVGhlIEVBUE9MIGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZm91ci4gKi8KICAgIGlmICgoZWFwb2wtPmVhcG9sX2xlbmd0aCAlIDQpICE9IDApCiAgICB7CiAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOwogICAgfQoKICAgIHJldHVybiBCQ01PU19UUlVFOwp9CgovKiBXcmFwcGVyIGludG8gdGhlIE1LQSBjb2RlIHRoYXQgc2VuZHMgYW4gU0FLIENvbmZpcm0gcmVzcG9uc2UgdG8gdGhlIE9OVS4gKi8KYmNtb3NfZXJybm8gbWthX3NlbmRfc2FrX2NvbmZpcm0oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQp7CiAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CgogICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CgogICAgLyogcHJvY2VlZCB0byBuZXh0IHN0YXRlICovCiAgICBpZiAoX21rYV9zZW5kX3Nha19jb25maXJtX2ZyYW1lKGxpbmtfcmVjKSkKICAgIHsKICAgICAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIGdvb2Qgc28gZmFyLiBVcGRhdGUgQU4gYW5kIEtleSBOdW1iZXIgKi8KICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIgKz0gMTsKICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlciArPSAxOwogICAgICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlciA9PSA0KQogICAgICAgIHsKICAgICAgICAgICAgLyogVGhlIGFzc29jaWF0aW9uIG51bWJlciBpcyBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgT0xUIFNDSSB0byBpZGVudGlmeSBhIHNlY3VyZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIE9MVCBhbmQKICAgICAgICAgICAgICAgT05VLiBUaGUgQU4gdmFsdWUgc3RhcnRzIGF0IHplcm8gYW5kIGN5Y2xlcyB0aHJvdWdoIHZhbHVlcyAwIC0gMyBhcyBhIG5ldyBTQUsgaXMgZGlzdHJpYnV0ZWQgdG8gdGhlIE9OVS4KICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5hc3NvY2lhdGlvbl9udW1iZXIgPSAwOyAvKiBBTiA9IDAgfiAzICovCiAgICAgICAgfQoKICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnN0YXRlID0gTUtBX1NUQVRFX01LQV9ET05FOwogICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmVmcmVzaF9jbnQgKz0gMTsKICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnJldHJ5X2NudCA9IDA7CgogICAgICAgIC8qIHN0YXJ0IGtlZXBhbGl2ZSB0aW1lciAoMiBzZWNvbmQpICovCiAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnR4X3RpbWVyLCBNS0FfSEVMTE9fVElNRSAqIDEwMDApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJjID0gQkNNX0VSUl9DT01NX0ZBSUw7CiAgICB9CgogICAgcmV0dXJuIHJjOwp9CgovKiBXcmFwcGVyIGludG8gdGhlIE1LQSBjb2RlIHRoYXQgaGFuZGxlcyBNS0EgUERVcyBmcm9tIHRoZSBPTlUuICovCmJjbW9zX2Vycm5vIG1rYV9wcm9jZXNzX3BhY2tldChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF91OF9saXN0X3UxNiByeF9mcmFtZSwgbWthX29wX3R5cGUgb3BfdHlwZSkKewogICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX1BBUk07CiAgICBta2FfZXZlbnQgbWthX21zZzsKICAgIGJjbW9sdF9idWYgYnVmOwogICAgZWFwb2xfbXNnX2hkciBlYXBvbDsKCiAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLwogICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOwogICAgQlVHX09OKHJ4X2ZyYW1lLnZhbCA9PSBOVUxMKTsKICAgIEJVR19PTigob3BfdHlwZSA8PSBNS0FfT1BfX0lOVkFMSUQpIHx8IChvcF90eXBlID4gTUtBX09QX0tFRVBfQUxJVkUpKTsKCiAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgcnhfZnJhbWUubGVuLCByeF9mcmFtZS52YWwsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKICAgIGlmICghZHBvZV9zZWNfZWFwb2xfdW5wYWNrKCZidWYsICZlYXBvbCkpCiAgICB7CiAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiZmFpbGVkIHRvIHVucGFjayBFQVBPTCBoZWFkZXIhXG4iKTsKICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKICAgIH0KCiAgICAvKiBWYWxpZGF0ZSB0aGUgTUtBIHBhY2tldCBsZW5ndGggYmVmb3JlIHByb2Nlc3NpbmcuICovCiAgICBpZiAoIV9ta2FfdmFsaWRhdGVfcGt0KHJ4X2ZyYW1lLCAmZWFwb2wpKQogICAgewogICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIkludmFsaWQgTUtBIHBhY2tldCFcbiIpOwogICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOwogICAgfQoKICAgIC8qIFBhc3MgdGhlIHBhY2tldCB0byB0aGUgaGFuZGxlci4gKi8KICAgIG1rYV9tc2cudHlwZSA9IE1LQV9NU0dfREFUQV9JTkQ7CiAgICBta2FfbXNnLm1zZyA9ICZlYXBvbDsKICAgIG1rYV9tc2cuYnVmID0gJmJ1ZjsKCiAgICAvKiBQcm9jZXNzIHRoZSBNS0EgcGFja2V0LiAqLwogICAgc3dpdGNoIChvcF90eXBlKQogICAgewogICAgICAgIGNhc2UgTUtBX09QX1NUQVJUX1JTUDoKICAgICAgICAgICAgcmMgPSBfbWthX3dhaXRpbmdfaW5pdGlhbF9yZXNwb25zZSgmbWthX21zZywgbGlua19yZWMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1LQV9PUF9TQUtfUlNQOgogICAgICAgICAgICByYyA9IF9ta2FfaW5pdGlhbF9zYWtfc2VudCgmbWthX21zZywgbGlua19yZWMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1LQV9PUF9LRUVQX0FMSVZFOgogICAgICAgICAgICByYyA9IF9ta2Ffc2FrX2RvbmUoJm1rYV9tc2csIGxpbmtfcmVjKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIHJjOwp9CgovKiBXcmFwcGVyIGludG8gdGhlIE1LQSBjb2RlIHRoYXQgaGFuZGxlcyBNS0EgdGltZW91dHMuICovCmJjbW9zX2Vycm5vIG1rYV9wcm9jZXNzX3RpbWVvdXQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBta2Ffb3BfdHlwZSBvcF90eXBlKQp7CiAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfVElNRU9VVDsKICAgIG1rYV9ldmVudCBta2FfbXNnOwoKICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCiAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CiAgICBCVUdfT04oKG9wX3R5cGUgPCBNS0FfT1BfU1RBUlRfVElNRU9VVCkgfHwgKG9wX3R5cGUgPj0gTUtBX09QX19DT1VOVCkpOwoKICAgIC8qIFBhc3MgdGhlIHBhY2tldCB0byB0aGUgaGFuZGxlci4gKi8KICAgIG1rYV9tc2cudHlwZSA9IE1LQV9NU0dfVElNRU9VVDsKCiAgICAvKiBQcm9jZXNzIHRoZSBNS0EgcGFja2V0LiAqLwogICAgc3dpdGNoIChvcF90eXBlKQogICAgewogICAgICAgIGNhc2UgTUtBX09QX1NUQVJUX1RJTUVPVVQ6CiAgICAgICAgICAgIHJjID0gX21rYV93YWl0aW5nX2luaXRpYWxfcmVzcG9uc2UoJm1rYV9tc2csIGxpbmtfcmVjKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNS0FfT1BfU0FLX1RJTUVPVVQ6CiAgICAgICAgICAgIHJjICA9IF9ta2FfaW5pdGlhbF9zYWtfc2VudCgmbWthX21zZywgbGlua19yZWMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1LQV9PUF9TRU5EX0tFRVBfQUxJVkU6CiAgICAgICAgICAgIHJjID0gX21rYV9zYWtfZG9uZSgmbWthX21zZywgbGlua19yZWMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gcmM7Cn0KCg==