LyoKICogJFJDU0lkOiQKICoKICogQ29weXJpZ2h0IKkgMjAwMiBLZWl0aCBQYWNrYXJkCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaW5jbHVkZSAiZmNpbnQuaCIKCkZjQmxhbmtzICoKRmNCbGFua3NDcmVhdGUgKHZvaWQpCnsKICAgIEZjQmxhbmtzCSpiOwoKICAgIGIgPSBtYWxsb2MgKHNpemVvZiAoRmNCbGFua3MpKTsKICAgIGlmICghYikKCXJldHVybiAwOwogICAgRmNNZW1BbGxvYyAoRkNfTUVNX0JMQU5LUywgc2l6ZW9mIChGY0JsYW5rcykpOwogICAgYi0+bmJsYW5rID0gMDsKICAgIGItPnNibGFuayA9IDA7CiAgICBiLT5ibGFua3MgPSAwOwogICAgcmV0dXJuIGI7Cn0KCnZvaWQKRmNCbGFua3NEZXN0cm95IChGY0JsYW5rcyAqYikKewogICAgaWYgKGItPmJsYW5rcykKICAgIHsKCUZjTWVtRnJlZSAoRkNfTUVNX0JMQU5LUywgYi0+c2JsYW5rICogc2l6ZW9mIChGY0NoYXIzMikpOwoJZnJlZSAoYi0+YmxhbmtzKTsKICAgIH0KICAgIEZjTWVtRnJlZSAoRkNfTUVNX0JMQU5LUywgc2l6ZW9mIChGY0JsYW5rcykpOwogICAgZnJlZSAoYik7Cn0KCkZjQm9vbApGY0JsYW5rc0FkZCAoRmNCbGFua3MgKmIsIEZjQ2hhcjMyIHVjczQpCnsKICAgIEZjQ2hhcjMyCSpjOwogICAgaW50CQlzYmxhbms7CgogICAgZm9yIChzYmxhbmsgPSAwOyBzYmxhbmsgPCBiLT5uYmxhbms7IHNibGFuaysrKQoJaWYgKGItPmJsYW5rc1tzYmxhbmtdID09IHVjczQpCgkgICAgcmV0dXJuIEZjVHJ1ZTsKCiAgICBpZiAoYi0+bmJsYW5rID09IGItPnNibGFuaykKICAgIHsKCXNibGFuayA9IGItPnNibGFuayArIDMyOwoJaWYgKGItPmJsYW5rcykKCSAgICBjID0gKEZjQ2hhcjMyICopIHJlYWxsb2MgKGItPmJsYW5rcywgc2JsYW5rICogc2l6ZW9mIChGY0NoYXIzMikpOwoJZWxzZQoJICAgIGMgPSAoRmNDaGFyMzIgKikgbWFsbG9jIChzYmxhbmsgKiBzaXplb2YgKEZjQ2hhcjMyKSk7CglpZiAoIWMpCgkgICAgcmV0dXJuIEZjRmFsc2U7CglpZiAoYi0+c2JsYW5rKQoJICAgIEZjTWVtRnJlZSAoRkNfTUVNX0JMQU5LUywgYi0+c2JsYW5rICogc2l6ZW9mIChGY0NoYXIzMikpOwoJRmNNZW1BbGxvYyAoRkNfTUVNX0JMQU5LUywgc2JsYW5rICogc2l6ZW9mIChGY0NoYXIzMikpOwoJYi0+c2JsYW5rID0gc2JsYW5rOwoJYi0+YmxhbmtzID0gYzsKICAgIH0KICAgIGItPmJsYW5rc1tiLT5uYmxhbmsrK10gPSB1Y3M0OwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNCb29sCkZjQmxhbmtzSXNNZW1iZXIgKEZjQmxhbmtzICpiLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBpbnQJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgYi0+bmJsYW5rOyBpKyspCglpZiAoYi0+YmxhbmtzW2ldID09IHVjczQpCgkgICAgcmV0dXJuIEZjVHJ1ZTsKICAgIHJldHVybiBGY0ZhbHNlOwp9Cg==