LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICogQGZpbGUgICAgIHN5c3RlbV9YTUM0NDAwLmMNCiAqIEBicmllZiAgICBDTVNJUyBDb3J0ZXgtTTQgRGV2aWNlIFBlcmlwaGVyYWwgQWNjZXNzIExheWVyIEhlYWRlciBGaWxlDQogKiAgICAgICAgICAgZm9yIHRoZSBJbmZpbmVvbiBYTUM0NTAwIERldmljZSBTZXJpZXMNCiAqIEB2ZXJzaW9uICBWMy4wLjEgQWxwaGENCiAqIEBkYXRlICAgICAxNy4gU2VwdGVtYmVyIDIwMTINCiAqDQogKiBAbm90ZQ0KICogQ29weXJpZ2h0IChDKSAyMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIEBwYXINCiAqIEFSTSBMaW1pdGVkIChBUk0pIGlzIHN1cHBseWluZyB0aGlzIHNvZnR3YXJlIGZvciB1c2Ugd2l0aCBDb3J0ZXgtTQ0KICogcHJvY2Vzc29yIGJhc2VkIG1pY3JvY29udHJvbGxlcnMuICBUaGlzIGZpbGUgY2FuIGJlIGZyZWVseSBkaXN0cmlidXRlZA0KICogd2l0aGluIGRldmVsb3BtZW50IHRvb2xzIHRoYXQgYXJlIHN1cHBvcnRpbmcgc3VjaCBBUk0gYmFzZWQgcHJvY2Vzc29ycy4NCiAqDQogKiBAcGFyDQogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIuICBOTyBXQVJSQU5USUVTLCBXSEVUSEVSIEVYUFJFU1MsIElNUExJRUQNCiAqIE9SIFNUQVRVVE9SWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUFBMWSBUTyBUSElTIFNPRlRXQVJFLg0KICogQVJNIFNIQUxMIE5PVCwgSU4gQU5ZIENJUkNVTVNUQU5DRVMsIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1INCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUywgRk9SIEFOWSBSRUFTT04gV0hBVFNPRVZFUi4NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSA8c3lzdGVtX1hNQzQ0MDAuaD4NCiNpbmNsdWRlIDxYTUM0NDAwLmg+DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykqLw0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrOw0KDQovKiBjbG9jayBkZWZpbml0aW9ucywgZG8gbm90IG1vZGlmeSEgKi8NCiNkZWZpbmUgU0NVX0NMT0NLX0NSWVNUQUwgICAgICAgICAgICAgIAkxDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkJCSAgIAkyDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQwkgICAJMw0KDQoNCiNkZWZpbmUgSElCX0NMT0NLX0ZPU0kJCQkJCTENCiNkZWZpbmUgSElCX0NMT0NLX09TQ1VMUAkJCQkyDQoNCg0KDQoNCi8qDQovLy0tLS0tLS0tIDw8PCBVc2UgQ29uZmlndXJhdGlvbiBXaXphcmQgaW4gQ29udGV4dCBNZW51ID4+PiAtLS0tLS0tLS0tLS0tLS0tLS0NCiovDQoNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXRjaGRvZyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLyA8ZT4gV2F0Y2hkb2cgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wPiBEaXNhYmxlIFdhdGNoZG9nDQovLw0KLy8gPC9lPg0KKi8NCiNkZWZpbmUgV0RUX1NFVFVQICAgICAgICAgICAgICAgMQ0KI2RlZmluZSBXRFRFTkJfblZhbCAgICAgICAgICAgICAweDAwMDAwMDAxDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENMT0NLIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBNYWluIENsb2NrIENvbmZpZ3VyYXRpb24NCi8vICAgICA8bzEuMC4uMT4gQ1BVIGNsb2NrIGRpdmlkZXINCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiBmQ1BVID0gZlNZUw0KLy8gICAgICAgICAgICAgICAgICAgICA8MT0+IGZDUFUgPSBmU1lTIC8gMg0KLy8gICAgIDxvMi4wLi4xPiAgUGVyaXBoZXJhbCBCdXMgY2xvY2sgZGl2aWRlcg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IGZQQgk9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmUEIJPSBmQ1BVIC8gMg0KLy8gICAgIDxvMy4wLi4xPiAgQ0NVIEJ1cyBjbG9jayBkaXZpZGVyDQovLyAgICAgICAgICAgICAgICAgICAgIDwwPT4gZkNDVSA9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmQ0NVID0gZkNQVSAvIDINCi8vDQovLyA8L2U+DQovLw0KKi8NCg0KI2RlZmluZSBTQ1VfQ0xPQ0tfU0VUVVAgICAgICAgICAgICAgICAxDQojZGVmaW5lCVNDVV9DUFVDTEtDUl9ESVYJCTB4MDAwMDAwMDANCiNkZWZpbmUJU0NVX1BCQ0xLQ1JfRElWCQkgICAgMHgwMDAwMDAwMA0KI2RlZmluZQlTQ1VfQ0NVQ0xLQ1JfRElWCQkweDAwMDAwMDAwDQovKiBub3QgYXZhbGlibGUgaW4gY29uZmlnIHdpenphcmQqLw0KLyoNCiogbWFuZGF0b3J5IGNsb2NrIHBhcmFtZXRlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCioNCiogc291cmNlIGZvciBjbG9jayBnZW5lcmF0aW9uDQoqIHJhbmdlOiBTQ1VfQ0xPQ0tfQ1JZU1RBTCAoY3J5c3RhbCBvciBleHRlcm5hbCBjbG9jayBhdCBjcnlzdGFsIGlucHV0KQ0KKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovLyBTZWxlY3Rpb24gb2YgaW1wdXQgbG9jayBmb3IgUExMDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUJU0NVX1BMTF9DTE9DS19JTlBVVAlTQ1VfQ0xPQ0tfQ1JZU1RBTA0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWQ0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8gU3RhbmRieSBjbG9jayBzZWxlY3Rpb24gZm9yIEJhY2t1cCBjbG9jayBzb3VyY2UgdHJpbW1pbmcNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZQlTQ1VfU1RBTkRCWV9DTE9DSyAgSElCX0NMT0NLX09TQ1VMUA0KLy8jZGVmaW5lCVNDVV9TVEFOREJZX0NMT0NLICBISUJfQ0xPQ0tfRk9TSQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vIEdsb2JhbCBjbG9jayBwYXJhbWV0ZXJzDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgQ0xPQ0tfRlNZUwkJCQkJCQkxMjAwMDAwMDANCiNkZWZpbmUJQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kJMTIwMDAwMDANCiNkZWZpbmUJQ0xPQ0tfQkFDS19VUAkJCQkJCTI0MDAwMDAwDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogT1NDX0hQIHNldHVwIHBhcmFtZXRlcnMgKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZQlTQ1VfT1NDX0hQX01PREUJMHhGMA0KI2RlZmluZQlTQ1VfT1NDSFBXREdESVYJMg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIE1BSU4gUExMIHNldHVwIHBhcmFtZXRlcnMgKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy9EaXZpZGVyIHNldHRpbmdzIGZvciBleHRlcm5hbCBjcnlzdGFsIEAgMTIgTUh6DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgCVNDVV9QTExfSzFESVYJMQ0KI2RlZmluZSAJU0NVX1BMTF9LMkRJVgkzDQojZGVmaW5lIAlTQ1VfUExMX1BESVYJMQ0KI2RlZmluZSAJU0NVX1BMTF9ORElWCTc5DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy9EaXZpZGVyIHNldHRpbmdzIGZvciB1c2Ugb2YgYmFja3VwIGNsb2NrIHNvdXJjZSB0cmltbWVkDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vI2RlZmluZSAJU0NVX1BMTF9LMURJVgkxDQovLyNkZWZpbmUgCVNDVV9QTExfSzJESVYJMw0KLy8jZGVmaW5lIAlTQ1VfUExMX1BESVYJMw0KLy8jZGVmaW5lIAlTQ1VfUExMX05ESVYJNzkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQiBDTE9DSyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBVU0IgQ2xvY2sgQ29uZmlndXJhdGlvbg0KLy8NCi8vIDwvZT4NCi8vDQoqLw0KDQojZGVmaW5lIFNDVV9VU0JfQ0xPQ0tfU0VUVVAgICAgICAgICAgICAgIDANCi8qIG5vdCBhdmFsaWJsZSBpbiBjb25maWcgd2l6emFyZCovDQojZGVmaW5lIAlTQ1VfVVNCUExMX1BESVYJMA0KI2RlZmluZSAJU0NVX1VTQlBMTF9ORElWCTMxDQojZGVmaW5lIAlTQ1VfVVNCRElWCTMNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmxhc2ggV2FpdCBTdGF0ZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLyA8ZT4gRmxhc2ggV2FpdCBTdGF0ZSBDb25maWd1cmF0aW9uDQovLyAgICAgPG8xLjAuLjM+ICAgRmxhc2ggV2FpdCBTdGF0ZQ0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IDMgV1MNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiA0IFdTDQovLyAgICAgICAgICAgICAgICAgICAgIDwyPT4gNSBXUw0KLy8JCQkJCQkJCQkJIDwzPT4gNiBXUw0KLy8gPC9lPg0KLy8NCiovDQoNCiNkZWZpbmUgUE1VX0ZMQVNIICAgICAgICAgICAgIDENCiNkZWZpbmUJUE1VX0ZMQVNIX1dTCQkJCQkweDAwMDAwMDAwDQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0xPQ0tPVVQgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gPGU+IENsb2NrIE9VVCBDb25maWd1cmF0aW9uDQovLyAgICAgPG8xLjAuLjE+ICAgQ2xvY2tvdXQgU291cmNlIFNlbGVjdGlvbg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IFN5c3RlbSBDbG9jaw0KLy8gICAgICAgICAgICAgICAgICAgICA8Mj0+IERpdmlkZWQgdmFsdWUgb2YgVVNCIFBMTCBvdXRwdXQNCi8vICAgICAgICAgICAgICAgICAgICAgPDM9PiBEaXZpZGVkIHZhbHVlIG9mIFBMTCBDbG9jaw0KLy8gICAgIDxvMi4wLi40PiAgIENsb2Nrb3V0IGRpdmlkZXIgPDEtMTA+PCMtMT4NCi8vICAgICA8bzMuMC4uMT4gICBDbG9ja291dCBQaW4gU2VsZWN0aW9uDQovLyAgICAgICAgICAgICAgICAgICAgIDwwPT4gUDEuMTUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBQMC44DQovLw0KLy8NCi8vIDwvZT4NCi8vDQoqLw0KDQojZGVmaW5lIFNDVV9DTE9DS09VVF9TRVRVUCAgICAgICAgICAgICAgIDANCiNkZWZpbmUJU0NVX0NMT0NLT1VUX1NPVVJDRQkJMHgwMDAwMDAwMA0KI2RlZmluZQlTQ1VfQ0xPQ0tPVVRfRElWCQkweDAwMDAwMDA5DQojZGVmaW5lCVNDVV9DTE9DS09VVF9QSU4JCTB4MDAwMDAwMDENCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIENsb2NrIFZhcmlhYmxlIGRlZmluaXRpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyohPCBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5IChDb3JlIENsb2NrKSovDQojaWYgU0NVX0NMT0NLX1NFVFVQDQp1aW50MzJfdCBTeXN0ZW1Db3JlQ2xvY2sgPSBDTE9DS19GU1lTOw0KI2Vsc2UNCnVpbnQzMl90IFN5c3RlbUNvcmVDbG9jayA9IENMT0NLX0JBQ0tfVVA7DQojZW5kaWYNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIHN0YXRpYyBmdW5jdGlvbnMgZGVjbGFyYXRpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2lmIChTQ1VfQ0xPQ0tfU0VUVVAgPT0gMSkNCnN0YXRpYyBpbnQgU3lzdGVtQ2xvY2tTZXR1cCh2b2lkKTsNCiNlbmRpZg0KDQojaWYgKFNDVV9VU0JfQ0xPQ0tfU0VUVVAgPT0gMSkNCnN0YXRpYyBpbnQgVVNCQ2xvY2tTZXR1cCh2b2lkKTsNCiNlbmRpZg0KDQoNCi8qKg0KICAqIEBicmllZiAgU2V0dXAgdGhlIG1pY3JvY29udHJvbGxlciBzeXN0ZW0uDQogICogICAgICAgICBJbml0aWFsaXplIHRoZSBQTEwgYW5kIHVwZGF0ZSB0aGUNCiAgKiAgICAgICAgIFN5c3RlbUNvcmVDbG9jayB2YXJpYWJsZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU3lzdGVtSW5pdCh2b2lkKQ0Kew0KaW50IHRlbXA7DQoNCiNpZiAoX19GUFVfUFJFU0VOVCA9PSAxKSAmJiAoX19GUFVfVVNFRCA9PSAxKQ0KU0NCLT5DUEFDUiB8PSAoKDNVTCA8PCAxMCoyKSB8ICAgICAgICAgICAgICAgICAvKiBzZXQgQ1AxMCBGdWxsIEFjY2VzcyAqLw0KICAgICAgICAgICAgICAgKDNVTCA8PCAxMSoyKSAgKTsgICAgICAgICAgICAgICAvKiBzZXQgQ1AxMSBGdWxsIEFjY2VzcyAqLw0KI2VuZGlmDQoNCi8qIEVuYWJsZSB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyAtIFNDQl9DQ1IuVU5BTElHTl9UUlAgPSAwICovDQpTQ0ItPkNDUiAmPSB+KFNDQl9DQ1JfVU5BTElHTl9UUlBfTXNrKTsNCg0KLyogU2V0dXAgdGhlIFdEVCAqLw0KI2lmIFdEVF9TRVRVUA0KDQpXRFQtPkNUUiAmPSB+V0RURU5CX25WYWw7DQoNCiNlbmRpZg0KDQoNCi8qIFNldHVwIHRoZSBGbGFzaCBXYWl0IFN0YXRlICovDQojaWYgUE1VX0ZMQVNIDQp0ZW1wID0gRkxBU0gwLT5GQ09OOw0KdGVtcCAmPSB+RkxBU0hfRkNPTl9XU1BGTEFTSF9Nc2s7DQp0ZW1wIHw9IFBNVV9GTEFTSF9XUyszOw0KRkxBU0gwLT5GQ09OID0gdGVtcDsNCiNlbmRpZg0KDQoNCi8qIFNldHVwIHRoZSBjbG9ja291dCAqLw0KI2lmIFNDVV9DTE9DS09VVF9TRVRVUA0KDQpTQ1VfQ0xLLT5FWFRDTEtDUgl8PSBTQ1VfQ0xPQ0tPVVRfU09VUkNFOw0KLypzZXQgUExMIGRpdiBmb3IgY2xrb3V0ICovDQpTQ1VfQ0xLLT5FWFRDTEtDUgl8PSBTQ1VfQ0xPQ0tPVVRfRElWPDwxNjsNCg0KaWYgKFNDVV9DTE9DS09VVF9QSU4pIHsNCgkJCQkJCVBPUlQwLT5JT0NSOCA9IDB4MDAwMDAwODg7ICAgLypQMC44IC0tPiBBTFQxIHNlbGVjdCArICBIV1NFTCAqLw0KCQkJCQkgICAgUE9SVDAtPkhXU0VMICY9ICh+UE9SVDBfSFdTRUxfSFc4X01zayk7DQoJCQkJCSAgICBQT1JUMC0+UERSMSAmPSAoflBPUlQwX1BEUjFfUEQ4X01zayk7ICAvKnNldCB0byBzdHJvbmcgZHJpdmVyICovDQoJCQkJCQl9DQplbHNlIHsNCgkJUE9SVDEtPklPQ1IxMiA9IDB4ODgwMDAwMDA7ICAgICAgICAgICAgICAgICAgICAvKlAxLjE1LS0+IEFMVDEgc2VsZWN0ICovDQoJICAgIFBPUlQxLT5QRFIxICY9ICh+UE9SVDFfUERSMV9QRDE1X01zayk7ICAvKnNldCB0byBzdHJvbmcgZHJpdmVyICovDQoJCX0NCg0KI2VuZGlmDQoNCg0KLyogU2V0dXAgdGhlIFN5c3RlbSBjbG9jayAqLw0KI2lmIFNDVV9DTE9DS19TRVRVUA0KU3lzdGVtQ2xvY2tTZXR1cCgpOw0KI2VuZGlmDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NClN5c3RlbUNvcmVDbG9ja1VwZGF0ZSgpOy8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykqLw0KDQoNCi8qIFNldHVwIHRoZSBVU0IgUEwgKi8NCiNpZiBTQ1VfVVNCX0NMT0NLX1NFVFVQDQpVU0JDbG9ja1NldHVwKCk7DQojZW5kaWYNCg0KDQoNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIFVwZGF0ZSBTeXN0ZW1Db3JlQ2xvY2sgYWNjb3JkaW5nIHRvIENsb2NrIFJlZ2lzdGVyIFZhbHVlcw0KICAqIEBub3RlICAgLQ0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBTeXN0ZW1Db3JlQ2xvY2tVcGRhdGUodm9pZCkNCnsNCnVuc2lnbmVkIGludCBQRElWOw0KdW5zaWduZWQgaW50IE5ESVY7DQp1bnNpZ25lZCBpbnQgSzJESVY7DQp1bnNpZ25lZCBpbnQgbG9uZyBWQ087DQoNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIENsb2NrIFZhcmlhYmxlIGRlZmluaXRpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KaWYgKFNDVV9DTEstPlNZU0NMS0NSID09ICAweDAwMDEwMDAwKQ0Kew0KCWlmIChTQ1VfUExMLT5QTExTVEFUICYgU0NVX1BMTF9QTExTVEFUX1ZDT0xPQ0tfTXNrKXsNCgkJLyogY2hlY2sgaWYgUExMIGlzIGxvY2tlZCAqLw0KCQkvKiByZWFkIGJhY2sgZGl2aWRlciBzZXR0aW5ncyAqLw0KCQkgUERJViA9ICgoU0NVX1BMTC0+UExMQ09OMSAmIFNDVV9QTExfUExMQ09OMV9QRElWX01zayk+PjI0KSsxOw0KCQkgTkRJViA9ICgoU0NVX1BMTC0+UExMQ09OMSAmIFNDVV9QTExfUExMQ09OMV9ORElWX01zayk+PjgpKzE7DQoJCSBLMkRJViAgPSAoKFNDVV9QTEwtPlBMTENPTjEgJiBTQ1VfUExMX1BMTENPTjFfSzJESVZfTXNrKT4+MTYpKzE7DQoNCgkJaWYoU0NVX1BMTC0+UExMQ09OMiAmIFNDVV9QTExfUExMQ09OMl9QSU5TRUxfTXNrKXsNCgkJLyogdGhlIHNlbGVjdGVkIGNsb2NrIGlzIHRoZSBCYWNrdXAgY2xvY2sgZm9maSAqLw0KCQlWQ08gPSAoQ0xPQ0tfQkFDS19VUC9QRElWKSpORElWOw0KCQlTeXN0ZW1Db3JlQ2xvY2sgPSBWQ08vSzJESVY7DQoJCS8qIGluIGNhc2UgdGhlIHN5c2Nsb2NrIGRpdiBpcyB1c2VkICovDQoJCVN5c3RlbUNvcmVDbG9jayA9IFN5c3RlbUNvcmVDbG9jay8oKFNDVV9DTEstPlNZU0NMS0NSICYgU0NVX0NMS19TWVNDTEtDUl9TWVNESVZfTXNrKSsxKTsNCg0KCQl9DQoJCWVsc2UNCgkJew0KCQkvKiB0aGUgc2VsZWN0ZWQgY2xvY2sgaXMgdGhlIFBMTCBleHRlcm5hbCBvc2NpbGxhdG9yICovDQoJCVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS9QRElWKSpORElWOw0KCQlTeXN0ZW1Db3JlQ2xvY2sgPSBWQ08vSzJESVY7DQoJCS8qIGluIGNhc2UgdGhlIHN5c2Nsb2NrIGRpdiBpcyB1c2VkICovDQoJCVN5c3RlbUNvcmVDbG9jayA9IFN5c3RlbUNvcmVDbG9jay8oKFNDVV9DTEstPlNZU0NMS0NSICYgU0NVX0NMS19TWVNDTEtDUl9TWVNESVZfTXNrKSsxKTsNCgkJfQ0KDQoNCgl9DQp9DQplbHNlDQp7DQpTeXN0ZW1Db3JlQ2xvY2sgPSBDTE9DS19CQUNLX1VQOw0KfQ0KDQoNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIC0NCiAgKiBAbm90ZSAgIC0NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCiNpZiAoU0NVX0NMT0NLX1NFVFVQID09IDEpDQpzdGF0aWMgaW50IFN5c3RlbUNsb2NrU2V0dXAodm9pZCkNCnsNCmludCB0ZW1wOw0KdW5zaWduZWQgaW50IGxvbmcgVkNPOw0KaW50IHN0ZXBwaW5nX0syRElWOw0KDQovKiB0aGlzIHdlYWsgZnVuY3Rpb24gZW5hYmxlcyBEQVZFMyBjbG9jayBBcHAgdXNhZ2UgKi8NCmlmKEFsbG93UExMSW5pdEJ5U3RhcnR1cCgpKXsNCg0KLyogY2hlY2sgaWYgUExMIGlzIHN3aXRjaGVkIG9uICovDQppZiAoKFNDVV9QTEwtPlBMTENPTjAgJihTQ1VfUExMX1BMTENPTjBfVkNPUFdEX01zayB8IFNDVV9QTExfUExMQ09OMF9QTExQV0RfTXNrKSkgIT0gMCl7DQovKiBlbmFibGUgUExMIGZpcnN0ICovDQogIFNDVV9QTEwtPlBMTENPTjAgJj0gfihTQ1VfUExMX1BMTENPTjBfVkNPUFdEX01zayB8IFNDVV9QTExfUExMQ09OMF9QTExQV0RfTXNrKTsNCg0KfQ0KDQovKiBFbmFibGUgT1NDX0hQIGlmIG5vdCBhbHJlYWR5IG9uKi8NCiAgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0NSWVNUQUwpDQogIHsNCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogICBVc2UgZXh0ZXJuYWwgY3J5c3RhbCBmb3IgUExMIGNsb2NrIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQogICBpZiAoU0NVX09TQy0+T1NDSFBDVFJMICYgU0NVX09TQ19PU0NIUENUUkxfTU9ERV9Nc2spew0KCSAgIFNDVV9PU0MtPk9TQ0hQQ1RSTCAmPSB+KFNDVV9PU0NfSFBfTU9ERSk7CSAvKmVuYWJsZSB0aGUgT1NDX0hQKi8NCgkgICAvKiBzZXR1cCBPU0MgV0RHIGRldmlkZXIgKi8NCgkgICBTQ1VfT1NDLT5PU0NIUENUUkwgfD0gKFNDVV9PU0NIUFdER0RJVjw8MTYpOw0KCSAgIC8qIHNlbGVjdCBleHRlcm5hbCBPU0MgYXMgUExMIGlucHV0ICovDQoJICAgU0NVX1BMTC0+UExMQ09OMiAmPSB+U0NVX1BMTF9QTExDT04yX1BJTlNFTF9Nc2s7DQoJICAgLyogcmVzdGFydCBPU0MgV2F0Y2hkb2cgKi8NCgkgICBTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfT1NDUkVTX01zazsNCg0KICAgICAgIC8qIFRpbWVvdXQgZm9yIHdhaXQgbG9vcCB+MTUwbXMgKi8NCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJICAgU3lzVGljay0+TE9BRCAgPSAoKDUwMDAwMDArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7Lyogc2V0IHJlbG9hZCByZWdpc3RlciAqLw0KCSAgIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCSAgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCSAgICAgICAgICAgICAgICAgICBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLw0KCSAgIGRvDQoJICAgew0KICAgICAgIDsvKiB3YWl0IGZvciB+MTUwbXMgICovDQoJICAgfXdoaWxlKCgoKFNDVV9QTEwtPlBMTFNUQVQpICYgKFNDVV9QTExfUExMU1RBVF9QTExIVl9Nc2sgfCBTQ1VfUExMX1BMTFNUQVRfUExMTFZfTXNrIHxTQ1VfUExMX1BMTFNUQVRfUExMU1BfTXNrKSkgIT0gMHgzODApJiYoU3lzVGljay0+VkFMID49IDUwMCkpOw0KDQoJICAgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoJICAgaWYgKCgoU0NVX1BMTC0+UExMU1RBVCkgJiAoU0NVX1BMTF9QTExTVEFUX1BMTEhWX01zayB8IFNDVV9QTExfUExMU1RBVF9QTExMVl9Nc2sgfFNDVV9QTExfUExMU1RBVF9QTExTUF9Nc2spKSAhPSAweDM4MCkNCgkgICByZXR1cm4oMCk7LyogUmV0dXJuIEVycm9yICovDQoNCiAgICB9DQogIH0NCiAgZWxzZSBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9GQUNUT1JZKQ0KCXsNCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogICBVc2UgZmFjdG9yeSB0cmltbWluZyBCYWNrLXVwIGNsb2NrIGZvciBQTEwgY2xvY2sgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCS8qIFBMTCBCYWNrIHVwIGNsb2NrIHNlbGVjdGVkICovDQoJCVNDVV9QTEwtPlBMTENPTjIgfD0gU0NVX1BMTF9QTExDT04yX1BJTlNFTF9Nc2s7DQoNCgl9DQogIGVsc2UgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDKQ0KICB7DQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qICAgVXNlIGF1dG9tYXRpYyB0cmltbWluZyBCYWNrLXVwIGNsb2NrIGZvciBQTEwgY2xvY2sgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogY2hlY2sgZm9yIEhJQiBEb21haW4gZW5hYmxlZCAgKi8NCglpZigoU0NVX1BPV0VSLT5QV1JTVEFUICYgU0NVX1BPV0VSX1BXUlNUQVRfSElCRU5fTXNrKSA9PSAwKQ0KCQlTQ1VfUE9XRVItPlBXUlNFVCB8PSBTQ1VfUE9XRVJfUFdSU0VUX0hJQl9Nc2s7IC8qZW5hYmxlIEhpYmVybmF0ZSBkb21haW4qLw0KDQogICAvKiBjaGVjayBmb3IgSElCIERvbWFpbiBpcyBub3QgaW4gcmVzZXQgc3RhdGUgICovDQoJaWYgKChTQ1VfUkVTRVQtPlJTVFNUQVQgJiBTQ1VfUkVTRVRfUlNUU1RBVF9ISUJSU19Nc2spPT0gMSkNCgkgICAgU0NVX1JFU0VULT5SU1RDTFIgfD0gU0NVX1JFU0VUX1JTVENMUl9ISUJSU19Nc2s7IC8qZGUtYXNzZXJ0IGhpYmVybmF0ZSByZXNldCovDQoNCgkJCS8qIFBMTCBCYWNrIHVwIGNsb2NrIHNlbGVjdGVkICovDQoJCVNDVV9QTEwtPlBMTENPTjIgfD0gU0NVX1BMTF9QTExDT04yX1BJTlNFTF9Nc2s7DQoNCgkJaWYgKFNDVV9TVEFOREJZX0NMT0NLID09IEhJQl9DTE9DS19GT1NJKQ0KCQkJew0KCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCQkvKiAgIFVzZSBmT1NJIGFzIHNvdXJjZSBvZiB0aGUgc3RhbmRieSBjbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJU0NVX0hJQkVSTkFURS0+SERDUiAmPSB+U0NVX0hJQkVSTkFURV9IRENSX1NUREJZU0VMX01zazsNCg0KCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX0ZPVFJfTXNrOw0KCQkJZm9yKHRlbXA9MDt0ZW1wPD0weEZGRkY7dGVtcCsrKTsNCg0KCQkJU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfQU9UUkVOX01zazsNCgkJCX0NCgkJZWxzZSBpZiAoU0NVX1NUQU5EQllfQ0xPQ0sgPT0gSElCX0NMT0NLX09TQ1VMUCkNCgkJCXsNCgkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJLyogICBVc2UgZlVMUCBhcyBzb3VyY2Ugb2YgdGhlIHN0YW5kYnkgY2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJLypjaGVjayBPU0NVTCBpZiBydW5uaW5nIGNvcnJlY3QqLw0KCQkJaWYgKChTQ1VfSElCRVJOQVRFLT5PU0NVTENUUkwgJiBTQ1VfSElCRVJOQVRFX09TQ1VMQ1RSTF9NT0RFX01zaykhPSAwKQ0KCQkJCXsNCgkJCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19PU0NVTENUUkxfTXNrKTsNCg0KCQkJCQlTQ1VfSElCRVJOQVRFLT5PU0NVTENUUkwgJj0gflNDVV9ISUJFUk5BVEVfT1NDVUxDVFJMX01PREVfTXNrOyAvKmVuYWJsZSBPU0NVTCovDQoJCQkJCS8qbm93IGNlY2sgaWYgdGhlIGNsb2NrIGlzIE9LIHVzaW5nIE9TQ1VMUCBPc2NpbGxhdG9yIFdhdGNoZG9nIChVTFBXREcpKi8NCgkJCQkJLyogc2VsZWN0IE9TQ1VMIGNsb2NrIGZvciBSVEMqLw0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENSIHw9IFNDVV9ISUJFUk5BVEVfSERDUl9SQ1NfTXNrOw0KCQkJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ1JfTXNrKTsNCgkJCQkJLyplbmFibGUgT1NDVUxQIFdERyBBbGFybSBFbmFibGUqLw0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENSIHw9IFNDVV9ISUJFUk5BVEVfSERDUl9VTFBXREdFTl9Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDUl9Nc2spOw0KCQkJCQkvKndhaXQgbm93IGZvciBjbG9jayBpcyBzdGFibGUgKi8NCgkJCQkJZG8NCgkJCQkJew0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENMUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ0xSX1VMUFdER19Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDTFJfTXNrKTsNCgkJCQkJZm9yKHRlbXA9MDt0ZW1wPD0weEZGRkY7dGVtcCsrKTsNCgkJCQkJfQ0KCQkJCQl3aGlsZSAoKFNDVV9ISUJFUk5BVEUtPkhEU1RBVCAmIFNDVV9ISUJFUk5BVEVfSERTVEFUX1VMUFdER19Nc2spPT1TQ1VfSElCRVJOQVRFX0hEU1RBVF9VTFBXREdfTXNrKTsNCg0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENMUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ0xSX1VMUFdER19Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDTFJfTXNrKTsNCgkJCQl9DQoJCQkvLyBub3cgT1NDVUxQIGlzIHJ1bm5pbmcgYW5kIGNhbiBiZSB1c2VkDQoJCQlTQ1VfSElCRVJOQVRFLT5IRENSIHw9IFNDVV9ISUJFUk5BVEVfSERDUl9TVERCWVNFTF9Nc2s7DQoJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ1JfTXNrKTsNCg0KCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX0ZPVFJfTXNrOw0KCQkJLypUUklBTCBmb3IgZGVsYXkgbG9vcCovDQoJCQlmb3IodGVtcD0wO3RlbXA8PTB4RkZGRjt0ZW1wKyspOw0KDQoJCQlTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9BT1RSRU5fTXNrOw0KCQkJLypUUklBTCBmb3IgZGVsYXkgbG9vcCovDQoJCQlmb3IodGVtcD0wO3RlbXA8PTB4RkZGRjt0ZW1wKyspOw0KDQoJCQl9DQogIH0NCg0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkvKiAgIFNldHVwIGFuZCBsb29rIHRoZSBtYWluIFBMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQppZiAoIShTQ1VfUExMLT5QTExTVEFUICYgU0NVX1BMTF9QTExTVEFUX1ZDT0xPQ0tfTXNrKSl7DQoJLyogU3lzdGVuIGlzIHN0aWxsIHJ1bm5pbmcgZnJvbSBpbnRlcm5hbCBjbG9jayAqLw0KCQkgICAvKiBzZWxlY3QgRk9GSSBhcyBzeXN0ZW0gY2xvY2sgKi8NCgkJICAgaWYoKFNDVV9DTEstPlNZU0NMS0NSICYgU0NVX0NMS19TWVNDTEtDUl9TWVNTRUxfTXNrKSAhPSAweDApU0NVX0NMSy0+U1lTQ0xLQ1IgJj0gflNDVV9DTEtfU1lTQ0xLQ1JfU1lTU0VMX01zazsgLypTZWxlY3QgRk9GSSovDQoNCg0KCQkJIC8qY2FsdWxhdGlvbiBmb3Igc3RlcHBpbmcqLw0KCQkJIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19DUllTVEFMKVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KCQkJIGlmICgoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9BVVRPTUFUSUMpIHx8KFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWSkpDQoJCQkJCVZDTyA9IChDTE9DS19CQUNLX1VQLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoNCgkJCSBzdGVwcGluZ19LMkRJViA9IChWQ08vMjQwMDAwMDApLTE7DQoJCQkgLyogR28gdG8gYnlwYXNzIHRoZSBNYWluIFBMTCAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9WQ09CWVBfTXNrOw0KCQkgICAvKiBkaXNjb25uZWN0IE9TQ19IUCB0byBQTEwgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfRklORElTX01zazsNCgkJICAgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChzdGVwcGluZ19LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkJICAgLyogd2UgbWF5IGhhdmUgdG8gc2V0IE9TQ0RJU0NESVMgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfT1NDRElTQ0RJU19Nc2s7DQoJCSAgIC8qIGNvbm5lY3QgT1NDX0hQIHRvIFBMTCAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfRklORElTX01zazsNCgkJICAgLyogcmVzdGFydCBQTEwgTG9jayBkZXRlY3Rpb24gKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfUkVTTERfTXNrOw0KCQkgICAvKiB3YWl0IGZvciBQTEwgTG9jayAqLw0KCQkgICAvKiBzZXR1cCB0aW1lIG91dCBsb29wICovDQoJICAgICAgIC8qIFRpbWVvdXQgZm9yIHdhaXQgbG9vIH4xNTBtcyAqLw0KCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSAgIFN5c1RpY2stPkxPQUQgID0gKCg1MDAwMDAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOy8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCgkJICAgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJCSAgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCQkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCg0KCQkgICB3aGlsZSAoKCEoU0NVX1BMTC0+UExMU1RBVCAmIFNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zaykpJiYoU3lzVGljay0+VkFMID49IDUwMCkpOw0KCSAgICAgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCg0KCQkgICBpZiAoKFNDVV9QTEwtPlBMTFNUQVQgJiBTQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spPT1TQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spDQoJCSAgIAkJew0KCQkJCS8qIEdvIGJhY2sgdG8gdGhlIE1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX1ZDT0JZUF9Nc2s7DQoJCQkJfQ0KCQkJCWVsc2UgcmV0dXJuKDApOw0KDQoNCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJICAgaGVyZSB3ZSBuZWVkIHRvIHNldHVwIHRoZSBzeXN0ZW0gY2xvY2sgZGl2aWRlcg0KCSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KCQlTQ1VfQ0xLLT5DUFVDTEtDUiA9IFNDVV9DUFVDTEtDUl9ESVY7DQoJCVNDVV9DTEstPlBCQ0xLQ1IgPSBTQ1VfUEJDTEtDUl9ESVY7DQoJCVNDVV9DTEstPkNDVUNMS0NSID0gU0NVX0NDVUNMS0NSX0RJVjsNCg0KDQogIAkJLyogU3dpdGNoIHN5c3RlbSBjbG9jayB0byBQTEwgKi8NCgkgICBTQ1VfQ0xLLT5TWVNDTEtDUiB8PSAgMHgwMDAxMDAwMDsNCg0KCSAgIC8qIHdlIG1heSBoYXZlIHRvIHJlc2V0IE9TQ0RJU0NESVMgKi8NCgkgICBTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfT1NDRElTQ0RJU19Nc2s7DQoNCg0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJIC8qIERlbGF5IGZvciBuZXh0IEsyIHN0ZXAgfjUwtXMgKi8NCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSBTeXNUaWNrLT5MT0FEICA9ICgoMTI1MCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsvKiBzZXQgcmVsb2FkIHJlZ2lzdGVyICovDQoJCSBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkJIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCQkJCQkJCQkJCSBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLw0KDQoJCSB3aGlsZSAoU3lzVGljay0+VkFMID49IDEwMCk7CQkJCQkJCQkgICAvKiB3YWl0IGZvciB+NTC1cyAgKi8NCgkJIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCgkgICBoZXJlIHRoZSByYW1wIHVwIG9mIHRoZSBzeXN0ZW0gY2xvY2sgc3RhcnRzIEZTeXMgPCA2ME1Ieg0KCSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJaWYgKENMT0NLX0ZTWVMgPiA2MDAwMDAwMCl7DQoJCQkgLypjYWx1bGF0aW9uIGZvciBzdGVwcGluZyovDQoJCQkgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0NSWVNUQUwpVkNPID0gKENMT0NLX0NSWVNUQUxfRlJFUVVFTkNZLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoJCQkgaWYgKChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQykgfHwoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9GQUNUT1JZKSkNCgkJCQkJVkNPID0gKENMT0NLX0JBQ0tfVVAvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCg0KCQkJIHN0ZXBwaW5nX0syRElWID0gKFZDTy82MDAwMDAwMCktMTsNCg0KCQkJIC8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChzdGVwcGluZ19LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkJIH0NCgkJIGVsc2UNCgkJIHsNCgkJCQkvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCQkJCVNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoU0NVX1BMTF9LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkJICAgIFNDVV9UUkFQLT5UUkFQQ0xSID0gU0NVX1RSQVBfVFJBUENMUl9TT1NDV0RHVF9Nc2sgfCBTQ1VfVFJBUF9UUkFQQ0xSX1NWQ09MQ0tUX01zazsgIC8qIGNsZWFyIHJlcXVlc3QgZm9yIFN5c3RlbSBPQ1MgV2F0Y2hkb2cgVHJhcCBhbmQgU3lzdGVtIFZDTyBMb2NrIFRyYXAgICovDQoJCQkgIHJldHVybigxKTsNCgkJIH0NCg0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJIC8qIERlbGF5IGZvciBuZXh0IEsyIHN0ZXAgfjUwtXMgKi8NCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJICAgU3lzVGljay0+TE9BRCAgPSAoKDMwMDArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7DQoJICAgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJICAgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovDQoNCgkgICB3aGlsZSAoU3lzVGljay0+VkFMID49IDEwMCk7CQkJCQkJCQkgICAvKiB3YWl0IGZvciB+NTC1cyAgKi8NCgkgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCgkgICBoZXJlIHRoZSByYW1wIHVwIG9mIHRoZSBzeXN0ZW0gY2xvY2sgc3RhcnRzIEZTeXMgPCA5ME1Ieg0KCSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJaWYgKENMT0NLX0ZTWVMgPiA5MDAwMDAwMCl7DQoJCQkgLypjYWx1bGF0aW9uIGZvciBzdGVwcGluZyovDQoJCQkgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0NSWVNUQUwpVkNPID0gKENMT0NLX0NSWVNUQUxfRlJFUVVFTkNZLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoJCQkgaWYgKChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQykgfHwoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9GQUNUT1JZKSkNCgkJCQkJVkNPID0gKENMT0NLX0JBQ0tfVVAvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCg0KCQkJIHN0ZXBwaW5nX0syRElWID0gKFZDTy85MDAwMDAwMCktMTsNCg0KCQkJIC8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChzdGVwcGluZ19LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkJIH0NCgkJIGVsc2UNCgkJIHsNCgkJCQkvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCQkJCVNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoU0NVX1BMTF9LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkgICAgICBTQ1VfVFJBUC0+VFJBUENMUiA9IFNDVV9UUkFQX1RSQVBDTFJfU09TQ1dER1RfTXNrIHwgU0NVX1RSQVBfVFJBUENMUl9TVkNPTENLVF9Nc2s7ICAvKiBjbGVhciByZXF1ZXN0IGZvciBTeXN0ZW0gT0NTIFdhdGNoZG9nIFRyYXAgYW5kIFN5c3RlbSBWQ08gTG9jayBUcmFwICAqLw0KCQkJCXJldHVybigxKTsNCgkJIH0NCg0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJIC8qIERlbGF5IGZvciBuZXh0IEsyIHN0ZXAgfjUwtXMgKi8NCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJICAgU3lzVGljay0+TE9BRCAgPSAoKDQ4MDArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7DQoJICAgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJICAgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovDQoNCgkgICB3aGlsZSAoU3lzVGljay0+VkFMID49IDEwMCk7CQkJCQkJCQkgICAvKiB3YWl0IGZvciB+NTC1cyAgKi8NCgkgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCgkgICAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCSAgIFNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoU0NVX1BMTF9LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCg0KCSAgIFNDVV9UUkFQLT5UUkFQQ0xSID0gU0NVX1RSQVBfVFJBUENMUl9TT1NDV0RHVF9Nc2sgfCBTQ1VfVFJBUF9UUkFQQ0xSX1NWQ09MQ0tUX01zazsgIC8qIGNsZWFyIHJlcXVlc3QgZm9yIFN5c3RlbSBPQ1MgV2F0Y2hkb2cgVHJhcCBhbmQgU3lzdGVtIFZDTyBMb2NrIFRyYXAgICovDQoJfQ0KIH0vKiBlbmQgdGhpcyB3ZWFrIGZ1bmN0aW9uIGVuYWJsZXMgREFWRTMgY2xvY2sgQXBwIHVzYWdlICovDQogICByZXR1cm4oMSk7DQoNCn0NCiNlbmRpZg0KDQovKioNCiAgKiBAYnJpZWYgIC0NCiAgKiBAbm90ZSAgIC0NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCiNpZiAoU0NVX1VTQl9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBVU0JDbG9ja1NldHVwKHZvaWQpDQp7DQovKiB0aGlzIHdlYWsgZnVuY3Rpb24gZW5hYmxlcyBEQVZFMyBjbG9jayBBcHAgdXNhZ2UgKi8NCmlmKEFsbG93UExMSW5pdEJ5U3RhcnR1cCgpKXsNCg0KLyogY2hlY2sgaWYgUExMIGlzIHN3aXRjaGVkIG9uICovDQppZiAoKFNDVV9QTEwtPlVTQlBMTENPTiAmKFNDVV9QTExfVVNCUExMQ09OX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1VTQlBMTENPTl9QTExQV0RfTXNrKSkgIT0gMCl7DQoJLyogZW5hYmxlIFBMTCBmaXJzdCAqLw0KICBTQ1VfUExMLT5VU0JQTExDT04gJj0gfihTQ1VfUExMX1VTQlBMTENPTl9WQ09QV0RfTXNrIHwgU0NVX1BMTF9VU0JQTExDT05fUExMUFdEX01zayk7DQp9DQoNCi8qIGNoZWNrIGFuZCBpZiBub3QgYWxyZWFkeSBydW5uaW5nIGVuYWJsZSBPU0NfSFAgKi8NCiAgIGlmIChTQ1VfT1NDLT5PU0NIUENUUkwgJiBTQ1VfT1NDX09TQ0hQQ1RSTF9NT0RFX01zayl7DQoJCSAvKiBjaGVjayBpZiBNYWluIFBMTCBpcyBzd2l0Y2hlZCBvbiBmb3IgT1NDIFdEKi8NCgkJIGlmICgoU0NVX1BMTC0+UExMQ09OMCAmKFNDVV9QTExfUExMQ09OMF9WQ09QV0RfTXNrIHwgU0NVX1BMTF9QTExDT04wX1BMTFBXRF9Nc2spKSAhPSAwKXsNCgkJCS8qIGVuYWJsZSBQTEwgZmlyc3QgKi8NCiAgCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+KFNDVV9QTExfUExMQ09OMF9WQ09QV0RfTXNrIHwgU0NVX1BMTF9QTExDT04wX1BMTFBXRF9Nc2spOw0KCQkgfQ0KCSAgIFNDVV9PU0MtPk9TQ0hQQ1RSTCAmPSB+KFNDVV9PU0NfSFBfTU9ERSk7CSAvKmVuYWJsZSB0aGUgT1NDX0hQKi8NCgkgICAvKiBzZXR1cCBPU0MgV0RHIGRldmlkZXIgKi8NCgkgICBTQ1VfT1NDLT5PU0NIUENUUkwgfD0gKFNDVV9PU0NIUFdER0RJVjw8MTYpOw0KCSAgIC8qIHJlc3RhcnQgT1NDIFdhdGNoZG9nICovDQoJICAgU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX09TQ1JFU19Nc2s7DQoNCiAgICAgICAvKiBUaW1lb3V0IGZvciB3YWl0IGxvb3AgfjE1MG1zICovDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCSAgIFN5c1RpY2stPkxPQUQgID0gKCg1MDAwMDAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOy8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCgkgICBkbw0KCSAgIHsNCiAgICAgICA7Lyogd2FpdCBmb3IgfjE1MG1zICAqLw0KCSAgIH13aGlsZSgoKChTQ1VfUExMLT5QTExTVEFUKSAmIChTQ1VfUExMX1BMTFNUQVRfUExMSFZfTXNrIHwgU0NVX1BMTF9QTExTVEFUX1BMTExWX01zayB8U0NVX1BMTF9QTExTVEFUX1BMTFNQX01zaykpICE9IDB4MzgwKSYmKFN5c1RpY2stPlZBTCA+PSA1MDApKTsNCg0KCSAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCSAgIGlmICgoKFNDVV9QTEwtPlBMTFNUQVQpICYgKFNDVV9QTExfUExMU1RBVF9QTExIVl9Nc2sgfCBTQ1VfUExMX1BMTFNUQVRfUExMTFZfTXNrIHxTQ1VfUExMX1BMTFNUQVRfUExMU1BfTXNrKSkgIT0gMHgzODApDQoJICAgcmV0dXJuKDApOy8qIFJldHVybiBFcnJvciAqLw0KDQogIH0NCg0KDQovKiBTZXR1cCBVU0IgUExMICovDQogICAvKiBHbyB0byBieXBhc3MgdGhlIE1haW4gUExMICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gfD0gU0NVX1BMTF9VU0JQTExDT05fVkNPQllQX01zazsNCiAgIC8qIGRpc2Nvbm5lY3QgT1NDX0ZJIHRvIFBMTCAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OIHw9IFNDVV9QTExfVVNCUExMQ09OX0ZJTkRJU19Nc2s7DQogICAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OID0gKChTQ1VfVVNCUExMX05ESVY8PDgpIHwgKFNDVV9VU0JQTExfUERJVjw8MjQpKTsNCiAgIC8qIFNldHVwIFVTQkRJViBzZXR0aW5ncyBVU0IgY2xvY2sgKi8NCiAgIFNDVV9DTEstPlVTQkNMS0NSID0gU0NVX1VTQkRJVjsNCiAgIC8qIHdlIG1heSBoYXZlIHRvIHNldCBPU0NESVNDRElTICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gfD0gU0NVX1BMTF9VU0JQTExDT05fT1NDRElTQ0RJU19Nc2s7DQogICAvKiBjb25uZWN0IE9TQ19GSSB0byBQTEwgKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiAmPSB+U0NVX1BMTF9VU0JQTExDT05fRklORElTX01zazsNCiAgIC8qIHJlc3RhcnQgUExMIExvY2sgZGV0ZWN0aW9uICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gfD0gU0NVX1BMTF9VU0JQTExDT05fUkVTTERfTXNrOw0KICAgLyogd2FpdCBmb3IgUExMIExvY2sgKi8NCiAgIHdoaWxlICghKFNDVV9QTEwtPlVTQlBMTFNUQVQgJiBTQ1VfUExMX1VTQlBMTFNUQVRfVkNPTE9DS19Nc2spKTsNCg0KIH0vKiBlbmQgdGhpcyB3ZWFrIGZ1bmN0aW9uIGVuYWJsZXMgREFWRTMgY2xvY2sgQXBwIHVzYWdlICovDQogICByZXR1cm4oMSk7DQoNCn0NCiNlbmRpZg0KDQo=