LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBpMmMtZWxla3Rvci5jIGkyYy1odyBhY2Nlc3MgZm9yIFBDRjg1ODQgc3R5bGUgaXNhIGJ1cyBhZGFwdGVzICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICBDb3B5cmlnaHQgKEMpIDE5OTUtOTcgU2ltb24gRy4gVm9nbAogICAgICAgICAgICAgICAgICAgMTk5OC05OSBIYW5zIEJlcmdsdW5kCgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCBldmVuCiAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gKi8KCi8qIFBhcnRpYWx5IHJld3JpdGVuIGJ5IE9sZWcgSS4gVmRvdmlraW4gZm9yIG1tYXBwZWQgc3VwcG9ydCBvZgogICBmb3IgQWxwaGEgUHJvY2Vzc29yIEluYy4gVVAtMjAwMCgrKSBib2FyZHMgKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KCiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXBjZi5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2lycS5oPgoKI2luY2x1ZGUgIi4uL2FsZ29zL2kyYy1hbGdvLXBjZi5oIgoKI2RlZmluZSBERUZBVUxUX0JBU0UgMHgzMzAKCnN0YXRpYyBpbnQgYmFzZTsKc3RhdGljIHU4IF9faW9tZW0gKmJhc2VfaW9tZW07CgpzdGF0aWMgaW50IGlycTsKc3RhdGljIGludCBjbG9jayAgPSAweDFjOwpzdGF0aWMgaW50IG93biAgICA9IDB4NTU7CnN0YXRpYyBpbnQgbW1hcHBlZDsKCi8qIHZkb3Zpa2luOiByZW1vdmVkIHN0YXRpYyBzdHJ1Y3QgaTJjX3BjZl9pc2EgZ3BpOyBjb2RlIC0KICB0aGlzIG1vZHVsZSBpbiByZWFsIHN1cHBvcnRzIG9ubHkgb25lIGRldmljZSwgZHVlIHRvIG1pc3NpbmcgYXJndW1lbnRzCiAgaW4gc29tZSBmdW5jdGlvbnMsIGNhbGxlZCBmcm9tIHRoZSBhbGdvLXBjZiBtb2R1bGUuIFNvbWV0aW1lcyBpdCdzCiAgbmVlZCB0byBiZSByZXdyaXRlbiAtIGJ1dCBmb3Igbm93IGp1c3QgcmVtb3ZlIHRoaXMgZm9yIHNpbXBsZXIgcmVhZGluZyAqLwoKc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IHBjZl93YWl0OwpzdGF0aWMgaW50IHBjZl9wZW5kaW5nOwpzdGF0aWMgc3BpbmxvY2tfdCBsb2NrOwoKc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBwY2ZfaXNhX29wczsKCi8qIC0tLS0tIGxvY2FsIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCgpzdGF0aWMgdm9pZCBwY2ZfaXNhX3NldGJ5dGUodm9pZCAqZGF0YSwgaW50IGN0bCwgaW50IHZhbCkKewoJdTggX19pb21lbSAqYWRkcmVzcyA9IGN0bCA/IChiYXNlX2lvbWVtICsgMSkgOiBiYXNlX2lvbWVtOwoKCS8qIGVuYWJsZSBpcnEgaWYgYW55IHNwZWNpZmllZCBmb3Igc2VyaWFsIG9wZXJhdGlvbiAqLwoJaWYgKGN0bCAmJiBpcnEgJiYgKHZhbCAmIEkyQ19QQ0ZfRVNPKSkgewoJCXZhbCB8PSBJMkNfUENGX0VOSTsKCX0KCglwcl9kZWJ1ZygiJXM6IFdyaXRlICVwIDB4JTAyWFxuIiwgcGNmX2lzYV9vcHMubmFtZSwgYWRkcmVzcywgdmFsKTsKCWlvd3JpdGU4KHZhbCwgYWRkcmVzcyk7CiNpZmRlZiBfX2FscGhhX18KCS8qIEFQSSBVUDIwMDAgbmVlZHMgc29tZSBoYXJkd2FyZSBmdWRnaW5nIHRvIG1ha2UgdGhlIHdyaXRlIHN0aWNrICovCglpb3dyaXRlOCh2YWwsIGFkZHJlc3MpOwojZW5kaWYKfQoKc3RhdGljIGludCBwY2ZfaXNhX2dldGJ5dGUodm9pZCAqZGF0YSwgaW50IGN0bCkKewoJdTggX19pb21lbSAqYWRkcmVzcyA9IGN0bCA/IChiYXNlX2lvbWVtICsgMSkgOiBiYXNlX2lvbWVtOwoJaW50IHZhbCA9IGlvcmVhZDgoYWRkcmVzcyk7CgoJcHJfZGVidWcoIiVzOiBSZWFkICVwIDB4JTAyWFxuIiwgcGNmX2lzYV9vcHMubmFtZSwgYWRkcmVzcywgdmFsKTsKCXJldHVybiAodmFsKTsKfQoKc3RhdGljIGludCBwY2ZfaXNhX2dldG93bih2b2lkICpkYXRhKQp7CglyZXR1cm4gKG93bik7Cn0KCgpzdGF0aWMgaW50IHBjZl9pc2FfZ2V0Y2xvY2sodm9pZCAqZGF0YSkKewoJcmV0dXJuIChjbG9jayk7Cn0KCnN0YXRpYyB2b2lkIHBjZl9pc2Ffd2FpdGZvcnBpbih2b2lkKSB7CglERUZJTkVfV0FJVCh3YWl0KTsKCWludCB0aW1lb3V0ID0gMjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJaWYgKGlycSA+IDApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOwoJCWlmIChwY2ZfcGVuZGluZyA9PSAwKSB7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKCQkJcHJlcGFyZV90b193YWl0KCZwY2Zfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CgkJCWlmIChzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQqSFopKSB7CgkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOwoJCQkJaWYgKHBjZl9wZW5kaW5nID09IDEpIHsKCQkJCQlwY2ZfcGVuZGluZyA9IDA7CgkJCQl9CgkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CgkJCX0KCQkJZmluaXNoX3dhaXQoJnBjZl93YWl0LCAmd2FpdCk7CgkJfSBlbHNlIHsKCQkJcGNmX3BlbmRpbmcgPSAwOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CgkJfQoJfSBlbHNlIHsKCQl1ZGVsYXkoMTAwKTsKCX0KfQoKCnN0YXRpYyBpcnFyZXR1cm5fdCBwY2ZfaXNhX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQpIHsKCXNwaW5fbG9jaygmbG9jayk7CglwY2ZfcGVuZGluZyA9IDE7CglzcGluX3VubG9jaygmbG9jayk7Cgl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBjZl93YWl0KTsKCXJldHVybiBJUlFfSEFORExFRDsKfQoKCnN0YXRpYyBpbnQgcGNmX2lzYV9pbml0KHZvaWQpCnsKCXNwaW5fbG9ja19pbml0KCZsb2NrKTsKCWlmICghbW1hcHBlZCkgewoJCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgMiwgcGNmX2lzYV9vcHMubmFtZSkpIHsKCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVxdWVzdGVkIEkvTyByZWdpb24gKCUjeDoyKSBpcyAiCgkJCSAgICAgICAiaW4gdXNlXG4iLCBwY2ZfaXNhX29wcy5uYW1lLCBiYXNlKTsKCQkJcmV0dXJuIC1FTk9ERVY7CgkJfQoJCWJhc2VfaW9tZW0gPSBpb3BvcnRfbWFwKGJhc2UsIDIpOwoJCWlmICghYmFzZV9pb21lbSkgewoJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZW1hcCBvZiBJL08gcmVnaW9uICUjeCBmYWlsZWRcbiIsCgkJCSAgICAgICBwY2ZfaXNhX29wcy5uYW1lLCBiYXNlKTsKCQkJcmVsZWFzZV9yZWdpb24oYmFzZSwgMik7CgkJCXJldHVybiAtRU5PREVWOwoJCX0KCX0gZWxzZSB7CgkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYmFzZSwgMiwgcGNmX2lzYV9vcHMubmFtZSkpIHsKCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVxdWVzdGVkIG1lbW9yeSByZWdpb24gKCUjeDoyKSAiCgkJCSAgICAgICAiaXMgaW4gdXNlXG4iLCBwY2ZfaXNhX29wcy5uYW1lLCBiYXNlKTsKCQkJcmV0dXJuIC1FTk9ERVY7CgkJfQoJCWJhc2VfaW9tZW0gPSBpb3JlbWFwKGJhc2UsIDIpOwoJCWlmIChiYXNlX2lvbWVtID09IE5VTEwpIHsKCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVtYXAgb2YgbWVtb3J5IHJlZ2lvbiAlI3ggIgoJCQkgICAgICAgImZhaWxlZFxuIiwgcGNmX2lzYV9vcHMubmFtZSwgYmFzZSk7CgkJCXJlbGVhc2VfbWVtX3JlZ2lvbihiYXNlLCAyKTsKCQkJcmV0dXJuIC1FTk9ERVY7CgkJfQoJfQoJcHJfZGVidWcoIiVzOiByZWdpc3RlcnMgJSN4IHJlbWFwcGVkIHRvICVwXG4iLCBwY2ZfaXNhX29wcy5uYW1lLCBiYXNlLAoJCSBiYXNlX2lvbWVtKTsKCglpZiAoaXJxID4gMCkgewoJCWlmIChyZXF1ZXN0X2lycShpcnEsIHBjZl9pc2FfaGFuZGxlciwgMCwgcGNmX2lzYV9vcHMubmFtZSwKCQkJCU5VTEwpIDwgMCkgewoJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZXF1ZXN0IGlycSVkIGZhaWxlZFxuIiwKCQkJICAgICAgIHBjZl9pc2Ffb3BzLm5hbWUsIGlycSk7CgkJCWlycSA9IDA7CgkJfSBlbHNlCgkJCWVuYWJsZV9pcnEoaXJxKTsKCX0KCXJldHVybiAwOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRW5jYXBzdWxhdGUgdGhlIGFib3ZlIGZ1bmN0aW9ucyBpbiB0aGUgY29ycmVjdCBvcGVyYXRpb25zIHN0cnVjdHVyZS4KICogVGhpcyBpcyBvbmx5IGRvbmUgd2hlbiBtb3JlIHRoYW4gb25lIGhhcmR3YXJlIGFkYXB0ZXIgaXMgc3VwcG9ydGVkLgogKi8Kc3RhdGljIHN0cnVjdCBpMmNfYWxnb19wY2ZfZGF0YSBwY2ZfaXNhX2RhdGEgPSB7Cgkuc2V0cGNmCSAgICA9IHBjZl9pc2Ffc2V0Ynl0ZSwKCS5nZXRwY2YJICAgID0gcGNmX2lzYV9nZXRieXRlLAoJLmdldG93bgkgICAgPSBwY2ZfaXNhX2dldG93biwKCS5nZXRjbG9jayAgID0gcGNmX2lzYV9nZXRjbG9jaywKCS53YWl0Zm9ycGluID0gcGNmX2lzYV93YWl0Zm9ycGluLAoJLnVkZWxheQkgICAgPSAxMCwKCS50aW1lb3V0ICAgID0gMTAwLAp9OwoKc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBwY2ZfaXNhX29wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCgkuaWQJCT0gSTJDX0hXX1BfRUxFSywKCS5hbGdvX2RhdGEJPSAmcGNmX2lzYV9kYXRhLAoJLm5hbWUJCT0gImkyYy1lbGVrdG9yIiwKfTsKCnN0YXRpYyBpbnQgX19pbml0IGkyY19wY2Zpc2FfaW5pdCh2b2lkKQp7CiNpZmRlZiBfX2FscGhhX18KCS8qIGNoZWNrIHRvIHNlZSB3ZSBoYXZlIG1lbW9yeSBtYXBwZWQgUENGODU4NCBjb25uZWN0ZWQgdG8gdGhlCglDeXByZXNzIGN5ODJjNjkzIFBDSS1JU0EgYnJpZGdlIGFzIG9uIFVQMjAwMCBib2FyZCAqLwoJaWYgKGJhc2UgPT0gMCkgewoJCXN0cnVjdCBwY2lfZGV2ICpjeTY5M19kZXY7CgoJCWN5NjkzX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQ09OVEFRLAoJCQkJCSAgIFBDSV9ERVZJQ0VfSURfQ09OVEFRXzgyQzY5MywgTlVMTCk7CgkJaWYgKGN5NjkzX2RldikgewoJCQl1bnNpZ25lZCBjaGFyIGNvbmZpZzsKCQkJLyogeWVhcCwgd2UndmUgZm91bmQgY3lwcmVzcywgbGV0J3MgY2hlY2sgY29uZmlnICovCgkJCWlmICghcGNpX3JlYWRfY29uZmlnX2J5dGUoY3k2OTNfZGV2LCAweDQ3LCAmY29uZmlnKSkgewoKCQkJCXByX2RlYnVnKCIlczogZm91bmQgY3k4MmM2OTMsIGNvbmZpZyAiCgkJCQkJICJyZWdpc3RlciAweDQ3ID0gMHglMDJ4XG4iLAoJCQkJCSBwY2ZfaXNhX29wcy5uYW1lLCBjb25maWcpOwoKCQkJCS8qIFVQMjAwMCBib2FyZCBoYXMgdGhpcyByZWdpc3RlciBzZXQgdG8gMHhlMSwKCQkJCSAgIGJ1dCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgYXMgc2VlbXMgY2FuIGJlCgkJCQkgICByZXNldCBkdXJpbmcgdGhlIHByb3BlciBpbml0aWFsaXNhdGlvbgoJCQkJICAgc2VxdWVuY2UgaWYgZ3V5cyBmcm9tIEFQSSBkZWNpZGVzIHRvIGRvIHRoYXQKCQkJCSAgIChzbywgd2UgY2FuIGV2ZW4gZW5hYmxlIFRzdW5hbWkgUGNoaXAKCQkJCSAgIHdpbmRvdyBmb3IgdGhlIHVwcGVyIDEgR2IpICovCgoJCQkJLyogc28ganVzdCBjaGVjayBmb3IgUk9NQ1MgYXQgMHhlMDAwMCwKCQkJCSAgIFJPTUNTIGVuYWJsZWQgZm9yIHdyaXRlcwoJCQkJICAgYW5kIGV4dGVybmFsIFhEIEJ1cyBidWZmZXIgaW4gdXNlLiAqLwoJCQkJaWYgKChjb25maWcgJiAweDdmKSA9PSAweDYxKSB7CgkJCQkJLyogc2VlbXMgdG8gYmUgVVAyMDAwIGxpa2UgYm9hcmQgKi8KCQkJCQliYXNlID0gMHhlMDAwMDsKCQkJCQltbWFwcGVkID0gMTsKCQkJCQkvKiBVUDIwMDAgZHJpdmVzIElTQSB3aXRoCgkJCQkJICAgOC4yNSBNSHogKFBDSS80KSBjbG9jawoJCQkJCSAgICh0aGlzIGNhbiBiZSByZWFkIGZyb20gY3lwcmVzcykgKi8KCQkJCQljbG9jayA9IEkyQ19QQ0ZfQ0xLIHwgSTJDX1BDRl9UUk5TOTA7CgkJCQkJcHJfaW5mbygiJXM6IGZvdW5kIEFQSSBVUDIwMDAgbGlrZSAiCgkJCQkJCSJib2FyZCwgd2lsbCBwcm9iZSBQQ0Y4NTg0ICIKCQkJCQkJImxhdGVyXG4iLCBwY2ZfaXNhX29wcy5uYW1lKTsKCQkJCX0KCQkJfQoJCQlwY2lfZGV2X3B1dChjeTY5M19kZXYpOwoJCX0KCX0KI2VuZGlmCgoJLyogc2FuaXR5IGNoZWNrcyBmb3IgbW1hcHBlZCBJL08gKi8KCWlmIChtbWFwcGVkICYmIGJhc2UgPCAweGM4MDAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICIlczogaW5jb3JyZWN0IGJhc2UgYWRkcmVzcyAoJSN4KSBzcGVjaWZpZWQgIgoJCSAgICAgICAiZm9yIG1tYXBwZWQgSS9PXG4iLCBwY2ZfaXNhX29wcy5uYW1lLCBiYXNlKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglpZiAoYmFzZSA9PSAwKSB7CgkJYmFzZSA9IERFRkFVTFRfQkFTRTsKCX0KCglpbml0X3dhaXRxdWV1ZV9oZWFkKCZwY2Zfd2FpdCk7CglpZiAocGNmX2lzYV9pbml0KCkpCgkJcmV0dXJuIC1FTk9ERVY7CglpZiAoaTJjX3BjZl9hZGRfYnVzKCZwY2ZfaXNhX29wcykgPCAwKQoJCWdvdG8gZmFpbDsKCglkZXZfaW5mbygmcGNmX2lzYV9vcHMuZGV2LCAiZm91bmQgZGV2aWNlIGF0ICUjeFxuIiwgYmFzZSk7CgoJcmV0dXJuIDA7CgogZmFpbDoKCWlmIChpcnEgPiAwKSB7CgkJZGlzYWJsZV9pcnEoaXJxKTsKCQlmcmVlX2lycShpcnEsIE5VTEwpOwoJfQoKCWlmICghbW1hcHBlZCkgewoJCWlvcG9ydF91bm1hcChiYXNlX2lvbWVtKTsKCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCAyKTsKCX0gZWxzZSB7CgkJaW91bm1hcChiYXNlX2lvbWVtKTsKCQlyZWxlYXNlX21lbV9yZWdpb24oYmFzZSwgMik7Cgl9CglyZXR1cm4gLUVOT0RFVjsKfQoKc3RhdGljIHZvaWQgaTJjX3BjZmlzYV9leGl0KHZvaWQpCnsKCWkyY19kZWxfYWRhcHRlcigmcGNmX2lzYV9vcHMpOwoKCWlmIChpcnEgPiAwKSB7CgkJZGlzYWJsZV9pcnEoaXJxKTsKCQlmcmVlX2lycShpcnEsIE5VTEwpOwoJfQoKCWlmICghbW1hcHBlZCkgewoJCWlvcG9ydF91bm1hcChiYXNlX2lvbWVtKTsKCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCAyKTsKCX0gZWxzZSB7CgkJaW91bm1hcChiYXNlX2lvbWVtKTsKCQlyZWxlYXNlX21lbV9yZWdpb24oYmFzZSwgMik7Cgl9Cn0KCk1PRFVMRV9BVVRIT1IoIkhhbnMgQmVyZ2x1bmQgPGhiQHNwYWNldGVjLm5vPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkkyQy1CdXMgYWRhcHRlciByb3V0aW5lcyBmb3IgUENGODU4NCBJU0EgYnVzIGFkYXB0ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX3BhcmFtKGJhc2UsIGludCwgMCk7Cm1vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cm1vZHVsZV9wYXJhbShjbG9jaywgaW50LCAwKTsKbW9kdWxlX3BhcmFtKG93biwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKG1tYXBwZWQsIGludCwgMCk7Cgptb2R1bGVfaW5pdChpMmNfcGNmaXNhX2luaXQpOwptb2R1bGVfZXhpdChpMmNfcGNmaXNhX2V4aXQpOwo=