LyoqIEBmaWxlDQogIEVGSSBQQ0kgSS9PIFByb3RvY29sDQoNCiAgQ29weXJpZ2h0IChjKSAyMDA2LCBJbnRlbCBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlICAgICAgICAgDQogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQgICAgICAgIA0KICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgICAgICAgICAgICAgICAgICAgICANCiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4gICAgICAgICAgICAgDQoNCiAgTW9kdWxlIE5hbWU6ICBQY2lJby5oDQoNCioqLw0KDQojaWZuZGVmIF9fUENJX0lPX0hfXw0KI2RlZmluZSBfX1BDSV9JT19IX18NCg0KLy8NCi8vIEdsb2JhbCBJRCBmb3IgdGhlIFBDSSBJL08gUHJvdG9jb2wNCi8vDQojZGVmaW5lIEVGSV9QQ0lfSU9fUFJPVE9DT0xfR1VJRCBcDQogIHsgXA0KICAgIDB4NGNmNWIyMDAsIDB4NjhiOCwgMHg0Y2E1LCB7MHg5ZSwgMHhlYywgMHhiMiwgMHgzZSwgMHgzZiwgMHg1MCwgMHgyLCAweDlhIH0gXA0KICB9DQoNCnR5cGVkZWYgc3RydWN0IF9FRklfUENJX0lPX1BST1RPQ09MICBFRklfUENJX0lPX1BST1RPQ09MOw0KDQovLw0KLy8gUHJvdG90eXBlcyBmb3IgdGhlIFBDSSBJL08gUHJvdG9jb2wNCi8vDQp0eXBlZGVmIGVudW0gew0KICBFZmlQY2lJb1dpZHRoVWludDggICAgICA9IDAsDQogIEVmaVBjaUlvV2lkdGhVaW50MTYsDQogIEVmaVBjaUlvV2lkdGhVaW50MzIsDQogIEVmaVBjaUlvV2lkdGhVaW50NjQsDQogIEVmaVBjaUlvV2lkdGhGaWZvVWludDgsDQogIEVmaVBjaUlvV2lkdGhGaWZvVWludDE2LA0KICBFZmlQY2lJb1dpZHRoRmlmb1VpbnQzMiwNCiAgRWZpUGNpSW9XaWR0aEZpZm9VaW50NjQsDQogIEVmaVBjaUlvV2lkdGhGaWxsVWludDgsDQogIEVmaVBjaUlvV2lkdGhGaWxsVWludDE2LA0KICBFZmlQY2lJb1dpZHRoRmlsbFVpbnQzMiwNCiAgRWZpUGNpSW9XaWR0aEZpbGxVaW50NjQsDQogIEVmaVBjaUlvV2lkdGhNYXhpbXVtDQp9IEVGSV9QQ0lfSU9fUFJPVE9DT0xfV0lEVEg7DQoNCi8vDQovLyBDb21wbGV0ZSBQQ0kgYWRkcmVzcyBnZW5lcmF0ZXINCi8vDQojZGVmaW5lIEVGSV9QQ0lfSU9fUEFTU19USFJPVUdIX0JBUiAgICAgICAgICAgICAgIDB4ZmYgICAgLy8gU3BlY2lhbCBCQVIgdGhhdCBwYXNzZXMgYSBtZW1vcnkgb3IgSS9PIGN5Y2xlIHRocm91Z2ggdW5jaGFuZ2VkDQojZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX01BU0sgICAgICAgICAgICAgICAgIDB4MDc3ZiAgLy8gQWxsIHRoZSBmb2xsb3dpbmcgSS9PIGFuZCBNZW1vcnkgY3ljbGVzDQojZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0lTQV9NT1RIRVJCT0FSRF9JTyAgIDB4MDAwMSAgLy8gSS9PIGN5Y2xlcyAweDAwMDAtMHgwMEZGICgxMCBiaXQgZGVjb2RlKQ0KI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9JU0FfSU8gICAgICAgICAgICAgICAweDAwMDIgIC8vIEkvTyBjeWNsZXMgMHgwMTAwLTB4MDNGRiBvciBncmVhdGVyICgxMCBiaXQgZGVjb2RlKQ0KI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9WR0FfUEFMRVRURV9JTyAgICAgICAweDAwMDQgIC8vIEkvTyBjeWNsZXMgMHgzQzYsIDB4M0M4LCAweDNDOSAoMTAgYml0IGRlY29kZSkNCiNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfVkdBX01FTU9SWSAgICAgICAgICAgMHgwMDA4ICAvLyBNRU0gY3ljbGVzIDB4QTAwMDAtMHhCRkZGRiAoMjQgYml0IGRlY29kZSkNCiNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfVkdBX0lPICAgICAgICAgICAgICAgMHgwMDEwICAvLyBJL08gY3ljbGVzIDB4M0IwLTB4M0JCIGFuZCAweDNDMC0weDNERiAoMTAgYml0IGRlY29kZSkNCiNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSURFX1BSSU1BUllfSU8gICAgICAgMHgwMDIwICAvLyBJL08gY3ljbGVzIDB4MUYwLTB4MUY3LCAweDNGNiwgMHgzRjcgKDEwIGJpdCBkZWNvZGUpDQojZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0lERV9TRUNPTkRBUllfSU8gICAgIDB4MDA0MCAgLy8gSS9PIGN5Y2xlcyAweDE3MC0weDE3NywgMHgzNzYsIDB4Mzc3ICgxMCBiaXQgZGVjb2RlKQ0KI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9NRU1PUllfV1JJVEVfQ09NQklORSAweDAwODAgIC8vIE1hcCBhIG1lbW9yeSByYW5nZSBzbyB3cml0ZSBhcmUgY29tYmluZWQNCiNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfSU8gICAgICAgICAgICAgICAgICAgMHgwMTAwICAvLyBFbmFibGUgdGhlIEkvTyBkZWNvZGUgYml0IGluIHRoZSBQQ0kgQ29uZmlnIEhlYWRlcg0KI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9NRU1PUlkgICAgICAgICAgICAgICAweDAyMDAgIC8vIEVuYWJsZSB0aGUgTWVtb3J5IGRlY29kZSBiaXQgaW4gdGhlIFBDSSBDb25maWcgSGVhZGVyDQojZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0JVU19NQVNURVIgICAgICAgICAgIDB4MDQwMCAgLy8gRW5hYmxlIHRoZSBETUEgYml0IGluIHRoZSBQQ0kgQ29uZmlnIEhlYWRlcg0KI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9NRU1PUllfQ0FDSEVEICAgICAgICAweDA4MDAgIC8vIE1hcCBhIG1lbW9yeSByYW5nZSBzbyBhbGwgci93IGFjY2Vzc2VzIGFyZSBjYWNoZWQNCiNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfTUVNT1JZX0RJU0FCTEUgICAgICAgMHgxMDAwICAvLyBEaXNhYmxlIGEgbWVtb3J5IHJhbmdlDQojZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0VNQkVEREVEX0RFVklDRSAgICAgIDB4MjAwMCAgLy8gQ2xlYXIgZm9yIGFuIGFkZC1pbiBQQ0kgRGV2aWNlDQojZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0VNQkVEREVEX1JPTSAgICAgICAgIDB4NDAwMCAgLy8gQ2xlYXIgZm9yIGEgcGh5c2ljYWwgUENJIE9wdGlvbiBST00gYWNjZXNzZWQgdGhyb3VnaCBST00gQkFSDQojZGVmaW5lIEVGSV9QQ0lfSU9fQVRUUklCVVRFX0RVQUxfQUREUkVTU19DWUNMRSAgIDB4ODAwMCAgLy8gQ2xlYXIgZm9yIFBDSSBjb250cm9sbGVycyB0aGF0IGNhbiBub3QgZ2VucmF0ZSBhIERBQw0KI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9JU0FfSU9fMTYgICAgICAgICAgICAweDEwMDAwIC8vIEkvTyBjeWNsZXMgMHgwMTAwLTB4MDNGRiBvciBncmVhdGVyICgxNiBiaXQgZGVjb2RlKQ0KI2RlZmluZSBFRklfUENJX0lPX0FUVFJJQlVURV9WR0FfUEFMRVRURV9JT18xNiAgICAweDIwMDAwIC8vIEkvTyBjeWNsZXMgMHgzQzYsIDB4M0M4LCAweDNDOSAoMTYgYml0IGRlY29kZSkNCiNkZWZpbmUgRUZJX1BDSV9JT19BVFRSSUJVVEVfVkdBX0lPXzE2ICAgICAgICAgICAgMHgzMDAwMCAvLyBJL08gY3ljbGVzIDB4M0IwLTB4M0JCIGFuZCAweDNDMC0weDNERiAoMTYgYml0IGRlY29kZSkNCg0KI2RlZmluZSBFRklfUENJX0RFVklDRV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAoRUZJX1BDSV9JT19BVFRSSUJVVEVfSU8gfCBFRklfUENJX0lPX0FUVFJJQlVURV9NRU1PUlkgfCBFRklfUENJX0lPX0FUVFJJQlVURV9CVVNfTUFTVEVSKQ0KI2RlZmluZSBFRklfVkdBX0RFVklDRV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAoRUZJX1BDSV9JT19BVFRSSUJVVEVfVkdBX1BBTEVUVEVfSU8gfCBFRklfUENJX0lPX0FUVFJJQlVURV9WR0FfTUVNT1JZIHwgRUZJX1BDSV9JT19BVFRSSUJVVEVfVkdBX0lPIHwgRUZJX1BDSV9JT19BVFRSSUJVVEVfSU8pDQoNCi8vDQovLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLyBFRklfUENJX0lPX1BST1RPQ09MX09QRVJBVElPTg0KLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCnR5cGVkZWYgZW51bSB7DQogIEVmaVBjaUlvT3BlcmF0aW9uQnVzTWFzdGVyUmVhZCwNCiAgRWZpUGNpSW9PcGVyYXRpb25CdXNNYXN0ZXJXcml0ZSwNCiAgRWZpUGNpSW9PcGVyYXRpb25CdXNNYXN0ZXJDb21tb25CdWZmZXIsDQogIEVmaVBjaUlvT3BlcmF0aW9uTWF4aW11bQ0KfSBFRklfUENJX0lPX1BST1RPQ09MX09QRVJBVElPTjsNCg0KLy8NCi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQVRUUklCVVRFX09QRVJBVElPTg0KLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCnR5cGVkZWYgZW51bSB7DQogIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uR2V0LA0KICBFZmlQY2lJb0F0dHJpYnV0ZU9wZXJhdGlvblNldCwNCiAgRWZpUGNpSW9BdHRyaWJ1dGVPcGVyYXRpb25FbmFibGUsDQogIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uRGlzYWJsZSwNCiAgRWZpUGNpSW9BdHRyaWJ1dGVPcGVyYXRpb25TdXBwb3J0ZWQsDQogIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uTWF4aW11bQ0KfSBFRklfUENJX0lPX1BST1RPQ09MX0FUVFJJQlVURV9PUEVSQVRJT047DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJlYWRzIGZyb20gdGhlIG1lbW9yeSBzcGFjZSBvZiBhIFBDSSBjb250cm9sbGVyLiBSZXR1cm5zIHdoZW4gZWl0aGVyIHRoZSBwb2xsaW5nIGV4aXQgY3JpdGVyaWEgaXMNCiAgc2F0aXNmaWVkIG9yIGFmdGVyIGEgZGVmaW5lZCBkdXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9QQ0lfSU9fUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgV2lkdGggICAgICAgICAgICAgICAgIFNpZ25pZmllcyB0aGUgd2lkdGggb2YgdGhlIG1lbW9yeSBvciBJL08gb3BlcmF0aW9ucy4NCiAgQHBhcmFtICBCYXJJbmRleCAgICAgICAgICAgICAgVGhlIEJBUiBpbmRleCBvZiB0aGUgc3RhbmRhcmQgUENJIENvbmZpZ3VyYXRpb24gaGVhZGVyIHRvIHVzZSBhcyB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSBhZGRyZXNzIGZvciB0aGUgbWVtb3J5IG9wZXJhdGlvbiB0byBwZXJmb3JtLiAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBPZmZzZXQgICAgICAgICAgICAgICAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIHNlbGVjdGVkIEJBUiB0byBzdGFydCB0aGUgbWVtb3J5IG9wZXJhdGlvbi4NCiAgQHBhcmFtICBNYXNrICAgICAgICAgICAgICAgICAgTWFzayB1c2VkIGZvciB0aGUgcG9sbGluZyBjcml0ZXJpYS4NCiAgQHBhcmFtICBWYWx1ZSAgICAgICAgICAgICAgICAgVGhlIGNvbXBhcmlzb24gdmFsdWUgdXNlZCBmb3IgdGhlIHBvbGxpbmcgZXhpdCBjcml0ZXJpYS4NCiAgQHBhcmFtICBEZWxheSAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiAxMDAgbnMgdW5pdHMgdG8gcG9sbC4NCiAgQHBhcmFtICBSZXN1bHQgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbGFzdCB2YWx1ZSByZWFkIGZyb20gdGhlIG1lbW9yeSBsb2NhdGlvbi4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBsYXN0IGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgYWNjZXNzIG1hdGNoZWQgdGhlIHBvbGwgZXhpdCBjcml0ZXJpYS4NCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgQmFySW5kZXggbm90IHZhbGlkIGZvciB0aGlzIFBDSSBjb250cm9sbGVyLg0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBPZmZzZXQgaXMgbm90IHZhbGlkIGZvciB0aGUgQmFySW5kZXggb2YgdGhpcyBQQ0kgY29udHJvbGxlci4NCiAgQHJldHZhbCBFRklfVElNRU9VVCAgICAgICAgICAgRGVsYXkgZXhwaXJlZCBiZWZvcmUgYSBtYXRjaCBvY2N1cnJlZC4NCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIGNvbXBsZXRlZCBkdWUgdG8gYSBsYWNrIG9mIHJlc291cmNlcy4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfUE9MTF9JT19NRU0pICgNCiAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTCAgICAgICAgICAgKlRoaXMsDQogIElOICBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIICAgIFdpZHRoLA0KICBJTiAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBCYXJJbmRleCwNCiAgSU4gIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LA0KICBJTiAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICBNYXNrLA0KICBJTiAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSwNCiAgSU4gIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgRGVsYXksDQogIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICpSZXN1bHQNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgRW5hYmxlIGEgUENJIGRyaXZlciB0byBhY2Nlc3MgUENJIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGluIHRoZSBQQ0kgbWVtb3J5IG9yIEkvTyBzcGFjZS4NCiAgICAgICAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX0lPX1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gIFdpZHRoICAgICAgICAgICAgICAgICBTaWduaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBtZW1vcnkgb3IgSS9PIG9wZXJhdGlvbnMuDQogIEBwYXJhbSAgQmFySW5kZXggICAgICAgICAgICAgIFRoZSBCQVIgaW5kZXggb2YgdGhlIHN0YW5kYXJkIFBDSSBDb25maWd1cmF0aW9uIGhlYWRlciB0byB1c2UgYXMgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzcyBmb3IgdGhlIG1lbW9yeSBvciBJL08gb3BlcmF0aW9uIHRvIHBlcmZvcm0uICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBPZmZzZXQgICAgICAgICAgICAgICAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIHNlbGVjdGVkIEJBUiB0byBzdGFydCB0aGUgbWVtb3J5IG9yIEkvTyBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBDb3VudCAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBtZW1vcnkgb3IgSS9PIG9wZXJhdGlvbnMgdG8gcGVyZm9ybS4NCiAgQHBhcmFtICBCdWZmZXIgICAgICAgICAgICAgICAgRm9yIHJlYWQgb3BlcmF0aW9ucywgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byBzdG9yZSB0aGUgcmVzdWx0cy4gRm9yIHdyaXRlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMsIHRoZSBzb3VyY2UgYnVmZmVyIHRvIHdyaXRlIGRhdGEgZnJvbS4gICAgICAgICAgICAgICAgICAgICAgICAgIA0KICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGRhdGEgd2FzIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIHRoZSBQQ0kgY29udHJvbGxlci4NCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgQmFySW5kZXggbm90IHZhbGlkIGZvciB0aGlzIFBDSSBjb250cm9sbGVyLg0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgYWRkcmVzcyByYW5nZSBzcGVjaWZpZWQgYnkgT2Zmc2V0LCBXaWR0aCwgYW5kIENvdW50IGlzIG5vdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBmb3IgdGhlIFBDSSBCQVIgc3BlY2lmaWVkIGJ5IEJhckluZGV4LiAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGUgcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBhIGxhY2sgb2YgcmVzb3VyY2VzLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9JT19NRU0pICgNCiAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTCAgICAgICAgICAgICAgKlRoaXMsDQogIElOICAgICBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIICAgIFdpZHRoLA0KICBJTiAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBCYXJJbmRleCwNCiAgSU4gICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0LA0KICBJTiAgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBDb3VudCwNCiAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcg0KICApOw0KDQp0eXBlZGVmIHN0cnVjdCB7DQogIEVGSV9QQ0lfSU9fUFJPVE9DT0xfSU9fTUVNICBSZWFkOw0KICBFRklfUENJX0lPX1BST1RPQ09MX0lPX01FTSAgV3JpdGU7DQp9IEVGSV9QQ0lfSU9fUFJPVE9DT0xfQUNDRVNTOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBFbmFibGUgYSBQQ0kgZHJpdmVyIHRvIGFjY2VzcyBQQ0kgY29udHJvbGxlciByZWdpc3RlcnMgaW4gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UuDQogICAgICAgICAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX0lPX1BST1RPQ09MIGluc3RhbmNlLiAgDQogIEBwYXJhbSAgV2lkdGggICAgICAgICAgICAgICAgIFNpZ25pZmllcyB0aGUgd2lkdGggb2YgdGhlIG1lbW9yeSBvcGVyYXRpb25zLg0KICBAcGFyYW0gIE9mZnNldCAgICAgICAgICAgICAgICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgZm9yIHRoZSBQQ0kgY29udHJvbGxlci4NCiAgQHBhcmFtICBDb3VudCAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBQQ0kgY29uZmlndXJhdGlvbiBvcGVyYXRpb25zIHRvIHBlcmZvcm0uDQogIEBwYXJhbSAgQnVmZmVyICAgICAgICAgICAgICAgIEZvciByZWFkIG9wZXJhdGlvbnMsIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgdG8gc3RvcmUgdGhlIHJlc3VsdHMuIEZvciB3cml0ZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLCB0aGUgc291cmNlIGJ1ZmZlciB0byB3cml0ZSBkYXRhIGZyb20uDQogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZGF0YSB3YXMgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gdGhlIFBDSSBjb250cm9sbGVyLg0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgYWRkcmVzcyByYW5nZSBzcGVjaWZpZWQgYnkgT2Zmc2V0LCBXaWR0aCwgYW5kIENvdW50IGlzIG5vdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBmb3IgdGhlIFBDSSBjb25maWd1cmF0aW9uIGhlYWRlciBvZiB0aGUgUENJIGNvbnRyb2xsZXIuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEJ1ZmZlciBpcyBOVUxMIG9yIFdpZHRoIGlzIGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUcpICgNCiAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTCAgICAgICAgICAgICAgKlRoaXMsDQogIElOICAgICBFRklfUENJX0lPX1BST1RPQ09MX1dJRFRIICAgIFdpZHRoLA0KICBJTiAgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQsDQogIElOICAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50LA0KICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyDQogICk7DQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUcgIFJlYWQ7DQogIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQ09ORklHICBXcml0ZTsNCn0gRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUdfQUNDRVNTOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBFbmFibGVzIGEgUENJIGRyaXZlciB0byBjb3B5IG9uZSByZWdpb24gb2YgUENJIG1lbW9yeSBzcGFjZSB0byBhbm90aGVyIHJlZ2lvbiBvZiBQQ0kNCiAgbWVtb3J5IHNwYWNlLg0KICAgICAgICAgICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9JT19QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBXaWR0aCAgICAgICAgICAgICAgICAgU2lnbmlmaWVzIHRoZSB3aWR0aCBvZiB0aGUgbWVtb3J5IG9wZXJhdGlvbnMuDQogIEBwYXJhbSAgRGVzdEJhckluZGV4ICAgICAgICAgIFRoZSBCQVIgaW5kZXggaW4gdGhlIHN0YW5kYXJkIFBDSSBDb25maWd1cmF0aW9uIGhlYWRlciB0byB1c2UgYXMgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzcyBmb3IgdGhlIG1lbW9yeSBvcGVyYXRpb24gdG8gcGVyZm9ybS4gICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGVzdE9mZnNldCAgICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBvZmZzZXQgd2l0aGluIHRoZSBCQVIgc3BlY2lmaWVkIGJ5IERlc3RCYXJJbmRleCB0bw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCB0aGUgbWVtb3J5IHdyaXRlcyBmb3IgdGhlIGNvcHkgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBTcmNCYXJJbmRleCAgICAgICAgICAgVGhlIEJBUiBpbmRleCBpbiB0aGUgc3RhbmRhcmQgUENJIENvbmZpZ3VyYXRpb24gaGVhZGVyIHRvIHVzZSBhcyB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSBhZGRyZXNzIGZvciB0aGUgbWVtb3J5IG9wZXJhdGlvbiB0byBwZXJmb3JtLiAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBTcmNPZmZzZXQgICAgICAgICAgICAgVGhlIHNvdXJjZSBvZmZzZXQgd2l0aGluIHRoZSBCQVIgc3BlY2lmaWVkIGJ5IFNyY0JhckluZGV4IHRvIHN0YXJ0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZW1vcnkgcmVhZHMgZm9yIHRoZSBjb3B5IG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIENvdW50ICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIG1lbW9yeSBvcGVyYXRpb25zIHRvIHBlcmZvcm0uIEJ5dGVzIG1vdmVkIGlzIFdpZHRoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKiBDb3VudCwgc3RhcnRpbmcgYXQgRGVzdE9mZnNldCBhbmQgU3JjT2Zmc2V0LiAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBkYXRhIHdhcyBjb3BpZWQgZnJvbSBvbmUgbWVtb3J5IHJlZ2lvbiB0byBhbm90aGVyIG1lbW9yeSByZWdpb24uDQogIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIERlc3RCYXJJbmRleCBub3QgdmFsaWQgZm9yIHRoaXMgUENJIGNvbnRyb2xsZXIuDQogIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFNyY0JhckluZGV4IG5vdCB2YWxpZCBmb3IgdGhpcyBQQ0kgY29udHJvbGxlci4NCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIGFkZHJlc3MgcmFuZ2Ugc3BlY2lmaWVkIGJ5IERlc3RPZmZzZXQsIFdpZHRoLCBhbmQgQ291bnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHZhbGlkIGZvciB0aGUgUENJIEJBUiBzcGVjaWZpZWQgYnkgRGVzdEJhckluZGV4LiAgICANCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIGFkZHJlc3MgcmFuZ2Ugc3BlY2lmaWVkIGJ5IFNyY09mZnNldCwgV2lkdGgsIGFuZCBDb3VudCBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdmFsaWQgZm9yIHRoZSBQQ0kgQkFSIHNwZWNpZmllZCBieSBTcmNCYXJJbmRleC4gICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFdpZHRoIGlzIGludmFsaWQuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0NPUFlfTUVNKSAoDQogIElOIEVGSV9QQ0lfSU9fUFJPVE9DT0wgICAgICAgICAgICAgICpUaGlzLA0KICBJTiAgICAgRUZJX1BDSV9JT19QUk9UT0NPTF9XSURUSCAgICBXaWR0aCwNCiAgSU4gICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgRGVzdEJhckluZGV4LA0KICBJTiAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICBEZXN0T2Zmc2V0LA0KICBJTiAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICBTcmNCYXJJbmRleCwNCiAgSU4gICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgU3JjT2Zmc2V0LA0KICBJTiAgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBDb3VudA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBQcm92aWRlcyB0aGUgUENJIGNvbnRyb2xsZXKoQ3NwZWNpZmljIGFkZHJlc3NlcyBuZWVkZWQgdG8gYWNjZXNzIHN5c3RlbSBtZW1vcnkuDQogICAgICAgICAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX0lPX1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gIE9wZXJhdGlvbiAgICAgICAgICAgICBJbmRpY2F0ZXMgaWYgdGhlIGJ1cyBtYXN0ZXIgaXMgZ29pbmcgdG8gcmVhZCBvciB3cml0ZSB0byBzeXN0ZW0gbWVtb3J5Lg0KICBAcGFyYW0gIEhvc3RBZGRyZXNzICAgICAgICAgICBUaGUgc3lzdGVtIG1lbW9yeSBhZGRyZXNzIHRvIG1hcCB0byB0aGUgUENJIGNvbnRyb2xsZXIuDQogIEBwYXJhbSAgTnVtYmVyT2ZCeXRlcyAgICAgICAgIE9uIGlucHV0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbWFwLiBPbiBvdXRwdXQgdGhlIG51bWJlciBvZiBieXRlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdlcmUgbWFwcGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBEZXZpY2VBZGRyZXNzICAgICAgICAgVGhlIHJlc3VsdGluZyBtYXAgYWRkcmVzcyBmb3IgdGhlIGJ1cyBtYXN0ZXIgUENJIGNvbnRyb2xsZXIgdG8gdXNlIHRvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB0aGUgaG9zdHMgSG9zdEFkZHJlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIE1hcHBpbmcgICAgICAgICAgICAgICBBIHJlc3VsdGluZyB2YWx1ZSB0byBwYXNzIHRvIFVubWFwKCkuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSByYW5nZSB3YXMgbWFwcGVkIGZvciB0aGUgcmV0dXJuZWQgTnVtYmVyT2ZCeXRlcy4NCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIEhvc3RBZGRyZXNzIGNhbm5vdCBiZSBtYXBwZWQgYXMgYSBjb21tb24gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBzeXN0ZW0gaGFyZHdhcmUgY291bGQgbm90IG1hcCB0aGUgcmVxdWVzdGVkIGFkZHJlc3MuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX01BUCkgKA0KICBJTiBFRklfUENJX0lPX1BST1RPQ09MICAgICAgICAgICAgICAgICpUaGlzLA0KICBJTiAgICAgRUZJX1BDSV9JT19QUk9UT0NPTF9PUEVSQVRJT04gIE9wZXJhdGlvbiwNCiAgSU4gICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAqSG9zdEFkZHJlc3MsDQogIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgKk51bWJlck9mQnl0ZXMsDQogIE9VVCAgICBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgICAgKkRldmljZUFkZHJlc3MsDQogIE9VVCAgICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgKipNYXBwaW5nDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIENvbXBsZXRlcyB0aGUgTWFwKCkgb3BlcmF0aW9uIGFuZCByZWxlYXNlcyBhbnkgY29ycmVzcG9uZGluZyByZXNvdXJjZXMuDQogICAgICAgICAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX0lPX1BST1RPQ09MIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTWFwcGluZyAgICAgICAgICAgICAgIFRoZSBtYXBwaW5nIHZhbHVlIHJldHVybmVkIGZyb20gTWFwKCkuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSByYW5nZSB3YXMgdW5tYXBwZWQuDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBkYXRhIHdhcyBub3QgY29tbWl0dGVkIHRvIHRoZSB0YXJnZXQgc3lzdGVtIG1lbW9yeS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfVU5NQVApICgNCiAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTCAgICAgICAgICAgKlRoaXMsDQogIElOICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpNYXBwaW5nDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEFsbG9jYXRlcyBwYWdlcyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgYW4gRWZpUGNpSW9PcGVyYXRpb25CdXNNYXN0ZXJDb21tb25CdWZmZXINCiAgbWFwcGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9JT19QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBUeXBlICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHVzZWQgYW5kIG11c3QgYmUgaWdub3JlZC4NCiAgQHBhcmFtICBNZW1vcnlUeXBlICAgICAgICAgICAgVGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLCBFZmlCb290U2VydmljZXNEYXRhIG9yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmaVJ1bnRpbWVTZXJ2aWNlc0RhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFBhZ2VzICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGFsbG9jYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgSG9zdEFkZHJlc3MgICAgICAgICAgIEEgcG9pbnRlciB0byBzdG9yZSB0aGUgYmFzZSBzeXN0ZW0gbWVtb3J5IGFkZHJlc3Mgb2YgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgQXR0cmlidXRlcyAgICAgICAgICAgIFRoZSByZXF1ZXN0ZWQgYml0IG1hc2sgb2YgYXR0cmlidXRlcyBmb3IgdGhlIGFsbG9jYXRlZCByYW5nZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHJlcXVlc3RlZCBtZW1vcnkgcGFnZXMgd2VyZSBhbGxvY2F0ZWQuDQogIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIEF0dHJpYnV0ZXMgaXMgdW5zdXBwb3J0ZWQuIFRoZSBvbmx5IGxlZ2FsIGF0dHJpYnV0ZSBiaXRzIGFyZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1PUllfV1JJVEVfQ09NQklORSBhbmQgTUVNT1JZX0NBQ0hFRC4gICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIG1lbW9yeSBwYWdlcyBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0FMTE9DQVRFX0JVRkZFUikgKA0KICBJTiBFRklfUENJX0lPX1BST1RPQ09MICAgICAgICAgICAqVGhpcywNCiAgSU4gIEVGSV9BTExPQ0FURV9UWVBFICAgICAgICAgICAgVHlwZSwNCiAgSU4gIEVGSV9NRU1PUllfVFlQRSAgICAgICAgICAgICAgTWVtb3J5VHlwZSwNCiAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgUGFnZXMsDQogIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICoqSG9zdEFkZHJlc3MsDQogIElOICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgRnJlZXMgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZCB3aXRoIEFsbG9jYXRlQnVmZmVyKCkuDQogICAgICAgICAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX0lPX1BST1RPQ09MIGluc3RhbmNlLiAgDQogIEBwYXJhbSAgUGFnZXMgICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8gZnJlZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIEhvc3RBZGRyZXNzICAgICAgICAgICBUaGUgYmFzZSBzeXN0ZW0gbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHJlcXVlc3RlZCBtZW1vcnkgcGFnZXMgd2VyZSBmcmVlZC4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgVGhlIG1lbW9yeSByYW5nZSBzcGVjaWZpZWQgYnkgSG9zdEFkZHJlc3MgYW5kIFBhZ2VzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBub3QgYWxsb2NhdGVkIHdpdGggQWxsb2NhdGVCdWZmZXIoKS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9GUkVFX0JVRkZFUikgKA0KICBJTiBFRklfUENJX0lPX1BST1RPQ09MICAgICAgICAgICAqVGhpcywNCiAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgUGFnZXMsDQogIElOICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICpIb3N0QWRkcmVzcw0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBGbHVzaGVzIGFsbCBQQ0kgcG9zdGVkIHdyaXRlIHRyYW5zYWN0aW9ucyBmcm9tIGEgUENJIGhvc3QgYnJpZGdlIHRvIHN5c3RlbSBtZW1vcnkuDQogICAgICAgICAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfUENJX0lPX1BST1RPQ09MIGluc3RhbmNlLiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBQQ0kgcG9zdGVkIHdyaXRlIHRyYW5zYWN0aW9ucyB3ZXJlIGZsdXNoZWQgZnJvbSB0aGUgUENJIGhvc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZGdlIHRvIHN5c3RlbSBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgUENJIHBvc3RlZCB3cml0ZSB0cmFuc2FjdGlvbnMgd2VyZSBub3QgZmx1c2hlZCBmcm9tIHRoZSBQQ0kNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCBicmlkZ2UgZHVlIHRvIGEgaGFyZHdhcmUgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfRkxVU0gpICgNCiAgSU4gRUZJX1BDSV9JT19QUk9UT0NPTCAgKlRoaXMNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmV0cmlldmVzIHRoaXMgUENJIGNvbnRyb2xsZXKhr3MgY3VycmVudCBQQ0kgYnVzIG51bWJlciwgZGV2aWNlIG51bWJlciwgYW5kIGZ1bmN0aW9uIG51bWJlci4NCiAgICAgICAgICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9QQ0lfSU9fUFJPVE9DT0wgaW5zdGFuY2UuICANCiAgQHBhcmFtICBTZWdtZW50TnVtYmVyICAgICAgICAgVGhlIFBDSSBjb250cm9sbGVyoa9zIGN1cnJlbnQgUENJIHNlZ21lbnQgbnVtYmVyLg0KICBAcGFyYW0gIEJ1c051bWJlciAgICAgICAgICAgICBUaGUgUENJIGNvbnRyb2xsZXKhr3MgY3VycmVudCBQQ0kgYnVzIG51bWJlci4NCiAgQHBhcmFtICBEZXZpY2VOdW1iZXIgICAgICAgICAgVGhlIFBDSSBjb250cm9sbGVyoa9zIGN1cnJlbnQgUENJIGRldmljZSBudW1iZXIuDQogIEBwYXJhbSAgRnVuY3Rpb25OdW1iZXIgICAgICAgIFRoZSBQQ0kgY29udHJvbGxlcqGvcyBjdXJyZW50IFBDSSBmdW5jdGlvbiBudW1iZXIuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBQQ0kgY29udHJvbGxlciBsb2NhdGlvbiB3YXMgcmV0dXJuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX0dFVF9MT0NBVElPTikgKA0KICBJTiBFRklfUENJX0lPX1BST1RPQ09MICAgICAgICAgICpUaGlzLA0KICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpTZWdtZW50TnVtYmVyLA0KICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpCdXNOdW1iZXIsDQogIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgKkRldmljZU51bWJlciwNCiAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqRnVuY3Rpb25OdW1iZXINCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUGVyZm9ybXMgYW4gb3BlcmF0aW9uIG9uIHRoZSBhdHRyaWJ1dGVzIHRoYXQgdGhpcyBQQ0kgY29udHJvbGxlciBzdXBwb3J0cy4gVGhlIG9wZXJhdGlvbnMgaW5jbHVkZQ0KICBnZXR0aW5nIHRoZSBzZXQgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMsIHJldHJpZXZpbmcgdGhlIGN1cnJlbnQgYXR0cmlidXRlcywgc2V0dGluZyB0aGUgY3VycmVudCAgDQogIGF0dHJpYnV0ZXMsIGVuYWJsaW5nIGF0dHJpYnV0ZXMsIGFuZCBkaXNhYmxpbmcgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9QQ0lfSU9fUFJPVE9DT0wgaW5zdGFuY2UuICANCiAgQHBhcmFtICBPcGVyYXRpb24gICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIG9uIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIFBDSSBjb250cm9sbGVyLg0KICBAcGFyYW0gIEF0dHJpYnV0ZXMgICAgICAgICAgICBUaGUgbWFzayBvZiBhdHRyaWJ1dGVzIHRoYXQgYXJlIHVzZWQgZm9yIFNldCwgRW5hYmxlLCBhbmQgRGlzYWJsZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFJlc3VsdCAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIHJlc3VsdCBtYXNrIG9mIGF0dHJpYnV0ZXMgdGhhdCBhcmUgcmV0dXJuZWQgZm9yIHRoZSBHZXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFN1cHBvcnRlZCBvcGVyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBvcGVyYXRpb24gb24gdGhlIFBDSSBjb250cm9sbGVyJ3MgYXR0cmlidXRlcyB3YXMgY29tcGxldGVkLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgYml0cyBzZXQgaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBQQ0kgY29udHJvbGxlciBvciBvbmUgb2YNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzIHBhcmVudCBicmlkZ2VzIHdoZW4gT3BlcmF0aW9uIGlzIFNldCwgRW5hYmxlIG9yIERpc2FibGUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1BDSV9JT19QUk9UT0NPTF9BVFRSSUJVVEVTKSAoDQogIElOIEVGSV9QQ0lfSU9fUFJPVE9DT0wgICAgICAgICAgICAgICAgICAgICAgICpUaGlzLA0KICBJTiAgRUZJX1BDSV9JT19QUk9UT0NPTF9BVFRSSUJVVEVfT1BFUkFUSU9OICBPcGVyYXRpb24sDQogIElOICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMsDQogIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpSZXN1bHQgT1BUSU9OQUwNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgR2V0cyB0aGUgYXR0cmlidXRlcyB0aGF0IHRoaXMgUENJIGNvbnRyb2xsZXIgc3VwcG9ydHMgc2V0dGluZyBvbiBhIEJBUiB1c2luZw0KICBTZXRCYXJBdHRyaWJ1dGVzKCksIGFuZCByZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcmVzb3VyY2UgZGVzY3JpcHRvcnMgZm9yIGEgQkFSLg0KICAgICAgICAgICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1BDSV9JT19QUk9UT0NPTCBpbnN0YW5jZS4gIA0KICBAcGFyYW0gIEJhckluZGV4ICAgICAgICAgICAgICBUaGUgQkFSIGluZGV4IG9mIHRoZSBzdGFuZGFyZCBQQ0kgQ29uZmlndXJhdGlvbiBoZWFkZXIgdG8gdXNlIGFzIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlIGFkZHJlc3MgZm9yIHJlc291cmNlIHJhbmdlLiBUaGUgbGVnYWwgcmFuZ2UgZm9yIHRoaXMgZmllbGQgaXMgMC4uNS4NCiAgQHBhcmFtICBTdXBwb3J0cyAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBtYXNrIG9mIGF0dHJpYnV0ZXMgdGhhdCB0aGlzIFBDSSBjb250cm9sbGVyIHN1cHBvcnRzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcgZm9yIHRoaXMgQkFSIHdpdGggU2V0QmFyQXR0cmlidXRlcygpLiAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFJlc291cmNlcyAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEFDUEkgMi4wIHJlc291cmNlIGRlc2NyaXB0b3JzIHRoYXQgZGVzY3JpYmUgdGhlIGN1cnJlbnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBvZiB0aGlzIEJBUiBvZiB0aGUgUENJIGNvbnRyb2xsZXIuICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIElmIFN1cHBvcnRzIGlzIG5vdCBOVUxMLCB0aGVuIHRoZSBhdHRyaWJ1dGVzIHRoYXQgdGhlIFBDSSAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciBzdXBwb3J0cyBhcmUgcmV0dXJuZWQgaW4gU3VwcG9ydHMuIElmIFJlc291cmNlcyAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgTlVMTCwgdGhlbiB0aGUgQUNQSSAyLjAgcmVzb3VyY2UgZGVzY3JpcHRvcnMgdGhhdCB0aGUgUENJDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgaXMgY3VycmVudGx5IHVzaW5nIGFyZSByZXR1cm5lZCBpbiBSZXNvdXJjZXMuICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBCb3RoIFN1cHBvcnRzIGFuZCBBdHRyaWJ1dGVzIGFyZSBOVUxMLg0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBCYXJJbmRleCBub3QgdmFsaWQgZm9yIHRoaXMgUENJIGNvbnRyb2xsZXIuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyBhdmFpbGFibGUgdG8gYWxsb2NhdGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9QQ0lfSU9fUFJPVE9DT0xfR0VUX0JBUl9BVFRSSUJVVEVTKSAoDQogIElOIEVGSV9QQ0lfSU9fUFJPVE9DT0wgICAgICAgICAgICAgKlRoaXMsDQogIElOICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgQmFySW5kZXgsDQogIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgKlN1cHBvcnRzLCBPUFRJT05BTA0KICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqUmVzb3VyY2VzIE9QVElPTkFMDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFNldHMgdGhlIGF0dHJpYnV0ZXMgZm9yIGEgcmFuZ2Ugb2YgYSBCQVIgb24gYSBQQ0kgY29udHJvbGxlci4NCiAgICAgICAgICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9QQ0lfSU9fUFJPVE9DT0wgaW5zdGFuY2UuICANCiAgQHBhcmFtICBBdHRyaWJ1dGVzICAgICAgICAgICAgVGhlIG1hc2sgb2YgYXR0cmlidXRlcyB0byBzZXQgZm9yIHRoZSByZXNvdXJjZSByYW5nZSBzcGVjaWZpZWQgYnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFySW5kZXgsIE9mZnNldCwgYW5kIExlbmd0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBCYXJJbmRleCAgICAgICAgICAgICAgVGhlIEJBUiBpbmRleCBvZiB0aGUgc3RhbmRhcmQgUENJIENvbmZpZ3VyYXRpb24gaGVhZGVyIHRvIHVzZSBhcyB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSBhZGRyZXNzIGZvciByZXNvdXJjZSByYW5nZS4gVGhlIGxlZ2FsIHJhbmdlIGZvciB0aGlzIGZpZWxkIGlzIDAuLjUuDQogIEBwYXJhbSAgT2Zmc2V0ICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgQkFSIHJlbGF0aXZlIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVzb3VyY2UgcmFuZ2UgdG8gYmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgYnkgdGhlIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGJ5IEF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIExlbmd0aCAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcmFuZ2UgdG8gYmUgbW9kaWZpZWQgYnkgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGJ5IEF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHNldCBvZiBhdHRyaWJ1dGVzIHNwZWNpZmllZCBieSBBdHRyaWJ1dGVzIGZvciB0aGUgcmVzb3VyY2UgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Ugc3BlY2lmaWVkIGJ5IEJhckluZGV4LCBPZmZzZXQsIGFuZCBMZW5ndGggd2VyZSAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG9uIHRoZSBQQ0kgY29udHJvbGxlciwgYW5kIHRoZSBhY3R1YWwgcmVzb3VyY2UgcmFuZ2UgaXMgcmV0dXJuZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gT2Zmc2V0IGFuZCBMZW5ndGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT2Zmc2V0IG9yIExlbmd0aCBpcyBOVUxMLg0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBCYXJJbmRleCBub3QgdmFsaWQgZm9yIHRoaXMgUENJIGNvbnRyb2xsZXIuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyB0byBzZXQgdGhlIGF0dHJpYnV0ZXMgb24gdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIHJhbmdlIHNwZWNpZmllZCBieSBCYXJJbmRleCwgT2Zmc2V0LCBhbmQgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUENJX0lPX1BST1RPQ09MX1NFVF9CQVJfQVRUUklCVVRFUykgKA0KICBJTiBFRklfUENJX0lPX1BST1RPQ09MICAgICAgICAgICAgICAqVGhpcywNCiAgSU4gICAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcywNCiAgSU4gICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgQmFySW5kZXgsDQogIElOIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICpPZmZzZXQsDQogIElOIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICpMZW5ndGgNCiAgKTsNCg0KLy8NCi8vIEludGVyZmFjZSBzdHJ1Y3R1cmUgZm9yIHRoZSBQQ0kgSS9PIFByb3RvY29sDQovLw0Kc3RydWN0IF9FRklfUENJX0lPX1BST1RPQ09MIHsNCiAgRUZJX1BDSV9JT19QUk9UT0NPTF9QT0xMX0lPX01FTSAgICAgICAgIFBvbGxNZW07DQogIEVGSV9QQ0lfSU9fUFJPVE9DT0xfUE9MTF9JT19NRU0gICAgICAgICBQb2xsSW87DQogIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQUNDRVNTICAgICAgICAgICAgICBNZW07DQogIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQUNDRVNTICAgICAgICAgICAgICBJbzsNCiAgRUZJX1BDSV9JT19QUk9UT0NPTF9DT05GSUdfQUNDRVNTICAgICAgIFBjaTsNCiAgRUZJX1BDSV9JT19QUk9UT0NPTF9DT1BZX01FTSAgICAgICAgICAgIENvcHlNZW07DQogIEVGSV9QQ0lfSU9fUFJPVE9DT0xfTUFQICAgICAgICAgICAgICAgICBNYXA7DQogIEVGSV9QQ0lfSU9fUFJPVE9DT0xfVU5NQVAgICAgICAgICAgICAgICBVbm1hcDsNCiAgRUZJX1BDSV9JT19QUk9UT0NPTF9BTExPQ0FURV9CVUZGRVIgICAgIEFsbG9jYXRlQnVmZmVyOw0KICBFRklfUENJX0lPX1BST1RPQ09MX0ZSRUVfQlVGRkVSICAgICAgICAgRnJlZUJ1ZmZlcjsNCiAgRUZJX1BDSV9JT19QUk9UT0NPTF9GTFVTSCAgICAgICAgICAgICAgIEZsdXNoOw0KICBFRklfUENJX0lPX1BST1RPQ09MX0dFVF9MT0NBVElPTiAgICAgICAgR2V0TG9jYXRpb247DQogIEVGSV9QQ0lfSU9fUFJPVE9DT0xfQVRUUklCVVRFUyAgICAgICAgICBBdHRyaWJ1dGVzOw0KICBFRklfUENJX0lPX1BST1RPQ09MX0dFVF9CQVJfQVRUUklCVVRFUyAgR2V0QmFyQXR0cmlidXRlczsNCiAgRUZJX1BDSV9JT19QUk9UT0NPTF9TRVRfQkFSX0FUVFJJQlVURVMgIFNldEJhckF0dHJpYnV0ZXM7DQogIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb21TaXplOw0KICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlJvbUltYWdlOw0KfTsNCg0KZXh0ZXJuIEVGSV9HVUlEIGdFZmlQY2lJb1Byb3RvY29sR3VpZDsNCg0KI2VuZGlmDQo=