LyoKICogTkRBIEFORCBORUVELVRPLUtOT1cgUkVRVUlSRUQKICoKICogQ29weXJpZ2h0IKkgMjAxMy0yMDE4IFN5bmFwdGljcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IGlzIHByb3ByaWV0YXJ5IHRvIFN5bmFwdGljcwogKiBJbmNvcnBvcmF0ZWQgKCJTeW5hcHRpY3MiKS4gVGhlIGhvbGRlciBvZiB0aGlzIGZpbGUgc2hhbGwgdHJlYXQgYWxsCiAqIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gYXMgY29uZmlkZW50aWFsLCBzaGFsbCB1c2UgdGhlCiAqIGluZm9ybWF0aW9uIG9ubHkgZm9yIGl0cyBpbnRlbmRlZCBwdXJwb3NlLCBhbmQgc2hhbGwgbm90IGR1cGxpY2F0ZSwKICogZGlzY2xvc2UsIG9yIGRpc3NlbWluYXRlIGFueSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGFueSBtYW5uZXIKICogdW5sZXNzIFN5bmFwdGljcyBoYXMgb3RoZXJ3aXNlIHByb3ZpZGVkIGV4cHJlc3MsIHdyaXR0ZW4KICogcGVybWlzc2lvbi4KICoKICogVXNlIG9mIHRoZSBtYXRlcmlhbHMgbWF5IHJlcXVpcmUgYSBsaWNlbnNlIG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eQogKiBmcm9tIGEgdGhpcmQgcGFydHkgb3IgZnJvbSBTeW5hcHRpY3MuIFRoaXMgZmlsZSBjb252ZXlzIG5vIGV4cHJlc3MKICogb3IgaW1wbGllZCBsaWNlbnNlcyB0byBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBiZWxvbmdpbmcKICogdG8gU3luYXB0aWNzLgogKgogKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCBJUyBQUk9WSURFRCAiQVMtSVMsIiBBTkQKICogU1lOQVBUSUNTIEVYUFJFU1NMWSBESVNDTEFJTVMgQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIEFOWSBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQgT0YgQU5ZCiAqIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFNZTkFQVElDUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBQVU5JVElWRSwgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFCiAqIE9GIFRIRSBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCwgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIEJBU0VEIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKICogTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFORCBFVkVOIElGIFNZTkFQVElDUyBXQVMKICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIElGIEEgVFJJQlVOQUwgT0YKICogQ09NUEVURU5UIEpVUklTRElDVElPTiBET0VTIE5PVCBQRVJNSVQgVEhFIERJU0NMQUlNRVIgT0YgRElSRUNUCiAqIERBTUFHRVMgT1IgQU5ZIE9USEVSIERBTUFHRVMsIFNZTkFQVElDUycgVE9UQUwgQ1VNVUxBVElWRSBMSUFCSUxJVFkKICogVE8gQU5ZIFBBUlRZIFNIQUxMIE5PVCBFWENFRUQgT05FIEhVTkRSRUQgVS5TLiBET0xMQVJTLgogKi8KI2lmbmRlZiBfSTJDX0FQSV9IXwojZGVmaW5lIF9JMkNfQVBJX0hfCgovLyBlcnJvciBjb2RlIGRlZmluaXRpb25zCiNpZm5kZWYgSTJDX09LCiNkZWZpbmUgSTJDX09LCQkJMAojZW5kaWYKI2lmbmRlZiBJMkNfRVJST1IKI2RlZmluZSBJMkNfRVJST1IJCTEKI2VuZGlmCiNpZm5kZWYgSTJDX0VCQURQQVJBTQojZGVmaW5lIEkyQ19FQkFEUEFSQU0JCTIKI2VuZGlmCiNpZm5kZWYgSTJDX0VCVVNSVwojZGVmaW5lIEkyQ19FQlVTUlcJCTMKI2VuZGlmCgojaWZuZGVmIE1BWAojZGVmaW5lIE1BWChhLGIpICgoKGEpPihiKSk/KGEpOihiKSkKI2RlZmluZSBNSU4oYSxiKSAoKChhKT4oYikpPyhiKTooYSkpCiNlbmRpZgoKZW51bSBJMkNfSU5TVEFOQ0VTCnsKCVNPQ19JMkMwLAoJU09DX0kyQzEsCglTTV9JMkMwLAoJU01fSTJDMSwKCUkyQ19NQVgKfTsKCi8vIEkyQyBzdGFuZGFyZCBidXMgc3BlZWQKZW51bQp7CglJMkNfU1RBTkRBUkRfU1BFRURfMTAwSyA9IDEwMCwKCUkyQ19TVEFOREFSRF9TUEVFRF80MDBLID0gNDAwLAp9OwoKLy8gSTJDIHNwZWVkIG1vZGUgcmVnaXN0ZXJzLCBub3RlIG91ciBJUCBkb2Vzbid0IHN1cHBvcnQgaGlnaCBzcGVlZCBtb2RlCmVudW0KewoJSTJDX1NUQU5EQVJEX1NQRUVEX01PREUgPSAxLCAvLyAxMDBLIGlzIHRoZSBkZWZhdWx0CglJMkNfRkFTVF9TUEVFRF9NT0RFICAgPSAyICAgIC8vIDQwMEsgaXMgdGhlIGRlZmF1bHQKCn07CgovLyBJMkMgc2xhdmUgYWRkcmVzcyB0eXBlCmVudW0KewoJSTJDXzdCSVRfU0xBVkVfQUREUgk9IDAsCglJMkNfMTBCSVRfU0xBVkVfQUREUiA9IDEKfTsKCi8vIHN0cnVjdHVyZSBmb3IgSTJDIFNEQS9TQ0wgdGltaW5nIGluZm9ybWF0aW9uLCB1c2VkIHdpdGggR1BJTyBJMkMgb3BlcmF0aW9uCnR5cGVkZWYgc3RydWN0IGkyY2Rldl9idXNfdGltaW5nX1R7CglpbnQgc3RhcnRfc3U7CS8vIFNUQVJUIHNldHVwIHRpbWUsIGluIHVuaXQgb2YgbmFuby1zZWNvbmQKCWludCBzdGFydF9oZDsJLy8gU1RBUlQgaG9sZCB0aW1lCglpbnQgc3RvcF9zdTsJLy8gU1RPUCBzZXR1cCB0aW1lCglpbnQgc3RvcF9oZDsJLy8gU1RPUCBob2xkIHRpbWUKCWludCBkYXRhX3N1OwkvLyBkYXRhIHNldHVwIHRpbWUKCWludCBkYXRhX2hkOwkvLyBkYXRhIGhvbGQgdGltZQoJaW50IGNsa19sb3c7CS8vIGNsb2NrIGxvdyBwZXJpb2QKCWludCBjbGtfaGlnaDsJLy8gY2xvY2sgaGlnaCBwZXJpb2QKCWludCB0aW1lb3V0OwkvLyB0aW1lb3V0IHZhbHVlIGluIHVuaXQgb2YgbmFuby1zZWNvbmQKfWkyY2Rldl9idXNfdGltaW5nX3Q7Cgp0eXBlZGVmIHN0cnVjdCBpMmNkZXZfYnVzX29wMV9UewoJaW50ICgqaW5pdCkoaW50KTsJCS8vIEkyQyBidXMgaW5pdGlhbGl6YXRpb24KCXZvaWQgKCpzZGFfc2V0KShpbnQpOwkJLy8gSTJDIGRhdGEgbGluZSBwdWxsIGhpZ2gKCXZvaWQgKCpzZGFfY2xyKShpbnQpOwkJLy8gSTJDIGRhdGEgbGluZSBwdWxsIGxvdwoJaW50ICgqc2RhX3JkKShpbnQpOwkJLy8gSTJDIGRhdGEgbGluZSBsYXRjaAoJdm9pZCAoKnNkYV90cmlzdGF0ZSkoaW50KTsJLy8gbWFrZSBJMkMgZGF0YSBsaW5lIHRyaS1zdGF0ZQoJdm9pZCAoKnNjbF9zZXQpKGludCk7CQkvLyBJMkMgY2xvY2sgbGluZSBwdWxsIGhpZ2gKCXZvaWQgKCpzY2xfY2xyKShpbnQpOwkJLy8gSTJDIGNsb2NrIGxpbmUgcHVsbCBsb3cKCWludCAoKnNjbF9yZCkoaW50KTsJCS8vIEkyQyBjbG9jayBsaW5lIGxhdGNoCn1pMmNkZXZfYnVzX29wMV90OwoKdHlwZWRlZiBzdHJ1Y3QgaTJjZGV2X2dwaW9fcGluX1QKewoJaW50IHNkYTsgCS8vd2hpY2ggZ3BpbyBwaW4gdG8gdXNlIGFzIHNkYQoJaW50IHNjbDsJLy93aGljaCBncGlvIHBpbiB0byB1c2UgYXMgc2NsCn0gaTJjZGV2X2dwaW9fcGluX3Q7CgojaWZkZWYgX19jcGx1c3BsdXNfXwpleHRlcm4gIkMiIHsKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBnbG9iYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGVU5DVElPTjogaW5pdCBJMkMgbWFzdGVyOiBzZXQgZGVmYXVsdCBidXMgc3BlZWQKICogUEFSQU1TOiBtYXN0ZXJfaWQgLSBpZCBvZiBJMkMgbWFzdGVyIHRvIGluaXQKICogUkVUVVJOOiBJMkNfT0sgLSBzdWNjZWVkCiAqICAgICAgICAgSTJDX0VCQURQQVJBTSAtIGludmFsaWQgcGFyYW1ldGVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGRpYWdfaTJjX21hc3Rlcl9pbml0KGludCBtYXN0ZXJfaWQpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZVTkNUSU9OOiBzZXQgSTJDIG1hc3RlciBidXMgc3BlZWQKICogUEFSQU1TOiBtYXN0ZXJfaWQgLSBpZCBvZiBJMkMgbWFzdGVyIHRvIGNvbmZpZwogKiAgICAgICAgIG1vZGUgLSBTVEFOREFSRCgxKSBvciBGQVNUKDIpCiAqICAgICAgICAgc3BlZWQgLSBpbiB1bml0IG9mIEtIegogKiBSRVRVUk46IEkyQ19PSyAtIHN1Y2NlZWQKICogICAgICAgICBJMkNfRUJVU1kgLSBJMkMgbW9kdWxlIGlzIGVuYWJsZWQKICogICAgICAgICBJMkNfRVVOU1VQUE9SVCAtIG5vdCBzdXBwb3J0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGRpYWdfaTJjX21hc3Rlcl9zZXRfc3BlZWQoaW50IG1hc3Rlcl9pZCwgaW50IG1vZGUsIGludCBzcGVlZCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRlVOQ1RJT046IHJlYWQgYnl0ZXMgZnJvbSBzbGF2ZSBkZXZpY2UKICogUEFSQU1TOiBtYXN0ZXJfaWQgLSBpZCBvZiBJMkMgbWFzdGVyIHRvIG9wZXJhdGUKICogICAgICAgICBzbGF2ZV9hZGRyIC0gYWRkcmVzcyBvZiBzbGF2ZSBkZXZpY2UKICogICAgICAgICBhZGRyX3R5cGUgLSBhZGRyZXNzIHR5cGU6IEkyQ183QklUX1NMQVZFX0FERFIgb3IgSTJDXzEwQklUX1NMQVZFX0FERFIKICogICAgICAgICBwd2J1ZiAtIHBvaW50ZXIgb2Ygd3JpdGUgYnVmZmVyCiAqICAgICAgICAgd251bSAtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQogKiAgICAgICAgIHByYnVmIC0gcG9pbnRlciBvZiByZWFkIGJ1ZmZlcgogKiAgICAgICAgIHJudW0gLSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAogKiBSRVRVUk46IEkyQ19PSyAtIHN1Y2NlZWQgICogICAgICAgICBJMkNfRUJVU1kgLSBJMkMgbW9kdWxlIGlzIGVuYWJsZWQKICogICAgICAgICBJMkNfRUJVU1JXIC0gcmVhZCBmYWlsCiAqIE5PVEU6IG1heGltdW0gd3JpdGUgYnl0ZXMgaXMgMjYwLCBtYXhpbXVtIHJlYWQgYnl0ZXMgaXMgMjU2IGluIGEgc2luZ2xlCiAqICAgICAgIHRyYW5zYWN0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGRpYWdfaTJjX21hc3Rlcl93cml0ZXJlYWRfYnl0ZXMoaW50IG1hc3Rlcl9pZCwgaW50IHNsYXZlX2FkZHIsIHVuc2lnbmVkIGNoYXIgKnB3YnVmLCBpbnQgd251bSwgdW5zaWduZWQgY2hhciAqcHJidWYsIGludCBybnVtKTsKCgppbnQgZGlhZ19pMmNfZ3Bpb19tYXN0ZXJfaW5pdChpbnQgbWFzdGVyX2lkKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRlVOQ1RJT046IHNldCBJMkMgR1BJTyBtYXN0ZXIgYnVzIHNwZWVkCiAqIFBBUkFNUzogbWFzdGVyX2lkIC0gaWQgb2YgSTJDIG1hc3RlciB0byBjb25maWcKICogICAgICAgICBzcGVlZCAtIGluIHVuaXQgb2YgS0h6CiAqIFJFVFVSTjogSTJDX09LIC0gc3VjY2VlZAogKiAJICAgCSAgIEkyQ19FUlJPUiAtIEkyQyBtb2R1bGUgaXMgZW5hYmxlZCBvciBzcGVlZCBub3Qgc3VwcG9ydAogKiBOT1RFOiBpbiBTVEFOREFSRCB0eXBlLCBvbmx5IDEwMCBhbmQgNDAwIEtIeiBzcGVlZCBhcmUgc3VwcG9ydGVkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGRpYWdfaTJjX2dwaW9fbWFzdGVyX3NldF9zcGVlZChpbnQgbWFzdGVyX2lkLCBpbnQgc3BlZWQpOwoKaW50IGRpYWdfaTJjX21hc3Rlcl9zZXRfYWRkcl90eXBlKGludCB0eXBlKTsKCmludCBkaWFnX2kyY19ncGlvX21hc3Rlcl93cml0ZXJlYWRfYnl0ZXMoaW50IG1hc3Rlcl9pZCwgaW50IHNsYXZlX2FkZHIsIGludCBhZGRyX3R5cGUsIHVuc2lnbmVkIGNoYXIgKnB3YnVmLCBpbnQgd251bSwgdW5zaWduZWQgY2hhciAqcHJidWYsIGludCBybnVtKTsKCnZvaWQgZGlhZ19pMmNfZ3Bpb19zZXRfcGlucyhpbnQgbWFzdGVyX2lkLCBpbnQgc2NsX3BpbiwgaW50IHNkYV9waW4pOwoKLy8gcG93ZXJvbiB1c2IgYnkgZXRoZXJuZXQKaW50IGRpYWdfaTJjX3Bvd2Vyb25fdXNiKGludCBtYXN0ZXJfaWQpOwoKI2lmZGVmIF9fY3BsdXNwbHVzX18KfQojZW5kaWYKCiNlbmRpZgo=