RGVhciBIb3dhcmQtc2FuLA0KDQoNClRoYW5rIHlvdSBzbyBtdWNoIGZvciB5b3VyIHByb21wdCBh ZHZpY2UuDQoNCkFzIHlvdSB0b2xkLCBJIG5lZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QgY3J5 cHRfcigpIGV4aXN0cy4NCkkgYW0gZ29pbmcgdG8gY29uc2lkZXIgaW5jbHVkaW5nIHRoZSBjaGVj ay4NCg0KV291bGQgaXQgYmUgcG9zc2libGUgdG8gbGV0IG1lIGtub3cgd2hldGhlciB0aGVyZSBh cmUgYW55IG90aGVyIGNvbmNlcm5zIA0KYWJvdXQgdGhlIGZpeCBpZiB3ZSBjYW4gdXNlIGNyeXB0 X3IoKT8NCg0KVGhlIGltcGxlbWVudGF0aW9uIHRoYXQgImJvdGggY2FsbG9jKCkgYW5kIGZyZWUo KSBvY2N1ciBldmVyeSB0aW1lIA0Kc2xhcGRfY3J5cHQoKSBpcyBjYWxsZWQiIGRvZXMgbm90IHNl ZW0gdG8gbG9vayBnb29kLg0KVGhlIGNhbGxlcnMgb2Ygc2xhcGRfY3J5cHQoKSBtaWdodCBiZSBh YmxlIHRvIGdldCB0aGUgbWVtb3J5IGZvciAic3RydWN0IA0KY3J5cHRfZGF0YSIgYmVmb3JlIHRo ZXkgY2FsbCBpdC4NCkhvd2V2ZXIsIEkgdGhpbmsgaXQgY2F1c2VzIHRoZSBjaGFuZ2VzIG9mIG90 aGVyIHNvdXJjZSBjb2Rlcy4NClNvLCBJIHRoaW5rIHRoZSBhZm9yZW1lbnRpb25lZCBpbXBsZW1l bnRhdGlvbiBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSANCnNsb3dkb3duIGlmIHRoZSByaXNrIG9m IG1lbW9yeSBmcmFnbWVudGF0aW9uIGNhbiBiZSBhY2NlcHRhYmxlLg0KDQpPbiB0aGUgb3RoZXIg aGFuZHMsIEkgdGhpbmsgd2UgZG8gbm90IG5lZWQgdG8gY2FyZSBhYm91dCBzdHJjbXAoKSANCmJl Y2F1c2UgaXQgaXMgdGhyZWFkLXNhZmUuDQoNCg0KQmVzdCBSZWdhcmRzLA0KLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KT24gMjAxNy8wOC8zMCAxOToyNiwgSG93YXJk IENodSB3cm90ZToNCj4geW9zLW5pc2hpbm9AeXMuanAubmVjLmNvbSB3cm90ZToNCj4+IEZ1bGxf TmFtZTogWW9zaGlub3JpIE5pc2hpbm8NCj4+IFZlcnNpb246IDIuNC40NQ0KPj4gT1M6IENlbnRP UyA3DQo+PiBVUkw6IGZ0cDovL2Z0cC5vcGVubGRhcC5vcmcvaW5jb21pbmcvDQo+PiBTdWJtaXNz aW9uIGZyb206IChOVUxMKSAoMjEwLjE0My4zNS4yMCkNCj4+DQo+Pg0KPj4gRGVhciBzaXIsDQo+ Pg0KPj4gVGhlIGZ1bmN0aW9uIHNsYXBkX2NyeXB0KCkgaW4gc2VydmVycy9zbGFwZC9wYXNzd2Qu YyBzZWVtcyB0byBiZWNvbWUgDQo+PiBzbG93IHdoZW4NCj4+IG1hbnkgbGRhcCBjbGllbnQgY29u bmVjdGlvbnMgb2NjdXIuDQo+PiBJdCBzZWVtcyBpdCBpcyBiZWNhdXNlIHRoZSBmdW5jdGlvbiB1 c2VzIGNyeXB0KCkobm9uIHRocmVhZC1zYWZlIA0KPj4gZnVuY3Rpb24pIGFuZA0KPj4gcHRocmVh ZF9tdXRleF9sb2NrKCksIHdoaWNoIHJlc3VsdHMgaW4gdGhlIHNsb3dkb3duLg0KPj4gI0Jlc2lk ZXMsIHdlIG5lZWQgdG8gdXNlIHtDUllQVH0gaGFzaCBhcyB1c2VycycgcGFzc3dvcmQgaGFzaC4N Cj4+DQo+PiBTbywgSSBtb2RpZmllZCBzZXJ2ZXJzL3NsYXBkL3Bhc3N3ZC5jIGxpa2UgdGhlIGZv bGxvd2luZy4NCj4+IEFzIGEgcmVzdWx0LCBzbGFwZF9jcnlwdCgpIGJlY29tZXMgbXVjaCBmYXN0 ZXIgdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9uLg0KPj4gV291bGQgeW91IGxldCBtZSBrbm93IHdo ZXRoZXIgb3Igbm90IHRoZSBmaXggaXMgYXBwcm9wcmlhdGUgZm9yIHNsYXBkPw0KPiANCj4gTm8g aXQgaXMgbm90IGFuIGFwcHJvcHJpYXRlIGZpeC4NCj4gDQo+IFlvdSBzaG91bGQgYWRkIGFuIGF1 dG9jb25mIHRlc3QgdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIA0KPiBjcnlwdF9y IGZ1bmN0aW9uLCBhbmQgdXNlIGFuICNpZmRlZiBoZXJlIGJhc2VkIG9uIHRoZSByZXN1bHQgb2Yg dGhhdCANCj4gdGVzdCwgc2luY2UgY3J5cHRfciBpcyBhIG5vbi1zdGFuZGFyZCBmdW5jdGlvbi4N Cj4+DQo+PiA9PT09PQ0KPj4gc3RhdGljIGludCBzbGFwZF9jcnlwdCggY29uc3QgY2hhciAqa2V5 LCBjb25zdCBjaGFyICpzYWx0LCBjaGFyICoqaGFzaCApDQo+PiB7DQo+PiDCoMKgwqDCoGNoYXIg KmNyOw0KPj4gwqDCoMKgwqBpbnQgcmM7DQo+PiDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBjcnlw dF9kYXRhICpkYXRhOw0KPj4NCj4+IMKgwqDCoMKgwqDCoMKgwqAgZGF0YSA9IChzdHJ1Y3QgY3J5 cHRfZGF0YSAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IA0KPj4gY3J5cHRfZGF0YSkpOw0KPj4g wqDCoMKgwqAvKiBsZGFwX3B2dF90aHJlYWRfbXV0ZXhfbG9jayggJnBhc3N3ZF9tdXRleCApOyAq Lw0KPj4NCj4+IMKgwqDCoMKgLyogY3IgPSBjcnlwdCgga2V5LCBzYWx0ICk7ICovDQo+PiDCoMKg wqDCoGNyID0gY3J5cHRfcigga2V5LCBzYWx0LCBkYXRhICk7DQo+PiDCoMKgwqDCoGlmICggY3Ig PT0gTlVMTCB8fCBjclswXSA9PSAnXDAnICkgew0KPj4gwqDCoMKgwqDCoMKgwqAgLyogc2FsdCBt dXN0IGhhdmUgYmVlbiBpbnZhbGlkICovDQo+PiDCoMKgwqDCoMKgwqDCoCByYyA9IExVVElMX1BB U1NXRF9FUlI7DQo+PiDCoMKgwqDCoH0gZWxzZSB7DQo+PiDCoMKgwqDCoMKgwqDCoCBpZiAoIGhh c2ggKSB7DQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxkYXBfcHZ0X3RocmVhZF9tdXRleF9s b2NrKCAmcGFzc3dkX211dGV4ICk7DQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICpoYXNoID0g YmVyX3N0cmR1cCggY3IgKTsNCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGRhcF9wdnRfdGhy ZWFkX211dGV4X3VubG9jayggJnBhc3N3ZF9tdXRleCApOw0KPj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCByYyA9IExVVElMX1BBU1NXRF9PSzsNCj4+DQo+PiDCoMKgwqDCoMKgwqDCoCB9IGVsc2Ug ew0KPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByYyA9IHN0cmNtcCggc2FsdCwgY3IgKSA/IExV VElMX1BBU1NXRF9FUlIgOiBMVVRJTF9QQVNTV0RfT0s7DQo+PiDCoMKgwqDCoMKgwqDCoCB9DQo+ PiDCoMKgwqDCoH0NCj4+DQo+PiDCoMKgwqDCoMKgwqDCoMKgIGZyZWUoZGF0YSk7DQo+PiDCoMKg wqDCoC8qIGxkYXBfcHZ0X3RocmVhZF9tdXRleF91bmxvY2soICZwYXNzd2RfbXV0ZXggKTsgKi8N Cj4+IMKgwqDCoMKgcmV0dXJuIHJjOw0KPj4gfQ0KPj4NCj4+ID09PT0NCj4+DQo+PiAjICIjZGVm aW5lIF9fVVNFX0dOVSIgaXMgYWxzbyByZXF1aXJlZCB0byBidWlsZCBzbGFwZC4NCj4+DQo+Pg0K Pj4gQmVzdCBSZWdhcmRzLA0KPj4NCj4+DQo+Pg0KPiANCj4gDQoNCi0tIA0KKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQpZb3NoaW5vcmkgTmlzaGlubw0K DQpORUMgU29sdXRpb24gSW5ub3ZhdG9ycywgTHRkLg0KMS0xOC03IFNoaW5raWJhLCBLb3RvLWt1 LCBUb2t5bywgMTM2LTg2MjcgSmFwYW4NCkUtTUFJTDogeW9zLW5pc2hpbm9AeXMuanAubmVjLmNv bQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq