Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:38339 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 24846 invoked from network); 18 Jun 2008 06:02:08 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 18 Jun 2008 06:02:08 -0000 Authentication-Results: pb1.pair.com header.from=andi@zend.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=andi@zend.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain zend.com designates 212.25.124.162 as permitted sender) X-PHP-List-Original-Sender: andi@zend.com X-Host-Fingerprint: 212.25.124.162 mail.zend.com Windows 2000 SP4, XP SP1 Received: from [212.25.124.162] ([212.25.124.162:9898] helo=mx1.zend.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id FA/72-03518-DD4A8584 for ; Wed, 18 Jun 2008 02:02:06 -0400 Received: from us-ex1.zend.com ([192.168.16.5]) by mx1.zend.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 18 Jun 2008 09:02:11 +0300 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Date: Tue, 17 Jun 2008 23:01:34 -0700 Message-ID: <698DE66518E7CA45812BD18E807866CE01B11811@us-ex1.zend.net> In-Reply-To: <4856A547.3080801@gmx.net> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP Thread-Index: AcjP2C4noR3ucoEfSfikWmcnOUTR6wBLJzgA References: <4856A547.3080801@gmx.net> To: "Christian Seiler" Cc: "php-dev List" X-OriginalArrivalTime: 18 Jun 2008 06:02:11.0459 (UTC) FILETIME=[D93BFD30:01C8D108] Subject: RE: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP From: andi@zend.com ("Andi Gutmans") SGkgQ2hyaXN0aWFuLA0KDQpUaGlzIGlzIGEgdmVyeSBuaWNlIHBpZWNlIG9mIHdvcmsuIERlZmlu aXRlbHkgYWRkcmVzc2VzIGEgbG90IG9mIHRoZSBpc3N1ZXMgd2UgaGF2ZSByYWlzZWQgaW4gdGhl IHBhc3QuDQpJIHdvdWxkIGxpa2UgdG8gc2VlIHN1Y2ggYSBzb2x1dGlvbiBtYWtlIGl0cyB3YXkg aW50byBQSFAgKHNlZSBiZWxvdyByZTogdGltaW5nKS4JDQoNClRoZXJlIGFyZSBzb21lIHRoaW5n cyBJJ2QgbGlrZSB0byBjb25zaWRlcjoNCjEpIEkgYW0gbm90IHN1cmUgdGhhdCB0aGUgY3VycmVu dCBzZW1hbnRpY3Mgb2YgdGhlICJsZXhpY2FsIiBrZXl3b3JkIGlzIGdyZWF0IGluIGFsbCBjYXNl cy4gSXMgdGhlIHJlYXNvbiB3aHkgeW91IGRvbid0IGFsbG93IGJ5LXZhbHVlIGJpbmRpbmcgc28g dGhhdCB3ZSBkb24ndCBoYXZlIHRvIG1hbmFnZSBtb3JlIHRoYW4gb25lIGxhbWJkYSBpbnN0YW5j ZSBwZXIgZGVjbGFyYXRpb24/DQoyKSBbbWlub3IgY3VyaW9zaXR5IC0gZG8gd2Ugd2FudCB0byBj b25zaWRlciByZXVzaW5nICJwYXJlbnQiIGluc3RlYWQgb2YgImxleGljYWwiPyBJIGd1ZXNzIHRo YXQgY291bGQgYmUgY29uZnVzaW5nIGJ1dCBpdCdzIG5vdCB0aGUgZmlyc3QgdGltZSB3ZSByZXVz ZSBhIGtleXdvcmQgd2hlbiBpdCdzIGNsZWFyIHRoYXQgdGhlIHVzYWdlIGlzIGluIHR3byBkaWZm ZXJlbnQgcGxhY2VzICh0aGlzIGlzIG1pbm9yIGFuZCBJIGRvbid0IG1pbmQgbXVjaCBlaXRoZXIg d2F5IGFsdGhvdWdoIGxleGljYWwgZG9lc24ndCBtZWFuIHRvbyBtdWNoIHRvIG1lKS5dDQozKSBJ IGFtIGNvbmNlcm5lZCBhYm91dCBiaW5kaW5nIHRvIGNsYXNzZXMuIEZpcnN0IG9mIGFsbCB3ZSBu ZWVkIHRvIGxvb2sgaW50byBtb3JlIGRldGFpbCB3aGF0IHRoZSBpbXBsaWNhdGlvbnMgYXJlIGZv ciBieXRlY29kZSBjYWNoZXMgd2hlbiBjaGFuZ2luZyBjbGFzcyBlbnRyaWVzIGF0IHJ1bi10aW1l LiBXZSBtYXkgd2FudCB0byBhbHNvIGNvbnNpZGVyIGFuIG9wdGlvbiB3aGVyZSB0aGUgbGFtYmRh IGJpbmRzIHRvIHRoZSBvYmplY3QgYW5kIG9ubHkgaGFzIHB1YmxpYyBhY2Nlc3MgYWx0aG91Z2gg SSByZWFsaXplIHRoYXQgbWF5IGJlIGNvbnNpZGVyZWQgYnkgc29tZSBhcyB0b28gbGltaXRpbmcu IFdlJ2xsIHJldmlldyB0aGVzZSB0d28gdGhpbmdzIGluIHRoZSBjb21pbmcgZGF5cy4NCg0KUmU6 IHRpbWluZywgSSB0aGluayB0aGUgYmlnZ2VzdCBpc3N1ZSB3ZSBoYXZlIHJpZ2h0IG5vdyB3aXRo IFBIUCA1LjMgaXMgdGhhdCB3ZSBhcmUgbm90IG1ha2luZyBhIGNsZWFyIGN1dCBvbiBmZWF0dXJl cy4gVGhlcmUncyBhbHdheXMgcHJlc3N1cmUgb24gcmVsZWFzZSBtYW5hZ2VycyB0byBpbmNsdWRl IG1vcmUgKEkgd2VudCB0aHJvdWdoIHRoZSBzYW1lIHdpdGggNS4wKSBidXQgYXQgc29tZSBwb2lu dCB5b3UganVzdCBoYXZlIHRvIHN0b3AgYXQgc29tZSBwbGFjZSBvciB0aGluZ3Mgd2lsbCBuZXZl ciBnbyBvdXQgYXMgdGhlcmUgYXJlIGFsd2F5cyBnb29kIGlkZWFzIGZsb3dpbmcgaW4uIFVuZm9y dHVuYXRlbHkgd2l0aCA1LjMgdGhhdCBjdXQgaXNuJ3QgaGFwcGVuaW5nIGFuZCBpdCBzZWVtcyB0 byBkcmFnIG91dCBsb25nZXIgdGhhbiBuZWVkZWQuIEkgcHJlZmVyIGhhdmluZyB0aGlzIGRpc2N1 c3Npb24gaW4gdGhlIGNvbnRleHQgb2YgYSBoYXJkIGRhdGUgZm9yIGEgYmV0YSByZWxlYXNlIGFm dGVyIHdoaWNoIHdlJ2xsIGJlIGVzcGVjaWFsbHkgc3RyaWN0IHdpdGggYWNjZXB0aW5nIG5ldyBm ZWF0dXJlcy4gRWFjaCBuZXcgZmVhdHVyZSB3aWxsIGRyYWcgb3V0IHRoZSBiZXRhL1JDIGN5Y2xl IGFzIHRoZXkgbmVlZCBlbm91Z2ggdGltZSBmb3IgdGVzdGluZy9mZWVkYmFjay90d2Vha3MuDQoN CkFuZGkJDQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQ2hyaXN0aWFu IFNlaWxlciBbbWFpbHRvOmNocmlzX3NlQGdteC5uZXRdDQo+IFNlbnQ6IE1vbmRheSwgSnVuZSAx NiwgMjAwOCAxMDozOSBBTQ0KPiBUbzogcGhwLWRldiBMaXN0DQo+IFN1YmplY3Q6IFtQSFAtREVW XSBbUEFUQ0hdIFtSRkNdIENsb3N1cmVzIGFuZCBsYW1iZGEgZnVuY3Rpb25zIGluIFBIUA0KPiAN Cj4gSGksDQo+IA0KPiBBcyBhIGZvbGxvd3VwIHRvIHRoZSBkaXNjdXNzaW9uIGluIEphbnVhcnks IEknZCBsaWtlIHBvc3QgYSByZXZpc2VkIHBhdGNoIHRvDQo+IHRoaXMgbGlzdCB0aGF0IGltcGxl bWVudHMgY2xvc3VyZXMgYW5kIGFub255bW91cyBmdW5jdGlvbnMgaW4gUEhQLg0KPiANCj4gSU5U Uk9EVUNUSU9ODQo+IC0tLS0tLS0tLS0tLQ0KPiANCj4gQ2xvc3VyZXMgYW5kIGxhbWJkYSBmdW5j dGlvbnMgY2FuIG1ha2UgcHJvZ3JhbW1pbmcgbXVjaCBlYXNpZXIgaW4NCj4gc2V2ZXJhbCB3YXlz Og0KPiANCj4gICAxLiBMYW1iZGEgZnVuY3Rpb25zIGFsbG93IHRoZSBxdWljayBkZWZpbml0aW9u IG9mIHRocm93LWF3YXkgZnVuY3Rpb25zDQo+ICAgICAgdGhhdCBhcmUgbm90IHVzZWQgZWxzZXdo ZXJlLiBJbWFnaW5nIGZvciBleGFtcGxlIGEgcGllY2Ugb2YgY29kZSB0aGF0DQo+ICAgICAgbmVl ZHMgdG8gY2FsbCBwcmVnX3JlcGxhY2VfY2FsbGJhY2soKS4gQ3VycmVudGx5LCB0aGVyZSBhcmUg dGhyZWUNCj4gICAgICBwb3NzaWJpbGl0aWVzIHRvIGFjY2hpZXZlIHRoaXM6DQo+IA0KPiAgICAg ICBhLiBEZWZpbmUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGVsc2V3aGVyZS4gVGhpcyBkaXN0cmli dXRlcyBjb2RlIHRoYXQNCj4gICAgICAgICAgYmVsb25ncyB0b2dldGhlciB0aHJvdWdob3V0IHRo ZSBmaWxlIGFuZCBkZWNyZWFzZXMgcmVhZGFiaWxpdHkuDQo+IA0KPiAgICAgICBiLiBEZWZpbmUg dGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGluLXBsYWNlIChidXQgd2l0aCBhIG5hbWUpLiBJbg0KPiB0 aGF0IGNhc2UNCj4gICAgICAgICAgb25lIGhhcyB0byB1c2UgZnVuY3Rpb25fZXhpc3RzKCkgdG8g bWFrZSBzdXJlIHRoZSBmdW5jdGlvbiBpcyBvbmx5DQo+ICAgICAgICAgIGRlZmluZWQgb25jZS4g RXhhbXBsZSBjb2RlOg0KPiANCj4gICAgICAgICAgIDw/cGhwDQo+ICAgICAgICAgICAgICBmdW5j dGlvbiByZXBsYWNlX3NwYWNlcyAoJHRleHQpIHsNCj4gICAgICAgICAgICAgICAgaWYgKCFmdW5j dGlvbl9leGlzdHMgKCdyZXBsYWNlX3NwYWNlc19oZWxwZXInKSkgew0KPiAgICAgICAgICAgICAg ICAgIGZ1bmN0aW9uIHJlcGxhY2Vfc3BhY2VzX2hlbHBlciAoJG1hdGNoZXMpIHsNCj4gICAgICAg ICAgICAgICAgICAgIHJldHVybiBzdHJfcmVwbGFjZSAoJG1hdGNoZXNbMV0sICcgJywgJyZuYnNw OycpLicgJzsNCj4gICAgICAgICAgICAgICAgICB9DQo+ICAgICAgICAgICAgICAgIH0NCj4gICAg ICAgICAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZV9jYWxsYmFjayAoJy8oICspIC8nLA0KPiAn cmVwbGFjZV9zcGFjZXNfaGVscGVyJywNCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJHRleHQpOw0KPiAgICAgICAgICAgICAgfQ0KPiAgICAgICAgICAgPz4N Cj4gDQo+ICAgICAgICAgIEhlcmUsIHRoZSBhZGRpdGlvbmFsIGlmKCkgYXJvdW5kIHRoZSBmdW5j dGlvbiBkZWZpbml0aW9uIG1ha2VzIHRoZQ0KPiAgICAgICAgICBzb3VyY2UgY29kZSBkaWZmaWN1 bHQgdG8gcmVhZC4NCj4gDQo+ICAgICAgIGMuIFVzZSB0aGUgcHJlc2VudCBjcmVhdGVfZnVuY3Rp b24oKSBpbiBvcmRlciB0byBjcmVhdGUgYSBmdW5jdGlvbiBhdA0KPiAgICAgICAgICBydW50aW1l LiBUaGlzIGFwcHJvYWNoIGhhcyBzZXZlcmFsIGRpc2FkdmFudGFnZXM6IEZpcnN0IG9mIGFsbCwN Cj4gc3ludGF4DQo+ICAgICAgICAgIGhpZ2hsaWdodGluZyBkb2VzIG5vdCB3b3JrIGJlY2F1c2Ug YSBzdHJpbmcgaXMgcGFzc2VkIHRvIHRoZQ0KPiBmdW5jdGlvbi4NCj4gICAgICAgICAgSXQgYWxz byBjb21waWxlcyB0aGUgZnVuY3Rpb24gYXQgcnVuIHRpbWUgYW5kIG5vdCBhdCBjb21waWxlDQo+ IHRpbWUgc28NCj4gICAgICAgICAgb3Bjb2RlIGNhY2hlcyBjYW4ndCBjYWNoZSB0aGUgZnVuY3Rp b24uDQo+IA0KPiAgIDIuIENsb3N1cmVzIHByb3ZpZGUgYSB2ZXJ5IHVzZWZ1bCB0b29sIGluIG9y ZGVyIHRvIG1ha2UgbGFtYmRhDQo+IGZ1bmN0aW9ucyBldmVuDQo+ICAgICAgbW9yZSB1c2VmdWwu IEp1c3QgaW1hZ2luZSB5b3Ugd2FudCB0byByZXBsYWNlICdoZWxsbycgdGhyb3VnaA0KPiAnZ29v ZGJ5ZScgaW4NCj4gICAgICBhbGwgZWxlbWVudHMgb2YgYW4gYXJyYXkuIFBIUCBwcm92aWRlcyB0 aGUgYXJyYXlfbWFwKCkgZnVuY3Rpb24gd2hpY2gNCj4gICAgICBhY2NlcHRzIGEgY2FsbGJhY2su IElmIHlvdSBkb24ndCB3YW4ndCB0byBoYXJkLWNvZGUgJ2hlbGxvJyBhbmQNCj4gJ2dvb2RieWUn DQo+ICAgICAgaW50byB5b3VyIHNvdXJjZWNvZGUsIHlvdSBoYXZlIG9ubHkgZm91ciBjaG9pY2Vz Og0KPiANCj4gICAgICAgYS4gVXNlIGNyZWF0ZV9mdW5jdGlvbigpLiBCdXQgdGhlbiB5b3UgbWF5 IG9ubHkgcGFzcyBsaXRlcmFsIHZhbHVlcw0KPiAgICAgICAgICAoc3RyaW5ncywgaW50ZWdlcnMs IGZsb2F0cykgaW50byB0aGUgZnVuY3Rpb24sIG9iamVjdHMgYXQgYmVzdCBhcw0KPiAgICAgICAg ICBjbG9uZXMgKGlmIHZhcl9leHBvcnQoKSBhbGxvd3MgZm9yIGl0KSBhbmQgcmVzb3VyY2VzIG5v dCBhdA0KPiBhbGwuIEFuZA0KPiAgICAgICAgICB5b3UgaGF2ZSB0byB3b3JyeSBhYm91dCBlc2Nh cGluZyBldmVyeXRoaW5nIGNvcnJlY3RseS4NCj4gRXNwZWNpYWxseSB3aGVuDQo+ICAgICAgICAg IGhhbmRsaW5nIHVzZXIgaW5wdXQgdGhpcyBjYW4gbGVhZCB0byBhbGwgc29ydHMgb2Ygc2VjdXJp dHkgaXNzdWVzLg0KPiANCj4gICAgICAgYi4gV3JpdGUgYSBmdW5jdGlvbiB0aGF0IHVzZXMgZ2xv YmFsIHZhcmlhYmxlcy4gVGhpcyBpcyB1Z2x5LA0KPiAgICAgICAgICBub24tcmVlbnRyYW50IGFu ZCBiYWQgc3R5bGUuDQo+IA0KPiAgICAgICBjLiBDcmVhdGUgYW4gZW50aXJlIGNsYXNzLCBpbnN0 YW50aWF0ZSBpdCBhbmQgcGFzcyB0aGUgbWVtYmVyIGZ1bmN0aW9uDQo+ICAgICAgICAgIGFzIGEg Y2FsbGJhY2suIFRoaXMgaXMgcGVyaGFwcyB0aGUgY2xlYW5lc3Qgc29sdXRpb24gZm9yIHRoaXMN Cj4gcHJvYmxlbQ0KPiAgICAgICAgICB3aXRoIGN1cnJlbnQgUEhQIGJ1dCBqdXN0IHRoaW5rIGFi b3V0IGl0OiBDcmVhdGluZyBhbiBlbnRpcmUNCj4gY2xhc3MgZm9yDQo+ICAgICAgICAgIHRoaXMg ZXh0cmVtZWx5IHNpbXBsZSBwdXJwb3NlIGFuZCBub3RoaW5nIGVsc2Ugc2VlbXMgb3ZlcmtpbGwu DQo+IA0KPiAgICAgICBkLiBEb24ndCB1c2UgYXJyYXlfbWFwKCkgYnV0IHNpbXBseSBkbyBpdCBt YW51YWxseSAoZm9yZWFjaCkuIEluIHRoaXMNCj4gICAgICAgICAgc2ltcGxlIGNhc2UgaXQgbWF5 IG5vdCBiZSB0aGF0IG11Y2ggb2YgYW4gaXNzdWUgKGJlY2F1c2Ugb25lIHNpbXBseQ0KPiAgICAg ICAgICB3YW50cyB0byBpdGVyYXRlIG92ZXIgYW4gYXJyYXkpIGJ1dCB0aGVyZSBhcmUgY2FzZXMg d2hlcmUgZG9pbmcNCj4gICAgICAgICAgc29tZXRoaW5nIG1hbnVhbGx5IHRoYXQgYSBmdW5jdGlv biB3aXRoIGEgY2FsbGJhY2sgYXMgcGFyYW1ldGVyDQo+IGRvZXMNCj4gICAgICAgICAgZm9yIHlv dSBpcyBxdWl0ZSB0ZWRpb3VzLg0KPiANCj4gICAgICBbWWVzLCBJIGtub3cgdGhhdCBzdHJfcmVw bGFjZSBhbHNvIGFjY2VwdHMgYXJyYXlzIGFzIGEgdGhpcmQNCj4gcGFyYW1ldGVyIHNvDQo+ICAg ICAgdGhpcyBleGFtcGxlIG1heSBiZSBhIGJpdCB1c2VsZXNzLiBCdXQgaW1hZ2luZSB5b3Ugd2Fu dCB0byBkbyBhIG1vcmUNCj4gICAgICBjb21wbGV4IG9wZXJhdGlvbiB0aGFuIHNpbXBsZSBzZWFy Y2ggYW5kIHJlcGxhY2UuXQ0KPiANCj4gUFJPUE9TRUQgUEFUQ0gNCj4gLS0tLS0tLS0tLS0tLS0N Cj4gDQo+IEkgbm93IHByb3Bvc2UgYSBwYXRjaCB0aGF0IGltcGxlbWVudHMgY29tcGlsZS10aW1l IGxhbWJkYSBmdW5jdGlvbnMgYW5kDQo+IGNsb3N1cmVzIGZvciBQSFAgd2hpbGUga2VlcGluZyB0 aGUgcGF0Y2ggYXMgc2ltcGxlIGFzIHBvc3NpYmxlLiBUaGUgcGF0Y2ggaXMNCj4gYmFzZWQgb24g YSBwcmV2aW91cyBwYXRjaCBvbiBtaW5lIHdoaWNoIHdhcyBiYXNlZCBvbiBpZGVhcyBkaXNjdXNz ZWQgaGVyZQ0KPiBlbmQgb2YgRGVjZW1iZXIgLyBzdGFydCBvZiBKYW51YXJ5Lg0KPiANCj4gVXNl cmxhbmQgcGVyc3BlY3RpdmUNCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4gDQo+IDEuIFRoZSBw YXRjaCBhZGRzIHRoZSBmb2xsb3dpbmcgc3ludGF4IGFzIGEgdmFsaWQgZXhwcmVzc2lvbjoNCj4g DQo+IGZ1bmN0aW9uICYgKHBhcmFtZXRlcnMpIHsgYm9keSB9DQo+IA0KPiAoVGhlICYgaXMgb3B0 aW9uYWwgYW5kIGluZGljYXRlcyAtIGp1c3QgYXMgd2l0aCBub3JtYWwgZnVuY3Rpb25zIC0gdGhh dCB0aGUNCj4gYW5vbnltb3VzIGZ1bmN0aW9uIHJldHVybnMgYSByZWZlcmVuY2UgaW5zdGVhZCBv ZiBhIHZhbHVlKQ0KPiANCj4gRXhhbXBsZSB1c2FnZToNCj4gDQo+ICRsYW1iZGEgPSBmdW5jdGlv biAoKSB7IGVjaG8gIkhlbGxvIFdvcmxkIVxuIjsgfTsNCj4gDQo+IFRoZSB2YXJpYWJsZSAkbGFt YmRhIHRoZW4gY29udGFpbnMgYSBjYWxsYWJsZSByZXNvdXJjZSB0aGF0IG1heSBiZSBjYWxsZWQN Cj4gdGhyb3VnaCBkaWZmZXJlbnQgbWVhbnM6DQo+IA0KPiAkbGFtYmRhICgpOw0KPiBjYWxsX3Vz ZXJfZnVuYyAoJGxhbWJkYSk7DQo+IGNhbGxfdXNlcl9mdW5jX2FycmF5ICgkbGFtYmRhLCBhcnJh eSAoKSk7DQo+IA0KPiBUaGlzIGFsbG93cyBmb3Igc2ltcGxlIGxhbWJkYSBmdW5jdGlvbnMsIGZv ciBleGFtcGxlOg0KPiANCj4gZnVuY3Rpb24gcmVwbGFjZV9zcGFjZXMgKCR0ZXh0KSB7DQo+ICAg ICRyZXBsYWNlbWVudCA9IGZ1bmN0aW9uICgkbWF0Y2hlcykgew0KPiAgICAgIHJldHVybiBzdHJf cmVwbGFjZSAoJG1hdGNoZXNbMV0sICcgJywgJyZuYnNwOycpLicgJzsNCj4gICAgfTsNCj4gICAg cmV0dXJuIHByZWdfcmVwbGFjZV9jYWxsYmFjayAoJy8oICspIC8nLCAkcmVwbGFjZW1lbnQsICR0 ZXh0KTsNCj4gfQ0KPiANCj4gMi4gVGhlIHBhdGNoIGltcGxlbWVudHMgY2xvc3VyZXMgYnkgZGVm aW5pbmcgYW4gYWRkaXRpb25hbCBrZXl3b3JkICdsZXhpY2FsJw0KPiB0aGF0IGFsbG93cyBhbiBs YW1iZGEgZnVuY3Rpb24gKGFuZCAqb25seSogYW4gbGFtYmRhIGZ1bmN0aW9uKSB0byBpbXBvcnQN Cj4gYSB2YXJpYWJsZSBmcm9tIHRoZSAicGFyZW50IHNjb3BlIiB0byB0aGUgbGFtYmRhIGZ1bmN0 aW9uIHNjb3BlLiBFeGFtcGxlOg0KPiANCj4gZnVuY3Rpb24gcmVwbGFjZV9pbl9hcnJheSAoJHNl YXJjaCwgJHJlcGxhY2VtZW50LCAkYXJyYXkpIHsNCj4gICAgJG1hcCA9IGZ1bmN0aW9uICgkdGV4 dCkgew0KPiAgICAgIGxleGljYWwgJHNlYXJjaCwgJHJlcGxhY2VtZW50Ow0KPiAgICAgIGlmIChz dHJwb3MgKCR0ZXh0LCAkc2VhcmNoKSA+IDUwKSB7DQo+ICAgICAgICByZXR1cm4gc3RyX3JlcGxh Y2UgKCRzZWFyY2gsICRyZXBsYWNlbWVudCwgJHRleHQpOw0KPiAgICAgIH0gZWxzZSB7DQo+ICAg ICAgICByZXR1cm4gJHRleHQ7DQo+ICAgICAgfQ0KPiAgICB9Ow0KPiAgICByZXR1cm4gYXJyYXlf bWFwICgkbWFwLCBhcnJheSk7DQo+IH0NCj4gDQo+IFRoZSB2YXJpYWJsZXMgJHNlYXJjaCBhbmQg JHJlcGxhY2VtZW50IGFyZSB2YXJpYWJsZXMgaW4gdGhlIHNjb3BlIG9mIHRoZQ0KPiBmdW5jdGlv biByZXBsYWNlX2luX2FycmF5KCkgYW5kIHRoZSBsZXhpY2FsIGtleXdvcmQgaW1wb3J0cyB0aGVz ZSB2YXJpYWJsZXMNCj4gaW50byB0aGUgc2NvcGUgb2YgdGhlIGNsb3N1cmUuIFRoZSB2YXJpYWJs ZXMgYXJlIGltcG9ydGVkIGFzIGEgcmVmZXJlbmNlLA0KPiBzbyBhbnkgY2hhbmdlIGluIHRoZSBj bG9zdXJlIHdpbGwgcmVzdWx0IGluIGEgY2hhbmdlIGluIHRoZSB2YXJpYWJsZSBvZiB0aGUNCj4g ZnVuY3Rpb24gaXRzZWxmLg0KPiANCj4gMy4gSWYgYSBjbG9zdXJlIGlzIGRlZmluZWQgaW5zaWRl IGFuIG9iamVjdCwgdGhlIGNsb3N1cmUgaGFzIGZ1bGwgYWNjZXNzDQo+IHRvIHRoZSBjdXJyZW50 IG9iamVjdCB0aHJvdWdoICR0aGlzICh3aXRob3V0IHRoZSBuZWVkIHRvIHVzZSAnbGV4aWNhbCcg dG8NCj4gaW1wb3J0IGl0IHNlcGVyYXRlbHkpIGFuZCBhbGwgcHJpdmF0ZSBhbmQgcHJvdGVjdGVk IG1ldGhvZHMgb2YgdGhhdCBjbGFzcy4NCj4gVGhpcyBhbHNvIGFwcGxpZXMgdG8gbmVzdGVkIGNs b3N1cmVzLiBFc3NlbnRpYWxseSwgY2xvc3VyZXMgaW5zaWRlDQo+IG1ldGhvZHMgYXJlDQo+IGFk ZGVkIGFzIHB1YmxpYyBtZXRob2RzIHRvIHRoZSBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBvcmln aW5hbCBtZXRob2QuDQo+IA0KPiA0LiBDbG9zdXJlcyBtYXkgbGl2ZSBsb25nZXIgYXMgdGhlIG1l dGhvZHMgdGhhdCBkZWNsYXJlZCB0aGVtLiBJdCBpcw0KPiBwZXJmZWN0bHkNCj4gcG9zc2libGUg dG8gaGF2ZSBzb21ldGhpbmcgbGlrZSB0aGlzOg0KPiANCj4gZnVuY3Rpb24gZ2V0QWRkZXIoJHgp IHsNCj4gICAgcmV0dXJuIGZ1bmN0aW9uICgkeSkgew0KPiAgICAgIGxleGljYWwgJHg7DQo+ICAg ICAgcmV0dXJuICR4ICsgJHk7DQo+ICAgIH07DQo+IH0NCj4gDQo+IFplbmQgaW50ZXJuYWwgcGVy c3BlY3RpdmUNCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiANCj4gVGhlIHBhdGNoIGJh c2ljYWxseSBjaGFuZ2VzIHRoZSBmb2xsb3dpbmcgaW4gdGhlIFplbmQgZW5naW5lOg0KPiANCj4g V2hlbiB0aGUgY29tcGlsZXIgcmVhY2hlcyBhIGxhbWJkYSBmdW5jdGlvbiwgaXQgY3JlYXRlcyBh IHVuaXF1ZSBuYW1lDQo+IGZvciB0aGF0DQo+IGZ1bmN0aW9uICgiXDBfX2NvbXBpbGVkX2xhbWJk YV9GSUxFTkFNRV9OIiB3aGVyZSBGSUxFTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUNCj4gZmlsZSBj dXJyZW50bHkgcHJvY2Vzc2VkIGFuZCBOIGlzIGEgcGVyLWZpbGUgY291bnRlcikuIFRoZSB1c2Ug b2YgdGhlDQo+IGZpbGVuYW1lDQo+IGluIHRoZSBmdW5jdGlvbiBuYW1lIGVuc3VyZXMgY29tcGFi aWxpdHkgd2l0aCBvcGNvZGUgY2FjaGVzLiBUaGUgbGFtYmRhDQo+IGZ1bmN0aW9uIGlzIHRoZW4g aW1tZWRpYXRlbHkgYWRkZWQgdG8gdGhlIGZ1bmN0aW9uIHRhYmxlIChlaXRoZXIgdGhlIGdsb2Jh bA0KPiBmdW5jdGlvbiB0YWJsZSBvciB0aGF0IG9mIHRoZSBjdXJyZW50IGNsYXNzIGlmIGRlY2xh cmVkIGluc2lkZSBhIGNsYXNzDQo+IG1ldGhvZCkuDQo+IEluc3RlYWQgb2YgYSBub3JtYWwgWkVO RF9ERUNMQVJFX0ZVTkNUSU9OIG9wY29kZSB0aGUgbmV3DQo+IFpFTkRfREVDTEFSRV9MQU1CREFf RlVOQyBpcyB1c2VkIGFzIGFuIG9wY29kZSBhdCB0aGlzIHBvaW50LiBUaGUgb3BfYXJyYXkNCj4g b2YgdGhlIG5ldyBmdW5jdGlvbiBpcyBpbml0aWFsaXplZCB3aXRoIGlzX2xhbWJkYSA9IDEgYW5k IGlzX2Nsb3N1cmUgPSAwLg0KPiANCj4gV2hlbiBwYXJzaW5nIGEgJ2xleGljYWwnIGRlY2xhcmF0 aW9uIGluc2lkZSBhbiBhbm9ueW1vdXMgZnVuY3Rpb24gdGhlIHBhcnNlcg0KPiBzYXZlcyB0aGUg bmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCBpcyB0byBiZSBpbXBvcnRlZCBpbiBhbiBhcnJheSBz dG9yZWQNCj4gYXMgYSBtZW1iZXIgb2YgdGhlIG9wX2FycmF5IHN0cnVjdHVyZSAobGV4aWNhbF9u YW1lcykuDQo+IA0KPiBUaGUgb3Bjb2RlIGhhbmRsZXIgZm9yIFpFTkRfREVDTEFSRV9MQU1CREFf RlVOQyBkb2VzIHRoZSBmb2xsb3dpbmc6IEZpcnN0IG9mDQo+IGFsbCBpdCBjcmVhdGVzIGEgbmV3 IG9wX2FycmF5IGFuZCBjb3BpZXMgdGhlIGVudGlyZSBtZW1vcnkgc3RydWN0dXJlIG9mIHRoZQ0K PiBsYW1iZGEgZnVuY3Rpb24gaW50byBpdCAodGhlIG9wY29kZXMgdGhlbXNlbHZlcyBhcmUgbm90 IGNvcGllZCBzaW5jZSB0aGV5DQo+IGFyZSBvbmx5IHJlZmVyZW5jZWQgaW4gdGhlIG9wX2FycmF5 IHN0cnVjdHVyZSkuIFRoZW4gaXQgc2V0cyBpc19jbG9zdXJlID0gMQ0KPiBvbiB0aGUgbmV3IG9w X2FycmF5LCBhbmQgZm9yIGVhY2ggbGV4aWNhbCB2YXJpYWJsZSBuYW1lIHRoYXQgdGhlIGNvbXBp bGVyDQo+IGFkZGVkIHRvIHRoZSBvcmlnaW5hbCBvcF9hcnJheSBpdCBjcmVhdGVzIGEgcmVmZXJl bmNlIHRvIHRoYXQgdmFyaWFibGUgZnJvbQ0KPiB0aGUgY3VycmVudCBzY29wZSBpbnRvIGEgSGFz aFRhYmxlIG1lbWJlciBpbiB0aGUgbmV3IG9wX2FycmF5LiBJdCBhbHNvIHNhdmVzDQo+IHRoZSBj dXJyZW50IG9iamVjdCBwb2ludGVyICgkdGhpcykgYXMgYSBtZW1iZXIgb2YgdGhlIG9wX2FycmF5 IGluIG9yZGVyIHRvDQo+IGFsbG93IGZvciB0aGUgY2xvc3VyZSB0byBhY2Nlc3MgJHRoaXMuIEZp bmFsbHkgaXQgcmVnaXN0ZXJzIHRoZSBuZXcgb3BfYXJyYXkNCj4gYXMgYSByZXNvdXJjZSBhbmQg cmV0dXJucyB0aGF0IHJlc291cmNlLg0KPiANCj4gVGhlIG9wY29kZSBoYW5kbGVyIG9mIHRoZSAn bGV4aWNhbCcgY29uc3RydWN0IHNpbXBseSBmZXRjaGVzIHRoZSB2YXJpYWJsZQ0KPiBmcm9tIHRo YXQgSGFzaFRhYmxlIGFuZCBpbXBvcnRzIGl0IGludG8gbG9jYWwgc2NvcGUgb2YgdGhlIGlubmVy IGZ1bmN0aW9uDQo+IChqdXN0IGxpa2Ugd2l0aCAnZ2xvYmFsJyBvbmx5IHdpdGggYSBkaWZmZXJl bnQgaGFzaCB0YWJsZSkuDQo+IA0KPiBTb21lIGhvb2tzIHdlcmUgYWRkZWQgdGhhdCBhbGxvdyB0 aGUgJ2xhbWJkYSBmdW5jdGlvbicgcmVzb3VyY2UgdG8gYmUNCj4gY2FsbGVkLg0KPiBBbHNvLCB0 aGVyZSBhcmUgc2V2ZXJhbCBjaGVja3MgaW4gcGxhY2UgdGhhdCBtYWtlIHN1cmUgdGhlIGxhbWJk YSBmdW5jdGlvbg0KPiBpcyBub3QgY2FsbGVkIGRpcmVjdGx5LCBpLmUuIGlmIHNvbWVvbmUgZXhw bGljaXRlbHkgdHJpZXMgdG8gdXNlIHRoZQ0KPiBpbnRlcm5hbA0KPiBmdW5jdGlvbiBuYW1lIGlu c3RlYWQgb2YgdXNpbmcgdGhlIHJlc291cmNlIHJldHVybiB2YWx1ZSBvZiB0aGUgZGVjbGFyYXRp b24uDQo+IA0KPiBUaGUgcGF0Y2gNCj4gLS0tLS0tLS0tDQo+IA0KPiBUaGUgcGF0Y2ggaXMgYXZh aWxhYmxlIGhlcmU6DQo+IDxodHRwOi8vd3d3LmNocmlzdGlhbi1zZWlsZXIuZGUvdGVtcC9jbG9z dXJlcy1waHAtNS4zLTIwMDgtMDYtMTYtMS5kaWZmPg0KPiANCj4gUGxlYXNlIG5vdGUgdGhhdCBJ IGRpZCBOT1QgaW5jbHVkZSB0aGUgY29udGVudHMgb2YgemVuZF9sYW5ndWFnZV9zY2FubmVyLmMN Cj4gaW4gdGhlIHBhdGNoIHNpbmNlIHRoYXQgY2FuIGVhc2lseSBiZSByZWdlbmVyYXRlZCBhbmQg anVzdCB0YWtlcyB1cCBlbm9ybW91cw0KPiBhbW91bnRzIG9mIHNwYWNlLg0KPiANCj4gVGhlIHBh dGNoIGl0c2VsZiBhcHBsaWVzIGFnYWluc3QgdGhlIDUuMyBicmFuY2ggb2YgUEhQLg0KPiANCj4g SWYgSSB1bmRlcnN0YW5kIHRoZSBkaXNjdXNzaW9uIHJlZ2FyZGluZyBQSFA2IG9uIHRoaXMgbGlz dCBjb3JyZWN0bHksIHNvbWUNCj4gcGVvcGxlIGFyZSBjdXJyZW50bHkgdW5kZXJnb2luZyB0aGUg dGFzayBvZiByZW1vdmluZyB0aGUgdW5pY29kZV9zZW1hbnRpY3MNCj4gc3dpdGNoIGFuZCBpZiAo VUcodW5pY29kZSkpLiBBcyBzb29uIGFzIHRoaXMgdGFzayBpcyBmaW5pc2hlZCBJIHdpbGwgYWxz bw0KPiBwcm92aWRlIGEgcGF0Y2ggZm9yIENWUyBIRUFEIChpdCBkb2Vzbid0IG1ha2UgbXVjaCBz ZW5zZSBhZG9wdGluZyB0aGUgcGF0Y2gNCj4gbm93IGFuZCB0aGVuIGhhdmluZyB0byBjaGFuZ2Ug aXQgYWdhaW4gY29tcGxldGVseSBhZnRlcndhcmRzKS4NCj4gDQo+IEJDIEJSRUFLUw0KPiAtLS0t LS0tLS0NCj4gDQo+ICAgKiBJbnRyb2R1Y3Rpb24gb2YgYSBuZXcga2V5d29yZCAnbGV4aWNhbCcu IFNpbmNlIGl0IGlzIHZlcnkgaW1wcm9iYWJsZQ0KPiB0aGF0DQo+ICAgICBzb21lb25lIHNob3Vs ZCB1c2UgaXQgYXMgYSBmdW5jdGlvbiwgbWV0aG9kLCBjbGFzcyBvciBwcm9wZXJ0eSBuYW1lLCBJ DQo+ICAgICB0aGluayB0aGlzIGlzIGFuIGFjY2VwdGFibGUgYnJlYWsuDQo+IA0KPiBPdGhlciB0 aGF0IHRoYXQsIEkgY2FuIGZpbmQgbm8gQkMgYnJlYWtzIG9mIG15IHBhdGNoLg0KPiANCj4gQ0FW RUFUUyAvIFBPU1NJQkxFIFdURlMNCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4gDQo+ICAg KiBPbiB3cml0aW5nICRmdW5jID0gZnVuY3Rpb24gKCkgeyB9OyB0aGVyZSBpcyBhIHNlbWljb2xv biBuZWNlc3NhcnkuDQo+IElmIGxlZnQNCj4gICAgIG91dCBpdCB3aWxsIHByb2R1Y2UgYSBjb21w aWxlIGVycm9yLiBTaW5jZSBhbnkgYXR0ZW1wdCB0byByZW1vdmUgdGhhdA0KPiAgICAgbmVjZXNz aXR5IHdvdWxkIHVuZWNlc3NhcmlseSBibG9hdCB0aGUgZ3JhbW1hciwgSSBzdWdnZXN0IHdlIHNp bXBseSBrZWVwDQo+ICAgICBpdCB0aGUgd2F5IGl0IGlzLiBBbHNvLCBMdWthcyBLYWh3ZSBTbWl0 aCBwb2ludGVkIG91dCB0aGF0IGEgc2luZ2xlDQo+ICAgICB0cmFpbGluZyBzZW1pY29sb24gYWZ0 ZXIgYSBjbG9zaW5nIGJyYWNlIGFscmVhZHkgZXhpc3RzOiBkbyB7IH0NCj4gd2hpbGUgKCk7DQo+ IA0KPiAgICogVGhlIGZhY3QgdGhhdCAnbGV4aWNhbCcgY3JlYXRlcyByZWZlcmVuY2VzIG1heSBj YXVzZSBjZXJ0YWluIFdURnM6DQo+IA0KPiAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAxMDsgJGkr Kykgew0KPiAgICAgICAgICRhcnJbJGldID0gZnVuY3Rpb24gKCkgeyBsZXhpY2FsICRpOyByZXR1 cm4gJGk7IH07DQo+ICAgICAgIH0NCj4gDQo+ICAgICBUaGlzIHdpbGwgbm90IHdvcmsgYXMgZXhw ZWN0ZWQgc2luY2UgJGkgaXMgYSByZWZlcmVuY2UgYW5kIHRodXMgYWxsDQo+ICAgICBjcmVhdGVk IGNsb3N1cmVzIHdvdWxkIHJlZmVyZW5jZSB0aGUgc2FtZSB2YXJpYWJsZS4gSW4gb3JkZXIgdG8g Z2V0IHRoaXMNCj4gICAgIHJpZ2h0IG9uZSBoYXMgdG8gZG86DQo+IA0KPiAgICAgICBmb3IgKCRp ID0gMDsgJGkgPCAxMDsgJGkrKykgew0KPiAgICAgICAgICRsb29wSW5kZXggPSAkaTsNCj4gICAg ICAgICAkYXJyWyRpXSA9IGZ1bmN0aW9uICgpIHsgbGV4aWNhbCAkbG9vcEluZGV4OyByZXR1cm4g JGxvb3BJbmRleDsgfTsNCj4gICAgICAgICB1bnNldCAoJGxvb3BJbmRleCk7DQo+ICAgICAgIH0N Cj4gDQo+ICAgICBUaGlzIGNhbiBiZSBhIFdURiBmb3IgcGVvcGxlIHRoYXQgZG9uJ3QgZXhwZWN0 IGxleGljYWwgdG8gY3JlYXRlIGFuDQo+ICAgICBhY3R1YWwgcmVmZXJlbmNlLCBlc3BlY2lhbGx5 IHNpbmNlIG90aGVyIGxhbmd1YWdlcyBzdWNoIGFzIEphdmFTY3JpcHQNCj4gICAgIGRvbid0IGRv IGl0LiBPbiB0aGUgb3RoZXIgaGFuZCwgZ2xvYmFsIGFuZCBzdGF0aWMgYm90aCBETyBjcmVhdGUN Cj4gICAgIHJlZmVyZW5jZXMgc28gdGhhdCBiZWhhdmlvdXIgaXMgY29uc2lzdGVudCB3aXRoIGN1 cnJlbnQgUEhQLg0KPiANCj4gICAgIEJ1dCBjb21wbGV4IGNvbnN0cnVjdGlvbnMgc3VjaCBhcyB0 aGlzIHdpbGwgcHJvYmFibHkgbm90IGJlIHVzZWQgYnkNCj4gICAgIGJlZ2lubmVycyBzbyBtYWlu dGFpbmluZyBhIGdvb2QgZG9jdW1lbnRhdGlvbiBzaG91bGQgc29sdmUgdGhpcy4NCj4gDQo+ICAg KiBUaGUgZmFjdCB0aGF0ICdsZXhpY2FsJyBpcyBuZWVkZWQgYXQgYWxsIG1heSBjYXVzZSBXVEZz LiBPdGhlciBsYW5ndWFnZXMNCj4gICAgIHN1Y2ggYXMgSmF2YVNjcmlwdCBpbXBsaWNpdGVseSBo YXZlIHRoZSBlbnRpcmUgc2NvcGUgdmlzaWJsZSB0byBjaGlsZA0KPiAgICAgZnVuY3Rpb25zLiBC dXQgc2luY2UgUEhQIGRvZXMgdGhlIHNhbWUgdGhpbmcgd2l0aCBnbG9iYWwgdmFyaWFibGVzLCBJ DQo+ICAgICBmaW5kIGEga2V5d29yZCBsaWtlICdsZXhpY2FsJyBtdWNoIG1vcmUgY29uc2lzdGVu dCB0aGFuIGltcG9ydGluZyB0aGUNCj4gICAgIGVudGlyZSBzY29wZSAoYW5kIGFsd2F5cyBpbXBv cnRpbmcgdGhlIGVudGlyZSBzY29wZSBjb3N0cyB1bm5lY2Vzc2FyeQ0KPiAgICAgcGVyZm9ybWFu Y2UpLg0KPiANCj4gRklOQUwgVEhPVUdIVFMNCj4gLS0tLS0tLS0tLS0tLS0NCj4gDQo+IE15IG5v dyBwcm9wb3NlZCBwYXRjaCBhZGRyZXNzZXMgdGhlIHR3byBtYWluIHByb2JsZW1zIG9mIG15IHBy ZXZpb3VzIHBhdGNoOg0KPiBTdXBwb3J0IGZvciBjbG9zdXJlcyBpbiBvYmplY3RzICh3aXRoIGFj Y2VzcyB0byAkdGhpcykgYW5kIG9wY29kZSBjYWNoZXMuIE15DQo+IHBhdGNoIGFwcGxpZXMgYWdh aW5zdCBQSFBfNV8zIGFuZCBkb2VzIG5vdCBicmVhayBhbnkgdGVzdHMuIEl0IGFkZHMgYQ0KPiB2 YWx1YWJsZQ0KPiBuZXcgbGFuZ3VhZ2UgZmVhdHVyZSB3aGljaCBJJ2QgbGlrZSB0byBzZWUgaW4g UEhQLg0KPiANCj4gUmVnYXJkcywNCj4gQ2hyaXN0aWFuDQo+IA0KPiAtLQ0KPiBQSFAgSW50ZXJu YWxzIC0gUEhQIFJ1bnRpbWUgRGV2ZWxvcG1lbnQgTWFpbGluZyBMaXN0DQo+IFRvIHVuc3Vic2Ny aWJlLCB2aXNpdDogaHR0cDovL3d3dy5waHAubmV0L3Vuc3ViLnBocA0KDQo=