XGRvY3VtZW50Y2xhc3NbMTFwdCxhNHBhcGVyXXthcnRpY2xlfQpcc2V0bGVuZ3Roe1xwYXJpbmRlbnR9ezBleH0KXHNldGxlbmd0aHtccGFyc2tpcH17MWVtIHBsdXMxZXggbWludXMuNWV4fQolJSAkSWQkClx1c2VwYWNrYWdle2Z1bGxwYWdlfQpcdXNlcGFja2FnZXt2ZXJiYXRpbX0KXHVzZXBhY2thZ2VbZHZpcHNde2dyYXBoaWN4fQolJVxhZGR0b2xlbmd0aHtcdGV4dGhlaWdodH17MmNtfQpcYmVnaW57ZG9jdW1lbnR9CgpccGFnZXN0eWxle2VtcHR5fQoKXGJlZ2lue3RpdGxlcGFnZX0KICBcYmVnaW57Y2VudGVyfQogICAgXEh1Z2UKICAgIFx0ZXh0YmZ7QXBhY2hlIFRjbH0KCiAgICBcc2ZmYW1pbHkKICAgIFxzbWFsbAogICAgRmFzdCwgTGlnaHQsIEVhc3ksIFBvd2VyZnVsXFwKCiAgICBCeSBEYXZpZCBOLiBXZWx0b24sIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uXFwKCiAgICBcZm9vdG5vdGVzaXplCiAgICBkYXZpZHdAYXBhY2hlLm9yZwogICAgXG5vcm1hbHNpemUKICBcZW5ke2NlbnRlcn0KXGVuZHt0aXRsZXBhZ2V9Cgpcc2ZmYW1pbHkKClxiZWdpbnthYnN0cmFjdH0KICBQcm9ncmFtbWluZyBmb3IgdGhlIHdlYiBjYW4gYmUgYm90aCBlYXN5IGFuZCBwb3dlcmZ1bCwgcXVpY2sgYW5kCiAgZWxlZ2FudCwgZmFzdCwgYW5kIGxpZ2h0d2VpZ2h0LiAgRmluZCBvdXQgYWJvdXQgd2hhdCdzIGF2YWlsYWJsZSBmb3IKICBib3RoIG5ldyB1c2VycyBhbmQgZXhwZXJpZW5jZWQgcHJvZ3JhbW1lcnMsIGFzIHdlIGNvdmVyIGV2ZXJ5dGhpbmcKICBmcm9tIGhvdyB0byBnZXQgc3RhcnRlZCwgZGlmZmVyZW50IHN5c3RlbXMgYXZhaWxhYmxlLCBwcm9ncmFtbWluZwogIHN0cmF0ZWdpZXMsIGFuZCB0aGUgbG93LWxldmVsIGJlYXV0eSBvZiBpbnRlZ3JhdGluZyBBcGFjaGUgYW5kIFRjbC4KXGVuZHthYnN0cmFjdH0KClx0YWJsZW9mY29udGVudHMKClxzZWN0aW9ue0ludHJvZHVjdGlvbiB0byBBcGFjaGUgYW5kIFRjbH0KClxzdWJzZWN0aW9ue0FwYWNoZX0KCkFwYWNoZSBUY2wgaXMsIG9mIGNvdXJzZSwgdGhlIG5hbWUgZm9yIHRoZSBwcm9qZWN0cyB3aGljaCBoYXZlIHRoZQpBcGFjaGUgd2ViIHNlcnZlciBhbmQgVGNsIGxhbmd1YWdlIGluIGNvbW1vbiwgYnV0IG1vcmUgdGhhbiB0aGF0LCB3ZQpoYXZlIGFsbCBhcnJpdmVkIGF0IHRoaXMganVuY3Rpb24gYmV0d2VlbiBBcGFjaGUgYW5kIFRjbCBiZWNhdXNlIHdlCmhhdmUgZm91bmQgaXQgdG8gYmUgdGhlIG9wdGltYWwgc29sdXRpb24uCgpBcGFjaGUgaXMsIG9mIGNvdXJzZSwgdGhlIHdvcmxkJ3MgbW9zdCBwb3B1bGFyIHdlYiBzZXJ2ZXIuICBBY2NvcmRpbmcKdG8gbmV0Y3JhZnQsIEFwYWNoZSBhY2NvdW50cyBmb3IgYXJvdW5kIDYwXCUgb2YgdGhlIHdlYiBzZXJ2ZXIgbWFya2V0LApwdXR0aW5nIGl0IGFoZWFkIG9mIGFsbCBvdGhlciBjb250ZW5kZXJzIGNvbWJpbmVkLgoKQXBhY2hlIGlzIHZlcnkgZmxleGlibGUsIGZhc3QsIGNvcnJlY3QgYW5kIHNlY3VyZS4gVG8gYXR0YWNoIG1lYW5pbmdzCnRvIHRoZXNlIGRlc2NyaXB0aW9ucywgbGV0J3MgZ28gdGhyb3VnaCB0aGVtIGFuZCBleHBsYWluLgoKVGhlIGZsZXhpYmlsaXR5IGluIEFwYWNoZSBsaWVzIGluIGl0cyBhYmlsaXR5IHRvIGJlIGNvbmZpZ3VyZWQgaW4gbWFueQpkaWZmZXJlbnQgd2F5cywgZnJvbSBtaW5pbWFsaXN0aWMgdG8gYSBmdWxsLWZsZWRnZWQgYGB3ZWIKYXBwbGljYXRpb24nJyBzZXJ2ZXIuCgpXaGlsZSB0aGVyZSBhcmUgZmFzdGVyIHdlYiBzZXJ2ZXJzIGF2YWlsYWJsZSwgQXBhY2hlIGNvbXBldGVzIHZlcnkKYWRtaXJhYmx5IHdpdGggdGhlIGN1cnJlbnQgb2ZmZXJpbmdzIG9uIHRoZSBtYXJrZXQuCgpPZiBncmVhdCBpbXBvcnRhbmNlLCBBcGFjaGUgaXMgY29ycmVjdCAtIGl0IGFkaGVyZXMgdG8gZGVmaW5lZApJbnRlcm5ldCBzdGFuZGFyZHMuCgpBbmQsIG1vc3Qgb2YgYWxsLCBBcGFjaGUgaXMgdmVyeSBzZWN1cmUuICBUaGUgY29kZSBoYXMgYmVlbiBleGFtaW5lZApieSBleHBlcnRzIHRoZSB3b3JsZCBvdmVyLCBhbmQgd2hlbiBidWdzIGFyZSBkaXNjb3ZlcmVkLCBmaXhlcyBhcmUKcHJvbXB0bHkgYXZhaWxhYmxlLgoKVGhlIEFwYWNoZSB3ZWIgc2VydmVyIHdhcyBmaXJzdCBjcmVhdGVkIGJ5IGEgZ3JvdXAgb2Ygc3lzYWRtaW5zIHdobwp3ZXJlIHVzaW5nIHRoZSBOQ1NBIHNlcnZlciBhbmQgaGFkIGNyZWF0ZWQgcGF0Y2hlcyB0byBlbmhhbmNlIGFuZAppbXByb3ZlIGl0LiBUaHVzLCAiQSBQYXRjaHkiIHdlYiBzZXJ2ZXIuCgpUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gbm93IGVuY29tcGFzc2VzIGEgbGFyZ2UgdmFyaWV0eSBvZgpkaXZlcnNlIHByb2plY3RzIGluIGFkZGl0aW9uIHRvIFRjbDogdGhlIHdlYiBzZXJ2ZXIsIFhNTCwgSmF2YSwgUGVybCwKUEhQLCBBUFIsIFB5dGhvbiwgYW5kIGlzIGEgbm9uLXByb2ZpdCBjb3Jwb3JhdGlvbiByZWdpc3RlcmVkIGluIHRoZQpVLlMuLCB3aXRoIG1lbWJlcnMgdGhyb3VnaG91dCB0aGUgd29ybGQuCgpUaGUgQVNGIGNvbnNpc3RzIG9mIDYwLXNvbWUgbWVtYmVycywgYW5kIGh1bmRyZWRzIG9mICJjb21taXR0ZXJzIiAtCnRob3NlIHdobyBoYXZlIHRoZSByaWdodHMgdG8gbWFrZSBjaGFuZ2VzIHRvIGRpZmZlcmVudCBwcm9qZWN0cycgY29kZS4KClxzdWJzZWN0aW9ue1RjbH0KClRjbCBzdGFuZHMgZm9yIGBgVG9vbCBDb21tYW5kIExhbmd1YWdlJycuIEl0IHdhcyBjcmVhdGVkIGluIHRoZSBsYXRlCjgwJ2llcywgYnkgSm9obiBPdXN0ZXJob3V0LCB0aGVuIGEgcHJvZmVzc29yIGF0IHRoZSBVbml2ZXJzaXR5IG9mCkNhbGlmb3JuaWEgYXQgQmVya2VsZXksIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBtYW55IHNtYWxsIGV4dGVuc2lvbgpsYW5ndWFnZXMgaGUgd2FzIHdyaXRpbmcgZm9yIGhpcyBhcHBsaWNhdGlvbnMuIEZyb20gdGhlIHZlcnkKYmVnaW5uaW5nLCBUY2wgd2FzIGVuZ2luZWVyZWQgdG8gYmUgY29tYmluZWQgd2l0aCBvdGhlciBzeXN0ZW1zLgoKVGhlIG9yaWdpbmFsIGlkZWEgYmVoaW5kIFRjbCBpcyBzdGlsbCB2ZXJ5IHZhbGlkIHRvZGF5OiBwb3dlcmZ1bAphcHBsaWNhdGlvbnMgY2FuIGJlIG1hZGUgbXVjaCBtb3JlIHNvIGJ5IGxldHRpbmcgdGhlIHVzZXIgYWNjZXNzIHBhcnRzCm9mIHRoZW0gcHJvZ3JhbW1hdGljYWxseS4gT25lLW9mZiBsYW5ndWFnZXMgYXJlIGJlc3QgcmVwbGFjZWQgYnkgYQptb3JlIGdlbmVyYWwgc29sdXRpb24uIFRoZSBhbnN3ZXI6IGEgcmV1c2FibGUgbGlicmFyeSB0aGF0IHByb3ZpZGVzIGEKc2NyaXB0aW5nIGxhbmd1YWdlLiAgVGhpcyBhbGxvd3MgZm9yIGBgZW1iZWRkaW5nIGFuZCBleHRlbmRpbmcnJyBvZgpUY2wuICBJdCBjYW4gZWl0aGVyIGJlIGBgZW1iZWRkZWQnJyBpbnRvIGFub3RoZXIgYXBwbGljYXRpb24sIHdoZXJlCnRoZSBvdGhlciBwcm9ncmFtIGNvbnRyb2xzIHdoYXQgaXMgZ29pbmcgb24sIGFuZCBjYWxscyBUY2wsIG9yCmBgZXh0ZW5kZWQnJywgd2hpY2ggbWVhbnMgdGhhdCBUY2wgaXMgaW4gY29udHJvbCwgYW5kIGl0IGVpdGhlciBoYXMKZXh0cmEgY29kZSBidWlsdCBpbiwgb3IgaXQgbG9hZHMgaXQgZHluYW1pY2FsbHkuICBBcGFjaGUgVGNsIHByb2plY3RzCmFyZSBhbG1vc3QgZXhjbHVzaXZlbHkgb2YgdGhlIGZpcnN0IHR5cGUuICBBcGFjaGUgaXMgdGhlIGNlbnRlciBvZgphdHRlbnRpb24sIGFuZCBpdCBtYWtlcyBjYWxscyB0byBUY2wgYXQgb3Bwb3J0dW5lIHRpbWVzLgoKTGV0J3MgbG9vayBhdCBzb21lIG9mIFRjbCdzIG1vc3QgaW1wb3J0YW50IGZlYXR1cmVzOgoKRmlyc3Qgb2YgYWxsLCBpdCdzIGVhc3kgdG8gbGVhcm4sIGhhdmluZyBhIHZlcnkgc2ltcGxlIHN5bnRheC4gIFRoaXMKbWVhbnMgdGhhdCBhbnlvbmUgY2FuIHBpY2sgaXQgdXAgYW5kIHN0YXJ0IHVzaW5nIGl0IGFsbW9zdCByaWdodCBhd2F5LApldmVuIGlmIHRoZXkgYXJlIG5vdCBhbiBleHBlcnQgc29mdHdhcmUgZW5naW5lZXIuICBBcyB3ZSB3aWxsIHNlZQpsYXRlciwgdGhpcyBpcyBhdCB0aW1lcyBpbXBvcnRhbnQgZm9yIGEgd2ViIGxhbmd1YWdlLgoKRGVzcGl0ZSBiZWluZyBlYXN5LCBUY2wgaXMgYWxzbyBxdWl0ZSBmbGV4aWJsZS4gIEl0IGRvZXNuJ3QgbGltaXQgdGhlCmV4cGVydCBwcm9ncmFtbWVyLCBhbmQgZW5jb3VyYWdlcyB0aGVtIHRvIHRha2UgYWR2YW50YWdlIG9mIGl0cwpmZWF0dXJlcyBpbiBvcmRlciB0byBzb2x2ZSBwcm9ibGVtcyBtb3N0IGVsZWdhbnRseS4gIEl0IGlzIGFjdHVhbGx5CnBvc3NpYmxlIHRvIGNyZWF0ZSBuZXcgY29udHJvbCBzdHJ1Y3R1cmVzIHN1Y2ggYXMgJ2lmJyBvciAnd2hpbGUnIGluClRjbCBjb2RlIGl0c2VsZiwgd2l0aG91dCByZXNvcnRpbmcgdG8gQyEKCkFzIG1lbnRpb25lZCBhYm92ZSwgZW1iZWRkaW5nIGFuZCBleHRlbmRpbmcgYXJlIGNlbnRyYWwgdG8gVGNsJ3MKcGhpbG9zb3BoeS4gIEl0IGlzIHBvc3NpYmxlIHRvIGFjY2VzcyBhIGdyZWF0IGRlYWwgb2YgdGhlIGxhbmd1YWdlJ3MKaW50ZXJuYWxzIHZpYSBpdHMgd2VsbC1kb2N1bWVudGVkIEMgQVBJLgoKV2hhdCdzIG1vcmUsIFRjbCBkb2Vzbid0IHRha2UgdXAgdXAgYSBsb3Qgb2Ygc3lzdGVtIHJlc291cmNlcy4gIEl0CmRvZXNuJ3Qgd2FzdGUgbWVtb3J5LCBub3IgZGlzayBzcGFjZSwgYW5kIGlzIHJlYXNvbmFibHkgZmFzdCBhcyBhCmJ5dGUtY29tcGlsZWQgc2NyaXB0aW5nIGxhbmd1YWdlLgoKT2YgY291cnNlLCBUY2wgaXMgRnJlZSBTb2Z0d2FyZS4gIFlvdSBjYW4gZG8gcHJldHR5IG11Y2ggYW55dGhpbmcgeW91Cmxpa2Ugd2l0aCBpdCwgYXMgaXQncyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdmVyeSBsaWJlcmFsIEJTRC1zdHlsZQpsaWNlbnNlLiAgSXQncyB1c2VkIGluIG1hbnkgZnJlZSBzb2Z0d2FyZSBwcm9qZWN0cywgYXMgd2VsbCBhcwpwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgaW4gbGFyZ2UgY29ycG9yYXRpb25zLgoKQW5vdGhlciBwb2ludCB0aGF0IG5lZWRzIG1lbnRpb25pbmcgaXMgdGhhdCB0aGUgVGNsIGxhbmd1YWdlIGlzCm5hdGl2ZWx5IG11bHRpcGxhdGZvcm0uICBJdCBpcyBkZXNpZ25lZCB0byB3b3JrIGVxdWFsbHkgd2VsbCBvbiBVbml4LApXaW5kb3dzLCBhcyB3ZWxsIGFzIGJvdGggTWFjIE9TIGNsYXNzaWMgYW5kIE1hY09TIFguCgpUaGUgVGsgdG9vbGtpdCBpcyBhbG1vc3QgYWx3YXlzIG1lbnRpb25lZCBpbiB0aGUgc2FtZSBwaHJhc2UgYXMgVGNsLApidXQgaXQncyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IHRoZXkgYXJlIHR3byBzZXBhcmF0ZSB0aGluZ3MsCmRlc3BpdGUgYm90aCBiZWluZyBkZXZlbG9wZWQgYnkgSm9obiBPdXN0ZXJob3V0LCBhbmQgaGF2aW5nIGEgY2xvc2VseQplbnR3aW5lZCBoaXN0b3J5LiAgVGsgaXMgYSBncmFwaGljYWwgdG9vbGtpdCBmb3IgcmFwaWRseSBkZXZlbG9waW5nCnZpc3VhbCBhcHBsaWNhdGlvbnMgd2l0aCBhIG5hdGl2ZSBsb29rIGFuZCBmZWVsLgoKTm90IG9ubHkgZG9lcyBUY2wgZG8gdGhlIHNpbXBsZSB0aGluZ3Mgd2VsbCwgaXQgYWxzbyBtYWtlcyBjb21wbGV4CnRoaW5ncyBwb3NzaWJsZSAodG8gYm9ycm93IGEgcGhyYXNlKS4gIFRoZSBzdGFuZGFyZCBsaWJyYXJ5LCB0Y2xsaWIsCmNvbnRhaW5zIGNvZGUgdG8gcGVyZm9ybSBhbGwga2luZHMgb2YgdGFza3MsIGFzIHdlbGwgYXMgbWFuYWdlIGNvbXBsZXgKZGF0YSBzdHJ1Y3R1cmVzLCBzdWNoIGFzIGdyYXBocywgcXVldWVzLCBtYXRyaXhlcywgZXRjLi4uICBBcyBhCnRlc3RhbWVudCB0byBUY2wncyBmbGV4aWJpbGl0eSwgbm90IGV2ZW4gb2JqZWN0IG9yaWVudGF0aW9uIGlzIGJ1aWx0CmludG8gdGhlIGxhbmd1YWdlIGl0c2VsZiwgYnV0IGNhbiBiZSBsb2FkZWQgYXMgYSBwYWNrYWdlLCB0aGUgbW9zdApwb3B1bGFyIG9uZSBiZWluZyBbSW5jciBUY2xdLiAgVGNsIGhhcyBiZWVuIGFyb3VuZCBsb25nIGVub3VnaCB0aGF0CnRoZXJlIGlzIHByb2JhYmx5IGEgcGFja2FnZSBvdXQgdGhlcmUgdGhhdCBkb2VzIHdoYXQgeW91IG5lZWQuCgpcc3Vic2VjdGlvbntUY2wgYW5kIHRoZSBXZWJ9CgpUaGUgd2ViIChhbmQgWE1MLCBmb3IgdGhhdCBtYXR0ZXIpIGlzIHByaW1hcmlseSB0ZXh0IG9yaWVudGVkLCBzbyBhCmxhbmd1YWdlIHRoYXQncyBnb29kIGF0IGRlYWxpbmcgd2l0aCB0ZXh0IGlzIHdlbGwgc3VpdGVkIHRvIHRoZSB3ZWIsCmFuZCBtdWNoLCBtdWNoIGZhc3RlciB0byBkZXZlbG9wIHdpdGggdGhhbiBhIGxvdy1sZXZlbCBsYW5ndWFnZSBsaWtlCkMuICBUaGlzIGlzIHdoeSBsYW5ndWFnZXMgbGlrZSBQZXJsIGFuZCBUY2wgaGF2ZSBiZWVuIHNvIHN1Y2Nlc3NmdWwKZm9yIHdlYiBwcm9ncmFtbWluZyB0byBkYXRlLiAgSXQncyBlYXNpZXIsIHNlY3VyaXR5IGlzIGltcHJvdmVkIGJ5IG5vdAp3b3JyeWluZyBhYm91dCBidWZmZXIgb3ZlcmZsb3dzLCBhbmQgZXZlcnl0aGluZyBpcyBnZW5lcmFsbHkgbW9yZQpmbGV4aWJsZS4KClRoZSBzZWNvbmQgYmlnIGFkdmFudGFnZSB3aGVuIHVzaW5nIGEgYGBzY3JpcHRpbmcgbGFuZ3VhZ2UnJyBmb3IgdGhlCndlYiBpcyB0aGF0IGl0IG1ha2VzIHRoZSBjcmFmdCBvZiBjcmVhdGluZyBkeW5hbWljIHdlYiBwYWdlcyBhdmFpbGFibGUKdG8gbW9yZSBwZW9wbGUsIHdobyBtaWdodCBub3QgbmVjZXNzYXJpbHkgYmUgc2tpbGxlZCBlbm91Z2ggdG8gdXNlIGEKbW9yZSBjb21wbGV4IGxhbmd1YWdlIHN1Y2ggYXMgSmF2YSBvciBDKysuICBOb3QgZXZlcnlvbmUgd2hvIG5lZWRzIHRvCmdldCBzb21ldGhpbmcgdXAgb24gdGhlIHdlYiBoYXMgdGhlIGx1eHVyeSBvZiBrbm93aW5nIG1hbnkgbGFuZ3VhZ2VzLAphbmQvb3IgaGF2aW5nIHRoZSB0aW1lIHRvIGxlYXJuIGEgbW9yZSBkaWZmaWN1bHQgb25lLiAgV2hpbGUgVGNsIGlzIGEKZmluZSB0b29sIGluIHRoZSBoYW5kcyBvZiBhbiBleHBlcnQgc29mdHdhcmUgZW5naW5lZXIsIGl0IGlzIGFsc28KcGFydGljdWxhcmx5IHdlbGwgc3VpdGVkIHRvIHRoaXMgdHlwZSBvZiB1c2UsIGJlY2F1c2Ugb2YgaXRzIHNpbXBsZQpzdHJ1Y3R1cmUsIGFuZCB0aGUgZWFzZSB3aXRoIHdoaWNoIGl0IGlzIGxlYXJuZWQuICBBcyBhbiBhZGRlZCBib251cywKaGF2aW5nIGxlYXJuZWQgdGhlIGxhbmd1YWdlLCBpdCBjYW4gYmUgdXNlZCBiZXlvbmQgdGhlIHdlYiBmb3Igc3lzdGVtCnRhc2tzLCBncmFwaGljYWwgYXBwcywgYW5kIG1vcmUuCgpBcyBmYXIgYmFjayBhcyAxOTk1LCB3aGVuIG1hbnkgb2YgdXMgd2VyZSBzdGlsbCBleHBlcmltZW50aW5nIHdpdGgKc2ltcGxpc3RpYyBDR0kncywgVGNsIHdhcyBiZWluZyBpbnRlZ3JhdGVkIGludG8gd2hhdCB3YXMgdG8gZ28gb24gdG8KYmVjb21lIFZpZ25ldHRlJ3MgU3RvcnlTZXJ2ZXIsIGFuZCBBT0xzZXJ2ZXIsIHR3byBzeXN0ZW1zIHRoYXQgYXJlCnN0aWxsIGluIHVzZSB0b2RheS4gIEFPTHNlcnZlciBpcyBldmVuIG9wZW4gc291cmNlLCBhbmQgaXMgYSB2ZXJ5IHdlbGwKcmVnYXJkZWQgaGlnaC1wZXJmb3JtYW5jZSwgbXVsdGktdGhyZWFkZWQgd2ViIHNlcnZlciB3aXRoIGJ1aWx0LWluCnNjcmlwdGFiaWxpdHksIHRoYW5rcyB0byBUY2wuCgpcc3Vic2VjdGlvbntUY2wgRXhhbXBsZSAxLn0KCkEgZmV3IHNtYWxsIGV4YW1wbGVzIG9mIFRjbCBjb2RlIGZvbGxvdy4gIFRoZXkgZGVtb25zdHJhdGUgc29tZSBvZiB0aGUKZnVuZGFtZW50YWwgY29uc3RydWN0cyBvZiB0aGUgbGFuZ3VhZ2UuCgpcYmVnaW57dmVyYmF0aW19CnNldCBzZWNvbmRzIFtjbG9jayBzZWNvbmRzXQpwdXRzICJUaGUgdGltZSBpcyBbY2xvY2sgZm9ybWF0IFwkc2Vjb25kc10iClxlbmR7dmVyYmF0aW19CgpJbiB0aGUgYWJvdmUgZXhhbXBsZSwgMyBUY2wgY29tbWFuZHMgYXJlIHVzZWQsIGBgc2V0JycsIGBgcHV0cycnLCBhbmQKYGBjbG9jaycnLiAgVGhlIGZpcnN0IGxpbmUgc2V0cyB0aGUgdmFyaWFibGUgYGBzZWNvbmRzJycgdG8gdGhlIHZhbHVlCnJldHVybmVkIGJ5IHRoZSBjb21tYW5kIGBgY2xvY2sgc2Vjb25kcycnLiAgSW4gdGhlIHNlY29uZCBsaW5lLApgYGNsb2NrIGZvcm1hdCcnIGlzIGNhbGxlZCB3aXRoIHRoZSB2YXJpYWJsZSBcJHNlY29uZHMgYW5kIHRoZSByZXN1bHQKaXMgbGVmdCBpbnNpZGUgdGhlIHN0cmluZyB3aGljaCBpcyB0aGVuIHBhc3NlZCB0byBgYHB1dHMnJywgd2hpY2ggd2lsbApzZW5kIGl0IHRvIHN0ZG91dC4KClxiZWdpbnt2ZXJiYXRpbX0KcHJvYyBncmVldGluZyB7bGFuZ30gewogICAgc3dpdGNoIFwkbGFuZyB7CiAgICAgICAgZW4gewogICAgICAgICAgICByZXR1cm4gIkhlbGxvLCBob3cgaXMgaXQgZ29pbmc/IgogICAgICAgIH0KICAgICAgICBpdCB7CiAgICAgICAgICAgIHJldHVybiAiQnVvbiBnaW9ybm8sIGNvbWUgdmE/IgogICAgICAgIH0KICAgICAgICBmciB7CiAgICAgICAgICAgIHJldHVybiAiQm9uam91ciwgLi4uLi4uLj8iCiAgICAgICAgfQogICAgICAgIGRlIHsKICAgICAgICAgICAgcmV0dXJuICJHdXRlbiBUYWcsIHdpZSBnZWh0cz8iCiAgICAgICAgfQogICAgICAgIHp0IHsKICAgICAgICAgICAgcmV0dXJuICJHcvxlemksIHdpIGdhYXQncz8iCiAgICAgICAgfQogICAgfQp9ClxlbmR7dmVyYmF0aW19CgpUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBgYHByb2MnJyAtIGEgbmV3IFRjbCBwcm9jZWR1cmUgb3IgY29tbWFuZC4gIEl0CmFjY2VwdHMgb25lIGFyZ3VtZW50LCBgYGxhbmcnJywgd2hpY2ggaXQgdGhlbiBwcm9jZWVkcyB0byBleGFtaW5lLCBhbmQKdGhlbiByZXR1cm4gYSBkaWZmZXJlbnQgc3RyaW5nIGRlcGVuZGluZyBvbiB0aGUgcmVzdWx0LgoKXHNlY3Rpb257QXBhY2hlIFRjbH0KCk91ciBwcm9qZWN0cyBhcmVuJ3QganVzdCByZWxhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgd2UgYWxsIHVzZSBUY2wgLSB0aGUKQXBhY2hlIFRjbCBwcm9qZWN0cyBzaGFyZSBhIGNvbW1vbiBwaGlsb3NvcGh5IHRoYXQgInNpbXBsZSB0aGluZ3MKc2hvdWxkIGJlIGVhc3ksIGFuZCBoYXJkIHRoaW5ncyBzaG91bGQgYmUgcG9zc2libGUiICh0byBib3Jyb3cgYSBxdW90ZQotIGl0IHdvcmtzIHdlbGwgZm9yIHRoZW0hKS4gV2UgYWxsIGFycml2ZWQgYXQgVGNsIG5vdCBiZWNhdXNlIGl0J3MgdGhlCm9ubHkgdG9vbCBpbiBvdXIgYm94LCBidXQgYmVjYXVzZSBmb3IgdXMgaXQgaXMgdGhlIHJpZ2h0IHRvb2wuCgpUaGUgIkFwYWNoZSBUY2wgUHJvamVjdCIgaXMgY3VycmVudGx5IGNvbXByaXNlZCBvZiA1IGluZGl2aWR1YWwKcHJvamVjdHMsIGFuZCBpcyBtb3ZpbmcgdG93YXJkcyBoYXZpbmcgMywgb3IgbGVzcywgaW4gdGhlIGZ1dHVyZS4KClxpbmNsdWRlZ3JhcGhpY3Nbc2NhbGU9MC42XXsuL2Z1dHVyZS5wc30KCkdldHRpbmcgYWhlYWQgb2Ygb3Vyc2VsdmVzLCBvdXIgc2hvcnQgdGVybSBwbGFucyBhcmUgdG8gcmVsZWFzZSBSaXZldCwKYW5kIHBoYXNlIG91dCBtb2RcX2R0Y2wgYW5kIE5lb1dlYlNjcmlwdC4gIE91ciBsb25nIHRlcm0gZ29hbHMsIHNob3VsZAp0aGV5IGNvbWUgdG8gZnJ1aXRpb24sIGFyZSB0byBmdXJ0aGVyIG1vZHVsYXJpemUgYWxsIG91ciBvZmZlcmluZ3MsIHNvCnRoYXQgYXQgc29tZSBwb2ludCwgaXQgd291bGQgYmUgcG9zc2libGUgdG8gcnVuIFJpdmV0IGFuZCBXZWJzaCBhcwpwYWNrYWdlcyBsb2FkZWQgZnJvbSB3aXRoaW4gbW9kXF90Y2wsIGFzIGl0IGlzIGNhcGFibGUgb2YgZ2l2aW5nIHVzCmxvdyBsZXZlbCBhY2Nlc3MgdG8gdGhlIEFwYWNoZSBpbnRlcm5hbHMgZnJvbSBUY2wuICBTbywgd2Ugd291bGRuJ3QKcmVhbGx5IG9ubHkgaGF2ZSBvbmUgcHJvamVjdCwgYnV0IHRoZXJlIHdvdWxkIGJlLCBhdCB0aGUgc2FtZSB0aW1lLAptb3JlIG1vZHVsYXJpdHkgYW5kIHRpZ2h0ZXIgaW50ZWdyYXRpb24gYW1vbmdzdCB0aGUgcmVtYWluaW5nIHN5c3RlbXMuCgpXaXRob3V0IGZ1cnRoZXIgYWRvLCBvdXIgNSBwcm9qZWN0cyBhcmU6CgpcYmVnaW57aXRlbWl6ZX0KXGl0ZW0gbW9kXF9kdGNsXFwKICBtb2RcX2R0Y2wgd2FzIGNyZWF0ZWQgaW4gMTk5OCBieSBEYXZpZCBXZWx0b24sIGFuZCwgd2hpbGUgdGhlcmUgd2VyZQogIG90aGVyIHByb2R1Y3RzIG91dCB0aGVyZSB0aGF0IGRpZCBzaW1pbGFyIHRoaW5ncywgbW9kXF9kdGNsIHdhcyBvbmUKICBvZiB0aGUgZmlyc3QgdGhhdCB3YXMgRnJlZSBTb2Z0d2FyZS4KCiAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHN1YnNlcXVlbnRseSBjcmVhdGVkIHRoZSBUY2wgZ3JvdXAsCiAgd2l0aCBtb2RcX2R0Y2wgYXMgaXRzIGJhc2lzIGluIGxhdGUgMjAwMC4KCiAgbW9kXF9kdGNsIHdpbGwgZXZlbnR1YWxseSBiZSByZXBsYWNlZCBieSBBcGFjaGUgUml2ZXQsIHdoaWNoIGlzCiAgaW4gZmFjdCwgZ2V0dGluZyBqdXN0IGFib3V0IDEwMFwlIG9mIG91ciBkZXZlbG9wbWVudCB0aW1lIGxhdGVseS4KCiAgVGhlIG9yaWdpbmFsIGRlc2lnbiBnb2FscyBvZiBtb2RcX2R0Y2wgd2VyZSBiYXNlZCBvbiBvYnNlcnZhdGlvbnMKICBhYm91dCB0aGUgc3VjY2VzcyBvZiBQSFAsIGFuZCBzb3VnaHQgdG8gYm9ycm93IHRoZSBiZXN0IG9mIHRoYXQKICBzeXN0ZW0sIHdoaWxlIGF2b2lkaW5nIHNvbWUgb2YgdGhlIGRvd25mYWxscy4gIFByaW5jaXBhbGx5LCBtb2RcX2R0Y2wKICB3YXMgbWVhbnQgdG8gYmUgZmFzdCwgbGlnaHQsIGFuZCBzaW1wbGUgdG8gdXNlLgoKXGl0ZW0gTmVvV2ViU2NyaXB0XFwKICBOZW9XZWJTY3JpcHQgd2FzIGNyZWF0ZWQgYnkgS2FybCBMZWhlbmJhdWVyLCBvbmUgb2YgdGhlIGVhcmx5IFRjbAogIHVzZXJzIGFuZCBjb250cmlidXRvcnMgYW5kIGlzIGN1cnJlbnRseSBtYWludGFpbmVkIGJ5IERhbW9uCiAgQ291cnRuZXkuIE5XUywgYXMgaXQncyBrbm93biwgYmVjYW1lIHBhcnQgb2YgdGhlIEFwYWNoZSBUY2wgcHJvamVjdAogIGluIGVhcmx5IDIwMDEsIGFmdGVyIGhhdmluZyBiZWVuIHJlbGVhc2VkIGFzIEZyZWUgU29mdHdhcmUuICBJbiBpdHMKICBlYXJseSB5ZWFycywgTldTIHdhcyBub3QgcmVhbGx5IGBgT3BlbiBTb3VyY2UnJy4KCiAgTldTIHdhcyB3cml0dGVuIHdpdGggYW4gSVNQIHR5cGUgZW52aXJvbm1lbnQgaW4gbWluZCwgYW5kIGFzIGEKICBjb25zZXF1ZW5jZSwgYXMgZmVhdHVyZXMgc3VjaCBhcyBhIHNhbmRib3gsIHV0aWxpemluZyBUY2wncyBzYWZlCiAgaW50ZXJwcmV0ZXJzLCB3aGljaCBpcyBhYmxlIHRvIGtlZXAgdXNlcnMgY29udGFpbmVkLiAgSW4gYWRkaXRpb24sCiAgTldTIGFpbXMgdG8gbWFrZSBhIGxvdCBvZiBwb3B1bGFyIGV4dGVuc2lvbnMgc3VjaCBhcyAnZ2QnIGFuZAogIGRhdGFiYXNlIGV4dGVuc2lvbnMgYXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIGNvcmUgcHJvZHVjdC4KClxpdGVtIG1vZFxfdGNsXFwKICBtb2RcX3RjbCB3YXMgY3JlYXRlZCBieSBNaWNoYWVsIExpbmssIGZvciBBcGFjaGUgMi4wLCB3aXRoIHRoZSBnb2FsCiAgb2YgZXhwb3NpbmcgdGhlIEFwYWNoZSBBUEkgaW4gVGNsLCBpbiBvcmRlciB0byBtYWtlIGl0IHBvc3NpYmxlIHRvCiAgd3JpdGUgQXBhY2hlIG1vZHVsZXMgaW4gVGNsLiAgTW9zdCBvZiB0aGUgb3RoZXIgcHJvamVjdHMgdGFrZQogIGFkdmFudGFnZSBvZiBBcGFjaGUgZmVhdHVyZXMsIGFuZCBhcmUgdGlnaHRseSBsaW5rZWQgdG8gdGhlIHNlcnZlciwKICBidXQgY291bGQgY29uY2VpdmFibHkgYWxzbyBvcGVyYXRlIGluZGVwZW5kZW50bHkgb2YgQXBhY2hlLgogIG1vZFxfdGNsIHRha2VzIHRoZSBvcHBvc2l0ZSBhcHByb2FjaCBhbmQgZ2l2ZXMgeW91IGFjY2VzcyB0byBhIGdyZWF0CiAgZGVhbCBvZiBBcGFjaGUncyBDIEFQSS4gIFRoaXMgZmxleGliaWxpdHkgbWVhbnMgdGhhdCwgb25lIGRheSwgb3RoZXIKICBBcGFjaGUgVGNsIG1vZHVsZXMgbWlnaHQganVzdCBiZSBwbHVnaW5zIGZvciBtb2RcX3RjbC4KClxpdGVtIFdlYnNoXFwKICBXZWJzaCB3YXMgYm9ybiBpbiAxOTk1IGFzIGEgQysrIGxpYnJhcnkgaW5jb3Jwb3JhdGluZyBhIFRjbAogIGludGVycHJldGVyLCBhbmQgZ3JhZHVhbGx5IG1pZ3JhdGVkIHRvIGJlaW5nIGEgVGNsIGV4dGVuc2lvbi4gSXQKICBiZWNhbWUgRnJlZSBTb2Z0d2FyZSBpbiAyMDAwLCBhbmQgd2FzIGNvbnRyaWJ1dGVkIHRvIHRoZSBBU0YgaW4KICAyMDAxLiBBbmRyZWogVmNrb3Zza2kgd2FzIHRoZSBvcmlnaW5hbCBhdXRob3IsIHdpdGggbWFqb3Igd29yayBkb25lCiAgYnkgUm9ubmllIEJydW5uZXIgKFdlYnNoIDIpIGFuZCBTaW1vbiBIZWZ0aSAoV2Vic2ggMykuCgogIFdlYnNoIGlzIG1vcmUgb2YgYSBjb21wbGV0ZSBgYGFwcGxpY2F0aW9uIGRldmVsb3BtZW50JycgZW52aXJvbm1lbnQKICB0aGFuIHRoZSBvdGhlciBzeXN0ZW1zLCB3aGljaCBpcyBpbiBzb21lIHdheXMgYSB0cmFkZW9mZi4gIEl0CiAgcHJvdmlkZXMgbWFueSBwb3dlcmZ1bCB0b29scyBmb3IgdGhlIHByb2dyYW1tZXIsIGJ1dCB0YWtlcyBtb3JlIHRpbWUKICB0byBsZWFybiwgYW5kIHJlcXVpcmVzIGp1c3QgYSBiaXQgbW9yZSByYW1wLXVwIHRpbWUgdG8gc3RhcnQKICBjcmVhdGluZyBwYWdlcy4KCiAgT25lIHVuaXF1ZSBmZWF0dXJlIG9mIFdlYnNoIGlzIHRoYXQgaXQgaXMgcmVsYXRpdmVseSBpbmRlcGVuZGVudCBvZgogIEFwYWNoZSwgYW5kLCBpbiBmYWN0LCBhIHZlcnNpb24gaXMgcHJvdmlkZWQgdGhhdCBydW5zIGFzIGEKICBzdGFuZC1hbG9uZSBDR0kuCgpcaXRlbSBBcGFjaGUgUml2ZXRcXAogIFRoZSBtb3N0IHJlY2VudCBvZiB0aGUgQXBhY2hlIFRjbCBwcm9qZWN0cywgUml2ZXQgaXMgdGhlIGZ1dHVyZSBvZgogIGJvdGggbW9kXF9kdGNsIGFuZCBOZW9XZWJTY3JpcHQuICBCb3RoIERhdmlkIFdlbHRvbiBhbmQgRGFtb24KICBDb3VydG5leSBhcmUgY29sbGFib3JhdGluZyB0byBjb21iaW5lIHRoZSBiZXN0IG9mIHRoZSB0d28gcHJldmlvdXMKICBzeXN0ZW1zIGludG8gc29tZXRoaW5nIHRoYXQgaGFzIHRoZSBiZXN0IG9mIGJvdGggd29ybGRzLCBhbmQgbGVhdmVzCiAgYmVoaW5kIHNvbWUgb2YgdGhlaXIgYmFnZ2FnZS4KCiAgT3VyIGFpbSBpcyB0byBwcm9kdWNlIGEgc3lzdGVtIHRoYXQgaXMgZmFzdCwgbGlnaHQsIHNpbXBsZSwKICBwb3dlcmZ1bCwgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBiZXN0IG9mIEFwYWNoZSBhbmQgVGNsLCBhbmQgdGhhdAogIGNvbWVzIHdpdGggYSByaWNoIHZhcmlldHkgb2YgZXhpc3RpbmcgVGNsIGV4dGVuc2lvbnMuCgogIFJpdmV0IGlzIGFscGhhIHNvZnR3YXJlLCBhbHRob3VnaCBpdCB3b3JrcyBxdWl0ZSB3ZWxsLCBhbmQgd2UgYXJlCiAgcHJlcGFyaW5nIGEgcmVsZWFzZSAoaXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBieSB0aGUgdGltZSBBcGFjaGVDb24KICBhcnJpdmVzKS4KXGVuZHtpdGVtaXplfQoKXHN1YnNlY3Rpb257Uml2ZXQgRXhhbXBsZSAxLn0KClRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBBcGFjaGUgUml2ZXQgYXQgd29yay4KClx2ZXJiYXRpbWlucHV0e3JpdmV0ZXhhbXBsZTEucnZ0fQoKVGhpcyBleGFtcGxlIHNob3dzIHVzIHNldmVyYWwgZmVhdHVyZXMgb2YgVGNsLiAgSW4gcmVhbGl0eSwgdGhlIFRjbApjb2RlIHVzZWQgaGVyZSBpcyBlbnRpcmVseSBnZW5lcmljLiBUaGUgb25seSB0aGluZyB0aGF0IHRlbGxzIHVzIHRoYXQKaXQgaXMgdXNlZCBpbiBSaXZldCwgYXJlIHRoZSAkPCQ/IGFuZCA/JD4kIGRlbGltaXRlcnMgdGhhdCBpbmRpY2F0ZQp0aGF0IHRoZSBwYXJ0aWN1bGFyIHNlY3Rpb24gb2YgdGhlIGZpbGUgc2hvdWxkIGJlIHBhcnNlZCBhcyBUY2wgY29kZSwKYW5kIG5vdCBIVE1MLiAgVGhlIHRhYmxlIChzZWUgYmVsb3cpIHdoaWNoIHJlc3VsdHMgZnJvbSB0aGlzIGNvZGUgaXMKY3JlYXRlZCBieSB0aGUgdHdvIFx0ZXh0YmZ7Zm9yfSBsb29wcywgd2hpY2ggc2V0IGFuZCB0aGVuIGluY3JlbWVudAp0aGVpciByZXNwZWN0aXZlIHZhcmlhYmxlcy4gIFRoZSB2YWx1ZSB1c2VkIHRvIGRldGVybWluZSB0aGUgc2hhZGUgb2YKZ3JheSBmb3IgYSBwYXJ0aWN1bGFyIGNlbGwgaXMgY2FsY3VsYXRlZCBieSB0aGUgXHRleHRiZntleHByfSBjb21tYW5kLAphbmQgaXMgaW4gdHVybiB1c2VkIGluIHRoZSBcdGV4dGJme2Zvcm1hdH0gY29tbWFuZCwgd2hpY2ggc2V0cyB1cCBib3RoCnRoZSBiZ2NvbG9yIHRvIHVzZSBmb3IgdGhlIGNlbGwuICBOb3RlIHRoYXQgdGhlIG51bWJlcnMgdG8gYmUKZGlzcGxheWVkIGluIHRoZSBjZWxsIGFyZSBpbnRlcnBvbGF0ZWQgZGlyZWN0bHkgaW4gdGhlIHN0cmluZywgYW5kIGFyZQpub3QgaGFuZGxlZCBieSB0aGUgZm9ybWF0IGNvbW1hbmQuCgpcaW5jbHVkZWdyYXBoaWNzW3NjYWxlPTEuMF17Li90YWJsZS5wc30KClxzdWJzZWN0aW9ue1Byb2dyYW1taW5nIFN0cmF0ZWdpZXN9CgpPbmUgb2YgdGhlIGZ1bmRhbWVudGFsIGFkdmFudGFnZXMgb2YgVGNsIHdlYiBwcm9ncmFtbWluZyBpcyB0aGF0IGl0CmdpdmVzIHVzIHRoZSBmcmVlZG9tIHRvIGNob29zZSBmcm9tIHNldmVyYWwgYXZhaWxhYmxlIHN0cmF0ZWdpZXMgZm9yCmNyZWF0aW5nIGEgd2ViIHNpdGUuCgpgYFF1aWNrIGFuZCBkaXJ0eScnIGlzIHdoYXQgd2Ugd2lsbCBjYWxsIHRoZSBmaXJzdCBzdHlsZS4gIEl0J3Mgd2hhdApoYXBwZW5zIHdoZW4gSFRNTCBhbmQgY29kZSBhcmUgZnJlZWx5IG1peGVkIHRocm91Z2hvdXQgYSB3ZWIgcGFnZS4KSXQncyBjb21tb24gZm9yIG5vdmljZSBwcm9ncmFtbWVycyB0byB0YWtlIHRoaXMgYXBwcm9hY2ggYmVjYXVzZSBpdCdzCnZlcnkgaW1tZWRpYXRlLiAgSG93ZXZlciwgdGhlcmUgYXJlIHRpbWVzIHdoZW4geW91IGp1c3QgbmVlZCB0byBgYGdldAppdCBkb25lJycsIGFuZCB0aGUgc29vbmVyIHRoZSBiZXR0ZXIuICBTbyB3ZSBkbyBzdXBwb3J0IHRoaXMgc3R5bGUgb2YKcHJvZ3JhbW1pbmcuCgpPZiBjb3Vyc2UsIGZvciBsYXJnZSBzaXRlcywgd2hlcmUgaXQncyBpbXBvcnRhbnQgdG8ga2VlcCBzb21lIGtpbmQgb2YKb3JkZXIsIGFuZCB3aGVyZSB0aGUgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgdG8gc2VwYXJhdGUgb3V0IEhUTUwKd3JpdGluZywgZ3JhcGhpYyBkZXNpZ24sIGFuZCBwcm9ncmFtbWluZywgd2UgY2FuIGNlcnRhaW5seSB1c2UgVGNsIGluCnN1Y2ggYSB3YXkgYXMgdG8gZHJhdyBhIGNsZWFyIGxpbmUgYmV0d2VlbiB0aGUgbG9naWMgYW5kIHRoZQpwcmVzZW50YXRpb24uCgpPbmUgb2YgdGhlIGJlc3QsIGFuZCBlYXNpZXN0IHdheXMgdG8gZG8gdGhpcyBpcyB0byBjcmVhdGUgVGNsIGNvbW1hbmRzCnRoYXQgdGFrZSBmZXcgb3Igbm8gYXJndW1lbnRzLCBzbyB0aGF0IHRoZXkgbG9vayBhbG1vc3QgbGlrZSBtb3JlIEhUTUwKdGFncyBvbiBhIHdlYiBwYWdlLCBhcyB3ZSBzZWUgaW4gdGhlIG5leHQgZXhhbXBsZToKClxpbmNsdWRlZ3JhcGhpY3Nbc2NhbGU9MS4wXXsuL2V4YW1wbGUyLnBzfQoKSGVyZSB3ZSBzZWUgdGhhdCB0aGUgVGNsIGNvbW1hbmRzIGFjdCBhcyBpZiB0aGV5IHdlcmUganVzdCBleHRyYSB0YWdzLgpPZiBjb3Vyc2UsIHRoaXMgaXMgb3Zlcmx5IHNpbXBsaWZpZWQsIGhvd2V2ZXIsIGl0IGdpdmVzIHRoZSBnZW5lcmFsCmlkZWEgb2YgaG93IG9uZSBtaWdodCBiZWdpbiB0byBnbyBhYm91dCBzZXBhcmF0aW5nIGNvbnRlbnQgZnJvbSBob3cgaXQKaXMgZGlzcGxheWVkLiAgQW4gaW50ZXJlc3RpbmcgaWRlYSB0aGF0IGhhc24ndCBiZWVuIGZ1bGx5IGV4cGxvcmVkIGlzCnRvIGNyZWF0ZSBhIHNlcmllcyBvZiBoaWdoLWxldmVsIGZ1bmN0aW9uLWJhc2VkIHdpZGdldHMgdGhhdCB3b3JrIGJvdGgKYXMgSFRNTCBhbmQgYXMgYSBUayBpbnRlcmZhY2UuCgpcc2VjdGlvbntJbnRlZ3JhdGlvbiBBcGFjaGUgYW5kIFRjbH0KClRoaXMgc2VjdGlvbiBicmllZmx5IGRpc2N1c3NlcyBzb21lIG9mIHdoYXQgd2VudCBpbnRvIGludGVncmF0aW5nCkFwYWNoZSBhbmQgVGNsIHRocm91Z2ggdGhlaXIgQyBpbnRlcmZhY2VzLiAgQm90aCBvZiB0aGVzZSBzeXN0ZW1zIG1ha2UKYSBsYXJnZSBwb3J0aW9uIG9mIHRoZWlyIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtbWVyIHZpYQp0aGVpciBBUEkncy4gIEl0IGhhcyBiZWVuIG91ciBleHBlcmllbmNlIHRoYXQgYm90aCBhcmUgd2VsbCB0aG91Z2h0Cm91dCwgYW5kIGEgcGxlYXN1cmUgdG8gd29yayB3aXRoLiAgSG9va2luZyB0aGVtIHRvZ2V0aGVyIGhhcyBiZWVuIHZlcnkKZW5qb3lhYmxlIHdvcmshICBCZWNhdXNlIGl0J3MgYSB2ZXJ5IGJyb2FkIHRvcGljLCBhbmQgbW9yZSB0aGFuIG9uZQp0YWxrIGNvdWxkIGJlIGRlZGljYXRlZCB0byBlYWNoIGluZGl2aWR1YWwgcHJvamVjdCwgYW5kIGFsc28gYmVjYXVzZQp0aGUgYXV0aG9yIGlzIG1vc3QgZmFtaWxpYXIgd2l0aCBpdCwgUml2ZXQgd2lsbCBiZSB0aGUgYmFzaXMgZm9yIHRoZQpmb2xsb3dpbmcgZGlzY3Vzc2lvbiwgYWx0aG91Z2ggbXVjaCBvZiBpdCBhcHBsaWVzIHRvIHRoZSBvdGhlcgpwcm9qZWN0cyBhcyB3ZWxsLgoKVGNsIGhhcyBhbiBleGhhdXN0aXZlIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgbWF5IGJlIGFjY2Vzc2VkIHZpYSBpdCdzCkMgaW50ZXJmYWNlLiAgT25lIG1heSBtYW5pcHVsYXRlIGludGVycHJldGVycywgdmFyaWFibGVzLCB0aHJlYWRzLApjcmVhdGUgYW5kIG1hbmlwdWxhdGUgYGBjaGFubmVscycnIChtb3JlIG9uIHRoYXQgaW4ganVzdCBhIGJpdCksCnV0aWxpemUgdGhlIGV2ZW50IGxvb3AsIHdyaXRlIG5ldyBUY2wgY29tbWFuZHMsIGFzIHdlbGwgYXMgYSBob3N0IG9mCmNvbnZlbmllbmNlIGZlYXR1cmVzLCBzdWNoIGFzIHN5c3RlbXMgdG8gdHJhbnNsYXRlIGJldHdlZW4gdW5pY29kZSwKdXRmLCBhbmQgYSB2YXJpZXR5IG9mIGNoYXJhY3RlciBzZXRzLCBpbiBhZGRpdGlvbiB0byBoYXNoIHRhYmxlcywKZHluYW1pYyBzdHJpbmdzLCBhbmQgbW9yZS4gIFlldCBhZ2FpbiwgdG9vIG11Y2ggdG8gZGlzY3VzcyBpbiB0aGlzCnNwYWNlIC0gd2UgaG9wZSB0aG9zZSBpbnRlcmVzdGVkIHdpbGwgaW52ZXN0aWdhdGUgb24gdGhlaXIgb3duLgoKXHN1YnNlY3Rpb257QXBhY2hlIEluaXRpYWxpemF0aW9uIGFuZCBEaXJlY3RpdmVzfQoKQXBhY2hlJ3MgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIGFyZSBkaWZmaWN1bHQgdG8gZ2V0IHJpZ2h0LCBidXQKcHJvdmlkZSB0aGUgdXNlciB3aXRoIHRoZSBhYmlsaXR5IHRvIGNvbnRyb2wgQXBhY2hlIGF0IGVhY2ggc3RlcCBvZgppdHMgYGBsaWZlIGN5Y2xlJycuICBUbyBiZWdpbiB3aXRoLCBSaXZldCBsZXRzIHlvdSBzcGVjaWZ5IHNjcmlwdHMKdGhhdCBtYXkgYmUgcnVuIHdoZW4gQXBhY2hlIHN0YXJ0cyB1cCwgYW5kIHN0b3BzLCBjYWxsZWQgR2xvYmFsSW5pdAphbmQgR2xvYmFsRXhpdC4gIEJlY2F1c2UgQXBhY2hlIDEuMyBzdGlsbCBmb3JrcyBzdWItcHJvY2Vzc2VzLCBpdCdzCnVzZWZ1bCB0byBiZSBhYmxlIHRvIGludGVydmVuZSB3aGVuIHRoZXNlIGNoaWxkIHByb2Nlc3NzZXMgYXJlCmxhdW5jaGVkLiAgVGhhdCBpcyBoYW5kbGVkIHRocm91Z2ggQ2hpbGQgSW5pdCBhbmQgRXhpdCBjb25maWd1cmF0aW9uCmRpcmVjdGl2ZXMuICBZZXQgYW5vdGhlciB1c2VmdWwgd2F5IHRvIG1vZGlmeSBSaXZldCdzIGJlaGF2aW9yIGlzIGJ5Cmluc2VydGluZyBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgYSBwYWdlIGlzIGV4ZWN1dGVkLiAgVGhpcyBjb3VsZCBiZQp1c2VkIHRvIGluc2VydCBjdXN0b20gaGVhZGVycyBvciBmb290ZXJzLCBmb3IgaW5zdGFuY2UuIEZ1cnRoZXJtb3JlLApvcHRpb25zIGFyZSBhbHNvIGF2YWlsYWJsZSB0byBjb250cm9sIGZpbGUgdXBsb2FkIGNoYXJhY3RlcmlzdGljcywgYXMKd2VsbCBhcyBkZXRlcm1pbmUgd2hldGhlciBzZXBhcmF0ZSB2aXJ0dWFsIGhvc3RzIGdldCB0aGVpciBvd24KaW50ZXJwcmV0ZXJzLiAgVGhpcyBsYXN0IGZlYXR1cmUgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBpbgplbnZpcm9ubWVudHMgd2hlcmUgc2VwYXJhdGUgY2xpZW50cyBtaWdodCB3YW50IHRvIGhhdmUgdGhlaXIgb3duIFRjbApjb2RlLCBsb2FkZWQgc2VwYXJhdGVseS4KClxzdWJzZWN0aW9ue0hvdyBSaXZldCBTZXJ2ZXMgUGFnZXN9CgpXaGVuIGEgUml2ZXQgcGFnZSAoLnJ2dCkgaXMgcmVxdWVzdGVkIGZyb20gdGhlIEFwYWNoZSBzZXJ2ZXIgdmlhIEhUVFAsCmFmdGVyIHBhc3NpbmcgdGhyb3VnaCBBcGFjaGUsIHRoZSBtb2R1bGUgY2hlY2tzIHRvIHNlZSBpZiBhIGNhY2hlZAp2ZXJzaW9uIG9mIHRoZSBwYWdlJ3MgYnl0ZWNvZGUgaXMgYXZhaWxhYmxlLiAgSWYgaXQgaXNuJ3QsIHRoZSBwYWdlIGlzCnJlYWQgaW50byBtZW1vcnksIGFuZCBwYXJzZWQgaW50byBhIHNjcmlwdCwgd2hpY2ggaXMgdGhlbiBleGVjdXRlZCwgYXMKd2VsbCBhcyBzdG9yZWQgaW4gdGhlIGNhY2hlLiAgSWYgaXQgaXMgYXZhaWxhYmxlIGluIGNhY2hlLCB0aGUgc2NyaXB0CmlzIGV4ZWN1dGVkIGRpcmVjdGx5LCB3aXRob3V0IGhhdmluZyB0byB0b3VjaCB0aGUgZGlzayBhdCBhbGwgdG8KcmVsb2FkIGl0LiAgTmF0dXJhbGx5IHRoZSBjYWNoZSBzaXplIGlzIGNvbmZpZ3VyYWJsZSB2aWEgYW4gQXBhY2hlCmRpcmVjdGl2ZS4gIFRoZSBwYXJzZXIgd29ya3MgYnkgdHJhbnNmb3JtaW5nIGNodW5rcyBvZiBIVE1MIC0KZXZlcnl0aGluZyBvdXRzaWRlIG9mIHRoZSAkPCQ/ID8kPiQgdGFncyAtIGludG8gbGFyZ2UgXHRleHRiZntwdXRzfQpzdGF0ZW1lbnRzLCB3aGljaCBjYW4gdGhlbiBiZSBleGVjdXRlZCBhbG9uZyB3aXRoIHRoZSByZXN0IG9mIHRoZSBUY2wKY29kZSBhcyBvbmUgbGFyZ2Ugc2NyaXB0LgoKXHN1YnNlY3Rpb257VGNsIENoYW5uZWxzfQpPbmUgb2YgdGhlIGVzcGVjaWFsbHkgaW50ZXJlc3RpbmcgdGhpbmdzIGFib3V0IHRoZSBSaXZldAppbXBsZW1lbnRhdGlvbiBpcyB0aGUgdXNlIG9mIFRjbCBjaGFubmVscyB0byBzZW5kIG91dHB1dCB0byBBcGFjaGUuCldoYXQgdGhpcyBtZWFucyBpcyB0aGF0LCBpbnN0ZWFkIG9mIGhhdmluZyB0byB1c2UgYSBzcGVjaWFsLCBjdXN0b20KVGNsIGNvbW1hbmQgdG8gc2VuZCB0ZXh0IHRvIHRoZSB3ZWIsIHdlIGNhbiB1c2UgcmVndWxhciBcdGV4dGJme3B1dHN9CmluIFJpdmV0IGNvZGUsIHdoaWNoIG1lYW5zIGl0IGlzIGV2ZW4gZWFzaWVyIHRvIHRha2Ugbm9ybWFsLAp1bm1vZGlmaWVkIFRjbCBzY3JpcHRzLCBhbmQgaGF2ZSB0aGVtIGBganVzdCB3b3JrJycgb24gdGhlIHdlYi4KClRjbCBjaGFubmVscyBhcmUgaW5wdXQvb3V0cHV0IGRyaXZlcnMgdGhhdCBjYW4gYmUgY3JlYXRlZCBhbmQKbWFuaXB1bGF0ZWQgYXQgdGhlIEMgbGV2ZWwuICBUaGV5IGxldCB5b3UgZG8gY3VzdG9tIFx0ZXh0YmZ7Q2xvc2V9LApcdGV4dGJme0lucHV0fSwgXHRleHRiZntPdXRwdXR9LCBcdGV4dGJme1NlZWt9LCBcdGV4dGJme1NldH0gYW5kClx0ZXh0YmZ7R2V0fSBPcHRpb24sIFx0ZXh0YmZ7R2V0SGFuZGxlfSwgXHRleHRiZntCbG9ja30sClx0ZXh0YmZ7Rmx1c2h9LCBhbmQgXHRleHRiZntFdmVudH0gaGFuZGxlciBmdW5jdGlvbnMuCgpIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIG91dHB1dCBmdW5jdGlvbiB1c2VkIHRvIHBhc3MgZGF0YSBmcm9tIFRjbAp0byBBcGFjaGUuCgpcYmVnaW57dmVyYmF0aW19CnN0YXRpYyBpbnQKb3V0cHV0cHJvYyhDbGllbnREYXRhIGluc3RhbmNlZGF0YSwgY2hhciAqYnVmLAogICAgICAgICAgIGludCB0b1dyaXRlLCBpbnQgKmVycm9yQ29kZVB0cikKewogICAgcml2ZXRfc2VydmVyX2NvbmYgKnJzYyA9IChyaXZldF9zZXJ2ZXJfY29uZiAqKWluc3RhbmNlZGF0YTsKICAgIHJpdmV0X2ludGVycF9nbG9iYWxzICpnbG9iYWxzID0KICAgICAgICBUY2xfR2V0QXNzb2NEYXRhKHJzYy0+c2VydmVyX2ludGVycCwgInJpdmV0IiwgTlVMTCk7CgogICAgVGNsV2ViX1ByaW50SGVhZGVycyhnbG9iYWxzLT5yZXEpOwogICAgaWYgKGdsb2JhbHMtPnJlcS0+Y29udGVudF9zZW50ID09IDApCiAgICB7CiAgICAgICAgYXBfcndyaXRlKGJ1ZiwgdG9Xcml0ZSwgZ2xvYmFscy0+cik7CiAgICAgICAgYXBfcmZsdXNoKGdsb2JhbHMtPnIpOwogICAgfQogICAgcmV0dXJuIHRvV3JpdGU7Cn0KXGVuZHt2ZXJiYXRpbX0KCkl0J3MgcmVhbGx5IHZlcnkgc2ltcGxlISAgTW9zdCBvZiB0aGUgZnVuY3Rpb24gaXMgYWJvdXQgZ2V0dGluZyB0aGUKY29ycmVjdCBjb250ZXh0IHRvIG9wZXJhdGUgb24sIGFuZCB0aGVuIGBgYnVmJycgYW5kIGBgdG9Xcml0ZScnIGFyZQpwYXNzZWQgZGlyZWN0bHkgZG93biB0byB0aGUgQXBhY2hlIGxheWVyLgoKXHN1YnNlY3Rpb257QXBhY2hlJ3MgQyBJbnRlcmZhY2V9CgpUaGlzIGlzIGFub3RoZXIgdG9waWMgdGhhdCBtZXJpdHMgaG91cnMgb2YgZGlzY3Vzc2lvbiBvbiBpdHMgb3duLCBzbwp3ZSBhcmUgZ29pbmcgdG8gc3RpY2sgd2l0aCBhIGZldyBoaWdobGlnaHRzIHRoYXQgaGF2ZSBiZWVuIG9mCnBhcnRpY3VsYXIgaGVscCB0byB1cyBhcyB3aGVuIHdvcmtpbmcgd2l0aCBBcGFjaGUgY29kZS4KCkl0IHdvdWxkIGJlIGhhcmQgbm90IHRvIHRhbGsgYWJvdXQgYGBwb29scycnLCB3aGljaCBhcmUgQXBhY2hlJ3MKbWVtb3J5IG1hbmFnZW1lbnQgc3lzdGVtIGZvciBtb2R1bGVzLCBhbmQgYXJlIHZlcnkgY29udmVuaWVudCBmb3IgdGhlCm1vZHVsZSBhdXRob3IuICBQb29scyB0YWtlIGNhcmUgb2YgZnJlZWluZyBtZW1vcnkgYWZ0ZXIgeW91IGhhdmUgdXNlZAppdCBmb3IgdGFza3MgZHVyaW5nIHRoZSByZXF1ZXN0ICh3ZWxsLCBhdCBvdGhlciBwb2ludHMgdG9vLCBidXQgd2UgYXJlCmFpbWluZyBmb3IgYSBzaW1wbGUgdGFsayEpLiAgVGhlcmUgYXJlIGFsc28gbG90cyBvZiBjb252ZW5pZW50IHN0cmluZwpmdW5jdGlvbnMgdGhhdCB0YWtlIGFkdmFudGFnZSBvZiBwb29scyB0byBtYWtlIGxpZmUgZWFzaWVyCgpJdCdzIG5vdCBwYXJ0IG9mIEFwYWNoZSBwcm9wZXIgYnV0IHRoZSBhcHJlcSBjb2RlIGlzIHZlcnkgdXNlZnVsIGZvcgpoYW5kbGluZyBkYXRhIHJlY2VpdmVkIGZyb20gdXNlcnMgLSBjb29raWVzLCBHRVQgYW5kIFBPU1QgdmFyaWFibGVzLgpSaXZldCB1c2VzIGFwcmVxIHRvIGZhY2lsaXRhdGUgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIHRoaXMgcmF3CmluZm9ybWF0aW9uIGludG8gc29tZXRoaW5nIHRoYXQgVGNsIGNhbiB0dXJuIGludG8gYSB2YXJpYWJsZS4KCmFweHMgLSB3aGlsZSBpdCdzIGNlcnRhaW5seSBub3QgYSB2ZXJ5IGV4Y2l0aW5nIGFzcGVjdCBvZiBBcGFjaGUsCmhhdmluZyBhIGJ1aWxkIHN5c3RlbSB0aGF0IHRlbGxzIHlvdSBldmVyeXRoaW5nIGl0IGtub3dzIGFib3V0IGhvdyB0bwpidWlsZCB0aGluZ3Mgb24geW91ciBwbGF0Zm9ybSBpcyB2ZXJ5IGNvbnZlbmllbnQuICBSaXZldCB1c2VzIGl0cyBvd24KYnVpbGQgc3lzdGVtIHRvIGdldCBvdXQgb2YgdGhlIGF1dG9jb25mL21ha2UgcGl0LgoKXHNlY3Rpb257Q29uY2x1c2lvbn0KCldpdGggYWxsIG9mIHRoZXNlIEFQSSdzIHRvIHdvcmsgd2l0aCwgdW5pdGluZyB0aGVtIGhhcyBiZWVuIGJvdGggdmVyeQpwbGVhc2FudCwgYW5kIG5vdCBhbGwgdGhhdCBkaWZmaWN1bHQuIEluIGFsbCB0aGUgUml2ZXQgLmMgYW5kIC5oCmZpbGVzLCB0aGVyZSBhcmUgYXJvdW5kIDU1MDAgbGluZXMsIHRvdGFsLiBOb3QgYmFkLCBjb25zaWRlcmluZyBUY2wgaXMKMTUwSyBsaW5lcywgYW5kIEFwYWNoZSAxLjMgaXMgYXJvdW5kIDEyMEshCgpUaGUgYWJpbGl0eSB0byBsZXZlcmFnZSBzbyBtdWNoIHBvd2VyIC0gbGlua2luZyB0b2dldGhlciB0d28KZGlmZmVyZW50LCBmbGV4aWJsZSwgbXVsdGlwdXJwb3NlIHN5c3RlbXMgLSBpcyBhIHRlc3RhbWVudCB0byB0aGUKc3RyZW5ndGggYW5kIGFkYXB0YWJpbGl0eSBvZiBib3RoIFRjbCBhbmQgQXBhY2hlLgoKTW9yZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgYXQgdGhlIGZvbGxvd2luZyBzaXRlczoKClxiZWdpbntpdGVtaXplfQpcaXRlbSBodHRwOi8vd3d3LnRjbC50ayAtIFRoZSBUY2wgd2ViIHNpdGUuClxpdGVtIGh0dHA6Ly93aWtpLnRjbC50ayAtIFRjbCBXaWtpClxpdGVtIG5ld3M6Y29tcC5sYW5nLnRjbCAtIFRoZSBUY2wgbmV3c2dyb3VwLgpcaXRlbSBJIGNhbiBiZSByZWFjaGVkIGZvciBxdWVzdGlvbnMgYXQgZGF2aWR3QGFwYWNoZS5vcmcKXGVuZHtpdGVtaXplfQoKXGVuZHtkb2N1bWVudH0KCg==