LyoKICogTkRBIEFORCBORUVELVRPLUtOT1cgUkVRVUlSRUQKICoKICogQ29weXJpZ2h0IKkgMjAxMy0yMDE4IFN5bmFwdGljcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IGlzIHByb3ByaWV0YXJ5IHRvIFN5bmFwdGljcwogKiBJbmNvcnBvcmF0ZWQgKCJTeW5hcHRpY3MiKS4gVGhlIGhvbGRlciBvZiB0aGlzIGZpbGUgc2hhbGwgdHJlYXQgYWxsCiAqIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gYXMgY29uZmlkZW50aWFsLCBzaGFsbCB1c2UgdGhlCiAqIGluZm9ybWF0aW9uIG9ubHkgZm9yIGl0cyBpbnRlbmRlZCBwdXJwb3NlLCBhbmQgc2hhbGwgbm90IGR1cGxpY2F0ZSwKICogZGlzY2xvc2UsIG9yIGRpc3NlbWluYXRlIGFueSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGFueSBtYW5uZXIKICogdW5sZXNzIFN5bmFwdGljcyBoYXMgb3RoZXJ3aXNlIHByb3ZpZGVkIGV4cHJlc3MsIHdyaXR0ZW4KICogcGVybWlzc2lvbi4KICoKICogVXNlIG9mIHRoZSBtYXRlcmlhbHMgbWF5IHJlcXVpcmUgYSBsaWNlbnNlIG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eQogKiBmcm9tIGEgdGhpcmQgcGFydHkgb3IgZnJvbSBTeW5hcHRpY3MuIFRoaXMgZmlsZSBjb252ZXlzIG5vIGV4cHJlc3MKICogb3IgaW1wbGllZCBsaWNlbnNlcyB0byBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBiZWxvbmdpbmcKICogdG8gU3luYXB0aWNzLgogKgogKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCBJUyBQUk9WSURFRCAiQVMtSVMsIiBBTkQKICogU1lOQVBUSUNTIEVYUFJFU1NMWSBESVNDTEFJTVMgQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIEFOWSBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQgT0YgQU5ZCiAqIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFNZTkFQVElDUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBQVU5JVElWRSwgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFCiAqIE9GIFRIRSBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCwgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIEJBU0VEIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKICogTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFORCBFVkVOIElGIFNZTkFQVElDUyBXQVMKICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIElGIEEgVFJJQlVOQUwgT0YKICogQ09NUEVURU5UIEpVUklTRElDVElPTiBET0VTIE5PVCBQRVJNSVQgVEhFIERJU0NMQUlNRVIgT0YgRElSRUNUCiAqIERBTUFHRVMgT1IgQU5ZIE9USEVSIERBTUFHRVMsIFNZTkFQVElDUycgVE9UQUwgQ1VNVUxBVElWRSBMSUFCSUxJVFkKICogVE8gQU5ZIFBBUlRZIFNIQUxMIE5PVCBFWENFRUQgT05FIEhVTkRSRUQgVS5TLiBET0xMQVJTLgogKi8KI2lmbmRlZiBfX1NESU9fQ09OVFJPTExFUl9ICiNkZWZpbmUgX19TRElPX0NPTlRST0xMRVJfSAoKI2luY2x1ZGUgInNkbW1jX2FwaS5oIgoKLy9GdW5jdGlvbiBQcm90b3R5cGVzCnZvaWQgRU1NQ0hDX1N0b3BJbnRlcm5hbEJ1c0Nsb2NrKFBfTU00X1NETU1DX0NPTlRFWFRfVCBwQ29udGV4dCk7CnZvaWQgRU1NQ0hDX1N0YXJ0SW50ZXJuYWxCdXNDbG9jayhQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQpOwp2b2lkIEVNTUNIQ19TdGFydEJ1c0Nsb2NrKFBfTU00X1NETU1DX0NPTlRFWFRfVCBwQ29udGV4dCk7CnZvaWQgRU1NQ0hDX1N0b3BCdXNDbG9jayAoUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0KTsKdm9pZCBFTU1DSENfU2V0QnVzUmF0ZShQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQsIHVuc2lnbmVkIGludCByYXRlKTsKdm9pZCBFTU1DSENfRW5hYmxlRGlzYWJsZUludFNvdXJjZXMoUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0LCB1bnNpZ25lZCBjaGFyIERlc2lyZSk7CnZvaWQgRU1NQ0hDX1NldERhdGFUaW1lb3V0KFBfTU00X1NETU1DX0NPTlRFWFRfVCBwQ29udGV4dCwgdW5zaWduZWQgY2hhciBDb3VudGVyVmFsdWUpOwp2b2lkIEVNTUNIQ19EYXRhU1dSZXNldChQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQpOwp2b2lkIEVNTUNIQ19GdWxsU1dSZXNldChQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQpOwp2b2lkIEVNTUNIQ19IaWdoU3BlZWRTZWxlY3QoUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0LCBVSU5UX1QgaHNfbW9kZSk7CnZvaWQgRU1NQ0hDX2hvc3RfbW9kZShQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQsIFVJTlRfVCB1aHNfbW9kZSk7Cgp2b2lkIEVNTUNIQ19TZW5kRGF0YUNvbW1hbmQoUF9NTTRfU0RNTUNfQ09OVEVYVF9UIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICBVSU5UX1QgQ21kLAogICAgICAgICAgICAgICAgICBVSU5UX1QgIEFyZ3VtZW50LAogICAgICAgICAgICAgICAgICBVSU5UX1QgQmxvY2tUeXBlLAogICAgICAgICAgICAgICAgICBVSU5UX1QgRGF0YURpcmVjdGlvbiwKICAgICAgICAgICAgICAgICAgVUlOVF9UIFJlc1R5cGUpOwoKdm9pZCBFTU1DSENfU2VuZFNldHVwQ29tbWFuZChQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQsCiAgICAgICAgICAgICAgICAgIFVJTlRfVCBDbWQsCiAgICAgICAgICAgICAgICAgIFVJTlRfVCBDbWRUeXBlLAogICAgICAgICAgICAgICAgICBVSU5UX1QgQXJndW1lbnQsCiAgICAgICAgICAgICAgICAgIFVJTlRfVCBSZXNUeXBlKTsKCnZvaWQgRU1NQ0hDX1NlbmREYXRhQ29tbWFuZE5vQXV0bzEyKFBfTU00X1NETU1DX0NPTlRFWFRfVCBwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgVUlOVF9UIENtZCwKICAgICAgICAgICAgICAgICAgVUlOVF9UICBBcmd1bWVudCwKICAgICAgICAgICAgICAgICAgVUlOVF9UIEJsb2NrVHlwZSwKICAgICAgICAgICAgICAgICAgVUlOVF9UIERhdGFEaXJlY3Rpb24sCiAgICAgICAgICAgICAgICAgIFVJTlRfVCBSZXNUeXBlKTsKCmV4dGVybiBVSU5UX1QgRU1NQ0hDX1NldENvbnRyb2xsZXJWb2x0YWdlIChQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQsIFVJTlRfVCB2Y2MpOwoKZXh0ZXJuIHZvaWQgRU1NQ0hDX0VuYWJsZUNtZEludGVycnVwdChQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQsIHVuc2lnbmVkIGludCBlbmFibGUpOwoKZXh0ZXJuIHZvaWQgRU1NQ0hDX2NkSW50X2VuYWJsZShQX01NNF9TRE1NQ19DT05URVhUX1QgcENvbnRleHQsIFVJTlQ4X1QgRGVzaXJlKTsKCnN0YXRpYyBpbmxpbmUgdm9pZCBuZGVsYXkodW5zaWduZWQgaW50IG5zKQp7CiNpZm5kZWYgQ1BVUExMCiNkZWZpbmUgQ1BVUExMCTEwMDAKI2VuZGlmCgl1bnNpZ25lZCBsb25nIGN5Y2xlcyA9ICh1bnNpZ25lZCBsb25nKSgodW5zaWduZWQgbG9uZyBsb25nKW5zICogQ1BVUExMIC8gMTAwMCk7CgoJX19hc21fXyBfX3ZvbGF0aWxlX18gKAoJCSIxOglzdWJzCSUwLCAlMCwgIzEJXG5cdCIKCQkiCWJoaQkxYgkJXG5cdCIKCQk6ICIrciIgKGN5Y2xlcykKCQk6CgkJOiAiY2MiCgkJKTsKfQoKc3RhdGljIHZvaWQgZGVsYXlfdXModW5zaWduZWQgaW50IHVzKQp7Cgljb25zdCB1bnNpZ25lZCBpbnQgc3RlcF91cyA9IDEwMDAwMDA7Cgljb25zdCB1bnNpZ25lZCBpbnQgc3RlcF9ucyA9IDEwMDAgKiBzdGVwX3VzOwoJd2hpbGUgKHVzID4gc3RlcF91cykgewoJCW5kZWxheShzdGVwX25zKTsKCQl1cyAtPSBzdGVwX3VzOwoJfQoJaWYgKHVzKQoJCW5kZWxheSgxMDAwICogdXMpOwp9CgoKc3RhdGljIHZvaWQgZGVsYXlfbXModW5zaWduZWQgaW50IG1zKQp7Cgljb25zdCB1bnNpZ25lZCBpbnQgc3RlcF9tcyA9IDEwMDAwMDA7Cgljb25zdCB1bnNpZ25lZCBpbnQgc3RlcF91cyA9IDEwMDAgKiBzdGVwX21zOwoJd2hpbGUgKG1zID4gc3RlcF9tcykgewoJCWRlbGF5X3VzKHN0ZXBfdXMpOwoJCW1zIC09IHN0ZXBfbXM7Cgl9CglpZiAobXMpCgkJZGVsYXlfdXMoMTAwMCAqIG1zKTsKfQoKI2VuZGlmCg==