LyoKICogc3lzY3RsLmMgLSBDb2RlIGZvciBzeXNjdGwgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLiBQYXJ0IG9mCiAqCSAgICAgIHRoZSBMaW51eC1OVEZTIHByb2plY3QuIEFkYXB0ZWQgZnJvbSB0aGUgb2xkIE5URlMgZHJpdmVyLAogKgkgICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgTWFydGluIHZvbiBM9ndpcywgUulnaXMgRHVjaGVzbmUKICoKICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAqCiAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAogKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQogKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CiAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUwogKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2lmZGVmIERFQlVHCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaWZkZWYgQ09ORklHX1NZU0NUTAoKI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgoKI2luY2x1ZGUgInN5c2N0bC5oIgojaW5jbHVkZSAiZGVidWcuaCIKCiNkZWZpbmUgRlNfTlRGUwkxCgovKiBEZWZpbml0aW9uIG9mIHRoZSBudGZzIHN5c2N0bC4gKi8Kc3RhdGljIGN0bF90YWJsZSBudGZzX3N5c2N0bHNbXSA9IHsKCXsgRlNfTlRGUywgIm50ZnMtZGVidWciLAkJLyogQmluYXJ5IGFuZCB0ZXh0IElEcy4gKi8KCSAgJmRlYnVnX21zZ3Msc2l6ZW9mKGRlYnVnX21zZ3MpLAkvKiBEYXRhIHBvaW50ZXIgYW5kIHNpemUuICovCgkgIDA2NDQsCU5VTEwsICZwcm9jX2RvaW50dmVjIH0sCQkvKiBNb2RlLCBjaGlsZCwgcHJvYyBoYW5kbGVyLiAqLwoJeyAwIH0KfTsKCi8qIERlZmluZSB0aGUgcGFyZW50IGRpcmVjdG9yeSAvcHJvYy9zeXMvZnMuICovCnN0YXRpYyBjdGxfdGFibGUgc3lzY3Rsc19yb290W10gPSB7Cgl7IENUTF9GUywgImZzIiwgTlVMTCwgMCwgMDU1NSwgbnRmc19zeXNjdGxzIH0sCgl7IDAgfQp9OwoKLyogU3RvcmFnZSBmb3IgdGhlIHN5c2N0bHMgaGVhZGVyLiAqLwpzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnN5c2N0bHNfcm9vdF90YWJsZSA9IE5VTEw7CgovKioKICogbnRmc19zeXNjdGwgLSBhZGQgb3IgcmVtb3ZlIHRoZSBkZWJ1ZyBzeXNjdGwKICogQGFkZDoJYWRkICgxKSBvciByZW1vdmUgKDApIHRoZSBzeXNjdGwKICoKICogQWRkIG9yIHJlbW92ZSB0aGUgZGVidWcgc3lzY3RsLiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KICovCmludCBudGZzX3N5c2N0bChpbnQgYWRkKQp7CglpZiAoYWRkKSB7CgkJQlVHX09OKHN5c2N0bHNfcm9vdF90YWJsZSk7CgkJc3lzY3Rsc19yb290X3RhYmxlID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bHNfcm9vdCwgMCk7CgkJaWYgKCFzeXNjdGxzX3Jvb3RfdGFibGUpCgkJCXJldHVybiAtRU5PTUVNOwojaWZkZWYgQ09ORklHX1BST0NfRlMKCQkvKgoJCSAqIElmIHRoZSBwcm9jIGZpbGVzeXN0ZW0gaXMgaW4gdXNlIGFuZCB3ZSBhcmUgYSBtb2R1bGUsIG5lZWQKCQkgKiB0byBzZXQgdGhlIG93bmVyIG9mIG91ciBwcm9jIGVudHJ5IHRvIG91ciBtb2R1bGUuIEluIHRoZQoJCSAqIG5vbi1tb2R1bGFyIGNhc2UsIFRISVNfTU9EVUxFIGlzIE5VTEwsIHNvIHRoaXMgaXMgb2suCgkJICovCgkJbnRmc19zeXNjdGxzWzBdLmRlLT5vd25lciA9IFRISVNfTU9EVUxFOwojZW5kaWYKCX0gZWxzZSB7CgkJQlVHX09OKCFzeXNjdGxzX3Jvb3RfdGFibGUpOwoJCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bHNfcm9vdF90YWJsZSk7CgkJc3lzY3Rsc19yb290X3RhYmxlID0gTlVMTDsKCX0KCXJldHVybiAwOwp9CgojZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwojZW5kaWYgLyogREVCVUcgKi8K