LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBQlNUUkFDVAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgQ09ORklHX1BBQ0tFVF9NTUFQIG9wdGlvbiBhdmFpbGFibGUgd2l0aCB0aGUgUEFDS0VUCnNvY2tldCBpbnRlcmZhY2Ugb24gMi40IGFuZCAyLjYga2VybmVscy4gVGhpcyB0eXBlIG9mIHNvY2tldHMgaXMgdXNlZCBmb3IgCmNhcHR1cmUgbmV0d29yayB0cmFmZmljIHdpdGggdXRpbGl0aWVzIGxpa2UgdGNwZHVtcCBvciBhbnkgb3RoZXIgdGhhdCB1c2VzIAp0aGUgbGlicGNhcCBsaWJyYXJ5LiAKCllvdSBjYW4gZmluZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdAoKICAgIGh0dHA6Ly9wdXNhLnV2LmVzL351bGlzc2VzL3BhY2tldF9tbWFwLwoKUGxlYXNlIHNlbmQgbWUgeW91ciBjb21tZW50cyB0bwoKICAgIFVsaXNzZXMgQWxvbnNvIENhbWFy8yA8dWFjYUBpLmhhdGUuc3BhbS5hbHVtbmkudXYuZXM+CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgV2h5IHVzZSBQQUNLRVRfTU1BUAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSW4gTGludXggMi40LzIuNiBpZiBQQUNLRVRfTU1BUCBpcyBub3QgZW5hYmxlZCwgdGhlIGNhcHR1cmUgcHJvY2VzcyBpcyB2ZXJ5CmluZWZmaWNpZW50LiBJdCB1c2VzIHZlcnkgbGltaXRlZCBidWZmZXJzIGFuZCByZXF1aXJlcyBvbmUgc3lzdGVtIGNhbGwKdG8gY2FwdHVyZSBlYWNoIHBhY2tldCwgaXQgcmVxdWlyZXMgdHdvIGlmIHlvdSB3YW50IHRvIGdldCBwYWNrZXQncyAKdGltZXN0YW1wIChsaWtlIGxpYnBjYXAgYWx3YXlzIGRvZXMpLgoKSW4gdGhlIG90aGVyIGhhbmQgUEFDS0VUX01NQVAgaXMgdmVyeSBlZmZpY2llbnQuIFBBQ0tFVF9NTUFQIHByb3ZpZGVzIGEgc2l6ZSAKY29uZmlndXJhYmxlIGNpcmN1bGFyIGJ1ZmZlciBtYXBwZWQgaW4gdXNlciBzcGFjZS4gVGhpcyB3YXkgcmVhZGluZyBwYWNrZXRzIGp1c3QgCm5lZWRzIHRvIHdhaXQgZm9yIHRoZW0sIG1vc3Qgb2YgdGhlIHRpbWUgdGhlcmUgaXMgbm8gbmVlZCB0byBpc3N1ZSBhIHNpbmdsZSAKc3lzdGVtIGNhbGwuIEJ5IHVzaW5nIGEgc2hhcmVkIGJ1ZmZlciBiZXR3ZWVuIHRoZSBrZXJuZWwgYW5kIHRoZSB1c2VyIAphbHNvIGhhcyB0aGUgYmVuZWZpdCBvZiBtaW5pbWl6aW5nIHBhY2tldCBjb3BpZXMuCgpJdCdzIGZpbmUgdG8gdXNlIFBBQ0tFVF9NTUFQIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBjYXB0dXJlIHByb2Nlc3MsIApidXQgaXQgaXNuJ3QgZXZlcnl0aGluZy4gQXQgbGVhc3QsIGlmIHlvdSBhcmUgY2FwdHVyaW5nIGF0IGhpZ2ggc3BlZWRzICh0aGlzIAppcyByZWxhdGl2ZSB0byB0aGUgY3B1IHNwZWVkKSwgeW91IHNob3VsZCBjaGVjayBpZiB0aGUgZGV2aWNlIGRyaXZlciBvZiB5b3VyIApuZXR3b3JrIGludGVyZmFjZSBjYXJkIHN1cHBvcnRzIHNvbWUgc29ydCBvZiBpbnRlcnJ1cHQgbG9hZCBtaXRpZ2F0aW9uIG9yIAooZXZlbiBiZXR0ZXIpIGlmIGl0IHN1cHBvcnRzIE5BUEksIGFsc28gbWFrZSBzdXJlIGl0IGlzIGVuYWJsZWQuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhvdyB0byB1c2UgQ09ORklHX1BBQ0tFVF9NTUFQCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGcm9tIHRoZSB1c2VyIHN0YW5kcG9pbnQsIHlvdSBzaG91bGQgdXNlIHRoZSBoaWdoZXIgbGV2ZWwgbGlicGNhcCBsaWJyYXJ5LCB3aGljaAppcyBhIGRlIGZhY3RvIHN0YW5kYXJkLCBwb3J0YWJsZSBhY3Jvc3MgbmVhcmx5IGFsbCBvcGVyYXRpbmcgc3lzdGVtcwppbmNsdWRpbmcgV2luMzIuIAoKU2FpZCB0aGF0LCBhdCB0aW1lIG9mIHRoaXMgd3JpdGluZywgb2ZmaWNpYWwgbGlicGNhcCAwLjguMSBpcyBvdXQgYW5kIGRvZXNuJ3QgaW5jbHVkZQpzdXBwb3J0IGZvciBQQUNLRVRfTU1BUCwgYW5kIGFsc28gcHJvYmFibHkgdGhlIGxpYnBjYXAgaW5jbHVkZWQgaW4geW91ciBkaXN0cmlidXRpb24uIAoKSSdtIGF3YXJlIG9mIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YgUEFDS0VUX01NQVAgaW4gbGlicGNhcDoKCiAgICBodHRwOi8vcHVzYS51di5lcy9+dWxpc3Nlcy9wYWNrZXRfbW1hcC8gIChieSBTaW1vbiBQYXRhcmluLCBiYXNlZCBvbiBsaWJwY2FwIDAuNi4yKQogICAgaHR0cDovL3B1YmxpYy5sYW5sLmdvdi9jcHcvICAgICAgICAgICAgICAoYnkgUGhpbCBXb29kLCBiYXNlZCBvbiBsYXN0ZXN0IGxpYnBjYXApCgpUaGUgcmVzdCBvZiB0aGlzIGRvY3VtZW50IGlzIGludGVuZGVkIGZvciBwZW9wbGUgd2hvIHdhbnQgdG8gdW5kZXJzdGFuZAp0aGUgbG93IGxldmVsIGRldGFpbHMgb3Igd2FudCB0byBpbXByb3ZlIGxpYnBjYXAgYnkgaW5jbHVkaW5nIFBBQ0tFVF9NTUFQCnN1cHBvcnQuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhvdyB0byB1c2UgQ09ORklHX1BBQ0tFVF9NTUFQIGRpcmVjdGx5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGcm9tIHRoZSBzeXN0ZW0gY2FsbHMgc3RhbmQgcG9pbnQsIHRoZSB1c2Ugb2YgUEFDS0VUX01NQVAgaW52b2x2ZXMKdGhlIGZvbGxvd2luZyBwcm9jZXNzOgoKCltzZXR1cF0gICAgIHNvY2tldCgpIC0tLS0tLS0+IGNyZWF0aW9uIG9mIHRoZSBjYXB0dXJlIHNvY2tldAogICAgICAgICAgICBzZXRzb2Nrb3B0KCkgLS0tPiBhbGxvY2F0aW9uIG9mIHRoZSBjaXJjdWxhciBidWZmZXIgKHJpbmcpCiAgICAgICAgICAgIG1tYXAoKSAtLS0tLS0tLS0+IG1hcHBpbmcgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJvY2VzcwoKW2NhcHR1cmVdICAgcG9sbCgpIC0tLS0tLS0tLT4gdG8gd2FpdCBmb3IgaW5jb21pbmcgcGFja2V0cwoKW3NodXRkb3duXSAgY2xvc2UoKSAtLS0tLS0tLT4gZGVzdHJ1Y3Rpb24gb2YgdGhlIGNhcHR1cmUgc29ja2V0IGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWFsbG9jYXRpb24gb2YgYWxsIGFzc29jaWF0ZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy4KCgpzb2NrZXQgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIGlzIHN0cmFpZ2h0IGZvcndhcmQsIGFuZCBpcyBkb25lIAp0aGUgc2FtZSB3YXkgd2l0aCBvciB3aXRob3V0IFBBQ0tFVF9NTUFQOgoKaW50IGZkOwoKZmQ9IHNvY2tldChQRl9QQUNLRVQsIG1vZGUsIGh0b25zKEVUSF9QX0FMTCkpCgp3aGVyZSBtb2RlIGlzIFNPQ0tfUkFXIGZvciB0aGUgcmF3IGludGVyZmFjZSB3ZXJlIGxpbmsgbGV2ZWwKaW5mb3JtYXRpb24gY2FuIGJlIGNhcHR1cmVkIG9yIFNPQ0tfREdSQU0gZm9yIHRoZSBjb29rZWQKaW50ZXJmYWNlIHdoZXJlIGxpbmsgbGV2ZWwgaW5mb3JtYXRpb24gY2FwdHVyZSBpcyBub3QgCnN1cHBvcnRlZCBhbmQgYSBsaW5rIGxldmVsIHBzZXVkby1oZWFkZXIgaXMgcHJvdmlkZWQgCmJ5IHRoZSBrZXJuZWwuCgpUaGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIHNvY2tldCBhbmQgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzCmlzIGRvbmUgYnkgYSBzaW1wbGUgY2FsbCB0byBjbG9zZShmZCkuCgpOZXh0IEkgd2lsbCBkZXNjcmliZSBQQUNLRVRfTU1BUCBzZXR0aW5ncyBhbmQgaXQncyBjb25zdHJhaW50cywKYWxzbyB0aGUgbWFwcGluZyBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIGluIHRoZSB1c2VyIHByb2Nlc3MgYW5kIAp0aGUgdXNlIG9mIHRoaXMgYnVmZmVyLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBQQUNLRVRfTU1BUCBzZXR0aW5ncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKClRvIHNldHVwIFBBQ0tFVF9NTUFQIGZyb20gdXNlciBsZXZlbCBjb2RlIGlzIGRvbmUgd2l0aCBhIGNhbGwgbGlrZQoKICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfUEFDS0VULCBQQUNLRVRfUlhfUklORywgKHZvaWQgKikgJnJlcSwgc2l6ZW9mKHJlcSkpCgpUaGUgbW9zdCBzaWduaWZpY2FudCBhcmd1bWVudCBpbiB0aGUgcHJldmlvdXMgY2FsbCBpcyB0aGUgcmVxIHBhcmFtZXRlciwgCnRoaXMgcGFyYW1ldGVyIG11c3QgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKCiAgICBzdHJ1Y3QgdHBhY2tldF9yZXEKICAgIHsKICAgICAgICB1bnNpZ25lZCBpbnQgICAgdHBfYmxvY2tfc2l6ZTsgIC8qIE1pbmltYWwgc2l6ZSBvZiBjb250aWd1b3VzIGJsb2NrICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIHRwX2Jsb2NrX25yOyAgICAvKiBOdW1iZXIgb2YgYmxvY2tzICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIHRwX2ZyYW1lX3NpemU7ICAvKiBTaXplIG9mIGZyYW1lICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIHRwX2ZyYW1lX25yOyAgICAvKiBUb3RhbCBudW1iZXIgb2YgZnJhbWVzICovCiAgICB9OwoKVGhpcyBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiAvdXNyL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmggYW5kIGVzdGFibGlzaGVzIGEgCmNpcmN1bGFyIGJ1ZmZlciAocmluZykgb2YgdW5zd2FwcGFibGUgbWVtb3J5IG1hcHBlZCBpbiB0aGUgY2FwdHVyZSBwcm9jZXNzLiAKQmVpbmcgbWFwcGVkIGluIHRoZSBjYXB0dXJlIHByb2Nlc3MgYWxsb3dzIHJlYWRpbmcgdGhlIGNhcHR1cmVkIGZyYW1lcyBhbmQgCnJlbGF0ZWQgbWV0YS1pbmZvcm1hdGlvbiBsaWtlIHRpbWVzdGFtcHMgd2l0aG91dCByZXF1aXJpbmcgYSBzeXN0ZW0gY2FsbC4KCkNhcHR1cmVkIGZyYW1lcyBhcmUgZ3JvdXBlZCBpbiBibG9ja3MuIEVhY2ggYmxvY2sgaXMgYSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgCnJlZ2lvbiBvZiBtZW1vcnkgYW5kIGhvbGRzIHRwX2Jsb2NrX3NpemUvdHBfZnJhbWVfc2l6ZSBmcmFtZXMuIFRoZSB0b3RhbCBudW1iZXIgCm9mIGJsb2NrcyBpcyB0cF9ibG9ja19uci4gTm90ZSB0aGF0IHRwX2ZyYW1lX25yIGlzIGEgcmVkdW5kYW50IHBhcmFtZXRlciBiZWNhdXNlCgogICAgZnJhbWVzX3Blcl9ibG9jayA9IHRwX2Jsb2NrX3NpemUvdHBfZnJhbWVfc2l6ZQoKaW5kZWVkLCBwYWNrZXRfc2V0X3JpbmcgY2hlY2tzIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgdHJ1ZQoKICAgIGZyYW1lc19wZXJfYmxvY2sgKiB0cF9ibG9ja19uciA9PSB0cF9mcmFtZV9ucgoKCkxldHMgc2VlIGFuIGV4YW1wbGUsIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6CgogICAgIHRwX2Jsb2NrX3NpemU9IDQwOTYKICAgICB0cF9mcmFtZV9zaXplPSAyMDQ4CiAgICAgdHBfYmxvY2tfbnIgID0gNAogICAgIHRwX2ZyYW1lX25yICA9IDgKCndlIHdpbGwgZ2V0IHRoZSBmb2xsb3dpbmcgYnVmZmVyIHN0cnVjdHVyZToKCiAgICAgICAgYmxvY2sgIzEgICAgICAgICAgICAgICAgIGJsb2NrICMyICAgICAgICAgCistLS0tLS0tLS0rLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSsgICAgCnwgZnJhbWUgMSB8IGZyYW1lIDIgfCAgICB8IGZyYW1lIDMgfCBmcmFtZSA0IHwgICAgCistLS0tLS0tLS0rLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSsgICAgCgogICAgICAgIGJsb2NrICMzICAgICAgICAgICAgICAgICBibG9jayAjNAorLS0tLS0tLS0tKy0tLS0tLS0tLSsgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0rCnwgZnJhbWUgNSB8IGZyYW1lIDYgfCAgICB8IGZyYW1lIDcgfCBmcmFtZSA4IHwKKy0tLS0tLS0tLSstLS0tLS0tLS0rICAgICstLS0tLS0tLS0rLS0tLS0tLS0tKwoKQSBmcmFtZSBjYW4gYmUgb2YgYW55IHNpemUgd2l0aCB0aGUgb25seSBjb25kaXRpb24gaXQgY2FuIGZpdCBpbiBhIGJsb2NrLiBBIGJsb2NrCmNhbiBvbmx5IGhvbGQgYW4gaW50ZWdlciBudW1iZXIgb2YgZnJhbWVzLCBvciBpbiBvdGhlciB3b3JkcywgYSBmcmFtZSBjYW5ub3QgCmJlIHNwYXduZWQgYWNjcm9zcyB0d28gYmxvY2tzLCBzbyB0aGVyZSBhcmUgc29tZSBkZXRhaWxzIHlvdSBoYXZlIHRvIHRha2UgaW50byAKYWNjb3VudCB3aGVuIGNob29zaW5nIHRoZSBmcmFtZV9zaXplLiBTZWUgIk1hcHBpbmcgYW5kIHVzZSBvZiB0aGUgY2lyY3VsYXIgCmJ1ZmZlciAocmluZykiLgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUEFDS0VUX01NQVAgc2V0dGluZyBjb25zdHJhaW50cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSW4ga2VybmVsIHZlcnNpb25zIHByaW9yIHRvIDIuNC4yNiAoZm9yIHRoZSAyLjQgYnJhbmNoKSBhbmQgMi42LjUgKDIuNiBicmFuY2gpLAp0aGUgUEFDS0VUX01NQVAgYnVmZmVyIGNvdWxkIGhvbGQgb25seSAzMjc2OCBmcmFtZXMgaW4gYSAzMiBiaXQgYXJjaGl0ZWN0dXJlIG9yCjE2Mzg0IGluIGEgNjQgYml0IGFyY2hpdGVjdHVyZS4gRm9yIGluZm9ybWF0aW9uIG9uIHRoZXNlIGtlcm5lbCB2ZXJzaW9ucwpzZWUgaHR0cDovL3B1c2EudXYuZXMvfnVsaXNzZXMvcGFja2V0X21tYXAvcGFja2V0X21tYXAucHJlLTIuNC4yNl8yLjYuNS50eHQKCiBCbG9jayBzaXplIGxpbWl0Ci0tLS0tLS0tLS0tLS0tLS0tLQoKQXMgc3RhdGVkIGVhcmxpZXIsIGVhY2ggYmxvY2sgaXMgYSBjb250aWd1b3VzIHBoeXNpY2FsIHJlZ2lvbiBvZiBtZW1vcnkuIFRoZXNlIAptZW1vcnkgcmVnaW9ucyBhcmUgYWxsb2NhdGVkIHdpdGggY2FsbHMgdG8gdGhlIF9fZ2V0X2ZyZWVfcGFnZXMoKSBmdW5jdGlvbi4gQXMgCnRoZSBuYW1lIGluZGljYXRlcywgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgcGFnZXMgb2YgbWVtb3J5LCBhbmQgdGhlIHNlY29uZAphcmd1bWVudCBpcyAib3JkZXIiIG9yIGEgcG93ZXIgb2YgdHdvIG51bWJlciBvZiBwYWdlcywgdGhhdCBpcyAKKGZvciBQQUdFX1NJWkUgPT0gNDA5Nikgb3JkZXI9MCA9PT4gNDA5NiBieXRlcywgb3JkZXI9MSA9PT4gODE5MiBieXRlcywgCm9yZGVyPTIgPT0+IDE2Mzg0IGJ5dGVzLCBldGMuIFRoZSBtYXhpbXVtIHNpemUgb2YgYSAKcmVnaW9uIGFsbG9jYXRlZCBieSBfX2dldF9mcmVlX3BhZ2VzIGlzIGRldGVybWluZWQgYnkgdGhlIE1BWF9PUkRFUiBtYWNyby4gTW9yZSAKcHJlY2lzZWx5IHRoZSBsaW1pdCBjYW4gYmUgY2FsY3VsYXRlZCBhczoKCiAgIFBBR0VfU0laRSA8PCBNQVhfT1JERVIKCiAgIEluIGEgaTM4NiBhcmNoaXRlY3R1cmUgUEFHRV9TSVpFIGlzIDQwOTYgYnl0ZXMgCiAgIEluIGEgMi40L2kzODYga2VybmVsIE1BWF9PUkRFUiBpcyAxMAogICBJbiBhIDIuNi9pMzg2IGtlcm5lbCBNQVhfT1JERVIgaXMgMTEKClNvIGdldF9mcmVlX3BhZ2VzIGNhbiBhbGxvY2F0ZSBhcyBtdWNoIGFzIDRNQiBvciA4TUIgaW4gYSAyLjQvMi42IGtlcm5lbCAKcmVzcGVjdGl2ZWx5LCB3aXRoIGFuIGkzODYgYXJjaGl0ZWN0dXJlLgoKVXNlciBzcGFjZSBwcm9ncmFtcyBjYW4gaW5jbHVkZSAvdXNyL2luY2x1ZGUvc3lzL3VzZXIuaCBhbmQgCi91c3IvaW5jbHVkZS9saW51eC9tbXpvbmUuaCB0byBnZXQgUEFHRV9TSVpFIE1BWF9PUkRFUiBkZWNsYXJhdGlvbnMuCgpUaGUgcGFnZXNpemUgY2FuIGFsc28gYmUgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSB3aXRoIHRoZSBnZXRwYWdlc2l6ZSAoMikgCnN5c3RlbSBjYWxsLiAKCgogQmxvY2sgbnVtYmVyIGxpbWl0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUbyB1bmRlcnN0YW5kIHRoZSBjb25zdHJhaW50cyBvZiBQQUNLRVRfTU1BUCwgd2UgaGF2ZSB0byBzZWUgdGhlIHN0cnVjdHVyZSAKdXNlZCB0byBob2xkIHRoZSBwb2ludGVycyB0byBlYWNoIGJsb2NrLgoKQ3VycmVudGx5LCB0aGlzIHN0cnVjdHVyZSBpcyBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB2ZWN0b3Igd2l0aCBrbWFsbG9jIApjYWxsZWQgcGdfdmVjLCBpdHMgc2l6ZSBsaW1pdHMgdGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBjYW4gYmUgYWxsb2NhdGVkLgoKICAgICstLS0rLS0tKy0tLSstLS0rCiAgICB8IHggfCB4IHwgeCB8IHggfAogICAgKy0tLSstLS0rLS0tKy0tLSsKICAgICAgfCAgIHwgICB8ICAgfAogICAgICB8ICAgfCAgIHwgICB2CiAgICAgIHwgICB8ICAgdiAgYmxvY2sgIzQKICAgICAgfCAgIHYgIGJsb2NrICMzCiAgICAgIHYgIGJsb2NrICMyCiAgICAgYmxvY2sgIzEKCgprbWFsbG9jIGFsbG9jYXRlcyBhbnkgbnVtYmVyIG9mIGJ5dGVzIG9mIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkgZnJvbSAKYSBwb29sIG9mIHByZS1kZXRlcm1pbmVkIHNpemVzLiBUaGlzIHBvb2wgb2YgbWVtb3J5IGlzIG1haW50YWluZWQgYnkgdGhlIHNsYWIgCmFsbG9jYXRvciB3aGljaCBpcyBhdCB0aGUgZW5kIHRoZSByZXNwb25zaWJsZSBmb3IgZG9pbmcgdGhlIGFsbG9jYXRpb24gYW5kIApoZW5jZSB3aGljaCBpbXBvc2VzIHRoZSBtYXhpbXVtIG1lbW9yeSB0aGF0IGttYWxsb2MgY2FuIGFsbG9jYXRlLiAKCkluIGEgMi40LzIuNiBrZXJuZWwgYW5kIHRoZSBpMzg2IGFyY2hpdGVjdHVyZSwgdGhlIGxpbWl0IGlzIDEzMTA3MiBieXRlcy4gVGhlIApwcmVkZXRlcm1pbmVkIHNpemVzIHRoYXQga21hbGxvYyB1c2VzIGNhbiBiZSBjaGVja2VkIGluIHRoZSAic2l6ZS08Ynl0ZXM+IiAKZW50cmllcyBvZiAvcHJvYy9zbGFiaW5mbwoKSW4gYSAzMiBiaXQgYXJjaGl0ZWN0dXJlLCBwb2ludGVycyBhcmUgNCBieXRlcyBsb25nLCBzbyB0aGUgdG90YWwgbnVtYmVyIG9mIApwb2ludGVycyB0byBibG9ja3MgaXMKCiAgICAgMTMxMDcyLzQgPSAzMjc2OCBibG9ja3MKCgogUEFDS0VUX01NQVAgYnVmZmVyIHNpemUgY2FsY3VsYXRvcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkRlZmluaXRpb25zOgoKPHNpemUtbWF4PiAgICA6IGlzIHRoZSBtYXhpbXVtIHNpemUgb2YgYWxsb2NhYmxlIHdpdGgga21hbGxvYyAoc2VlIC9wcm9jL3NsYWJpbmZvKQo8cG9pbnRlciBzaXplPjogZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlIC0tIHNpemVvZih2b2lkICopCjxwYWdlIHNpemU+ICAgOiBkZXBlbmRzIG9uIHRoZSBhcmNoaXRlY3R1cmUgLS0gUEFHRV9TSVpFIG9yIGdldHBhZ2VzaXplICgyKQo8bWF4LW9yZGVyPiAgIDogaXMgdGhlIHZhbHVlIGRlZmluZWQgd2l0aCBNQVhfT1JERVIKPGZyYW1lIHNpemU+ICA6IGl0J3MgYW4gdXBwZXIgYm91bmQgb2YgZnJhbWUncyBjYXB0dXJlIHNpemUgKG1vcmUgb24gdGhpcyBsYXRlcikKCmZyb20gdGhlc2UgZGVmaW5pdGlvbnMgd2Ugd2lsbCBkZXJpdmUgCgoJPGJsb2NrIG51bWJlcj4gPSA8c2l6ZS1tYXg+Lzxwb2ludGVyIHNpemU+Cgk8YmxvY2sgc2l6ZT4gPSA8cGFnZXNpemU+IDw8IDxtYXgtb3JkZXI+CgpzbywgdGhlIG1heCBidWZmZXIgc2l6ZSBpcwoKCTxibG9jayBudW1iZXI+ICogPGJsb2NrIHNpemU+CgphbmQsIHRoZSBudW1iZXIgb2YgZnJhbWVzIGJlCgoJPGJsb2NrIG51bWJlcj4gKiA8YmxvY2sgc2l6ZT4gLyA8ZnJhbWUgc2l6ZT4KClN1cHBvc2UgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLCB3aGljaCBhcHBseSBmb3IgMi42IGtlcm5lbCBhbmQgYW4KaTM4NiBhcmNoaXRlY3R1cmU6CgoJPHNpemUtbWF4PiA9IDEzMTA3MiBieXRlcwoJPHBvaW50ZXIgc2l6ZT4gPSA0IGJ5dGVzCgk8cGFnZXNpemU+ID0gNDA5NiBieXRlcwoJPG1heC1vcmRlcj4gPSAxMQoKYW5kIGEgdmFsdWUgZm9yIDxmcmFtZSBzaXplPiBvZiAyMDQ4IGJ5dGVzLiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgeWllbGQKCgk8YmxvY2sgbnVtYmVyPiA9IDEzMTA3Mi80ID0gMzI3NjggYmxvY2tzCgk8YmxvY2sgc2l6ZT4gPSA0MDk2IDw8IDExID0gOCBNaUIuCgphbmQgaGVuY2UgdGhlIGJ1ZmZlciB3aWxsIGhhdmUgYSAyNjIxNDQgTWlCIHNpemUuIFNvIGl0IGNhbiBob2xkIAoyNjIxNDQgTWlCIC8gMjA0OCBieXRlcyA9IDEzNDIxNzcyOCBmcmFtZXMKCgpBY3R1YWxseSwgdGhpcyBidWZmZXIgc2l6ZSBpcyBub3QgcG9zc2libGUgd2l0aCBhbiBpMzg2IGFyY2hpdGVjdHVyZS4gClJlbWVtYmVyIHRoYXQgdGhlIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4ga2VybmVsIHNwYWNlLCBpbiB0aGUgY2FzZSBvZiAKYW4gaTM4NiBrZXJuZWwncyBtZW1vcnkgc2l6ZSBpcyBsaW1pdGVkIHRvIDFHaUIuCgpBbGwgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBub3QgZnJlZWQgdW50aWwgdGhlIHNvY2tldCBpcyBjbG9zZWQuIFRoZSBtZW1vcnkgCmFsbG9jYXRpb25zIGFyZSBkb25lIHdpdGggR0ZQX0tFUk5FTCBwcmlvcml0eSwgdGhpcyBiYXNpY2FsbHkgbWVhbnMgdGhhdCAKdGhlIGFsbG9jYXRpb24gY2FuIHdhaXQgYW5kIHN3YXAgb3RoZXIgcHJvY2VzcycgbWVtb3J5IGluIG9yZGVyIHRvIGFsbG9jYXRlIAp0aGUgbmVjZXNzYXJ5IG1lbW9yeSwgc28gbm9ybWFsbHkgbGltaXRzIGNhbiBiZSByZWFjaGVkLgoKIE90aGVyIGNvbnN0cmFpbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0KCklmIHlvdSBjaGVjayB0aGUgc291cmNlIGNvZGUgeW91IHdpbGwgc2VlIHRoYXQgd2hhdCBJIGRyYXcgaGVyZSBhcyBhIGZyYW1lCmlzIG5vdCBvbmx5IHRoZSBsaW5rIGxldmVsIGZyYW1lLiBBdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZnJhbWUgdGhlcmUgaXMgYSAKaGVhZGVyIGNhbGxlZCBzdHJ1Y3QgdHBhY2tldF9oZHIgdXNlZCBpbiBQQUNLRVRfTU1BUCB0byBob2xkIGxpbmsgbGV2ZWwncyBmcmFtZQptZXRhIGluZm9ybWF0aW9uIGxpa2UgdGltZXN0YW1wLiBTbyB3aGF0IHdlIGRyYXcgaGVyZSBhIGZyYW1lIGl0J3MgcmVhbGx5IAp0aGUgZm9sbG93aW5nIChmcm9tIGluY2x1ZGUvbGludXgvaWZfcGFja2V0LmgpOgoKLyoKICAgRnJhbWUgc3RydWN0dXJlOgoKICAgLSBTdGFydC4gRnJhbWUgbXVzdCBiZSBhbGlnbmVkIHRvIFRQQUNLRVRfQUxJR05NRU5UPTE2CiAgIC0gc3RydWN0IHRwYWNrZXRfaGRyCiAgIC0gcGFkIHRvIFRQQUNLRVRfQUxJR05NRU5UPTE2CiAgIC0gc3RydWN0IHNvY2thZGRyX2xsCiAgIC0gR2FwLCBjaG9zZW4gc28gdGhhdCBwYWNrZXQgZGF0YSAoU3RhcnQrdHBfbmV0KSBhbGlnbnMgdG8gCiAgICAgVFBBQ0tFVF9BTElHTk1FTlQ9MTYKICAgLSBTdGFydCt0cF9tYWM6IFsgT3B0aW9uYWwgTUFDIGhlYWRlciBdCiAgIC0gU3RhcnQrdHBfbmV0OiBQYWNrZXQgZGF0YSwgYWxpZ25lZCB0byBUUEFDS0VUX0FMSUdOTUVOVD0xNi4KICAgLSBQYWQgdG8gYWxpZ24gdG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYKICovCiAgICAgICAgICAgCiAKIFRoZSBmb2xsb3dpbmcgYXJlIGNvbmRpdGlvbnMgdGhhdCBhcmUgY2hlY2tlZCBpbiBwYWNrZXRfc2V0X3JpbmcKCiAgIHRwX2Jsb2NrX3NpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFBBR0VfU0laRSAoMSkKICAgdHBfZnJhbWVfc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBUUEFDS0VUX0hEUkxFTiAob2J2aW91cykKICAgdHBfZnJhbWVfc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgVFBBQ0tFVF9BTElHTk1FTlQKICAgdHBfZnJhbWVfbnIgICBtdXN0IGJlIGV4YWN0bHkgZnJhbWVzX3Blcl9ibG9jayp0cF9ibG9ja19ucgoKTm90ZSB0aGF0IHRwX2Jsb2NrX3NpemUgc2hvdWxkIGJlIGNob3NlbiB0byBiZSBhIHBvd2VyIG9mIHR3byBvciB0aGVyZSB3aWxsCmJlIGEgd2FzdGUgb2YgbWVtb3J5LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBNYXBwaW5nIGFuZCB1c2Ugb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciAocmluZykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZSBtYXBwaW5nIG9mIHRoZSBidWZmZXIgaW4gdGhlIHVzZXIgcHJvY2VzcyBpcyBkb25lIHdpdGggdGhlIGNvbnZlbnRpb25hbCAKbW1hcCBmdW5jdGlvbi4gRXZlbiB0aGUgY2lyY3VsYXIgYnVmZmVyIGlzIGNvbXBvdW5kIG9mIHNldmVyYWwgcGh5c2ljYWxseQpkaXNjb250aWd1b3VzIGJsb2NrcyBvZiBtZW1vcnksIHRoZXkgYXJlIGNvbnRpZ3VvdXMgdG8gdGhlIHVzZXIgc3BhY2UsIGhlbmNlCmp1c3Qgb25lIGNhbGwgdG8gbW1hcCBpcyBuZWVkZWQ6CgogICAgbW1hcCgwLCBzaXplLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOwoKSWYgdHBfZnJhbWVfc2l6ZSBpcyBhIGRpdmlzb3Igb2YgdHBfYmxvY2tfc2l6ZSBmcmFtZXMgd2lsbCBiZSAKY29udGlndW9zbHkgc3BhY2VkIGJ5IHRwX2ZyYW1lX3NpemUgYnl0ZXMuIElmIG5vdCwgZWFjaCAKdHBfYmxvY2tfc2l6ZS90cF9mcmFtZV9zaXplIGZyYW1lcyB0aGVyZSB3aWxsIGJlIGEgZ2FwIGJldHdlZW4gCnRoZSBmcmFtZXMuIFRoaXMgaXMgYmVjYXVzZSBhIGZyYW1lIGNhbm5vdCBiZSBzcGF3biBhY3Jvc3MgdHdvCmJsb2Nrcy4gCgpBdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZnJhbWUgdGhlcmUgaXMgYW4gc3RhdHVzIGZpZWxkIChzZWUgCnN0cnVjdCB0cGFja2V0X2hkcikuIElmIHRoaXMgZmllbGQgaXMgMCBtZWFucyB0aGF0IHRoZSBmcmFtZSBpcyByZWFkeQp0byBiZSB1c2VkIGZvciB0aGUga2VybmVsLCBJZiBub3QsIHRoZXJlIGlzIGEgZnJhbWUgdGhlIHVzZXIgY2FuIHJlYWQgCmFuZCB0aGUgZm9sbG93aW5nIGZsYWdzIGFwcGx5OgoKICAgICBmcm9tIGluY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKCiAgICAgI2RlZmluZSBUUF9TVEFUVVNfQ09QWSAgICAgICAgICAyIAogICAgICNkZWZpbmUgVFBfU1RBVFVTX0xPU0lORyAgICAgICAgNCAKICAgICAjZGVmaW5lIFRQX1NUQVRVU19DU1VNTk9UUkVBRFkgIDggCgoKVFBfU1RBVFVTX0NPUFkgICAgICAgIDogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBmcmFtZSAoYW5kIGFzc29jaWF0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSBpbmZvcm1hdGlvbikgaGFzIGJlZW4gdHJ1bmNhdGVkIGJlY2F1c2UgaXQncyAKICAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyIHRoYW4gdHBfZnJhbWVfc2l6ZS4gVGhpcyBwYWNrZXQgY2FuIGJlIAogICAgICAgICAgICAgICAgICAgICAgICByZWFkIGVudGlyZWx5IHdpdGggcmVjdmZyb20oKS4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIEluIG9yZGVyIHRvIG1ha2UgdGhpcyB3b3JrIGl0IG11c3QgdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBwcmV2aW91c2x5IHdpdGggc2V0c29ja29wdCgpIGFuZCAKICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFBBQ0tFVF9DT1BZX1RIUkVTSCBvcHRpb24uIAoKICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBmcmFtZXMgdGhhbiBjYW4gYmUgYnVmZmVyZWQgdG8gCiAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlYWQgd2l0aCByZWN2ZnJvbSBpcyBsaW1pdGVkIGxpa2UgYSBub3JtYWwgc29ja2V0LgogICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIFNPX1JDVkJVRiBvcHRpb24gaW4gdGhlIHNvY2tldCAoNykgbWFuIHBhZ2UuCgpUUF9TVEFUVVNfTE9TSU5HICAgICAgOiBpbmRpY2F0ZXMgdGhlcmUgd2VyZSBwYWNrZXQgZHJvcHMgZnJvbSBsYXN0IHRpbWUgCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpc3RpY3Mgd2hlcmUgY2hlY2tlZCB3aXRoIGdldHNvY2tvcHQoKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFBBQ0tFVF9TVEFUSVNUSUNTIG9wdGlvbi4KClRQX1NUQVRVU19DU1VNTk9UUkVBRFk6IGN1cnJlbnRseSBpdCdzIHVzZWQgZm9yIG91dGdvaW5nIElQIHBhY2tldHMgd2hpY2ggCiAgICAgICAgICAgICAgICAgICAgICAgIGl0J3MgY2hlY2tzdW0gd2lsbCBiZSBkb25lIGluIGhhcmR3YXJlLiBTbyB3aGlsZSAKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGluZyB0aGUgcGFja2V0IHdlIHNob3VsZCBub3QgdHJ5IHRvIGNoZWNrIHRoZSAKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0uIAoKZm9yIGNvbnZlbmllbmNlIHRoZXJlIGFyZSBhbHNvIHRoZSBmb2xsb3dpbmcgZGVmaW5lczoKCiAgICAgI2RlZmluZSBUUF9TVEFUVVNfS0VSTkVMICAgICAgICAwCiAgICAgI2RlZmluZSBUUF9TVEFUVVNfVVNFUiAgICAgICAgICAxCgpUaGUga2VybmVsIGluaXRpYWxpemVzIGFsbCBmcmFtZXMgdG8gVFBfU1RBVFVTX0tFUk5FTCwgd2hlbiB0aGUga2VybmVsCnJlY2VpdmVzIGEgcGFja2V0IGl0IHB1dHMgaW4gdGhlIGJ1ZmZlciBhbmQgdXBkYXRlcyB0aGUgc3RhdHVzIHdpdGgKYXQgbGVhc3QgdGhlIFRQX1NUQVRVU19VU0VSIGZsYWcuIFRoZW4gdGhlIHVzZXIgY2FuIHJlYWQgdGhlIHBhY2tldCwKb25jZSB0aGUgcGFja2V0IGlzIHJlYWQgdGhlIHVzZXIgbXVzdCB6ZXJvIHRoZSBzdGF0dXMgZmllbGQsIHNvIHRoZSBrZXJuZWwgCmNhbiB1c2UgYWdhaW4gdGhhdCBmcmFtZSBidWZmZXIuCgpUaGUgdXNlciBjYW4gdXNlIHBvbGwgKGFueSBvdGhlciB2YXJpYW50IHNob3VsZCBhcHBseSB0b28pIHRvIGNoZWNrIGlmIG5ldwpwYWNrZXRzIGFyZSBpbiB0aGUgcmluZzoKCiAgICBzdHJ1Y3QgcG9sbGZkIHBmZDsKCiAgICBwZmQuZmQgPSBmZDsKICAgIHBmZC5yZXZlbnRzID0gMDsKICAgIHBmZC5ldmVudHMgPSBQT0xMSU58UE9MTFJETk9STXxQT0xMRVJSOwoKICAgIGlmIChzdGF0dXMgPT0gVFBfU1RBVFVTX0tFUk5FTCkKICAgICAgICByZXR2YWwgPSBwb2xsKCZwZmQsIDEsIHRpbWVvdXQpOwoKSXQgZG9lc24ndCBpbmN1ciBpbiBhIHJhY2UgY29uZGl0aW9uIHRvIGZpcnN0IGNoZWNrIHRoZSBzdGF0dXMgdmFsdWUgYW5kIAp0aGVuIHBvbGwgZm9yIGZyYW1lcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgVEhBTktTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIAogICBKZXNzZSBCcmFuZGVidXJnLCBmb3IgZml4aW5nIG15IGdyYW1tYXRoaWNhbC9zcGVsbGluZyBlcnJvcnMKCg==