ZGlmZiAtLWdpdCBhL19zb3VyY2VzL2Fuc2libGUudHh0IGIvX3NvdXJjZXMvYW5zaWJsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3YTJjMwotLS0gL2Rldi9udWxsCisrKyBiL19zb3VyY2VzL2Fuc2libGUudHh0CkBAIC0wLDAgKzEsMjEzIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PQorVXNpbmcgcmVjbGFzcyB3aXRoIEFuc2libGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy4uIHdhcm5pbmc6OgorCisgIEkgd2FzIGtpY2tlZCBvdXQgb2YgdGhlIEFuc2libGUgY29tbXVuaXR5LCBwcmVzdW1hYmx5IGZvciBgYXNraW5nIHRoZSB3cm9uZworICBxdWVzdGlvbnNgXywgYW5kIHRoZXJlZm9yZSBJIGhhdmUgbm8gaW50ZXJlc3QgaW4gZGV2ZWxvcGluZyB0aGlzIGFkYXB0ZXIKKyAgYW55bW9yZS4gSWYgeW91IHVzZSBpdCBhbmQgaGF2ZSBjaGFuZ2VzLCBJIHdpbGwgdGFrZSB5b3VyIHBhdGNoLgorCisuLiBfYXNraW5nIHRoZSB3cm9uZyBxdWVzdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYWRkdWNrL3JlY2xhc3MvaXNzdWVzLzYKKworUXVpY2sgc3RhcnQgd2l0aCBBbnNpYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBmb2xsb3dpbmcgc3RlcHMgc2hvdWxkIGdldCB5b3UgdXAgYW5kIHJ1bm5pbmcgcXVpY2tseSB3aXRoIHxyZWNsYXNzfCBhbmQKK2BBbnNpYmxlYF8uIEdlbmVyYWxseSwgd2Ugd2lsbCBiZSB3b3JraW5nIGluIGBgL2V0Yy9hbnNpYmxlYGAuIEhvd2V2ZXIsIGlmIHlvdQorYXJlIHVzaW5nIGEgc291cmNlLWNvZGUgY2hlY2tvdXQgb2YgQW5zaWJsZSwgeW91IG1pZ2h0IGFsc28gd2FudCB0byB3b3JrCitpbnNpZGUgdGhlIGBgLi9oYWNraW5nYGAgZGlyZWN0b3J5IGluc3RlYWQuCisKK09yIHlvdSBjYW4gYWxzbyBqdXN0IGxvb2sgaW50byBgYC4vZXhhbXBsZXMvYW5zaWJsZWBgIG9mIHlvdXIgfHJlY2xhc3N8CitjaGVja291dCwgd2hlcmUgdGhlIGZvbGxvd2luZyBzdGVwcyBoYXZlIGFscmVhZHkgYmVlbiBwcmVwYXJlZC4KKworL+KApi9yZWNsYXNzIHJlZmVycyB0byB0aGUgbG9jYXRpb24gb2YgeW91ciB8cmVjbGFzc3wgY2hlY2tvdXQuCisKKy4uIHRvZG86OgorCisgIFdpdGggfHJlY2xhc3N8IG5vdyBpbiBEZWJpYW4sIGFzIHdlbGwgYXMgaW5zdGFsbGFibGUgZnJvbSBzb3VyY2UsIHRoZQorICBmb2xsb3dpbmcgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIHBhdGggY29uc2lzdGVuY3nigKYKKworIy4gQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBzdGVwcyBkZXNjcmliZWQgaW4gdGhlIDpkb2M6YGluc3RhbGxhdGlvbiBzZWN0aW9uCisgICA8aW5zdGFsbD5gLgorCisjLiBTeW1saW5rIGBgL3Vzci9zaGFyZS9yZWNsYXNzL3JlY2xhc3MtYW5zaWJsZWBgIChvciB3aGVyZXZlciB5b3VyIGRpc3RybyBwdXQKKyAgIHRoYXQgZmlsZSksIG9yIGBgL+KApi9yZWNsYXNzL3JlY2xhc3MvYWRhcHRlcnMvYW5zaWJsZS5weWBgIChpZiBydW5uaW5nIGZyb20KKyAgIHNvdXJjZSkgdG8gYGAvZXRjL2Fuc2libGUvaG9zdHNgYCAob3IgYGAuL2hhY2tpbmcvaG9zdHNgYCkuCisKKyMuIENvcHkgdGhlIHR3byBkaXJlY3RvcmllcyBgYG5vZGVzYGAgYW5kIGBgY2xhc3Nlc2BgIGZyb20gdGhlIGV4YW1wbGUKKyAgIHN1YmRpcmVjdG9yeSBpbiB0aGUgfHJlY2xhc3N8IGNoZWNrb3V0IHRvIGBgL2V0Yy9hbnNpYmxlYGAKKworICAgSWYgeW91IHByZWZlciB0byBwdXQgdGhvc2UgZGlyZWN0b3JpZXMgZWxzZXdoZXJlLCB5b3UgY2FuIGNyZWF0ZQorICAgYGAvZXRjL2Fuc2libGUvcmVjbGFzcy1jb25maWcueW1sYGAgd2l0aCBjb250ZW50cyBzdWNoIGFzOjoKKworICAgICBzdG9yYWdlX3R5cGU6IHlhbWxfZnMKKyAgICAgaW52ZW50b3J5X2Jhc2VfdXJpOiAvc3J2L3JlY2xhc3MKKworICAgTm90ZSB0aGF0IGBgeWFtbF9mc2BgIGlzIGN1cnJlbnRseSB0aGUgb25seSBzdXBwb3J0ZWQgYGBzdG9yYWdlX3R5cGVgYCwgYW5kCisgICBpdCdzIHRoZSBkZWZhdWx0IGlmIHlvdSBkb24ndCBzZXQgaXQuCisKKyMuIENoZWNrIG91dCB5b3VyIGludmVudG9yeSBieSBpbnZva2luZworCisgICA6OgorCisgICAgICQgLi9ob3N0cyAtLWxpc3QKKworICAgd2hpY2ggc2hvdWxkIHJldHVybiA1IGdyb3VwcyBpbiBKU09OIGZvcm1hdCwgYW5kIGVhY2ggZ3JvdXAgaGFzIGV4YWN0bHkKKyAgIG9uZSBtZW1iZXIgYGBsb2NhbGhvc3RgYC4KKworNC4gU2VlIHRoZSBub2RlIGluZm9ybWF0aW9uIGZvciBgYGxvY2FsaG9zdGBgOjoKKworICAgICAkIC4vaG9zdHMgLS1ob3N0IGxvY2FsaG9zdAorCisgICBUaGlzIHNob3VsZCBwcmludCBhIHNldCBvZiBrZXlzIGFuZCB2YWx1ZXMsIGluY2x1ZGluZyBhIGdyZWV0aW5nLAorICAgYSBjb2xvdXIsIGFuZCBhIHN1Yi1jbGFzcyBjYWxsZWQgYGBfX3JlY2xhc19fYGAuCisKKzUuIEV4ZWN1dGUgc29tZSBhbnNpYmxlIGNvbW1hbmRzLCBlLmcuOjoKKworICAgICAkIGFuc2libGUgLWkgaG9zdHMgXCogLS1saXN0LWhvc3RzCisgICAgICQgYW5zaWJsZSAtaSBob3N0cyBcKiAtbSBwaW5nCisgICAgICQgYW5zaWJsZSAtaSBob3N0cyBcKiAtbSBkZWJ1ZyAtYSAnbXNnPSIke2dyZWV0aW5nfSInCisgICAgICQgYW5zaWJsZSAtaSBob3N0cyBcKiAtbSBzZXR1cAorICAgICAkIGFuc2libGUtcGxheWJvb2sgLWkgaG9zdHMgdGVzdC55bWwKKworNi4gWW91IGNhbiBhbHNvIGludm9rZSB8cmVjbGFzc3wgZGlyZWN0bHksIHdoaWNoIGdpdmVzIGEgc2xpZ2h0bHkgZGlmZmVyZW50CisgICB2aWV3IG9udG8gdGhlIHNhbWUgZGF0YSwgaS5lLiBiZWZvcmUgaXQgaGFzIGJlZW4gYWRhcHRlZCBmb3IgQW5zaWJsZTo6CisKKyAgICAgJCAv4oCmL3JlY2xhc3MvcmVjbGFzcy5weSAtLXByZXR0eS1wcmludCAtLWludmVudG9yeQorICAgICAkIC/igKYvcmVjbGFzcy9yZWNsYXNzLnB5IC0tcHJldHR5LXByaW50IC0tbm9kZWluZm8gbG9jYWxob3N0CisKKyAgIE9yLCBpZiB8cmVjbGFzc3wgaXMgcHJvcGVybHkgaW5zdGFsbGVkLCBqdXN0IHVzZSB0aGUgfHJlY2xhc3N8IGNvbW1hbmQuCisKK0ludGVncmF0aW9uIHdpdGggQW5zaWJsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgaW50ZWdyYXRpb24gYmV0d2VlbiB8cmVjbGFzc3wgYW5kIEFuc2libGUgaXMgcGVyZm9ybWVkIHRocm91Z2ggYW4gYWRhcHRlciwKK2FuZCBuZWVkcyBub3QgYmUgb2Ygb3VyIGNvbmNlcm4gdG9vIG11Y2guCisKK0hvd2V2ZXIsIEFuc2libGUgaGFzIG5vIGNvbmNlcHQgb2YgIm5vZGVzIiwgImFwcGxpY2F0aW9ucyIsICJwYXJhbWV0ZXJzIiwgYW5kCisiY2xhc3NlcyIuIFRoZXJlZm9yZSBpdCBpcyBuZWNlc3NhcnkgdG8gZXhwbGFpbiBob3cgdGhvc2UgY29ycmVzcG9uZCB0bworQW5zaWJsZS4gQ3J1ZGVseSwgdGhlIGZvbGxvd2luZyBtYXBwaW5nIGV4aXN0czoKKworPT09PT09PT09PT09PT09PT0gPT09PT09PT09PT09PT09Cit8cmVjbGFzc3wgY29uY2VwdCBBbnNpYmxlIGNvbmNlcHQKKz09PT09PT09PT09PT09PT09ID09PT09PT09PT09PT09PQorbm9kZXMgICAgICAgICAgICAgaG9zdHMKK2NsYXNzZXMgICAgICAgICAgIGdyb3VwcworYXBwbGljYXRpb25zICAgICAgcGxheWJvb2tzCitwYXJhbWV0ZXJzICAgICAgICBob3N0X3ZhcnMKKz09PT09PT09PT09PT09PT09ID09PT09PT09PT09PT09PQorCit8cmVjbGFzc3wgZG9lcyBub3QgcHJvdmlkZSBhbnkgYGBncm91cF92YXJzYGAgYmVjYXVzZSBvZiBpdHMgbm9kZS1jZW50cmljCitwZXJzcGVjdGl2ZS4gV2hpbGUgY2xhc3MgZGVmaW5pdGlvbnMgaW5jbHVkZSBwYXJhbWV0ZXJzLCB0aG9zZSBhcmUgaW5oZXJpdGVkCitieSB0aGUgbm9kZSBkZWZpbml0aW9ucyBhbmQgaGVuY2UgYmVjb21lIG5vZGVfdmFycy4KKworfHJlY2xhc3N8IGFsc28gZG9lcyBub3QgcHJvdmlkZSBwbGF5Ym9va3MsIG5vciBkb2VzIGl0IGRlYWwgd2l0aCBhbnkgb2YgdGhlCityZWxhdGVkIEFuc2libGUgY29uY2VwdHMsIGkuZS4gYGB2YXJzX2ZpbGVzYGAsIHZhcnMsIHRhc2tzLCBoYW5kbGVycywgcm9sZXMsIGV0Yy4uCisKKyAgTGV0IGl0IGJlIHNhaWQgYXQgdGhpcyBwb2ludCB0aGF0IHlvdSdsbCBwcm9iYWJseSB3YW50IHRvIHN0b3AgdXNpbmcKKyAgYGBob3N0X3ZhcnNgYCwgYGBncm91cF92YXJzYGAgYW5kIGBgdmFyc19maWxlc2BgIGFsdG9nZXRoZXIsIGFuZCBpZiBvbmx5CisgIGJlY2F1c2UgeW91IHNob3VsZCBubyBsb25nZXIgbmVlZCB0aGVtLCBidXQgYWxzbyBiZWNhdXNlIHRoZSB2YXJpYWJsZQorICBwcmVjZWRlbmNlIHJ1bGVzIG9mIEFuc2libGUgYXJlIGZ1bGwgb2Ygc3VycHJpc2VzLCBhdCBsZWFzdCB0byBtZS4KKworfHJlY2xhc3N8JyBBbnNpYmxlIGFkYXB0ZXIgbWFzc2FnZSB0aGUgfHJlY2xhc3N8IG91dHB1dCBpbnRvIEFuc2libGUtdXNhYmxlIGRhdGEsCituYW1lbHk6CisKKy0gRXZlcnkgY2xhc3MgaW4gdGhlIGFuY2VzdHJ5IG9mIGEgbm9kZSBiZWNvbWVzIGEgZ3JvdXAgdG8gQW5zaWJsZS4gVGhpcyBpcworICBtYWlubHkgdXNlZnVsIHRvIGJlIGFibGUgdG8gdGFyZ2V0IG5vZGVzIGR1cmluZyBpbnRlcmFjdGl2ZSB1c2Ugb2YKKyAgQW5zaWJsZSwgZS5nLjo6CisKKyAgICAkIGFuc2libGUgZGViaWFubm9kZUB3aGVlenkgLW0gY29tbWFuZCAtYSAnYXB0LWdldCB1cGdyYWRlJworICAgICAg4oaSIHVwZ3JhZGUgYWxsIERlYmlhbiBub2RlcyBydW5uaW5nIHdoZWV6eQorCisgICAgJCBhbnNpYmxlIHNzaC5zZXJ2ZXIgLW0gY29tbWFuZCAtYSAnaW52b2tlLXJjLmQgc3NoIHJlc3RhcnQnCisgICAgICDihpIgcmVzdGFydCBhbGwgU1NIIHNlcnZlciBwcm9jZXNzZXMKKworICAgICQgYW5zaWJsZSBtYWlsc2VydmVyIC1tIGNvbW1hbmQgLWEgJ3RhaWwgLW4xMDAwIC92YXIvbG9nL21haWwuZXJyJworICAgICAg4oaSIG9idGFpbiB0aGUgbGFzdCAxLDAwMCBsaW5lcyBvZiBhbGwgbWFpbHNlcnZlciBlcnJvciBsb2cgZmlsZXMKKworICBUaGUgYXR0ZW50aXZlIHJlYWRlciBtaWdodCBzdHVtYmxlIG92ZXIgdGhlIHVzZSBvZiBzaW5ndWxhciB3b3Jkcywgd2hlcmVhcworICBpdCBtaWdodCBtYWtlIG1vcmUgc2Vuc2UgdG8gYWRkcmVzcyBhbGwgYGBtYWlsc2VydmVyKnMqYGAgd2l0aCB0aGlzIHRvb2wuCisgIFRoaXMgaXMgY29udmVudGlvbiBhbmQgdXAgdG8geW91LiBJIHByZWZlciB0byB0aGluayBvZiBteSBub2RlIGFzCisgIGEgKHNpbmd1bGFyKSBtYWlsc2VydmVyIHdoZW4gSSBhZGQgYGBtYWlsc2VydmVyYGAgdG8gaXRzIHBhcmVudCBjbGFzc2VzLgorCistIEV2ZXJ5IGVudHJ5IGluIHRoZSBsaXN0IG9mIGEgaG9zdCdzIGFwcGxpY2F0aW9ucyBtaWdodCB3ZWxsIGNvcnJlc3BvbmQgdG8KKyAgYW4gQW5zaWJsZSBwbGF5Ym9vay4gVGhlcmVmb3JlLCB8cmVjbGFzc3wgY3JlYXRlcyBhIChBbnNpYmxlLSlncm91cCBmb3IKKyAgZXZlcnkgYXBwbGljYXRpb24sIGFuZCBhZGRzIGBgX2hvc3RzYGAgdG8gdGhlIG5hbWUuIFRoaXMgcG9zdGZpeCBjYW4gYmUKKyAgY29uZmlndXJlZCB3aXRoIGEgQ0xJIG9wdGlvbiAoYGAtLWFwcGxpY2F0aW9ucy1wb3N0Zml4YGApIG9yIGluIHRoZQorICBjb25maWd1cmF0aW9uIGZpbGUgKGBgYXBwbGljYXRpb25zX3Bvc3RmaXhgYCkuCisKKyAgRm9yIGluc3RhbmNlLCB0aGUgc3NoLnNlcnZlciBjbGFzcyBhZGRzIHRoZSBzc2guc2VydmVyIGFwcGxpY2F0aW9uIHRvCisgIGEgbm9kZSdzIGFwcGxpY2F0aW9uIGxpc3QuIE5vdyB0aGUgYWRtaW4gbWlnaHQgY3JlYXRlIGFuIEFuc2libGUgcGxheWJvb2sKKyAgbGlrZSBzbzo6CisKKyAgICAtIG5hbWU6IFNTSCBzZXJ2ZXIgbWFuYWdlbWVudAorICAgICAgaG9zdHM6IHNzaC5zZXJ2ZXJfaG9zdHMgICAgICAgICAgICAgIOKGkCBTRUUgSEVSRQorICAgICAgdGFza3M6CisgICAgICAgIC0gbmFtZTogaW5zdGFsbCBTU0ggcGFja2FnZQorICAgICAgICAgIGFjdGlvbjog4oCmCisgICAgICDigKYKKworICBUaGVyZSdzIGEgYml0IG9mIHJlZHVuZGFuY3kgaW4gdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgQW5zaWJsZSBwbGF5Ym9va3MKKyAgaGFyZGNvZGUgdGhlIG5vZGVzIHRvIHdoaWNoIGEgcGxheWJvb2sgYXBwbGllcy4KKworICBJdCdzIG5vdyB0cml2aWFsIHRvIGFwcGx5IHRoaXMgcGxheWJvb2sgYWNyb3NzIHlvdXIgaW5mcmFzdHJ1Y3R1cmU6OgorCisgICAgJCBhbnNpYmxlLXBsYXlib29rIHNzaC5zZXJ2ZXIueW1sCisKKyAgTXkgc3VnZ2VzdGVkIHdheSB0byB1c2UgQW5zaWJsZSBzaXRlLXdpZGUgaXMgdGhlbiB0byBjcmVhdGUgYSBgYHNpdGUueW1sYGAKKyAgcGxheWJvb2sgdGhhdCBpbmNsdWRlcyBhbGwgdGhlIG90aGVyIHBsYXlib29rcyAod2hpY2ggc2hhbGwgaG9wZWZ1bGx5IGJlCisgIGJhc2VkIG9uIEFuc2libGUgcm9sZXMpLCBhbmQgdGhlbiB0byBpbnZva2UgQW5zaWJsZSBsaWtlIHRoaXM6CisKKyAgICBhbnNpYmxlLXBsYXlib29rIHNpdGUueW1sCisKKyAgb3IsIGlmIHlvdSBwcmVmZXIgb25seSB0byByZWNvbmZpZ3VyZSBhIHN1YnNldCBvZiBub2RlcywgZS5nLiBhbGwKKyAgd2Vic2VydmVyczo6CisKKyAgICAkIGFuc2libGUtcGxheWJvb2sgc2l0ZS55bWwgLS1saW1pdCB3ZWJzZXJ2ZXIKKworICBBZ2FpbiwgaWYgdGhlIHNpbmd1bGFyIHdvcmQgYGB3ZWJzZXJ2ZXJgYCBwdXRzIHlvdSBvZmYsIGNoYW5nZSB0aGUKKyAgY29udmVudGlvbiBhcyB5b3Ugd2lzaC4KKworICBBbmQgaWYgYW55b25lIGNvbWVzIHVwIHdpdGggYSB3YXkgdG8gZGlyZWN0bHkgY29ubmVjdCBncm91cHMgaW4gdGhlCisgIGludmVudG9yeSB3aXRoIHJvbGVzLCB0aGVyZWJ5IG1ha2luZyBpdCB1bm5lY2Vzc2FyeSB0byB3cml0ZSBwbGF5Ym9vaworICBmaWxlcyAoY29udGFpbmluZyByZWR1bmRhbnQgaW5mb3JtYXRpb24pLCBwbGVhc2UgdGVsbCBtZSEKKworLSBQYXJhbWV0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gYSBub2RlIGJlY29tZSBgYGhvc3RfdmFyc2BgIGZvciB0aGF0IGhvc3QuCisKK1ZhcmlhYmxlIGludGVycG9sYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Fuc2libGUgYWxsb3dzIHlvdSB0byBpbmNsdWRlIGBKaW5qYTJgXy1zdHlsZSB2YXJpYWJsZXMgaW4gcGFyYW1ldGVyIHZhbHVlczo6CisKKyAgcGFyYW1ldGVyczoKKyAgICBtb3RkOgorICAgICAgZ3JlZXRpbmc6IFdlbGNvbWUgdG8ge3sgYW5zaWJsZV9mcWRuIH19IQorICAgICAgY2xvc2luZzogVGhpcyBzeXN0ZW0gaXMgcGFydCBvZiB7eyByZWFsbSB9fQorICAgIGRpY3RfcmVmZXJlbmNlOiB7eyBtb3RkIH19CisKK0hvd2V2ZXIsIGluIHJlc29sdmluZyB0aGlzLCBBbnNpYmxlIGNhc3RzIGV2ZXJ5dGhpbmcgdG8gYSBzdHJpbmcsIHNvIGluIHRoaXMKK2V4YW1wbGUsIGBgZGljdF9yZWZlcmVuY2VgYCB3b3VsZCBiZSB0aGUgc3RyaW5nLXJlcHJlc2VudGF0aW9uIG9mIHRoZQorZGljdGlvbmFyeSB1bmRlciB0aGUgYGBtb3RkYGAga2V5IFsjc3RyaW5nX2Nhc3RzXV8uIFRvIGdldCBhdCBmYWN0cyAoc3VjaCBhcworYGBhbnNpYmxlX2ZxZG5gYCksIHlvdSBzdGlsbCBoYXZlIHRvIHVzZSB0aGlzIGFwcHJvYWNoLCBidXQgZm9yIHB1cmUgcGFyYW1ldGVyCityZWZlcmVuY2VzLCBJIHN0cm9uZ2x5IHN1Z2dlc3QgdG8gdXNlIHxyZWNsYXNzfCBpbnRlcnBvbGF0aW9uIGluc3RlYWQsIGFzIGl0CitzdXBwb3J0cyBkZWVwIHJlZmVyZW5jZXMsIGRvZXMgbm90IGNsb2JiZXIgdHlwZSBpbmZvcm1hdGlvbiwgYW5kIGlzIG1vcmUKK2VmZmljaWVudCBhbnl3YXk6OgorCisgIHBhcmFtZXRlcnM6CisgICAgbW90ZDoKKyAgICAgIGdyZWV0aW5nOiBXZWxjb21lIHRvIHt7IGFuc2libGVfZnFkbiB9fSEKKyAgICAgIGNsb3Npbmc6IFRoaXMgc3lzdGVtIGlzIHBhcnQgb2YgJHtyZWFsbX0KKyAgICBkaWN0X3JlZmVyZW5jZTogJHttb3RkfQorCitOb3cgeW91IGp1c3QgbmVlZCB0byBzcGVjaWZ5IHJlYWxtIHNvbWV3aGVyZS4gVGhlIHJlZmVyZW5jZSBjYW4gcmVzaWRlIGluCithIHBhcmVudCBjbGFzcywgd2hpbGUgdGhlIHZhcmlhYmxlIGlzIGRlZmluZWQgZS5nLiBpbiB0aGUgbm9kZSBkZWZpbml0aW9uLgorCitBbmQgYXMgZXhwZWN0ZWQsIGBgZGljdF9yZWZlcmVuY2VgYCBub3cgcG9pbnRzIHRvIGEgZGljdGlvbmFyeSwgbm90CithIHN0cmluZy1yZXByZXNlbnRhdGlvbiB0aGVyZW9mLgorCisuLiBbI3N0cmluZ19jYXN0c10gSSBwb2ludGVkIHRoaXMgb3V0IHRvIE1pY2hhZWwgRGVoYWFuLCBBbnNpYmxlJ3MgY2hpZWYKKyAgIGRldmVsb3BlciwgYnV0IGhlIGRlbmllZCB0aGlzIGJlaGF2aW91ci4gV2hlbiBJIHRyaWVkIHRvIHByb3ZpZGUgZnVydGhlcgorICAgaW5zaWdodHMsIEkgZm91bmQgbXlzZWxmIGJhbm5lZCBmcm9tIHRoZSBtYWlsaW5nIGxpc3QsIGFwcGFyZW50bHkgYmVjYXVzZQorICAgSSBkYXJlZCB0byBwb2ludCBvdXQgZmxhd3MuIElmIHlvdSBjYXJlLCB5b3UgbWF5IGxvb2sgYXQKKyAgIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWRkdWNrL3JlY2xhc3MvaXNzdWVzLzYgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKy4uIGluY2x1ZGU6OiBleHRyZWZzLmluYworLi4gaW5jbHVkZTo6IHN1YnN0cy5pbmMKZGlmZiAtLWdpdCBhL19zb3VyY2VzL2NoYW5nZWxvZy50eHQgYi9fc291cmNlcy9jaGFuZ2Vsb2cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YWE3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9fc291cmNlcy9jaGFuZ2Vsb2cudHh0CkBAIC0wLDAgKzEsNDMgQEAKKz09PT09PT09PQorQ2hhbmdlTG9nCis9PT09PT09PT0KKworPT09PT09PT09ID09PT09PT09PT0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1ZlcnNpb24gICBEYXRlICAgICAgIENoYW5nZXMKKz09PT09PT09PSA9PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisxLjQuMSAgICAgMjAxNC0xMC0yOCAqIFJldmVydCBkZWJ1ZyBsb2dnaW5nLCB3aGljaCB3YXNuJ3QgZmF1bHQtZnJlZSBhbmQgc28KKyAgICAgICAgICAgICAgICAgICAgICAgaXQgbmVlZHMgbW9yZSB0aW1lIHRvIG1hdHVyZS4KKzEuNCAgICAgICAyMDE0LTEwLTI1ICogQWRkIHJ1ZGltZW50YXJ5IGRlYnVnIGxvZ2dpbmcKKyAgICAgICAgICAgICAgICAgICAgICogUHJldmVudCBpbnRlcnBvbGF0ZSgpIGZyb20gb3ZlcndyaXRpbmcgbWVyZ2VkIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgKiBMb29rIGZvciAiaW5pdCIgaW5zdGVhZCBvZiAiaW5kZXgiIHdoZW4gYmVpbmcgZmVkCisgICAgICAgICAgICAgICAgICAgICAgIGEgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICAgKiBGaXggZXJyb3IgcmVwb3J0aW5nIG9uIG5vZGUgbmFtZSBjb2xsaXNpb24gYWNyb3NzCisgICAgICAgICAgICAgICAgICAgICAgIHN1YmRpcmVjdG9yaWVzLgorMS4zICAgICAgIDIwMTQtMDMtMDEgKiBTYWx0OiBwaWxsYXIgZGF0YSBmcm9tIHByZXZpb3VzIHBpbGxhcnMgYXJlIG5vdworICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdG8gcmVjbGFzcyBwYXJhbWV0ZXIgaW50ZXJwb2xhdGlvbgorICAgICAgICAgICAgICAgICAgICAgKiB5YW1sX2ZzOiBjbGFzc2VzIG1heSBiZSBkZWZpbmVkIGluIHN1YmRpcmVjdG9yaWVzCisgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZXM6ICMxMiwgIzE5LCAjMjApCisgICAgICAgICAgICAgICAgICAgICAqIE1pZ3JhdGUgU2FsdCBhZGFwdGVyIHRvIG5ldyBjb3JlIEFQSSAoY2xvc2VzOiAjMTgpCisgICAgICAgICAgICAgICAgICAgICAqIEZpeCAtLW5vZGVpbmZvIGludm9jYXRpb24gaW4gZG9jcyAoY2xvc2VzOiAjMjEpCisxLjIuMiAgICAgMjAxMy0xMi0yNyAqIFJlY3Vyc2UgY2xhc3NlcyBvYnRhaW5lZCBmcm9tIGNsYXNzIG1hcHBpbmdzCisgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZXM6ICMxNikKKyAgICAgICAgICAgICAgICAgICAgICogRml4IGNsYXNzIG1hcHBpbmcgcmVnZXhwIHJlbmRlcmluZyBpbiBkb2NzCisgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZXM6ICMxNSkKKzEuMi4xICAgICAyMDEzLTEyLTI2ICogRml4IFNhbHQgYWRhcHRlciB3cnQuIGNsYXNzIG1hcHBpbmdzCisgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZXM6ICMxNCkKKzEuMiAgICAgICAyMDEzLTEyLTEwICogSW50cm9kdWNlIGNsYXNzIG1hcHBpbmdzIChzZWUgOmRvYzpgb3BlcmF0aW9uc2ApCisgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZXM6ICM1KQorICAgICAgICAgICAgICAgICAgICAgKiBGaXggcGFyYW1ldGVyIGludGVycG9sYXRpb24gYWNyb3NzIG1lcmdlZCBsaXN0cworICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2VzOiAjMTMpLgorICAgICAgICAgICAgICAgICAgICAgKiBDYWNoaW5nIG9mIGNsYXNzZXMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGVzcGVjaWFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIHRoZSBpbnZlbnRvcnkgcnVucworICAgICAgICAgICAgICAgICAgICAgKiB5YW1sX2ZzOiBub2RlcyBtYXkgYmUgZGVmaW5lZCBpbiBzdWJkaXJlY3RvcmllcworICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2VzOiAjMTApLgorICAgICAgICAgICAgICAgICAgICAgKiBDbGFzc2VzIGFuZCBub2RlcyBVUkkgbXVzdCBub3Qgb3ZlcmxhcCBhbnltb3JlCisgICAgICAgICAgICAgICAgICAgICAqIENsYXNzIG5hbWVzIG11c3Qgbm90IGNvbnRhaW4gc3BhY2VzCisxLjEgICAgICAgMjAxMy0wOC0yOCBTYWx0IGFkYXB0ZXI6IGZpeCBpbnRlcmZhY2UgdG8gaW5jbHVkZSBtaW5pb25faWQsIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGFjY29yZGluZ2x5OyBmaXhlcyBtYXN0ZXJfdG9wcworMS4wLjIgICAgIDIwMTMtMDgtMjcgRml4IGluY29ycmVjdCB2ZXJzaW9uaW5nIGluIHNldHVwdG9vbHMKKzEuMC4xICAgICAyMDEzLTA4LTI3IERvY3VtZW50YXRpb24gdXBkYXRlcywgbmV3IGhvbWVwYWdlCisxLjAgICAgICAgMjAxMy0wOC0yNiBJbml0aWFsIHJlbGVhc2UKKz09PT09PT09PSA9PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9fc291cmNlcy9jb25jZXB0cy50eHQgYi9fc291cmNlcy9jb25jZXB0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiNTgxOAotLS0gL2Rldi9udWxsCisrKyBiL19zb3VyY2VzL2NvbmNlcHRzLnR4dApAQCAtMCwwICsxLDEzMyBAQAorPT09PT09PT09PT09PT09PQorcmVjbGFzcyBjb25jZXB0cworPT09PT09PT09PT09PT09PQorfHJlY2xhc3N8IGFzc3VtZXMgYSBub2RlLWNlbnRyaWMgcGVyc3BlY3RpdmUgaW50byB5b3VyIGludmVudG9yeS4gVGhpcyBpcworb2J2aW91cyB3aGVuIHlvdSBxdWVyeSB8cmVjbGFzc3wgZm9yIG5vZGUtc3BlY2lmaWMgaW5mb3JtYXRpb24sIGJ1dCBpdCBtaWdodCBub3QKK2JlIGNsZWFyIHdoZW4geW91IGFzayB8cmVjbGFzc3wgdG8gcHJvdmlkZSB5b3Ugd2l0aCBhIGxpc3Qgb2YgZ3JvdXBzLiBJbiB0aGF0CitjYXNlLCB8cmVjbGFzc3wgbG9vcHMgb3ZlciBhbGwgbm9kZXMgaXQgY2FuIGZpbmQgaW4gaXRzIGRhdGFiYXNlLCByZWFkcyBhbGwKK2luZm9ybWF0aW9uIGl0IGNhbiBmaW5kIGFib3V0IHRoZSBub2RlcywgYW5kIGZpbmFsbHkgcmVvcmRlcnMgdGhlIHJlc3VsdCB0bworcHJvdmlkZSBhIGxpc3Qgb2YgZ3JvdXBzIHdpdGggdGhlIG5vZGVzIHRoZXkgY29udGFpbi4KKworU2luY2UgdGhlIHRlcm0gImdyb3VwcyIgaXMgc29tZXdoYXQgYW1iaWd1b3VzLCBpdCBoZWxwcyB0byBzdGFydCBvZmYgd2l0aAorYSBzaG9ydCBnbG9zc2FyeSBvZiB8cmVjbGFzc3wtc3BlY2lmaWMgdGVybWlub2xvZ3k6CisKKz09PT09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29uY2VwdCAgICAgIERlc2NyaXB0aW9uCis9PT09PT09PT09PT0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK25vZGUgICAgICAgICBBIG5vZGUsIHVzdWFsbHkgYSBjb21wdXRlciBpbiB5b3VyIGluZnJhc3RydWN0dXJlCitjbGFzcyAgICAgICAgQSBjYXRlZ29yeSwgdGFnLCBmZWF0dXJlLCBvciByb2xlIHRoYXQgYXBwbGllcyB0byBhIG5vZGUKKyAgICAgICAgICAgICBDbGFzc2VzIG1heSBiZSBuZXN0ZWQsIGkuZS4gdGhlcmUgY2FuIGJlIGEgY2xhc3MgaGllcmFyY2h5CithcHBsaWNhdGlvbiAgQSBzcGVjaWZpYyBzZXQgb2YgYmVoYXZpb3VyIHRvIGFwcGx5CitwYXJhbWV0ZXIgICAgTm9kZS1zcGVjaWZpYyB2YXJpYWJsZXMsIHdpdGggaW5oZXJpdGFuY2UgdGhyb3VnaG91dCB0aGUgY2xhc3MKKyAgICAgICAgICAgICBoaWVyYXJjaHkuCis9PT09PT09PT09PT0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQSBjbGFzcyBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgcGFyZW50IGNsYXNzZXMsIHplcm8gb3IgbW9yZSBhcHBsaWNhdGlvbnMsCithbmQgYW55IG51bWJlciBvZiBwYXJhbWV0ZXJzLgorCitBIGNsYXNzIG5hbWUgbXVzdCBub3QgY29udGFpbiBzcGFjZXMuCisKK0Egbm9kZSBpcyBhbG1vc3QgZXF1aXZhbGVudCB0byBhIGNsYXNzLCBleGNlcHQgdGhhdCBpdCB1c3VhbGx5IGRvZXMgbm90IChidXQKK2Nhbikgc3BlY2lmeSBhcHBsaWNhdGlvbnMuCisKK1doZW4gfHJlY2xhc3N8IHBhcnNlcyBhIG5vZGUgKG9yIGNsYXNzKSBkZWZpbml0aW9uIGFuZCBlbmNvdW50ZXJzIGEgcGFyZW50CitjbGFzcywgaXQgcmVjdXJzZXMgdG8gdGhpcyBwYXJlbnQgY2xhc3MgZmlyc3QgYmVmb3JlIHJlYWRpbmcgYW55IGRhdGEgb2YgdGhlCitub2RlIChvciBjbGFzcykuIFdoZW4gfHJlY2xhc3N8IHJldHVybnMgZnJvbSB0aGUgcmVjdXJzaXZlLCBkZXB0aCBmaXJzdCB3YWxrLCBpdAordGhlbiBtZXJnZXMgYWxsIGluZm9ybWF0aW9uIG9mIHRoZSBjdXJyZW50IG5vZGUgKG9yIGNsYXNzKSBpbnRvIHRoZQoraW5mb3JtYXRpb24gaXQgb2J0YWluZWQgZHVyaW5nIHRoZSByZWN1cnNpb24uCisKK0Z1cnRoZXJtb3JlLCBhIG5vZGUgKG9yIGNsYXNzKSBtYXkgZGVmaW5lIGEgbGlzdCBvZiBjbGFzc2VzIGl0IGRlcml2ZXMgZnJvbSwKK2luIHdoaWNoIGNhc2UgY2xhc3NlcyBkZWZpbmVkIGZ1cnRoZXIgZG93biB0aGUgbGlzdCB3aWxsIGJlIGFibGUgdG8gb3ZlcnJpZGUKK2NsYXNzZXMgZnVydGhlciB1cCB0aGUgbGlzdC4KKworSW5mb3JtYXRpb24gaW4gdGhpcyBjb250ZXh0IGlzIGVzc2VudGlhbGx5IG9uZSBvZiBhIGxpc3Qgb2YgYXBwbGljYXRpb25zIG9yCithIGxpc3Qgb2YgcGFyYW1ldGVycy4KKworVGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIGRlcHRoLWZpcnN0IHdhbGsgYW5kIHRoZSBkZWxheWVkIG1lcmdpbmcgb2YgZGF0YQorbWVhbnMgdGhhdCB0aGUgbm9kZSAoYW5kIGFueSBjbGFzcykgbWF5IG92ZXJyaWRlIGFueSBvZiB0aGUgZGF0YSBkZWZpbmVkIGJ5Cithbnkgb2YgdGhlIHBhcmVudCBjbGFzc2VzIChhbmNlc3RvcnMpLiBUaGlzIGlzIGluIGxpbmUgd2l0aCB0aGUgYXNzdW1wdGlvbgordGhhdCBtb3JlIHNwZWNpZmljIGRlZmluaXRpb25zICgidGhpcyBzcGVjaWZpYyBob3N0Iikgc2hvdWxkIGhhdmUgYSBoaWdoZXIKK3ByZWNlZGVuY2UgdGhhbiBtb3JlIGdlbmVyYWwgZGVmaW5pdGlvbnMgKCJhbGwgd2Vic2VydmVycyIsIHdoaWNoIGluY2x1ZGVzIGFsbAord2Vic2VydmVycyBpbiBNdW5pY2gsIHdoaWNoIGluY2x1ZGVzICJ0aGlzIHNwZWNpZmljIGhvc3QiLCBmb3IgZXhhbXBsZSkuCisKK0hlcmUncyBhIHF1aWNrIGV4YW1wbGUsIHNob3dpbmcgaG93IHBhcmFtZXRlcnMgYWNjdW11bGF0ZSBhbmQgY2FuIGdldAorcmVwbGFjZWQuCisKKyAgQWxsICJ1bml4bm9kZXMiIChpLmUuIG5vZGVzIHdobyBoYXZlIHRoZSBgYHVuaXhub2RlYGAgY2xhc3MgaW4gdGhlaXIKKyAgYW5jZXN0cnkpIGhhdmUgYGAvZXRjL21vdGRgYCBjZW50cmFsbHktbWFuYWdlZCAodGhyb3VnaCB0aGUgYGBtb3RkYGAKKyAgYXBwbGljYXRpb24pLCBhbmQgdGhlIGB1bml4bm9kZWAgY2xhc3MgZGVmaW5pdGlvbiBwcm92aWRlcyBhIGdlbmVyaWMKKyAgbWVzc2FnZS1vZi10aGUtZGF5IHRvIGJlIHB1dCBpbnRvIHRoaXMgZmlsZS4KKworICBBbGwgZGVzY2VuZGFudHMgb2YgdGhlIGNsYXNzIGBgZGViaWFubm9kZWBgLCBhIGRlc2NlbmRhbnQgb2YgYGB1bml4bm9kZWBgLAorICBzaG91bGQgaW5jbHVkZSB0aGUgRGViaWFuIGNvZGVuYW1lIGluIHRoaXMgbWVzc2FnZSwgc28gdGhlCisgIG1lc3NhZ2Utb2YtdGhlLWRheSBpcyBvdmVyd3JpdHRlbiBpbiB0aGUgYGBkZWJpYW5ub2Rlc2BgIGNsYXNzLgorCisgIFRoZSBub2RlIGBgcXVhbnR1bS5leGFtcGxlLm9yZ2BgIChhIGBkZWJpYW5ub2RlYCkgd2lsbCBoYXZlIGEgc2NoZWR1bGVkCisgIGRvd250aW1lIHRoaXMgd2Vla2VuZCwgc28gdW50aWwgTW9uZGF5LCBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlLW9mLXRoZS1kYXkgaXMKKyAgYWRkZWQgdG8gdGhlIG5vZGUgZGVmaW5pdGlvbi4KKworICBXaGVuIHRoZSBgYG1vdGRgYCBhcHBsaWNhdGlvbiBydW5zLCBpdCByZWNlaXZlcyB0aGUgYXBwcm9wcmlhdGUKKyAgbWVzc2FnZS1vZi10aGUtZGF5IChmcm9tIGBgcXVhbnR1bS5leGFtcGxlLm9yZ2BgIHdoZW4gcnVuIG9uIHRoYXQgbm9kZSkgYW5kCisgIHdyaXRlcyBpdCBpbnRvIGBgL2V0Yy9tb3RkYGAuCisKK0F0IHRoaXMgcG9pbnQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgcGFyYW1ldGVycyB3aG9zZSB2YWx1ZXMgYXJlIGxpc3RzIG9yCitrZXktdmFsdWUgcGFpcnMgZG9uJ3QgZ2V0IG92ZXJ3cml0dGVuIGJ5IGNoaWxkcmVuIGNsYXNzZXMgb3Igbm9kZSBkZWZpbml0aW9ucywKK2J1dCB0aGUgaW5mb3JtYXRpb24gZ2V0cyBtZXJnZWQgKHJlY3Vyc2l2ZWx5KSBpbnN0ZWFkLgorCitTaW1pbGFybHkgdG8gcGFyYW1ldGVycywgYXBwbGljYXRpb25zIGFsc28gYWNjdW11bGF0ZSBkdXJpbmcgdGhlIHJlY3Vyc2l2ZQord2FsayB0aHJvdWdoIHRoZSBjbGFzcyBhbmNlc3RyeS4gSXQgaXMgcG9zc2libGUgZm9yIGEgbm9kZSBvciBjaGlsZCBjbGFzcyB0bworKnJlbW92ZSogYW4gYXBwbGljYXRpb24gYWRkZWQgYnkgYSBwYXJlbnQgY2xhc3MsIGJ5IHByZWZpeGluZyB0aGUgYXBwbGljYXRpb24KK3dpdGggYH5gLgorCitGaW5hbGx5LCB8cmVjbGFzc3wgaGFwcGlseSBsZXRzIHlvdSB1c2UgbXVsdGlwbGUgaW5oZXJpdGFuY2UsIGFuZCBlbnN1cmVzIHRoYXQKK3RoZSByZXNvbHV0aW9uIG9mIHBhcmFtZXRlcnMgaXMgc3RpbGwgd2VsbC1kZWZpbmVkLiBIZXJlJ3MgYW5vdGhlciBleGFtcGxlCitidWlsZGluZyB1cG9uIHRoZSBvbmUgYWJvdXQgYGAvZXRjL21vdGRgYCBhYm92ZToKKworICBgYHF1YW50dW0uZXhhbXBsZS5vcmdgYCAod2hpY2ggaXMgYmFjayB1cCBhbmQgdGhlcmVmb3JlIGl0cyBub2RlIGRlZmluaXRpb24KKyAgbm8gbG9uZ2VyIGNvbnRhaW5zIGEgbWVzc2FnZS1vZi10aGUtZGF5KSBpcyBhdCBhIHNpdGUgaW4gTXVuaWNoLiBUaGVyZWZvcmUsCisgIGl0IGlzIGEgY2hpbGQgb2YgdGhlIGNsYXNzIGBgaG9zdGVkQG11bmljaGBgLiBUaGlzIGNsYXNzIGlzIGluZGVwZW5kZW50IG9mCisgIHRoZSBgYHVuaXhub2RlYGAgaGllcmFyY2h5LCBgYHF1YW50dW0uZXhhbXBsZS5vcmdgYCBkZXJpdmVzIGZyb20gYm90aC4KKworICBJbiB0aGlzIGV4YW1wbGUgaW5mcmFzdHJ1Y3R1cmUsIGBgaG9zdGVkQG11bmljaGBgIGlzIG1vcmUgc3BlY2lmaWMgdGhhbgorICBgYGRlYmlhbm5vZGVgYCBiZWNhdXNlIHRoZXJlIGFyZSBwbGVudHkgb2YgRGViaWFuIG5vZGVzIGF0IG90aGVyIHNpdGVzIChhbmQKKyAgc29tZSBub24tRGViaWFuIG5vZGVzIGluIE11bmljaCkuIFRoZXJlZm9yZSwgYGBxdWFudHVtLmV4YW1wbGUub3JnYGAgZGVyaXZlcworICBmcm9tIGBgaG9zdGVkQG11bmljaGBgIF9hZnRlcl8gYGBkZWJpYW5ub2Rlc2BgLgorCisgIFdoZW4gYW4gZWxlY3RyaWNpdHkgb3V0YWdlIGlzIGV4cGVjdGVkIG92ZXIgdGhlIHdlZWtlbmQgaW4gTXVuaWNoLCB0aGUgYWRtaW4KKyAgY2FuIGNoYW5nZSB0aGUgbWVzc2FnZS1vZi10aGUtZGF5IGluIHRoZSBgYGhvc3RlZEBtdW5pY2hgYCBjbGFzcywgYW5kIGl0CisgIHdpbGwgYXBwbHkgdG8gYWxsIGhvc3RzIGluIE11bmljaC4KKworICBIb3dldmVyLCBub3QgYWxsIGhvc3RzIGluIE11bmljaCBoYXZlIGBgL2V0Yy9tb3RkYGAsIGJlY2F1c2Ugc29tZSBvZiB0aGVtCisgIGFyZSBvZiBjbGFzcyBgYHdpbmRvd3Nub2RlYGAuIFNpbmNlIHRoZSBgYHdpbmRvd3Nub2RlYGAgYW5jZXN0cnkgZG9lcyBub3QKKyAgc3BlY2lmeSB0aGUgYGBtb3RkYGAgYXBwbGljYXRpb24sIHRob3NlIGhvc3RzIGhhdmUgYWNjZXNzIHRvIHRoZQorICBtZXNzYWdlLW9mLXRoZS1kYXkgaW4gdGhlIG5vZGUgdmFyaWFibGVzLCBidXQgdGhlIG1lc3NhZ2Ugd29uJ3QgZ2V0IHVzZWTigKYKKworICDigKYgdW5sZXNzLCBvZiBjb3Vyc2UsIGBgd2luZG93c25vZGVgYCBzcGVjaWZpZWQgYSBXaW5kb3dzLXNwZWNpZmljCisgIGFwcGxpY2F0aW9uIHRvIGJyaW5nIHN1Y2ggbm90aWNlcyB0byB0aGUgYXR0ZW50aW9uIG9mIHRoZSB1c2VyLgorCitJdCdzIGFsc28gdHJpdmlhbCB0byBlbnN1cmUgYSBjZXJ0YWluIG9yZGVyIG9mIGNsYXNzIGV2YWx1YXRpb24uIEhlcmUncworYW5vdGhlciBleGFtcGxlOgorCisgIFRoZSBgYHNzaC5zZXJ2ZXJgYCBjbGFzcyBkZWZpbmVzIHRoZSBgYHBlcm1pdF9yb290X2xvZ2luYGAgcGFyYW1ldGVyIHRvIGBgbm9gYC4KKworICBUaGUgYGBiYWNrdXBwYy5jbGllbnRgYCBjbGFzcyBkZWZpbmVzIHRoZSBwYXJhbWV0ZXIgdG8gYGB3aXRob3V0LXBhc3N3b3JkYGAsCisgIGJlY2F1c2UgdGhlIEJhY2t1cFBDIHNlcnZlciBtaWdodCBuZWVkIHRvIGxvZyBpbiB0byB0aGUgaG9zdCBhcyByb290LgorCisgIE5vdywgd2hhdCBoYXBwZW5zIGlmIHRoZSBhZG1pbiBhY2NpZGVudGFsbHkgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB0d28KKyAgY2xhc3Nlcz8KKworICAtIGBgYmFja3VwcGMuY2xpZW50YGAKKyAgLSBgYHNzaC5zZXJ2ZXJgYAorCisgIFRoZW9yZXRpY2FsbHksIHRoaXMgd291bGQgbWVhbiBgYHBlcm1pdF9yb290X2xvZ2luYGAgZ2V0cyBzZXQgdG8gYGBub2BgLgorCisgIEhvd2V2ZXIsIHNpbmNlIGFsbCBgYGJhY2t1cHBjLmNsaWVudGBgIG5vZGVzIG5lZWQgYGBzc2guc2VydmVyYGAgKGF0IGxlYXN0CisgIGluIG1vc3Qgc2V0dXBzKSwgdGhlIGNsYXNzIGBgYmFja3VwcGMuY2xpZW50YGAgaXRzZWxmIGRlcml2ZXMgZnJvbQorICBgYHNzaC5zZXJ2ZXJgYCwgZW5zdXJpbmcgdGhhdCBpdCBnZXRzIHBhcnNlZCBiZWZvcmUgYGBiYWNrdXBwYy5jbGllbnRgYC4KKworICBXaGVuIHxyZWNsYXNzfCByZXR1cm5zIHRvIHRoZSBub2RlIGFuZCBlbmNvdW50ZXJzIHRoZSBgYHNzaC5zZXJ2ZXJgYCBjbGFzcworICBkZWZpbmVkIHRoZXJlLCBpdCBzaW1wbHkgc2tpcHMgaXQsIGFzIGl0J3MgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4KKworTm93IHJlYWQgYWJvdXQgOmRvYzpgb3BlcmF0aW9uc2AhCisKKy4uIGluY2x1ZGU6OiBzdWJzdHMuaW5jCmRpZmYgLS1naXQgYS9fc291cmNlcy9jb25maWdmaWxlLnR4dCBiL19zb3VyY2VzL2NvbmZpZ2ZpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5N2U2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9fc291cmNlcy9jb25maWdmaWxlLnR4dApAQCAtMCwwICsxLDMzIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PQorcmVjbGFzcyBjb25maWd1cmF0aW9uIGZpbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09Cit8cmVjbGFzc3wgY2FuIHJlYWQgc29tZSBvZiBpdHMgY29uZmlndXJhdGlvbiBmcm9tIGEgZmlsZS4gVGhlIGZpbGUgaXMKK2EgWUFNTC1maWxlIGFuZCBzaW1wbHkgZGVmaW5lcyBrZXktdmFsdWUgcGFpcnMuCisKK1RoZSBjb25maWd1cmF0aW9uIGZpbGUgY2FuIGJlIHVzZWQgdG8gc2V0IGRlZmF1bHRzIGZvciBhbGwgdGhlIG9wdGlvbnMgdGhhdAorYXJlIG90aGVyd2lzZSBjb25maWd1cmFibGUgdmlhIHRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlLCBzbyBwbGVhc2UgdXNlIHRoZQorYGAtLWhlbHBgYCBvdXRwdXQgb2YgfHJlY2xhc3N8IChvciB0aGUgOmRvYzpgbWFudWFsIHBhZ2UgPG1hbnBhZ2U+YCkgZm9yCityZWZlcmVuY2UuIFRoZSBjb21tYW5kLWxpbmUgb3B0aW9uIGBgLS1ub2Rlcy11cmlgYCBjb3JyZXNwb25kcyB0byB0aGUga2V5CitgYG5vZGVzX3VyaWBgIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuIEZvciBleGFtcGxlOjoKKworICBzdG9yYWdlX3R5cGU6IHlhbWxfZnMKKyAgcHJldHR5X3ByaW50OiBUcnVlCisgIG91dHB1dDoganNvbgorICBpbnZlbnRvcnlfYmFzZV91cmk6IC9ldGMvcmVjbGFzcworICBub2Rlc191cmk6IC4uL25vZGVzCisKK3xyZWNsYXNzfCBmaXJzdCBsb29rcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIGNhbGxlZAorYGByZWNsYXNzLWNvbmZpZy55bWxgYCAoc2VlIGBgcmVjbGFzcy9kZWZhdWx0cy5weWBgKSBhbmQgaWYgbm8gc3VjaCBmaWxlIGlzCitmb3VuZCwgaXQgbG9va3MgaW4gYGAkSE9NRWBgLCB0aGVuIGluIGBgL2V0Yy9yZWNsYXNzYGAsIGFuZCB0aGVuICJuZXh0IHRvIiB0aGUKK2BgcmVjbGFzc2BgIHNjcmlwdCBpdHNlbGYsIGkuZS4gaWYgdGhlIHNjcmlwdCBpcyBzeW1saW5rZWQgdG8KK2BgL3Nydi9wcm92aXNpb25pbmcvcmVjbGFzc2BgLCB0aGVuIHRoZSB0aGUgc2NyaXB0IHdpbGwgdHJ5IHRvIGFjY2VzcworYGAvc3J2L3Byb3Zpc2lvbmluZy9yZWNsYXNzLWNvbmZpZy55bWxgYC4KKworTm90ZSB0aGF0IGBgeWFtbF9mc2BgIGlzIGN1cnJlbnRseSB0aGUgb25seSBzdXBwb3J0ZWQgYGBzdG9yYWdlX3R5cGVgYCwgYW5kCitpdCdzIHRoZSBkZWZhdWx0IGlmIHlvdSBkb24ndCBzZXQgaXQuCisKK0FkYXB0ZXJzIG1heSBpbXBsZW1lbnQgdGhlaXIgb3duIGxvb2t1cCBsb2dpYywgb2YgY291cnNlLCBzbyBtYWtlIHN1cmUgdG8gcmVhZAordGhlaXIgZG9jdW1lbnRhdGlvbiAoZm9yIDpkb2M6YFNhbHQgPHNhbHQ+YCwgZm9yIDpkb2M6YEFuc2libGUgPGFuc2libGU+YCwgYW5kCitmb3IgOmRvYzpgUHVwcGV0IDxwdXBwZXQ+YCkuCisKKy4uIGluY2x1ZGU6OiBzdWJzdHMuaW5jCmRpZmYgLS1naXQgYS9fc291cmNlcy9oYWNraW5nLnR4dCBiL19zb3VyY2VzL2hhY2tpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZGFhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9fc291cmNlcy9oYWNraW5nLnR4dApAQCAtMCwwICsxLDYyIEBACis9PT09PT09PT09PT09PT09PT0KK0hhY2tpbmcgb24gcmVjbGFzcworPT09PT09PT09PT09PT09PT09CisKK0luc3RhbGxhdGlvbgorLS0tLS0tLS0tLS0tCitJZiB5b3UganVzdCB3YW50IHRvIHJ1biB8cmVjbGFzc3wgZnJvbSBzb3VyY2UsIGUuZy4gYmVjYXVzZSB5b3UgYXJlIGdvaW5nIHRvIGJlCittYWtpbmcgYW5kIHRlc3RpbmcgY2hhbmdlcywgaW5zdGFsbCBpdCBpbiAiZGV2ZWxvcG1lbnQgbW9kZSI6OgorCisgIHB5dGhvbiBzZXR1cC5weSBkZXZlbG9wCisKK05vdyB0aGUgYGByZWNsYXNzYGAgc2NyaXB0LCBhcyB3ZWxsIGFzIHRoZSBhZGFwdGVycywgd2lsbCBiZSBhdmFpbGFibGUgaW4KK2BgL3Vzci9sb2NhbC9iaW5gYCwgYW5kIHlvdSBjYW4gYWxzbyBpbnZva2UgdGhlbSBkaXJlY3RseSBmcm9tIHRoZSBzb3VyY2UKK3RyZWUuCisKK1RvIHVuaW5zdGFsbDo6CisKKyAgcHl0aG9uIHNldHVwLnB5IGRldmVsb3AgLS11bmluc3RhbGwKKworRGlzY3Vzc2luZyByZWNsYXNzCistLS0tLS0tLS0tLS0tLS0tLS0KK0lmIHlvdSB3YW50IHRvIHRhbGsgYWJvdXQgfHJlY2xhc3N8LCB1c2UgdGhlIGBtYWlsaW5nIGxpc3RgXyBvciB0byBmaW5kIG1lIG9uCitJUkMsIGluIGBgI3JlY2xhc3NgYCBvbiBgYGlyYy5vZnRjLm5ldGBgLgorCisuLiBfbWFpbGluZyBsaXN0OiBodHRwOi8vbGlzdHMucGFudHNmdWxsb2Z1bml4Lm5ldC9saXN0aW5mby9yZWNsYXNzCisKK0NvbnRyaWJ1dGluZyB0byByZWNsYXNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfHJlY2xhc3N8IGlzIGN1cnJlbnRseSBtYWludGFpbmVkIGBvbiBHaXRodWIKKzxodHRwOi8vZ2l0aHViLmNvbS9tYWRkdWNrL3JlY2xhc3M+YF8uCisKK0NvbnR0cmlidXRpb25zIHRvIHxyZWNsYXNzfCBhcmUgdmVyeSB3ZWxjb21lLiBTaW5jZSBJIHByZWZlciB0byBrZWVwIGEgc29tZXdoYXQKK2NsZWFuIGhpc3RvcnksIEkgd2lsbCBub3QganVzdCBtZXJnZSBwdWxsIHJlcXVlc3QuCisKK1lvdSBjYW4gc3VibWl0IHB1bGwgcmVxdWVzdHMsIG9mIGNvdXJzZSwgYW5kIEknbGwgcmViYXNlIHRoZW0gb250byBgYEhFQURgYAorYmVmb3JlIG1lcmdpbmcuIE9yIHNlbmQgeW91ciBwYXRjaGVzIHVzaW5nIGBgZ2l0LWZvcm1hdC1wYXRjaGBgIGFuZAorYGBnaXQtc2VuZC1lLW1haWxgYCB0byBgdGhlIG1haWxpbmcgbGlzdAorPHJlY2xhc3NAbGlzdHMucGFudHNmdWxsb2Z1bml4Lm5ldD5gXy4KKworSSBoYXZlIGFkZGVkIHJ1ZGltZW50YXJ5IHVuaXQgdGVzdHMsIGFuZCBpdCB3b3VsZCBiZSBuaWNlIGlmIHlvdSBjb3VsZCBzdWJtaXQKK3lvdXIgY2hhbmdlcyB3aXRoIGFwcHJvcHJpYXRlIGNoYW5nZXMgdG8gdGhlIHRlc3RzLiBUbyBydW4gdGVzdHMsIGludm9rZQorCis6OgorCisgICQgbWFrZSB0ZXN0cworCitpbiB0aGUgdG9wLWxldmVsIGNoZWNrb3V0IGRpcmVjdG9yeS4gVGhlIHRlc3RzIGFyZSByYXRoZXIgaW5jb25zaXN0ZW50LCBzb21lCit1c2luZyBtb2NrIG9iamVjdHMsIGFuZCBvbmx5IHRoZSBkYXRhdHlwZXMtcmVsYXRlZCBjb2RlIGlzIGNvdmVyZWQuIElmIHlvdSBhcmUKK2EgdGVzdGluZyBleHBlcnQsIEkgY291bGQgY2VydGFpbmx5IHVzZSBzb21lIGhlbHAgaGVyZSB0byBpbXByb3ZlIHRoZQorY29uc2lzdGVuY3kgb2YgdGhlIGV4aXN0aW5nIHRlc3RzLCBhcyB3ZWxsIGFzIHRoZWlyIGNvdmVyYWdlLgorCitBbHNvLCB0aGVyZSBpcyBhIE1ha2VmaWxlIGdpdmluZyBhY2Nlc3MgdG8gUHlMaW50IGFuZCBgYGNvdmVyYWdlLnB5YGAgKHJ1bm5pbmcKK3Rlc3RzKS4gSWYgeW91IHJ1biB0aGF0LCB5b3UgY2FuIHNlZSB0aGVyZSBpcyBhIGxvdCBvZiB3b3JrIHRvIGJlIGRvbmUKK2NsZWFuaW5nIHVwIHRoZSBjb2RlLiBJZiB0aGlzIGlzIHRoZSBzb3J0IG9mIHN0dWZmIHlvdSB3YW50IHRvIGRvIOKAlCBieSBhbGwKK21lYW5zIOKAlCBiZSBteSBndWVzdCEgOykKKworVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGl0ZW1zIG9uIHRoZSA6ZG9jOmB0by1kbyBsaXN0IDx0b2RvPmAsIHNvIGlmIHlvdSBhcmUKK2JvcmVk4oCmCisKK0lmIHlvdSBoYXZlIGxhcmdlciBpZGVhcywgSSdsbCBiZSBsb29raW5nIGZvcndhcmQgdG8gZGlzY3VzcyB0aGVtIHdpdGggeW91LgorCisuLiBpbmNsdWRlOjogc3Vic3RzLmluYwpkaWZmIC0tZ2l0IGEvX3NvdXJjZXMvaW5kZXgudHh0IGIvX3NvdXJjZXMvaW5kZXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzc1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9fc291cmNlcy9pbmRleC50eHQKQEAgLTAsMCArMSw4MSBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CityZWNsYXNzIOKAlCBSZWN1cnNpdmUgZXh0ZXJuYWwgbm9kZSBjbGFzc2lmaWNhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisuLiBpbmNsdWRlOjogaW50cm8uaW5jCisKK1JlbGVhc2VzIGFuZCBzb3VyY2UgY29kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbGF0ZXN0IHJlbGVhc2VkIHxyZWNsYXNzfCB2ZXJzaW9uIGlzIHxyZWxlYXNlfC4gUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZQorOmRvYzpgY2hhbmdlIGxvZyA8Y2hhbmdlbG9nPmAgZm9yIGluZm9ybWF0aW9uIGFib3V0IHJlY2VudCBjaGFuZ2VzLgorCitGb3Igbm93LCB8cmVjbGFzc3wgaXMgaG9zdGVkIGBvbiBHaXRodWJgXywgYW5kIHlvdSBtYXkgY2xvbmUgaXQgd2l0aCB0aGUKK2ZvbGxvd2luZyBjb21tYW5kOjoKKworICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL21hZGR1Y2svcmVjbGFzcy5naXQKKworUGxlYXNlIHNlZSB0aGUgOmRvYzpgaW5zdGFsbCBpbnN0cnVjdGlvbnMgPGluc3RhbGw+YCBmb3IgaW5mb3JtYXRpb24gYWJvdXQKK2Rpc3RyaWJ1dGlvbiBwYWNrYWdlcyBhbmQgdGFyYmFsbHMuCisKKy4uIF9vbiBHaXRodWI6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYWRkdWNrL3JlY2xhc3MKKworQ29tbXVuaXR5CistLS0tLS0tLS0KK1RoZXJlIGlzIGEgYG1haWxpbmcgbGlzdGBfLCB3aGVyZSB5b3UgY2FuIGJyaW5nIHVwIGFueXRoaW5nIHJlbGF0ZWQgdG8KK3xyZWNsYXNzfC4KKworLi4gX21haWxpbmcgbGlzdDogaHR0cDovL2xpc3RzLnBhbnRzZnVsbG9mdW5peC5uZXQvbGlzdGluZm8vcmVjbGFzcworCitGb3IgcmVhbC10aW1lIGNvbW11bmljYXRpb24sIHBsZWFzZSBqb2luIHRoZSBgYCNyZWNsYXNzYGAgSVJDIGNoYW5uZWwgb24KK2BgaXJjLm9mdGMubmV0YGAuCisKK0lmIHlvdSdyZSB1c2luZyBgU2FsdGBfLCB5b3UgY2FuIGFsc28gYXNrIHlvdXIgfHJlY2xhc3N8LWFuZC1TYWx0LXJlbGF0ZWQKK3F1ZXN0aW9ucyBvbiB0aGUgbWFpbGluZyBsaXN0LCBpZGVhbGx5IHNwZWNpZnlpbmcgInJlY2xhc3MiIGluIHRoZSBzdWJqZWN0IG9mCit5b3VyIG1lc3NhZ2UuCisKK0xpY2VuY2UKKy0tLS0tLS0KK3xyZWNsYXNzfCBpcyDCqSAyMDA34oCTMjAxNCBieSBtYXJ0aW4gZi4ga3JhZmZ0IGFuZCByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YKK3RoZSBgQXJ0aXN0aWMgTGljZW5jZSAyLjBgXy4KKworQ29udGVudHMKKy0tLS0tLS0tCitUaGVzZSBkb2N1bWVudHMgYWltIHRvIGdldCB5b3Ugc3RhcnRlZCB3aXRoIHxyZWNsYXNzfDoKKworLi4gdG9jdHJlZTo6CisgICA6bWF4ZGVwdGg6IDIKKworICAgaW5zdGFsbAorICAgY29uY2VwdHMKKyAgIG9wZXJhdGlvbnMKKyAgIHVzYWdlCisgICByZWZzCisgICBtYW5wYWdlCisgICBjb25maWdmaWxlCisgICBzYWx0CisgICBhbnNpYmxlCisgICBwdXBwZXQKKyAgIGhhY2tpbmcKKyAgIHRvZG8KKyAgIGNoYW5nZWxvZworCitBYm91dCB0aGUgbmFtZQorLS0tLS0tLS0tLS0tLS0KKyJyZWNsYXNzIiBzdGFuZHMgZm9yICoqcioqXCBlY3Vyc2l2ZSAqKmUqKlwgeHRlcm5hbCBub2RlICoqY2xhc3MqKlwgaWZpZXIsCit3aGljaCBpcyBzb21ld2hhdCBvZiBhIG1pc25vbWVyLiBJIGNob3NlIHRoZSBuYW1lIHZlcnkgZWFybHkgb24sIGJhc2VkIG9uIHRoZQorcmVjdXJzaXZlIG5hdHVyZSBvZiB0aGUgZGF0YSBtZXJnaW5nLiBIb3dldmVyLCB0byB0aGUgdXNlciwgYSBiZXR0ZXIgcGFyYWRpZ20KK3dvdWxkIGJlICJoaWVyYXJjaGljYWwiLCBhcyBzL2hlIGRvZXMgbm90IGFuZCBzaG91bGQgbm90IGNhcmUgdG9vIG11Y2ggYWJvdXQKK3RoZSBpbXBsZW1lbnRhdGlvbiBpbnRlcm5hbHMuIEJ5IHRoZSB0aW1lIHRoYXQgSSByZWFsaXNlZCB0aGlzLCB1bmZvcnR1bmF0ZWx5LAorYEhpZXJhYF8gKFB1cHBldC1zcGVjaWZpYykgaGFkIGFscmVhZHkgb2NjdXBpZWQgdGhpcyBwcmVmaXguIE9oIHdlbGwuIE9uY2UgeW91CitzdGFydCB1c2luZyB8cmVjbGFzc3wsIHlvdSdsbCB0aGluayByZWN1cnNpdmVseSBhcyB3ZWxsIGFzIGhpZXJhcmNoaWNhbGx5IGF0Cit0aGUgc2FtZSB0aW1lLiBJdCdzIHJlYWxseSBxdWl0ZSBzaW1wbGUuCisKKy4uCisgIEluZGljZXMgYW5kIHRhYmxlcworICA9PT09PT09PT09PT09PT09PT0KKworICAqIDpyZWY6YGdlbmluZGV4YAorICAqIDpyZWY6YG1vZGluZGV4YAorICAqIDpyZWY6YHNlYXJjaGAKKworLi4gaW5jbHVkZTo6IGV4dHJlZnMuaW5jCisuLiBpbmNsdWRlOjogc3Vic3RzLmluYwpkaWZmIC0tZ2l0IGEvX3NvdXJjZXMvaW5zdGFsbC50eHQgYi9fc291cmNlcy9pbnN0YWxsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWZmZDlkCi0tLSAvZGV2L251bGwKKysrIGIvX3NvdXJjZXMvaW5zdGFsbC50eHQKQEAgLTAsMCArMSwxMDAgQEAKKz09PT09PT09PT09PQorSW5zdGFsbGF0aW9uCis9PT09PT09PT09PT0KKworRm9yIERlYmlhbiB1c2VycyAoaW5jbHVkaW5nIFVidW50dSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8cmVjbGFzc3wgaGFzIGJlZW4gYHBhY2thZ2VkIGZvciBEZWJpYW5gXy4gVG8gdXNlIGl0LCBqdXN0IGluc3RhbGwgaXQgd2l0aAorQVBUOjoKKworICAkIGFwdC1nZXQgaW5zdGFsbCByZWNsYXNzIFtyZWNsYXNzLWRvY10KKworLi4gX3BhY2thZ2VkIGZvciBEZWJpYW46IGh0dHA6Ly9wYWNrYWdlcy5kZWJpYW4ub3JnL3NlYXJjaD9rZXl3b3Jkcz1yZWNsYXNzCisKK0ZvciBBcmNoTGludXggdXNlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK3xyZWNsYXNzfCBpcyBgYXZhaWxhYmxlIGZvciBBcmNoTGludXhgXywgdGhhbmtzIHRvIE5pZWxzIEFic3BvZWwuCitEb3dsb2FkIHRoZSB0YXJiYWxsXyBmcm9tIGBgYXVyYGAgb3IgYGB5YW91cnRgYDo6CisKKyAgJCB5YW91cnQgLVMgcmVjbGFzcworCitvcjo6CisKKyAgJCB0YXIgeHZ6ZiByZWNsYXNzLWdpdC50YXIuZ3oKKyAgJCBjZCByZWNsYXNzLWdpdDsgbWFrZXBrZworICAkIHN1ZG8gcGFjbWFuIC1VIHJlY2xhc3MtZ2l0LTxnaXQtY29tbWl0LWhhc2g+LnRhci5negorCisuLiBfYXZhaWxhYmxlIGZvciBBcmNoTGludXg6IGh0dHBzOi8vYXVyLmFyY2hsaW51eC5vcmcvcGFja2FnZXMvcmVjbGFzcy1naXQvCisuLiBfdGFyYmFsbDogaHR0cHM6Ly9hdXIuYXJjaGxpbnV4Lm9yZy9wYWNrYWdlcy9yZS9yZWNsYXNzLWdpdC9yZWNsYXNzLWdpdC50YXIuZ3oKKworT3RoZXIgZGlzdHJpYnV0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLQorRGV2ZWxvcGVycyBvZiBvdGhlciBkaXN0cmlidXRpb25zIGFyZSBjb3JkaWFsbHkgaW52aXRlZCB0byBwYWNrYWdlIHxyZWNsYXNzfAordGhlbXNlbHZlcyBhbmQgYHdyaXRlIHRvIHRoZSBtYWlsaW5nIGxpc3QKKzxtYWlsdG86cmVjbGFzc0BwYW50c2Z1bGxvZnVuaXgubmV0PmBfIHRvIGhhdmUgZGV0YWlscyBpbmNsdWRlZCBoZXJlLiBPciBzZW5kCithIHBhdGNoIQorCitGcm9tIHNvdXJjZQorLS0tLS0tLS0tLS0KK3xyZWNsYXNzfCBpcyBjdXJyZW50bHkgbWFpbnRhaW5lZCBgb24gR2l0aHViCis8aHR0cDovL2dpdGh1Yi5jb20vbWFkZHVjay9yZWNsYXNzPmBfLCBzbyB0byBvYnRhaW4gdGhlIHNvdXJjZSwgcnVuOjoKKworICAkIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vbWFkZHVjay9yZWNsYXNzLmdpdAorCitvcjo6CisKKyAgJCBnaXQgY2xvbmUgc3NoOi8vZ2l0QGdpdGh1Yi5jb206bWFkZHVjay9yZWNsYXNzLmdpdAorCitJZiB5b3Ugd2FudCBhIHRhcmJhbGwsIHBsZWFzZSBgb2J0YWluIGl0IGZyb20gdGhlIERlYmlhbiBhcmNoaXZlYF8uCisKKy4uIF9vYnRhaW4gaXQgZnJvbSB0aGUgRGViaWFuIGFyY2hpdmU6IGh0dHA6Ly9odHRwLmRlYmlhbi5uZXQvZGViaWFuL3Bvb2wvbWFpbi9yL3JlY2xhc3MvCisKK0JlZm9yZSB5b3UgY2FuIHVzZSB8cmVjbGFzc3wsIHlvdSBuZWVkIHRvIGluc3RhbGwgaXQgaW50byBhIHBsYWNlIHdoZXJlIFB5dGhvbgorY2FuIGZpbmQgaXQuIFRoZSBmb2xsb3dpbmcgc3RlcCBzaG91bGQgaW5zdGFsbCB0aGUgcGFja2FnZSB0byBgYC91c3IvbG9jYWxgYDo6CisKKyAgJCBweXRob24gc2V0dXAucHkgaW5zdGFsbAorCitJZiB5b3Ugd2FudCB0byBpbnN0YWxsIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uLCB1c2UgLS1wcmVmaXggbGlrZSBzbzo6CisKKyAgJCBweXRob24gc2V0dXAucHkgaW5zdGFsbCAtLXByZWZpeD0vb3B0L2xvY2FsCisKKy4uIHRvZG86OgorCisgIFRoZXNlIHdpbGwgaW5zdGFsbCB0aGUgYGByZWNsYXNzLXNhbHRgYCBhbmQgYGByZWNsYXNzLWFuc2libGVgYCBhZGFwdGVycyB0bworICBgYCRwcmVmaXgvYmluYGAsIGJ1dCB0aGV5IHNob3VsZCBnbyB0byBgYCRwcmVmaXgvc2hhcmUvcmVjbGFzc2BgLiBIb3cgY2FuCisgIHNldHVwLnB5IGJlIHRvbGQgdG8gZG8gc28/IEl0IHdvdWxkIGJlIGJldHRlciBmb3IgY29uc2lzdGVuY3kgaWYgdGhpcyB3YXMKKyAgZG9uZSAidXBzdHJlYW0iLCByYXRoZXIgdGhhbiBmaXhlZCBieSB0aGUgZGlzdHJvcy4KKworSnVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgaW4gdGhlIFB5dGhvbiBtb2R1bGUgc2VhcmNoIHBhdGgsIHdoaWNoCit5b3UgY2FuIGNoZWNrIGxpa2UgdGhpczo6CisKKyAgJCBweXRob24gLWMgJ2ltcG9ydCBzeXM7IHByaW50IHN5cy5wYXRoJworCitNb3JlIG9wdGlvbnMgY2FuIGJlIGZvdW5kIGluIHRoZSBvdXRwdXQgb2YKKworOjoKKworICAkIHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsIC0taGVscAorICAkIHB5dGhvbiBzZXR1cC5weSAtLWhlbHAKKyAgJCBweXRob24gc2V0dXAucHkgLS1oZWxwLWNvbW1hbmRzCisgICQgcHl0aG9uIHNldHVwLnB5IC0taGVscCBbY21kXQorCitJZiB5b3UganVzdCB3YW50IHRvIHJ1biB8cmVjbGFzc3wgZnJvbSBzb3VyY2UsIGUuZy4gYmVjYXVzZSB5b3UgYXJlIGdvaW5nIHRvIGJlCittYWtpbmcgYW5kIHRlc3RpbmcgY2hhbmdlcywgaW5zdGFsbCBpdCBpbiAiZGV2ZWxvcG1lbnQgbW9kZSI6OgorCisgICQgcHl0aG9uIHNldHVwLnB5IGRldmVsb3AKKworVG8gdW5pbnN0YWxsICh0aGUgcm0gY2FsbCBpcyBuZWNlc3NhcnkgZHVlIHRvIGBhIGJ1ZyBpbiBzZXR1cHRvb2xzYF8pOjoKKworICAkIHB5dGhvbiBzZXR1cC5weSBkZXZlbG9wIC0tdW5pbnN0YWxsCisgICQgcm0gL3Vzci9sb2NhbC9iaW4vcmVjbGFzcyoKKworYFVuaW5zdGFsbGF0aW9uIGN1cnJlbnRseSBpc24ndCBwb3NzaWJsZWBfIGZvciBwYWNrYWdlcyBpbnN0YWxsZWQgdG8KKy91c3IvbG9jYWwgYXMgcGVyIHRoZSBhYm92ZSBtZXRob2QsIHVuZm9ydHVuYXRlbHkuIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGRvOjoKKworICAkIHJtIC1yIC91c3IvbG9jYWwvbGliL3B5dGhvbiovZGlzdC1wYWNrYWdlcy9yZWNsYXNzKiAvdXNyL2xvY2FsL2Jpbi9yZWNsYXNzKgorCisuLiBfYSBidWcgaW4gc2V0dXB0b29sczogaHR0cDovL2J1Z3MuZGViaWFuLm9yZy83MTQ5NjAKKy4uIF9Vbmluc3RhbGxhdGlvbiBjdXJyZW50bHkgaXNuJ3QgcG9zc2libGU6IGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU0NjczCisKKy4uIGluY2x1ZGU6OiBzdWJzdHMuaW5jCmRpZmYgLS1naXQgYS9fc291cmNlcy9tYW5wYWdlLnR4dCBiL19zb3VyY2VzL21hbnBhZ2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOWE0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9fc291cmNlcy9tYW5wYWdlLnR4dApAQCAtMCwwICsxLDU1IEBACis9PT09PT09PT09PT09PT0KK3JlY2xhc3MgbWFucGFnZQorPT09PT09PT09PT09PT09CisKK1N5bm9wc2lzCistLS0tLS0tLQorfCB8cmVjbGFzc3wgLS1oZWxwCit8IHxyZWNsYXNzfCAqW29wdGlvbnNdKiAtLWludmVudG9yeQorfCB8cmVjbGFzc3wgKltvcHRpb25zXSogLS1ub2RlaW5mbz1OT0RFTkFNRQorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKy4uIGluY2x1ZGU6OiBpbnRyby5pbmMKKworfHJlY2xhc3N8IHdpbGwgYmUgdXNlZCBpbmRpcmVjdGx5IHRocm91Z2ggYWRhcHRlcnMgbW9zdCBvZiB0aGUgdGltZS4gSG93ZXZlciwKK3RoZXJlIGV4aXN0cyBhIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgcXVlcnlpbmcgdGhlIGRhdGFiYXNlLiBUaGlzCittYW51YWwgcGFnZSBkZXNjcmliZXMgdGhpcyBpbnRlcmZhY2UuCisKK09wdGlvbnMKKy0tLS0tLS0KK1BsZWFzZSBzZWUgdGhlIG91dHB1dCBvZiBgYHJlY2xhc3MgLS1oZWxwYGAgZm9yIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGVzZQorb3B0aW9uczoKKworRGF0YWJhc2Ugb3B0aW9ucworJycnJycnJycnJycnJycnJworLXMsIC0tc3RvcmFnZS10eXBlICAgICAgICBUaGUgdHlwZSBvZiBzdG9yYWdlIGJhY2tlbmQgdG8gdXNlCistYiwgLS1pbnZlbnRvcnktYmFzZS11cmkgIFRoZSBiYXNlIFVSSSB0byBwcmVwZW5kIHRvIG5vZGVzIGFuZCBjbGFzc2VzCistdSwgLS1ub2Rlcy11cmkgICAgICAgICAgIFRoZSBVUkkgdG8gdGhlIG5vZGVzIHN0b3JhZ2UKKy1jLCAtLWNsYXNzZXMtdXJpICAgICAgICAgVGhlIFVSSSB0byB0aGUgY2xhc3NlcyBzdG9yYWdlCisKK091dHB1dCBvcHRpb25zCisnJycnJycnJycnJycnJworLW8sIC0tb3V0cHV0ICAgICAgICAgICAgICBUaGUgb3V0cHV0IGZvcm1hdCB0byB1c2UgKHlhbWwgb3IganNvbikKKy15LCAtLXByZXR0eS1wcmludCAgICAgICAgVHJ5IHRvIG1ha2UgdGhlIG91dHB1dCBwcmV0dGllcgorCitNb2RlcworJycnJycKKy1pLCAtLWludmVudG9yeSAgICAgICAgICAgT3V0cHV0IHRoZSBlbnRpcmUgaW52ZW50b3J5CistbiwgLS1ub2RlaW5mbyAgICAgICAgICAgIE91dHB1dCBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBub2RlCisKK0luZm9ybWF0aW9uCisnJycnJycnJycnJworLWgsIC0taGVscCAgICAgICAgICAgICAgICBIZWxwIG91dHB1dAorLS12ZXJzaW9uICAgICAgICAgICAgICAgICBEaXNwbGF5IHZlcnNpb24gbnVtYmVyCisKK1NlZSBhbHNvCistLS0tLS0tLQorUGxlYXNlIHZpc2l0IGh0dHA6Ly9yZWNsYXNzLnBhbnRzZnVsbG9mdW5peC5uZXQvIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cit8cmVjbGFzc3wuCisKK1RoZSBkb2N1bWVudGF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIGZyb20gdGhlIGBgLi9kb2NgYCBzdWJ0cmVlIGluIHRoZSBzb3VyY2UKK2NoZWNrb3V0LCBvciBmcm9tIGBgL3Vzci9zaGFyZS9kb2MvcmVjbGFzcy1kb2NgYC4KKworLi4gaW5jbHVkZTo6IHN1YnN0cy5pbmMKKy4uIGluY2x1ZGU6OiBleHRyZWZzLmluYwpkaWZmIC0tZ2l0IGEvX3NvdXJjZXMvb3BlcmF0aW9ucy50eHQgYi9fc291cmNlcy9vcGVyYXRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQ0MTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvX3NvdXJjZXMvb3BlcmF0aW9ucy50eHQKQEAgLTAsMCArMSwxNTEgQEAKKz09PT09PT09PT09PT09PT09PQorcmVjbGFzcyBvcGVyYXRpb25zCis9PT09PT09PT09PT09PT09PT0KKworWUFNTCBGUyBzdG9yYWdlCistLS0tLS0tLS0tLS0tLS0KK1doaWxlIHxyZWNsYXNzfCBoYXMgYmVlbiBidWlsdCB0byBzdXBwb3J0IGRpZmZlcmVudCBzdG9yYWdlIGJhY2tlbmRzIHRocm91Z2gKK3BsdWdpbnMsIGN1cnJlbnRseSBvbmx5IHRoZSBgYHlhbWxfZnNgYCBzdG9yYWdlIGJhY2tlbmQgZXhpc3RzLiBUaGlzIGlzIGEgdmVyeQorc2ltcGxlLCB5ZXQgcG93ZXJmdWwsIFlBTUwtYmFzZWQgYmFja2VuZCwgdXNpbmcgZmxhdCBmaWxlcyBvbiB0aGUgZmlsZXN5c3RlbQorKGFzIHN1Z2dlc3RlZCBieSB0aGUgYGBfZnNgYCBwb3N0Zml4KS4KKworYGB5YW1sX2ZzYGAgd29ya3Mgd2l0aCB0d28gZGlyZWN0b3JpZXMsIG9uZSBmb3Igbm9kZSBkZWZpbml0aW9ucywgYW5kIGFub3RoZXIKK2ZvciBjbGFzcyBkZWZpbml0aW9ucy4gVGhlIHR3byBkaXJlY3RvcmllcyBtdXN0IG5vdCBiZSB0aGUgc2FtZSwgbm9yIGNhbiBvbmUKK2JlIGEgcGFyZW50IG9mIHRoZSBvdGhlci4KKworRmlsZXMgaW4gdGhvc2UgZGlyZWN0b3JpZXMgYXJlIFlBTUwtZmlsZXMsIHNwZWNpZnlpbmcga2V5LXZhbHVlIHBhaXJzLiBUaGUKK2ZvbGxvd2luZyB0aHJlZSBrZXlzIGFyZSByZWFkIGJ5IHxyZWNsYXNzfDoKKworPT09PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0tleSAgICAgICAgICBEZXNjcmlwdGlvbgorPT09PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2NsYXNzZXMgICAgICBhIGxpc3Qgb2YgcGFyZW50IGNsYXNzZXMKK2FwcGxpYXRpb25zICBhIGxpc3Qgb2YgYXBwbGljYXRpb25zIHRvIGFwcGVuZCB0byB0aGUgYXBwbGljYXRpb25zIGRlZmluZWQgYnkKKyAgICAgICAgICAgICBhbmNlc3RvcnMuIElmIGFuIGFwcGxpY2F0aW9uIG5hbWUgc3RhcnRzIHdpdGggYGB+YGAsIGl0IHdvdWxkCisgICAgICAgICAgICAgcmVtb3ZlIHRoaXMgYXBwbGljYXRpb24gZnJvbSB0aGUgbGlzdCwgaWYgaXQgaGFkIGFscmVhZHkgYmVlbgorICAgICAgICAgICAgIGFkZGVkIOKAlCBidXQgaXQgZG9lcyBub3QgcHJldmVudCBhIGZ1dHVyZSBhZGRpdGlvbi4KKyAgICAgICAgICAgICBFLmcuIGBgfmZpcmV3YWxsZWRgYAorcGFyYW1ldGVycyAgIGtleS12YWx1ZSBwYWlycyB0byBzZXQgZGVmYXVsdHMgaW4gY2xhc3MgZGVmaW5pdGlvbnMsIG92ZXJyaWRlCisgICAgICAgICAgICAgZXhpc3RpbmcgZGF0YSwgb3IgcHJvdmlkZSBub2RlLXNwZWNpZmljIGluZm9ybWF0aW9uIGluIG5vZGUKKyAgICAgICAgICAgICBzcGVjaWZpY2F0aW9ucy4KKyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgQnkgY29udmVudGlvbiwgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIGFuIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgc2hvdWxkIGJlIHByb3ZpZGVkIGFzIHN1YmtleS12YWx1ZSBwYWlycywga2V5ZWQgYnkgdGhlIG5hbWUgb2YKKyAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24sIGUuZy46OgorCisgICAgICAgICAgICAgICAgYXBwbGljYXRpb25zOgorICAgICAgICAgICAgICAgIC0gc3NoLnNlcnZlcgorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6CisgICAgICAgICAgICAgICAgICBzc2guc2VydmVyOgorICAgICAgICAgICAgICAgICAgICBwZXJtaXRfcm9vdF9sb2dpbjogbm8KK2Vudmlyb25tZW50ICBvbmx5IHJlbGV2YW50IGZvciBub2RlcywgdGhpcyBhbGxvd3MgdG8gc3BlY2lmeSBhbiAiZW52aXJvbm1lbnQiCisgICAgICAgICAgICAgaW50byB3aGljaCB0aGUgbm9kZSBkZWZpbml0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIHBsYWNlLgorPT09PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ2xhc3NlcyBmaWxlcyBtYXkgcmVzaWRlIGluIHN1YmRpcmVjdG9yaWVzLCB3aGljaCBhY3QgYXMgbmFtZXNwYWNlcy4gRm9yCitpbnN0YW5jZSwgYSBjbGFzcyBgYHNzaC5zZXJ2ZXJgYCB3aWxsIHJlc3VsdCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiB0byBiZQorcmVhZCBmcm9tIGBgc3NoL3NlcnZlci55bWxgYC4gU3BlY2lmeWluZyBqdXN0IGBgc3NoYGAgd2lsbCBjYXVzZSB0aGUgY2xhc3MKK2RhdGEgdG8gYmUgcmVhZCBmcm9tIGBgc3NoL2luaXQueW1sYGAgb3IgYGBzc2gueW1sYGAuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgb25seQorb25lIG9mIHRob3NlIHR3byBtYXkgYmUgcHJlc2VudC4KKworTm9kZXMgbWF5IGFsc28gYmUgZGVmaW5lZCBpbiBzdWJkaXJlY3Rvcmllcy4gSG93ZXZlciwgbm9kZSBuYW1lcyAoZmlsZW5hbWUpCittdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIHN1YmRpcmVjdG9yaWVzLCBhbmQgfHJlY2xhc3N8IHdpbGwgZXhpdCB3aXRoIGFuCitlcnJvciBpZiBhIG5vZGUgaXMgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcy4gU3ViZGlyZWN0b3JpZXMgdGhlcmVmb3JlIHJlYWxseQorb25seSBleGlzdCBmb3IgdGhlIGFkbWluaXN0cmF0b3IncyBsb2NhbCBkYXRhIHN0cnVjdHVyaW5nLiBUaGV5IG1heSBiZSB1c2VkIGluCittYXBwaW5ncyAoc2VlIGJlbG93KSB0byB0YWcgYWRkaXRpb25hbCBjbGFzc2VzIG9udG8gbm9kZXMuCisKK0RhdGEgbWVyZ2luZworLS0tLS0tLS0tLS0tCit8cmVjbGFzc3wgaGFzIHR3byBtb2RlcyBvZiBvcGVyYXRpb246IG5vZGUgaW5mb3JtYXRpb24gcmV0cmlldmFsIGFuZCBpbnZlbnRvcnkKK2xpc3RpbmcuIFRoZSBzZWNvbmQgaXMgcmVhbGx5IGp1c3QgYSBsb29wIG9mIHRoZSBmaXJzdCBhY3Jvc3MgYWxsIGRlZmluZWQKK25vZGVzLCBhbmQgbmVlZHMgbm90IGJlIGZ1cnRoZXIgZGVzY3JpYmVkLgorCitXaGVuIHJldHJpZXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBub2RlLCB8cmVjbGFzc3wgZmlyc3Qgb2J0YWlucyB0aGUgbm9kZQorZGVmaW5pdGlvbiBmcm9tIHRoZSBzdG9yYWdlIGJhY2tlbmQuIFRoZW4sIGl0IGl0ZXJhdGVzIHRoZSBsaXN0IG9mIGNsYXNzZXMKK2RlZmluZWQgZm9yIHRoZSBub2RlIGFuZCByZWN1cnNpdmVseSBhc2tzIHRoZSBzdG9yYWdlIGJhY2tlbmQgZm9yIGVhY2ggY2xhc3MKK2RlZmluaXRpb24gKHVubGVzcyBhbHJlYWR5IGNhY2hlZCkuCisKK05leHQsIHxyZWNsYXNzfCByZWN1cnNpdmVseSBkZXNjZW5kcyBlYWNoIGNsYXNzLCBsb29raW5nIGF0IHRoZSBjbGFzc2VzIGl0CitkZWZpbmVzLCBhbmQgc28gb24sIHVudGlsIGEgbGVhZiBub2RlIGlzIHJlYWNoZWQsIGkuZS4gYSBjbGFzcyB0aGF0IHJlZmVyZW5jZXMKK25vIG90aGVyIGNsYXNzZXMuCisKK05vdywgdGhlIG1lcmdpbmcgc3RhcnRzLiBBdCBldmVyeSBzdGVwLCB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbnMgYW5kIHRoZSBzZXQKK29mIHBhcmFtZXRlcnMgYXQgZWFjaCBsZXZlbCBpcyBtZXJnZWQgaW50byB3aGF0IGhhcyBiZWVuIGFjY3VtdWxhdGVkIHNvIGZhci4KKworTWVyZ2luZyBvZiBwYXJhbWV0ZXJzIGlzIGRvbmUgImRlZXBseSIsIG1lYW5pbmcgdGhhdCBsaXN0cyBhbmQgZGljdGlvbmFyaWVzCithcmUgZXh0ZW5kZWQgKHJlY3Vyc2l2ZWx5KSwgcmF0aGVyIHRoYW4gcmVwbGFjZWQuIEhvd2V2ZXIsIGEgc2NhbGFyIHZhbHVlCisqZG9lcyogb3ZlcndyaXRlIGEgZGljdGlvbmFyeSBvciBsaXN0IHZhbHVlLiBXaGlsZSB0aGUgc2NhbGFyIGNvdWxkIGJlCithcHBlbmRlZCB0byBhbiBleGlzdGluZyBsaXN0LCB0aGVyZSBpcyBubyBzYW5lIGRlZmF1bHQgYXNzdW1wdGlvbiBpbiB0aGUKK2NvbnRleHQgb2YgYSBkaWN0aW9uYXJ5LCBzbyB0aGlzIGJlaGF2aW91ciBzZWVtcyB0aGUgbW9zdCBsb2dpY2FsLiBQbHVzLCBpdAorYWxsb3dzIGZvciBhIGRpY3Rpb25hcnkgdG8gYmUgZXJhc2VkIGJ5IG92ZXJ3cml0aW5nIGl0IHdpdGggdGhlIG51bGwgdmFsdWUuCisKK0FmdGVyIGFsbCBjbGFzc2VzIChhbmQgdGhlIGNsYXNzZXMgdGhleSByZWZlcmVuY2UpIGhhdmUgYmVlbiB2aXNpdGVkLAorfHJlY2xhc3N8IGZpbmFsbHkgbWVyZ2VzIHRoZSBhcHBsaWNhdGlvbnMgbGlzdCBhbmQgcGFyYW1ldGVycyBkZWZpbmVkIGZvciB0aGUKK25vZGUgaW50byB3aGF0IGhhcyBiZWVuIGFjY3VtdWxhdGVkIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgY2xhc3NlcywgYW5kCityZXR1cm5zIHRoZSBmaW5hbCByZXN1bHQuCisKK1dpbGRjYXJkL1JlZ2V4cCBtYXBwaW5ncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitVc2luZyB0aGUgOmRvYzpgY29uZmlndXJhdGlvbiBmaWxlIDxjb25maWdmaWxlPmAsIGl0IGlzIGFsc28gcG9zc2libGUgdG8KK3Byb3ZpZGUgYSBsaXN0IG1hcHBpbmdzIGJldHdlZW4gbm9kZSBuYW1lcyBhbmQgY2xhc3Nlcy4gRm9yIGluc3RhbmNlOjoKKworICBjbGFzc19tYXBwaW5nczoKKyAgICAtIFwqIGRlZmF1bHQKKyAgICAtIC9ed3d3XGQrLyB3ZWJzZXJ2ZXIKKyAgICAtIFwqLmNoIGhvc3RlZEBzd2l0emVybGFuZCBhbm90aGVyX2NsYXNzX3RvX3Nob3dfdGhhdF9pdF9jYW5fdGFrZV9saXN0cworCitUaGlzIHdpbGwgYXNzaWduIHRoZSBgYGRlZmF1bHRgYCBjbGFzcyB0byBhbGwgbm9kZXMgKG1ha2Ugc3VyZSB0byBlc2NhcGUKK2EgbGVhZGluZyBhc3RlcmlzayAoXCopIHRvIGtlZXAgWUFNTCBoYXBweSksIGBgd2Vic2VydmVyYGAgdG8gYWxsIG5vZGVzIG5hbWVkCitgYHd3dzFgYCBvciBgYHd3dzk5OWBgLCBhbmQgYGBob3N0ZWQtaW4tc3dpdHplcmxhbmRgYCB0byBhbGwgbm9kZXMgd2hvc2UgbmFtZXMKK2VuZCB3aXRoIGBgLmNoYGAgKGFnYWluLCBub3RlIHRoZSBlc2NhcGVkIGxlYWRpbmcgYXN0ZXJpc2spLiBNdWx0aXBsZSBjbGFzc2VzCitjYW4gYmUgYXNzaWduZWQgdG8gZWFjaCBtYXBwaW5nIGJ5IHByb3ZpZGluZyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IChjbGFzcworbmFtZXMgY2Fubm90IGNvbnRhaW4gc3BhY2VzIGFueXdheSkuCisKKy4uIHdhcm5pbmc6OgorCisgIFRoZSBjbGFzcyBtYXBwaW5ncyBkbyBub3QgcmVhbGx5IGJlbG9uZyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLCBhcyB0aGV5CisgIGFyZSBkYXRhLCBub3QgY29uZmlndXJhdGlvbiBpbm1mb3JtYXRpb24uIFRoZXJlZm9yZSwgdGhleSBhcmUgbGlrZWx5IGdvaW5nCisgIHRvIG1vdmUgZWxzZXdoZXJlLCBidXQgSSBoYXZlIG5vdCBxdWl0ZSBmaWd1cmVkIG91dCB0byB3aGVyZS4gTW9zdCBsaWtlbHksCisgIHRoZXJlIHdpbGwgYmUgYW4gYWRkaXRpb25hbCBmaWxlLCBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwgd2hpY2gKKyAgdGhlbiBsaXN0cyB0aGUgbWFwcGluZ3MuCisKK05vdGUgdGhhdCBtYXBwaW5ncyBhcmUgbm90IGRlc2lnbmVkIHRvIHJlcGxhY2Ugbm9kZSBkZWZpbml0aW9ucy4gTWFwcGluZ3MgY2FuCitiZSB1c2VkIHRvIHByZS1wb3B1bGF0ZSB0aGUgY2xhc3NlcyBvZiBleGlzdGluZyBub2RlcywgYnV0IHlvdSBzdGlsbCBuZWVkIHRvCitkZWZpbmUgYWxsIG5vZGVzIChhbmQgaWYgb25seSB0byBhbGxvdyB0aGVtIHRvIGJlIGVudW1lcmF0ZWQgZm9yIHRoZQoraW52ZW50b3J5KS4KKworVGhlIG1hcHBlZCBjbGFzc2VzIGNhbiBhbHNvIGNvbnRhaW4gYmFja3JlZmVyZW5jZXMgd2hlbiByZWd1bGFyIGV4cHJlc3Npb25zCithcmUgdXNlZCwgYWx0aG91Z2ggdGhleSBuZWVkIHRvIGJlIGVzY2FwZWQsIGUuZy46OgorCisgIGNsYXNzX21hcHBpbmdzOgorICAgIC0gL1wuKFxTKykkLyB0bGQtXFwxCisKK0Z1cnRoZXJtb3JlLCBzaW5jZSB0aGUgb3V0ZXIgc2xhc2hlcyAoJy8nKSBhcmUgdXNlZCB0byAicXVvdGUiIHRoZSByZWd1bGFyCitleHByZXNzaW9uLCAqYW55KiBzbGFzaGVzIHdpdGhpbiB0aGUgcmVndWxhciBleHByZXNzaW9uIG11c3QgYmUgZXNjYXBlZC4gRm9yCitpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBjbGFzcyBtYXBwaW5nIGFzc2lnbnMgYSBgYHN1YmRpci1YYGAgY2xhc3MgdG8gYWxsCitub2RlcyB0aGF0IGFyZSBkZWZpbmVkIGluIGEgc3ViZGlyZWN0b3J5ICh1c2luZyB5YW1sX2ZzKTo6CisKKyAgY2xhc3NfbWFwcGluZ3M6CisgICAgLSAvXihbXlwvXSspXC8vIHN1YmRpci1cXDEKKworUGFyYW1ldGVyIGludGVycG9sYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUGFyYW1ldGVycyBtYXkgcmVmZXJlbmNlIGVhY2ggb3RoZXIsIGluY2x1ZGluZyBkZWVwIHJlZmVyZW5jZXMsIGUuZy46OgorCisgIHBhcmFtZXRlcnM6CisgICAgbG9jYXRpb246IE11bmljaCwgR2VybWFueQorICAgIG1vdGQ6CisgICAgICBoZWFkZXI6IFRoaXMgbm9kZSBzaXRzIGluICR7bG9jYXRpb259CisgICAgZm9yX2RlbW9uc3RyYXRpb246ICR7bW90ZDpoZWFkZXJ9CisgICAgZGljdF9yZWZlcmVuY2U6ICR7bW90ZH0KKworQWZ0ZXIgbWVyZ2luZyBhbmQgaW50ZXJwb2xhdGlvbiwgd2hpY2ggaGFwcGVucyBhdXRvbWF0aWNhbGx5IGluc2lkZSB0aGUKK3N0b3JhZ2UgbW9kdWxlcywgdGhlIGBgZm9yX2RlbW9uc3RyYXRpb25gYCBwYXJhbWV0ZXIgd2lsbCBoYXZlIGEgdmFsdWUgb2YKKyJUaGlzIG5vZGUgc2l0cyBpbiBNdW5pY2gsIEdlcm1hbnkiLgorCitUeXBlcyBhcmUgcHJlc2VydmVkIGlmIHRoZSB2YWx1ZSBjb250YWlucyBub3RoaW5nIGJ1dCBhIHJlZmVyZW5jZS4gSGVuY2UsIHRoZQordmFsdWUgb2YgYGBkaWN0X3JlZmVyZW5jZWBgIHdpbGwgYWN0dWFsbHkgYmUgYSBkaWN0aW9uYXJ5LgorCitZb3Ugc2hvdWxkIG5vdyBiZSByZWFkeSB0byA6ZG9jOmB1c2UgcmVjbGFzcyA8dXNhZ2U+YCEKKworLi4gaW5jbHVkZTo6IHN1YnN0cy5pbmMKZGlmZiAtLWdpdCBhL19zb3VyY2VzL3B1cHBldC50eHQgYi9fc291cmNlcy9wdXBwZXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZGMwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9fc291cmNlcy9wdXBwZXQudHh0CkBAIC0wLDAgKzEsMTYgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT0KK1VzaW5nIHJlY2xhc3Mgd2l0aCBQdXBwZXQKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworLi4gdG9kbzo6CisKKyAgVGhlIGFkYXB0ZXIgYmV0d2VlbiB8cmVjbGFzc3wgYW5kIGBQdXBwZXRgXyBoYXMgbm90IGFjdHVhbGx5IGJlZW4gd3JpdHRlbiwKKyAgc2luY2UgSSByYWdlLXF1aXQgdXNpbmcgUHVwcGV0IGJlZm9yZSB0aGUgcmV3cml0ZSBvZiB8cmVjbGFzc3wuCisKKyAgSXQgc2hvdWxkIGJlIHRyaXZpYWwgdG8gZG8sIGFuZCBpZiB5b3UgbmVlZCBpdCBvciBhcmUgaW50ZXJlc3RlZCBpbiB3b3JraW5nCisgIG9uIGl0LCBhbmQgeW91IHJlcXVpcmUgYXNzaXN0YW5jZSwgcGxlYXNlIGdldCBpbiB0b3VjaCB3aXRoIG1lIGBvbiB0aGUKKyAgbWFpbGluZyBsaXN0IDxtYWlsdG86cmVjbGFzc0BwYW50c2Z1bGxvZnVuaXgubmV0PmBfLiBFbHNlIGp1c3Qgc2VuZCB0aGUKKyAgcGF0Y2ghCisKKy4uIGluY2x1ZGU6OiBleHRyZWZzLmluYworLi4gaW5jbHVkZTo6IHN1YnN0cy5pbmMKZGlmZiAtLWdpdCBhL19zb3VyY2VzL3JlZnMudHh0IGIvX3NvdXJjZXMvcmVmcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyMWI3OAotLS0gL2Rldi9udWxsCisrKyBiL19zb3VyY2VzL3JlZnMudHh0CkBAIC0wLDAgKzEsMjggQEAKKz09PT09PT09PT09PT09PT09PT0KK0V4dGVybmFsIHJlZmVyZW5jZXMKKz09PT09PT09PT09PT09PT09PT0KKworKiBJIGBwcmVzZW50ZWQgcmVjbGFzc2BfXyBhdCBgTENBIDIwMTRgXywgd2hpY2ggYXMgYmVlbiByZWNvcmRlZDoKKworICAqIChTbGlkZXMgZm9ydGhjb21pbmcpCisgICogYFZpZGVvIHJlY29yZGluZ2BfXworCitfXyBodHRwOi8vbGludXguY29uZi5hdS9zY2hlZHVsZS8zMDIwMy92aWV3X3RhbGs/ZGF5PXdlZG5lc2RheQorX18gaHR0cDovL21pcnJvci5saW51eC5vcmcuYXUvcHViL2xpbnV4LmNvbmYuYXUvMjAxNC9XZWRuZXNkYXkvNTktSGllcmFyY2hpY2FsX2luZnJhc3RydWN0dXJlX2Rlc2NyaXB0aW9uX2Zvcl95b3VyX3N5c3RlbV9tYW5hZ2VtZW50X25lZWRzXy1fTWFydGluX0tyYWZmdC5tcDQKKworLi4gX0xDQSAyMDE0OiBodHRwczovL2xjYTIwMTQubGludXgub3JnLmF1CisKKyogSSBnYXZlIGBhIHRhbGsgYWJvdXQgcmVjbGFzc2BfXyBhdCBgRGViQ29uZjEzYF8sIHdoaWNoIGhhcyBiZWVuIHJlY29yZGVkOgorCisgICogYFNsaWRlc2BfXworICAqIFZpZGVvIHJlY29yZGluZzogYGhpZ2ggcXVhbGl0eSAob2d2KWBfXyB8IGBoaWdoIHF1YWxpdHkgKHdlYm0pYF9fIHwgYGxvdyhlcikgcXVhbGl0eSAob2d2KWBfXworCitfXyBodHRwOi8vcGVudGEuZGViY29uZi5vcmcvZGMxM19zY2hlZHVsZS9ldmVudHMvMTA0OC5lbi5odG1sCitfXyBodHRwOi8vYW5uZXguZGViY29uZi5vcmcvZGViY29uZi1zaGFyZS9kZWJjb25mMTMvc2xpZGVzL3JlY2xhc3MucGRmCitfXyBodHRwOi8vbWVldGluZ3MtYXJjaGl2ZS5kZWJpYW4ubmV0L3B1Yi9kZWJpYW4tbWVldGluZ3MvMjAxMy9kZWJjb25mMTMvaGlnaC8xMDQ4X1JlY3Vyc2l2ZV9ub2RlX2NsYXNzaWZpY2F0aW9uX2Zvcl9zeXN0ZW1fYXV0b21hdGlvbi5vZ3YKK19fIGh0dHA6Ly9tZWV0aW5ncy1hcmNoaXZlLmRlYmlhbi5uZXQvcHViL2RlYmlhbi1tZWV0aW5ncy8yMDEzL2RlYmNvbmYxMy93ZWJtLWhpZ2gvMTA0OF9SZWN1cnNpdmVfbm9kZV9jbGFzc2lmaWNhdGlvbl9mb3Jfc3lzdGVtX2F1dG9tYXRpb24ud2VibQorX18gaHR0cDovL21lZXRpbmdzLWFyY2hpdmUuZGViaWFuLm5ldC9wdWIvZGViaWFuLW1lZXRpbmdzLzIwMTMvZGViY29uZjEzL2xvdy8xMDQ4X1JlY3Vyc2l2ZV9ub2RlX2NsYXNzaWZpY2F0aW9uX2Zvcl9zeXN0ZW1fYXV0b21hdGlvbi5vZ3YKKworLi4gX0RlYkNvbmYxMzogaHR0cDovL2RlYmNvbmYxMy5kZWJjb25mLm9yZworCisuLiBpbmNsdWRlOjogc3Vic3RzLmluYwpkaWZmIC0tZ2l0IGEvX3NvdXJjZXMvc2FsdC50eHQgYi9fc291cmNlcy9zYWx0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQzYzM1Ci0tLSAvZGV2L251bGwKKysrIGIvX3NvdXJjZXMvc2FsdC50eHQKQEAgLTAsMCArMSwyMTUgQEAKKz09PT09PT09PT09PT09PT09PT09PT09CitVc2luZyByZWNsYXNzIHdpdGggU2FsdAorPT09PT09PT09PT09PT09PT09PT09PT0KKworLi4gd2FybmluZzo6CisKKyAgWW91IG5lZWQgU2FsdCAwLjE3IHRvIHVzZSBgcmVjbGFzc2AsIGFzIG9sZGVyIHZlcnNpb25zIGRvIG5vdCBpbmNsdWRlIHRoZQorICBgcmVjbGFzc2AgYWRhcHRlci4gWW91IGNvdWxkIHVzZSB0aGUgYGBjbWRfeWFtbGBgIGFkYXB0ZXJzLCBidXQgYXQgbGVhc3QgZm9yCisgIGBgZXh0X3BpbGxhcmBgLCB0aGV5IGFyZSBjdXJyZW50bHkgbm90IHVzZWFibGUsIGFzIHRoZXkgYGRvIG5vdCBleHBvcnQgdGhlCisgIG1pbmlvbiBJRCB0byB0aGUgY29tbWFuZCB0aGV5IHJ1bmBfLgorCisuLiBfZG8gbm90IGV4cG9ydCB0aGUgbWluaW9uIElEIHRvIHRoZSBjb21tYW5kIHRoZXkgcnVuOgorICAgaHR0cHM6Ly9naXRodWIuY29tL3NhbHRzdGFjay9zYWx0L2lzc3Vlcy8yMjc2CisKK1F1aWNrIHN0YXJ0CistLS0tLS0tLS0tLQorVGhlIGZvbGxvd2luZyBzdGVwcyBzaG91bGQgZ2V0IHlvdSB1cCBhbmQgcnVubmluZyBxdWlja2x5IHdpdGggfHJlY2xhc3N8IGFuZAorYFNhbHRgXy4gWW91IHdpbGwgbmVlZCB0byBkZWNpZGUgZm9yIHlvdXJzZWxmIHdoZXJlIHRvIHB1dCB5b3VyIHxyZWNsYXNzfAoraW52ZW50b3J5LiBUaGlzIGNhbiBiZSB5b3VyIGZpcnN0IGBgYmFzZWBgIGBgZmlsZV9yb290YGAgKHRoZSBkZWZhdWx0KSwgb3IgaXQKK2NvdWxkIGJlIGBgL2V0Yy9yZWNsYXNzYGAsIG9yIGBgL3Nydi9zYWx0YGAuIFRoZSBmb2xsb3dpbmcgc2hhbGwgYXNzdW1lIHRoZQorbGF0dGVyLgorCitPciB5b3UgY2FuIGFsc28ganVzdCBsb29rIGludG8gYGAuL2V4YW1wbGVzL3NhbHRgYCBvZiB5b3VyIHxyZWNsYXNzfAorY2hlY2tvdXQgKGBgL3Vzci9zaGFyZS9kb2MvZXhhbXBsZXMvc2FsdGBgIG9uIERlYmlhbi1zeXN0ZW1zKSwgd2hlcmUgdGhlCitmb2xsb3dpbmcgc3RlcHMgaGF2ZSBhbHJlYWR5IGJlZW4gcHJlcGFyZWQuCisKKy/igKYvcmVjbGFzcyByZWZlcnMgdG8gdGhlIGxvY2F0aW9uIG9mIHlvdXIgfHJlY2xhc3N8IGNoZWNrb3V0LgorCisuLiB0b2RvOjoKKworICBXaXRoIHxyZWNsYXNzfCBub3cgaW4gRGViaWFuLCBhcyB3ZWxsIGFzIGluc3RhbGxhYmxlIGZyb20gc291cmNlLCB0aGUKKyAgZm9sbG93aW5nIHNob3VsZCBiZSBjaGVja2VkIGZvciBwYXRoIGNvbnNpc3RlbmN54oCmCisKKyMuIENvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gc3RlcHMgZGVzY3JpYmVkIGluIHRoZSA6ZG9jOmBpbnN0YWxsYXRpb24gc2VjdGlvbgorICAgPGluc3RhbGw+YC4KKworICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhbHNvIHRlbGwgU2FsdCB2aWEgdGhlIG1hc3RlciBjb25maWcgZmlsZSB3aGVyZSB0bworICAgbG9vayBmb3IgfHJlY2xhc3N8LCBidXQgdGhlbiB5b3Ugd29uJ3QgYmUgYWJsZSB0byBpbnRlcmFjdCB3aXRoCisgICB8cmVjbGFzc3wgdGhyb3VnaCB0aGUgY29tbWFuZCBsaW5lLgorCisjLiBDb3B5IHRoZSB0d28gZGlyZWN0b3JpZXMgYGBub2Rlc2BgIGFuZCBgYGNsYXNzZXNgYCBmcm9tIHRoZSBleGFtcGxlCisgICBzdWJkaXJlY3RvcnkgaW4gdGhlIHxyZWNsYXNzfCBjaGVja291dCB0byBlLmcuIGBgL3Nydi9zYWx0YGAuCisKKyAgIEl0J3MgaGFuZHkgdG8gc3ltbGluayB8cmVjbGFzc3wnIFNhbHQgYWRhcHRlciBpdHNlbGYgdG8gdGhhdCBkaXJlY3Rvcnk6OgorCisgICAgICAkIGxuIC1zIC91c3Ivc2hhcmUvcmVjbGFzcy9yZWNsYXNzLXNhbHQgL3Nydi9zYWx0L3N0YXRlcy9yZWNsYXNzCisKKyAgIEFzIHlvdSBjYW4gbm93IGp1c3QgaW5zcGVjdCB0aGUgZGF0YSByaWdodCB0aGVyZSBmcm9tIHRoZSBjb21tYW5kIGxpbmU6OgorCisgICAgICAkIC4vcmVjbGFzcyAtLXRvcAorCisgICBJZiB5b3UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzLCB5b3UgY2FuIGFsc28gbGV0IHxyZWNsYXNzfCBrbm93IHdoZXJlIHRvCisgICBsb29rIGZvciB0aGUgaW52ZW50b3J5IHdpdGggdGhlIGZvbGxvd2luZyBjb250ZW50cyBpbgorICAgYGAkSE9NRS9yZWNsYXNzLWNvbmZpZy55bWxgYDo6CisKKyAgICAgIHN0b3JhZ2VfdHlwZTogeWFtbF9mcworICAgICAgYmFzZV9pbnZlbnRvcnlfdXJpOiAvc3J2L3JlY2xhc3MKKworICAgT3IgeW91IGNhbiByZXVzZSB0aGUgZmlyc3QgZW50cnkgb2YgYGBmaWxlX3Jvb3RzYGAgdW5kZXIgYGBiYXNlYGAgaW4gdGhlIFNhbHQKKyAgIG1hc3RlciBjb25maWcuCisKKyAgIE5vdGUgdGhhdCBgYHlhbWxfZnNgYCBpcyBjdXJyZW50bHkgdGhlIG9ubHkgc3VwcG9ydGVkIGBgc3RvcmFnZV90eXBlYGAsIGFuZAorICAgaXQncyB0aGUgZGVmYXVsdCBpZiB5b3UgZG9uJ3Qgc2V0IGl0LgorCisjLiBDaGVjayBvdXQgeW91ciBpbnZlbnRvcnkgYnkgaW52b2tpbmcKKworICAgOjoKKworICAgICAgJCByZWNsYXNzLXNhbHQgLS10b3AKKworICAgd2hpY2ggc2hvdWxkIHJldHVybiBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGFsbCBkZWZpbmVkIG5vZGVzLCB3aGljaCBpcworICAgb25seSBgYGxvY2FsaG9zdGBgIGluIHRoZSBleGFtcGxlLiBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGluZm9ybWF0aW9uCisgICB0aGF0IHlvdSB3b3VsZCBrZWVwIGluIHlvdXIgYGB0b3Auc2xzYGAgZmlsZS4KKworICAgSWYgeW91IHN5bWxpbmtlZCB0aGUgc2NyaXB0IHRvIHlvdXIgaW52ZW50b3J5IGJhc2UgZGlyZWN0b3J5LCB1c2UKKworICAgOjoKKworICAgICAgJCAuL3JlY2xhc3MgLS10b3AKKworIy4gU2VlIHRoZSBwaWxsYXIgaW5mb3JtYXRpb24gZm9yIGBgbG9jYWxob3N0YGA6OgorCisgICAgICAkIHJlY2xhc3Mtc2FsdCAtLXBpbGxhciBsb2NhbGhvc3QKKworIy4gTm93IGFkZCB8cmVjbGFzc3wgdG8gYGAvZXRjL3NhbHQvbWFzdGVyYGAsIGxpa2Ugc286OgorCisgICAgICByZWNsYXNzOiAmcmVjbGFzcworICAgICAgICAgIGludmVudG9yeV9iYXNlX3VyaTogL3Nydi9zYWx0CisgICAgICAgICAgcmVjbGFzc19zb3VyY2VfcGF0aDogfi9jb2RlL3JlY2xhc3MKKworICAgICAgbWFzdGVyX3RvcHM6CisgICAgICAgICAgW+KApl0KKyAgICAgICAgICByZWNsYXNzOiAqcmVjbGFzcworCisgICAgICBleHRfcGlsbGFyOgorICAgICAgICAgIC0gcmVjbGFzczogKnJlY2xhc3MKKworICAgLi4gd2FybmluZzo6CisKKyAgICAgV2hlbiB1c2luZyBgYGV4dF9waWxsYXJgYCBhbmQvb3IgYGBtYXN0ZXJfdG9wc2BgLCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZQorICAgICB0aGF0IHlvdXIgYGBmaWxlX3Jvb3RzYGAgcGF0aHMgZG8gbm90IGNvbnRhaW4gYSBgYHRvcC5zbHNgYCBmaWxlLiBFdmVuCisgICAgIHRob3VnaCB0aGV5IG91Z2h0IHRvIGJlIGFibGUgdG8gY29leGlzdCwgdGhlcmUgYXJlIGEgZmV3IHNoYXJwIGVkZ2VzCisgICAgIGFyb3VuZCBhdCB0aGUgbW9tZW50LCBzbyBiZXdhcmUhCisKKyAgIElmIHlvdSBkaWQgbm90IGluc3RhbGwgfHJlY2xhc3N8IChidXQgeW91IGFyZSBydW5uaW5nIGl0IGZyb20gc291cmNlKSwKKyAgIHlvdSBjYW4gZWl0aGVyIHNwZWNpZnkgdGhlIHNvdXJjZSBwYXRoIGxpa2UgYWJvdmUsIG9yIHlvdSBjYW4gYWRkIGl0IHRvCisgICBgYFBZVEhPTlBBVEhgYCBiZWZvcmUgaW52b2tpbmcgdGhlIFNhbHQgbWFzdGVyLCB0byBlbnN1cmUgdGhhdCBQeXRob24gY2FuCisgICBmaW5kIGl0OjoKKworICAgICAgUFlUSE9OUEFUSD0v4oCmL3JlY2xhc3MgL2V0Yy9pbml0LmQvc2FsdC1tYXN0ZXIgcmVzdGFydAorCisjLiBQcm92aWRlZCB0aGF0IHlvdSBoYXZlIHNldCB1cCBgYGxvY2FsaG9zdGBgIGFzIGEgU2FsdCBtaW5pb24sIHRoZSBmb2xsb3dpbmcKKyAgIGNvbW1hbmRzIHNob3VsZCBub3cgcmV0dXJuIHRoZSBzYW1lIGRhdGEgYXMgYWJvdmUsIGJ1dCBwcm9jZXNzZWQgdGhyb3VnaAorICAgc2FsdDo6CisKKyAgICAgICQgc2FsdCBsb2NhbGhvc3QgcGlsbGFyLml0ZW1zICAgICAjIHNob3dzIGp1c3QgdGhlIHBhcmFtZXRlcnMKKyAgICAgICQgc2FsdCBsb2NhbGhvc3Qgc3RhdGUuc2hvd190b3AgICAjIHNob3dzIG9ubHkgdGhlIHN0YXRlcyAoYXBwbGljYXRpb25zKQorCisgICBBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgU2FsdCBtaW5pb24gcnVubmluZyB5ZXQ6OgorCisgICAgICAkIHNhbHQtY2FsbCBwaWxsYXIuaXRlbXMgICAgICMgc2hvd3MganVzdCB0aGUgcGFyYW1ldGVycworICAgICAgJCBzYWx0LWNhbGwgc3RhdGUuc2hvd190b3AgICAjIHNob3dzIG9ubHkgdGhlIHN0YXRlcyAoYXBwbGljYXRpb25zKQorCisjLiBZb3UgY2FuIGFsc28gaW52b2tlIHxyZWNsYXNzfCBkaXJlY3RseSwgd2hpY2ggZ2l2ZXMgYSBzbGlnaHRseSBkaWZmZXJlbnQKKyAgIHZpZXcgb250byB0aGUgc2FtZSBkYXRhLCBpLmUuIGJlZm9yZSBpdCBoYXMgYmVlbiBhZGFwdGVkIGZvciBTYWx0OjoKKworICAgICAgJCByZWNsYXNzIC0taW52ZW50b3J5CisgICAgICAkIHJlY2xhc3MgLS1ub2RlaW5mbyBsb2NhbGhvc3QKKworQ29uZmlndXJhdGlvbiBmaWxlIGFuZCBtYXN0ZXIgY29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRXZlbiB0aG91Z2ggdGhlIFNhbHQgYWRhcHRlciBvZiB8cmVjbGFzc3wgbG9va3MgZm9yIGFuZCByZWFkcyB0aGUKKzpkb2M6YGNvbmZpZ3VyYXRpb24gZmlsZSA8Y29uZmlnZmlsZT5gLCBhIGJldHRlciBtZWFucyB0byBwYXNzIGluZm9ybWF0aW9uIHRvCit0aGUgYWRhcHRlciBpcyB2aWEgU2FsdCdzIG1hc3RlciBjb25maWd1cmF0aW9uIGZpbGUsIGFzIHNob3duIGFib3ZlLiBOb3QgYWxsCitjb25maWd1cmF0aW9uIG9wdGlvbnMgY2FuIGJlIHBhc3NlZCB0aGlzIHdheSAoZS5nLiBgYG91dHB1dGBgIGlzIGhhcmRjb2RlZCB0bworWUFNTCwgd2hpY2ggU2FsdCB1c2VzKSwgYnV0IGl0ICppcyogcG9zc2libGUgdG8gc3BlY2lmeSA6ZG9jOmBjbGFzcyBtYXBwaW5ncworPG9wZXJhdGlvbnM+YCBuZXh0IHRvIGFsbCB0aGUgc3RvcmFnZS1zcGVjaWZpYyBvcHRpb25zLgorCisuLiB3YXJuaW5nOjoKKworICBUaGUgU2FsdCBDTEkgYWRhcHRlciBkb2VzICpub3QqIHJlYWQgU2FsdCdzIG1hc3RlciBjb25maWd1cmF0aW9uLCBzbyBpZiB5b3UKKyAgYXJlIGNhbGxpbmcgYGByZWNsYXNzLXNhbHRgYCBmcm9tIHRoZSBjb21tYW5kLWxpbmUgKHRoZSBDTEkgZXhpc3RzIGZvcgorICBkZWJ1Z2dpbmcgcHVycG9zZXMsIG1haW5seSksIGJlIGF3YXJlIHRoYXQgaXQgd2lsbCBiZSBydW4gaW4gYSBkaWZmZXJlbnQKKyAgZW52aXJvbm1lbnQgdGhhbiB3aGVuIFNhbHQgcXVlcmllcyByZWNsYXNzIGRpcmVjdGx5LgorCitJbnRlZ3JhdGlvbiB3aXRoIFNhbHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfHJlY2xhc3N8IGhvb2tzIGludG8gU2FsdCBhdCB0d28gZGlmZmVyZW50IHBvaW50czogYGBtYXN0ZXJfdG9wc2BgIGFuZAorYGBleHRfcGlsbGFyYGAuIEZvciBib3RoLCBTYWx0IHByb3ZpZGVzIHBsdWdpbnMuIFRoZXNlIHBsdWdpbnMgbmVlZCB0byBrbm93Cit3aGVyZSB0byBmaW5kIHxyZWNsYXNzfCwgc28gaWYgfHJlY2xhc3N8IGlzIG5vdCBwcm9wZXJseSBpbnN0YWxsZWQgKGJ1dAoreW91IGFyZSBydW5uaW5nIGl0IGZyb20gc291cmNlKSwgbWFrZSBzdXJlIHRvIGV4cG9ydCBgYFBZVEhPTlBBVEhgYAorYWNjb3JkaW5nbHkgYmVmb3JlIHlvdSBzdGFydCB5b3VyIFNhbHQgbWFzdGVyLCBvciBzcGVjaWZ5IHRoZSBwYXRoIGluIHRoZQorbWFzdGVyIGNvbmZpZ3VyYXRpb24gZmlsZSwgYXMgc2hvdyBhYm92ZS4KKworU2FsdCBoYXMgbm8gY29uY2VwdCBvZiAibm9kZXMiLCAiYXBwbGljYXRpb25zIiwgInBhcmFtZXRlcnMiLCBhbmQgImNsYXNzZXMiLgorVGhlcmVmb3JlIGl0IGlzIG5lY2Vzc2FyeSB0byBleHBsYWluIGhvdyB0aG9zZSBjb3JyZXNwb25kIHRvIFNhbHQuIENydWRlbHksCit0aGUgZm9sbG93aW5nIG1hcHBpbmcgZXhpc3RzOgorCis9PT09PT09PT09PT09PT09PSA9PT09PT09PT09PT09PT09Cit8cmVjbGFzc3wgY29uY2VwdCBTYWx0IHRlcm1pbm9sb2d5Cis9PT09PT09PT09PT09PT09PSA9PT09PT09PT09PT09PT09Citub2RlcyAgICAgICAgICAgICBob3N0cworY2xhc3NlcyAgICAgICAgICAgKG5vbmUpIFsjbm9kZWdyb3Vwc11fCithcHBsaWNhdGlvbnMgICAgICBzdGF0ZXMKK3BhcmFtZXRlcnMgICAgICAgIHBpbGxhcgorZW52aXJvbm1lbnQgICAgICAgZW52aXJvbm1lbnQKKz09PT09PT09PT09PT09PT09ID09PT09PT09PT09PT09PT0KKworLi4gWyNub2RlZ3JvdXBzXSBTZWUgYFNhbHQgaXNzdWUgIzU3ODdgXyBmb3Igc3RlcHMgaW50byB0aGUgZGlyZWN0aW9uIG9mIGxldHRpbmcKKyAgIHxyZWNsYXNzfCBwcm92aWRlIG5vZGVncm91cCBpbmZvcm1hdGlvbi4KKworLi4gX1NhbHQgaXNzdWUgIzU3ODc6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYWx0c3RhY2svc2FsdC9pc3N1ZXMvNTc4NworCitXaGF0ZXZlciBhcHBsaWNhdGlvbnMgeW91IGRlZmluZSBmb3IgYSBub2RlIHdpbGwgYmVjb21lIHN0YXRlcyBhcHBsaWNhYmxlIHRvCithIGhvc3QuIElmIHRob3NlIGFwcGxpY2F0aW9ucyBhcmUgYWRkZWQgdmlhIGFuY2VzdG9yIGNsYXNzZXMsIHRoZW4gdGhhdCdzCitmaW5lLCBidXQgY3VycmVudGx5LCBTYWx0IGRvZXMgbm90IGRvIGFueXRoaW5nIHdpdGggdGhlIGNsYXNzZXMgYW5jZXN0cnkuCisKK1NpbWlsYXJseSwgYWxsIHBhcmFtZXRlcnMgdGhhdCBhcmUgY29sbGVjdGVkIGFuZCBtZXJnZWQgZXZlbnR1YWxseSBlbmQgdXAgaW4KK3RoZSBwaWxsYXIgZGF0YSBvZiBhIHNwZWNpZmljIG5vZGUuCisKK1RoZSBwaWxsYXIgZGF0YSBvZiBhIG5vZGUgaW5jbHVkZSBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGNsYXNzZXMgYW5kCithcHBsaWNhdGlvbnMsIHNvIHlvdSBjb3VsZCB0aGVvcmV0aWNhbGx5IHVzZSB0aGVtIHRvIHRhcmdldCB5b3VyIFNhbHQgY2FsbHMgYXQKK2dyb3VwcyBvZiBub2RlcyBkZWZpbmVkIGluIHRoZSB8cmVjbGFzc3wgaW52ZW50b3J5LCBlLmcuCisKKzo6CisKKyAgc2FsdCAtSSBfX3JlY2xhc3NfXzpjbGFzc2VzOnNhbHRfbWluaW9uIHRlc3QucGluZworCitVbmZvcnR1bmF0ZWx5LCB0aGlzIGRvZXMgbm90IHdvcmsgeWV0LCBwbGVhc2Ugc3RheSB0dW5lZCwgYW5kIGxldCBtZSBrbm93CitpZiB5b3UgZmlndXJlIG91dCBhIHdheS4gYFNhbHQgaXNzdWUgIzU3ODdgXyBpcyBhbHNvIG9mIHJlbGV2YW5jZS4KKworT3B0aW9uYWxseSwgZGF0YSBmcm9tIHBpbGxhcnMgdGhhdCBydW4gYmVmb3JlIHRoZSB8cmVjbGFzc3wgYGBleHRfcGlsbGFyYGAKKyhpLmUuIFNhbHQncyBidWlsdGluIGBgcGlsbGFyX3Jvb3RzYGAsIGFzIHdlbGwgYXMgb3RoZXIgYGBleHRfcGlsbGFyYGAgbW9kdWxlcworbGlzdGVkIGJlZm9yZSB0aGUgYGByZWNsYXNzX2FkYXB0ZXJgYCkgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHxyZWNsYXNzfC4KK1BsZWFzZSB1c2UgdGhpcyB3aXRoIGNhdXRpb24gYXMgcmVmZXJlbmNpbmcgZGF0YSBmcm9tIFNhbHQgaW4gdGhlIGludmVudG9yeQord2lsbCBtYWtlIGl0IGhhcmRlciBvciBpbXBvc3NpYmxlIHRvIHJ1biB8cmVjbGFzc3wgaW4gb3RoZXIgZW52aXJvbm1lbnRzLiBUaGlzCitmZWF0dXJlIGlzIHRoZXJlZm9yZSB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgZXhwbGljaXRseSBlbmFibGVkIGluCit0aGUgU2FsdCBtYXN0ZXIgY29uZmlndXJhdGlvbiBmaWxlLCBsaWtlIHRoaXM6OgorCisgIGV4dF9waWxsYXI6CisgICAgLSByZWNsYXNzOgorICAgICAgICBb4oCmXQorICAgICAgICBwcm9wYWdhdGVfcGlsbGFyX2RhdGFfdG9fcmVjbGFzczogVHJ1ZQorCitVbmZvcnR1bmF0ZWx5LCB0byB1c2UgdGhpcywgY3VycmVudGx5IHlvdSBjYW5ub3QgdXNlIFlBTUwgcmVmZXJlbmNlcyAoaS5lLgorYGAqcmVjbGFzc2BgKSBhcyBzaG93biBhYm92ZSwgYXMgdGhlIGBgbWFzdGVyX3RvcHNgYCBzdWJzeXN0ZW0gZG9lcyBub3QgYWNjZXB0Cit0aGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLCBhbmQgdGhlcmUgc2VlbXMgdG8gYmUgbm8gd2F5IHRvIGV4dGVuZCBhbiBhbGlhcy4KK1NwZWNpZmljYWxseSwgdGhlIGZvbGxvd2luZyBpcyBub3QgcG9zc2libGUg4oCUIGxldCBtZSBrbm93IGlmIGl0IGlzITo6CisKKyAgZXh0X3BpbGxhcjoKKyAgICAtIHJlY2xhc3M6ICpyZWNsYXNzICAgICMgV0FSTklORzogdGhpcyBkb2VzIG5vdCB3b3JrIQorICAgICAgICBwcm9wYWdhdGVfcGlsbGFyX2RhdGFfdG9fcmVjbGFzczogVHJ1ZQorCisuLiBpbmNsdWRlOjogc3Vic3RzLmluYworLi4gaW5jbHVkZTo6IGV4dHJlZnMuaW5jCmRpZmYgLS1naXQgYS9fc291cmNlcy90b2RvLnR4dCBiL19zb3VyY2VzL3RvZG8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDhkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9fc291cmNlcy90b2RvLnR4dApAQCAtMCwwICsxLDE1MCBAQAorPT09PT09PT09PT09PT09PT09CityZWNsYXNzIHRvLWRvIGxpc3QKKz09PT09PT09PT09PT09PT09PQorCitDb21tb24gc2V0IG9mIGNsYXNzZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBsb3Qgb2YgdGhlIGNsYXNzZXMgSSBoYXZlIHNldCB1cCBkdXJpbmcgdGhlIHZhcmlvdXMgc3RhZ2VzIG9mIGRldmVsb3BtZW50IG9mCit8cmVjbGFzc3wgYXJlIGdlbmVyaWMuIEl0IHdvdWxkIHByb2JhYmx5IGJlIHNlbnNpYmxlIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgYXMKK3BhcnQgb2YgfHJlY2xhc3N8LCB0byBnaXZlIHBlb3BsZSBhIGNvbW1vbiBiYXNlbGluZSB0byB3b3JrIGZyb20sIGFuZCB0bworZW5zdXJlIGEgY2VydGFpbiBsZXZlbCBvZiBjb25zaXN0ZW5jeSBiZXR3ZWVuIHVzZXJzLgorCitUaGlzIGNvdWxkIGFsc28gcHJvdmlkZSBhIG1vcmUgcmVhbGlzdGljIGV4YW1wbGUgdG8gdXNlcnMgb24gaG93IHRvIHVzZQorfHJlY2xhc3N8LgorCitUZXN0aW5nIGZyYW1ld29yaworLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGlzIHJ1ZGltZW50YXJ5IHRlc3RpbmcgaW4gcGxhY2UsIGJ1dCBpdCdzIGluY29uc2lzdGVudC4gSSBnb3QKK3NpZGUtdHJhY2tlZCBpbnRvIGRpc2N1c3Npb25zIGFib3V0IHRoZSBwaGlsb3NwaHkgb2YgbW9ja2luZyBvYmplY3RzLiBUaGlzCitjb3VsZCBhbGwgYmUgZml4ZWQgYW5kIHVuaWZpZWQuCisKK0Fsc28sIHN0b3JhZ2UsIG91dHB1dHRlcnMsIENMSSBhbmQgYWRhcHRlcnMgaGF2ZSBhYnNvbHV0ZWx5IG5vIHRlc3RzIHlldOKApgorCitUaGUgdGVzdGluZyBmcmFtZXdvcmsgc2hvdWxkIGFsc28gaW5jb3Jwb3JhdGUgdGhlIGV4YW1wbGUgY2xhc3NlcyBtZW50aW9uZWQKK2Fib3ZlLgorCitDb25maWd1cmFibGUgZmlsZSBleHRlbnNpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmlnaHQgbm93LCBgYC55bWxgYCBpcyBoYXJkLWNvZGVkLiBUaGlzIGNvdWxkIGJlIGV4cG9ydGVkIHRvIHRoZQorY29uZmlndXJhdGlvbiBmaWxlLCBvciBldmVuIGdpdmVuIGFzIGEgbGlzdCwgc28gdGhhdCBgYC55bWxgYCBhbmQgYGAueWFtbGBgCitjYW4gYm90aCBiZSB1c2VkLgorCitBY3R1YWxseSwgSSBkb24ndCB0aGluayB0aGlzIGlzIHN1Y2ggYSBnb29kIGlkZWEuIElmIHdlIGNyZWF0ZSB0b28gbWFueQorb3B0aW9ucyByaWdodCBub3csIGl0J2xsIGJlIGhhcmRlciB0byB1bmlmeSBsYXRlci4gUGxlYXNlIGFsc28gc2VlIGBpc3N1ZSAjMTcKKzxodHRwczovL2dpdGh1Yi5jb20vbWFkZHVjay9yZWNsYXNzL2lzc3Vlcy8xN2BfIGZvciBhIGRpc2N1c3Npb24gYWJvdXQgdGhpcy4KKworVmVyYm9zaXR5LCBkZWJ1Z2dpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitWZXJib3NlIG91dHB1dCBhbmQgZGVidWcgbG9nZ2luZyB3b3VsZCBiZSBhIHZlcnkgdXNlZnVsIGFkZGl0aW9uIHRvIGhlbHAKK3Blb3BsZSB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbiwgd2hlcmUgZGF0YSBhcmUgYmVpbmcgY2hhbmdlZC9tZXJnZWQsIGFuZCB0bworaGVscCBzb2x2ZSBwcm9ibGVtcy4KKworRGF0YSBmcm9tIENNUyBmb3IgaW50ZXJwb2xhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRGVwZW5kaW5nIG9uIHRoZSBDTVMgaW4gcXVlc3Rpb24sIGl0IHdvdWxkIGJlIG5pY2UgaWYgfHJlY2xhc3N8IGhhZCBhY2Nlc3MgdG8KK3RoZSBob3N0LXNwZWNpZmljIGRhdGEgKGZhY3RzLCBncmFpbnMsIGV0Yy4pIGFuZCBjb3VsZCB1c2UgdGhvc2UgaW4gcGFyYW1ldGVyCitpbnRlcnBvbGF0aW9uLiBJIGNhbiBpbWFnaW5lIHRoaXMgd29ya2luZyBmb3IgU2FsdCwgd2hlcmUgdGhlIGBgZ3JhaW5zYGAKK2RpY3Rpb25hcnkgKGFuZCByZXN1bHRzIGZyb20gcHJldmlvdXMgZXh0ZXJuYWwgbm9kZSBjbGFzc2lmaWVycykgaXMgbWFkZQorYXZhaWxhYmxlIHRvIHRoZSBleHRlcm5hbCBub2RlIGNsYXNzaWZpZXJzLCBidXQgSSBhbSBub3QgY29udmluY2VkIHRoaXMgd2lsbAorYmUgcG9zc2libGUgaW4gQW5zaWJsZSBhbmQgUHVwcGV0LgorCitPbiB0aGUgb3RoZXIgaGFuZCwgcHJvdmlkaW5nIENNUy1zcGVjaWZpYyBkYXRhIHRvIHJlY2xhc3Mgd2lsbCBtYWtlIHBlb3BsZQorZGVwZW5kIG9uIGl0LCBtZWFuaW5nIFNhbHQgY2Fubm90IGJlIHVzZWQgd2l0aCBtdWx0aXBsZSB0b29scyBhbnltb3JlLgorCitUaGUgd2F5IHRvIGRlYWwgd2l0aCB0aGF0IHdvdWxkIGJlIHRvIG1hcCBncmFpbnMsIGZhY3RzLCB3aGF0ZXZlciB0aGUgQ01TCitjYWxscyB0aGVtLCB0byBhIHNoYXJlZCBuYW1pbmcgc2NoZW1lL3RheG9ub215LCBidXQgdGhhdCdzIGEgcGFpbmZ1bCB0YXNrLAorSSB0aGluay4gSXQgd291bGQgbWVhbiwgaG93ZXZlciwgdGhhdCBldmVuIHRlbXBsYXRlcyBjb3VsZCBiZSBzaGFyZWQgYmV0d2VlbgorQ01TcyBpZiB0aGV5IG9ubHkgdXNlIHRoZSBkYXRhIHByb3ZpZGVkIGJ5IHJlY2xhc3MgKGkuZS4gZ3JhaW5zL2ZhY3RzIGJlY29tZQorcGlsbGFyIGRhdGEpLgorCitNZW1iZXJzaGlwIGluZm9ybWF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJdCB3b3VsZCBiZSBuaWNlIGlmIHxyZWNsYXNzfCBjb3VsZCBwcm92aWRlIGUuZy4gdGhlIE5hZ2lvcyBtYXN0ZXIgbm9kZSB3aXRoCithIGxpc3Qgb2YgY2xpZW50cyB0aGF0IGRlZmluZSBpdCBhcyB0aGVpciBtYXN0ZXIuIFRoYXQgd291bGQgc2hvcnQtY2lyY3VpdAorUHVwcGV0J3MgYGBzdG9yZWNvbmZpZ3NgYCBhbmQgU2FsdCdzIGBgbWluZWBgLgorCitUaGUgd2F5IEkgZW52aXNpb24gdGhpcyBjdXJyZW50bHkgaXMgdG8gcHJvdmlkZSBzb21ldGhpbmcgSSBjYWxsICJpbnZlbnRvcnkKK3F1ZXJpZXMiLiBGb3IgaW5zdGFuY2UsIHRoZSBOYWdpb3MgbWFzdGVyIG5vZGUncyByZWNsYXNzIGRhdGEgd291bGQgY29udGFpbgordGhlIGZvbGxvd2luZyAoYGAkW+KApl1gYCB3b3VsZCBkZW5vdGUgaW50ZXJwb2xhdGlvbiB0byBjcmVhdGUgYSBsaXN0LCBhIGJpdAorbGlrZSBsaXN0IGNvbXByZWhlbnNpb24pOjoKKworICBwYXJhbWV0ZXJzOgorICAgIG5hZ2lvczoKKyAgICAgIGhvc3RzOiAkW25hZ2lvczptYXN0ZXIgPT0gU0VMRi5ub2RlbmFtZV0KKworVGhpcyB3b3VsZCBjYXVzZSB8cmVjbGFzc3wgdG8gaXRlcmF0ZSB0aGUgaW52ZW50b3J5IGFuZCBnZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsCit0aGUgbm9kZXMgdGhhdCBkZWZpbmUgYSBwYXJhbWV0ZXIgYGBuYWdpb3M6bWFzdGVyYGAgd2hvc2UgdmFsdWUgZXF1YWxzIHRvIHRoZQorbmFtZSBvZiB0aGUgY3VycmVudCBub2RlLgorCitUaGlzIGNvdWxkIGJlIGdyZWF0bHkgc2ltcGxpZmllZC4gRm9yIGluc3RhbmNlLCB3ZSBjb3VsZCBzaW1wbHkgbGltaXQKK2NvbXBhcmlzb25zIGFnYWluc3QgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQganVzdCBzcGVjaWZ5CisKKzo6CisKKyAgJFtuYWdpb3M6bWFzdGVyXQorCit3aGljaCB3b3VsZCBiZSBleHBhbmRlZCB0byBhIGxpc3Qgb2Ygbm9kZSBuYW1lcyB3aG9zZSBwaWxsYXIgZGF0YSBpbmNsdWRlcworYGAke25hZ2lvczptYXN0ZXJ9YGAgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IG5vZGUncyBuYW1lLgorCitPciBpdCBjb3VsZCBiZSBtYWRlIGFyYml0cmFyaWx5IGNvbXBsZXggYW5kIGZsZXhpYmxlLCBlLmcuIGFueSBvZiB0aGUKK2ZvbGxvd2luZzo6CisKKyAgJFtuYWdpb3M6bWFzdGVyID09IFNFTEYubm9kZW5hbWVdICAgICAgICAgICAgICAgICAgIyByZXBsYWNlIHdpdGggbm9kZW5hbWUKKyAgJFtuYWdpb3M6bWFzdGVyID09IFNFTEYubm9kZW5hbWUgfCBub2RlbmFtZV0gICAgICAgIyBuYW1lIHJlcGxhY2VtZW50IHZhbHVlCisgICRbbmFnaW9zOm1hc3RlciA9PSBTRUxGLm5vZGVuYW1lIHwgbmFnaW9zOm5vZGVpZF0gICMgcmVwbGFjZSB3aXRoIHBpbGxhciBkYXRhCisgICRbeDpuYWdpb3M6bm9kZWlkIGZvcmVhY2ggeCB8IHg6bmFnaW9zOm1hc3RlciA9PSBTRUxGLm5vZGVuYW1lXQorICDigKYKKworSSdkIHJhdGhlciBub3QgY29kZSB0aGlzIHVwIGZyb20gc2NyYXRjaCwgc28gSSBhbSBsb29raW5nIGZvciBpZGVhcyBmb3IgcmV1c2XigKYKKworQ29uZmlndXJhdGlvbiBmaWxlIGxvb2t1cCBpbXByb3ZlbWVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSaWdodCBub3csIHRoZSBhZGFwdGVycyBhbmQgdGhlIENMSSBsb29rIGZvciB0aGUgOmRvYzpgY29uZmlndXJhdGlvbiBmaWxlCis8Y29uZmlnZmlsZT5gIGluIGEgZml4ZWQgc2V0IG9mIGxvY2F0aW9ucy4gT24gb2YgdGhvc2UgZGVyaXZlcyBmcm9tCitgYE9QVF9JTlZFTlRPUllfQkFTRV9VUklgYCwgdGhlIGRlZmF1bHQgaW52ZW50b3J5IGJhc2UgVVJJIChgYC9ldGMvcmVjbGFzc2BgKS4KK1RoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHVwZGF0ZWQgaW4gY2FzZSB0aGUgdXNlciBjaGFuZ2VzIHRoZSBVUkkuCisKK0Z1cnRoZXJtb3JlLCBgYCRDV0RgYCBhbmQgYGB+YGAgbWlnaHQgbm90IG1ha2UgYSBsb3Qgb2Ygc2Vuc2UgaW4gYWxsCit1c2UtY2FzZXMuCisKK0hvd2V2ZXIsIHRoaXMgbWlnaHQgYmUgYmV0dGVyIGFkZHJlc3NlZCBieSB0aGUgZm9sbG93aW5nIHBvaW50OgorCitBZGFwdGVyIGNsYXNzIGhpZXJhcmNoeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0F0IHRoZSBtb21lbnQsIGFkYXB0ZXJzIGFyZSBqdXN0IGltcGVyYXRpdmUgY29kZS4gSXQgbWlnaHQgbWFrZSBtb3JlIHNlbnNlIHRvCit3cmFwIHRoZW0gaW4gY2xhc3Nlcywgd2hpY2ggY3VzdG9taXNlIHRoaW5ncyBsaWtlIGNvbW1hbmQtbGluZSBhbmQgY29uZmlnIGZpbGUKK3BhcnNpbmcuCisKK09uZSBuaWNlIHdheSB3b3VsZCBiZSB0byBnZW5lcmFsaXNlIGNvbmZpZ3VyYXRpb24gZmlsZSByZWFkaW5nLCBpbnRlZ3JhdGUgaXQKK3dpdGggY29tbWFuZC1saW5lIHBhcnNpbmcsIGFuZCB0aGVuIGFsbG93IHRoZSBjb25zdW1lcnMgKHRoZSBhZGFwdGVycykgdG8KK2NvbmZpZ3VyZSB0aGVtLCBmb3IgaW5zdGFuY2UsIGluIHRoZSBTYWx0IGFkYXB0ZXI6OgorCisgIGNvbmZpZ19wcm94eSA9IENvbmZpZ1Byb3h5KCkKKyAgY29uZmlnX3Byb3h5LnNldF9jb25maWdmaWxlX3NlYXJjaF9wYXRoKFsnL2V0Yy9yZWNsYXNzJywgJy9ldGMvc2FsdCddKQorICBjb25maWdfcHJveHkubG9ja19jb25maWdfb3B0aW9uKCdvdXRwdXQnLCAneWFtbCcpCisKK1RoZSBsYXN0IGNhbGwgd291bGQgZWZmZWN0aXZlbHkgcmVtb3ZlIHRoZSBgYC0tb3V0cHV0YGAgY29uZmlnIG9wdGlvbiBmcm9tIHRoZQorQ0xJLCBhbmQgeWllbGQgYW4gZXJyb3IgKG9yIHdhcm5pbmcpIGlmIHRoZSBvcHRpb24gd2FzIGVuY291bnRlcmVkIHdoaWxlCitwYXJzaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisKK0Z1cnRoZXJtb3JlLCB0aGUgY2xhc3MgaW5zdGFuY2VzIGNvdWxkIGJlY29tZSBsb25nLWxpdmVkIGFuZCBrZWVwIGEgcmVmZXJlbmNlCit0byBhIHN0b3JhZ2UgcHJveHksIGUuZy4gdG8gcHJldmVudCBoYXZpbmcgdG8gcmVsb2FkIHN0b3JhZ2Ugb24gZXZlcnkgcmVxdWVzdC4KKworTm9kZSBsaXN0cworLS0tLS0tLS0tLQorQ2xhc3MgbWFwcGluZ3MgYXJlIHN0aWxsIGV4cGVyaW1lbnRhbCwgYW5kIG9uZSBvZiB0aGUgcmVhc29ucyBJIGFtIG5vdCB0b28KK2hhcHB5IHdpdGggdGhlbSByaWdodCBub3cgaXMgdGhhdCBvbmUgd291bGQgc3RpbGwgbmVlZCB0byBwcm92aWRlIG5vZGUgZmlsZXMKK2ZvciBhbGwgbm9kZXMgZm9yIGBgaW52ZW50b3J5YGAgaW52b2NhdGlvbnMuIFRoaXMgaXMgYmVjYXVzZSBjbGFzcyBtYXBwaW5ncworY2FuIGFzc2lnbiBjbGFzc2VzIGJhc2VkIG9uIHBhdHRlcm5zIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGJ1dCBpdCBpcyBub3QKK3Bvc3NpYmxlIHRvIHR1cm4gYSBwYXR0ZXJuIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbnRvIGEgbGlzdCBvZiB2YWxpZCBub2Rlcy4KKworYElzc3VlICM5IDxodHRwczovL2dpdGh1Yi5jb20vbWFkZHVjay9yZWNsYXNzL2lzc3Vlcy85PmBfIGNvbnRhaW5zIGEgbGVuZ3RoeQorZGlzY3Vzc2lvbiBvbiB0aGlzLiBBdCB0aGUgbW9tZW50LCBJIGFtIHVuc3VyZSB3aGF0IHRoZSBiZXN0IHdheSBmb3J3YXJkIGlzLgorCitJbnZlbnRvcnkgZmlsdGVycworLS0tLS0tLS0tLS0tLS0tLS0KK0FzIGRlc2NyaWJlZCBpbiBgaXNzdWUgIzExIDxodHRwczovL2dpdGh1Yi5jb20vbWFkZHVjay9yZWNsYXNzL2lzc3Vlcy8xMT5gXzoKK3Byb3ZpZGUgYSBtZWFucyB0byBsaW1pdCB0aGUgZW51bWVyYXRpb24gb2YgdGhlIGludmVudG9yeSwgYWNjb3JkaW5nIHRvIG5vZGUKK25hbWUgcGF0dGVybnMsIG9yIHVzaW5nIGNsYXNzZXMgd2hpdGUtL2JsYWNrbGlzdHMuCisKKy4uIGluY2x1ZGU6OiBzdWJzdHMuaW5jCmRpZmYgLS1naXQgYS9fc291cmNlcy91c2FnZS50eHQgYi9fc291cmNlcy91c2FnZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2YzFkOAotLS0gL2Rldi9udWxsCisrKyBiL19zb3VyY2VzL3VzYWdlLnR4dApAQCAtMCwwICsxLDQzIEBACis9PT09PT09PT09PT09CitVc2luZyByZWNsYXNzCis9PT09PT09PT09PT09CisuLiB0b2RvOjoKKworICBXaXRoIHxyZWNsYXNzfCBub3cgaW4gRGViaWFuLCBhcyB3ZWxsIGFzIGluc3RhbGxhYmxlIGZyb20gc291cmNlLCB0aGUKKyAgZm9sbG93aW5nIHNob3VsZCBiZSBjaGVja2VkIGZvciBwYXRoIGNvbnNpc3RlbmN54oCmCisKK0ZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHxyZWNsYXNzfCBkaXJlY3RseSwgY2FsbCBgYHJlY2xhc3MgLS1oZWxwYGAKK2FuZCBzdHVkeSB0aGUgb3V0cHV0LCBvciBoYXZlIGEgbG9vayBhdCBpdHMgOmRvYzpgbWFudWFsIHBhZ2UgPG1hbnBhZ2U+YC4KKworVGhlIHRocmVlIG9wdGlvbnMsIGBgLS1pbnZlbnRvcnktYmFzZS11cmlgYCwgYGAtLW5vZGVzLXVyaWBgLCBhbmQKK2BgLS1jbGFzc2VzLXVyaWBgIHRvZ2V0aGVyIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbnZlbnRvcnkuIElmIHRoZSBiYXNlCitVUkkgaXMgc3BlY2lmaWVkLCB0aGVuIGl0IGlzIHByZXBlbmRlZCB0byB0aGUgb3RoZXIgdHdvIFVSSXMsIHVubGVzcyB0aGV5IGFyZQorYWJzb2x1dGUgVVJJcy4gSWYgdGhlc2UgdHdvIFVSSXMgYXJlIG5vdCBzcGVjaWZpZWQsIHRoZXkgZGVmYXVsdCB0byBgYG5vZGVzYGAKK2FuZCBgYGNsYXNzZXNgYC4gVGhlcmVmb3JlLCBpZiB5b3VyIGludmVudG9yeSBpcyBpbiBgYC9ldGMvcmVjbGFzcy9ub2Rlc2BgIGFuZAorYGAvZXRjL3JlY2xhc3MvY2xhc3Nlc2BgLCBhbGwgeW91IG5lZWQgdG8gc3BlY2lmeSBpcyB0aGUgYmFzZSBVUkkgYXMKK2BgL2V0Yy9yZWNsYXNzYGAg4oCUIHdoaWNoIGlzIGFjdHVhbGx5IHRoZSBkZWZhdWx0IChzcGVjaWZpZWQgaW4KK2BgcmVjbGFzcy9kZWZhdWx0cy5weWBgKS4KKworSWYgeW91J3ZlIGluc3RhbGxlZCB8cmVjbGFzc3wgZnJvbSBzb3VyY2UgYXMgcGVyIHRoZSA6ZG9jOmBpbnN0YWxsYXRpb24KK2luc3RydWN0aW9ucyA8aW5zdGFsbD5gLCB0cnkgdG8gcnVuIGl0IGZyb20gdGhlIHNvdXJjZSBkaXJlY3RvcnkgbGlrZSB0aGlzOjoKKworICAkIHJlY2xhc3MgLWIgZXhhbXBsZXMvIC0taW52ZW50b3J5CisgICQgcmVjbGFzcyAtYiBleGFtcGxlcy8gLS1ub2RlaW5mbyBsb2NhbGhvc3QKKworVGhpcyB3aWxsIG1ha2UgaXQgdXNlIHRoZSBkYXRhIGZyb20gYGBleGFtcGxlcy9ub2Rlc2BgIGFuZAorYGBleGFtcGxlcy9jbGFzc2VzYGAsIGFuZCB5b3UgY2FuIHN1cmVseSBtYWtlIHlvdXIgb3duIHdheSBmcm9tIGhlcmUuCisKK09uIERlYmlhbi1zeXN0ZW1zLCB1c2UgdGhlIGZvbGxvd2luZzo6CisKKyAgJCByZWNsYXNzIC1iIC91c3Ivc2hhcmUvZG9jL3JlY2xhc3MvZXhhbXBsZXMvIC0taW52ZW50b3J5CisgICQgcmVjbGFzcyAtYiAvdXNyL3NoYXJlL2RvYy9yZWNsYXNzL2V4YW1wbGVzLyAtLW5vZGVpbmZvIGxvY2FsaG9zdAorCitNb3JlIGNvbW1vbmx5LCBob3dldmVyLCB1c2Ugb2YgfHJlY2xhc3N8IHdpbGwgaGFwcGVuIGluZGlyZWN0bHksIGFuZCB0aHJvdWdoCitzby1jYWxsZWQgYWRhcHRlcnMuIFRoZSBqb2Igb2YgYW4gYWRhcHRlciBpcyB0byB0cmFuc2xhdGUgYmV0d2VlbiBkaWZmZXJlbnQKK2ludm9jYXRpb24gcGFyYWRpZ21zLCBwcm92aWRlIGEgc2FuZSBzZXQgb2YgZGVmYXVsdCBvcHRpb25zLCBhbmQgbWFzc2FnZSB0aGUKK2RhdGEgZnJvbSB8cmVjbGFzc3wgaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZSBhdXRvbWF0aW9uIHRvb2wgaW4gdXNlLgorUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSByZXNwZWN0aXZlIFJFQURNRSBmaWxlcyBmb3IgdGhlc2UgYWRhcHRlcnMsIGkuZS4KK2ZvciA6ZG9jOmBTYWx0IDxzYWx0PmAsIGZvciA6ZG9jOmBBbnNpYmxlIDxhbnNpYmxlPmAsIGFuZCBmb3IgOmRvYzpgUHVwcGV0Cis8cHVwcGV0PmAuCisKKy4uIGluY2x1ZGU6OiBzdWJzdHMuaW5jCmRpZmYgLS1naXQgYS9fc3RhdGljL2FqYXgtbG9hZGVyLmdpZiBiL19zdGF0aWMvYWpheC1sb2FkZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZmFmOGMKLS0tIC9kZXYvbnVsbAorKysgYi9fc3RhdGljL2FqYXgtbG9hZGVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9fc3RhdGljL2Jhc2ljLmNzcyBiL19zdGF0aWMvYmFzaWMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2N2UzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9fc3RhdGljL2Jhc2ljLmNzcwpAQCAtMCwwICsxLDUzNyBAQAorLyoKKyAqIGJhc2ljLmNzcworICogfn5+fn5+fn5+CisgKgorICogU3BoaW54IHN0eWxlc2hlZXQgLS0gYmFzaWMgdGhlbWUuCisgKgorICogOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMDctMjAxNCBieSB0aGUgU3BoaW54IHRlYW0sIHNlZSBBVVRIT1JTLgorICogOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCisgKgorICovCisKKy8qIC0tIG1haW4gbGF5b3V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2Rpdi5jbGVhcmVyIHsKKyAgICBjbGVhcjogYm90aDsKK30KKworLyogLS0gcmVsYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZGl2LnJlbGF0ZWQgeworICAgIHdpZHRoOiAxMDAlOworICAgIGZvbnQtc2l6ZTogOTAlOworfQorCitkaXYucmVsYXRlZCBoMyB7CisgICAgZGlzcGxheTogbm9uZTsKK30KKworZGl2LnJlbGF0ZWQgdWwgeworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwIDAgMCAxMHB4OworICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9CisKK2Rpdi5yZWxhdGVkIGxpIHsKKyAgICBkaXNwbGF5OiBpbmxpbmU7Cit9CisKK2Rpdi5yZWxhdGVkIGxpLnJpZ2h0IHsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgbWFyZ2luLXJpZ2h0OiA1cHg7Cit9CisKKy8qIC0tIHNpZGViYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2Rpdi5zcGhpbnhzaWRlYmFyd3JhcHBlciB7CisgICAgcGFkZGluZzogMTBweCA1cHggMCAxMHB4OworfQorCitkaXYuc3BoaW54c2lkZWJhciB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgd2lkdGg6IDIzMHB4OworICAgIG1hcmdpbi1sZWZ0OiAtMTAwJTsKKyAgICBmb250LXNpemU6IDkwJTsKK30KKworZGl2LnNwaGlueHNpZGViYXIgdWwgeworICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9CisKK2Rpdi5zcGhpbnhzaWRlYmFyIHVsIHVsLAorZGl2LnNwaGlueHNpZGViYXIgdWwud2FudC1wb2ludHMgeworICAgIG1hcmdpbi1sZWZ0OiAyMHB4OworICAgIGxpc3Qtc3R5bGU6IHNxdWFyZTsKK30KKworZGl2LnNwaGlueHNpZGViYXIgdWwgdWwgeworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKK30KKworZGl2LnNwaGlueHNpZGViYXIgZm9ybSB7CisgICAgbWFyZ2luLXRvcDogMTBweDsKK30KKworZGl2LnNwaGlueHNpZGViYXIgaW5wdXQgeworICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OGRiY2M7CisgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplOiAxZW07Cit9CisKK2Rpdi5zcGhpbnhzaWRlYmFyICNzZWFyY2hib3ggaW5wdXRbdHlwZT0idGV4dCJdIHsKKyAgICB3aWR0aDogMTcwcHg7Cit9CisKK2Rpdi5zcGhpbnhzaWRlYmFyICNzZWFyY2hib3ggaW5wdXRbdHlwZT0ic3VibWl0Il0geworICAgIHdpZHRoOiAzMHB4OworfQorCitpbWcgeworICAgIGJvcmRlcjogMDsKKyAgICBtYXgtd2lkdGg6IDEwMCU7Cit9CisKKy8qIC0tIHNlYXJjaCBwYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3VsLnNlYXJjaCB7CisgICAgbWFyZ2luOiAxMHB4IDAgMCAyMHB4OworICAgIHBhZGRpbmc6IDA7Cit9CisKK3VsLnNlYXJjaCBsaSB7CisgICAgcGFkZGluZzogNXB4IDAgNXB4IDIwcHg7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGZpbGUucG5nKTsKKyAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OworICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgN3B4OworfQorCit1bC5zZWFyY2ggbGkgYSB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK3VsLnNlYXJjaCBsaSBkaXYuY29udGV4dCB7CisgICAgY29sb3I6ICM4ODg7CisgICAgbWFyZ2luOiAycHggMCAwIDMwcHg7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KKwordWwua2V5d29yZG1hdGNoZXMgbGkuZ29vZG1hdGNoIGEgeworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisvKiAtLSBpbmRleCBwYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0YWJsZS5jb250ZW50c3RhYmxlIHsKKyAgICB3aWR0aDogOTAlOworfQorCit0YWJsZS5jb250ZW50c3RhYmxlIHAuYmlnbGluayB7CisgICAgbGluZS1oZWlnaHQ6IDE1MCU7Cit9CisKK2EuYmlnbGluayB7CisgICAgZm9udC1zaXplOiAxLjNlbTsKK30KKworc3Bhbi5saW5rZGVzY3IgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBwYWRkaW5nLXRvcDogNXB4OworICAgIGZvbnQtc2l6ZTogOTAlOworfQorCisvKiAtLSBnZW5lcmFsIGluZGV4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0YWJsZS5pbmRleHRhYmxlIHsKKyAgICB3aWR0aDogMTAwJTsKK30KKwordGFibGUuaW5kZXh0YWJsZSB0ZCB7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCit0YWJsZS5pbmRleHRhYmxlIGRsLCB0YWJsZS5pbmRleHRhYmxlIGRkIHsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKK3RhYmxlLmluZGV4dGFibGUgdHIucGNhcCB7CisgICAgaGVpZ2h0OiAxMHB4OworfQorCit0YWJsZS5pbmRleHRhYmxlIHRyLmNhcCB7CisgICAgbWFyZ2luLXRvcDogMTBweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOworfQorCitpbWcudG9nZ2xlciB7CisgICAgbWFyZ2luLXJpZ2h0OiAzcHg7CisgICAgbWFyZ2luLXRvcDogM3B4OworICAgIGN1cnNvcjogcG9pbnRlcjsKK30KKworZGl2Lm1vZGluZGV4LWp1bXBib3ggeworICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkOworICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkOworICAgIG1hcmdpbjogMWVtIDAgMWVtIDA7CisgICAgcGFkZGluZzogMC40ZW07Cit9CisKK2Rpdi5nZW5pbmRleC1qdW1wYm94IHsKKyAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDsKKyAgICBtYXJnaW46IDFlbSAwIDFlbSAwOworICAgIHBhZGRpbmc6IDAuNGVtOworfQorCisvKiAtLSBnZW5lcmFsIGJvZHkgc3R5bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCithLmhlYWRlcmxpbmsgeworICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKK30KKworaDE6aG92ZXIgPiBhLmhlYWRlcmxpbmssCitoMjpob3ZlciA+IGEuaGVhZGVybGluaywKK2gzOmhvdmVyID4gYS5oZWFkZXJsaW5rLAoraDQ6aG92ZXIgPiBhLmhlYWRlcmxpbmssCitoNTpob3ZlciA+IGEuaGVhZGVybGluaywKK2g2OmhvdmVyID4gYS5oZWFkZXJsaW5rLAorZHQ6aG92ZXIgPiBhLmhlYWRlcmxpbmsgeworICAgIHZpc2liaWxpdHk6IHZpc2libGU7Cit9CisKK2Rpdi5ib2R5IHAuY2FwdGlvbiB7CisgICAgdGV4dC1hbGlnbjogaW5oZXJpdDsKK30KKworZGl2LmJvZHkgdGQgeworICAgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKKy5maWVsZC1saXN0IHVsIHsKKyAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKK30KKworLmZpcnN0IHsKKyAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7Cit9CisKK3AucnVicmljIHsKKyAgICBtYXJnaW4tdG9wOiAzMHB4OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitpbWcuYWxpZ24tbGVmdCwgLmZpZ3VyZS5hbGlnbi1sZWZ0LCBvYmplY3QuYWxpZ24tbGVmdCB7CisgICAgY2xlYXI6IGxlZnQ7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgbWFyZ2luLXJpZ2h0OiAxZW07Cit9CisKK2ltZy5hbGlnbi1yaWdodCwgLmZpZ3VyZS5hbGlnbi1yaWdodCwgb2JqZWN0LmFsaWduLXJpZ2h0IHsKKyAgICBjbGVhcjogcmlnaHQ7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIG1hcmdpbi1sZWZ0OiAxZW07Cit9CisKK2ltZy5hbGlnbi1jZW50ZXIsIC5maWd1cmUuYWxpZ24tY2VudGVyLCBvYmplY3QuYWxpZ24tY2VudGVyIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi1sZWZ0OiBhdXRvOworICBtYXJnaW4tcmlnaHQ6IGF1dG87Cit9CisKKy5hbGlnbi1sZWZ0IHsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisuYWxpZ24tY2VudGVyIHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKy5hbGlnbi1yaWdodCB7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy8qIC0tIHNpZGViYXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2Rpdi5zaWRlYmFyIHsKKyAgICBtYXJnaW46IDAgMCAwLjVlbSAxZW07CisgICAgYm9yZGVyOiAxcHggc29saWQgI2RkYjsKKyAgICBwYWRkaW5nOiA3cHggN3B4IDAgN3B4OworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmU7CisgICAgd2lkdGg6IDQwJTsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CisKK3Auc2lkZWJhci10aXRsZSB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy8qIC0tIHRvcGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2Rpdi50b3BpYyB7CisgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKKyAgICBwYWRkaW5nOiA3cHggN3B4IDAgN3B4OworICAgIG1hcmdpbjogMTBweCAwIDEwcHggMDsKK30KKworcC50b3BpYy10aXRsZSB7CisgICAgZm9udC1zaXplOiAxLjFlbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW4tdG9wOiAxMHB4OworfQorCisvKiAtLSBhZG1vbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitkaXYuYWRtb25pdGlvbiB7CisgICAgbWFyZ2luLXRvcDogMTBweDsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgIHBhZGRpbmc6IDdweDsKK30KKworZGl2LmFkbW9uaXRpb24gZHQgeworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitkaXYuYWRtb25pdGlvbiBkbCB7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKK30KKworcC5hZG1vbml0aW9uLXRpdGxlIHsKKyAgICBtYXJnaW46IDBweCAxMHB4IDVweCAwcHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2Rpdi5ib2R5IHAuY2VudGVyZWQgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBtYXJnaW4tdG9wOiAyNXB4OworfQorCisvKiAtLSB0YWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0YWJsZS5kb2N1dGlscyB7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Cit9CisKK3RhYmxlLmRvY3V0aWxzIHRkLCB0YWJsZS5kb2N1dGlscyB0aCB7CisgICAgcGFkZGluZzogMXB4IDhweCAxcHggNXB4OworICAgIGJvcmRlci10b3A6IDA7CisgICAgYm9yZGVyLWxlZnQ6IDA7CisgICAgYm9yZGVyLXJpZ2h0OiAwOworICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWFhOworfQorCit0YWJsZS5maWVsZC1saXN0IHRkLCB0YWJsZS5maWVsZC1saXN0IHRoIHsKKyAgICBib3JkZXI6IDAgIWltcG9ydGFudDsKK30KKwordGFibGUuZm9vdG5vdGUgdGQsIHRhYmxlLmZvb3Rub3RlIHRoIHsKKyAgICBib3JkZXI6IDAgIWltcG9ydGFudDsKK30KKwordGggeworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgcGFkZGluZy1yaWdodDogNXB4OworfQorCit0YWJsZS5jaXRhdGlvbiB7CisgICAgYm9yZGVyLWxlZnQ6IHNvbGlkIDFweCBncmF5OworICAgIG1hcmdpbi1sZWZ0OiAxcHg7Cit9CisKK3RhYmxlLmNpdGF0aW9uIHRkIHsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworfQorCisvKiAtLSBvdGhlciBib2R5IHN0eWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitvbC5hcmFiaWMgeworICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7Cit9CisKK29sLmxvd2VyYWxwaGEgeworICAgIGxpc3Qtc3R5bGU6IGxvd2VyLWFscGhhOworfQorCitvbC51cHBlcmFscGhhIHsKKyAgICBsaXN0LXN0eWxlOiB1cHBlci1hbHBoYTsKK30KKworb2wubG93ZXJyb21hbiB7CisgICAgbGlzdC1zdHlsZTogbG93ZXItcm9tYW47Cit9CisKK29sLnVwcGVycm9tYW4geworICAgIGxpc3Qtc3R5bGU6IHVwcGVyLXJvbWFuOworfQorCitkbCB7CisgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKK30KKworZGQgcCB7CisgICAgbWFyZ2luLXRvcDogMHB4OworfQorCitkZCB1bCwgZGQgdGFibGUgeworICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cit9CisKK2RkIHsKKyAgICBtYXJnaW4tdG9wOiAzcHg7CisgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKKyAgICBtYXJnaW4tbGVmdDogMzBweDsKK30KKworZHQ6dGFyZ2V0LCAuaGlnaGxpZ2h0ZWQgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmYmU1NGU7Cit9CisKK2RsLmdsb3NzYXJ5IGR0IHsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBmb250LXNpemU6IDEuMWVtOworfQorCisuZmllbGQtbGlzdCB1bCB7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmctbGVmdDogMWVtOworfQorCisuZmllbGQtbGlzdCBwIHsKKyAgICBtYXJnaW46IDA7Cit9CisKKy5vcHRpb25hbCB7CisgICAgZm9udC1zaXplOiAxLjNlbTsKK30KKworLnZlcnNpb25tb2RpZmllZCB7CisgICAgZm9udC1zdHlsZTogaXRhbGljOworfQorCisuc3lzdGVtLW1lc3NhZ2UgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZGE7CisgICAgcGFkZGluZzogNXB4OworICAgIGJvcmRlcjogM3B4IHNvbGlkIHJlZDsKK30KKworLmZvb3Rub3RlOnRhcmdldCAgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmE7Cit9CisKKy5saW5lLWJsb2NrIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tdG9wOiAxZW07CisgICAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCisubGluZS1ibG9jayAubGluZS1ibG9jayB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIG1hcmdpbi1sZWZ0OiAxLjVlbTsKK30KKworLmd1aWxhYmVsLCAubWVudXNlbGVjdGlvbiB7CisgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Cit9CisKKy5hY2NlbGVyYXRvciB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9CisKKy5jbGFzc2lmaWVyIHsKKyAgICBmb250LXN0eWxlOiBvYmxpcXVlOworfQorCithYmJyLCBhY3JvbnltIHsKKyAgICBib3JkZXItYm90dG9tOiBkb3R0ZWQgMXB4OworICAgIGN1cnNvcjogaGVscDsKK30KKworLyogLS0gY29kZSBkaXNwbGF5cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworcHJlIHsKKyAgICBvdmVyZmxvdzogYXV0bzsKKyAgICBvdmVyZmxvdy15OiBoaWRkZW47ICAvKiBmaXhlcyBkaXNwbGF5IGlzc3VlcyBvbiBDaHJvbWUgYnJvd3NlcnMgKi8KK30KKwordGQubGluZW5vcyBwcmUgeworICAgIHBhZGRpbmc6IDVweCAwcHg7CisgICAgYm9yZGVyOiAwOworICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgIGNvbG9yOiAjYWFhOworfQorCit0YWJsZS5oaWdobGlnaHR0YWJsZSB7CisgICAgbWFyZ2luLWxlZnQ6IDAuNWVtOworfQorCit0YWJsZS5oaWdobGlnaHR0YWJsZSB0ZCB7CisgICAgcGFkZGluZzogMCAwLjVlbSAwIDAuNWVtOworfQorCit0dC5kZXNjbmFtZSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgZm9udC1zaXplOiAxLjJlbTsKK30KKwordHQuZGVzY2NsYXNzbmFtZSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Cit9CisKK3R0LnhyZWYsIGEgdHQgeworICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitoMSB0dCwgaDIgdHQsIGgzIHR0LCBoNCB0dCwgaDUgdHQsIGg2IHR0IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKK30KKworLnZpZXdjb2RlLWxpbmsgeworICAgIGZsb2F0OiByaWdodDsKK30KKworLnZpZXdjb2RlLWJhY2sgeworICAgIGZsb2F0OiByaWdodDsKKyAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKK30KKworZGl2LnZpZXdjb2RlLWJsb2NrOnRhcmdldCB7CisgICAgbWFyZ2luOiAtMXB4IC0xMHB4OworICAgIHBhZGRpbmc6IDAgMTBweDsKK30KKworLyogLS0gbWF0aCBkaXNwbGF5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW1nLm1hdGggeworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKK2Rpdi5ib2R5IGRpdi5tYXRoIHAgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworc3Bhbi5lcW5vIHsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CisKKy8qIC0tIHByaW50b3V0IHN0eWxlc2hlZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0BtZWRpYSBwcmludCB7CisgICAgZGl2LmRvY3VtZW50LAorICAgIGRpdi5kb2N1bWVudHdyYXBwZXIsCisgICAgZGl2LmJvZHl3cmFwcGVyIHsKKyAgICAgICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgIH0KKworICAgIGRpdi5zcGhpbnhzaWRlYmFyLAorICAgIGRpdi5yZWxhdGVkLAorICAgIGRpdi5mb290ZXIsCisgICAgI3RvcC1saW5rIHsKKyAgICAgICAgZGlzcGxheTogbm9uZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3N0YXRpYy9jb21tZW50LWJyaWdodC5wbmcgYi9fc3RhdGljL2NvbW1lbnQtYnJpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTE1MTdiCi0tLSAvZGV2L251bGwKKysrIGIvX3N0YXRpYy9jb21tZW50LWJyaWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvX3N0YXRpYy9jb21tZW50LWNsb3NlLnBuZyBiL19zdGF0aWMvY29tbWVudC1jbG9zZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliNTRiZQotLS0gL2Rldi9udWxsCisrKyBiL19zdGF0aWMvY29tbWVudC1jbG9zZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvX3N0YXRpYy9jb21tZW50LnBuZyBiL19zdGF0aWMvY29tbWVudC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmZWI1MgotLS0gL2Rldi9udWxsCisrKyBiL19zdGF0aWMvY29tbWVudC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvX3N0YXRpYy9kZWZhdWx0LmNzcyBiL19zdGF0aWMvZGVmYXVsdC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxMzk5YQotLS0gL2Rldi9udWxsCisrKyBiL19zdGF0aWMvZGVmYXVsdC5jc3MKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBkZWZhdWx0LmNzc190CisgKiB+fn5+fn5+fn5+fn5+CisgKgorICogU3BoaW54IHN0eWxlc2hlZXQgLS0gZGVmYXVsdCB0aGVtZS4KKyAqCisgKiA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAwNy0yMDE0IGJ5IHRoZSBTcGhpbnggdGVhbSwgc2VlIEFVVEhPUlMuCisgKiA6bGljZW5zZTogQlNELCBzZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KKyAqCisgKi8KKworQGltcG9ydCB1cmwoImJhc2ljLmNzcyIpOworCisvKiAtLSBwYWdlIGxheW91dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitib2R5IHsKKyAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKyAgICBmb250LXNpemU6IDEwMCU7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzExMzAzZDsKKyAgICBjb2xvcjogIzAwMDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KKworZGl2LmRvY3VtZW50IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWM0ZTYzOworfQorCitkaXYuZG9jdW1lbnR3cmFwcGVyIHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICB3aWR0aDogMTAwJTsKK30KKworZGl2LmJvZHl3cmFwcGVyIHsKKyAgICBtYXJnaW46IDAgMCAwIDIzMHB4OworfQorCitkaXYuYm9keSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgICBjb2xvcjogIzAwMDAwMDsKKyAgICBwYWRkaW5nOiAwIDIwcHggMzBweCAyMHB4OworfQorCitkaXYuZm9vdGVyIHsKKyAgICBjb2xvcjogI2ZmZmZmZjsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBwYWRkaW5nOiA5cHggMCA5cHggMDsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZm9udC1zaXplOiA3NSU7Cit9CisKK2Rpdi5mb290ZXIgYSB7CisgICAgY29sb3I6ICNmZmZmZmY7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9CisKK2Rpdi5yZWxhdGVkIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTMzZjUyOworICAgIGxpbmUtaGVpZ2h0OiAzMHB4OworICAgIGNvbG9yOiAjZmZmZmZmOworfQorCitkaXYucmVsYXRlZCBhIHsKKyAgICBjb2xvcjogI2ZmZmZmZjsKK30KKworZGl2LnNwaGlueHNpZGViYXIgeworfQorCitkaXYuc3BoaW54c2lkZWJhciBoMyB7CisgICAgZm9udC1mYW1pbHk6ICdUcmVidWNoZXQgTVMnLCBzYW5zLXNlcmlmOworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIGZvbnQtc2l6ZTogMS40ZW07CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KKworZGl2LnNwaGlueHNpZGViYXIgaDMgYSB7CisgICAgY29sb3I6ICNmZmZmZmY7Cit9CisKK2Rpdi5zcGhpbnhzaWRlYmFyIGg0IHsKKyAgICBmb250LWZhbWlseTogJ1RyZWJ1Y2hldCBNUycsIHNhbnMtc2VyaWY7CisgICAgY29sb3I6ICNmZmZmZmY7CisgICAgZm9udC1zaXplOiAxLjNlbTsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIG1hcmdpbjogNXB4IDAgMCAwOworICAgIHBhZGRpbmc6IDA7Cit9CisKK2Rpdi5zcGhpbnhzaWRlYmFyIHAgeworICAgIGNvbG9yOiAjZmZmZmZmOworfQorCitkaXYuc3BoaW54c2lkZWJhciBwLnRvcGxlc3MgeworICAgIG1hcmdpbjogNXB4IDEwcHggMTBweCAxMHB4OworfQorCitkaXYuc3BoaW54c2lkZWJhciB1bCB7CisgICAgbWFyZ2luOiAxMHB4OworICAgIHBhZGRpbmc6IDA7CisgICAgY29sb3I6ICNmZmZmZmY7Cit9CisKK2Rpdi5zcGhpbnhzaWRlYmFyIGEgeworICAgIGNvbG9yOiAjOThkYmNjOworfQorCitkaXYuc3BoaW54c2lkZWJhciBpbnB1dCB7CisgICAgYm9yZGVyOiAxcHggc29saWQgIzk4ZGJjYzsKKyAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKyAgICBmb250LXNpemU6IDFlbTsKK30KKworCisKKy8qIC0tIGh5cGVybGluayBzdHlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2EgeworICAgIGNvbG9yOiAjMzU1ZjdjOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworYTp2aXNpdGVkIHsKKyAgICBjb2xvcjogIzM1NWY3YzsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2E6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCisKKworLyogLS0gYm9keSBzdHlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZGl2LmJvZHkgaDEsCitkaXYuYm9keSBoMiwKK2Rpdi5ib2R5IGgzLAorZGl2LmJvZHkgaDQsCitkaXYuYm9keSBoNSwKK2Rpdi5ib2R5IGg2IHsKKyAgICBmb250LWZhbWlseTogJ1RyZWJ1Y2hldCBNUycsIHNhbnMtc2VyaWY7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIGNvbG9yOiAjMjA0MzVjOworICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjOworICAgIG1hcmdpbjogMjBweCAtMjBweCAxMHB4IC0yMHB4OworICAgIHBhZGRpbmc6IDNweCAwIDNweCAxMHB4OworfQorCitkaXYuYm9keSBoMSB7IG1hcmdpbi10b3A6IDA7IGZvbnQtc2l6ZTogMjAwJTsgfQorZGl2LmJvZHkgaDIgeyBmb250LXNpemU6IDE2MCU7IH0KK2Rpdi5ib2R5IGgzIHsgZm9udC1zaXplOiAxNDAlOyB9CitkaXYuYm9keSBoNCB7IGZvbnQtc2l6ZTogMTIwJTsgfQorZGl2LmJvZHkgaDUgeyBmb250LXNpemU6IDExMCU7IH0KK2Rpdi5ib2R5IGg2IHsgZm9udC1zaXplOiAxMDAlOyB9CisKK2EuaGVhZGVybGluayB7CisgICAgY29sb3I6ICNjNjBmMGY7CisgICAgZm9udC1zaXplOiAwLjhlbTsKKyAgICBwYWRkaW5nOiAwIDRweCAwIDRweDsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2EuaGVhZGVybGluazpob3ZlciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2M2MGYwZjsKKyAgICBjb2xvcjogd2hpdGU7Cit9CisKK2Rpdi5ib2R5IHAsIGRpdi5ib2R5IGRkLCBkaXYuYm9keSBsaSB7CisgICAgdGV4dC1hbGlnbjoganVzdGlmeTsKKyAgICBsaW5lLWhlaWdodDogMTMwJTsKK30KKworZGl2LmFkbW9uaXRpb24gcC5hZG1vbml0aW9uLXRpdGxlICsgcCB7CisgICAgZGlzcGxheTogaW5saW5lOworfQorCitkaXYuYWRtb25pdGlvbiBwIHsKKyAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cit9CisKK2Rpdi5hZG1vbml0aW9uIHByZSB7CisgICAgbWFyZ2luLWJvdHRvbTogNXB4OworfQorCitkaXYuYWRtb25pdGlvbiB1bCwgZGl2LmFkbW9uaXRpb24gb2wgeworICAgIG1hcmdpbi1ib3R0b206IDVweDsKK30KKworZGl2Lm5vdGUgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CisgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKK30KKworZGl2LnNlZWFsc28geworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmM7CisgICAgYm9yZGVyOiAxcHggc29saWQgI2ZmNjsKK30KKworZGl2LnRvcGljIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOworfQorCitkaXYud2FybmluZyB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZTRlNDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjZjY2OworfQorCitwLmFkbW9uaXRpb24tdGl0bGUgeworICAgIGRpc3BsYXk6IGlubGluZTsKK30KKworcC5hZG1vbml0aW9uLXRpdGxlOmFmdGVyIHsKKyAgICBjb250ZW50OiAiOiI7Cit9CisKK3ByZSB7CisgICAgcGFkZGluZzogNXB4OworICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWZmY2M7CisgICAgY29sb3I6ICMzMzMzMzM7CisgICAgbGluZS1oZWlnaHQ6IDEyMCU7CisgICAgYm9yZGVyOiAxcHggc29saWQgI2FjOTsKKyAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7Cit9CisKK3R0IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWNmMGYzOworICAgIHBhZGRpbmc6IDAgMXB4IDAgMXB4OworICAgIGZvbnQtc2l6ZTogMC45NWVtOworfQorCit0aCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2VkZTsKK30KKworLndhcm5pbmcgdHQgeworICAgIGJhY2tncm91bmQ6ICNlZmMyYzI7Cit9CisKKy5ub3RlIHR0IHsKKyAgICBiYWNrZ3JvdW5kOiAjZDZkNmQ2OworfQorCisudmlld2NvZGUtYmFjayB7CisgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Cit9CisKK2Rpdi52aWV3Y29kZS1ibG9jazp0YXJnZXQgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmNGRlYmY7CisgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNhYzk7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNhYzk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3N0YXRpYy9kb2N0b29scy5qcyBiL19zdGF0aWMvZG9jdG9vbHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0NTVjOQotLS0gL2Rldi9udWxsCisrKyBiL19zdGF0aWMvZG9jdG9vbHMuanMKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBkb2N0b29scy5qcworICogfn5+fn5+fn5+fn4KKyAqCisgKiBTcGhpbnggSmF2YVNjcmlwdCB1dGlsaXRpZXMgZm9yIGFsbCBkb2N1bWVudGF0aW9uLgorICoKKyAqIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDA3LTIwMTQgYnkgdGhlIFNwaGlueCB0ZWFtLCBzZWUgQVVUSE9SUy4KKyAqIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgorICoKKyAqLworCisvKioKKyAqIHNlbGVjdCBhIGRpZmZlcmVudCBwcmVmaXggZm9yIHVuZGVyc2NvcmUKKyAqLworJHUgPSBfLm5vQ29uZmxpY3QoKTsKKworLyoqCisgKiBtYWtlIHRoZSBjb2RlIGJlbG93IGNvbXBhdGlibGUgd2l0aCBicm93c2VycyB3aXRob3V0CisgKiBhbiBpbnN0YWxsZWQgZmlyZWJ1ZyBsaWtlIGRlYnVnZ2VyCitpZiAoIXdpbmRvdy5jb25zb2xlIHx8ICFjb25zb2xlLmZpcmVidWcpIHsKKyAgdmFyIG5hbWVzID0gWyJsb2ciLCAiZGVidWciLCAiaW5mbyIsICJ3YXJuIiwgImVycm9yIiwgImFzc2VydCIsICJkaXIiLAorICAgICJkaXJ4bWwiLCAiZ3JvdXAiLCAiZ3JvdXBFbmQiLCAidGltZSIsICJ0aW1lRW5kIiwgImNvdW50IiwgInRyYWNlIiwKKyAgICAicHJvZmlsZSIsICJwcm9maWxlRW5kIl07CisgIHdpbmRvdy5jb25zb2xlID0ge307CisgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyArK2kpCisgICAgd2luZG93LmNvbnNvbGVbbmFtZXNbaV1dID0gZnVuY3Rpb24oKSB7fTsKK30KKyAqLworCisvKioKKyAqIHNtYWxsIGhlbHBlciBmdW5jdGlvbiB0byB1cmxkZWNvZGUgc3RyaW5ncworICovCitqUXVlcnkudXJsZGVjb2RlID0gZnVuY3Rpb24oeCkgeworICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHgpLnJlcGxhY2UoL1wrL2csICcgJyk7Cit9OworCisvKioKKyAqIHNtYWxsIGhlbHBlciBmdW5jdGlvbiB0byB1cmxlbmNvZGUgc3RyaW5ncworICovCitqUXVlcnkudXJsZW5jb2RlID0gZW5jb2RlVVJJQ29tcG9uZW50OworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcGFyc2VkIHVybCBwYXJhbWV0ZXJzIG9mIHRoZQorICogY3VycmVudCByZXF1ZXN0LiBNdWx0aXBsZSB2YWx1ZXMgcGVyIGtleSBhcmUgc3VwcG9ydGVkLAorICogaXQgd2lsbCBhbHdheXMgcmV0dXJuIGFycmF5cyBvZiBzdHJpbmdzIGZvciB0aGUgdmFsdWUgcGFydHMuCisgKi8KK2pRdWVyeS5nZXRRdWVyeVBhcmFtZXRlcnMgPSBmdW5jdGlvbihzKSB7CisgIGlmICh0eXBlb2YgcyA9PSAndW5kZWZpbmVkJykKKyAgICBzID0gZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoOworICB2YXIgcGFydHMgPSBzLnN1YnN0cihzLmluZGV4T2YoJz8nKSArIDEpLnNwbGl0KCcmJyk7CisgIHZhciByZXN1bHQgPSB7fTsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgeworICAgIHZhciB0bXAgPSBwYXJ0c1tpXS5zcGxpdCgnPScsIDIpOworICAgIHZhciBrZXkgPSBqUXVlcnkudXJsZGVjb2RlKHRtcFswXSk7CisgICAgdmFyIHZhbHVlID0galF1ZXJ5LnVybGRlY29kZSh0bXBbMV0pOworICAgIGlmIChrZXkgaW4gcmVzdWx0KQorICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7CisgICAgZWxzZQorICAgICAgcmVzdWx0W2tleV0gPSBbdmFsdWVdOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIGhpZ2hsaWdodCBhIGdpdmVuIHN0cmluZyBvbiBhIGpxdWVyeSBvYmplY3QgYnkgd3JhcHBpbmcgaXQgaW4KKyAqIHNwYW4gZWxlbWVudHMgd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZS4KKyAqLworalF1ZXJ5LmZuLmhpZ2hsaWdodFRleHQgPSBmdW5jdGlvbih0ZXh0LCBjbGFzc05hbWUpIHsKKyAgZnVuY3Rpb24gaGlnaGxpZ2h0KG5vZGUpIHsKKyAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7CisgICAgICB2YXIgdmFsID0gbm9kZS5ub2RlVmFsdWU7CisgICAgICB2YXIgcG9zID0gdmFsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXh0KTsKKyAgICAgIGlmIChwb3MgPj0gMCAmJiAhalF1ZXJ5KG5vZGUucGFyZW50Tm9kZSkuaGFzQ2xhc3MoY2xhc3NOYW1lKSkgeworICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKKyAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsLnN1YnN0cihwb3MsIHRleHQubGVuZ3RoKSkpOworICAgICAgICBub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNwYW4sIG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoCisgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsLnN1YnN0cihwb3MgKyB0ZXh0Lmxlbmd0aCkpLAorICAgICAgICAgIG5vZGUubmV4dFNpYmxpbmcpKTsKKyAgICAgICAgbm9kZS5ub2RlVmFsdWUgPSB2YWwuc3Vic3RyKDAsIHBvcyk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFqUXVlcnkobm9kZSkuaXMoImJ1dHRvbiwgc2VsZWN0LCB0ZXh0YXJlYSIpKSB7CisgICAgICBqUXVlcnkuZWFjaChub2RlLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCkgeworICAgICAgICBoaWdobGlnaHQodGhpcyk7CisgICAgICB9KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKyAgICBoaWdobGlnaHQodGhpcyk7CisgIH0pOworfTsKKworLyoqCisgKiBTbWFsbCBKYXZhU2NyaXB0IG1vZHVsZSBmb3IgdGhlIGRvY3VtZW50YXRpb24uCisgKi8KK3ZhciBEb2N1bWVudGF0aW9uID0geworCisgIGluaXQgOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmZpeEZpcmVmb3hBbmNob3JCdWcoKTsKKyAgICB0aGlzLmhpZ2hsaWdodFNlYXJjaFdvcmRzKCk7CisgICAgdGhpcy5pbml0SW5kZXhUYWJsZSgpOworICB9LAorCisgIC8qKgorICAgKiBpMThuIHN1cHBvcnQKKyAgICovCisgIFRSQU5TTEFUSU9OUyA6IHt9LAorICBQTFVSQUxfRVhQUiA6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPT0gMSA/IDAgOiAxOyB9LAorICBMT0NBTEUgOiAndW5rbm93bicsCisKKyAgLy8gZ2V0dGV4dCBhbmQgbmdldHRleHQgZG9uJ3QgYWNjZXNzIHRoaXMgc28gdGhhdCB0aGUgZnVuY3Rpb25zCisgIC8vIGNhbiBzYWZlbHkgYm91bmQgdG8gYSBkaWZmZXJlbnQgbmFtZSAoXyA9IERvY3VtZW50YXRpb24uZ2V0dGV4dCkKKyAgZ2V0dGV4dCA6IGZ1bmN0aW9uKHN0cmluZykgeworICAgIHZhciB0cmFuc2xhdGVkID0gRG9jdW1lbnRhdGlvbi5UUkFOU0xBVElPTlNbc3RyaW5nXTsKKyAgICBpZiAodHlwZW9mIHRyYW5zbGF0ZWQgPT0gJ3VuZGVmaW5lZCcpCisgICAgICByZXR1cm4gc3RyaW5nOworICAgIHJldHVybiAodHlwZW9mIHRyYW5zbGF0ZWQgPT0gJ3N0cmluZycpID8gdHJhbnNsYXRlZCA6IHRyYW5zbGF0ZWRbMF07CisgIH0sCisKKyAgbmdldHRleHQgOiBmdW5jdGlvbihzaW5ndWxhciwgcGx1cmFsLCBuKSB7CisgICAgdmFyIHRyYW5zbGF0ZWQgPSBEb2N1bWVudGF0aW9uLlRSQU5TTEFUSU9OU1tzaW5ndWxhcl07CisgICAgaWYgKHR5cGVvZiB0cmFuc2xhdGVkID09ICd1bmRlZmluZWQnKQorICAgICAgcmV0dXJuIChuID09IDEpID8gc2luZ3VsYXIgOiBwbHVyYWw7CisgICAgcmV0dXJuIHRyYW5zbGF0ZWRbRG9jdW1lbnRhdGlvbi5QTFVSQUxFWFBSKG4pXTsKKyAgfSwKKworICBhZGRUcmFuc2xhdGlvbnMgOiBmdW5jdGlvbihjYXRhbG9nKSB7CisgICAgZm9yICh2YXIga2V5IGluIGNhdGFsb2cubWVzc2FnZXMpCisgICAgICB0aGlzLlRSQU5TTEFUSU9OU1trZXldID0gY2F0YWxvZy5tZXNzYWdlc1trZXldOworICAgIHRoaXMuUExVUkFMX0VYUFIgPSBuZXcgRnVuY3Rpb24oJ24nLCAncmV0dXJuICsoJyArIGNhdGFsb2cucGx1cmFsX2V4cHIgKyAnKScpOworICAgIHRoaXMuTE9DQUxFID0gY2F0YWxvZy5sb2NhbGU7CisgIH0sCisKKyAgLyoqCisgICAqIGFkZCBjb250ZXh0IGVsZW1lbnRzIGxpa2UgaGVhZGVyIGFuY2hvciBsaW5rcworICAgKi8KKyAgYWRkQ29udGV4dEVsZW1lbnRzIDogZnVuY3Rpb24oKSB7CisgICAgJCgnZGl2W2lkXSA+IDpoZWFkZXI6Zmlyc3QnKS5lYWNoKGZ1bmN0aW9uKCkgeworICAgICAgJCgnPGEgY2xhc3M9ImhlYWRlcmxpbmsiPlx1MDBCNjwvYT4nKS4KKyAgICAgIGF0dHIoJ2hyZWYnLCAnIycgKyB0aGlzLmlkKS4KKyAgICAgIGF0dHIoJ3RpdGxlJywgXygnUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUnKSkuCisgICAgICBhcHBlbmRUbyh0aGlzKTsKKyAgICB9KTsKKyAgICAkKCdkdFtpZF0nKS5lYWNoKGZ1bmN0aW9uKCkgeworICAgICAgJCgnPGEgY2xhc3M9ImhlYWRlcmxpbmsiPlx1MDBCNjwvYT4nKS4KKyAgICAgIGF0dHIoJ2hyZWYnLCAnIycgKyB0aGlzLmlkKS4KKyAgICAgIGF0dHIoJ3RpdGxlJywgXygnUGVybWFsaW5rIHRvIHRoaXMgZGVmaW5pdGlvbicpKS4KKyAgICAgIGFwcGVuZFRvKHRoaXMpOworICAgIH0pOworICB9LAorCisgIC8qKgorICAgKiB3b3JrYXJvdW5kIGEgZmlyZWZveCBzdHVwaWRpdHkKKyAgICovCisgIGZpeEZpcmVmb3hBbmNob3JCdWcgOiBmdW5jdGlvbigpIHsKKyAgICBpZiAoZG9jdW1lbnQubG9jYXRpb24uaGFzaCAmJiAkLmJyb3dzZXIubW96aWxsYSkKKyAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAgICBkb2N1bWVudC5sb2NhdGlvbi5ocmVmICs9ICcnOworICAgICAgfSwgMTApOworICB9LAorCisgIC8qKgorICAgKiBoaWdobGlnaHQgdGhlIHNlYXJjaCB3b3JkcyBwcm92aWRlZCBpbiB0aGUgdXJsIGluIHRoZSB0ZXh0CisgICAqLworICBoaWdobGlnaHRTZWFyY2hXb3JkcyA6IGZ1bmN0aW9uKCkgeworICAgIHZhciBwYXJhbXMgPSAkLmdldFF1ZXJ5UGFyYW1ldGVycygpOworICAgIHZhciB0ZXJtcyA9IChwYXJhbXMuaGlnaGxpZ2h0KSA/IHBhcmFtcy5oaWdobGlnaHRbMF0uc3BsaXQoL1xzKy8pIDogW107CisgICAgaWYgKHRlcm1zLmxlbmd0aCkgeworICAgICAgdmFyIGJvZHkgPSAkKCdkaXYuYm9keScpOworICAgICAgaWYgKCFib2R5Lmxlbmd0aCkgeworICAgICAgICBib2R5ID0gJCgnYm9keScpOworICAgICAgfQorICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICAgICQuZWFjaCh0ZXJtcywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgYm9keS5oaWdobGlnaHRUZXh0KHRoaXMudG9Mb3dlckNhc2UoKSwgJ2hpZ2hsaWdodGVkJyk7CisgICAgICAgIH0pOworICAgICAgfSwgMTApOworICAgICAgJCgnPHAgY2xhc3M9ImhpZ2hsaWdodC1saW5rIj48YSBocmVmPSJqYXZhc2NyaXB0OkRvY3VtZW50YXRpb24uJyArCisgICAgICAgICdoaWRlU2VhcmNoV29yZHMoKSI+JyArIF8oJ0hpZGUgU2VhcmNoIE1hdGNoZXMnKSArICc8L2E+PC9wPicpCisgICAgICAgICAgLmFwcGVuZFRvKCQoJyNzZWFyY2hib3gnKSk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBpbml0IHRoZSBkb21haW4gaW5kZXggdG9nZ2xlIGJ1dHRvbnMKKyAgICovCisgIGluaXRJbmRleFRhYmxlIDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHRvZ2dsZXJzID0gJCgnaW1nLnRvZ2dsZXInKS5jbGljayhmdW5jdGlvbigpIHsKKyAgICAgIHZhciBzcmMgPSAkKHRoaXMpLmF0dHIoJ3NyYycpOworICAgICAgdmFyIGlkbnVtID0gJCh0aGlzKS5hdHRyKCdpZCcpLnN1YnN0cig3KTsKKyAgICAgICQoJ3RyLmNnLScgKyBpZG51bSkudG9nZ2xlKCk7CisgICAgICBpZiAoc3JjLnN1YnN0cigtOSkgPT0gJ21pbnVzLnBuZycpCisgICAgICAgICQodGhpcykuYXR0cignc3JjJywgc3JjLnN1YnN0cigwLCBzcmMubGVuZ3RoLTkpICsgJ3BsdXMucG5nJyk7CisgICAgICBlbHNlCisgICAgICAgICQodGhpcykuYXR0cignc3JjJywgc3JjLnN1YnN0cigwLCBzcmMubGVuZ3RoLTgpICsgJ21pbnVzLnBuZycpOworICAgIH0pLmNzcygnZGlzcGxheScsICcnKTsKKyAgICBpZiAoRE9DVU1FTlRBVElPTl9PUFRJT05TLkNPTExBUFNFX0lOREVYKSB7CisgICAgICAgIHRvZ2dsZXJzLmNsaWNrKCk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgKiBoZWxwZXIgZnVuY3Rpb24gdG8gaGlkZSB0aGUgc2VhcmNoIG1hcmtzIGFnYWluCisgICAqLworICBoaWRlU2VhcmNoV29yZHMgOiBmdW5jdGlvbigpIHsKKyAgICAkKCcjc2VhcmNoYm94IC5oaWdobGlnaHQtbGluaycpLmZhZGVPdXQoMzAwKTsKKyAgICAkKCdzcGFuLmhpZ2hsaWdodGVkJykucmVtb3ZlQ2xhc3MoJ2hpZ2hsaWdodGVkJyk7CisgIH0sCisKKyAgLyoqCisgICAqIG1ha2UgdGhlIHVybCBhYnNvbHV0ZQorICAgKi8KKyAgbWFrZVVSTCA6IGZ1bmN0aW9uKHJlbGF0aXZlVVJMKSB7CisgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fT1BUSU9OUy5VUkxfUk9PVCArICcvJyArIHJlbGF0aXZlVVJMOworICB9LAorCisgIC8qKgorICAgKiBnZXQgdGhlIGN1cnJlbnQgcmVsYXRpdmUgdXJsCisgICAqLworICBnZXRDdXJyZW50VVJMIDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHBhdGggPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZTsKKyAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KC9cLy8pOworICAgICQuZWFjaChET0NVTUVOVEFUSU9OX09QVElPTlMuVVJMX1JPT1Quc3BsaXQoL1wvLyksIGZ1bmN0aW9uKCkgeworICAgICAgaWYgKHRoaXMgPT0gJy4uJykKKyAgICAgICAgcGFydHMucG9wKCk7CisgICAgfSk7CisgICAgdmFyIHVybCA9IHBhcnRzLmpvaW4oJy8nKTsKKyAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKCcvJykgKyAxLCBwYXRoLmxlbmd0aCAtIDEpOworICB9Cit9OworCisvLyBxdWljayBhbGlhcyBmb3IgdHJhbnNsYXRpb25zCitfID0gRG9jdW1lbnRhdGlvbi5nZXR0ZXh0OworCiskKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKyAgRG9jdW1lbnRhdGlvbi5pbml0KCk7Cit9KTsKZGlmZiAtLWdpdCBhL19zdGF0aWMvZG93bi1wcmVzc2VkLnBuZyBiL19zdGF0aWMvZG93bi1wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdhZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvX3N0YXRpYy9kb3duLXByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL19zdGF0aWMvZG93bi5wbmcgYi9fc3RhdGljL2Rvd24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDNhODgKLS0tIC9kZXYvbnVsbAorKysgYi9fc3RhdGljL2Rvd24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL19zdGF0aWMvZmlsZS5wbmcgYi9fc3RhdGljL2ZpbGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxODA4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9fc3RhdGljL2ZpbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL19zdGF0aWMvanF1ZXJ5LmpzIGIvX3N0YXRpYy9qcXVlcnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3ZWI2NwotLS0gL2Rldi9udWxsCisrKyBiL19zdGF0aWMvanF1ZXJ5LmpzCkBAIC0wLDAgKzEsOTQwNCBAQAorLyohCisgKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjcuMgorICogaHR0cDovL2pxdWVyeS5jb20vCisgKgorICogQ29weXJpZ2h0IDIwMTEsIEpvaG4gUmVzaWcKKyAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgorICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQorICoKKyAqIEluY2x1ZGVzIFNpenpsZS5qcworICogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAqIENvcHlyaWdodCAyMDExLCBUaGUgRG9qbyBGb3VuZGF0aW9uCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuCisgKgorICogRGF0ZTogRnJpIEF1ZyAyOSAwOTo0NjozNCBVVEMgMjAxNAorICovCisoZnVuY3Rpb24oIHdpbmRvdywgdW5kZWZpbmVkICkgeworCisvLyBVc2UgdGhlIGNvcnJlY3QgZG9jdW1lbnQgYWNjb3JkaW5nbHkgd2l0aCB3aW5kb3cgYXJndW1lbnQgKHNhbmRib3gpCit2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQsCisJbmF2aWdhdG9yID0gd2luZG93Lm5hdmlnYXRvciwKKwlsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjsKK3ZhciBqUXVlcnkgPSAoZnVuY3Rpb24oKSB7CisKKy8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5Cit2YXIgalF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgeworCQkvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCcKKwkJcmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKTsKKwl9LAorCisJLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisJX2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksCisKKwkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQorCV8kID0gd2luZG93LiQsCisKKwkvLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudCkKKwlyb290alF1ZXJ5LAorCisJLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Mgb3IgSUQgc3RyaW5ncworCS8vIFByaW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoICgjOTUyMSkKKwlxdWlja0V4cHIgPSAvXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8sCisKKwkvLyBDaGVjayBpZiBhIHN0cmluZyBoYXMgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gaXQKKwlybm90d2hpdGUgPSAvXFMvLAorCisJLy8gVXNlZCBmb3IgdHJpbW1pbmcgd2hpdGVzcGFjZQorCXRyaW1MZWZ0ID0gL15ccysvLAorCXRyaW1SaWdodCA9IC9ccyskLywKKworCS8vIE1hdGNoIGEgc3RhbmRhbG9uZSB0YWcKKwlyc2luZ2xlVGFnID0gL148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLywKKworCS8vIEpTT04gUmVnRXhwCisJcnZhbGlkY2hhcnMgPSAvXltcXSw6e31cc10qJC8sCisJcnZhbGlkZXNjYXBlID0gL1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZywKKwlydmFsaWR0b2tlbnMgPSAvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csCisJcnZhbGlkYnJhY2VzID0gLyg/Ol58OnwsKSg/OlxzKlxbKSsvZywKKworCS8vIFVzZXJhZ2VudCBSZWdFeHAKKwlyd2Via2l0ID0gLyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8sCisJcm9wZXJhID0gLyhvcGVyYSkoPzouKnZlcnNpb24pP1sgXC9dKFtcdy5dKykvLAorCXJtc2llID0gLyhtc2llKSAoW1x3Ll0rKS8sCisJcm1vemlsbGEgPSAvKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLAorCisJLy8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nCisJcmRhc2hBbHBoYSA9IC8tKFthLXpdfFswLTldKS9pZywKKwlybXNQcmVmaXggPSAvXi1tcy0vLAorCisJLy8gVXNlZCBieSBqUXVlcnkuY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKQorCWZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7CisJCXJldHVybiAoIGxldHRlciArICIiICkudG9VcHBlckNhc2UoKTsKKwl9LAorCisJLy8gS2VlcCBhIFVzZXJBZ2VudCBzdHJpbmcgZm9yIHVzZSB3aXRoIGpRdWVyeS5icm93c2VyCisJdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudCwKKworCS8vIEZvciBtYXRjaGluZyB0aGUgZW5naW5lIGFuZCB2ZXJzaW9uIG9mIHRoZSBicm93c2VyCisJYnJvd3Nlck1hdGNoLAorCisJLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5CisJcmVhZHlMaXN0LAorCisJLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIKKwlET01Db250ZW50TG9hZGVkLAorCisJLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kcworCXRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKKwloYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LAorCXB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCwKKwlzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZSwKKwl0cmltID0gU3RyaW5nLnByb3RvdHlwZS50cmltLAorCWluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiwKKworCS8vIFtbQ2xhc3NdXSAtPiB0eXBlIHBhaXJzCisJY2xhc3MydHlwZSA9IHt9OworCitqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0geworCWNvbnN0cnVjdG9yOiBqUXVlcnksCisJaW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5ICkgeworCQl2YXIgbWF0Y2gsIGVsZW0sIHJldCwgZG9jOworCisJCS8vIEhhbmRsZSAkKCIiKSwgJChudWxsKSwgb3IgJCh1bmRlZmluZWQpCisJCWlmICggIXNlbGVjdG9yICkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQorCQlpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkgeworCQkJdGhpcy5jb250ZXh0ID0gdGhpc1swXSA9IHNlbGVjdG9yOworCQkJdGhpcy5sZW5ndGggPSAxOworCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQkvLyBUaGUgYm9keSBlbGVtZW50IG9ubHkgZXhpc3RzIG9uY2UsIG9wdGltaXplIGZpbmRpbmcgaXQKKwkJaWYgKCBzZWxlY3RvciA9PT0gImJvZHkiICYmICFjb250ZXh0ICYmIGRvY3VtZW50LmJvZHkgKSB7CisJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKKwkJCXRoaXNbMF0gPSBkb2N1bWVudC5ib2R5OworCQkJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOworCQkJdGhpcy5sZW5ndGggPSAxOworCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQkvLyBIYW5kbGUgSFRNTCBzdHJpbmdzCisJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKKwkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJpbmcgb3IgYW4gSUQ/CisJCQlpZiAoIHNlbGVjdG9yLmNoYXJBdCgwKSA9PT0gIjwiICYmIHNlbGVjdG9yLmNoYXJBdCggc2VsZWN0b3IubGVuZ3RoIC0gMSApID09PSAiPiIgJiYgc2VsZWN0b3IubGVuZ3RoID49IDMgKSB7CisJCQkJLy8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2sKKwkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKKworCQkJfSBlbHNlIHsKKwkJCQltYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOworCQkJfQorCisJCQkvLyBWZXJpZnkgYSBtYXRjaCwgYW5kIHRoYXQgbm8gY29udGV4dCB3YXMgc3BlY2lmaWVkIGZvciAjaWQKKwkJCWlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHsKKworCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQorCQkJCWlmICggbWF0Y2hbMV0gKSB7CisJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFswXSA6IGNvbnRleHQ7CisJCQkJCWRvYyA9ICggY29udGV4dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQgKTsKKworCQkJCQkvLyBJZiBhIHNpbmdsZSBzdHJpbmcgaXMgcGFzc2VkIGluIGFuZCBpdCdzIGEgc2luZ2xlIHRhZworCQkJCQkvLyBqdXN0IGRvIGEgY3JlYXRlRWxlbWVudCBhbmQgc2tpcCB0aGUgcmVzdAorCQkJCQlyZXQgPSByc2luZ2xlVGFnLmV4ZWMoIHNlbGVjdG9yICk7CisKKwkJCQkJaWYgKCByZXQgKSB7CisJCQkJCQlpZiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CisJCQkJCQkJc2VsZWN0b3IgPSBbIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIHJldFsxXSApIF07CisJCQkJCQkJalF1ZXJ5LmZuLmF0dHIuY2FsbCggc2VsZWN0b3IsIGNvbnRleHQsIHRydWUgKTsKKworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlzZWxlY3RvciA9IFsgZG9jLmNyZWF0ZUVsZW1lbnQoIHJldFsxXSApIF07CisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIG1hdGNoWzFdIF0sIFsgZG9jIF0gKTsKKwkJCQkJCXNlbGVjdG9yID0gKCByZXQuY2FjaGVhYmxlID8galF1ZXJ5LmNsb25lKHJldC5mcmFnbWVudCkgOiByZXQuZnJhZ21lbnQgKS5jaGlsZE5vZGVzOworCQkJCQl9CisKKwkJCQkJcmV0dXJuIGpRdWVyeS5tZXJnZSggdGhpcywgc2VsZWN0b3IgKTsKKworCQkJCS8vIEhBTkRMRTogJCgiI2lkIikKKwkJCQl9IGVsc2UgeworCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzJdICk7CisKKwkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKKwkJCQkJLy8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MworCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkgeworCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKKwkJCQkJCS8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAorCQkJCQkJaWYgKCBlbGVtLmlkICE9PSBtYXRjaFsyXSApIHsKKwkJCQkJCQlyZXR1cm4gcm9vdGpRdWVyeS5maW5kKCBzZWxlY3RvciApOworCQkJCQkJfQorCisJCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CisJCQkJCQl0aGlzLmxlbmd0aCA9IDE7CisJCQkJCQl0aGlzWzBdID0gZWxlbTsKKwkJCQkJfQorCisJCQkJCXRoaXMuY29udGV4dCA9IGRvY3VtZW50OworCQkJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0KKworCQkJLy8gSEFORExFOiAkKGV4cHIsICQoLi4uKSkKKwkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgeworCQkJCXJldHVybiAoIGNvbnRleHQgfHwgcm9vdGpRdWVyeSApLmZpbmQoIHNlbGVjdG9yICk7CisKKwkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQorCQkJLy8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpCisJCQl9IGVsc2UgeworCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKKwkJCX0KKworCQkvLyBIQU5ETEU6ICQoZnVuY3Rpb24pCisJCS8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQorCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHsKKwkJCXJldHVybiByb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApOworCQl9CisKKwkJaWYgKCBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkICkgeworCQkJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLnNlbGVjdG9yOworCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKKwkJfQorCisJCXJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOworCX0sCisKKwkvLyBTdGFydCB3aXRoIGFuIGVtcHR5IHNlbGVjdG9yCisJc2VsZWN0b3I6ICIiLAorCisJLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZAorCWpxdWVyeTogIjEuNy4yIiwKKworCS8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAorCWxlbmd0aDogMCwKKworCS8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0CisJc2l6ZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmxlbmd0aDsKKwl9LAorCisJdG9BcnJheTogZnVuY3Rpb24oKSB7CisJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzLCAwICk7CisJfSwKKworCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKKwkvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQorCWdldDogZnVuY3Rpb24oIG51bSApIHsKKwkJcmV0dXJuIG51bSA9PSBudWxsID8KKworCQkJLy8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJheQorCQkJdGhpcy50b0FycmF5KCkgOgorCisJCQkvLyBSZXR1cm4ganVzdCB0aGUgb2JqZWN0CisJCQkoIG51bSA8IDAgPyB0aGlzWyB0aGlzLmxlbmd0aCArIG51bSBdIDogdGhpc1sgbnVtIF0gKTsKKwl9LAorCisJLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFjaworCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQorCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zLCBuYW1lLCBzZWxlY3RvciApIHsKKwkJLy8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXQKKwkJdmFyIHJldCA9IHRoaXMuY29uc3RydWN0b3IoKTsKKworCQlpZiAoIGpRdWVyeS5pc0FycmF5KCBlbGVtcyApICkgeworCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcyApOworCisJCX0gZWxzZSB7CisJCQlqUXVlcnkubWVyZ2UoIHJldCwgZWxlbXMgKTsKKwkJfQorCisJCS8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpCisJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsKKworCQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKKworCQlpZiAoIG5hbWUgPT09ICJmaW5kIiApIHsKKwkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAoIHRoaXMuc2VsZWN0b3IgPyAiICIgOiAiIiApICsgc2VsZWN0b3I7CisJCX0gZWxzZSBpZiAoIG5hbWUgKSB7CisJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgIi4iICsgbmFtZSArICIoIiArIHNlbGVjdG9yICsgIikiOworCQl9CisKKwkJLy8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXQKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KKwkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcworCS8vIG9ubHkgdXNlZCBpbnRlcm5hbGx5LikKKwllYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7CisJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTsKKwl9LAorCisJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKKwkJLy8gQXR0YWNoIHRoZSBsaXN0ZW5lcnMKKwkJalF1ZXJ5LmJpbmRSZWFkeSgpOworCisJCS8vIEFkZCB0aGUgY2FsbGJhY2sKKwkJcmVhZHlMaXN0LmFkZCggZm4gKTsKKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZXE6IGZ1bmN0aW9uKCBpICkgeworCQlpID0gK2k7CisJCXJldHVybiBpID09PSAtMSA/CisJCQl0aGlzLnNsaWNlKCBpICkgOgorCQkJdGhpcy5zbGljZSggaSwgaSArIDEgKTsKKwl9LAorCisJZmlyc3Q6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5lcSggMCApOworCX0sCisKKwlsYXN0OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZXEoIC0xICk7CisJfSwKKworCXNsaWNlOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICksCisJCQkic2xpY2UiLCBzbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpICk7CisJfSwKKworCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CisJCQlyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApOworCQl9KSk7CisJfSwKKworCWVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTsKKwl9LAorCisJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgorCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgorCXB1c2g6IHB1c2gsCisJc29ydDogW10uc29ydCwKKwlzcGxpY2U6IFtdLnNwbGljZQorfTsKKworLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbgoralF1ZXJ5LmZuLmluaXQucHJvdG90eXBlID0galF1ZXJ5LmZuOworCitqUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkgeworCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKKwkJdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LAorCQlpID0gMSwKKwkJbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwKKwkJZGVlcCA9IGZhbHNlOworCisJLy8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvbgorCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgeworCQlkZWVwID0gdGFyZ2V0OworCQl0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307CisJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKKwkJaSA9IDI7CisJfQorCisJLy8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpCisJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApIHsKKwkJdGFyZ2V0ID0ge307CisJfQorCisJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCisJaWYgKCBsZW5ndGggPT09IGkgKSB7CisJCXRhcmdldCA9IHRoaXM7CisJCS0taTsKKwl9CisKKwlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcworCQlpZiAoIChvcHRpb25zID0gYXJndW1lbnRzWyBpIF0pICE9IG51bGwgKSB7CisJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CisJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CisJCQkJc3JjID0gdGFyZ2V0WyBuYW1lIF07CisJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKKworCQkJCS8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKKwkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCisJCQkJaWYgKCBkZWVwICYmIGNvcHkgJiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdChjb3B5KSB8fCAoY29weUlzQXJyYXkgPSBqUXVlcnkuaXNBcnJheShjb3B5KSkgKSApIHsKKwkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKKwkJCQkJCWNvcHlJc0FycmF5ID0gZmFsc2U7CisJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNBcnJheShzcmMpID8gc3JjIDogW107CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTsKKwkJCQkJfQorCisJCQkJCS8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbQorCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CisKKwkJCQkvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzCisJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgeworCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGNvcHk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3QKKwlyZXR1cm4gdGFyZ2V0OworfTsKKworalF1ZXJ5LmV4dGVuZCh7CisJbm9Db25mbGljdDogZnVuY3Rpb24oIGRlZXAgKSB7CisJCWlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKKwkJCXdpbmRvdy4kID0gXyQ7CisJCX0KKworCQlpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkgeworCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CisJCX0KKworCQlyZXR1cm4galF1ZXJ5OworCX0sCisKKwkvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgorCWlzUmVhZHk6IGZhbHNlLAorCisJLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQorCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCisJcmVhZHlXYWl0OiAxLAorCisJLy8gSG9sZCAob3IgcmVsZWFzZSkgdGhlIHJlYWR5IGV2ZW50CisJaG9sZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHsKKwkJaWYgKCBob2xkICkgeworCQkJalF1ZXJ5LnJlYWR5V2FpdCsrOworCQl9IGVsc2UgeworCQkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7CisJCX0KKwl9LAorCisJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQorCXJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHsKKwkJLy8gRWl0aGVyIGEgcmVsZWFzZWQgaG9sZCBvciBhbiBET01yZWFkeS9sb2FkIGV2ZW50IGFuZCBub3QgeWV0IHJlYWR5CisJCWlmICggKHdhaXQgPT09IHRydWUgJiYgIS0talF1ZXJ5LnJlYWR5V2FpdCkgfHwgKHdhaXQgIT09IHRydWUgJiYgIWpRdWVyeS5pc1JlYWR5KSApIHsKKwkJCS8vIE1ha2Ugc3VyZSBib2R5IGV4aXN0cywgYXQgbGVhc3QsIGluIGNhc2UgSUUgZ2V0cyBhIGxpdHRsZSBvdmVyemVhbG91cyAodGlja2V0ICM1NDQzKS4KKwkJCWlmICggIWRvY3VtZW50LmJvZHkgKSB7CisJCQkJcmV0dXJuIHNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSwgMSApOworCQkJfQorCisJCQkvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKKwkJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKKworCQkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKKwkJCWlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQorCQkJcmVhZHlMaXN0LmZpcmVXaXRoKCBkb2N1bWVudCwgWyBqUXVlcnkgXSApOworCisJCQkvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHMKKwkJCWlmICggalF1ZXJ5LmZuLnRyaWdnZXIgKSB7CisJCQkJalF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXIoICJyZWFkeSIgKS5vZmYoICJyZWFkeSIgKTsKKwkJCX0KKwkJfQorCX0sCisKKwliaW5kUmVhZHk6IGZ1bmN0aW9uKCkgeworCQlpZiAoIHJlYWR5TGlzdCApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXJlYWR5TGlzdCA9IGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKTsKKworCQkvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBhZnRlciB0aGUKKwkJLy8gYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KKwkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgeworCQkJLy8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5CisJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CisJCX0KKworCQkvLyBNb3ppbGxhLCBPcGVyYSBhbmQgd2Via2l0IG5pZ2h0bGllcyBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIGV2ZW50CisJCWlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKKwkJCS8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sKKwkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKKworCQkJLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKKwkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAibG9hZCIsIGpRdWVyeS5yZWFkeSwgZmFsc2UgKTsKKworCQkvLyBJZiBJRSBldmVudCBtb2RlbCBpcyB1c2VkCisJCX0gZWxzZSBpZiAoIGRvY3VtZW50LmF0dGFjaEV2ZW50ICkgeworCQkJLy8gZW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLAorCQkJLy8gbWF5YmUgbGF0ZSBidXQgc2FmZSBhbHNvIGZvciBpZnJhbWVzCisJCQlkb2N1bWVudC5hdHRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKKworCQkJLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKKwkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGpRdWVyeS5yZWFkeSApOworCisJCQkvLyBJZiBJRSBhbmQgbm90IGEgZnJhbWUKKwkJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKKwkJCXZhciB0b3BsZXZlbCA9IGZhbHNlOworCisJCQl0cnkgeworCQkJCXRvcGxldmVsID0gd2luZG93LmZyYW1lRWxlbWVudCA9PSBudWxsOworCQkJfSBjYXRjaChlKSB7fQorCisJCQlpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCAmJiB0b3BsZXZlbCApIHsKKwkJCQlkb1Njcm9sbENoZWNrKCk7CisJCQl9CisJCX0KKwl9LAorCisJLy8gU2VlIHRlc3QvdW5pdC9jb3JlLmpzIGZvciBkZXRhaWxzIGNvbmNlcm5pbmcgaXNGdW5jdGlvbi4KKwkvLyBTaW5jZSB2ZXJzaW9uIDEuMywgRE9NIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBsaWtlIGFsZXJ0CisJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KKwlpc0Z1bmN0aW9uOiBmdW5jdGlvbiggb2JqICkgeworCQlyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImZ1bmN0aW9uIjsKKwl9LAorCisJaXNBcnJheTogQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiggb2JqICkgeworCQlyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImFycmF5IjsKKwl9LAorCisJaXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT0gb2JqLndpbmRvdzsKKwl9LAorCisJaXNOdW1lcmljOiBmdW5jdGlvbiggb2JqICkgeworCQlyZXR1cm4gIWlzTmFOKCBwYXJzZUZsb2F0KG9iaikgKSAmJiBpc0Zpbml0ZSggb2JqICk7CisJfSwKKworCXR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiBvYmogPT0gbnVsbCA/CisJCQlTdHJpbmcoIG9iaiApIDoKKwkJCWNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwob2JqKSBdIHx8ICJvYmplY3QiOworCX0sCisKKwlpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkgeworCQkvLyBNdXN0IGJlIGFuIE9iamVjdC4KKwkJLy8gQmVjYXVzZSBvZiBJRSwgd2UgYWxzbyBoYXZlIHRvIGNoZWNrIHRoZSBwcmVzZW5jZSBvZiB0aGUgY29uc3RydWN0b3IgcHJvcGVydHkuCisJCS8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMgZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsCisJCWlmICggIW9iaiB8fCBqUXVlcnkudHlwZShvYmopICE9PSAib2JqZWN0IiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXRyeSB7CisJCQkvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0CisJCQlpZiAoIG9iai5jb25zdHJ1Y3RvciAmJgorCQkJCSFoYXNPd24uY2FsbChvYmosICJjb25zdHJ1Y3RvciIpICYmCisJCQkJIWhhc093bi5jYWxsKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsICJpc1Byb3RvdHlwZU9mIikgKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGNhdGNoICggZSApIHsKKwkJCS8vIElFOCw5IFdpbGwgdGhyb3cgZXhjZXB0aW9ucyBvbiBjZXJ0YWluIGhvc3Qgb2JqZWN0cyAjOTg5NworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8gc3BlZWQgdXAsCisJCS8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLgorCisJCXZhciBrZXk7CisJCWZvciAoIGtleSBpbiBvYmogKSB7fQorCisJCXJldHVybiBrZXkgPT09IHVuZGVmaW5lZCB8fCBoYXNPd24uY2FsbCggb2JqLCBrZXkgKTsKKwl9LAorCisJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKKwkJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0sCisKKwllcnJvcjogZnVuY3Rpb24oIG1zZyApIHsKKwkJdGhyb3cgbmV3IEVycm9yKCBtc2cgKTsKKwl9LAorCisJcGFyc2VKU09OOiBmdW5jdGlvbiggZGF0YSApIHsKKwkJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgfHwgIWRhdGEgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCAoSUUgY2FuJ3QgaGFuZGxlIGl0KQorCQlkYXRhID0galF1ZXJ5LnRyaW0oIGRhdGEgKTsKKworCQkvLyBBdHRlbXB0IHRvIHBhcnNlIHVzaW5nIHRoZSBuYXRpdmUgSlNPTiBwYXJzZXIgZmlyc3QKKwkJaWYgKCB3aW5kb3cuSlNPTiAmJiB3aW5kb3cuSlNPTi5wYXJzZSApIHsKKwkJCXJldHVybiB3aW5kb3cuSlNPTi5wYXJzZSggZGF0YSApOworCQl9CisKKwkJLy8gTWFrZSBzdXJlIHRoZSBpbmNvbWluZyBkYXRhIGlzIGFjdHVhbCBKU09OCisJCS8vIExvZ2ljIGJvcnJvd2VkIGZyb20gaHR0cDovL2pzb24ub3JnL2pzb24yLmpzCisJCWlmICggcnZhbGlkY2hhcnMudGVzdCggZGF0YS5yZXBsYWNlKCBydmFsaWRlc2NhcGUsICJAIiApCisJCQkucmVwbGFjZSggcnZhbGlkdG9rZW5zLCAiXSIgKQorCQkJLnJlcGxhY2UoIHJ2YWxpZGJyYWNlcywgIiIpKSApIHsKKworCQkJcmV0dXJuICggbmV3IEZ1bmN0aW9uKCAicmV0dXJuICIgKyBkYXRhICkgKSgpOworCisJCX0KKwkJalF1ZXJ5LmVycm9yKCAiSW52YWxpZCBKU09OOiAiICsgZGF0YSApOworCX0sCisKKwkvLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCisJcGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkgeworCQlpZiAoIHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiB8fCAhZGF0YSApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXZhciB4bWwsIHRtcDsKKwkJdHJ5IHsKKwkJCWlmICggd2luZG93LkRPTVBhcnNlciApIHsgLy8gU3RhbmRhcmQKKwkJCQl0bXAgPSBuZXcgRE9NUGFyc2VyKCk7CisJCQkJeG1sID0gdG1wLnBhcnNlRnJvbVN0cmluZyggZGF0YSAsICJ0ZXh0L3htbCIgKTsKKwkJCX0gZWxzZSB7IC8vIElFCisJCQkJeG1sID0gbmV3IEFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MRE9NIiApOworCQkJCXhtbC5hc3luYyA9ICJmYWxzZSI7CisJCQkJeG1sLmxvYWRYTUwoIGRhdGEgKTsKKwkJCX0KKwkJfSBjYXRjaCggZSApIHsKKwkJCXhtbCA9IHVuZGVmaW5lZDsKKwkJfQorCQlpZiAoICF4bWwgfHwgIXhtbC5kb2N1bWVudEVsZW1lbnQgfHwgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAicGFyc2VyZXJyb3IiICkubGVuZ3RoICkgeworCQkJalF1ZXJ5LmVycm9yKCAiSW52YWxpZCBYTUw6ICIgKyBkYXRhICk7CisJCX0KKwkJcmV0dXJuIHhtbDsKKwl9LAorCisJbm9vcDogZnVuY3Rpb24oKSB7fSwKKworCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CisJLy8gV29ya2Fyb3VuZHMgYmFzZWQgb24gZmluZGluZ3MgYnkgSmltIERyaXNjb2xsCisJLy8gaHR0cDovL3dlYmxvZ3MuamF2YS5uZXQvYmxvZy9kcmlzY29sbC9hcmNoaXZlLzIwMDkvMDkvMDgvZXZhbC1qYXZhc2NyaXB0LWdsb2JhbC1jb250ZXh0CisJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CisJCWlmICggZGF0YSAmJiBybm90d2hpdGUudGVzdCggZGF0YSApICkgeworCQkJLy8gV2UgdXNlIGV4ZWNTY3JpcHQgb24gSW50ZXJuZXQgRXhwbG9yZXIKKwkJCS8vIFdlIHVzZSBhbiBhbm9ueW1vdXMgZnVuY3Rpb24gc28gdGhhdCBjb250ZXh0IGlzIHdpbmRvdworCQkJLy8gcmF0aGVyIHRoYW4galF1ZXJ5IGluIEZpcmVmb3gKKwkJCSggd2luZG93LmV4ZWNTY3JpcHQgfHwgZnVuY3Rpb24oIGRhdGEgKSB7CisJCQkJd2luZG93WyAiZXZhbCIgXS5jYWxsKCB3aW5kb3csIGRhdGEgKTsKKwkJCX0gKSggZGF0YSApOworCQl9CisJfSwKKworCS8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKKwkvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCisJY2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkgeworCQlyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgIm1zLSIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7CisJfSwKKworCW5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKwkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lLnRvVXBwZXJDYXNlKCk7CisJfSwKKworCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKKwllYWNoOiBmdW5jdGlvbiggb2JqZWN0LCBjYWxsYmFjaywgYXJncyApIHsKKwkJdmFyIG5hbWUsIGkgPSAwLAorCQkJbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aCwKKwkJCWlzT2JqID0gbGVuZ3RoID09PSB1bmRlZmluZWQgfHwgalF1ZXJ5LmlzRnVuY3Rpb24oIG9iamVjdCApOworCisJCWlmICggYXJncyApIHsKKwkJCWlmICggaXNPYmogKSB7CisJCQkJZm9yICggbmFtZSBpbiBvYmplY3QgKSB7CisJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgbmFtZSBdLCBhcmdzICkgPT09IGZhbHNlICkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKSB7CisJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgaSsrIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAorCQl9IGVsc2UgeworCQkJaWYgKCBpc09iaiApIHsKKwkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApIHsKKwkJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmplY3RbIG5hbWUgXSwgbmFtZSwgb2JqZWN0WyBuYW1lIF0gKSA9PT0gZmFsc2UgKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyApIHsKKwkJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmplY3RbIGkgXSwgaSwgb2JqZWN0WyBpKysgXSApID09PSBmYWxzZSApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIG9iamVjdDsKKwl9LAorCisJLy8gVXNlIG5hdGl2ZSBTdHJpbmcudHJpbSBmdW5jdGlvbiB3aGVyZXZlciBwb3NzaWJsZQorCXRyaW06IHRyaW0gPworCQlmdW5jdGlvbiggdGV4dCApIHsKKwkJCXJldHVybiB0ZXh0ID09IG51bGwgPworCQkJCSIiIDoKKwkJCQl0cmltLmNhbGwoIHRleHQgKTsKKwkJfSA6CisKKwkJLy8gT3RoZXJ3aXNlIHVzZSBvdXIgb3duIHRyaW1taW5nIGZ1bmN0aW9uYWxpdHkKKwkJZnVuY3Rpb24oIHRleHQgKSB7CisJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KKwkJCQkiIiA6CisJCQkJdGV4dC50b1N0cmluZygpLnJlcGxhY2UoIHRyaW1MZWZ0LCAiIiApLnJlcGxhY2UoIHRyaW1SaWdodCwgIiIgKTsKKwkJfSwKKworCS8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKKwltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKKwkJdmFyIHJldCA9IHJlc3VsdHMgfHwgW107CisKKwkJaWYgKCBhcnJheSAhPSBudWxsICkgeworCQkJLy8gVGhlIHdpbmRvdywgc3RyaW5ncyAoYW5kIGZ1bmN0aW9ucykgYWxzbyBoYXZlICdsZW5ndGgnCisJCQkvLyBUd2Vha2VkIGxvZ2ljIHNsaWdodGx5IHRvIGhhbmRsZSBCbGFja2JlcnJ5IDQuNyBSZWdFeHAgaXNzdWVzICM2OTMwCisJCQl2YXIgdHlwZSA9IGpRdWVyeS50eXBlKCBhcnJheSApOworCisJCQlpZiAoIGFycmF5Lmxlbmd0aCA9PSBudWxsIHx8IHR5cGUgPT09ICJzdHJpbmciIHx8IHR5cGUgPT09ICJmdW5jdGlvbiIgfHwgdHlwZSA9PT0gInJlZ2V4cCIgfHwgalF1ZXJ5LmlzV2luZG93KCBhcnJheSApICkgeworCQkJCXB1c2guY2FsbCggcmV0LCBhcnJheSApOworCQkJfSBlbHNlIHsKKwkJCQlqUXVlcnkubWVyZ2UoIHJldCwgYXJyYXkgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKworCWluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnJheSwgaSApIHsKKwkJdmFyIGxlbjsKKworCQlpZiAoIGFycmF5ICkgeworCQkJaWYgKCBpbmRleE9mICkgeworCQkJCXJldHVybiBpbmRleE9mLmNhbGwoIGFycmF5LCBlbGVtLCBpICk7CisJCQl9CisKKwkJCWxlbiA9IGFycmF5Lmxlbmd0aDsKKwkJCWkgPSBpID8gaSA8IDAgPyBNYXRoLm1heCggMCwgbGVuICsgaSApIDogaSA6IDA7CisKKwkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworCQkJCS8vIFNraXAgYWNjZXNzaW5nIGluIHNwYXJzZSBhcnJheXMKKwkJCQlpZiAoIGkgaW4gYXJyYXkgJiYgYXJyYXlbIGkgXSA9PT0gZWxlbSApIHsKKwkJCQkJcmV0dXJuIGk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIC0xOworCX0sCisKKwltZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7CisJCXZhciBpID0gZmlyc3QubGVuZ3RoLAorCQkJaiA9IDA7CisKKwkJaWYgKCB0eXBlb2Ygc2Vjb25kLmxlbmd0aCA9PT0gIm51bWJlciIgKSB7CisJCQlmb3IgKCB2YXIgbCA9IHNlY29uZC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CisJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCXdoaWxlICggc2Vjb25kW2pdICE9PSB1bmRlZmluZWQgKSB7CisJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKKwkJCX0KKwkJfQorCisJCWZpcnN0Lmxlbmd0aCA9IGk7CisKKwkJcmV0dXJuIGZpcnN0OworCX0sCisKKwlncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CisJCXZhciByZXQgPSBbXSwgcmV0VmFsOworCQlpbnYgPSAhIWludjsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCisJCS8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uCisJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQlyZXRWYWwgPSAhIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CisJCQlpZiAoIGludiAhPT0gcmV0VmFsICkgeworCQkJCXJldC5wdXNoKCBlbGVtc1sgaSBdICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwkvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKKwltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKKwkJdmFyIHZhbHVlLCBrZXksIHJldCA9IFtdLAorCQkJaSA9IDAsCisJCQlsZW5ndGggPSBlbGVtcy5sZW5ndGgsCisJCQkvLyBqcXVlcnkgb2JqZWN0cyBhcmUgdHJlYXRlZCBhcyBhcnJheXMKKwkJCWlzQXJyYXkgPSBlbGVtcyBpbnN0YW5jZW9mIGpRdWVyeSB8fCBsZW5ndGggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiAoICggbGVuZ3RoID4gMCAmJiBlbGVtc1sgMCBdICYmIGVsZW1zWyBsZW5ndGggLTEgXSApIHx8IGxlbmd0aCA9PT0gMCB8fCBqUXVlcnkuaXNBcnJheSggZWxlbXMgKSApIDsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKKwkJaWYgKCBpc0FycmF5ICkgeworCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CisKKwkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CisJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CisJCQkJfQorCQkJfQorCisJCS8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsCisJCX0gZWxzZSB7CisJCQlmb3IgKCBrZXkgaW4gZWxlbXMgKSB7CisJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGtleSBdLCBrZXksIGFyZyApOworCisJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgeworCQkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKKwkJcmV0dXJuIHJldC5jb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKKwl9LAorCisJLy8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzCisJZ3VpZDogMSwKKworCS8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueQorCS8vIGFyZ3VtZW50cy4KKwlwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgeworCQlpZiAoIHR5cGVvZiBjb250ZXh0ID09PSAic3RyaW5nIiApIHsKKwkJCXZhciB0bXAgPSBmblsgY29udGV4dCBdOworCQkJY29udGV4dCA9IGZuOworCQkJZm4gPSB0bXA7CisJCX0KKworCQkvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlYworCQkvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLgorCQlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKKwkJCXJldHVybiB1bmRlZmluZWQ7CisJCX0KKworCQkvLyBTaW11bGF0ZWQgYmluZAorCQl2YXIgYXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApLAorCQkJcHJveHkgPSBmdW5jdGlvbigpIHsKKwkJCQlyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7CisJCQl9OworCisJCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAorCQlwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgcHJveHkuZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOworCisJCXJldHVybiBwcm94eTsKKwl9LAorCisJLy8gTXV0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyB0byBhIGNvbGxlY3Rpb24KKwkvLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb24KKwlhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHBhc3MgKSB7CisJCXZhciBleGVjLAorCQkJYnVsayA9IGtleSA9PSBudWxsLAorCQkJaSA9IDAsCisJCQlsZW5ndGggPSBlbGVtcy5sZW5ndGg7CisKKwkJLy8gU2V0cyBtYW55IHZhbHVlcworCQlpZiAoIGtleSAmJiB0eXBlb2Yga2V5ID09PSAib2JqZWN0IiApIHsKKwkJCWZvciAoIGkgaW4ga2V5ICkgeworCQkJCWpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5W2ldLCAxLCBlbXB0eUdldCwgdmFsdWUgKTsKKwkJCX0KKwkJCWNoYWluYWJsZSA9IDE7CisKKwkJLy8gU2V0cyBvbmUgdmFsdWUKKwkJfSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKKwkJCS8vIE9wdGlvbmFsbHksIGZ1bmN0aW9uIHZhbHVlcyBnZXQgZXhlY3V0ZWQgaWYgZXhlYyBpcyB0cnVlCisJCQlleGVjID0gcGFzcyA9PT0gdW5kZWZpbmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOworCisJCQlpZiAoIGJ1bGsgKSB7CisJCQkJLy8gQnVsayBvcGVyYXRpb25zIG9ubHkgaXRlcmF0ZSB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvbiB2YWx1ZXMKKwkJCQlpZiAoIGV4ZWMgKSB7CisJCQkJCWV4ZWMgPSBmbjsKKwkJCQkJZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKKwkJCQkJCXJldHVybiBleGVjLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApOworCQkJCQl9OworCisJCQkJLy8gT3RoZXJ3aXNlIHRoZXkgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXQKKwkJCQl9IGVsc2UgeworCQkJCQlmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTsKKwkJCQkJZm4gPSBudWxsOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCBmbiApIHsKKwkJCQlmb3IgKDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJCQlmbiggZWxlbXNbaV0sIGtleSwgZXhlYyA/IHZhbHVlLmNhbGwoIGVsZW1zW2ldLCBpLCBmbiggZWxlbXNbaV0sIGtleSApICkgOiB2YWx1ZSwgcGFzcyApOworCQkJCX0KKwkJCX0KKworCQkJY2hhaW5hYmxlID0gMTsKKwkJfQorCisJCXJldHVybiBjaGFpbmFibGUgPworCQkJZWxlbXMgOgorCisJCQkvLyBHZXRzCisJCQlidWxrID8KKwkJCQlmbi5jYWxsKCBlbGVtcyApIDoKKwkJCQlsZW5ndGggPyBmbiggZWxlbXNbMF0sIGtleSApIDogZW1wdHlHZXQ7CisJfSwKKworCW5vdzogZnVuY3Rpb24oKSB7CisJCXJldHVybiAoIG5ldyBEYXRlKCkgKS5nZXRUaW1lKCk7CisJfSwKKworCS8vIFVzZSBvZiBqUXVlcnkuYnJvd3NlciBpcyBmcm93bmVkIHVwb24uCisJLy8gTW9yZSBkZXRhaWxzOiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1V0aWxpdGllcy9qUXVlcnkuYnJvd3NlcgorCXVhTWF0Y2g6IGZ1bmN0aW9uKCB1YSApIHsKKwkJdWEgPSB1YS50b0xvd2VyQ2FzZSgpOworCisJCXZhciBtYXRjaCA9IHJ3ZWJraXQuZXhlYyggdWEgKSB8fAorCQkJcm9wZXJhLmV4ZWMoIHVhICkgfHwKKwkJCXJtc2llLmV4ZWMoIHVhICkgfHwKKwkJCXVhLmluZGV4T2YoImNvbXBhdGlibGUiKSA8IDAgJiYgcm1vemlsbGEuZXhlYyggdWEgKSB8fAorCQkJW107CisKKwkJcmV0dXJuIHsgYnJvd3NlcjogbWF0Y2hbMV0gfHwgIiIsIHZlcnNpb246IG1hdGNoWzJdIHx8ICIwIiB9OworCX0sCisKKwlzdWI6IGZ1bmN0aW9uKCkgeworCQlmdW5jdGlvbiBqUXVlcnlTdWIoIHNlbGVjdG9yLCBjb250ZXh0ICkgeworCQkJcmV0dXJuIG5ldyBqUXVlcnlTdWIuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTsKKwkJfQorCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCBqUXVlcnlTdWIsIHRoaXMgKTsKKwkJalF1ZXJ5U3ViLnN1cGVyY2xhc3MgPSB0aGlzOworCQlqUXVlcnlTdWIuZm4gPSBqUXVlcnlTdWIucHJvdG90eXBlID0gdGhpcygpOworCQlqUXVlcnlTdWIuZm4uY29uc3RydWN0b3IgPSBqUXVlcnlTdWI7CisJCWpRdWVyeVN1Yi5zdWIgPSB0aGlzLnN1YjsKKwkJalF1ZXJ5U3ViLmZuLmluaXQgPSBmdW5jdGlvbiBpbml0KCBzZWxlY3RvciwgY29udGV4dCApIHsKKwkJCWlmICggY29udGV4dCAmJiBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ICYmICEoY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeVN1YikgKSB7CisJCQkJY29udGV4dCA9IGpRdWVyeVN1YiggY29udGV4dCApOworCQkJfQorCisJCQlyZXR1cm4galF1ZXJ5LmZuLmluaXQuY2FsbCggdGhpcywgc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnlTdWIgKTsKKwkJfTsKKwkJalF1ZXJ5U3ViLmZuLmluaXQucHJvdG90eXBlID0galF1ZXJ5U3ViLmZuOworCQl2YXIgcm9vdGpRdWVyeVN1YiA9IGpRdWVyeVN1Yihkb2N1bWVudCk7CisJCXJldHVybiBqUXVlcnlTdWI7CisJfSwKKworCWJyb3dzZXI6IHt9Cit9KTsKKworLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCitqUXVlcnkuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSwgZnVuY3Rpb24oaSwgbmFtZSkgeworCWNsYXNzMnR5cGVbICJbb2JqZWN0ICIgKyBuYW1lICsgIl0iIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7Cit9KTsKKworYnJvd3Nlck1hdGNoID0galF1ZXJ5LnVhTWF0Y2goIHVzZXJBZ2VudCApOworaWYgKCBicm93c2VyTWF0Y2guYnJvd3NlciApIHsKKwlqUXVlcnkuYnJvd3NlclsgYnJvd3Nlck1hdGNoLmJyb3dzZXIgXSA9IHRydWU7CisJalF1ZXJ5LmJyb3dzZXIudmVyc2lvbiA9IGJyb3dzZXJNYXRjaC52ZXJzaW9uOworfQorCisvLyBEZXByZWNhdGVkLCB1c2UgalF1ZXJ5LmJyb3dzZXIud2Via2l0IGluc3RlYWQKK2lmICggalF1ZXJ5LmJyb3dzZXIud2Via2l0ICkgeworCWpRdWVyeS5icm93c2VyLnNhZmFyaSA9IHRydWU7Cit9CisKKy8vIElFIGRvZXNuJ3QgbWF0Y2ggbm9uLWJyZWFraW5nIHNwYWNlcyB3aXRoIFxzCitpZiAoIHJub3R3aGl0ZS50ZXN0KCAiXHhBMCIgKSApIHsKKwl0cmltTGVmdCA9IC9eW1xzXHhBMF0rLzsKKwl0cmltUmlnaHQgPSAvW1xzXHhBMF0rJC87Cit9CisKKy8vIEFsbCBqUXVlcnkgb2JqZWN0cyBzaG91bGQgcG9pbnQgYmFjayB0byB0aGVzZQorcm9vdGpRdWVyeSA9IGpRdWVyeShkb2N1bWVudCk7CisKKy8vIENsZWFudXAgZnVuY3Rpb25zIGZvciB0aGUgZG9jdW1lbnQgcmVhZHkgbWV0aG9kCitpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7CisJRE9NQ29udGVudExvYWRlZCA9IGZ1bmN0aW9uKCkgeworCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIERPTUNvbnRlbnRMb2FkZWQsIGZhbHNlICk7CisJCWpRdWVyeS5yZWFkeSgpOworCX07CisKK30gZWxzZSBpZiAoIGRvY3VtZW50LmF0dGFjaEV2ZW50ICkgeworCURPTUNvbnRlbnRMb2FkZWQgPSBmdW5jdGlvbigpIHsKKwkJLy8gTWFrZSBzdXJlIGJvZHkgZXhpc3RzLCBhdCBsZWFzdCwgaW4gY2FzZSBJRSBnZXRzIGEgbGl0dGxlIG92ZXJ6ZWFsb3VzICh0aWNrZXQgIzU0NDMpLgorCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CisJCQlkb2N1bWVudC5kZXRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKKwkJCWpRdWVyeS5yZWFkeSgpOworCQl9CisJfTsKK30KKworLy8gVGhlIERPTSByZWFkeSBjaGVjayBmb3IgSW50ZXJuZXQgRXhwbG9yZXIKK2Z1bmN0aW9uIGRvU2Nyb2xsQ2hlY2soKSB7CisJaWYgKCBqUXVlcnkuaXNSZWFkeSApIHsKKwkJcmV0dXJuOworCX0KKworCXRyeSB7CisJCS8vIElmIElFIGlzIHVzZWQsIHVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pCisJCS8vIGh0dHA6Ly9qYXZhc2NyaXB0Lm53Ym94LmNvbS9JRUNvbnRlbnRMb2FkZWQvCisJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOworCX0gY2F0Y2goZSkgeworCQlzZXRUaW1lb3V0KCBkb1Njcm9sbENoZWNrLCAxICk7CisJCXJldHVybjsKKwl9CisKKwkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMKKwlqUXVlcnkucmVhZHkoKTsKK30KKworcmV0dXJuIGpRdWVyeTsKKworfSkoKTsKKworCisvLyBTdHJpbmcgdG8gT2JqZWN0IGZsYWdzIGZvcm1hdCBjYWNoZQordmFyIGZsYWdzQ2FjaGUgPSB7fTsKKworLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIGZsYWdzIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzIGFuZCBzdG9yZSBpbiBjYWNoZQorZnVuY3Rpb24gY3JlYXRlRmxhZ3MoIGZsYWdzICkgeworCXZhciBvYmplY3QgPSBmbGFnc0NhY2hlWyBmbGFncyBdID0ge30sCisJCWksIGxlbmd0aDsKKwlmbGFncyA9IGZsYWdzLnNwbGl0KCAvXHMrLyApOworCWZvciAoIGkgPSAwLCBsZW5ndGggPSBmbGFncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJb2JqZWN0WyBmbGFnc1tpXSBdID0gdHJ1ZTsKKwl9CisJcmV0dXJuIG9iamVjdDsKK30KKworLyoKKyAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICoKKyAqCWZsYWdzOglhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBmbGFncyB0aGF0IHdpbGwgY2hhbmdlIGhvdworICoJCQl0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzCisgKgorICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKKyAqICJmaXJlZCIgbXVsdGlwbGUgdGltZXMuCisgKgorICogUG9zc2libGUgZmxhZ3M6CisgKgorICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCisgKgorICoJbWVtb3J5OgkJCXdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWQKKyAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgorICoJCQkJCXZhbHVlcyAobGlrZSBhIERlZmVycmVkKQorICoKKyAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKKyAqCisgKglzdG9wT25GYWxzZToJaW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlCisgKgorICovCitqUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIGZsYWdzICkgeworCisJLy8gQ29udmVydCBmbGFncyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZAorCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKKwlmbGFncyA9IGZsYWdzID8gKCBmbGFnc0NhY2hlWyBmbGFncyBdIHx8IGNyZWF0ZUZsYWdzKCBmbGFncyApICkgOiB7fTsKKworCXZhciAvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdAorCQlsaXN0ID0gW10sCisJCS8vIFN0YWNrIG9mIGZpcmUgY2FsbHMgZm9yIHJlcGVhdGFibGUgbGlzdHMKKwkJc3RhY2sgPSBbXSwKKwkJLy8gTGFzdCBmaXJlIHZhbHVlIChmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzKQorCQltZW1vcnksCisJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCisJCWZpcmVkLAorCQkvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nCisJCWZpcmluZywKKwkJLy8gRmlyc3QgY2FsbGJhY2sgdG8gZmlyZSAodXNlZCBpbnRlcm5hbGx5IGJ5IGFkZCBhbmQgZmlyZVdpdGgpCisJCWZpcmluZ1N0YXJ0LAorCQkvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmcKKwkJZmlyaW5nTGVuZ3RoLAorCQkvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSByZW1vdmUgaWYgbmVlZGVkKQorCQlmaXJpbmdJbmRleCwKKwkJLy8gQWRkIG9uZSBvciBzZXZlcmFsIGNhbGxiYWNrcyB0byB0aGUgbGlzdAorCQlhZGQgPSBmdW5jdGlvbiggYXJncyApIHsKKwkJCXZhciBpLAorCQkJCWxlbmd0aCwKKwkJCQllbGVtLAorCQkJCXR5cGUsCisJCQkJYWN0dWFsOworCQkJZm9yICggaSA9IDAsIGxlbmd0aCA9IGFyZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQkJZWxlbSA9IGFyZ3NbIGkgXTsKKwkJCQl0eXBlID0galF1ZXJ5LnR5cGUoIGVsZW0gKTsKKwkJCQlpZiAoIHR5cGUgPT09ICJhcnJheSIgKSB7CisJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKKwkJCQkJYWRkKCBlbGVtICk7CisJCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKKwkJCQkJLy8gQWRkIGlmIG5vdCBpbiB1bmlxdWUgbW9kZSBhbmQgY2FsbGJhY2sgaXMgbm90IGluCisJCQkJCWlmICggIWZsYWdzLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGVsZW0gKSApIHsKKwkJCQkJCWxpc3QucHVzaCggZWxlbSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9LAorCQkvLyBGaXJlIGNhbGxiYWNrcworCQlmaXJlID0gZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7CisJCQlhcmdzID0gYXJncyB8fCBbXTsKKwkJCW1lbW9yeSA9ICFmbGFncy5tZW1vcnkgfHwgWyBjb250ZXh0LCBhcmdzIF07CisJCQlmaXJlZCA9IHRydWU7CisJCQlmaXJpbmcgPSB0cnVlOworCQkJZmlyaW5nSW5kZXggPSBmaXJpbmdTdGFydCB8fCAwOworCQkJZmlyaW5nU3RhcnQgPSAwOworCQkJZmlyaW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7CisJCQlmb3IgKCA7IGxpc3QgJiYgZmlyaW5nSW5kZXggPCBmaXJpbmdMZW5ndGg7IGZpcmluZ0luZGV4KysgKSB7CisJCQkJaWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBjb250ZXh0LCBhcmdzICkgPT09IGZhbHNlICYmIGZsYWdzLnN0b3BPbkZhbHNlICkgeworCQkJCQltZW1vcnkgPSB0cnVlOyAvLyBNYXJrIGFzIGhhbHRlZAorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlmaXJpbmcgPSBmYWxzZTsKKwkJCWlmICggbGlzdCApIHsKKwkJCQlpZiAoICFmbGFncy5vbmNlICkgeworCQkJCQlpZiAoIHN0YWNrICYmIHN0YWNrLmxlbmd0aCApIHsKKwkJCQkJCW1lbW9yeSA9IHN0YWNrLnNoaWZ0KCk7CisJCQkJCQlzZWxmLmZpcmVXaXRoKCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoIG1lbW9yeSA9PT0gdHJ1ZSApIHsKKwkJCQkJc2VsZi5kaXNhYmxlKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbGlzdCA9IFtdOworCQkJCX0KKwkJCX0KKwkJfSwKKwkJLy8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3QKKwkJc2VsZiA9IHsKKwkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKKwkJCWFkZDogZnVuY3Rpb24oKSB7CisJCQkJaWYgKCBsaXN0ICkgeworCQkJCQl2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGg7CisJCQkJCWFkZCggYXJndW1lbnRzICk7CisJCQkJCS8vIERvIHdlIG5lZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhlCisJCQkJCS8vIGN1cnJlbnQgZmlyaW5nIGJhdGNoPworCQkJCQlpZiAoIGZpcmluZyApIHsKKwkJCQkJCWZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoOworCQkJCQkvLyBXaXRoIG1lbW9yeSwgaWYgd2UncmUgbm90IGZpcmluZyB0aGVuCisJCQkJCS8vIHdlIHNob3VsZCBjYWxsIHJpZ2h0IGF3YXksIHVubGVzcyBwcmV2aW91cworCQkJCQkvLyBmaXJpbmcgd2FzIGhhbHRlZCAoc3RvcE9uRmFsc2UpCisJCQkJCX0gZWxzZSBpZiAoIG1lbW9yeSAmJiBtZW1vcnkgIT09IHRydWUgKSB7CisJCQkJCQlmaXJpbmdTdGFydCA9IGxlbmd0aDsKKwkJCQkJCWZpcmUoIG1lbW9yeVsgMCBdLCBtZW1vcnlbIDEgXSApOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiB0aGlzOworCQkJfSwKKwkJCS8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3QKKwkJCXJlbW92ZTogZnVuY3Rpb24oKSB7CisJCQkJaWYgKCBsaXN0ICkgeworCQkJCQl2YXIgYXJncyA9IGFyZ3VtZW50cywKKwkJCQkJCWFyZ0luZGV4ID0gMCwKKwkJCQkJCWFyZ0xlbmd0aCA9IGFyZ3MubGVuZ3RoOworCQkJCQlmb3IgKCA7IGFyZ0luZGV4IDwgYXJnTGVuZ3RoIDsgYXJnSW5kZXgrKyApIHsKKwkJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKysgKSB7CisJCQkJCQkJaWYgKCBhcmdzWyBhcmdJbmRleCBdID09PSBsaXN0WyBpIF0gKSB7CisJCQkJCQkJCS8vIEhhbmRsZSBmaXJpbmdJbmRleCBhbmQgZmlyaW5nTGVuZ3RoCisJCQkJCQkJCWlmICggZmlyaW5nICkgeworCQkJCQkJCQkJaWYgKCBpIDw9IGZpcmluZ0xlbmd0aCApIHsKKwkJCQkJCQkJCQlmaXJpbmdMZW5ndGgtLTsKKwkJCQkJCQkJCQlpZiAoIGkgPD0gZmlyaW5nSW5kZXggKSB7CisJCQkJCQkJCQkJCWZpcmluZ0luZGV4LS07CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCS8vIFJlbW92ZSB0aGUgZWxlbWVudAorCQkJCQkJCQlsaXN0LnNwbGljZSggaS0tLCAxICk7CisJCQkJCQkJCS8vIElmIHdlIGhhdmUgc29tZSB1bmljaXR5IHByb3BlcnR5IHRoZW4KKwkJCQkJCQkJLy8gd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgb25jZQorCQkJCQkJCQlpZiAoIGZsYWdzLnVuaXF1ZSApIHsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiB0aGlzOworCQkJfSwKKwkJCS8vIENvbnRyb2wgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdAorCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CisJCQkJaWYgKCBsaXN0ICkgeworCQkJCQl2YXIgaSA9IDAsCisJCQkJCQlsZW5ndGggPSBsaXN0Lmxlbmd0aDsKKwkJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQkJCQlpZiAoIGZuID09PSBsaXN0WyBpIF0gKSB7CisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSwKKwkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKKwkJCWVtcHR5OiBmdW5jdGlvbigpIHsKKwkJCQlsaXN0ID0gW107CisJCQkJcmV0dXJuIHRoaXM7CisJCQl9LAorCQkJLy8gSGF2ZSB0aGUgbGlzdCBkbyBub3RoaW5nIGFueW1vcmUKKwkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgeworCQkJCWxpc3QgPSBzdGFjayA9IG1lbW9yeSA9IHVuZGVmaW5lZDsKKwkJCQlyZXR1cm4gdGhpczsKKwkJCX0sCisJCQkvLyBJcyBpdCBkaXNhYmxlZD8KKwkJCWRpc2FibGVkOiBmdW5jdGlvbigpIHsKKwkJCQlyZXR1cm4gIWxpc3Q7CisJCQl9LAorCQkJLy8gTG9jayB0aGUgbGlzdCBpbiBpdHMgY3VycmVudCBzdGF0ZQorCQkJbG9jazogZnVuY3Rpb24oKSB7CisJCQkJc3RhY2sgPSB1bmRlZmluZWQ7CisJCQkJaWYgKCAhbWVtb3J5IHx8IG1lbW9yeSA9PT0gdHJ1ZSApIHsKKwkJCQkJc2VsZi5kaXNhYmxlKCk7CisJCQkJfQorCQkJCXJldHVybiB0aGlzOworCQkJfSwKKwkJCS8vIElzIGl0IGxvY2tlZD8KKwkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CisJCQkJcmV0dXJuICFzdGFjazsKKwkJCX0sCisJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCisJCQlmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7CisJCQkJaWYgKCBzdGFjayApIHsKKwkJCQkJaWYgKCBmaXJpbmcgKSB7CisJCQkJCQlpZiAoICFmbGFncy5vbmNlICkgeworCQkJCQkJCXN0YWNrLnB1c2goIFsgY29udGV4dCwgYXJncyBdICk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoICEoIGZsYWdzLm9uY2UgJiYgbWVtb3J5ICkgKSB7CisJCQkJCQlmaXJlKCBjb250ZXh0LCBhcmdzICk7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIHRoaXM7CisJCQl9LAorCQkJLy8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMKKwkJCWZpcmU6IGZ1bmN0aW9uKCkgeworCQkJCXNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApOworCQkJCXJldHVybiB0aGlzOworCQkJfSwKKwkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQorCQkJZmlyZWQ6IGZ1bmN0aW9uKCkgeworCQkJCXJldHVybiAhIWZpcmVkOworCQkJfQorCQl9OworCisJcmV0dXJuIHNlbGY7Cit9OworCisKKworCit2YXIgLy8gU3RhdGljIHJlZmVyZW5jZSB0byBzbGljZQorCXNsaWNlRGVmZXJyZWQgPSBbXS5zbGljZTsKKworalF1ZXJ5LmV4dGVuZCh7CisKKwlEZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7CisJCXZhciBkb25lTGlzdCA9IGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwKKwkJCWZhaWxMaXN0ID0galF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAorCQkJcHJvZ3Jlc3NMaXN0ID0galF1ZXJ5LkNhbGxiYWNrcyggIm1lbW9yeSIgKSwKKwkJCXN0YXRlID0gInBlbmRpbmciLAorCQkJbGlzdHMgPSB7CisJCQkJcmVzb2x2ZTogZG9uZUxpc3QsCisJCQkJcmVqZWN0OiBmYWlsTGlzdCwKKwkJCQlub3RpZnk6IHByb2dyZXNzTGlzdAorCQkJfSwKKwkJCXByb21pc2UgPSB7CisJCQkJZG9uZTogZG9uZUxpc3QuYWRkLAorCQkJCWZhaWw6IGZhaWxMaXN0LmFkZCwKKwkJCQlwcm9ncmVzczogcHJvZ3Jlc3NMaXN0LmFkZCwKKworCQkJCXN0YXRlOiBmdW5jdGlvbigpIHsKKwkJCQkJcmV0dXJuIHN0YXRlOworCQkJCX0sCisKKwkJCQkvLyBEZXByZWNhdGVkCisJCQkJaXNSZXNvbHZlZDogZG9uZUxpc3QuZmlyZWQsCisJCQkJaXNSZWplY3RlZDogZmFpbExpc3QuZmlyZWQsCisKKwkJCQl0aGVuOiBmdW5jdGlvbiggZG9uZUNhbGxiYWNrcywgZmFpbENhbGxiYWNrcywgcHJvZ3Jlc3NDYWxsYmFja3MgKSB7CisJCQkJCWRlZmVycmVkLmRvbmUoIGRvbmVDYWxsYmFja3MgKS5mYWlsKCBmYWlsQ2FsbGJhY2tzICkucHJvZ3Jlc3MoIHByb2dyZXNzQ2FsbGJhY2tzICk7CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0sCisJCQkJYWx3YXlzOiBmdW5jdGlvbigpIHsKKwkJCQkJZGVmZXJyZWQuZG9uZS5hcHBseSggZGVmZXJyZWQsIGFyZ3VtZW50cyApLmZhaWwuYXBwbHkoIGRlZmVycmVkLCBhcmd1bWVudHMgKTsKKwkJCQkJcmV0dXJuIHRoaXM7CisJCQkJfSwKKwkJCQlwaXBlOiBmdW5jdGlvbiggZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKSB7CisJCQkJCXJldHVybiBqUXVlcnkuRGVmZXJyZWQoZnVuY3Rpb24oIG5ld0RlZmVyICkgeworCQkJCQkJalF1ZXJ5LmVhY2goIHsKKwkJCQkJCQlkb25lOiBbIGZuRG9uZSwgInJlc29sdmUiIF0sCisJCQkJCQkJZmFpbDogWyBmbkZhaWwsICJyZWplY3QiIF0sCisJCQkJCQkJcHJvZ3Jlc3M6IFsgZm5Qcm9ncmVzcywgIm5vdGlmeSIgXQorCQkJCQkJfSwgZnVuY3Rpb24oIGhhbmRsZXIsIGRhdGEgKSB7CisJCQkJCQkJdmFyIGZuID0gZGF0YVsgMCBdLAorCQkJCQkJCQlhY3Rpb24gPSBkYXRhWyAxIF0sCisJCQkJCQkJCXJldHVybmVkOworCQkJCQkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGZuICkgKSB7CisJCQkJCQkJCWRlZmVycmVkWyBoYW5kbGVyIF0oZnVuY3Rpb24oKSB7CisJCQkJCQkJCQlyZXR1cm5lZCA9IGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHsKKwkJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkudGhlbiggbmV3RGVmZXIucmVzb2x2ZSwgbmV3RGVmZXIucmVqZWN0LCBuZXdEZWZlci5ub3RpZnkgKTsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJbmV3RGVmZXJbIGFjdGlvbiArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IG5ld0RlZmVyIDogdGhpcywgWyByZXR1cm5lZCBdICk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0pOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWRlZmVycmVkWyBoYW5kbGVyIF0oIG5ld0RlZmVyWyBhY3Rpb24gXSApOworCQkJCQkJCX0KKwkJCQkJCX0pOworCQkJCQl9KS5wcm9taXNlKCk7CisJCQkJfSwKKwkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCisJCQkJLy8gSWYgb2JqIGlzIHByb3ZpZGVkLCB0aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQgdG8gdGhlIG9iamVjdAorCQkJCXByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7CisJCQkJCWlmICggb2JqID09IG51bGwgKSB7CisJCQkJCQlvYmogPSBwcm9taXNlOworCQkJCQl9IGVsc2UgeworCQkJCQkJZm9yICggdmFyIGtleSBpbiBwcm9taXNlICkgeworCQkJCQkJCW9ialsga2V5IF0gPSBwcm9taXNlWyBrZXkgXTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm4gb2JqOworCQkJCX0KKwkJCX0sCisJCQlkZWZlcnJlZCA9IHByb21pc2UucHJvbWlzZSh7fSksCisJCQlrZXk7CisKKwkJZm9yICgga2V5IGluIGxpc3RzICkgeworCQkJZGVmZXJyZWRbIGtleSBdID0gbGlzdHNbIGtleSBdLmZpcmU7CisJCQlkZWZlcnJlZFsga2V5ICsgIldpdGgiIF0gPSBsaXN0c1sga2V5IF0uZmlyZVdpdGg7CisJCX0KKworCQkvLyBIYW5kbGUgc3RhdGUKKwkJZGVmZXJyZWQuZG9uZSggZnVuY3Rpb24oKSB7CisJCQlzdGF0ZSA9ICJyZXNvbHZlZCI7CisJCX0sIGZhaWxMaXN0LmRpc2FibGUsIHByb2dyZXNzTGlzdC5sb2NrICkuZmFpbCggZnVuY3Rpb24oKSB7CisJCQlzdGF0ZSA9ICJyZWplY3RlZCI7CisJCX0sIGRvbmVMaXN0LmRpc2FibGUsIHByb2dyZXNzTGlzdC5sb2NrICk7CisKKwkJLy8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueQorCQlpZiAoIGZ1bmMgKSB7CisJCQlmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApOworCQl9CisKKwkJLy8gQWxsIGRvbmUhCisJCXJldHVybiBkZWZlcnJlZDsKKwl9LAorCisJLy8gRGVmZXJyZWQgaGVscGVyCisJd2hlbjogZnVuY3Rpb24oIGZpcnN0UGFyYW0gKSB7CisJCXZhciBhcmdzID0gc2xpY2VEZWZlcnJlZC5jYWxsKCBhcmd1bWVudHMsIDAgKSwKKwkJCWkgPSAwLAorCQkJbGVuZ3RoID0gYXJncy5sZW5ndGgsCisJCQlwVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKSwKKwkJCWNvdW50ID0gbGVuZ3RoLAorCQkJcENvdW50ID0gbGVuZ3RoLAorCQkJZGVmZXJyZWQgPSBsZW5ndGggPD0gMSAmJiBmaXJzdFBhcmFtICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBmaXJzdFBhcmFtLnByb21pc2UgKSA/CisJCQkJZmlyc3RQYXJhbSA6CisJCQkJalF1ZXJ5LkRlZmVycmVkKCksCisJCQlwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZSgpOworCQlmdW5jdGlvbiByZXNvbHZlRnVuYyggaSApIHsKKwkJCXJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCQkJYXJnc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZURlZmVycmVkLmNhbGwoIGFyZ3VtZW50cywgMCApIDogdmFsdWU7CisJCQkJaWYgKCAhKCAtLWNvdW50ICkgKSB7CisJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBkZWZlcnJlZCwgYXJncyApOworCQkJCX0KKwkJCX07CisJCX0KKwkJZnVuY3Rpb24gcHJvZ3Jlc3NGdW5jKCBpICkgeworCQkJcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJCQlwVmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHNsaWNlRGVmZXJyZWQuY2FsbCggYXJndW1lbnRzLCAwICkgOiB2YWx1ZTsKKwkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBwcm9taXNlLCBwVmFsdWVzICk7CisJCQl9OworCQl9CisJCWlmICggbGVuZ3RoID4gMSApIHsKKwkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJCWlmICggYXJnc1sgaSBdICYmIGFyZ3NbIGkgXS5wcm9taXNlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBhcmdzWyBpIF0ucHJvbWlzZSApICkgeworCQkJCQlhcmdzWyBpIF0ucHJvbWlzZSgpLnRoZW4oIHJlc29sdmVGdW5jKGkpLCBkZWZlcnJlZC5yZWplY3QsIHByb2dyZXNzRnVuYyhpKSApOworCQkJCX0gZWxzZSB7CisJCQkJCS0tY291bnQ7CisJCQkJfQorCQkJfQorCQkJaWYgKCAhY291bnQgKSB7CisJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBhcmdzICk7CisJCQl9CisJCX0gZWxzZSBpZiAoIGRlZmVycmVkICE9PSBmaXJzdFBhcmFtICkgeworCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBsZW5ndGggPyBbIGZpcnN0UGFyYW0gXSA6IFtdICk7CisJCX0KKwkJcmV0dXJuIHByb21pc2U7CisJfQorfSk7CisKKworCisKK2pRdWVyeS5zdXBwb3J0ID0gKGZ1bmN0aW9uKCkgeworCisJdmFyIHN1cHBvcnQsCisJCWFsbCwKKwkJYSwKKwkJc2VsZWN0LAorCQlvcHQsCisJCWlucHV0LAorCQlmcmFnbWVudCwKKwkJdGRzLAorCQlldmVudHMsCisJCWV2ZW50TmFtZSwKKwkJaSwKKwkJaXNTdXBwb3J0ZWQsCisJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICksCisJCWRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKworCS8vIFByZWxpbWluYXJ5IHRlc3RzCisJZGl2LnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwgInQiKTsKKwlkaXYuaW5uZXJIVE1MID0gIiAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYScgc3R5bGU9J3RvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41NTsnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IjsKKworCWFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CisJYSA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImEiIClbIDAgXTsKKworCS8vIENhbid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnQKKwlpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7CisJCXJldHVybiB7fTsKKwl9CisKKwkvLyBGaXJzdCBiYXRjaCBvZiBzdXBwb3J0cyB0ZXN0cworCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICk7CisJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSApOworCWlucHV0ID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiaW5wdXQiIClbIDAgXTsKKworCXN1cHBvcnQgPSB7CisJCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKKwkJbGVhZGluZ1doaXRlc3BhY2U6ICggZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMgKSwKKworCQkvLyBNYWtlIHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRlZAorCQkvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCisJCXRib2R5OiAhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCwKKworCQkvLyBNYWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5lckhUTUwKKwkJLy8gVGhpcyByZXF1aXJlcyBhIHdyYXBwZXIgZWxlbWVudCBpbiBJRQorCQlodG1sU2VyaWFsaXplOiAhIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCwKKworCQkvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0QXR0cmlidXRlCisJCS8vIChJRSB1c2VzIC5jc3NUZXh0IGluc3RlYWQpCisJCXN0eWxlOiAvdG9wLy50ZXN0KCBhLmdldEF0dHJpYnV0ZSgic3R5bGUiKSApLAorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkCisJCS8vIChJRSBub3JtYWxpemVzIGl0IGJ5IGRlZmF1bHQpCisJCWhyZWZOb3JtYWxpemVkOiAoIGEuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIvYSIgKSwKKworCQkvLyBNYWtlIHN1cmUgdGhhdCBlbGVtZW50IG9wYWNpdHkgZXhpc3RzCisJCS8vIChJRSB1c2VzIGZpbHRlciBpbnN0ZWFkKQorCQkvLyBVc2UgYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIFdlYktpdCBpc3N1ZS4gU2VlICM1MTQ1CisJCW9wYWNpdHk6IC9eMC41NS8udGVzdCggYS5zdHlsZS5vcGFjaXR5ICksCisKKwkJLy8gVmVyaWZ5IHN0eWxlIGZsb2F0IGV4aXN0ZW5jZQorCQkvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpCisJCWNzc0Zsb2F0OiAhIWEuc3R5bGUuY3NzRmxvYXQsCisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkIGZvciBhIGNoZWNrYm94CisJCS8vIHRoYXQgaXQgZGVmYXVsdHMgdG8gIm9uIi4KKwkJLy8gKFdlYktpdCBkZWZhdWx0cyB0byAiIiBpbnN0ZWFkKQorCQljaGVja09uOiAoIGlucHV0LnZhbHVlID09PSAib24iICksCisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgYSBzZWxlY3RlZC1ieS1kZWZhdWx0IG9wdGlvbiBoYXMgYSB3b3JraW5nIHNlbGVjdGVkIHByb3BlcnR5LgorCQkvLyAoV2ViS2l0IGRlZmF1bHRzIHRvIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZSwgSUUgdG9vLCBpZiBpdCdzIGluIGFuIG9wdGdyb3VwKQorCQlvcHRTZWxlY3RlZDogb3B0LnNlbGVjdGVkLAorCisJCS8vIFRlc3Qgc2V0QXR0cmlidXRlIG9uIGNhbWVsQ2FzZSBjbGFzcy4gSWYgaXQgd29ya3MsIHdlIG5lZWQgYXR0ckZpeGVzIHdoZW4gZG9pbmcgZ2V0L3NldEF0dHJpYnV0ZSAoaWU2LzcpCisJCWdldFNldEF0dHJpYnV0ZTogZGl2LmNsYXNzTmFtZSAhPT0gInQiLAorCisJCS8vIFRlc3RzIGZvciBlbmN0eXBlIHN1cHBvcnQgb24gYSBmb3JtKCM2NzQzKQorCQllbmN0eXBlOiAhIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLAorCisJCS8vIE1ha2VzIHN1cmUgY2xvbmluZyBhbiBodG1sNSBlbGVtZW50IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zCisJCS8vIFdoZXJlIG91dGVySFRNTCBpcyB1bmRlZmluZWQsIHRoaXMgc3RpbGwgd29ya3MKKwkJaHRtbDVDbG9uZTogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCB0cnVlICkub3V0ZXJIVE1MICE9PSAiPDpuYXY+PC86bmF2PiIsCisKKwkJLy8gV2lsbCBiZSBkZWZpbmVkIGxhdGVyCisJCXN1Ym1pdEJ1YmJsZXM6IHRydWUsCisJCWNoYW5nZUJ1YmJsZXM6IHRydWUsCisJCWZvY3VzaW5CdWJibGVzOiBmYWxzZSwKKwkJZGVsZXRlRXhwYW5kbzogdHJ1ZSwKKwkJbm9DbG9uZUV2ZW50OiB0cnVlLAorCQlpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiBmYWxzZSwKKwkJc2hyaW5rV3JhcEJsb2NrczogZmFsc2UsCisJCXJlbGlhYmxlTWFyZ2luUmlnaHQ6IHRydWUsCisJCXBpeGVsTWFyZ2luOiB0cnVlCisJfTsKKworCS8vIGpRdWVyeS5ib3hNb2RlbCBERVBSRUNBVEVEIGluIDEuMywgdXNlIGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsIGluc3RlYWQKKwlqUXVlcnkuYm94TW9kZWwgPSBzdXBwb3J0LmJveE1vZGVsID0gKGRvY3VtZW50LmNvbXBhdE1vZGUgPT09ICJDU1MxQ29tcGF0Iik7CisKKwkvLyBNYWtlIHN1cmUgY2hlY2tlZCBzdGF0dXMgaXMgcHJvcGVybHkgY2xvbmVkCisJaW5wdXQuY2hlY2tlZCA9IHRydWU7CisJc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9IGlucHV0LmNsb25lTm9kZSggdHJ1ZSApLmNoZWNrZWQ7CisKKwkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgb3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmVuJ3QgbWFya2VkIGFzIGRpc2FibGVkCisJLy8gKFdlYktpdCBtYXJrcyB0aGVtIGFzIGRpc2FibGVkKQorCXNlbGVjdC5kaXNhYmxlZCA9IHRydWU7CisJc3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7CisKKwkvLyBUZXN0IHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRlbGV0ZSBhbiBleHBhbmRvIGZyb20gYW4gZWxlbWVudAorCS8vIEZhaWxzIGluIEludGVybmV0IEV4cGxvcmVyCisJdHJ5IHsKKwkJZGVsZXRlIGRpdi50ZXN0OworCX0gY2F0Y2goIGUgKSB7CisJCXN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9IGZhbHNlOworCX0KKworCWlmICggIWRpdi5hZGRFdmVudExpc3RlbmVyICYmIGRpdi5hdHRhY2hFdmVudCAmJiBkaXYuZmlyZUV2ZW50ICkgeworCQlkaXYuYXR0YWNoRXZlbnQoICJvbmNsaWNrIiwgZnVuY3Rpb24oKSB7CisJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQorCQkJLy8gYm91bmQgZXZlbnQgaGFuZGxlcnMgKElFIGRvZXMgdGhpcykKKwkJCXN1cHBvcnQubm9DbG9uZUV2ZW50ID0gZmFsc2U7CisJCX0pOworCQlkaXYuY2xvbmVOb2RlKCB0cnVlICkuZmlyZUV2ZW50KCAib25jbGljayIgKTsKKwl9CisKKwkvLyBDaGVjayBpZiBhIHJhZGlvIG1haW50YWlucyBpdHMgdmFsdWUKKwkvLyBhZnRlciBiZWluZyBhcHBlbmRlZCB0byB0aGUgRE9NCisJaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOworCWlucHV0LnZhbHVlID0gInQiOworCWlucHV0LnNldEF0dHJpYnV0ZSgidHlwZSIsICJyYWRpbyIpOworCXN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSAidCI7CisKKwlpbnB1dC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCAiY2hlY2tlZCIpOworCisJLy8gIzExMjE3IC0gV2ViS2l0IGxvc2VzIGNoZWNrIHdoZW4gdGhlIG5hbWUgaXMgYWZ0ZXIgdGhlIGNoZWNrZWQgYXR0cmlidXRlCisJaW5wdXQuc2V0QXR0cmlidXRlKCAibmFtZSIsICJ0IiApOworCisJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOworCWZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOworCWZyYWdtZW50LmFwcGVuZENoaWxkKCBkaXYubGFzdENoaWxkICk7CisKKwkvLyBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHMKKwlzdXBwb3J0LmNoZWNrQ2xvbmUgPSBmcmFnbWVudC5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDsKKworCS8vIENoZWNrIGlmIGEgZGlzY29ubmVjdGVkIGNoZWNrYm94IHdpbGwgcmV0YWluIGl0cyBjaGVja2VkCisJLy8gdmFsdWUgb2YgdHJ1ZSBhZnRlciBhcHBlbmRlZCB0byB0aGUgRE9NIChJRTYvNykKKwlzdXBwb3J0LmFwcGVuZENoZWNrZWQgPSBpbnB1dC5jaGVja2VkOworCisJZnJhZ21lbnQucmVtb3ZlQ2hpbGQoIGlucHV0ICk7CisJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRpdiApOworCisJLy8gVGVjaG5pcXVlIGZyb20gSnVyaXkgWmF5dHNldgorCS8vIGh0dHA6Ly9wZXJmZWN0aW9ua2lsbHMuY29tL2RldGVjdGluZy1ldmVudC1zdXBwb3J0LXdpdGhvdXQtYnJvd3Nlci1zbmlmZmluZy8KKwkvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGNhc2Ugd2hlcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHN5c3RlbXMKKwkvLyBhcmUgdXNlZCwgbmFtZWx5IGluIElFLiBTaG9ydC1jaXJjdWl0aW5nIGhlcmUgaGVscHMgdXMgdG8KKwkvLyBhdm9pZCBhbiBldmFsIGNhbGwgKGluIHNldEF0dHJpYnV0ZSkgd2hpY2ggY2FuIGNhdXNlIENTUAorCS8vIHRvIGdvIGhheXdpcmUuIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vU2VjdXJpdHkvQ1NQCisJaWYgKCBkaXYuYXR0YWNoRXZlbnQgKSB7CisJCWZvciAoIGkgaW4geworCQkJc3VibWl0OiAxLAorCQkJY2hhbmdlOiAxLAorCQkJZm9jdXNpbjogMQorCQl9KSB7CisJCQlldmVudE5hbWUgPSAib24iICsgaTsKKwkJCWlzU3VwcG9ydGVkID0gKCBldmVudE5hbWUgaW4gZGl2ICk7CisJCQlpZiAoICFpc1N1cHBvcnRlZCApIHsKKwkJCQlkaXYuc2V0QXR0cmlidXRlKCBldmVudE5hbWUsICJyZXR1cm47IiApOworCQkJCWlzU3VwcG9ydGVkID0gKCB0eXBlb2YgZGl2WyBldmVudE5hbWUgXSA9PT0gImZ1bmN0aW9uIiApOworCQkJfQorCQkJc3VwcG9ydFsgaSArICJCdWJibGVzIiBdID0gaXNTdXBwb3J0ZWQ7CisJCX0KKwl9CisKKwlmcmFnbWVudC5yZW1vdmVDaGlsZCggZGl2ICk7CisKKwkvLyBOdWxsIGVsZW1lbnRzIHRvIGF2b2lkIGxlYWtzIGluIElFCisJZnJhZ21lbnQgPSBzZWxlY3QgPSBvcHQgPSBkaXYgPSBpbnB1dCA9IG51bGw7CisKKwkvLyBSdW4gdGVzdHMgdGhhdCBuZWVkIGEgYm9keSBhdCBkb2MgcmVhZHkKKwlqUXVlcnkoZnVuY3Rpb24oKSB7CisJCXZhciBjb250YWluZXIsIG91dGVyLCBpbm5lciwgdGFibGUsIHRkLCBvZmZzZXRTdXBwb3J0LAorCQkJbWFyZ2luRGl2LCBjb25NYXJnaW5Ub3AsIHN0eWxlLCBodG1sLCBwb3NpdGlvblRvcExlZnRXaWR0aEhlaWdodCwKKwkJCXBhZGRpbmdNYXJnaW5Cb3JkZXJWaXNpYmlsaXR5LCBwYWRkaW5nTWFyZ2luQm9yZGVyLAorCQkJYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07CisKKwkJaWYgKCAhYm9keSApIHsKKwkJCS8vIFJldHVybiBmb3IgZnJhbWVzZXQgZG9jcyB0aGF0IGRvbid0IGhhdmUgYSBib2R5CisJCQlyZXR1cm47CisJCX0KKworCQljb25NYXJnaW5Ub3AgPSAxOworCQlwYWRkaW5nTWFyZ2luQm9yZGVyID0gInBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6IjsKKwkJcG9zaXRpb25Ub3BMZWZ0V2lkdGhIZWlnaHQgPSAicG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyI7CisJCXBhZGRpbmdNYXJnaW5Cb3JkZXJWaXNpYmlsaXR5ID0gcGFkZGluZ01hcmdpbkJvcmRlciArICIwO3Zpc2liaWxpdHk6aGlkZGVuOyI7CisJCXN0eWxlID0gInN0eWxlPSciICsgcG9zaXRpb25Ub3BMZWZ0V2lkdGhIZWlnaHQgKyBwYWRkaW5nTWFyZ2luQm9yZGVyICsgIjVweCBzb2xpZCAjMDAwOyI7CisJCWh0bWwgPSAiPGRpdiAiICsgc3R5bGUgKyAiZGlzcGxheTpibG9jazsnPjxkaXYgc3R5bGU9JyIgKyBwYWRkaW5nTWFyZ2luQm9yZGVyICsgIjA7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47Jz48L2Rpdj48L2Rpdj4iICsKKwkJCSI8dGFibGUgIiArIHN0eWxlICsgIicgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iICsKKwkJCSI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7CisKKwkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCWNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gcGFkZGluZ01hcmdpbkJvcmRlclZpc2liaWxpdHkgKyAid2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoiICsgY29uTWFyZ2luVG9wICsgInB4IjsKKwkJYm9keS5pbnNlcnRCZWZvcmUoIGNvbnRhaW5lciwgYm9keS5maXJzdENoaWxkICk7CisKKwkJLy8gQ29uc3RydWN0IHRoZSB0ZXN0IGVsZW1lbnQKKwkJZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCWNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7CisKKwkJLy8gQ2hlY2sgaWYgdGFibGUgY2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9IZWlnaHQgd2hlbiB0aGV5IGFyZSBzZXQKKwkJLy8gdG8gZGlzcGxheTpub25lIGFuZCB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdmlzaWJsZSB0YWJsZSBjZWxscyBpbiBhCisJCS8vIHRhYmxlIHJvdzsgaWYgc28sIG9mZnNldFdpZHRoL0hlaWdodCBhcmUgbm90IHJlbGlhYmxlIGZvciB1c2Ugd2hlbgorCQkvLyBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGhhcyBiZWVuIGhpZGRlbiBkaXJlY3RseSB1c2luZworCQkvLyBkaXNwbGF5Om5vbmUgKGl0IGlzIHN0aWxsIHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBwYXJlbnQgZWxlbWVudCBpcworCQkvLyBoaWRkZW47IGRvbiBzYWZldHkgZ29nZ2xlcyBhbmQgc2VlIGJ1ZyAjNDUxMiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCisJCS8vIChvbmx5IElFIDggZmFpbHMgdGhpcyB0ZXN0KQorCQlkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48dHI+PHRkIHN0eWxlPSciICsgcGFkZGluZ01hcmdpbkJvcmRlciArICIwO2Rpc3BsYXk6bm9uZSc+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiI7CisJCXRkcyA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggInRkIiApOworCQlpc1N1cHBvcnRlZCA9ICggdGRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09PSAwICk7CisKKwkJdGRzWyAwIF0uc3R5bGUuZGlzcGxheSA9ICIiOworCQl0ZHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCisJCS8vIENoZWNrIGlmIGVtcHR5IHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0CisJCS8vIChJRSA8PSA4IGZhaWwgdGhpcyB0ZXN0KQorCQlzdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyA9IGlzU3VwcG9ydGVkICYmICggdGRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09PSAwICk7CisKKwkJLy8gQ2hlY2sgaWYgZGl2IHdpdGggZXhwbGljaXQgd2lkdGggYW5kIG5vIG1hcmdpbi1yaWdodCBpbmNvcnJlY3RseQorCQkvLyBnZXRzIGNvbXB1dGVkIG1hcmdpbi1yaWdodCBiYXNlZCBvbiB3aWR0aCBvZiBjb250YWluZXIuIEZvciBtb3JlCisJCS8vIGluZm8gc2VlIGJ1ZyAjMzMzMworCQkvLyBGYWlscyBpbiBXZWJLaXQgYmVmb3JlIEZlYiAyMDExIG5pZ2h0bGllcworCQkvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHQKKwkJaWYgKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKKwkJCWRpdi5pbm5lckhUTUwgPSAiIjsKKwkJCW1hcmdpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICk7CisJCQltYXJnaW5EaXYuc3R5bGUud2lkdGggPSAiMCI7CisJCQltYXJnaW5EaXYuc3R5bGUubWFyZ2luUmlnaHQgPSAiMCI7CisJCQlkaXYuc3R5bGUud2lkdGggPSAiMnB4IjsKKwkJCWRpdi5hcHBlbmRDaGlsZCggbWFyZ2luRGl2ICk7CisJCQlzdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQgPQorCQkJCSggcGFyc2VJbnQoICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiwgbnVsbCApIHx8IHsgbWFyZ2luUmlnaHQ6IDAgfSApLm1hcmdpblJpZ2h0LCAxMCApIHx8IDAgKSA9PT0gMDsKKwkJfQorCisJCWlmICggdHlwZW9mIGRpdi5zdHlsZS56b29tICE9PSAidW5kZWZpbmVkIiApIHsKKwkJCS8vIENoZWNrIGlmIG5hdGl2ZWx5IGJsb2NrLWxldmVsIGVsZW1lbnRzIGFjdCBsaWtlIGlubGluZS1ibG9jaworCQkJLy8gZWxlbWVudHMgd2hlbiBzZXR0aW5nIHRoZWlyIGRpc3BsYXkgdG8gJ2lubGluZScgYW5kIGdpdmluZworCQkJLy8gdGhlbSBsYXlvdXQKKwkJCS8vIChJRSA8IDggZG9lcyB0aGlzKQorCQkJZGl2LmlubmVySFRNTCA9ICIiOworCQkJZGl2LnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLnBhZGRpbmcgPSAiMXB4IjsKKwkJCWRpdi5zdHlsZS5ib3JkZXIgPSAwOworCQkJZGl2LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisJCQlkaXYuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOworCQkJZGl2LnN0eWxlLnpvb20gPSAxOworCQkJc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ID0gKCBkaXYub2Zmc2V0V2lkdGggPT09IDMgKTsKKworCQkJLy8gQ2hlY2sgaWYgZWxlbWVudHMgd2l0aCBsYXlvdXQgc2hyaW5rLXdyYXAgdGhlaXIgY2hpbGRyZW4KKwkJCS8vIChJRSA2IGRvZXMgdGhpcykKKwkJCWRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKwkJCWRpdi5zdHlsZS5vdmVyZmxvdyA9ICJ2aXNpYmxlIjsKKwkJCWRpdi5pbm5lckhUTUwgPSAiPGRpdiBzdHlsZT0nd2lkdGg6NXB4Oyc+PC9kaXY+IjsKKwkJCXN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9ICggZGl2Lm9mZnNldFdpZHRoICE9PSAzICk7CisJCX0KKworCQlkaXYuc3R5bGUuY3NzVGV4dCA9IHBvc2l0aW9uVG9wTGVmdFdpZHRoSGVpZ2h0ICsgcGFkZGluZ01hcmdpbkJvcmRlclZpc2liaWxpdHk7CisJCWRpdi5pbm5lckhUTUwgPSBodG1sOworCisJCW91dGVyID0gZGl2LmZpcnN0Q2hpbGQ7CisJCWlubmVyID0gb3V0ZXIuZmlyc3RDaGlsZDsKKwkJdGQgPSBvdXRlci5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7CisKKwkJb2Zmc2V0U3VwcG9ydCA9IHsKKwkJCWRvZXNOb3RBZGRCb3JkZXI6ICggaW5uZXIub2Zmc2V0VG9wICE9PSA1ICksCisJCQlkb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxsczogKCB0ZC5vZmZzZXRUb3AgPT09IDUgKQorCQl9OworCisJCWlubmVyLnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKKwkJaW5uZXIuc3R5bGUudG9wID0gIjIwcHgiOworCisJCS8vIHNhZmFyaSBzdWJ0cmFjdHMgcGFyZW50IGJvcmRlciB3aWR0aCBoZXJlIHdoaWNoIGlzIDVweAorCQlvZmZzZXRTdXBwb3J0LmZpeGVkUG9zaXRpb24gPSAoIGlubmVyLm9mZnNldFRvcCA9PT0gMjAgfHwgaW5uZXIub2Zmc2V0VG9wID09PSAxNSApOworCQlpbm5lci5zdHlsZS5wb3NpdGlvbiA9IGlubmVyLnN0eWxlLnRvcCA9ICIiOworCisJCW91dGVyLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisJCW91dGVyLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKKworCQlvZmZzZXRTdXBwb3J0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSA9ICggaW5uZXIub2Zmc2V0VG9wID09PSAtNSApOworCQlvZmZzZXRTdXBwb3J0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ID0gKCBib2R5Lm9mZnNldFRvcCAhPT0gY29uTWFyZ2luVG9wICk7CisKKwkJaWYgKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKKwkJCWRpdi5zdHlsZS5tYXJnaW5Ub3AgPSAiMSUiOworCQkJc3VwcG9ydC5waXhlbE1hcmdpbiA9ICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCApIHx8IHsgbWFyZ2luVG9wOiAwIH0gKS5tYXJnaW5Ub3AgIT09ICIxJSI7CisJCX0KKworCQlpZiAoIHR5cGVvZiBjb250YWluZXIuc3R5bGUuem9vbSAhPT0gInVuZGVmaW5lZCIgKSB7CisJCQljb250YWluZXIuc3R5bGUuem9vbSA9IDE7CisJCX0KKworCQlib2R5LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKKwkJbWFyZ2luRGl2ID0gZGl2ID0gY29udGFpbmVyID0gbnVsbDsKKworCQlqUXVlcnkuZXh0ZW5kKCBzdXBwb3J0LCBvZmZzZXRTdXBwb3J0ICk7CisJfSk7CisKKwlyZXR1cm4gc3VwcG9ydDsKK30pKCk7CisKKworCisKK3ZhciByYnJhY2UgPSAvXig/Olx7LipcfXxcWy4qXF0pJC8sCisJcm11bHRpRGFzaCA9IC8oW0EtWl0pL2c7CisKK2pRdWVyeS5leHRlbmQoeworCWNhY2hlOiB7fSwKKworCS8vIFBsZWFzZSB1c2Ugd2l0aCBjYXV0aW9uCisJdXVpZDogMCwKKworCS8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZQorCS8vIE5vbi1kaWdpdHMgcmVtb3ZlZCB0byBtYXRjaCByaW5saW5lalF1ZXJ5CisJZXhwYW5kbzogImpRdWVyeSIgKyAoIGpRdWVyeS5mbi5qcXVlcnkgKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xEL2csICIiICksCisKKwkvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIHRocm93IHVuY2F0Y2hhYmxlIGV4Y2VwdGlvbnMgaWYgeW91CisJLy8gYXR0ZW1wdCB0byBhZGQgZXhwYW5kbyBwcm9wZXJ0aWVzIHRvIHRoZW0uCisJbm9EYXRhOiB7CisJCSJlbWJlZCI6IHRydWUsCisJCS8vIEJhbiBhbGwgb2JqZWN0cyBleGNlcHQgZm9yIEZsYXNoICh3aGljaCBoYW5kbGUgZXhwYW5kb3MpCisJCSJvYmplY3QiOiAiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIiwKKwkJImFwcGxldCI6IHRydWUKKwl9LAorCisJaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CisJCWVsZW0gPSBlbGVtLm5vZGVUeXBlID8galF1ZXJ5LmNhY2hlWyBlbGVtW2pRdWVyeS5leHBhbmRvXSBdIDogZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKKwkJcmV0dXJuICEhZWxlbSAmJiAhaXNFbXB0eURhdGFPYmplY3QoIGVsZW0gKTsKKwl9LAorCisJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEsIHB2dCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsKKwkJaWYgKCAhalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXZhciBwcml2YXRlQ2FjaGUsIHRoaXNDYWNoZSwgcmV0LAorCQkJaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKKwkJCWdldEJ5TmFtZSA9IHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiwKKworCQkJLy8gV2UgaGF2ZSB0byBoYW5kbGUgRE9NIG5vZGVzIGFuZCBKUyBvYmplY3RzIGRpZmZlcmVudGx5IGJlY2F1c2UgSUU2LTcKKwkJCS8vIGNhbid0IEdDIG9iamVjdCByZWZlcmVuY2VzIHByb3Blcmx5IGFjcm9zcyB0aGUgRE9NLUpTIGJvdW5kYXJ5CisJCQlpc05vZGUgPSBlbGVtLm5vZGVUeXBlLAorCisJCQkvLyBPbmx5IERPTSBub2RlcyBuZWVkIHRoZSBnbG9iYWwgalF1ZXJ5IGNhY2hlOyBKUyBvYmplY3QgZGF0YSBpcworCQkJLy8gYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIG9iamVjdCBzbyBHQyBjYW4gb2NjdXIgYXV0b21hdGljYWxseQorCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAorCisJCQkvLyBPbmx5IGRlZmluaW5nIGFuIElEIGZvciBKUyBvYmplY3RzIGlmIGl0cyBjYWNoZSBhbHJlYWR5IGV4aXN0cyBhbGxvd3MKKwkJCS8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3aXRoIG5vIGNhY2hlCisJCQlpZCA9IGlzTm9kZSA/IGVsZW1bIGludGVybmFsS2V5IF0gOiBlbGVtWyBpbnRlcm5hbEtleSBdICYmIGludGVybmFsS2V5LAorCQkJaXNFdmVudHMgPSBuYW1lID09PSAiZXZlbnRzIjsKKworCQkvLyBBdm9pZCBkb2luZyBhbnkgbW9yZSB3b3JrIHRoYW4gd2UgbmVlZCB0byB3aGVuIHRyeWluZyB0byBnZXQgZGF0YSBvbiBhbgorCQkvLyBvYmplY3QgdGhhdCBoYXMgbm8gZGF0YSBhdCBhbGwKKwkJaWYgKCAoIWlkIHx8ICFjYWNoZVtpZF0gfHwgKCFpc0V2ZW50cyAmJiAhcHZ0ICYmICFjYWNoZVtpZF0uZGF0YSkpICYmIGdldEJ5TmFtZSAmJiBkYXRhID09PSB1bmRlZmluZWQgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoICFpZCApIHsKKwkJCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgYSBuZXcgdW5pcXVlIElEIGZvciBlYWNoIGVsZW1lbnQgc2luY2UgdGhlaXIgZGF0YQorCQkJLy8gZW5kcyB1cCBpbiB0aGUgZ2xvYmFsIGNhY2hlCisJCQlpZiAoIGlzTm9kZSApIHsKKwkJCQllbGVtWyBpbnRlcm5hbEtleSBdID0gaWQgPSArK2pRdWVyeS51dWlkOworCQkJfSBlbHNlIHsKKwkJCQlpZCA9IGludGVybmFsS2V5OworCQkJfQorCQl9CisKKwkJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CisJCQljYWNoZVsgaWQgXSA9IHt9OworCisJCQkvLyBBdm9pZHMgZXhwb3NpbmcgalF1ZXJ5IG1ldGFkYXRhIG9uIHBsYWluIEpTIG9iamVjdHMgd2hlbiB0aGUgb2JqZWN0CisJCQkvLyBpcyBzZXJpYWxpemVkIHVzaW5nIEpTT04uc3RyaW5naWZ5CisJCQlpZiAoICFpc05vZGUgKSB7CisJCQkJY2FjaGVbIGlkIF0udG9KU09OID0galF1ZXJ5Lm5vb3A7CisJCQl9CisJCX0KKworCQkvLyBBbiBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byBqUXVlcnkuZGF0YSBpbnN0ZWFkIG9mIGEga2V5L3ZhbHVlIHBhaXI7IHRoaXMgZ2V0cworCQkvLyBzaGFsbG93IGNvcGllZCBvdmVyIG9udG8gdGhlIGV4aXN0aW5nIGNhY2hlCisJCWlmICggdHlwZW9mIG5hbWUgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rpb24iICkgeworCQkJaWYgKCBwdnQgKSB7CisJCQkJY2FjaGVbIGlkIF0gPSBqUXVlcnkuZXh0ZW5kKCBjYWNoZVsgaWQgXSwgbmFtZSApOworCQkJfSBlbHNlIHsKKwkJCQljYWNoZVsgaWQgXS5kYXRhID0galF1ZXJ5LmV4dGVuZCggY2FjaGVbIGlkIF0uZGF0YSwgbmFtZSApOworCQkJfQorCQl9CisKKwkJcHJpdmF0ZUNhY2hlID0gdGhpc0NhY2hlID0gY2FjaGVbIGlkIF07CisKKwkJLy8galF1ZXJ5IGRhdGEoKSBpcyBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBvYmplY3QgaW5zaWRlIHRoZSBvYmplY3QncyBpbnRlcm5hbCBkYXRhCisJCS8vIGNhY2hlIGluIG9yZGVyIHRvIGF2b2lkIGtleSBjb2xsaXNpb25zIGJldHdlZW4gaW50ZXJuYWwgZGF0YSBhbmQgdXNlci1kZWZpbmVkCisJCS8vIGRhdGEuCisJCWlmICggIXB2dCApIHsKKwkJCWlmICggIXRoaXNDYWNoZS5kYXRhICkgeworCQkJCXRoaXNDYWNoZS5kYXRhID0ge307CisJCQl9CisKKwkJCXRoaXNDYWNoZSA9IHRoaXNDYWNoZS5kYXRhOworCQl9CisKKwkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CisJCQl0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdID0gZGF0YTsKKwkJfQorCisJCS8vIFVzZXJzIHNob3VsZCBub3QgYXR0ZW1wdCB0byBpbnNwZWN0IHRoZSBpbnRlcm5hbCBldmVudHMgb2JqZWN0IHVzaW5nIGpRdWVyeS5kYXRhLAorCQkvLyBpdCBpcyB1bmRvY3VtZW50ZWQgYW5kIHN1YmplY3QgdG8gY2hhbmdlLiBCdXQgZG9lcyBhbnlvbmUgbGlzdGVuPyBOby4KKwkJaWYgKCBpc0V2ZW50cyAmJiAhdGhpc0NhY2hlWyBuYW1lIF0gKSB7CisJCQlyZXR1cm4gcHJpdmF0ZUNhY2hlLmV2ZW50czsKKwkJfQorCisJCS8vIENoZWNrIGZvciBib3RoIGNvbnZlcnRlZC10by1jYW1lbCBhbmQgbm9uLWNvbnZlcnRlZCBkYXRhIHByb3BlcnR5IG5hbWVzCisJCS8vIElmIGEgZGF0YSBwcm9wZXJ0eSB3YXMgc3BlY2lmaWVkCisJCWlmICggZ2V0QnlOYW1lICkgeworCisJCQkvLyBGaXJzdCBUcnkgdG8gZmluZCBhcy1pcyBwcm9wZXJ0eSBkYXRhCisJCQlyZXQgPSB0aGlzQ2FjaGVbIG5hbWUgXTsKKworCQkJLy8gVGVzdCBmb3IgbnVsbHx1bmRlZmluZWQgcHJvcGVydHkgZGF0YQorCQkJaWYgKCByZXQgPT0gbnVsbCApIHsKKworCQkJCS8vIFRyeSB0byBmaW5kIHRoZSBjYW1lbENhc2VkIHByb3BlcnR5CisJCQkJcmV0ID0gdGhpc0NhY2hlWyBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICkgXTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldCA9IHRoaXNDYWNoZTsKKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKworCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBwdnQgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7CisJCWlmICggIWpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl2YXIgdGhpc0NhY2hlLCBpLCBsLAorCisJCQkvLyBSZWZlcmVuY2UgdG8gaW50ZXJuYWwgZGF0YSBjYWNoZSBrZXkKKwkJCWludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sCisKKwkJCWlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsCisKKwkJCS8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvbgorCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAorCisJCQkvLyBTZWUgalF1ZXJ5LmRhdGEgZm9yIG1vcmUgaW5mb3JtYXRpb24KKwkJCWlkID0gaXNOb2RlID8gZWxlbVsgaW50ZXJuYWxLZXkgXSA6IGludGVybmFsS2V5OworCisJCS8vIElmIHRoZXJlIGlzIGFscmVhZHkgbm8gY2FjaGUgZW50cnkgZm9yIHRoaXMgb2JqZWN0LCB0aGVyZSBpcyBubworCQkvLyBwdXJwb3NlIGluIGNvbnRpbnVpbmcKKwkJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoIG5hbWUgKSB7CisKKwkJCXRoaXNDYWNoZSA9IHB2dCA/IGNhY2hlWyBpZCBdIDogY2FjaGVbIGlkIF0uZGF0YTsKKworCQkJaWYgKCB0aGlzQ2FjaGUgKSB7CisKKwkJCQkvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgbmFtZXMgZm9yIGRhdGEga2V5cworCQkJCWlmICggIWpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7CisKKwkJCQkJLy8gdHJ5IHRoZSBzdHJpbmcgYXMgYSBrZXkgYmVmb3JlIGFueSBtYW5pcHVsYXRpb24KKwkJCQkJaWYgKCBuYW1lIGluIHRoaXNDYWNoZSApIHsKKwkJCQkJCW5hbWUgPSBbIG5hbWUgXTsKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJLy8gc3BsaXQgdGhlIGNhbWVsIGNhc2VkIHZlcnNpb24gYnkgc3BhY2VzIHVubGVzcyBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzCisJCQkJCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOworCQkJCQkJaWYgKCBuYW1lIGluIHRoaXNDYWNoZSApIHsKKwkJCQkJCQluYW1lID0gWyBuYW1lIF07CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCW5hbWUgPSBuYW1lLnNwbGl0KCAiICIgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWZvciAoIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCWRlbGV0ZSB0aGlzQ2FjaGVbIG5hbWVbaV0gXTsKKwkJCQl9CisKKwkJCQkvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGxlZnQgaW4gdGhlIGNhY2hlLCB3ZSB3YW50IHRvIGNvbnRpbnVlCisJCQkJLy8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkCisJCQkJaWYgKCAhKCBwdnQgPyBpc0VtcHR5RGF0YU9iamVjdCA6IGpRdWVyeS5pc0VtcHR5T2JqZWN0ICkoIHRoaXNDYWNoZSApICkgeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCisJCWlmICggIXB2dCApIHsKKwkJCWRlbGV0ZSBjYWNoZVsgaWQgXS5kYXRhOworCisJCQkvLyBEb24ndCBkZXN0cm95IHRoZSBwYXJlbnQgY2FjaGUgdW5sZXNzIHRoZSBpbnRlcm5hbCBkYXRhIG9iamVjdAorCQkJLy8gaGFkIGJlZW4gdGhlIG9ubHkgdGhpbmcgbGVmdCBpbiBpdAorCQkJaWYgKCAhaXNFbXB0eURhdGFPYmplY3QoY2FjaGVbIGlkIF0pICkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCS8vIEJyb3dzZXJzIHRoYXQgZmFpbCBleHBhbmRvIGRlbGV0aW9uIGFsc28gcmVmdXNlIHRvIGRlbGV0ZSBleHBhbmRvcyBvbgorCQkvLyB0aGUgd2luZG93LCBidXQgaXQgd2lsbCBhbGxvdyBpdCBvbiBhbGwgb3RoZXIgSlMgb2JqZWN0czsgb3RoZXIgYnJvd3NlcnMKKwkJLy8gZG9uJ3QgY2FyZQorCQkvLyBFbnN1cmUgdGhhdCBgY2FjaGVgIGlzIG5vdCBhIHdpbmRvdyBvYmplY3QgIzEwMDgwCisJCWlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCAhY2FjaGUuc2V0SW50ZXJ2YWwgKSB7CisJCQlkZWxldGUgY2FjaGVbIGlkIF07CisJCX0gZWxzZSB7CisJCQljYWNoZVsgaWQgXSA9IG51bGw7CisJCX0KKworCQkvLyBXZSBkZXN0cm95ZWQgdGhlIGNhY2hlIGFuZCBuZWVkIHRvIGVsaW1pbmF0ZSB0aGUgZXhwYW5kbyBvbiB0aGUgbm9kZSB0byBhdm9pZAorCQkvLyBmYWxzZSBsb29rdXBzIGluIHRoZSBjYWNoZSBmb3IgZW50cmllcyB0aGF0IG5vIGxvbmdlciBleGlzdAorCQlpZiAoIGlzTm9kZSApIHsKKwkJCS8vIElFIGRvZXMgbm90IGFsbG93IHVzIHRvIGRlbGV0ZSBleHBhbmRvIHByb3BlcnRpZXMgZnJvbSBub2RlcywKKwkJCS8vIG5vciBkb2VzIGl0IGhhdmUgYSByZW1vdmVBdHRyaWJ1dGUgZnVuY3Rpb24gb24gRG9jdW1lbnQgbm9kZXM7CisJCQkvLyB3ZSBtdXN0IGhhbmRsZSBhbGwgb2YgdGhlc2UgY2FzZXMKKwkJCWlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyApIHsKKwkJCQlkZWxldGUgZWxlbVsgaW50ZXJuYWxLZXkgXTsKKwkJCX0gZWxzZSBpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkgeworCQkJCWVsZW0ucmVtb3ZlQXR0cmlidXRlKCBpbnRlcm5hbEtleSApOworCQkJfSBlbHNlIHsKKwkJCQllbGVtWyBpbnRlcm5hbEtleSBdID0gbnVsbDsKKwkJCX0KKwkJfQorCX0sCisKKwkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgeworCQlyZXR1cm4galF1ZXJ5LmRhdGEoIGVsZW0sIG5hbWUsIGRhdGEsIHRydWUgKTsKKwl9LAorCisJLy8gQSBtZXRob2QgZm9yIGRldGVybWluaW5nIGlmIGEgRE9NIG5vZGUgY2FuIGhhbmRsZSB0aGUgZGF0YSBleHBhbmRvCisJYWNjZXB0RGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CisJCWlmICggZWxlbS5ub2RlTmFtZSApIHsKKwkJCXZhciBtYXRjaCA9IGpRdWVyeS5ub0RhdGFbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOworCisJCQlpZiAoIG1hdGNoICkgeworCQkJCXJldHVybiAhKG1hdGNoID09PSB0cnVlIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzc2lkIikgIT09IG1hdGNoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KK30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKKwkJdmFyIHBhcnRzLCBwYXJ0LCBhdHRyLCBuYW1lLCBsLAorCQkJZWxlbSA9IHRoaXNbMF0sCisJCQlpID0gMCwKKwkJCWRhdGEgPSBudWxsOworCisJCS8vIEdldHMgYWxsIHZhbHVlcworCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgeworCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKKwkJCQlkYXRhID0galF1ZXJ5LmRhdGEoIGVsZW0gKTsKKworCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhalF1ZXJ5Ll9kYXRhKCBlbGVtLCAicGFyc2VkQXR0cnMiICkgKSB7CisJCQkJCWF0dHIgPSBlbGVtLmF0dHJpYnV0ZXM7CisJCQkJCWZvciAoIGwgPSBhdHRyLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJCW5hbWUgPSBhdHRyW2ldLm5hbWU7CisKKwkJCQkJCWlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CisJCQkJCQkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc3Vic3RyaW5nKDUpICk7CisKKwkJCQkJCQlkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJalF1ZXJ5Ll9kYXRhKCBlbGVtLCAicGFyc2VkQXR0cnMiLCB0cnVlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gZGF0YTsKKwkJfQorCisJCS8vIFNldHMgbXVsdGlwbGUgdmFsdWVzCisJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCBrZXkgKTsKKwkJCX0pOworCQl9CisKKwkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiwgMiApOworCQlwYXJ0c1sxXSA9IHBhcnRzWzFdID8gIi4iICsgcGFydHNbMV0gOiAiIjsKKwkJcGFydCA9IHBhcnRzWzFdICsgIiEiOworCisJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7CisKKwkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKKwkJCQlkYXRhID0gdGhpcy50cmlnZ2VySGFuZGxlciggImdldERhdGEiICsgcGFydCwgWyBwYXJ0c1swXSBdICk7CisKKwkJCQkvLyBUcnkgdG8gZmV0Y2ggYW55IGludGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3QKKwkJCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtICkgeworCQkJCQlkYXRhID0galF1ZXJ5LmRhdGEoIGVsZW0sIGtleSApOworCQkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApOworCQkJCX0KKworCQkJCXJldHVybiBkYXRhID09PSB1bmRlZmluZWQgJiYgcGFydHNbMV0gPworCQkJCQl0aGlzLmRhdGEoIHBhcnRzWzBdICkgOgorCQkJCQlkYXRhOworCQkJfQorCisJCQlwYXJ0c1sxXSA9IHZhbHVlOworCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJCXZhciBzZWxmID0galF1ZXJ5KCB0aGlzICk7CisKKwkJCQlzZWxmLnRyaWdnZXJIYW5kbGVyKCAic2V0RGF0YSIgKyBwYXJ0LCBwYXJ0cyApOworCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCBrZXksIHZhbHVlICk7CisJCQkJc2VsZi50cmlnZ2VySGFuZGxlciggImNoYW5nZURhdGEiICsgcGFydCwgcGFydHMgKTsKKwkJCX0pOworCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIGZhbHNlICk7CisJfSwKKworCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7CisJCX0pOworCX0KK30pOworCitmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgeworCS8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnkKKwkvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGUKKwlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCisJCXZhciBuYW1lID0gImRhdGEtIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CisKKwkJZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CisKKwkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CisJCQl0cnkgeworCQkJCWRhdGEgPSBkYXRhID09PSAidHJ1ZSIgPyB0cnVlIDoKKwkJCQlkYXRhID09PSAiZmFsc2UiID8gZmFsc2UgOgorCQkJCWRhdGEgPT09ICJudWxsIiA/IG51bGwgOgorCQkJCWpRdWVyeS5pc051bWVyaWMoIGRhdGEgKSA/ICtkYXRhIDoKKwkJCQkJcmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6CisJCQkJCWRhdGE7CisJCQl9IGNhdGNoKCBlICkge30KKworCQkJLy8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyCisJCQlqUXVlcnkuZGF0YSggZWxlbSwga2V5LCBkYXRhICk7CisKKwkJfSBlbHNlIHsKKwkJCWRhdGEgPSB1bmRlZmluZWQ7CisJCX0KKwl9CisKKwlyZXR1cm4gZGF0YTsKK30KKworLy8gY2hlY2tzIGEgY2FjaGUgb2JqZWN0IGZvciBlbXB0aW5lc3MKK2Z1bmN0aW9uIGlzRW1wdHlEYXRhT2JqZWN0KCBvYmogKSB7CisJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgeworCisJCS8vIGlmIHRoZSBwdWJsaWMgZGF0YSBvYmplY3QgaXMgZW1wdHksIHRoZSBwcml2YXRlIGlzIHN0aWxsIGVtcHR5CisJCWlmICggbmFtZSA9PT0gImRhdGEiICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvYmpbbmFtZV0gKSApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICggbmFtZSAhPT0gInRvSlNPTiIgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworCisKKworZnVuY3Rpb24gaGFuZGxlUXVldWVNYXJrRGVmZXIoIGVsZW0sIHR5cGUsIHNyYyApIHsKKwl2YXIgZGVmZXJEYXRhS2V5ID0gdHlwZSArICJkZWZlciIsCisJCXF1ZXVlRGF0YUtleSA9IHR5cGUgKyAicXVldWUiLAorCQltYXJrRGF0YUtleSA9IHR5cGUgKyAibWFyayIsCisJCWRlZmVyID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCBkZWZlckRhdGFLZXkgKTsKKwlpZiAoIGRlZmVyICYmCisJCSggc3JjID09PSAicXVldWUiIHx8ICFqUXVlcnkuX2RhdGEoZWxlbSwgcXVldWVEYXRhS2V5KSApICYmCisJCSggc3JjID09PSAibWFyayIgfHwgIWpRdWVyeS5fZGF0YShlbGVtLCBtYXJrRGF0YUtleSkgKSApIHsKKwkJLy8gR2l2ZSByb29tIGZvciBoYXJkLWNvZGVkIGNhbGxiYWNrcyB0byBmaXJlIGZpcnN0CisJCS8vIGFuZCBldmVudHVhbGx5IG1hcmsvcXVldWUgc29tZXRoaW5nIGVsc2Ugb24gdGhlIGVsZW1lbnQKKwkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CisJCQlpZiAoICFqUXVlcnkuX2RhdGEoIGVsZW0sIHF1ZXVlRGF0YUtleSApICYmCisJCQkJIWpRdWVyeS5fZGF0YSggZWxlbSwgbWFya0RhdGFLZXkgKSApIHsKKwkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgZGVmZXJEYXRhS2V5LCB0cnVlICk7CisJCQkJZGVmZXIuZmlyZSgpOworCQkJfQorCQl9LCAwICk7CisJfQorfQorCitqUXVlcnkuZXh0ZW5kKHsKKworCV9tYXJrOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKKwkJaWYgKCBlbGVtICkgeworCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAibWFyayI7CisJCQlqUXVlcnkuX2RhdGEoIGVsZW0sIHR5cGUsIChqUXVlcnkuX2RhdGEoIGVsZW0sIHR5cGUgKSB8fCAwKSArIDEgKTsKKwkJfQorCX0sCisKKwlfdW5tYXJrOiBmdW5jdGlvbiggZm9yY2UsIGVsZW0sIHR5cGUgKSB7CisJCWlmICggZm9yY2UgIT09IHRydWUgKSB7CisJCQl0eXBlID0gZWxlbTsKKwkJCWVsZW0gPSBmb3JjZTsKKwkJCWZvcmNlID0gZmFsc2U7CisJCX0KKwkJaWYgKCBlbGVtICkgeworCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKKwkJCXZhciBrZXkgPSB0eXBlICsgIm1hcmsiLAorCQkJCWNvdW50ID0gZm9yY2UgPyAwIDogKCAoalF1ZXJ5Ll9kYXRhKCBlbGVtLCBrZXkgKSB8fCAxKSAtIDEgKTsKKwkJCWlmICggY291bnQgKSB7CisJCQkJalF1ZXJ5Ll9kYXRhKCBlbGVtLCBrZXksIGNvdW50ICk7CisJCQl9IGVsc2UgeworCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCBrZXksIHRydWUgKTsKKwkJCQloYW5kbGVRdWV1ZU1hcmtEZWZlciggZWxlbSwgdHlwZSwgIm1hcmsiICk7CisJCQl9CisJCX0KKwl9LAorCisJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgeworCQl2YXIgcTsKKwkJaWYgKCBlbGVtICkgeworCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOworCQkJcSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgdHlwZSApOworCisJCQkvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwCisJCQlpZiAoIGRhdGEgKSB7CisJCQkJaWYgKCAhcSB8fCBqUXVlcnkuaXNBcnJheShkYXRhKSApIHsKKwkJCQkJcSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheShkYXRhKSApOworCQkJCX0gZWxzZSB7CisJCQkJCXEucHVzaCggZGF0YSApOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBxIHx8IFtdOworCQl9CisJfSwKKworCWRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkgeworCQl0eXBlID0gdHlwZSB8fCAiZngiOworCisJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLAorCQkJZm4gPSBxdWV1ZS5zaGlmdCgpLAorCQkJaG9va3MgPSB7fTsKKworCQkvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsCisJCWlmICggZm4gPT09ICJpbnByb2dyZXNzIiApIHsKKwkJCWZuID0gcXVldWUuc2hpZnQoKTsKKwkJfQorCisJCWlmICggZm4gKSB7CisJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCisJCQkvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkCisJCQlpZiAoIHR5cGUgPT09ICJmeCIgKSB7CisJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CisJCQl9CisKKwkJCWpRdWVyeS5fZGF0YSggZWxlbSwgdHlwZSArICIucnVuIiwgaG9va3MgKTsKKwkJCWZuLmNhbGwoIGVsZW0sIGZ1bmN0aW9uKCkgeworCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CisJCQl9LCBob29rcyApOworCQl9CisKKwkJaWYgKCAhcXVldWUubGVuZ3RoICkgeworCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHR5cGUgKyAicXVldWUgIiArIHR5cGUgKyAiLnJ1biIsIHRydWUgKTsKKwkJCWhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCAicXVldWUiICk7CisJCX0KKwl9Cit9KTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgeworCQl2YXIgc2V0dGVyID0gMjsKKworCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKKwkJCWRhdGEgPSB0eXBlOworCQkJdHlwZSA9ICJmeCI7CisJCQlzZXR0ZXItLTsKKwkJfQorCisJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKKwkJCXJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbMF0sIHR5cGUgKTsKKwkJfQorCisJCXJldHVybiBkYXRhID09PSB1bmRlZmluZWQgPworCQkJdGhpcyA6CisJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBkYXRhICk7CisKKwkJCQlpZiAoIHR5cGUgPT09ICJmeCIgJiYgcXVldWVbMF0gIT09ICJpbnByb2dyZXNzIiApIHsKKwkJCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKKwkJCQl9CisJCQl9KTsKKwl9LAorCWRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgeworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKKwkJfSk7CisJfSwKKwkvLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCisJLy8gaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5LworCWRlbGF5OiBmdW5jdGlvbiggdGltZSwgdHlwZSApIHsKKwkJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKKwkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKKworCQlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkgeworCQkJdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CisJCQlob29rcy5zdG9wID0gZnVuY3Rpb24oKSB7CisJCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CisJCQl9OworCQl9KTsKKwl9LAorCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgeworCQlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBbXSApOworCX0sCisJLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQorCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQorCXByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmplY3QgKSB7CisJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgeworCQkJb2JqZWN0ID0gdHlwZTsKKwkJCXR5cGUgPSB1bmRlZmluZWQ7CisJCX0KKwkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKKwkJdmFyIGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCisJCQllbGVtZW50cyA9IHRoaXMsCisJCQlpID0gZWxlbWVudHMubGVuZ3RoLAorCQkJY291bnQgPSAxLAorCQkJZGVmZXJEYXRhS2V5ID0gdHlwZSArICJkZWZlciIsCisJCQlxdWV1ZURhdGFLZXkgPSB0eXBlICsgInF1ZXVlIiwKKwkJCW1hcmtEYXRhS2V5ID0gdHlwZSArICJtYXJrIiwKKwkJCXRtcDsKKwkJZnVuY3Rpb24gcmVzb2x2ZSgpIHsKKwkJCWlmICggISggLS1jb3VudCApICkgeworCQkJCWRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7CisJCQl9CisJCX0KKwkJd2hpbGUoIGktLSApIHsKKwkJCWlmICgoIHRtcCA9IGpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBkZWZlckRhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApIHx8CisJCQkJCSggalF1ZXJ5LmRhdGEoIGVsZW1lbnRzWyBpIF0sIHF1ZXVlRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgfHwKKwkJCQkJCWpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBtYXJrRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgKSAmJgorCQkJCQlqUXVlcnkuZGF0YSggZWxlbWVudHNbIGkgXSwgZGVmZXJEYXRhS2V5LCBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksIHRydWUgKSApKSB7CisJCQkJY291bnQrKzsKKwkJCQl0bXAuYWRkKCByZXNvbHZlICk7CisJCQl9CisJCX0KKwkJcmVzb2x2ZSgpOworCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqZWN0ICk7CisJfQorfSk7CisKKworCisKK3ZhciByY2xhc3MgPSAvW1xuXHRccl0vZywKKwlyc3BhY2UgPSAvXHMrLywKKwlycmV0dXJuID0gL1xyL2csCisJcnR5cGUgPSAvXig/OmJ1dHRvbnxpbnB1dCkkL2ksCisJcmZvY3VzYWJsZSA9IC9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLAorCXJjbGlja2FibGUgPSAvXmEoPzpyZWEpPyQvaSwKKwlyYm9vbGVhbiA9IC9eKD86YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNoZWNrZWR8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWR8c2VsZWN0ZWQpJC9pLAorCWdldFNldEF0dHJpYnV0ZSA9IGpRdWVyeS5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZSwKKwlub2RlSG9vaywgYm9vbEhvb2ssIGZpeFNwZWNpZmllZDsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJYXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgeworCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOworCX0sCisKKwlyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCWpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7CisJCX0pOworCX0sCisKKwlwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7CisJfSwKKworCXJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkgeworCQluYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJLy8gdHJ5L2NhdGNoIGhhbmRsZXMgY2FzZXMgd2hlcmUgSUUgYmFsa3MgKHN1Y2ggYXMgcmVtb3ZpbmcgYSBwcm9wZXJ0eSBvbiB3aW5kb3cpCisJCQl0cnkgeworCQkJCXRoaXNbIG5hbWUgXSA9IHVuZGVmaW5lZDsKKwkJCQlkZWxldGUgdGhpc1sgbmFtZSBdOworCQkJfSBjYXRjaCggZSApIHt9CisJCX0pOworCX0sCisKKwlhZGRDbGFzczogZnVuY3Rpb24oIHZhbHVlICkgeworCQl2YXIgY2xhc3NOYW1lcywgaSwgbCwgZWxlbSwKKwkJCXNldENsYXNzLCBjLCBjbDsKKworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHsKKwkJCQlqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSkgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICkgeworCQkJY2xhc3NOYW1lcyA9IHZhbHVlLnNwbGl0KCByc3BhY2UgKTsKKworCQkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQllbGVtID0gdGhpc1sgaSBdOworCisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCQkJCQlpZiAoICFlbGVtLmNsYXNzTmFtZSAmJiBjbGFzc05hbWVzLmxlbmd0aCA9PT0gMSApIHsKKwkJCQkJCWVsZW0uY2xhc3NOYW1lID0gdmFsdWU7CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNldENsYXNzID0gIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICI7CisKKwkJCQkJCWZvciAoIGMgPSAwLCBjbCA9IGNsYXNzTmFtZXMubGVuZ3RoOyBjIDwgY2w7IGMrKyApIHsKKwkJCQkJCQlpZiAoICF+c2V0Q2xhc3MuaW5kZXhPZiggIiAiICsgY2xhc3NOYW1lc1sgYyBdICsgIiAiICkgKSB7CisJCQkJCQkJCXNldENsYXNzICs9IGNsYXNzTmFtZXNbIGMgXSArICIgIjsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbGVtLmNsYXNzTmFtZSA9IGpRdWVyeS50cmltKCBzZXRDbGFzcyApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCXZhciBjbGFzc05hbWVzLCBpLCBsLCBlbGVtLCBjbGFzc05hbWUsIGMsIGNsOworCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgeworCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lKSApOworCQkJfSk7CisJCX0KKworCQlpZiAoICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeworCQkJY2xhc3NOYW1lcyA9ICggdmFsdWUgfHwgIiIgKS5zcGxpdCggcnNwYWNlICk7CisKKwkJCWZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJZWxlbSA9IHRoaXNbIGkgXTsKKworCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLmNsYXNzTmFtZSApIHsKKwkJCQkJaWYgKCB2YWx1ZSApIHsKKwkJCQkJCWNsYXNzTmFtZSA9ICgiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIikucmVwbGFjZSggcmNsYXNzLCAiICIgKTsKKwkJCQkJCWZvciAoIGMgPSAwLCBjbCA9IGNsYXNzTmFtZXMubGVuZ3RoOyBjIDwgY2w7IGMrKyApIHsKKwkJCQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgiICIgKyBjbGFzc05hbWVzWyBjIF0gKyAiICIsICIgIik7CisJCQkJCQl9CisJCQkJCQllbGVtLmNsYXNzTmFtZSA9IGpRdWVyeS50cmltKCBjbGFzc05hbWUgKTsKKworCQkJCQl9IGVsc2UgeworCQkJCQkJZWxlbS5jbGFzc05hbWUgPSAiIjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiB0aGlzOworCX0sCisKKwl0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHsKKwkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCisJCQlpc0Jvb2wgPSB0eXBlb2Ygc3RhdGVWYWwgPT09ICJib29sZWFuIjsKKworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKwkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApOworCQkJfSk7CisJCX0KKworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJaWYgKCB0eXBlID09PSAic3RyaW5nIiApIHsKKwkJCQkvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lcworCQkJCXZhciBjbGFzc05hbWUsCisJCQkJCWkgPSAwLAorCQkJCQlzZWxmID0galF1ZXJ5KCB0aGlzICksCisJCQkJCXN0YXRlID0gc3RhdGVWYWwsCisJCQkJCWNsYXNzTmFtZXMgPSB2YWx1ZS5zcGxpdCggcnNwYWNlICk7CisKKwkJCQl3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7CisJCQkJCS8vIGNoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBlcmF0ZWQgbGlzdAorCQkJCQlzdGF0ZSA9IGlzQm9vbCA/IHN0YXRlIDogIXNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApOworCQkJCQlzZWxmWyBzdGF0ZSA/ICJhZGRDbGFzcyIgOiAicmVtb3ZlQ2xhc3MiIF0oIGNsYXNzTmFtZSApOworCQkJCX0KKworCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZSA9PT0gImJvb2xlYW4iICkgeworCQkJCWlmICggdGhpcy5jbGFzc05hbWUgKSB7CisJCQkJCS8vIHN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKKwkJCQkJalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIsIHRoaXMuY2xhc3NOYW1lICk7CisJCQkJfQorCisJCQkJLy8gdG9nZ2xlIHdob2xlIGNsYXNzTmFtZQorCQkJCXRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gIiIgOiBqUXVlcnkuX2RhdGEoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiApIHx8ICIiOworCQkJfQorCQl9KTsKKwl9LAorCisJaGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJdmFyIGNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiLAorCQkJaSA9IDAsCisJCQlsID0gdGhpcy5sZW5ndGg7CisJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKKwkJCWlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoIiAiICsgdGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UocmNsYXNzLCAiICIpLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQl2YXIgaG9va3MsIHJldCwgaXNGdW5jdGlvbiwKKwkJCWVsZW0gPSB0aGlzWzBdOworCisJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CisJCQlpZiAoIGVsZW0gKSB7CisJCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CisKKwkJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSkgIT09IHVuZGVmaW5lZCApIHsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisKKwkJCQlyZXQgPSBlbGVtLnZhbHVlOworCisJCQkJcmV0dXJuIHR5cGVvZiByZXQgPT09ICJzdHJpbmciID8KKwkJCQkJLy8gaGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlcworCQkJCQlyZXQucmVwbGFjZShycmV0dXJuLCAiIikgOgorCQkJCQkvLyBoYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKKwkJCQkJcmV0ID09IG51bGwgPyAiIiA6IHJldDsKKwkJCX0KKworCQkJcmV0dXJuOworCQl9CisKKwkJaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOworCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CisJCQl2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKSwgdmFsOworCisJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpZiAoIGlzRnVuY3Rpb24gKSB7CisJCQkJdmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgc2VsZi52YWwoKSApOworCQkJfSBlbHNlIHsKKwkJCQl2YWwgPSB2YWx1ZTsKKwkJCX0KKworCQkJLy8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgIiI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmcKKwkJCWlmICggdmFsID09IG51bGwgKSB7CisJCQkJdmFsID0gIiI7CisJCQl9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSAibnVtYmVyIiApIHsKKwkJCQl2YWwgKz0gIiI7CisJCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNBcnJheSggdmFsICkgKSB7CisJCQkJdmFsID0galF1ZXJ5Lm1hcCh2YWwsIGZ1bmN0aW9uICggdmFsdWUgKSB7CisJCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiOworCQkJCX0pOworCQkJfQorCisJCQlob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsKKworCQkJLy8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmcKKwkJCWlmICggIWhvb2tzIHx8ICEoInNldCIgaW4gaG9va3MpIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKKwkJCQl0aGlzLnZhbHVlID0gdmFsOworCQkJfQorCQl9KTsKKwl9Cit9KTsKKworalF1ZXJ5LmV4dGVuZCh7CisJdmFsSG9va3M6IHsKKwkJb3B0aW9uOiB7CisJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCS8vIGF0dHJpYnV0ZXMudmFsdWUgaXMgdW5kZWZpbmVkIGluIEJsYWNrYmVycnkgNC43IGJ1dAorCQkJCS8vIHVzZXMgLnZhbHVlLiBTZWUgIzY5MzIKKwkJCQl2YXIgdmFsID0gZWxlbS5hdHRyaWJ1dGVzLnZhbHVlOworCQkJCXJldHVybiAhdmFsIHx8IHZhbC5zcGVjaWZpZWQgPyBlbGVtLnZhbHVlIDogZWxlbS50ZXh0OworCQkJfQorCQl9LAorCQlzZWxlY3Q6IHsKKwkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJdmFyIHZhbHVlLCBpLCBtYXgsIG9wdGlvbiwKKwkJCQkJaW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsCisJCQkJCXZhbHVlcyA9IFtdLAorCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAorCQkJCQlvbmUgPSBlbGVtLnR5cGUgPT09ICJzZWxlY3Qtb25lIjsKKworCQkJCS8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkCisJCQkJaWYgKCBpbmRleCA8IDAgKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKworCQkJCS8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnMKKwkJCQlpID0gb25lID8gaW5kZXggOiAwOworCQkJCW1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoOworCQkJCWZvciAoIDsgaSA8IG1heDsgaSsrICkgeworCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CisKKwkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAorCQkJCQlpZiAoIG9wdGlvbi5zZWxlY3RlZCAmJiAoalF1ZXJ5LnN1cHBvcnQub3B0RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVkIDogb3B0aW9uLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSA9PT0gbnVsbCkgJiYKKwkJCQkJCQkoIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkpICkgeworCisJCQkJCQkvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uCisJCQkJCQl2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7CisKKwkJCQkJCS8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCisJCQkJCQlpZiAoIG9uZSApIHsKKwkJCQkJCQlyZXR1cm4gdmFsdWU7CisJCQkJCQl9CisKKwkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CisJCQkJCQl2YWx1ZXMucHVzaCggdmFsdWUgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIEZpeGVzIEJ1ZyAjMjU1MSAtLSBzZWxlY3QudmFsKCkgYnJva2VuIGluIElFIGFmdGVyIGZvcm0ucmVzZXQoKQorCQkJCWlmICggb25lICYmICF2YWx1ZXMubGVuZ3RoICYmIG9wdGlvbnMubGVuZ3RoICkgeworCQkJCQlyZXR1cm4galF1ZXJ5KCBvcHRpb25zWyBpbmRleCBdICkudmFsKCk7CisJCQkJfQorCisJCQkJcmV0dXJuIHZhbHVlczsKKwkJCX0sCisKKwkJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApOworCisJCQkJalF1ZXJ5KGVsZW0pLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJCXRoaXMuc2VsZWN0ZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KHRoaXMpLnZhbCgpLCB2YWx1ZXMgKSA+PSAwOworCQkJCX0pOworCisJCQkJaWYgKCAhdmFsdWVzLmxlbmd0aCApIHsKKwkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CisJCQkJfQorCQkJCXJldHVybiB2YWx1ZXM7CisJCQl9CisJCX0KKwl9LAorCisJYXR0ckZuOiB7CisJCXZhbDogdHJ1ZSwKKwkJY3NzOiB0cnVlLAorCQlodG1sOiB0cnVlLAorCQl0ZXh0OiB0cnVlLAorCQlkYXRhOiB0cnVlLAorCQl3aWR0aDogdHJ1ZSwKKwkJaGVpZ2h0OiB0cnVlLAorCQlvZmZzZXQ6IHRydWUKKwl9LAorCisJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBwYXNzICkgeworCQl2YXIgcmV0LCBob29rcywgbm90eG1sLAorCQkJblR5cGUgPSBlbGVtLm5vZGVUeXBlOworCisJCS8vIGRvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKKwkJaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICggcGFzcyAmJiBuYW1lIGluIGpRdWVyeS5hdHRyRm4gKSB7CisJCQlyZXR1cm4galF1ZXJ5KCBlbGVtIClbIG5hbWUgXSggdmFsdWUgKTsKKwkJfQorCisJCS8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCisJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSAidW5kZWZpbmVkIiApIHsKKwkJCXJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTsKKwkJfQorCisJCW5vdHhtbCA9IG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKTsKKworCQkvLyBBbGwgYXR0cmlidXRlcyBhcmUgbG93ZXJjYXNlCisJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKKwkJaWYgKCBub3R4bWwgKSB7CisJCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gfHwgKCByYm9vbGVhbi50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IG5vZGVIb29rICk7CisJCX0KKworCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CisJCQkJalF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTsKKwkJCQlyZXR1cm47CisKKwkJCX0gZWxzZSBpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmIG5vdHhtbCAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgeworCQkJCXJldHVybiByZXQ7CisKKwkJCX0gZWxzZSB7CisJCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsICIiICsgdmFsdWUgKTsKKwkJCQlyZXR1cm4gdmFsdWU7CisJCQl9CisKKwkJfSBlbHNlIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CisJCQlyZXR1cm4gcmV0OworCisJCX0gZWxzZSB7CisKKwkJCXJldCA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CisKKwkJCS8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCisJCQlyZXR1cm4gcmV0ID09PSBudWxsID8KKwkJCQl1bmRlZmluZWQgOgorCQkJCXJldDsKKwkJfQorCX0sCisKKwlyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisJCXZhciBwcm9wTmFtZSwgYXR0ck5hbWVzLCBuYW1lLCBsLCBpc0Jvb2wsCisJCQlpID0gMDsKKworCQlpZiAoIHZhbHVlICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQlhdHRyTmFtZXMgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpLnNwbGl0KCByc3BhY2UgKTsKKwkJCWwgPSBhdHRyTmFtZXMubGVuZ3RoOworCisJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CisJCQkJbmFtZSA9IGF0dHJOYW1lc1sgaSBdOworCisJCQkJaWYgKCBuYW1lICkgeworCQkJCQlwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKKwkJCQkJaXNCb29sID0gcmJvb2xlYW4udGVzdCggbmFtZSApOworCisJCQkJCS8vIFNlZSAjOTY5OSBmb3IgZXhwbGFuYXRpb24gb2YgdGhpcyBhcHByb2FjaCAoc2V0dGluZyBmaXJzdCwgdGhlbiByZW1vdmFsKQorCQkJCQkvLyBEbyBub3QgZG8gdGhpcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzIChzZWUgIzEwODcwKQorCQkJCQlpZiAoICFpc0Jvb2wgKSB7CisJCQkJCQlqUXVlcnkuYXR0ciggZWxlbSwgbmFtZSwgIiIgKTsKKwkJCQkJfQorCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggZ2V0U2V0QXR0cmlidXRlID8gbmFtZSA6IHByb3BOYW1lICk7CisKKwkJCQkJLy8gU2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdG8gZmFsc2UgZm9yIGJvb2xlYW4gYXR0cmlidXRlcworCQkJCQlpZiAoIGlzQm9vbCAmJiBwcm9wTmFtZSBpbiBlbGVtICkgeworCQkJCQkJZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSwKKworCWF0dHJIb29rczogeworCQl0eXBlOiB7CisJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKwkJCQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCisJCQkJaWYgKCBydHlwZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgZWxlbS5wYXJlbnROb2RlICkgeworCQkJCQlqUXVlcnkuZXJyb3IoICJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiICk7CisJCQkJfSBlbHNlIGlmICggIWpRdWVyeS5zdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJpbnB1dCIpICkgeworCQkJCQkvLyBTZXR0aW5nIHRoZSB0eXBlIG9uIGEgcmFkaW8gYnV0dG9uIGFmdGVyIHRoZSB2YWx1ZSByZXNldHMgdGhlIHZhbHVlIGluIElFNi05CisJCQkJCS8vIFJlc2V0IHZhbHVlIHRvIGl0J3MgZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVyIHZhbHVlCisJCQkJCS8vIFRoaXMgaXMgZm9yIGVsZW1lbnQgY3JlYXRpb24KKwkJCQkJdmFyIHZhbCA9IGVsZW0udmFsdWU7CisJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CisJCQkJCWlmICggdmFsICkgeworCQkJCQkJZWxlbS52YWx1ZSA9IHZhbDsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdmFsdWU7CisJCQkJfQorCQkJfQorCQl9LAorCQkvLyBVc2UgdGhlIHZhbHVlIHByb3BlcnR5IGZvciBiYWNrIGNvbXBhdAorCQkvLyBVc2UgdGhlIG5vZGVIb29rIGZvciBidXR0b24gZWxlbWVudHMgaW4gSUU2LzcgKCMxOTU0KQorCQl2YWx1ZTogeworCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKwkJCQlpZiAoIG5vZGVIb29rICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImJ1dHRvbiIgKSApIHsKKwkJCQkJcmV0dXJuIG5vZGVIb29rLmdldCggZWxlbSwgbmFtZSApOworCQkJCX0KKwkJCQlyZXR1cm4gbmFtZSBpbiBlbGVtID8KKwkJCQkJZWxlbS52YWx1ZSA6CisJCQkJCW51bGw7CisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CisJCQkJaWYgKCBub2RlSG9vayAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJidXR0b24iICkgKSB7CisJCQkJCXJldHVybiBub2RlSG9vay5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICk7CisJCQkJfQorCQkJCS8vIERvZXMgbm90IHJldHVybiBzbyB0aGF0IHNldEF0dHJpYnV0ZSBpcyBhbHNvIHVzZWQKKwkJCQllbGVtLnZhbHVlID0gdmFsdWU7CisJCQl9CisJCX0KKwl9LAorCisJcHJvcEZpeDogeworCQl0YWJpbmRleDogInRhYkluZGV4IiwKKwkJcmVhZG9ubHk6ICJyZWFkT25seSIsCisJCSJmb3IiOiAiaHRtbEZvciIsCisJCSJjbGFzcyI6ICJjbGFzc05hbWUiLAorCQltYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAorCQljZWxsc3BhY2luZzogImNlbGxTcGFjaW5nIiwKKwkJY2VsbHBhZGRpbmc6ICJjZWxsUGFkZGluZyIsCisJCXJvd3NwYW46ICJyb3dTcGFuIiwKKwkJY29sc3BhbjogImNvbFNwYW4iLAorCQl1c2VtYXA6ICJ1c2VNYXAiLAorCQlmcmFtZWJvcmRlcjogImZyYW1lQm9yZGVyIiwKKwkJY29udGVudGVkaXRhYmxlOiAiY29udGVudEVkaXRhYmxlIgorCX0sCisKKwlwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CisJCXZhciByZXQsIGhvb2tzLCBub3R4bWwsCisJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CisKKwkJLy8gZG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcworCQlpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOworCisJCWlmICggbm90eG1sICkgeworCQkJLy8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rcworCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKKwkJCWhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdOworCQl9CisKKwkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworCQkJaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgeworCQkJCXJldHVybiByZXQ7CisKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuICggZWxlbVsgbmFtZSBdID0gdmFsdWUgKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsICkgeworCQkJCXJldHVybiByZXQ7CisKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGVsZW1bIG5hbWUgXTsKKwkJCX0KKwkJfQorCX0sCisKKwlwcm9wSG9va3M6IHsKKwkJdGFiSW5kZXg6IHsKKwkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldAorCQkJCS8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvCisJCQkJdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7CisKKwkJCQlyZXR1cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1dGVOb2RlLnNwZWNpZmllZCA/CisJCQkJCXBhcnNlSW50KCBhdHRyaWJ1dGVOb2RlLnZhbHVlLCAxMCApIDoKKwkJCQkJcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgZWxlbS5ocmVmID8KKwkJCQkJCTAgOgorCQkJCQkJdW5kZWZpbmVkOworCQkJfQorCQl9CisJfQorfSk7CisKKy8vIEFkZCB0aGUgdGFiSW5kZXggcHJvcEhvb2sgdG8gYXR0ckhvb2tzIGZvciBiYWNrLWNvbXBhdCAoZGlmZmVyZW50IGNhc2UgaXMgaW50ZW50aW9uYWwpCitqUXVlcnkuYXR0ckhvb2tzLnRhYmluZGV4ID0galF1ZXJ5LnByb3BIb29rcy50YWJJbmRleDsKKworLy8gSG9vayBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzCitib29sSG9vayA9IHsKKwlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQkvLyBBbGlnbiBib29sZWFuIGF0dHJpYnV0ZXMgd2l0aCBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMKKwkJLy8gRmFsbCBiYWNrIHRvIGF0dHJpYnV0ZSBwcmVzZW5jZSB3aGVyZSBzb21lIGJvb2xlYW5zIGFyZSBub3Qgc3VwcG9ydGVkCisJCXZhciBhdHRyTm9kZSwKKwkJCXByb3BlcnR5ID0galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUgKTsKKwkJcmV0dXJuIHByb3BlcnR5ID09PSB0cnVlIHx8IHR5cGVvZiBwcm9wZXJ0eSAhPT0gImJvb2xlYW4iICYmICggYXR0ck5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkgKSAmJiBhdHRyTm9kZS5ub2RlVmFsdWUgIT09IGZhbHNlID8KKwkJCW5hbWUudG9Mb3dlckNhc2UoKSA6CisJCQl1bmRlZmluZWQ7CisJfSwKKwlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKKwkJdmFyIHByb3BOYW1lOworCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKKwkJCS8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2UKKwkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CisJCX0gZWxzZSB7CisJCQkvLyB2YWx1ZSBpcyB0cnVlIHNpbmNlIHdlIGtub3cgYXQgdGhpcyBwb2ludCBpdCdzIHR5cGUgYm9vbGVhbiBhbmQgbm90IGZhbHNlCisJCQkvLyBTZXQgYm9vbGVhbiBhdHRyaWJ1dGVzIHRvIHRoZSBzYW1lIG5hbWUgYW5kIHNldCB0aGUgRE9NIHByb3BlcnR5CisJCQlwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKKwkJCWlmICggcHJvcE5hbWUgaW4gZWxlbSApIHsKKwkJCQkvLyBPbmx5IHNldCB0aGUgSURMIHNwZWNpZmljYWxseSBpZiBpdCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgZWxlbWVudAorCQkJCWVsZW1bIHByb3BOYW1lIF0gPSB0cnVlOworCQkJfQorCisJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpICk7CisJCX0KKwkJcmV0dXJuIG5hbWU7CisJfQorfTsKKworLy8gSUU2LzcgZG8gbm90IHN1cHBvcnQgZ2V0dGluZy9zZXR0aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdldC9zZXRBdHRyaWJ1dGUKK2lmICggIWdldFNldEF0dHJpYnV0ZSApIHsKKworCWZpeFNwZWNpZmllZCA9IHsKKwkJbmFtZTogdHJ1ZSwKKwkJaWQ6IHRydWUsCisJCWNvb3JkczogdHJ1ZQorCX07CisKKwkvLyBVc2UgdGhpcyBmb3IgYW55IGF0dHJpYnV0ZSBpbiBJRTYvNworCS8vIFRoaXMgZml4ZXMgYWxtb3N0IGV2ZXJ5IElFNi83IGlzc3VlCisJbm9kZUhvb2sgPSBqUXVlcnkudmFsSG9va3MuYnV0dG9uID0geworCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQkJdmFyIHJldDsKKwkJCXJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOworCQkJcmV0dXJuIHJldCAmJiAoIGZpeFNwZWNpZmllZFsgbmFtZSBdID8gcmV0Lm5vZGVWYWx1ZSAhPT0gIiIgOiByZXQuc3BlY2lmaWVkICkgPworCQkJCXJldC5ub2RlVmFsdWUgOgorCQkJCXVuZGVmaW5lZDsKKwkJfSwKKwkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CisJCQkvLyBTZXQgdGhlIGV4aXN0aW5nIG9yIGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgbm9kZQorCQkJdmFyIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOworCQkJaWYgKCAhcmV0ICkgeworCQkJCXJldCA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZSggbmFtZSApOworCQkJCWVsZW0uc2V0QXR0cmlidXRlTm9kZSggcmV0ICk7CisJCQl9CisJCQlyZXR1cm4gKCByZXQubm9kZVZhbHVlID0gdmFsdWUgKyAiIiApOworCQl9CisJfTsKKworCS8vIEFwcGx5IHRoZSBub2RlSG9vayB0byB0YWJpbmRleAorCWpRdWVyeS5hdHRySG9va3MudGFiaW5kZXguc2V0ID0gbm9kZUhvb2suc2V0OworCisJLy8gU2V0IHdpZHRoIGFuZCBoZWlnaHQgdG8gYXV0byBpbnN0ZWFkIG9mIDAgb24gZW1wdHkgc3RyaW5nKCBCdWcgIzgxNTAgKQorCS8vIFRoaXMgaXMgZm9yIHJlbW92YWxzCisJalF1ZXJ5LmVhY2goWyAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKwkJalF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdLCB7CisJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKwkJCQlpZiAoIHZhbHVlID09PSAiIiApIHsKKwkJCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsICJhdXRvIiApOworCQkJCQlyZXR1cm4gdmFsdWU7CisJCQkJfQorCQkJfQorCQl9KTsKKwl9KTsKKworCS8vIFNldCBjb250ZW50ZWRpdGFibGUgdG8gZmFsc2Ugb24gcmVtb3ZhbHMoIzEwNDI5KQorCS8vIFNldHRpbmcgdG8gZW1wdHkgc3RyaW5nIHRocm93cyBhbiBlcnJvciBhcyBhbiBpbnZhbGlkIHZhbHVlCisJalF1ZXJ5LmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGUgPSB7CisJCWdldDogbm9kZUhvb2suZ2V0LAorCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKKwkJCWlmICggdmFsdWUgPT09ICIiICkgeworCQkJCXZhbHVlID0gImZhbHNlIjsKKwkJCX0KKwkJCW5vZGVIb29rLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKTsKKwkJfQorCX07Cit9CisKKworLy8gU29tZSBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBzcGVjaWFsIGNhbGwgb24gSUUKK2lmICggIWpRdWVyeS5zdXBwb3J0LmhyZWZOb3JtYWxpemVkICkgeworCWpRdWVyeS5lYWNoKFsgImhyZWYiLCAic3JjIiwgIndpZHRoIiwgImhlaWdodCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisJCWpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSwgeworCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQl2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDIgKTsKKwkJCQlyZXR1cm4gcmV0ID09PSBudWxsID8gdW5kZWZpbmVkIDogcmV0OworCQkJfQorCQl9KTsKKwl9KTsKK30KKworaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5bGUgKSB7CisJalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsKKwkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCS8vIFJldHVybiB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2YgZW1wdHkgc3RyaW5nCisJCQkvLyBOb3JtYWxpemUgdG8gbG93ZXJjYXNlIHNpbmNlIElFIHVwcGVyY2FzZXMgY3NzIHByb3BlcnR5IG5hbWVzCisJCQlyZXR1cm4gZWxlbS5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCkgfHwgdW5kZWZpbmVkOworCQl9LAorCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKwkJCXJldHVybiAoIGVsZW0uc3R5bGUuY3NzVGV4dCA9ICIiICsgdmFsdWUgKTsKKwkJfQorCX07Cit9CisKKy8vIFNhZmFyaSBtaXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhbiBvcHRpb24KKy8vIEFjY2Vzc2luZyB0aGUgcGFyZW50J3Mgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eSBmaXhlcyBpdAoraWYgKCAhalF1ZXJ5LnN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7CisJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQsIHsKKwkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisKKwkJCWlmICggcGFyZW50ICkgeworCQkJCXBhcmVudC5zZWxlY3RlZEluZGV4OworCisJCQkJLy8gTWFrZSBzdXJlIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxCisJCQkJaWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHsKKwkJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0pOworfQorCisvLyBJRTYvNyBjYWxsIGVuY3R5cGUgZW5jb2RpbmcKK2lmICggIWpRdWVyeS5zdXBwb3J0LmVuY3R5cGUgKSB7CisJalF1ZXJ5LnByb3BGaXguZW5jdHlwZSA9ICJlbmNvZGluZyI7Cit9CisKKy8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyCitpZiAoICFqUXVlcnkuc3VwcG9ydC5jaGVja09uICkgeworCWpRdWVyeS5lYWNoKFsgInJhZGlvIiwgImNoZWNrYm94IiBdLCBmdW5jdGlvbigpIHsKKwkJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CisJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBpbiBXZWJraXQgIiIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiAib24iIGlmIGEgdmFsdWUgaXNuJ3Qgc3BlY2lmaWVkCisJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6IGVsZW0udmFsdWU7CisJCQl9CisJCX07CisJfSk7Cit9CitqUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CisJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSwgeworCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKwkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7CisJCQkJcmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeShlbGVtKS52YWwoKSwgdmFsdWUgKSA+PSAwICk7CisJCQl9CisJCX0KKwl9KTsKK30pOworCisKKworCit2YXIgcmZvcm1FbGVtcyA9IC9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSwKKwlydHlwZW5hbWVzcGFjZSA9IC9eKFteXC5dKik/KD86XC4oLispKT8kLywKKwlyaG92ZXJIYWNrID0gLyg/Ol58XHMpaG92ZXIoXC5cUyspP1xiLywKKwlya2V5RXZlbnQgPSAvXmtleS8sCisJcm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sCisJcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sCisJcnF1aWNrSXMgPSAvXihcdyopKD86IyhbXHdcLV0rKSk/KD86XC4oW1x3XC1dKykpPyQvLAorCXF1aWNrUGFyc2UgPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXZhciBxdWljayA9IHJxdWlja0lzLmV4ZWMoIHNlbGVjdG9yICk7CisJCWlmICggcXVpY2sgKSB7CisJCQkvLyAgIDAgIDEgICAgMiAgIDMKKwkJCS8vIFsgXywgdGFnLCBpZCwgY2xhc3MgXQorCQkJcXVpY2tbMV0gPSAoIHF1aWNrWzFdIHx8ICIiICkudG9Mb3dlckNhc2UoKTsKKwkJCXF1aWNrWzNdID0gcXVpY2tbM10gJiYgbmV3IFJlZ0V4cCggIig/Ol58XFxzKSIgKyBxdWlja1szXSArICIoPzpcXHN8JCkiICk7CisJCX0KKwkJcmV0dXJuIHF1aWNrOworCX0sCisJcXVpY2tJcyA9IGZ1bmN0aW9uKCBlbGVtLCBtICkgeworCQl2YXIgYXR0cnMgPSBlbGVtLmF0dHJpYnV0ZXMgfHwge307CisJCXJldHVybiAoCisJCQkoIW1bMV0gfHwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBtWzFdKSAmJgorCQkJKCFtWzJdIHx8IChhdHRycy5pZCB8fCB7fSkudmFsdWUgPT09IG1bMl0pICYmCisJCQkoIW1bM10gfHwgbVszXS50ZXN0KCAoYXR0cnNbICJjbGFzcyIgXSB8fCB7fSkudmFsdWUgKSkKKwkJKTsKKwl9LAorCWhvdmVySGFjayA9IGZ1bmN0aW9uKCBldmVudHMgKSB7CisJCXJldHVybiBqUXVlcnkuZXZlbnQuc3BlY2lhbC5ob3ZlciA/IGV2ZW50cyA6IGV2ZW50cy5yZXBsYWNlKCByaG92ZXJIYWNrLCAibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIgKTsKKwl9OworCisvKgorICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgorICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy4KKyAqLworalF1ZXJ5LmV2ZW50ID0geworCisJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgeworCisJCXZhciBlbGVtRGF0YSwgZXZlbnRIYW5kbGUsIGV2ZW50cywKKwkJCXQsIHRucywgdHlwZSwgbmFtZXNwYWNlcywgaGFuZGxlT2JqLAorCQkJaGFuZGxlT2JqSW4sIHF1aWNrLCBoYW5kbGVycywgc3BlY2lhbDsKKworCQkvLyBEb24ndCBhdHRhY2ggZXZlbnRzIHRvIG5vRGF0YSBvciB0ZXh0L2NvbW1lbnQgbm9kZXMgKGFsbG93IHBsYWluIG9iamVjdHMgdGhvKQorCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhdHlwZXMgfHwgIWhhbmRsZXIgfHwgIShlbGVtRGF0YSA9IGpRdWVyeS5fZGF0YSggZWxlbSApKSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgorCQlpZiAoIGhhbmRsZXIuaGFuZGxlciApIHsKKwkJCWhhbmRsZU9iakluID0gaGFuZGxlcjsKKwkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOworCQkJc2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3RvcjsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhIHVuaXF1ZSBJRCwgdXNlZCB0byBmaW5kL3JlbW92ZSBpdCBsYXRlcgorCQlpZiAoICFoYW5kbGVyLmd1aWQgKSB7CisJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOworCQl9CisKKwkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAorCQlldmVudHMgPSBlbGVtRGF0YS5ldmVudHM7CisJCWlmICggIWV2ZW50cyApIHsKKwkJCWVsZW1EYXRhLmV2ZW50cyA9IGV2ZW50cyA9IHt9OworCQl9CisJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlOworCQlpZiAoICFldmVudEhhbmRsZSApIHsKKwkJCWVsZW1EYXRhLmhhbmRsZSA9IGV2ZW50SGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CisJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKKwkJCQkvLyB3aGVuIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkCisJCQkJcmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09ICJ1bmRlZmluZWQiICYmICghZSB8fCBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUpID8KKwkJCQkJalF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBldmVudEhhbmRsZS5lbGVtLCBhcmd1bWVudHMgKSA6CisJCQkJCXVuZGVmaW5lZDsKKwkJCX07CisJCQkvLyBBZGQgZWxlbSBhcyBhIHByb3BlcnR5IG9mIHRoZSBoYW5kbGUgZm4gdG8gcHJldmVudCBhIG1lbW9yeSBsZWFrIHdpdGggSUUgbm9uLW5hdGl2ZSBldmVudHMKKwkJCWV2ZW50SGFuZGxlLmVsZW0gPSBlbGVtOworCQl9CisKKwkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQorCQkvLyBqUXVlcnkoLi4uKS5iaW5kKCJtb3VzZW92ZXIgbW91c2VvdXQiLCBmbik7CisJCXR5cGVzID0galF1ZXJ5LnRyaW0oIGhvdmVySGFjayh0eXBlcykgKS5zcGxpdCggIiAiICk7CisJCWZvciAoIHQgPSAwOyB0IDwgdHlwZXMubGVuZ3RoOyB0KysgKSB7CisKKwkJCXRucyA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107CisJCQl0eXBlID0gdG5zWzFdOworCQkJbmFtZXNwYWNlcyA9ICggdG5zWzJdIHx8ICIiICkuc3BsaXQoICIuIiApLnNvcnQoKTsKKworCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCisJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKworCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCisJCQl0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7CisKKwkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKKwkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OworCisJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycworCQkJaGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCh7CisJCQkJdHlwZTogdHlwZSwKKwkJCQlvcmlnVHlwZTogdG5zWzFdLAorCQkJCWRhdGE6IGRhdGEsCisJCQkJaGFuZGxlcjogaGFuZGxlciwKKwkJCQlndWlkOiBoYW5kbGVyLmd1aWQsCisJCQkJc2VsZWN0b3I6IHNlbGVjdG9yLAorCQkJCXF1aWNrOiBzZWxlY3RvciAmJiBxdWlja1BhcnNlKCBzZWxlY3RvciApLAorCQkJCW5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKCIuIikKKwkJCX0sIGhhbmRsZU9iakluICk7CisKKwkJCS8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0CisJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdOworCQkJaWYgKCAhaGFuZGxlcnMgKSB7CisJCQkJaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdOworCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOworCisJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlCisJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fCBzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkgeworCQkJCQkvLyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudAorCQkJCQlpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHsKKwkJCQkJCWVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7CisKKwkJCQkJfSBlbHNlIGlmICggZWxlbS5hdHRhY2hFdmVudCApIHsKKwkJCQkJCWVsZW0uYXR0YWNoRXZlbnQoICJvbiIgKyB0eXBlLCBldmVudEhhbmRsZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoIHNwZWNpYWwuYWRkICkgeworCQkJCXNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOworCisJCQkJaWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKKwkJCQkJaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDsKKwkJCQl9CisJCQl9CisKKwkJCS8vIEFkZCB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdCwgZGVsZWdhdGVzIGluIGZyb250CisJCQlpZiAoIHNlbGVjdG9yICkgeworCQkJCWhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTsKKwkJCX0gZWxzZSB7CisJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CisJCQl9CisKKwkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KKwkJCWpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7CisJCX0KKworCQkvLyBOdWxsaWZ5IGVsZW0gdG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKKwkJZWxlbSA9IG51bGw7CisJfSwKKworCWdsb2JhbDoge30sCisKKwkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKKwlyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkgeworCisJCXZhciBlbGVtRGF0YSA9IGpRdWVyeS5oYXNEYXRhKCBlbGVtICkgJiYgalF1ZXJ5Ll9kYXRhKCBlbGVtICksCisJCQl0LCB0bnMsIHR5cGUsIG9yaWdUeXBlLCBuYW1lc3BhY2VzLCBvcmlnQ291bnQsCisJCQlqLCBldmVudHMsIHNwZWNpYWwsIGhhbmRsZSwgZXZlbnRUeXBlLCBoYW5kbGVPYmo7CisKKwkJaWYgKCAhZWxlbURhdGEgfHwgIShldmVudHMgPSBlbGVtRGF0YS5ldmVudHMpICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZAorCQl0eXBlcyA9IGpRdWVyeS50cmltKCBob3ZlckhhY2soIHR5cGVzIHx8ICIiICkgKS5zcGxpdCgiICIpOworCQlmb3IgKCB0ID0gMDsgdCA8IHR5cGVzLmxlbmd0aDsgdCsrICkgeworCQkJdG5zID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTsKKwkJCXR5cGUgPSBvcmlnVHlwZSA9IHRuc1sxXTsKKwkJCW5hbWVzcGFjZXMgPSB0bnNbMl07CisKKwkJCS8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudAorCQkJaWYgKCAhdHlwZSApIHsKKwkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKKwkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKwkJCXR5cGUgPSAoIHNlbGVjdG9yPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOworCQkJZXZlbnRUeXBlID0gZXZlbnRzWyB0eXBlIF0gfHwgW107CisJCQlvcmlnQ291bnQgPSBldmVudFR5cGUubGVuZ3RoOworCQkJbmFtZXNwYWNlcyA9IG5hbWVzcGFjZXMgPyBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc3BsaXQoIi4iKS5zb3J0KCkuam9pbigiXFwuKD86LipcXC4pPyIpICsgIihcXC58JCkiKSA6IG51bGw7CisKKwkJCS8vIFJlbW92ZSBtYXRjaGluZyBldmVudHMKKwkJCWZvciAoIGogPSAwOyBqIDwgZXZlbnRUeXBlLmxlbmd0aDsgaisrICkgeworCQkJCWhhbmRsZU9iaiA9IGV2ZW50VHlwZVsgaiBdOworCisJCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgorCQkJCQkgKCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiYKKwkJCQkJICggIW5hbWVzcGFjZXMgfHwgbmFtZXNwYWNlcy50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgorCQkJCQkgKCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gIioqIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHsKKwkJCQkJZXZlbnRUeXBlLnNwbGljZSggai0tLCAxICk7CisKKwkJCQkJaWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7CisJCQkJCQlldmVudFR5cGUuZGVsZWdhdGVDb3VudC0tOworCQkJCQl9CisJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CisJCQkJCQlzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAorCQkJLy8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpCisJCQlpZiAoIGV2ZW50VHlwZS5sZW5ndGggPT09IDAgJiYgb3JpZ0NvdW50ICE9PSBldmVudFR5cGUubGVuZ3RoICkgeworCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzICkgPT09IGZhbHNlICkgeworCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApOworCQkJCX0KKworCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXTsKKwkJCX0KKwkJfQorCisJCS8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCisJCWlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkgeworCQkJaGFuZGxlID0gZWxlbURhdGEuaGFuZGxlOworCQkJaWYgKCBoYW5kbGUgKSB7CisJCQkJaGFuZGxlLmVsZW0gPSBudWxsOworCQkJfQorCisJCQkvLyByZW1vdmVEYXRhIGFsc28gY2hlY2tzIGZvciBlbXB0aW5lc3MgYW5kIGNsZWFycyB0aGUgZXhwYW5kbyBpZiBlbXB0eQorCQkJLy8gc28gdXNlIGl0IGluc3RlYWQgb2YgZGVsZXRlCisJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgWyAiZXZlbnRzIiwgImhhbmRsZSIgXSwgdHJ1ZSApOworCQl9CisJfSwKKworCS8vIEV2ZW50cyB0aGF0IGFyZSBzYWZlIHRvIHNob3J0LWNpcmN1aXQgaWYgbm8gaGFuZGxlcnMgYXJlIGF0dGFjaGVkLgorCS8vIE5hdGl2ZSBET00gZXZlbnRzIHNob3VsZCBub3QgYmUgYWRkZWQsIHRoZXkgbWF5IGhhdmUgaW5saW5lIGhhbmRsZXJzLgorCWN1c3RvbUV2ZW50OiB7CisJCSJnZXREYXRhIjogdHJ1ZSwKKwkJInNldERhdGEiOiB0cnVlLAorCQkiY2hhbmdlRGF0YSI6IHRydWUKKwl9LAorCisJdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7CisJCS8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCisJCWlmICggZWxlbSAmJiAoZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4KSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlCisJCXZhciB0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudCwKKwkJCW5hbWVzcGFjZXMgPSBbXSwKKwkJCWNhY2hlLCBleGNsdXNpdmUsIGksIGN1ciwgb2xkLCBvbnR5cGUsIHNwZWNpYWwsIGhhbmRsZSwgZXZlbnRQYXRoLCBidWJibGVUeXBlOworCisJCS8vIGZvY3VzL2JsdXIgbW9ycGhzIHRvIGZvY3VzaW4vb3V0OyBlbnN1cmUgd2UncmUgbm90IGZpcmluZyB0aGVtIHJpZ2h0IG5vdworCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoIHR5cGUuaW5kZXhPZiggIiEiICkgPj0gMCApIHsKKwkJCS8vIEV4Y2x1c2l2ZSBldmVudHMgdHJpZ2dlciBvbmx5IGZvciB0aGUgZXhhY3QgZXZlbnQgKG5vIG5hbWVzcGFjZXMpCisJCQl0eXBlID0gdHlwZS5zbGljZSgwLCAtMSk7CisJCQlleGNsdXNpdmUgPSB0cnVlOworCQl9CisKKwkJaWYgKCB0eXBlLmluZGV4T2YoICIuIiApID49IDAgKSB7CisJCQkvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpCisJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOworCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKKwkJCW5hbWVzcGFjZXMuc29ydCgpOworCQl9CisKKwkJaWYgKCAoIWVsZW0gfHwgalF1ZXJ5LmV2ZW50LmN1c3RvbUV2ZW50WyB0eXBlIF0pICYmICFqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gKSB7CisJCQkvLyBObyBqUXVlcnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZSwgYW5kIGl0IGNhbid0IGhhdmUgaW5saW5lIGhhbmRsZXJzCisJCQlyZXR1cm47CisJCX0KKworCQkvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gRXZlbnQsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZworCQlldmVudCA9IHR5cGVvZiBldmVudCA9PT0gIm9iamVjdCIgPworCQkJLy8galF1ZXJ5LkV2ZW50IG9iamVjdAorCQkJZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gPyBldmVudCA6CisJCQkvLyBPYmplY3QgbGl0ZXJhbAorCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgZXZlbnQgKSA6CisJCQkvLyBKdXN0IHRoZSBldmVudCB0eXBlIChzdHJpbmcpCisJCQluZXcgalF1ZXJ5LkV2ZW50KCB0eXBlICk7CisKKwkJZXZlbnQudHlwZSA9IHR5cGU7CisJCWV2ZW50LmlzVHJpZ2dlciA9IHRydWU7CisJCWV2ZW50LmV4Y2x1c2l2ZSA9IGV4Y2x1c2l2ZTsKKwkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsKKwkJZXZlbnQubmFtZXNwYWNlX3JlID0gZXZlbnQubmFtZXNwYWNlPyBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwuKD86LipcXC4pPyIpICsgIihcXC58JCkiKSA6IG51bGw7CisJCW9udHlwZSA9IHR5cGUuaW5kZXhPZiggIjoiICkgPCAwID8gIm9uIiArIHR5cGUgOiAiIjsKKworCQkvLyBIYW5kbGUgYSBnbG9iYWwgdHJpZ2dlcgorCQlpZiAoICFlbGVtICkgeworCisJCQkvLyBUT0RPOiBTdG9wIHRhdW50aW5nIHRoZSBkYXRhIGNhY2hlOyByZW1vdmUgZ2xvYmFsIGV2ZW50cyBhbmQgYWx3YXlzIGF0dGFjaCB0byBkb2N1bWVudAorCQkJY2FjaGUgPSBqUXVlcnkuY2FjaGU7CisJCQlmb3IgKCBpIGluIGNhY2hlICkgeworCQkJCWlmICggY2FjaGVbIGkgXS5ldmVudHMgJiYgY2FjaGVbIGkgXS5ldmVudHNbIHR5cGUgXSApIHsKKwkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCBjYWNoZVsgaSBdLmhhbmRsZS5lbGVtLCB0cnVlICk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCisJCWV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDsKKwkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgeworCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKKwkJfQorCisJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKKwkJZGF0YSA9IGRhdGEgIT0gbnVsbCA/IGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSA6IFtdOworCQlkYXRhLnVuc2hpZnQoIGV2ZW50ICk7CisKKwkJLy8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lcworCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKwkJaWYgKCBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCisJCS8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpCisJCWV2ZW50UGF0aCA9IFtbIGVsZW0sIHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZSBdXTsKKwkJaWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsKKworCQkJYnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7CisJCQljdXIgPSByZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApID8gZWxlbSA6IGVsZW0ucGFyZW50Tm9kZTsKKwkJCW9sZCA9IG51bGw7CisJCQlmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CisJCQkJZXZlbnRQYXRoLnB1c2goWyBjdXIsIGJ1YmJsZVR5cGUgXSk7CisJCQkJb2xkID0gY3VyOworCQkJfQorCisJCQkvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSkKKwkJCWlmICggb2xkICYmIG9sZCA9PT0gZWxlbS5vd25lckRvY3VtZW50ICkgeworCQkJCWV2ZW50UGF0aC5wdXNoKFsgb2xkLmRlZmF1bHRWaWV3IHx8IG9sZC5wYXJlbnRXaW5kb3cgfHwgd2luZG93LCBidWJibGVUeXBlIF0pOworCQkJfQorCQl9CisKKwkJLy8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aAorCQlmb3IgKCBpID0gMDsgaSA8IGV2ZW50UGF0aC5sZW5ndGggJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7IGkrKyApIHsKKworCQkJY3VyID0gZXZlbnRQYXRoW2ldWzBdOworCQkJZXZlbnQudHlwZSA9IGV2ZW50UGF0aFtpXVsxXTsKKworCQkJaGFuZGxlID0gKCBqUXVlcnkuX2RhdGEoIGN1ciwgImV2ZW50cyIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiYgalF1ZXJ5Ll9kYXRhKCBjdXIsICJoYW5kbGUiICk7CisJCQlpZiAoIGhhbmRsZSApIHsKKwkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOworCQkJfQorCQkJLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSBiYXJlIEpTIGZ1bmN0aW9uIGFuZCBub3QgYSBqUXVlcnkgaGFuZGxlcgorCQkJaGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07CisJCQlpZiAoIGhhbmRsZSAmJiBqUXVlcnkuYWNjZXB0RGF0YSggY3VyICkgJiYgaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKSA9PT0gZmFsc2UgKSB7CisJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJCX0KKwkJfQorCQlldmVudC50eXBlID0gdHlwZTsKKworCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CisJCWlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CisKKwkJCWlmICggKCFzcGVjaWFsLl9kZWZhdWx0IHx8IHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGVsZW0ub3duZXJEb2N1bWVudCwgZGF0YSApID09PSBmYWxzZSkgJiYKKwkJCQkhKHR5cGUgPT09ICJjbGljayIgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYSIgKSkgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKKworCQkJCS8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBuYW1lIGFzIHRoZSBldmVudC4KKwkJCQkvLyBDYW4ndCB1c2UgYW4gLmlzRnVuY3Rpb24oKSBjaGVjayBoZXJlIGJlY2F1c2UgSUU2LzcgZmFpbHMgdGhhdCB0ZXN0LgorCQkJCS8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MCkKKwkJCQkvLyBJRTw5IGRpZXMgb24gZm9jdXMvYmx1ciB0byBoaWRkZW4gZWxlbWVudCAoIzE0ODYpCisJCQkJaWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBdICYmICgodHlwZSAhPT0gImZvY3VzIiAmJiB0eXBlICE9PSAiYmx1ciIpIHx8IGV2ZW50LnRhcmdldC5vZmZzZXRXaWR0aCAhPT0gMCkgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgeworCisJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKKwkJCQkJb2xkID0gZWxlbVsgb250eXBlIF07CisKKwkJCQkJaWYgKCBvbGQgKSB7CisJCQkJCQllbGVtWyBvbnR5cGUgXSA9IG51bGw7CisJCQkJCX0KKworCQkJCQkvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZQorCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTsKKwkJCQkJZWxlbVsgdHlwZSBdKCk7CisJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7CisKKwkJCQkJaWYgKCBvbGQgKSB7CisJCQkJCQllbGVtWyBvbnR5cGUgXSA9IG9sZDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBldmVudC5yZXN1bHQ7CisJfSwKKworCWRpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CisKKwkJLy8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0CisJCWV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgfHwgd2luZG93LmV2ZW50ICk7CisKKwkJdmFyIGhhbmRsZXJzID0gKCAoalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSksCisJCQlkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCwKKwkJCWFyZ3MgPSBbXS5zbGljZS5jYWxsKCBhcmd1bWVudHMsIDAgKSwKKwkJCXJ1bl9hbGwgPSAhZXZlbnQuZXhjbHVzaXZlICYmICFldmVudC5uYW1lc3BhY2UsCisJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fSwKKwkJCWhhbmRsZXJRdWV1ZSA9IFtdLAorCQkJaSwgaiwgY3VyLCBqcWN1ciwgcmV0LCBzZWxNYXRjaCwgbWF0Y2hlZCwgbWF0Y2hlcywgaGFuZGxlT2JqLCBzZWwsIHJlbGF0ZWQ7CisKKwkJLy8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnQKKwkJYXJnc1swXSA9IGV2ZW50OworCQlldmVudC5kZWxlZ2F0ZVRhcmdldCA9IHRoaXM7CisKKwkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAorCQlpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIERldGVybWluZSBoYW5kbGVycyB0aGF0IHNob3VsZCBydW4gaWYgdGhlcmUgYXJlIGRlbGVnYXRlZCBldmVudHMKKwkJLy8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpCisJCWlmICggZGVsZWdhdGVDb3VudCAmJiAhKGV2ZW50LmJ1dHRvbiAmJiBldmVudC50eXBlID09PSAiY2xpY2siKSApIHsKKworCQkJLy8gUHJlZ2VuZXJhdGUgYSBzaW5nbGUgalF1ZXJ5IG9iamVjdCBmb3IgcmV1c2Ugd2l0aCAuaXMoKQorCQkJanFjdXIgPSBqUXVlcnkodGhpcyk7CisJCQlqcWN1ci5jb250ZXh0ID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXM7CisKKwkJCWZvciAoIGN1ciA9IGV2ZW50LnRhcmdldDsgY3VyICE9IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CisKKwkJCQkvLyBEb24ndCBwcm9jZXNzIGV2ZW50cyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1KQorCQkJCWlmICggY3VyLmRpc2FibGVkICE9PSB0cnVlICkgeworCQkJCQlzZWxNYXRjaCA9IHt9OworCQkJCQltYXRjaGVzID0gW107CisJCQkJCWpxY3VyWzBdID0gY3VyOworCQkJCQlmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHsKKwkJCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07CisJCQkJCQlzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3I7CisKKwkJCQkJCWlmICggc2VsTWF0Y2hbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7CisJCQkJCQkJc2VsTWF0Y2hbIHNlbCBdID0gKAorCQkJCQkJCQloYW5kbGVPYmoucXVpY2sgPyBxdWlja0lzKCBjdXIsIGhhbmRsZU9iai5xdWljayApIDoganFjdXIuaXMoIHNlbCApCisJCQkJCQkJKTsKKwkJCQkJCX0KKwkJCQkJCWlmICggc2VsTWF0Y2hbIHNlbCBdICkgeworCQkJCQkJCW1hdGNoZXMucHVzaCggaGFuZGxlT2JqICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKCBtYXRjaGVzLmxlbmd0aCApIHsKKwkJCQkJCWhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogY3VyLCBtYXRjaGVzOiBtYXRjaGVzIH0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVycworCQlpZiAoIGhhbmRsZXJzLmxlbmd0aCA+IGRlbGVnYXRlQ291bnQgKSB7CisJCQloYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IHRoaXMsIG1hdGNoZXM6IGhhbmRsZXJzLnNsaWNlKCBkZWxlZ2F0ZUNvdW50ICkgfSk7CisJCX0KKworCQkvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1cworCQlmb3IgKCBpID0gMDsgaSA8IGhhbmRsZXJRdWV1ZS5sZW5ndGggJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7IGkrKyApIHsKKwkJCW1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkgXTsKKwkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CisKKwkJCWZvciAoIGogPSAwOyBqIDwgbWF0Y2hlZC5tYXRjaGVzLmxlbmd0aCAmJiAhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTsgaisrICkgeworCQkJCWhhbmRsZU9iaiA9IG1hdGNoZWQubWF0Y2hlc1sgaiBdOworCisJCQkJLy8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGJlIG5vbi1leGNsdXNpdmUgYW5kIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgorCQkJCS8vIDIpIGhhdmUgbmFtZXNwYWNlKHMpIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgorCQkJCWlmICggcnVuX2FsbCB8fCAoIWV2ZW50Lm5hbWVzcGFjZSAmJiAhaGFuZGxlT2JqLm5hbWVzcGFjZSkgfHwgZXZlbnQubmFtZXNwYWNlX3JlICYmIGV2ZW50Lm5hbWVzcGFjZV9yZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7CisKKwkJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhOworCQkJCQlldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7CisKKwkJCQkJcmV0ID0gKCAoalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9KS5oYW5kbGUgfHwgaGFuZGxlT2JqLmhhbmRsZXIgKQorCQkJCQkJCS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7CisKKwkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKKwkJCQkJCWV2ZW50LnJlc3VsdCA9IHJldDsKKwkJCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKKwkJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQkJCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQorCQlpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkgeworCQkJc3BlY2lhbC5wb3N0RGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKTsKKwkJfQorCisJCXJldHVybiBldmVudC5yZXN1bHQ7CisJfSwKKworCS8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMgc2hhcmVkIGJ5IEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50CisJLy8gKioqIGF0dHJDaGFuZ2UgYXR0ck5hbWUgcmVsYXRlZE5vZGUgc3JjRWxlbWVudCAgYXJlIG5vdCBub3JtYWxpemVkLCBub24tVzNDLCBkZXByZWNhdGVkLCB3aWxsIGJlIHJlbW92ZWQgaW4gMS44ICoqKgorCXByb3BzOiAiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSwKKworCWZpeEhvb2tzOiB7fSwKKworCWtleUhvb2tzOiB7CisJCXByb3BzOiAiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSwKKwkJZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkgeworCisJCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKKwkJCWlmICggZXZlbnQud2hpY2ggPT0gbnVsbCApIHsKKwkJCQlldmVudC53aGljaCA9IG9yaWdpbmFsLmNoYXJDb2RlICE9IG51bGwgPyBvcmlnaW5hbC5jaGFyQ29kZSA6IG9yaWdpbmFsLmtleUNvZGU7CisJCQl9CisKKwkJCXJldHVybiBldmVudDsKKwkJfQorCX0sCisKKwltb3VzZUhvb2tzOiB7CisJCXByb3BzOiAiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLAorCQlmaWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7CisJCQl2YXIgZXZlbnREb2MsIGRvYywgYm9keSwKKwkJCQlidXR0b24gPSBvcmlnaW5hbC5idXR0b24sCisJCQkJZnJvbUVsZW1lbnQgPSBvcmlnaW5hbC5mcm9tRWxlbWVudDsKKworCQkJLy8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZQorCQkJaWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIG9yaWdpbmFsLmNsaWVudFggIT0gbnVsbCApIHsKKwkJCQlldmVudERvYyA9IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OworCQkJCWRvYyA9IGV2ZW50RG9jLmRvY3VtZW50RWxlbWVudDsKKwkJCQlib2R5ID0gZXZlbnREb2MuYm9keTsKKworCQkJCWV2ZW50LnBhZ2VYID0gb3JpZ2luYWwuY2xpZW50WCArICggZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRMZWZ0IHx8IGJvZHkgJiYgYm9keS5jbGllbnRMZWZ0IHx8IDAgKTsKKwkJCQlldmVudC5wYWdlWSA9IG9yaWdpbmFsLmNsaWVudFkgKyAoIGRvYyAmJiBkb2Muc2Nyb2xsVG9wICB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wICB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50VG9wICB8fCBib2R5ICYmIGJvZHkuY2xpZW50VG9wICB8fCAwICk7CisJCQl9CisKKwkJCS8vIEFkZCByZWxhdGVkVGFyZ2V0LCBpZiBuZWNlc3NhcnkKKwkJCWlmICggIWV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgZnJvbUVsZW1lbnQgKSB7CisJCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBvcmlnaW5hbC50b0VsZW1lbnQgOiBmcm9tRWxlbWVudDsKKwkJCX0KKworCQkJLy8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodAorCQkJLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXQKKwkJCWlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkgeworCQkJCWV2ZW50LndoaWNoID0gKCBidXR0b24gJiAxID8gMSA6ICggYnV0dG9uICYgMiA/IDMgOiAoIGJ1dHRvbiAmIDQgPyAyIDogMCApICkgKTsKKwkJCX0KKworCQkJcmV0dXJuIGV2ZW50OworCQl9CisJfSwKKworCWZpeDogZnVuY3Rpb24oIGV2ZW50ICkgeworCQlpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkgeworCQkJcmV0dXJuIGV2ZW50OworCQl9CisKKwkJLy8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxpemUgc29tZSBwcm9wZXJ0aWVzCisJCXZhciBpLCBwcm9wLAorCQkJb3JpZ2luYWxFdmVudCA9IGV2ZW50LAorCQkJZml4SG9vayA9IGpRdWVyeS5ldmVudC5maXhIb29rc1sgZXZlbnQudHlwZSBdIHx8IHt9LAorCQkJY29weSA9IGZpeEhvb2sucHJvcHMgPyB0aGlzLnByb3BzLmNvbmNhdCggZml4SG9vay5wcm9wcyApIDogdGhpcy5wcm9wczsKKworCQlldmVudCA9IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApOworCisJCWZvciAoIGkgPSBjb3B5Lmxlbmd0aDsgaTsgKSB7CisJCQlwcm9wID0gY29weVsgLS1pIF07CisJCQlldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdOworCQl9CisKKwkJLy8gRml4IHRhcmdldCBwcm9wZXJ0eSwgaWYgbmVjZXNzYXJ5ICgjMTkyNSwgSUUgNi83LzggJiBTYWZhcmkyKQorCQlpZiAoICFldmVudC50YXJnZXQgKSB7CisJCQlldmVudC50YXJnZXQgPSBvcmlnaW5hbEV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7CisJCX0KKworCQkvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgU2FmYXJpKQorCQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKKwkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOworCQl9CisKKwkJLy8gRm9yIG1vdXNlL2tleSBldmVudHM7IGFkZCBtZXRhS2V5IGlmIGl0J3Mgbm90IHRoZXJlICgjMzM2OCwgSUU2LzcvOCkKKwkJaWYgKCBldmVudC5tZXRhS2V5ID09PSB1bmRlZmluZWQgKSB7CisJCQlldmVudC5tZXRhS2V5ID0gZXZlbnQuY3RybEtleTsKKwkJfQorCisJCXJldHVybiBmaXhIb29rLmZpbHRlcj8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDsKKwl9LAorCisJc3BlY2lhbDogeworCQlyZWFkeTogeworCQkJLy8gTWFrZSBzdXJlIHRoZSByZWFkeSBldmVudCBpcyBzZXR1cAorCQkJc2V0dXA6IGpRdWVyeS5iaW5kUmVhZHkKKwkJfSwKKworCQlsb2FkOiB7CisJCQkvLyBQcmV2ZW50IHRyaWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkCisJCQlub0J1YmJsZTogdHJ1ZQorCQl9LAorCisJCWZvY3VzOiB7CisJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgorCQl9LAorCQlibHVyOiB7CisJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKKwkJfSwKKworCQliZWZvcmV1bmxvYWQ6IHsKKwkJCXNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7CisJCQkJLy8gV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgc3BlY2lhbCBjYXNlIG9uIHdpbmRvd3MKKwkJCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggdGhpcyApICkgeworCQkJCQl0aGlzLm9uYmVmb3JldW5sb2FkID0gZXZlbnRIYW5kbGU7CisJCQkJfQorCQkJfSwKKworCQkJdGVhcmRvd246IGZ1bmN0aW9uKCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApIHsKKwkJCQlpZiAoIHRoaXMub25iZWZvcmV1bmxvYWQgPT09IGV2ZW50SGFuZGxlICkgeworCQkJCQl0aGlzLm9uYmVmb3JldW5sb2FkID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCisJc2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCwgYnViYmxlICkgeworCQkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCisJCS8vIEZha2Ugb3JpZ2luYWxFdmVudCB0byBhdm9pZCBkb25vcidzIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGlmIHRoZQorCQkvLyBzaW11bGF0ZWQgZXZlbnQgcHJldmVudHMgZGVmYXVsdCB0aGVuIHdlIGRvIHRoZSBzYW1lIG9uIHRoZSBkb25vci4KKwkJdmFyIGUgPSBqUXVlcnkuZXh0ZW5kKAorCQkJbmV3IGpRdWVyeS5FdmVudCgpLAorCQkJZXZlbnQsCisJCQl7IHR5cGU6IHR5cGUsCisJCQkJaXNTaW11bGF0ZWQ6IHRydWUsCisJCQkJb3JpZ2luYWxFdmVudDoge30KKwkJCX0KKwkJKTsKKwkJaWYgKCBidWJibGUgKSB7CisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOworCQl9IGVsc2UgeworCQkJalF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmNhbGwoIGVsZW0sIGUgKTsKKwkJfQorCQlpZiAoIGUuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CisJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQl9CisJfQorfTsKKworLy8gU29tZSBwbHVnaW5zIGFyZSB1c2luZywgYnV0IGl0J3MgdW5kb2N1bWVudGVkL2RlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KKy8vIFRoZSAxLjcgc3BlY2lhbCBldmVudCBpbnRlcmZhY2Ugc2hvdWxkIHByb3ZpZGUgYWxsIHRoZSBob29rcyBuZWVkZWQgbm93LgoralF1ZXJ5LmV2ZW50LmhhbmRsZSA9IGpRdWVyeS5ldmVudC5kaXNwYXRjaDsKKworalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciA/CisJZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKKwkJaWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7CisJCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSwgZmFsc2UgKTsKKwkJfQorCX0gOgorCWZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7CisJCWlmICggZWxlbS5kZXRhY2hFdmVudCApIHsKKwkJCWVsZW0uZGV0YWNoRXZlbnQoICJvbiIgKyB0eXBlLCBoYW5kbGUgKTsKKwkJfQorCX07CisKK2pRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkgeworCS8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAorCWlmICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHsKKwkJcmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTsKKwl9CisKKwkvLyBFdmVudCBvYmplY3QKKwlpZiAoIHNyYyAmJiBzcmMudHlwZSApIHsKKwkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOworCQl0aGlzLnR5cGUgPSBzcmMudHlwZTsKKworCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAorCQkvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS4KKwkJdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSAoIHNyYy5kZWZhdWx0UHJldmVudGVkIHx8IHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgfHwKKwkJCXNyYy5nZXRQcmV2ZW50RGVmYXVsdCAmJiBzcmMuZ2V0UHJldmVudERlZmF1bHQoKSApID8gcmV0dXJuVHJ1ZSA6IHJldHVybkZhbHNlOworCisJLy8gRXZlbnQgdHlwZQorCX0gZWxzZSB7CisJCXRoaXMudHlwZSA9IHNyYzsKKwl9CisKKwkvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdAorCWlmICggcHJvcHMgKSB7CisJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7CisJfQorCisJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKKwl0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IGpRdWVyeS5ub3coKTsKKworCS8vIE1hcmsgaXQgYXMgZml4ZWQKKwl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKK307CisKK2Z1bmN0aW9uIHJldHVybkZhbHNlKCkgeworCXJldHVybiBmYWxzZTsKK30KK2Z1bmN0aW9uIHJldHVyblRydWUoKSB7CisJcmV0dXJuIHRydWU7Cit9CisKKy8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZworLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCitqUXVlcnkuRXZlbnQucHJvdG90eXBlID0geworCXByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHsKKwkJdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlOworCisJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OworCQlpZiAoICFlICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKKwkJaWYgKCBlLnByZXZlbnREZWZhdWx0ICkgeworCQkJZS5wcmV2ZW50RGVmYXVsdCgpOworCisJCS8vIG90aGVyd2lzZSBzZXQgdGhlIHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZSAoSUUpCisJCX0gZWxzZSB7CisJCQllLnJldHVyblZhbHVlID0gZmFsc2U7CisJCX0KKwl9LAorCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CisJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOworCisJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OworCQlpZiAoICFlICkgeworCQkJcmV0dXJuOworCQl9CisJCS8vIGlmIHN0b3BQcm9wYWdhdGlvbiBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAorCQlpZiAoIGUuc3RvcFByb3BhZ2F0aW9uICkgeworCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKKwkJfQorCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSBjYW5jZWxCdWJibGUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIHRydWUgKElFKQorCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7CisJfSwKKwlzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeworCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKwkJdGhpcy5zdG9wUHJvcGFnYXRpb24oKTsKKwl9LAorCWlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCisJaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAorCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZQorfTsKKworLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzCitqUXVlcnkuZWFjaCh7CisJbW91c2VlbnRlcjogIm1vdXNlb3ZlciIsCisJbW91c2VsZWF2ZTogIm1vdXNlb3V0IgorfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKKwlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0geworCQlkZWxlZ2F0ZVR5cGU6IGZpeCwKKwkJYmluZFR5cGU6IGZpeCwKKworCQloYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHsKKwkJCXZhciB0YXJnZXQgPSB0aGlzLAorCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAorCQkJCWhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iaiwKKwkJCQlzZWxlY3RvciA9IGhhbmRsZU9iai5zZWxlY3RvciwKKwkJCQlyZXQ7CisKKwkJCS8vIEZvciBtb3VzZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KKwkJCS8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93CisJCQlpZiAoICFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkpICkgeworCQkJCWV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7CisJCQkJcmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCQkJCWV2ZW50LnR5cGUgPSBmaXg7CisJCQl9CisJCQlyZXR1cm4gcmV0OworCQl9CisJfTsKK30pOworCisvLyBJRSBzdWJtaXQgZGVsZWdhdGlvbgoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3VibWl0QnViYmxlcyApIHsKKworCWpRdWVyeS5ldmVudC5zcGVjaWFsLnN1Ym1pdCA9IHsKKwkJc2V0dXA6IGZ1bmN0aW9uKCkgeworCQkJLy8gT25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHMKKwkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiZm9ybSIgKSApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCS8vIExhenktYWRkIGEgc3VibWl0IGhhbmRsZXIgd2hlbiBhIGRlc2NlbmRhbnQgZm9ybSBtYXkgcG90ZW50aWFsbHkgYmUgc3VibWl0dGVkCisJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7CisJCQkJLy8gTm9kZSBuYW1lIGNoZWNrIGF2b2lkcyBhIFZNTC1yZWxhdGVkIGNyYXNoIGluIElFICgjOTgwNykKKwkJCQl2YXIgZWxlbSA9IGUudGFyZ2V0LAorCQkJCQlmb3JtID0galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9uIiApID8gZWxlbS5mb3JtIDogdW5kZWZpbmVkOworCQkJCWlmICggZm9ybSAmJiAhZm9ybS5fc3VibWl0X2F0dGFjaGVkICkgeworCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCBmb3JtLCAic3VibWl0Ll9zdWJtaXQiLCBmdW5jdGlvbiggZXZlbnQgKSB7CisJCQkJCQlldmVudC5fc3VibWl0X2J1YmJsZSA9IHRydWU7CisJCQkJCX0pOworCQkJCQlmb3JtLl9zdWJtaXRfYXR0YWNoZWQgPSB0cnVlOworCQkJCX0KKwkJCX0pOworCQkJLy8gcmV0dXJuIHVuZGVmaW5lZCBzaW5jZSB3ZSBkb24ndCBuZWVkIGFuIGV2ZW50IGxpc3RlbmVyCisJCX0sCisJCQorCQlwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHsKKwkJCS8vIElmIGZvcm0gd2FzIHN1Ym1pdHRlZCBieSB0aGUgdXNlciwgYnViYmxlIHRoZSBldmVudCB1cCB0aGUgdHJlZQorCQkJaWYgKCBldmVudC5fc3VibWl0X2J1YmJsZSApIHsKKwkJCQlkZWxldGUgZXZlbnQuX3N1Ym1pdF9idWJibGU7CisJCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHsKKwkJCQkJalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCAic3VibWl0IiwgdGhpcy5wYXJlbnROb2RlLCBldmVudCwgdHJ1ZSApOworCQkJCX0KKwkJCX0KKwkJfSwKKworCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7CisJCQkvLyBPbmx5IG5lZWQgdGhpcyBmb3IgZGVsZWdhdGVkIGZvcm0gc3VibWl0IGV2ZW50cworCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJmb3JtIiApICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJLy8gUmVtb3ZlIGRlbGVnYXRlZCBoYW5kbGVyczsgY2xlYW5EYXRhIGV2ZW50dWFsbHkgcmVhcHMgc3VibWl0IGhhbmRsZXJzIGF0dGFjaGVkIGFib3ZlCisJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCAiLl9zdWJtaXQiICk7CisJCX0KKwl9OworfQorCisvLyBJRSBjaGFuZ2UgZGVsZWdhdGlvbiBhbmQgY2hlY2tib3gvcmFkaW8gZml4CitpZiAoICFqUXVlcnkuc3VwcG9ydC5jaGFuZ2VCdWJibGVzICkgeworCisJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuY2hhbmdlID0geworCisJCXNldHVwOiBmdW5jdGlvbigpIHsKKworCQkJaWYgKCByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKSApIHsKKwkJCQkvLyBJRSBkb2Vzbid0IGZpcmUgY2hhbmdlIG9uIGEgY2hlY2svcmFkaW8gdW50aWwgYmx1cjsgdHJpZ2dlciBpdCBvbiBjbGljaworCQkJCS8vIGFmdGVyIGEgcHJvcGVydHljaGFuZ2UuIEVhdCB0aGUgYmx1ci1jaGFuZ2UgaW4gc3BlY2lhbC5jaGFuZ2UuaGFuZGxlLgorCQkJCS8vIFRoaXMgc3RpbGwgZmlyZXMgb25jaGFuZ2UgYSBzZWNvbmQgdGltZSBmb3IgY2hlY2svcmFkaW8gYWZ0ZXIgYmx1ci4KKwkJCQlpZiAoIHRoaXMudHlwZSA9PT0gImNoZWNrYm94IiB8fCB0aGlzLnR5cGUgPT09ICJyYWRpbyIgKSB7CisJCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsICJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIiwgZnVuY3Rpb24oIGV2ZW50ICkgeworCQkJCQkJaWYgKCBldmVudC5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZSA9PT0gImNoZWNrZWQiICkgeworCQkJCQkJCXRoaXMuX2p1c3RfY2hhbmdlZCA9IHRydWU7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiY2xpY2suX2NoYW5nZSIsIGZ1bmN0aW9uKCBldmVudCApIHsKKwkJCQkJCWlmICggdGhpcy5fanVzdF9jaGFuZ2VkICYmICFldmVudC5pc1RyaWdnZXIgKSB7CisJCQkJCQkJdGhpcy5fanVzdF9jaGFuZ2VkID0gZmFsc2U7CisJCQkJCQkJalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCAiY2hhbmdlIiwgdGhpcywgZXZlbnQsIHRydWUgKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCS8vIERlbGVnYXRlZCBldmVudDsgbGF6eS1hZGQgYSBjaGFuZ2UgaGFuZGxlciBvbiBkZXNjZW5kYW50IGlucHV0cworCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLCBmdW5jdGlvbiggZSApIHsKKwkJCQl2YXIgZWxlbSA9IGUudGFyZ2V0OworCisJCQkJaWYgKCByZm9ybUVsZW1zLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiAhZWxlbS5fY2hhbmdlX2F0dGFjaGVkICkgeworCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCBlbGVtLCAiY2hhbmdlLl9jaGFuZ2UiLCBmdW5jdGlvbiggZXZlbnQgKSB7CisJCQkJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSAmJiAhZXZlbnQuaXNTaW11bGF0ZWQgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHsKKwkJCQkJCQlqUXVlcnkuZXZlbnQuc2ltdWxhdGUoICJjaGFuZ2UiLCB0aGlzLnBhcmVudE5vZGUsIGV2ZW50LCB0cnVlICk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCQllbGVtLl9jaGFuZ2VfYXR0YWNoZWQgPSB0cnVlOworCQkJCX0KKwkJCX0pOworCQl9LAorCisJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgeworCQkJdmFyIGVsZW0gPSBldmVudC50YXJnZXQ7CisKKwkJCS8vIFN3YWxsb3cgbmF0aXZlIGNoYW5nZSBldmVudHMgZnJvbSBjaGVja2JveC9yYWRpbywgd2UgYWxyZWFkeSB0cmlnZ2VyZWQgdGhlbSBhYm92ZQorCQkJaWYgKCB0aGlzICE9PSBlbGVtIHx8IGV2ZW50LmlzU2ltdWxhdGVkIHx8IGV2ZW50LmlzVHJpZ2dlciB8fCAoZWxlbS50eXBlICE9PSAicmFkaW8iICYmIGVsZW0udHlwZSAhPT0gImNoZWNrYm94IikgKSB7CisJCQkJcmV0dXJuIGV2ZW50LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJCX0KKwkJfSwKKworCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7CisJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCAiLl9jaGFuZ2UiICk7CisKKwkJCXJldHVybiByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKKwkJfQorCX07Cit9CisKKy8vIENyZWF0ZSAiYnViYmxpbmciIGZvY3VzIGFuZCBibHVyIGV2ZW50cworaWYgKCAhalF1ZXJ5LnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgKSB7CisJalF1ZXJ5LmVhY2goeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CisKKwkJLy8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dAorCQl2YXIgYXR0YWNoZXMgPSAwLAorCQkJaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKKwkJCQlqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApLCB0cnVlICk7CisJCQl9OworCisJCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHsKKwkJCXNldHVwOiBmdW5jdGlvbigpIHsKKwkJCQlpZiAoIGF0dGFjaGVzKysgPT09IDAgKSB7CisJCQkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKKwkJCQl9CisJCQl9LAorCQkJdGVhcmRvd246IGZ1bmN0aW9uKCkgeworCQkJCWlmICggLS1hdHRhY2hlcyA9PT0gMCApIHsKKwkJCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9KTsKK30KKworalF1ZXJ5LmZuLmV4dGVuZCh7CisKKwlvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIC8qSU5URVJOQUwqLyBvbmUgKSB7CisJCXZhciBvcmlnRm4sIHR5cGU7CisKKwkJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCisJCWlmICggdHlwZW9mIHR5cGVzID09PSAib2JqZWN0IiApIHsKKwkJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCisJCQlpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gInN0cmluZyIgKSB7IC8vICYmIHNlbGVjdG9yICE9IG51bGwKKwkJCQkvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApCisJCQkJZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7CisJCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CisJCQl9CisJCQlmb3IgKCB0eXBlIGluIHR5cGVzICkgeworCQkJCXRoaXMub24oIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTsKKwkJCX0KKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJaWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHsKKwkJCS8vICggdHlwZXMsIGZuICkKKwkJCWZuID0gc2VsZWN0b3I7CisJCQlkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7CisJCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7CisJCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CisJCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKKwkJCQlmbiA9IGRhdGE7CisJCQkJZGF0YSA9IHVuZGVmaW5lZDsKKwkJCX0gZWxzZSB7CisJCQkJLy8gKCB0eXBlcywgZGF0YSwgZm4gKQorCQkJCWZuID0gZGF0YTsKKwkJCQlkYXRhID0gc2VsZWN0b3I7CisJCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CisJCQl9CisJCX0KKwkJaWYgKCBmbiA9PT0gZmFsc2UgKSB7CisJCQlmbiA9IHJldHVybkZhbHNlOworCQl9IGVsc2UgaWYgKCAhZm4gKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCWlmICggb25lID09PSAxICkgeworCQkJb3JpZ0ZuID0gZm47CisJCQlmbiA9IGZ1bmN0aW9uKCBldmVudCApIHsKKwkJCQkvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm8KKwkJCQlqUXVlcnkoKS5vZmYoIGV2ZW50ICk7CisJCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisJCQl9OworCQkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KKwkJCWZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApOworCQl9CisJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApOworCQl9KTsKKwl9LAorCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CisJCXJldHVybiB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7CisJfSwKKwlvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkgeworCQlpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHsKKwkJCS8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnQKKwkJCXZhciBoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CisJCQlqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKAorCQkJCWhhbmRsZU9iai5uYW1lc3BhY2UgPyBoYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDogaGFuZGxlT2JqLm9yaWdUeXBlLAorCQkJCWhhbmRsZU9iai5zZWxlY3RvciwKKwkJCQloYW5kbGVPYmouaGFuZGxlcgorCQkJKTsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCWlmICggdHlwZW9mIHR5cGVzID09PSAib2JqZWN0IiApIHsKKwkJCS8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApCisJCQlmb3IgKCB2YXIgdHlwZSBpbiB0eXBlcyApIHsKKwkJCQl0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTsKKwkJCX0KKwkJCXJldHVybiB0aGlzOworCQl9CisJCWlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gImZ1bmN0aW9uIiApIHsKKwkJCS8vICggdHlwZXMgWywgZm5dICkKKwkJCWZuID0gc2VsZWN0b3I7CisJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKKwkJfQorCQlpZiAoIGZuID09PSBmYWxzZSApIHsKKwkJCWZuID0gcmV0dXJuRmFsc2U7CisJCX0KKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKKwkJfSk7CisJfSwKKworCWJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7CisJCXJldHVybiB0aGlzLm9uKCB0eXBlcywgbnVsbCwgZGF0YSwgZm4gKTsKKwl9LAorCXVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHsKKwkJcmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTsKKwl9LAorCisJbGl2ZTogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKKwkJalF1ZXJ5KCB0aGlzLmNvbnRleHQgKS5vbiggdHlwZXMsIHRoaXMuc2VsZWN0b3IsIGRhdGEsIGZuICk7CisJCXJldHVybiB0aGlzOworCX0sCisJZGllOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgeworCQlqUXVlcnkoIHRoaXMuY29udGV4dCApLm9mZiggdHlwZXMsIHRoaXMuc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKKwkJcmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTsKKwl9LAorCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgeworCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCisJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID09IDE/IHRoaXMub2ZmKCBzZWxlY3RvciwgIioqIiApIDogdGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciwgZm4gKTsKKwl9LAorCisJdHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOworCQl9KTsKKwl9LAorCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKwkJaWYgKCB0aGlzWzBdICkgeworCQkJcmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzWzBdLCB0cnVlICk7CisJCX0KKwl9LAorCisJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CisJCS8vIFNhdmUgcmVmZXJlbmNlIHRvIGFyZ3VtZW50cyBmb3IgYWNjZXNzIGluIGNsb3N1cmUKKwkJdmFyIGFyZ3MgPSBhcmd1bWVudHMsCisJCQlndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrLAorCQkJaSA9IDAsCisJCQl0b2dnbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgeworCQkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhlY3V0ZQorCQkJCXZhciBsYXN0VG9nZ2xlID0gKCBqUXVlcnkuX2RhdGEoIHRoaXMsICJsYXN0VG9nZ2xlIiArIGZuLmd1aWQgKSB8fCAwICkgJSBpOworCQkJCWpRdWVyeS5fZGF0YSggdGhpcywgImxhc3RUb2dnbGUiICsgZm4uZ3VpZCwgbGFzdFRvZ2dsZSArIDEgKTsKKworCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCisJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKworCQkJCS8vIGFuZCBleGVjdXRlIHRoZSBmdW5jdGlvbgorCQkJCXJldHVybiBhcmdzWyBsYXN0VG9nZ2xlIF0uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIHx8IGZhbHNlOworCQkJfTsKKworCQkvLyBsaW5rIGFsbCB0aGUgZnVuY3Rpb25zLCBzbyBhbnkgb2YgdGhlbSBjYW4gdW5iaW5kIHRoaXMgY2xpY2sgaGFuZGxlcgorCQl0b2dnbGVyLmd1aWQgPSBndWlkOworCQl3aGlsZSAoIGkgPCBhcmdzLmxlbmd0aCApIHsKKwkJCWFyZ3NbIGkrKyBdLmd1aWQgPSBndWlkOworCQl9CisKKwkJcmV0dXJuIHRoaXMuY2xpY2soIHRvZ2dsZXIgKTsKKwl9LAorCisJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgeworCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTsKKwl9Cit9KTsKKworalF1ZXJ5LmVhY2goICgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgIiArCisJIm1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlICIgKworCSJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Iikuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisKKwkvLyBIYW5kbGUgZXZlbnQgYmluZGluZworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkgeworCQlpZiAoIGZuID09IG51bGwgKSB7CisJCQlmbiA9IGRhdGE7CisJCQlkYXRhID0gbnVsbDsKKwkJfQorCisJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/CisJCQl0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDoKKwkJCXRoaXMudHJpZ2dlciggbmFtZSApOworCX07CisKKwlpZiAoIGpRdWVyeS5hdHRyRm4gKSB7CisJCWpRdWVyeS5hdHRyRm5bIG5hbWUgXSA9IHRydWU7CisJfQorCisJaWYgKCBya2V5RXZlbnQudGVzdCggbmFtZSApICkgeworCQlqUXVlcnkuZXZlbnQuZml4SG9va3NbIG5hbWUgXSA9IGpRdWVyeS5ldmVudC5rZXlIb29rczsKKwl9CisKKwlpZiAoIHJtb3VzZUV2ZW50LnRlc3QoIG5hbWUgKSApIHsKKwkJalF1ZXJ5LmV2ZW50LmZpeEhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXZlbnQubW91c2VIb29rczsKKwl9Cit9KTsKKworCisKKy8qIQorICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUKKyAqICBDb3B5cmlnaHQgMjAxMSwgVGhlIERvam8gRm91bmRhdGlvbgorICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KKyAqICBNb3JlIGluZm9ybWF0aW9uOiBodHRwOi8vc2l6emxlanMuY29tLworICovCisoZnVuY3Rpb24oKXsKKwordmFyIGNodW5rZXIgPSAvKCg/OlwoKD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtbXlxbXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteXFtcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8oKD86LnxccnxcbikqKS9nLAorCWV4cGFuZG8gPSAic2l6Y2FjaGUiICsgKE1hdGgucmFuZG9tKCkgKyAnJykucmVwbGFjZSgnLicsICcnKSwKKwlkb25lID0gMCwKKwl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCisJaGFzRHVwbGljYXRlID0gZmFsc2UsCisJYmFzZUhhc0R1cGxpY2F0ZSA9IHRydWUsCisJckJhY2tzbGFzaCA9IC9cXC9nLAorCXJSZXR1cm4gPSAvXHJcbi9nLAorCXJOb25Xb3JkID0gL1xXLzsKKworLy8gSGVyZSB3ZSBjaGVjayBpZiB0aGUgSmF2YVNjcmlwdCBlbmdpbmUgaXMgdXNpbmcgc29tZSBzb3J0IG9mCisvLyBvcHRpbWl6YXRpb24gd2hlcmUgaXQgZG9lcyBub3QgYWx3YXlzIGNhbGwgb3VyIGNvbXBhcmlzaW9uCisvLyBmdW5jdGlvbi4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgZGlzY2FyZCB0aGUgaGFzRHVwbGljYXRlIHZhbHVlLgorLy8gICBUaHVzIGZhciB0aGF0IGluY2x1ZGVzIEdvb2dsZSBDaHJvbWUuCitbMCwgMF0uc29ydChmdW5jdGlvbigpIHsKKwliYXNlSGFzRHVwbGljYXRlID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9KTsKKwordmFyIFNpenpsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHsKKwlyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKKwljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKKworCXZhciBvcmlnQ29udGV4dCA9IGNvbnRleHQ7CisKKwlpZiAoIGNvbnRleHQubm9kZVR5cGUgIT09IDEgJiYgY29udGV4dC5ub2RlVHlwZSAhPT0gOSApIHsKKwkJcmV0dXJuIFtdOworCX0KKworCWlmICggIXNlbGVjdG9yIHx8IHR5cGVvZiBzZWxlY3RvciAhPT0gInN0cmluZyIgKSB7CisJCXJldHVybiByZXN1bHRzOworCX0KKworCXZhciBtLCBzZXQsIGNoZWNrU2V0LCBleHRyYSwgcmV0LCBjdXIsIHBvcCwgaSwKKwkJcHJ1bmUgPSB0cnVlLAorCQljb250ZXh0WE1MID0gU2l6emxlLmlzWE1MKCBjb250ZXh0ICksCisJCXBhcnRzID0gW10sCisJCXNvRmFyID0gc2VsZWN0b3I7CisKKwkvLyBSZXNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGNodW5rZXIgcmVnZXhwIChzdGFydCBmcm9tIGhlYWQpCisJZG8geworCQljaHVua2VyLmV4ZWMoICIiICk7CisJCW0gPSBjaHVua2VyLmV4ZWMoIHNvRmFyICk7CisKKwkJaWYgKCBtICkgeworCQkJc29GYXIgPSBtWzNdOworCisJCQlwYXJ0cy5wdXNoKCBtWzFdICk7CisKKwkJCWlmICggbVsyXSApIHsKKwkJCQlleHRyYSA9IG1bM107CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IHdoaWxlICggbSApOworCisJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsKKworCQlpZiAoIHBhcnRzLmxlbmd0aCA9PT0gMiAmJiBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdICkgeworCQkJc2V0ID0gcG9zUHJvY2VzcyggcGFydHNbMF0gKyBwYXJ0c1sxXSwgY29udGV4dCwgc2VlZCApOworCisJCX0gZWxzZSB7CisJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8KKwkJCQlbIGNvbnRleHQgXSA6CisJCQkJU2l6emxlKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0ICk7CisKKwkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgeworCQkJCXNlbGVjdG9yID0gcGFydHMuc2hpZnQoKTsKKworCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgc2VsZWN0b3IgXSApIHsKKwkJCQkJc2VsZWN0b3IgKz0gcGFydHMuc2hpZnQoKTsKKwkJCQl9CisKKwkJCQlzZXQgPSBwb3NQcm9jZXNzKCBzZWxlY3Rvciwgc2V0LCBzZWVkICk7CisJCQl9CisJCX0KKworCX0gZWxzZSB7CisJCS8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElECisJCS8vIChidXQgbm90IGlmIGl0J2xsIGJlIGZhc3RlciBpZiB0aGUgaW5uZXIgc2VsZWN0b3IgaXMgYW4gSUQpCisJCWlmICggIXNlZWQgJiYgcGFydHMubGVuZ3RoID4gMSAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmICFjb250ZXh0WE1MICYmCisJCQkJRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzWzBdKSAmJiAhRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSApIHsKKworCQkJcmV0ID0gU2l6emxlLmZpbmQoIHBhcnRzLnNoaWZ0KCksIGNvbnRleHQsIGNvbnRleHRYTUwgKTsKKwkJCWNvbnRleHQgPSByZXQuZXhwciA/CisJCQkJU2l6emxlLmZpbHRlciggcmV0LmV4cHIsIHJldC5zZXQgKVswXSA6CisJCQkJcmV0LnNldFswXTsKKwkJfQorCisJCWlmICggY29udGV4dCApIHsKKwkJCXJldCA9IHNlZWQgPworCQkJCXsgZXhwcjogcGFydHMucG9wKCksIHNldDogbWFrZUFycmF5KHNlZWQpIH0gOgorCQkJCVNpenpsZS5maW5kKCBwYXJ0cy5wb3AoKSwgcGFydHMubGVuZ3RoID09PSAxICYmIChwYXJ0c1swXSA9PT0gIn4iIHx8IHBhcnRzWzBdID09PSAiKyIpICYmIGNvbnRleHQucGFyZW50Tm9kZSA/IGNvbnRleHQucGFyZW50Tm9kZSA6IGNvbnRleHQsIGNvbnRleHRYTUwgKTsKKworCQkJc2V0ID0gcmV0LmV4cHIgPworCQkJCVNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0ICkgOgorCQkJCXJldC5zZXQ7CisKKwkJCWlmICggcGFydHMubGVuZ3RoID4gMCApIHsKKwkJCQljaGVja1NldCA9IG1ha2VBcnJheSggc2V0ICk7CisKKwkJCX0gZWxzZSB7CisJCQkJcHJ1bmUgPSBmYWxzZTsKKwkJCX0KKworCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CisJCQkJY3VyID0gcGFydHMucG9wKCk7CisJCQkJcG9wID0gY3VyOworCisJCQkJaWYgKCAhRXhwci5yZWxhdGl2ZVsgY3VyIF0gKSB7CisJCQkJCWN1ciA9ICIiOworCQkJCX0gZWxzZSB7CisJCQkJCXBvcCA9IHBhcnRzLnBvcCgpOworCQkJCX0KKworCQkJCWlmICggcG9wID09IG51bGwgKSB7CisJCQkJCXBvcCA9IGNvbnRleHQ7CisJCQkJfQorCisJCQkJRXhwci5yZWxhdGl2ZVsgY3VyIF0oIGNoZWNrU2V0LCBwb3AsIGNvbnRleHRYTUwgKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJY2hlY2tTZXQgPSBwYXJ0cyA9IFtdOworCQl9CisJfQorCisJaWYgKCAhY2hlY2tTZXQgKSB7CisJCWNoZWNrU2V0ID0gc2V0OworCX0KKworCWlmICggIWNoZWNrU2V0ICkgeworCQlTaXp6bGUuZXJyb3IoIGN1ciB8fCBzZWxlY3RvciApOworCX0KKworCWlmICggdG9TdHJpbmcuY2FsbChjaGVja1NldCkgPT09ICJbb2JqZWN0IEFycmF5XSIgKSB7CisJCWlmICggIXBydW5lICkgeworCQkJcmVzdWx0cy5wdXNoLmFwcGx5KCByZXN1bHRzLCBjaGVja1NldCApOworCisJCX0gZWxzZSBpZiAoIGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCWZvciAoIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7CisJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgU2l6emxlLmNvbnRhaW5zKGNvbnRleHQsIGNoZWNrU2V0W2ldKSkgKSB7CisJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CisJCQkJfQorCQkJfQorCisJCX0gZWxzZSB7CisJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgeworCQkJCWlmICggY2hlY2tTZXRbaV0gJiYgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9IGVsc2UgeworCQltYWtlQXJyYXkoIGNoZWNrU2V0LCByZXN1bHRzICk7CisJfQorCisJaWYgKCBleHRyYSApIHsKKwkJU2l6emxlKCBleHRyYSwgb3JpZ0NvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKKwkJU2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0czsKK307CisKK1NpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7CisJaWYgKCBzb3J0T3JkZXIgKSB7CisJCWhhc0R1cGxpY2F0ZSA9IGJhc2VIYXNEdXBsaWNhdGU7CisJCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CisKKwkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CisJCQlmb3IgKCB2YXIgaSA9IDE7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrICkgeworCQkJCWlmICggcmVzdWx0c1tpXSA9PT0gcmVzdWx0c1sgaSAtIDEgXSApIHsKKwkJCQkJcmVzdWx0cy5zcGxpY2UoIGktLSwgMSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXN1bHRzOworfTsKKworU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgc2V0ICkgeworCXJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIHNldCApOworfTsKKworU2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBub2RlLCBleHByICkgeworCXJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIFtub2RlXSApLmxlbmd0aCA+IDA7Cit9OworCitTaXp6bGUuZmluZCA9IGZ1bmN0aW9uKCBleHByLCBjb250ZXh0LCBpc1hNTCApIHsKKwl2YXIgc2V0LCBpLCBsZW4sIG1hdGNoLCB0eXBlLCBsZWZ0OworCisJaWYgKCAhZXhwciApIHsKKwkJcmV0dXJuIFtdOworCX0KKworCWZvciAoIGkgPSAwLCBsZW4gPSBFeHByLm9yZGVyLmxlbmd0aDsgaSA8IGxlbjsgaSsrICkgeworCQl0eXBlID0gRXhwci5vcmRlcltpXTsKKworCQlpZiAoIChtYXRjaCA9IEV4cHIubGVmdE1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSApIHsKKwkJCWxlZnQgPSBtYXRjaFsxXTsKKwkJCW1hdGNoLnNwbGljZSggMSwgMSApOworCisJCQlpZiAoIGxlZnQuc3Vic3RyKCBsZWZ0Lmxlbmd0aCAtIDEgKSAhPT0gIlxcIiApIHsKKwkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKTsKKwkJCQlzZXQgPSBFeHByLmZpbmRbIHR5cGUgXSggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICk7CisKKwkJCQlpZiAoIHNldCAhPSBudWxsICkgeworCQkJCQlleHByID0gZXhwci5yZXBsYWNlKCBFeHByLm1hdGNoWyB0eXBlIF0sICIiICk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmICggIXNldCApIHsKKwkJc2V0ID0gdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiID8KKwkJCWNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICIqIiApIDoKKwkJCVtdOworCX0KKworCXJldHVybiB7IHNldDogc2V0LCBleHByOiBleHByIH07Cit9OworCitTaXp6bGUuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIHNldCwgaW5wbGFjZSwgbm90ICkgeworCXZhciBtYXRjaCwgYW55Rm91bmQsCisJCXR5cGUsIGZvdW5kLCBpdGVtLCBmaWx0ZXIsIGxlZnQsCisJCWksIHBhc3MsCisJCW9sZCA9IGV4cHIsCisJCXJlc3VsdCA9IFtdLAorCQljdXJMb29wID0gc2V0LAorCQlpc1hNTEZpbHRlciA9IHNldCAmJiBzZXRbMF0gJiYgU2l6emxlLmlzWE1MKCBzZXRbMF0gKTsKKworCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgeworCQlmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkgeworCQkJaWYgKCAobWF0Y2ggPSBFeHByLmxlZnRNYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgIT0gbnVsbCAmJiBtYXRjaFsyXSApIHsKKwkJCQlmaWx0ZXIgPSBFeHByLmZpbHRlclsgdHlwZSBdOworCQkJCWxlZnQgPSBtYXRjaFsxXTsKKworCQkJCWFueUZvdW5kID0gZmFsc2U7CisKKwkJCQltYXRjaC5zcGxpY2UoMSwxKTsKKworCQkJCWlmICggbGVmdC5zdWJzdHIoIGxlZnQubGVuZ3RoIC0gMSApID09PSAiXFwiICkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoIGN1ckxvb3AgPT09IHJlc3VsdCApIHsKKwkJCQkJcmVzdWx0ID0gW107CisJCQkJfQorCisJCQkJaWYgKCBFeHByLnByZUZpbHRlclsgdHlwZSBdICkgeworCQkJCQltYXRjaCA9IEV4cHIucHJlRmlsdGVyWyB0eXBlIF0oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUxGaWx0ZXIgKTsKKworCQkJCQlpZiAoICFtYXRjaCApIHsKKwkJCQkJCWFueUZvdW5kID0gZm91bmQgPSB0cnVlOworCisJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIG1hdGNoICkgeworCQkJCQlmb3IgKCBpID0gMDsgKGl0ZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQkJCQlpZiAoIGl0ZW0gKSB7CisJCQkJCQkJZm91bmQgPSBmaWx0ZXIoIGl0ZW0sIG1hdGNoLCBpLCBjdXJMb29wICk7CisJCQkJCQkJcGFzcyA9IG5vdCBeIGZvdW5kOworCisJCQkJCQkJaWYgKCBpbnBsYWNlICYmIGZvdW5kICE9IG51bGwgKSB7CisJCQkJCQkJCWlmICggcGFzcyApIHsKKwkJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKKworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOworCQkJCQkJCQl9CisKKwkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgeworCQkJCQkJCQlyZXN1bHQucHVzaCggaXRlbSApOworCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCBmb3VuZCAhPT0gdW5kZWZpbmVkICkgeworCQkJCQlpZiAoICFpbnBsYWNlICkgeworCQkJCQkJY3VyTG9vcCA9IHJlc3VsdDsKKwkJCQkJfQorCisJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKKworCQkJCQlpZiAoICFhbnlGb3VuZCApIHsKKwkJCQkJCXJldHVybiBbXTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KKwkJaWYgKCBleHByID09PSBvbGQgKSB7CisJCQlpZiAoIGFueUZvdW5kID09IG51bGwgKSB7CisJCQkJU2l6emxlLmVycm9yKCBleHByICk7CisKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlvbGQgPSBleHByOworCX0KKworCXJldHVybiBjdXJMb29wOworfTsKKworU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKKwl0aHJvdyBuZXcgRXJyb3IoICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgbXNnICk7Cit9OworCisvKioKKyAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJlaXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzCisgKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW0KKyAqLwordmFyIGdldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciBpLCBub2RlLAorCQlub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGUsCisJCXJldCA9ICIiOworCisJaWYgKCBub2RlVHlwZSApIHsKKwkJaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7CisJCQkvLyBVc2UgdGV4dENvbnRlbnQgfHwgaW5uZXJUZXh0IGZvciBlbGVtZW50cworCQkJaWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gJ3N0cmluZycgKSB7CisJCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CisJCQl9IGVsc2UgaWYgKCB0eXBlb2YgZWxlbS5pbm5lclRleHQgPT09ICdzdHJpbmcnICkgeworCQkJCS8vIFJlcGxhY2UgSUUncyBjYXJyaWFnZSByZXR1cm5zCisJCQkJcmV0dXJuIGVsZW0uaW5uZXJUZXh0LnJlcGxhY2UoIHJSZXR1cm4sICcnICk7CisJCQl9IGVsc2UgeworCQkJCS8vIFRyYXZlcnNlIGl0J3MgY2hpbGRyZW4KKwkJCQlmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZykgeworCQkJCQlyZXQgKz0gZ2V0VGV4dCggZWxlbSApOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7CisJCQlyZXR1cm4gZWxlbS5ub2RlVmFsdWU7CisJCX0KKwl9IGVsc2UgeworCisJCS8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5CisJCWZvciAoIGkgPSAwOyAobm9kZSA9IGVsZW1baV0pOyBpKysgKSB7CisJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcworCQkJaWYgKCBub2RlLm5vZGVUeXBlICE9PSA4ICkgeworCQkJCXJldCArPSBnZXRUZXh0KCBub2RlICk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK307CisKK3ZhciBFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKKwlvcmRlcjogWyAiSUQiLCAiTkFNRSIsICJUQUciIF0sCisKKwltYXRjaDogeworCQlJRDogLyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAorCQlDTEFTUzogL1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLywKKwkJTkFNRTogL1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVsnIl0qXF0vLAorCQlBVFRSOiAvXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLywKKwkJVEFHOiAvXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLywKKwkJQ0hJTEQ6IC86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XChccyooZXZlbnxvZGR8KD86WytcLV0/XGQrfCg/OlsrXC1dP1xkKik/blxzKig/OlsrXC1dXHMqXGQrKT8pKVxzKlwpKT8vLAorCQlQT1M6IC86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLAorCQlQU0VVRE86IC86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vCisJfSwKKworCWxlZnRNYXRjaDoge30sCisKKwlhdHRyTWFwOiB7CisJCSJjbGFzcyI6ICJjbGFzc05hbWUiLAorCQkiZm9yIjogImh0bWxGb3IiCisJfSwKKworCWF0dHJIYW5kbGU6IHsKKwkJaHJlZjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJocmVmIiApOworCQl9LAorCQl0eXBlOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICk7CisJCX0KKwl9LAorCisJcmVsYXRpdmU6IHsKKwkJIisiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCl7CisJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciLAorCQkJCWlzVGFnID0gaXNQYXJ0U3RyICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICksCisJCQkJaXNQYXJ0U3RyTm90VGFnID0gaXNQYXJ0U3RyICYmICFpc1RhZzsKKworCQkJaWYgKCBpc1RhZyApIHsKKwkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOworCQkJfQorCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CisJCQkJaWYgKCAoZWxlbSA9IGNoZWNrU2V0W2ldKSApIHsKKwkJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW0ucHJldmlvdXNTaWJsaW5nKSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICkge30KKworCQkJCQljaGVja1NldFtpXSA9IGlzUGFydFN0ck5vdFRhZyB8fCBlbGVtICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFydCA/CisJCQkJCQllbGVtIHx8IGZhbHNlIDoKKwkJCQkJCWVsZW0gPT09IHBhcnQ7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIGlzUGFydFN0ck5vdFRhZyApIHsKKwkJCQlTaXp6bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwgdHJ1ZSApOworCQkJfQorCQl9LAorCisJCSI+IjogZnVuY3Rpb24oIGNoZWNrU2V0LCBwYXJ0ICkgeworCQkJdmFyIGVsZW0sCisJCQkJaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciLAorCQkJCWkgPSAwLAorCQkJCWwgPSBjaGVja1NldC5sZW5ndGg7CisKKwkJCWlmICggaXNQYXJ0U3RyICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CisJCQkJcGFydCA9IHBhcnQudG9Mb3dlckNhc2UoKTsKKworCQkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJZWxlbSA9IGNoZWNrU2V0W2ldOworCisJCQkJCWlmICggZWxlbSApIHsKKwkJCQkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJCQkJCQljaGVja1NldFtpXSA9IHBhcmVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJ0ID8gcGFyZW50IDogZmFsc2U7CisJCQkJCX0KKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJZm9yICggOyBpIDwgbDsgaSsrICkgeworCQkJCQllbGVtID0gY2hlY2tTZXRbaV07CisKKwkJCQkJaWYgKCBlbGVtICkgeworCQkJCQkJY2hlY2tTZXRbaV0gPSBpc1BhcnRTdHIgPworCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA6CisJCQkJCQkJZWxlbS5wYXJlbnROb2RlID09PSBwYXJ0OworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCBpc1BhcnRTdHIgKSB7CisJCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CisJCQkJfQorCQkJfQorCQl9LAorCisJCSIiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJdmFyIG5vZGVDaGVjaywKKwkJCQlkb25lTmFtZSA9IGRvbmUrKywKKwkJCQljaGVja0ZuID0gZGlyQ2hlY2s7CisKKwkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CisJCQkJcGFydCA9IHBhcnQudG9Mb3dlckNhc2UoKTsKKwkJCQlub2RlQ2hlY2sgPSBwYXJ0OworCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CisJCQl9CisKKwkJCWNoZWNrRm4oICJwYXJlbnROb2RlIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICk7CisJCX0sCisKKwkJIn4iOiBmdW5jdGlvbiggY2hlY2tTZXQsIHBhcnQsIGlzWE1MICkgeworCQkJdmFyIG5vZGVDaGVjaywKKwkJCQlkb25lTmFtZSA9IGRvbmUrKywKKwkJCQljaGVja0ZuID0gZGlyQ2hlY2s7CisKKwkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CisJCQkJcGFydCA9IHBhcnQudG9Mb3dlckNhc2UoKTsKKwkJCQlub2RlQ2hlY2sgPSBwYXJ0OworCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CisJCQl9CisKKwkJCWNoZWNrRm4oICJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKKwkJfQorCX0sCisKKwlmaW5kOiB7CisJCUlEOiBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICkgeworCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgeworCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZChtYXRjaFsxXSk7CisJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKKwkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCisJCQkJcmV0dXJuIG0gJiYgbS5wYXJlbnROb2RlID8gW21dIDogW107CisJCQl9CisJCX0sCisKKwkJTkFNRTogZnVuY3Rpb24oIG1hdGNoLCBjb250ZXh0ICkgeworCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CisJCQkJdmFyIHJldCA9IFtdLAorCQkJCQlyZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggbWF0Y2hbMV0gKTsKKworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHJlc3VsdHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQlpZiAoIHJlc3VsdHNbaV0uZ2V0QXR0cmlidXRlKCJuYW1lIikgPT09IG1hdGNoWzFdICkgeworCQkJCQkJcmV0LnB1c2goIHJlc3VsdHNbaV0gKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiByZXQubGVuZ3RoID09PSAwID8gbnVsbCA6IHJldDsKKwkJCX0KKwkJfSwKKworCQlUQUc6IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKKwkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgeworCQkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBtYXRjaFsxXSApOworCQkJfQorCQl9CisJfSwKKwlwcmVGaWx0ZXI6IHsKKwkJQ0xBU1M6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgeworCQkJbWF0Y2ggPSAiICIgKyBtYXRjaFsxXS5yZXBsYWNlKCByQmFja3NsYXNoLCAiIiApICsgIiAiOworCisJCQlpZiAoIGlzWE1MICkgeworCQkJCXJldHVybiBtYXRjaDsKKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGN1ckxvb3BbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCQlpZiAoIGVsZW0gKSB7CisJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKKwkJCQkJCWlmICggIWlucGxhY2UgKSB7CisJCQkJCQkJcmVzdWx0LnB1c2goIGVsZW0gKTsKKwkJCQkJCX0KKworCQkJCQl9IGVsc2UgaWYgKCBpbnBsYWNlICkgeworCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gZmFsc2U7CisJCX0sCisKKwkJSUQ6IGZ1bmN0aW9uKCBtYXRjaCApIHsKKwkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKCByQmFja3NsYXNoLCAiIiApOworCQl9LAorCisJCVRBRzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wICkgeworCQkJcmV0dXJuIG1hdGNoWzFdLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICkudG9Mb3dlckNhc2UoKTsKKwkJfSwKKworCQlDSElMRDogZnVuY3Rpb24oIG1hdGNoICkgeworCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm50aCIgKSB7CisJCQkJaWYgKCAhbWF0Y2hbMl0gKSB7CisJCQkJCVNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTsKKwkJCQl9CisKKwkJCQltYXRjaFsyXSA9IG1hdGNoWzJdLnJlcGxhY2UoL15cK3xccyovZywgJycpOworCisJCQkJLy8gcGFyc2UgZXF1YXRpb25zIGxpa2UgJ2V2ZW4nLCAnb2RkJywgJzUnLCAnMm4nLCAnM24rMicsICc0bi0xJywgJy1uKzYnCisJCQkJdmFyIHRlc3QgPSAvKC0/KShcZCopKD86bihbK1wtXT9cZCopKT8vLmV4ZWMoCisJCQkJCW1hdGNoWzJdID09PSAiZXZlbiIgJiYgIjJuIiB8fCBtYXRjaFsyXSA9PT0gIm9kZCIgJiYgIjJuKzEiIHx8CisJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CisKKwkJCQkvLyBjYWxjdWxhdGUgdGhlIG51bWJlcnMgKGZpcnN0KW4rKGxhc3QpIGluY2x1ZGluZyBpZiB0aGV5IGFyZSBuZWdhdGl2ZQorCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOworCQkJCW1hdGNoWzNdID0gdGVzdFszXSAtIDA7CisJCQl9CisJCQllbHNlIGlmICggbWF0Y2hbMl0gKSB7CisJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOworCQkJfQorCisJCQkvLyBUT0RPOiBNb3ZlIHRvIG5vcm1hbCBjYWNoaW5nIHN5c3RlbQorCQkJbWF0Y2hbMF0gPSBkb25lKys7CisKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKworCQlBVFRSOiBmdW5jdGlvbiggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCApIHsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKCByQmFja3NsYXNoLCAiIiApOworCisJCQlpZiAoICFpc1hNTCAmJiBFeHByLmF0dHJNYXBbbmFtZV0gKSB7CisJCQkJbWF0Y2hbMV0gPSBFeHByLmF0dHJNYXBbbmFtZV07CisJCQl9CisKKwkJCS8vIEhhbmRsZSBpZiBhbiB1bi1xdW90ZWQgdmFsdWUgd2FzIHVzZWQKKwkJCW1hdGNoWzRdID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICk7CisKKwkJCWlmICggbWF0Y2hbMl0gPT09ICJ+PSIgKSB7CisJCQkJbWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSArICIgIjsKKwkJCX0KKworCQkJcmV0dXJuIG1hdGNoOworCQl9LAorCisJCVBTRVVETzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCApIHsKKwkJCWlmICggbWF0Y2hbMV0gPT09ICJub3QiICkgeworCQkJCS8vIElmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGNvbXBsZXggZXhwcmVzc2lvbiwgb3IgYSBzaW1wbGUgb25lCisJCQkJaWYgKCAoIGNodW5rZXIuZXhlYyhtYXRjaFszXSkgfHwgIiIgKS5sZW5ndGggPiAxIHx8IC9eXHcvLnRlc3QobWF0Y2hbM10pICkgeworCQkJCQltYXRjaFszXSA9IFNpenpsZShtYXRjaFszXSwgbnVsbCwgbnVsbCwgY3VyTG9vcCk7CisKKwkJCQl9IGVsc2UgeworCQkJCQl2YXIgcmV0ID0gU2l6emxlLmZpbHRlcihtYXRjaFszXSwgY3VyTG9vcCwgaW5wbGFjZSwgdHJ1ZSBeIG5vdCk7CisKKwkJCQkJaWYgKCAhaW5wbGFjZSApIHsKKwkJCQkJCXJlc3VsdC5wdXNoLmFwcGx5KCByZXN1bHQsIHJldCApOworCQkJCQl9CisKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworCQkJfSBlbHNlIGlmICggRXhwci5tYXRjaC5QT1MudGVzdCggbWF0Y2hbMF0gKSB8fCBFeHByLm1hdGNoLkNISUxELnRlc3QoIG1hdGNoWzBdICkgKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKworCQlQT1M6IGZ1bmN0aW9uKCBtYXRjaCApIHsKKwkJCW1hdGNoLnVuc2hpZnQoIHRydWUgKTsKKworCQkJcmV0dXJuIG1hdGNoOworCQl9CisJfSwKKworCWZpbHRlcnM6IHsKKwkJZW5hYmxlZDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgJiYgZWxlbS50eXBlICE9PSAiaGlkZGVuIjsKKwkJfSwKKworCQlkaXNhYmxlZDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsKKwkJfSwKKworCQljaGVja2VkOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtLmNoZWNrZWQgPT09IHRydWU7CisJCX0sCisKKwkJc2VsZWN0ZWQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJLy8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdAorCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQorCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CisJCQkJZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CisJCQl9CisKKwkJCXJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlOworCQl9LAorCisJCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gISFlbGVtLmZpcnN0Q2hpbGQ7CisJCX0sCisKKwkJZW1wdHk6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICFlbGVtLmZpcnN0Q2hpbGQ7CisJCX0sCisKKwkJaGFzOiBmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CisJCQlyZXR1cm4gISFTaXp6bGUoIG1hdGNoWzNdLCBlbGVtICkubGVuZ3RoOworCQl9LAorCisJCWhlYWRlcjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gKC9oXGQvaSkudGVzdCggZWxlbS5ub2RlTmFtZSApOworCQl9LAorCisJCXRleHQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJdmFyIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICksIHR5cGUgPSBlbGVtLnR5cGU7CisJCQkvLyBJRTYgYW5kIDcgd2lsbCBtYXAgZWxlbS50eXBlIHRvICd0ZXh0JyBmb3IgbmV3IEhUTUw1IHR5cGVzIChzZWFyY2gsIGV0YykKKwkJCS8vIHVzZSBnZXRBdHRyaWJ1dGUgaW5zdGVhZCB0byB0ZXN0IHRoaXMgY2FzZQorCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAidGV4dCIgPT09IHR5cGUgJiYgKCBhdHRyID09PSB0eXBlIHx8IGF0dHIgPT09IG51bGwgKTsKKwkJfSwKKworCQlyYWRpbzogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICYmICJyYWRpbyIgPT09IGVsZW0udHlwZTsKKwkJfSwKKworCQljaGVja2JveDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICYmICJjaGVja2JveCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKworCQlmaWxlOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgImZpbGUiID09PSBlbGVtLnR5cGU7CisJCX0sCisKKwkJcGFzc3dvcmQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAicGFzc3dvcmQiID09PSBlbGVtLnR5cGU7CisJCX0sCisKKwkJc3VibWl0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAic3VibWl0IiA9PT0gZWxlbS50eXBlOworCQl9LAorCisJCWltYWdlOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgImltYWdlIiA9PT0gZWxlbS50eXBlOworCQl9LAorCisJCXJlc2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAicmVzZXQiID09PSBlbGVtLnR5cGU7CisJCX0sCisKKwkJYnV0dG9uOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworCQkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgImJ1dHRvbiIgPT09IGVsZW0udHlwZSB8fCBuYW1lID09PSAiYnV0dG9uIjsKKwkJfSwKKworCQlpbnB1dDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gKC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kpLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKKwkJfSwKKworCQlmb2N1czogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbSA9PT0gZWxlbS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CisJCX0KKwl9LAorCXNldEZpbHRlcnM6IHsKKwkJZmlyc3Q6IGZ1bmN0aW9uKCBlbGVtLCBpICkgeworCQkJcmV0dXJuIGkgPT09IDA7CisJCX0sCisKKwkJbGFzdDogZnVuY3Rpb24oIGVsZW0sIGksIG1hdGNoLCBhcnJheSApIHsKKwkJCXJldHVybiBpID09PSBhcnJheS5sZW5ndGggLSAxOworCQl9LAorCisJCWV2ZW46IGZ1bmN0aW9uKCBlbGVtLCBpICkgeworCQkJcmV0dXJuIGkgJSAyID09PSAwOworCQl9LAorCisJCW9kZDogZnVuY3Rpb24oIGVsZW0sIGkgKSB7CisJCQlyZXR1cm4gaSAlIDIgPT09IDE7CisJCX0sCisKKwkJbHQ6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKKwkJCXJldHVybiBpIDwgbWF0Y2hbM10gLSAwOworCQl9LAorCisJCWd0OiBmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CisJCQlyZXR1cm4gaSA+IG1hdGNoWzNdIC0gMDsKKwkJfSwKKworCQludGg6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKKwkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7CisJCX0sCisKKwkJZXE6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKKwkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7CisJCX0KKwl9LAorCWZpbHRlcjogeworCQlQU0VVRE86IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCwgaSwgYXJyYXkgKSB7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLAorCQkJCWZpbHRlciA9IEV4cHIuZmlsdGVyc1sgbmFtZSBdOworCisJCQlpZiAoIGZpbHRlciApIHsKKwkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKTsKKworCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKKwkJCQlyZXR1cm4gKGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dChbIGVsZW0gXSkgfHwgIiIpLmluZGV4T2YobWF0Y2hbM10pID49IDA7CisKKwkJCX0gZWxzZSBpZiAoIG5hbWUgPT09ICJub3QiICkgeworCQkJCXZhciBub3QgPSBtYXRjaFszXTsKKworCQkJCWZvciAoIHZhciBqID0gMCwgbCA9IG5vdC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CisJCQkJCWlmICggbm90W2pdID09PSBlbGVtICkgeworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuIHRydWU7CisKKwkJCX0gZWxzZSB7CisJCQkJU2l6emxlLmVycm9yKCBuYW1lICk7CisJCQl9CisJCX0sCisKKwkJQ0hJTEQ6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKKwkJCXZhciBmaXJzdCwgbGFzdCwKKwkJCQlkb25lTmFtZSwgcGFyZW50LCBjYWNoZSwKKwkJCQljb3VudCwgZGlmZiwKKwkJCQl0eXBlID0gbWF0Y2hbMV0sCisJCQkJbm9kZSA9IGVsZW07CisKKwkJCXN3aXRjaCAoIHR5cGUgKSB7CisJCQkJY2FzZSAib25seSI6CisJCQkJY2FzZSAiZmlyc3QiOgorCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICkgeworCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgeworCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmICggdHlwZSA9PT0gImZpcnN0IiApIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisKKwkJCQkJbm9kZSA9IGVsZW07CisKKwkJCQkJLyogZmFsbHMgdGhyb3VnaCAqLworCQkJCWNhc2UgImxhc3QiOgorCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5uZXh0U2libGluZykgKSB7CisJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcmV0dXJuIHRydWU7CisKKwkJCQljYXNlICJudGgiOgorCQkJCQlmaXJzdCA9IG1hdGNoWzJdOworCQkJCQlsYXN0ID0gbWF0Y2hbM107CisKKwkJCQkJaWYgKCBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwICkgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKworCQkJCQlkb25lTmFtZSA9IG1hdGNoWzBdOworCQkJCQlwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisKKwkJCQkJaWYgKCBwYXJlbnQgJiYgKHBhcmVudFsgZXhwYW5kbyBdICE9PSBkb25lTmFtZSB8fCAhZWxlbS5ub2RlSW5kZXgpICkgeworCQkJCQkJY291bnQgPSAwOworCisJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgeworCQkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCQkJbm9kZS5ub2RlSW5kZXggPSArK2NvdW50OworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJcGFyZW50WyBleHBhbmRvIF0gPSBkb25lTmFtZTsKKwkJCQkJfQorCisJCQkJCWRpZmYgPSBlbGVtLm5vZGVJbmRleCAtIGxhc3Q7CisKKwkJCQkJaWYgKCBmaXJzdCA9PT0gMCApIHsKKwkJCQkJCXJldHVybiBkaWZmID09PSAwOworCisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTsKKwkJCQkJfQorCQkJfQorCQl9LAorCisJCUlEOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CisJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gbWF0Y2g7CisJCX0sCisKKwkJVEFHOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CisJCQlyZXR1cm4gKG1hdGNoID09PSAiKiIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSkgfHwgISFlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbWF0Y2g7CisJCX0sCisKKwkJQ0xBU1M6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKKwkJCXJldHVybiAoIiAiICsgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSArICIgIikKKwkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOworCQl9LAorCisJCUFUVFI6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMV0sCisJCQkJcmVzdWx0ID0gU2l6emxlLmF0dHIgPworCQkJCQlTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApIDoKKwkJCQkJRXhwci5hdHRySGFuZGxlWyBuYW1lIF0gPworCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKKwkJCQkJZWxlbVsgbmFtZSBdICE9IG51bGwgPworCQkJCQkJZWxlbVsgbmFtZSBdIDoKKwkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCisJCQkJdmFsdWUgPSByZXN1bHQgKyAiIiwKKwkJCQl0eXBlID0gbWF0Y2hbMl0sCisJCQkJY2hlY2sgPSBtYXRjaFs0XTsKKworCQkJcmV0dXJuIHJlc3VsdCA9PSBudWxsID8KKwkJCQl0eXBlID09PSAiIT0iIDoKKwkJCQkhdHlwZSAmJiBTaXp6bGUuYXR0ciA/CisJCQkJcmVzdWx0ICE9IG51bGwgOgorCQkJCXR5cGUgPT09ICI9IiA/CisJCQkJdmFsdWUgPT09IGNoZWNrIDoKKwkJCQl0eXBlID09PSAiKj0iID8KKwkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKKwkJCQl0eXBlID09PSAifj0iID8KKwkJCQkoIiAiICsgdmFsdWUgKyAiICIpLmluZGV4T2YoY2hlY2spID49IDAgOgorCQkJCSFjaGVjayA/CisJCQkJdmFsdWUgJiYgcmVzdWx0ICE9PSBmYWxzZSA6CisJCQkJdHlwZSA9PT0gIiE9IiA/CisJCQkJdmFsdWUgIT09IGNoZWNrIDoKKwkJCQl0eXBlID09PSAiXj0iID8KKwkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA9PT0gMCA6CisJCQkJdHlwZSA9PT0gIiQ9IiA/CisJCQkJdmFsdWUuc3Vic3RyKHZhbHVlLmxlbmd0aCAtIGNoZWNrLmxlbmd0aCkgPT09IGNoZWNrIDoKKwkJCQl0eXBlID09PSAifD0iID8KKwkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CisJCQkJZmFsc2U7CisJCX0sCisKKwkJUE9TOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2gsIGksIGFycmF5ICkgeworCQkJdmFyIG5hbWUgPSBtYXRjaFsyXSwKKwkJCQlmaWx0ZXIgPSBFeHByLnNldEZpbHRlcnNbIG5hbWUgXTsKKworCQkJaWYgKCBmaWx0ZXIgKSB7CisJCQkJcmV0dXJuIGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CisJCQl9CisJCX0KKwl9Cit9OworCit2YXIgb3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TLAorCWZlc2NhcGUgPSBmdW5jdGlvbihhbGwsIG51bSl7CisJCXJldHVybiAiXFwiICsgKG51bSAtIDAgKyAxKTsKKwl9OworCitmb3IgKCB2YXIgdHlwZSBpbiBFeHByLm1hdGNoICkgeworCUV4cHIubWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAoLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSApOworCUV4cHIubGVmdE1hdGNoWyB0eXBlIF0gPSBuZXcgUmVnRXhwKCAvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlICsgRXhwci5tYXRjaFsgdHlwZSBdLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2csIGZlc2NhcGUpICk7Cit9CisvLyBFeHBvc2Ugb3JpZ1BPUworLy8gImdsb2JhbCIgYXMgaW4gcmVnYXJkbGVzcyBvZiByZWxhdGlvbiB0byBicmFja2V0cy9wYXJlbnMKK0V4cHIubWF0Y2guZ2xvYmFsUE9TID0gb3JpZ1BPUzsKKwordmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKKwlhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSwgMCApOworCisJaWYgKCByZXN1bHRzICkgeworCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7CisJCXJldHVybiByZXN1bHRzOworCX0KKworCXJldHVybiBhcnJheTsKK307CisKKy8vIFBlcmZvcm0gYSBzaW1wbGUgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93c2VyIGlzIGNhcGFibGUgb2YKKy8vIGNvbnZlcnRpbmcgYSBOb2RlTGlzdCB0byBhbiBhcnJheSB1c2luZyBidWlsdGluIG1ldGhvZHMuCisvLyBBbHNvIHZlcmlmaWVzIHRoYXQgdGhlIHJldHVybmVkIGFycmF5IGhvbGRzIERPTSBub2RlcworLy8gKHdoaWNoIGlzIG5vdCB0aGUgY2FzZSBpbiB0aGUgQmxhY2tiZXJyeSBicm93c2VyKQordHJ5IHsKKwlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsIDAgKVswXS5ub2RlVHlwZTsKKworLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCit9IGNhdGNoKCBlICkgeworCW1ha2VBcnJheSA9IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKKwkJdmFyIGkgPSAwLAorCQkJcmV0ID0gcmVzdWx0cyB8fCBbXTsKKworCQlpZiAoIHRvU3RyaW5nLmNhbGwoYXJyYXkpID09PSAiW29iamVjdCBBcnJheV0iICkgeworCQkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIHJldCwgYXJyYXkgKTsKKworCQl9IGVsc2UgeworCQkJaWYgKCB0eXBlb2YgYXJyYXkubGVuZ3RoID09PSAibnVtYmVyIiApIHsKKwkJCQlmb3IgKCB2YXIgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCWZvciAoIDsgYXJyYXlbaV07IGkrKyApIHsKKwkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9OworfQorCit2YXIgc29ydE9yZGVyLCBzaWJsaW5nQ2hlY2s7CisKK2lmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICkgeworCXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkgeworCQlpZiAoIGEgPT09IGIgKSB7CisJCQloYXNEdXBsaWNhdGUgPSB0cnVlOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHx8ICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICkgeworCQkJcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPyAtMSA6IDE7CisJCX0KKworCQlyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IDE7CisJfTsKKworfSBlbHNlIHsKKwlzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKKwkJLy8gVGhlIG5vZGVzIGFyZSBpZGVudGljYWwsIHdlIGNhbiBleGl0IGVhcmx5CisJCWlmICggYSA9PT0gYiApIHsKKwkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CisJCQlyZXR1cm4gMDsKKworCQkvLyBGYWxsYmFjayB0byB1c2luZyBzb3VyY2VJbmRleCAoaW4gSUUpIGlmIGl0J3MgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMKKwkJfSBlbHNlIGlmICggYS5zb3VyY2VJbmRleCAmJiBiLnNvdXJjZUluZGV4ICkgeworCQkJcmV0dXJuIGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4OworCQl9CisKKwkJdmFyIGFsLCBibCwKKwkJCWFwID0gW10sCisJCQlicCA9IFtdLAorCQkJYXVwID0gYS5wYXJlbnROb2RlLAorCQkJYnVwID0gYi5wYXJlbnROb2RlLAorCQkJY3VyID0gYXVwOworCisJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MgKG9yIGlkZW50aWNhbCkgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKKwkJaWYgKCBhdXAgPT09IGJ1cCApIHsKKwkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKKworCQkvLyBJZiBubyBwYXJlbnRzIHdlcmUgZm91bmQgdGhlbiB0aGUgbm9kZXMgYXJlIGRpc2Nvbm5lY3RlZAorCQl9IGVsc2UgaWYgKCAhYXVwICkgeworCQkJcmV0dXJuIC0xOworCisJCX0gZWxzZSBpZiAoICFidXAgKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8vIE90aGVyd2lzZSB0aGV5J3JlIHNvbWV3aGVyZSBlbHNlIGluIHRoZSB0cmVlIHNvIHdlIG5lZWQKKwkJLy8gdG8gYnVpbGQgdXAgYSBmdWxsIGxpc3Qgb2YgdGhlIHBhcmVudE5vZGVzIGZvciBjb21wYXJpc29uCisJCXdoaWxlICggY3VyICkgeworCQkJYXAudW5zaGlmdCggY3VyICk7CisJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKKwkJfQorCisJCWN1ciA9IGJ1cDsKKworCQl3aGlsZSAoIGN1ciApIHsKKwkJCWJwLnVuc2hpZnQoIGN1ciApOworCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CisJCX0KKworCQlhbCA9IGFwLmxlbmd0aDsKKwkJYmwgPSBicC5sZW5ndGg7CisKKwkJLy8gU3RhcnQgd2Fsa2luZyBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3kKKwkJZm9yICggdmFyIGkgPSAwOyBpIDwgYWwgJiYgaSA8IGJsOyBpKysgKSB7CisJCQlpZiAoIGFwW2ldICE9PSBicFtpXSApIHsKKwkJCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhcFtpXSwgYnBbaV0gKTsKKwkJCX0KKwkJfQorCisJCS8vIFdlIGVuZGVkIHNvbWVwbGFjZSB1cCB0aGUgdHJlZSBzbyBkbyBhIHNpYmxpbmcgY2hlY2sKKwkJcmV0dXJuIGkgPT09IGFsID8KKwkJCXNpYmxpbmdDaGVjayggYSwgYnBbaV0sIC0xICkgOgorCQkJc2libGluZ0NoZWNrKCBhcFtpXSwgYiwgMSApOworCX07CisKKwlzaWJsaW5nQ2hlY2sgPSBmdW5jdGlvbiggYSwgYiwgcmV0ICkgeworCQlpZiAoIGEgPT09IGIgKSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJdmFyIGN1ciA9IGEubmV4dFNpYmxpbmc7CisKKwkJd2hpbGUgKCBjdXIgKSB7CisJCQlpZiAoIGN1ciA9PT0gYiApIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCWN1ciA9IGN1ci5uZXh0U2libGluZzsKKwkJfQorCisJCXJldHVybiAxOworCX07Cit9CisKKy8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbgorLy8gcXVlcnlpbmcgYnkgZ2V0RWxlbWVudEJ5SWQgKGFuZCBwcm92aWRlIGEgd29ya2Fyb3VuZCkKKyhmdW5jdGlvbigpeworCS8vIFdlJ3JlIGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUKKwl2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAorCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKSwKKwkJcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKworCWZvcm0uaW5uZXJIVE1MID0gIjxhIG5hbWU9JyIgKyBpZCArICInLz4iOworCisJLy8gSW5qZWN0IGl0IGludG8gdGhlIHJvb3QgZWxlbWVudCwgY2hlY2sgaXRzIHN0YXR1cywgYW5kIHJlbW92ZSBpdCBxdWlja2x5CisJcm9vdC5pbnNlcnRCZWZvcmUoIGZvcm0sIHJvb3QuZmlyc3RDaGlsZCApOworCisJLy8gVGhlIHdvcmthcm91bmQgaGFzIHRvIGRvIGFkZGl0aW9uYWwgY2hlY2tzIGFmdGVyIGEgZ2V0RWxlbWVudEJ5SWQKKwkvLyBXaGljaCBzbG93cyB0aGluZ3MgZG93biBmb3Igb3RoZXIgYnJvd3NlcnMgKGhlbmNlIHRoZSBicmFuY2hpbmcpCisJaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKKwkJRXhwci5maW5kLklEID0gZnVuY3Rpb24oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApIHsKKwkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKKwkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOworCisJCQkJcmV0dXJuIG0gPworCQkJCQltLmlkID09PSBtYXRjaFsxXSB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlID09PSBtYXRjaFsxXSA/CisJCQkJCQlbbV0gOgorCQkJCQkJdW5kZWZpbmVkIDoKKwkJCQkJW107CisJCQl9CisJCX07CisKKwkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CisJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKKworCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgbm9kZSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gbWF0Y2g7CisJCX07CisJfQorCisJcm9vdC5yZW1vdmVDaGlsZCggZm9ybSApOworCisJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKKwlyb290ID0gZm9ybSA9IG51bGw7Cit9KSgpOworCisoZnVuY3Rpb24oKXsKKwkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBvbmx5IGVsZW1lbnRzCisJLy8gd2hlbiBkb2luZyBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpCisKKwkvLyBDcmVhdGUgYSBmYWtlIGVsZW1lbnQKKwl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOworCisJLy8gTWFrZSBzdXJlIG5vIGNvbW1lbnRzIGFyZSBmb3VuZAorCWlmICggZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoID4gMCApIHsKKwkJRXhwci5maW5kLlRBRyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKKwkJCXZhciByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggbWF0Y2hbMV0gKTsKKworCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cworCQkJaWYgKCBtYXRjaFsxXSA9PT0gIioiICkgeworCQkJCXZhciB0bXAgPSBbXTsKKworCQkJCWZvciAoIHZhciBpID0gMDsgcmVzdWx0c1tpXTsgaSsrICkgeworCQkJCQlpZiAoIHJlc3VsdHNbaV0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmVzdWx0cyA9IHRtcDsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdHM7CisJCX07CisJfQorCisJLy8gQ2hlY2sgdG8gc2VlIGlmIGFuIGF0dHJpYnV0ZSByZXR1cm5zIG5vcm1hbGl6ZWQgaHJlZiBhdHRyaWJ1dGVzCisJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKKworCWlmICggZGl2LmZpcnN0Q2hpbGQgJiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYKKwkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpICE9PSAiIyIgKSB7CisKKwkJRXhwci5hdHRySGFuZGxlLmhyZWYgPSBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiLCAyICk7CisJCX07CisJfQorCisJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKKwlkaXYgPSBudWxsOworfSkoKTsKKworaWYgKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkgeworCShmdW5jdGlvbigpeworCQl2YXIgb2xkU2l6emxlID0gU2l6emxlLAorCQkJZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCisJCQlpZCA9ICJfX3NpenpsZV9fIjsKKworCQlkaXYuaW5uZXJIVE1MID0gIjxwIGNsYXNzPSdURVNUJz48L3A+IjsKKworCQkvLyBTYWZhcmkgY2FuJ3QgaGFuZGxlIHVwcGVyY2FzZSBvciB1bmljb2RlIGNoYXJhY3RlcnMgd2hlbgorCQkvLyBpbiBxdWlya3MgbW9kZS4KKwkJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlTaXp6bGUgPSBmdW5jdGlvbiggcXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkICkgeworCQkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisKKwkJCS8vIE9ubHkgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgb24gbm9uLVhNTCBkb2N1bWVudHMKKwkJCS8vIChJRCBzZWxlY3RvcnMgZG9uJ3Qgd29yayBpbiBub24tSFRNTCBkb2N1bWVudHMpCisJCQlpZiAoICFzZWVkICYmICFTaXp6bGUuaXNYTUwoY29udGV4dCkgKSB7CisJCQkJLy8gU2VlIGlmIHdlIGZpbmQgYSBzZWxlY3RvciB0byBzcGVlZCB1cAorCQkJCXZhciBtYXRjaCA9IC9eKFx3KyQpfF5cLihbXHdcLV0rJCl8XiMoW1x3XC1dKyQpLy5leGVjKCBxdWVyeSApOworCisJCQkJaWYgKCBtYXRjaCAmJiAoY29udGV4dC5ub2RlVHlwZSA9PT0gMSB8fCBjb250ZXh0Lm5vZGVUeXBlID09PSA5KSApIHsKKwkJCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiVEFHIikKKwkJCQkJaWYgKCBtYXRjaFsxXSApIHsKKwkJCQkJCXJldHVybiBtYWtlQXJyYXkoIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHF1ZXJ5ICksIGV4dHJhICk7CisKKwkJCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiLkNMQVNTIikKKwkJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gJiYgRXhwci5maW5kLkNMQVNTICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHsKKwkJCQkJCXJldHVybiBtYWtlQXJyYXkoIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbWF0Y2hbMl0gKSwgZXh0cmEgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICggY29udGV4dC5ub2RlVHlwZSA9PT0gOSApIHsKKwkJCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiYm9keSIpCisJCQkJCS8vIFRoZSBib2R5IGVsZW1lbnQgb25seSBleGlzdHMgb25jZSwgb3B0aW1pemUgZmluZGluZyBpdAorCQkJCQlpZiAoIHF1ZXJ5ID09PSAiYm9keSIgJiYgY29udGV4dC5ib2R5ICkgeworCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggWyBjb250ZXh0LmJvZHkgXSwgZXh0cmEgKTsKKworCQkJCQkvLyBTcGVlZC11cDogU2l6emxlKCIjSUQiKQorCQkJCQl9IGVsc2UgaWYgKCBtYXRjaCAmJiBtYXRjaFszXSApIHsKKwkJCQkJCXZhciBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbM10gKTsKKworCQkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKKwkJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKKwkJCQkJCWlmICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7CisJCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKKwkJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKKwkJCQkJCQlpZiAoIGVsZW0uaWQgPT09IG1hdGNoWzNdICkgeworCQkJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBbIGVsZW0gXSwgZXh0cmEgKTsKKwkJCQkJCQl9CisKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggW10sIGV4dHJhICk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQl0cnkgeworCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsKKwkJCQkJfSBjYXRjaChxc2FFcnJvcikge30KKworCQkJCS8vIHFTQSB3b3JrcyBzdHJhbmdlbHkgb24gRWxlbWVudC1yb290ZWQgcXVlcmllcworCQkJCS8vIFdlIGNhbiB3b3JrIGFyb3VuZCB0aGlzIGJ5IHNwZWNpZnlpbmcgYW4gZXh0cmEgSUQgb24gdGhlIHJvb3QKKwkJCQkvLyBhbmQgd29ya2luZyB1cCBmcm9tIHRoZXJlIChUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhlIHRlY2huaXF1ZSkKKwkJCQkvLyBJRSA4IGRvZXNuJ3Qgd29yayBvbiBvYmplY3QgZWxlbWVudHMKKwkJCQl9IGVsc2UgaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSAxICYmIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CisJCQkJCXZhciBvbGRDb250ZXh0ID0gY29udGV4dCwKKwkJCQkJCW9sZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCAiaWQiICksCisJCQkJCQluaWQgPSBvbGQgfHwgaWQsCisJCQkJCQloYXNQYXJlbnQgPSBjb250ZXh0LnBhcmVudE5vZGUsCisJCQkJCQlyZWxhdGl2ZUhpZXJhcmNoeVNlbGVjdG9yID0gL15ccypbK35dLy50ZXN0KCBxdWVyeSApOworCisJCQkJCWlmICggIW9sZCApIHsKKwkJCQkJCWNvbnRleHQuc2V0QXR0cmlidXRlKCAiaWQiLCBuaWQgKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW5pZCA9IG5pZC5yZXBsYWNlKCAvJy9nLCAiXFwkJiIgKTsKKwkJCQkJfQorCQkJCQlpZiAoIHJlbGF0aXZlSGllcmFyY2h5U2VsZWN0b3IgJiYgaGFzUGFyZW50ICkgeworCQkJCQkJY29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZTsKKwkJCQkJfQorCisJCQkJCXRyeSB7CisJCQkJCQlpZiAoICFyZWxhdGl2ZUhpZXJhcmNoeVNlbGVjdG9yIHx8IGhhc1BhcmVudCApIHsKKwkJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoICJbaWQ9JyIgKyBuaWQgKyAiJ10gIiArIHF1ZXJ5ICksIGV4dHJhICk7CisJCQkJCQl9CisKKwkJCQkJfSBjYXRjaChwc2V1ZG9FcnJvcikgeworCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJaWYgKCAhb2xkICkgeworCQkJCQkJCW9sZENvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBvbGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKTsKKwkJfTsKKworCQlmb3IgKCB2YXIgcHJvcCBpbiBvbGRTaXp6bGUgKSB7CisJCQlTaXp6bGVbIHByb3AgXSA9IG9sZFNpenpsZVsgcHJvcCBdOworCQl9CisKKwkJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKKwkJZGl2ID0gbnVsbDsKKwl9KSgpOworfQorCisoZnVuY3Rpb24oKXsKKwl2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKKwkJbWF0Y2hlcyA9IGh0bWwubWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubXNNYXRjaGVzU2VsZWN0b3I7CisKKwlpZiAoIG1hdGNoZXMgKSB7CisJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgorCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5IGZhaWxzIHRoaXMpCisJCXZhciBkaXNjb25uZWN0ZWRNYXRjaCA9ICFtYXRjaGVzLmNhbGwoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICksICJkaXYiICksCisJCQlwc2V1ZG9Xb3JrcyA9IGZhbHNlOworCisJCXRyeSB7CisJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCisJCQkvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkCisJCQltYXRjaGVzLmNhbGwoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgIlt0ZXN0IT0nJ106c2l6emxlIiApOworCisJCX0gY2F0Y2goIHBzZXVkb0Vycm9yICkgeworCQkJcHNldWRvV29ya3MgPSB0cnVlOworCQl9CisKKwkJU2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBub2RlLCBleHByICkgeworCQkJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCisJCQlleHByID0gZXhwci5yZXBsYWNlKC9cPVxzKihbXiciXF1dKilccypcXS9nLCAiPSckMSddIik7CisKKwkJCWlmICggIVNpenpsZS5pc1hNTCggbm9kZSApICkgeworCQkJCXRyeSB7CisJCQkJCWlmICggcHNldWRvV29ya3MgfHwgIUV4cHIubWF0Y2guUFNFVURPLnRlc3QoIGV4cHIgKSAmJiAhLyE9Ly50ZXN0KCBleHByICkgKSB7CisJCQkJCQl2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBub2RlLCBleHByICk7CisKKwkJCQkJCS8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKKwkJCQkJCWlmICggcmV0IHx8ICFkaXNjb25uZWN0ZWRNYXRjaCB8fAorCQkJCQkJCQkvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudAorCQkJCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5LCBzbyBjaGVjayBmb3IgdGhhdAorCQkJCQkJCQlub2RlLmRvY3VtZW50ICYmIG5vZGUuZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkgeworCQkJCQkJCXJldHVybiByZXQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGNhdGNoKGUpIHt9CisJCQl9CisKKwkJCXJldHVybiBTaXp6bGUoZXhwciwgbnVsbCwgbnVsbCwgW25vZGVdKS5sZW5ndGggPiAwOworCQl9OworCX0KK30pKCk7CisKKyhmdW5jdGlvbigpeworCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKworCWRpdi5pbm5lckhUTUwgPSAiPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iOworCisJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKKwkvLyBBbHNvLCBtYWtlIHN1cmUgdGhhdCBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIGFjdHVhbGx5IGV4aXN0cworCWlmICggIWRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIHx8IGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAwICkgeworCQlyZXR1cm47CisJfQorCisJLy8gU2FmYXJpIGNhY2hlcyBjbGFzcyBhdHRyaWJ1dGVzLCBkb2Vzbid0IGNhdGNoIGNoYW5nZXMgKGluIDMuMikKKwlkaXYubGFzdENoaWxkLmNsYXNzTmFtZSA9ICJlIjsKKworCWlmICggZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDEgKSB7CisJCXJldHVybjsKKwl9CisKKwlFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1MiKTsKKwlFeHByLmZpbmQuQ0xBU1MgPSBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICkgeworCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKKwkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobWF0Y2hbMV0pOworCQl9CisJfTsKKworCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCisJZGl2ID0gbnVsbDsKK30pKCk7CisKK2Z1bmN0aW9uIGRpck5vZGVDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKKwlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CisKKwkJaWYgKCBlbGVtICkgeworCQkJdmFyIG1hdGNoID0gZmFsc2U7CisKKwkJCWVsZW0gPSBlbGVtW2Rpcl07CisKKwkJCXdoaWxlICggZWxlbSApIHsKKwkJCQlpZiAoIGVsZW1bIGV4cGFuZG8gXSA9PT0gZG9uZU5hbWUgKSB7CisJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWlzWE1MICl7CisJCQkJCWVsZW1bIGV4cGFuZG8gXSA9IGRvbmVOYW1lOworCQkJCQllbGVtLnNpenNldCA9IGk7CisJCQkJfQorCisJCQkJaWYgKCBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGN1ciApIHsKKwkJCQkJbWF0Y2ggPSBlbGVtOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQllbGVtID0gZWxlbVtkaXJdOworCQkJfQorCisJCQljaGVja1NldFtpXSA9IG1hdGNoOworCQl9CisJfQorfQorCitmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKKwlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CisKKwkJaWYgKCBlbGVtICkgeworCQkJdmFyIG1hdGNoID0gZmFsc2U7CisKKwkJCWVsZW0gPSBlbGVtW2Rpcl07CisKKwkJCXdoaWxlICggZWxlbSApIHsKKwkJCQlpZiAoIGVsZW1bIGV4cGFuZG8gXSA9PT0gZG9uZU5hbWUgKSB7CisJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCWlmICggIWlzWE1MICkgeworCQkJCQkJZWxlbVsgZXhwYW5kbyBdID0gZG9uZU5hbWU7CisJCQkJCQllbGVtLnNpenNldCA9IGk7CisJCQkJCX0KKworCQkJCQlpZiAoIHR5cGVvZiBjdXIgIT09ICJzdHJpbmciICkgeworCQkJCQkJaWYgKCBlbGVtID09PSBjdXIgKSB7CisJCQkJCQkJbWF0Y2ggPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCX0gZWxzZSBpZiAoIFNpenpsZS5maWx0ZXIoIGN1ciwgW2VsZW1dICkubGVuZ3RoID4gMCApIHsKKwkJCQkJCW1hdGNoID0gZWxlbTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJZWxlbSA9IGVsZW1bZGlyXTsKKwkJCX0KKworCQkJY2hlY2tTZXRbaV0gPSBtYXRjaDsKKwkJfQorCX0KK30KKworaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMgKSB7CisJU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGEsIGIgKSB7CisJCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5jb250YWlucyhiKSA6IHRydWUpOworCX07CisKK30gZWxzZSBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApIHsKKwlTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKKwkJcmV0dXJuICEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiAxNik7CisJfTsKKworfSBlbHNlIHsKKwlTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX07Cit9CisKK1NpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkgeworCS8vIGRvY3VtZW50RWxlbWVudCBpcyB2ZXJpZmllZCBmb3IgY2FzZXMgd2hlcmUgaXQgZG9lc24ndCB5ZXQgZXhpc3QKKwkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKKwl2YXIgZG9jdW1lbnRFbGVtZW50ID0gKGVsZW0gPyBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSA6IDApLmRvY3VtZW50RWxlbWVudDsKKworCXJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09ICJIVE1MIiA6IGZhbHNlOworfTsKKwordmFyIHBvc1Byb2Nlc3MgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHNlZWQgKSB7CisJdmFyIG1hdGNoLAorCQl0bXBTZXQgPSBbXSwKKwkJbGF0ZXIgPSAiIiwKKwkJcm9vdCA9IGNvbnRleHQubm9kZVR5cGUgPyBbY29udGV4dF0gOiBjb250ZXh0OworCisJLy8gUG9zaXRpb24gc2VsZWN0b3JzIG11c3QgYmUgZG9uZSBhZnRlciB0aGUgZmlsdGVyCisJLy8gQW5kIHNvIG11c3QgOm5vdChwb3NpdGlvbmFsKSBzbyB3ZSBtb3ZlIGFsbCBQU0VVRE9zIHRvIHRoZSBlbmQKKwl3aGlsZSAoIChtYXRjaCA9IEV4cHIubWF0Y2guUFNFVURPLmV4ZWMoIHNlbGVjdG9yICkpICkgeworCQlsYXRlciArPSBtYXRjaFswXTsKKwkJc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKCBFeHByLm1hdGNoLlBTRVVETywgIiIgKTsKKwl9CisKKwlzZWxlY3RvciA9IEV4cHIucmVsYXRpdmVbc2VsZWN0b3JdID8gc2VsZWN0b3IgKyAiKiIgOiBzZWxlY3RvcjsKKworCWZvciAoIHZhciBpID0gMCwgbCA9IHJvb3QubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQlTaXp6bGUoIHNlbGVjdG9yLCByb290W2ldLCB0bXBTZXQsIHNlZWQgKTsKKwl9CisKKwlyZXR1cm4gU2l6emxlLmZpbHRlciggbGF0ZXIsIHRtcFNldCApOworfTsKKworLy8gRVhQT1NFCisvLyBPdmVycmlkZSBzaXp6bGUgYXR0cmlidXRlIHJldHJpZXZhbAorU2l6emxlLmF0dHIgPSBqUXVlcnkuYXR0cjsKK1NpenpsZS5zZWxlY3RvcnMuYXR0ck1hcCA9IHt9OworalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CitqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CitqUXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIuZmlsdGVyczsKK2pRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDsKK2pRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CitqUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7CitqUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7CisKKworfSkoKTsKKworCit2YXIgcnVudGlsID0gL1VudGlsJC8sCisJcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sCisJLy8gTm90ZTogVGhpcyBSZWdFeHAgc2hvdWxkIGJlIGltcHJvdmVkLCBvciBsaWtlbHkgcHVsbGVkIGZyb20gU2l6emxlCisJcm11bHRpc2VsZWN0b3IgPSAvLC8sCisJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvLAorCXNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAorCVBPUyA9IGpRdWVyeS5leHByLm1hdGNoLmdsb2JhbFBPUywKKwkvLyBtZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldAorCWd1YXJhbnRlZWRVbmlxdWUgPSB7CisJCWNoaWxkcmVuOiB0cnVlLAorCQljb250ZW50czogdHJ1ZSwKKwkJbmV4dDogdHJ1ZSwKKwkJcHJldjogdHJ1ZQorCX07CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJdmFyIHNlbGYgPSB0aGlzLAorCQkJaSwgbDsKKworCQlpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gInN0cmluZyIgKSB7CisJCQlyZXR1cm4galF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCQlmb3IgKCBpID0gMCwgbCA9IHNlbGYubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQl9CisKKwkJdmFyIHJldCA9IHRoaXMucHVzaFN0YWNrKCAiIiwgImZpbmQiLCBzZWxlY3RvciApLAorCQkJbGVuZ3RoLCBuLCByOworCisJCWZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQlsZW5ndGggPSByZXQubGVuZ3RoOworCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCB0aGlzW2ldLCByZXQgKTsKKworCQkJaWYgKCBpID4gMCApIHsKKwkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVzdWx0cyBhcmUgdW5pcXVlCisJCQkJZm9yICggbiA9IGxlbmd0aDsgbiA8IHJldC5sZW5ndGg7IG4rKyApIHsKKwkJCQkJZm9yICggciA9IDA7IHIgPCBsZW5ndGg7IHIrKyApIHsKKwkJCQkJCWlmICggcmV0W3JdID09PSByZXRbbl0gKSB7CisJCQkJCQkJcmV0LnNwbGljZShuLS0sIDEpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJaGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkgeworCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0ICk7CisJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCWlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfSk7CisJfSwKKworCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciwgZmFsc2UpLCAibm90Iiwgc2VsZWN0b3IpOworCX0sCisKKwlmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IsIHRydWUpLCAiZmlsdGVyIiwgc2VsZWN0b3IgKTsKKwl9LAorCisJaXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuICEhc2VsZWN0b3IgJiYgKAorCQkJdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiA/CisJCQkJLy8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldAorCQkJCS8vIHNvICQoInA6Zmlyc3QiKS5pcygicDpsYXN0Iikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvICJwIi4KKwkJCQlQT1MudGVzdCggc2VsZWN0b3IgKSA/CisJCQkJCWpRdWVyeSggc2VsZWN0b3IsIHRoaXMuY29udGV4dCApLmluZGV4KCB0aGlzWzBdICkgPj0gMCA6CisJCQkJCWpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkubGVuZ3RoID4gMCA6CisJCQkJdGhpcy5maWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCApOworCX0sCisKKwljbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkgeworCQl2YXIgcmV0ID0gW10sIGksIGwsIGN1ciA9IHRoaXNbMF07CisKKwkJLy8gQXJyYXkgKGRlcHJlY2F0ZWQgYXMgb2YgalF1ZXJ5IDEuNykKKwkJaWYgKCBqUXVlcnkuaXNBcnJheSggc2VsZWN0b3JzICkgKSB7CisJCQl2YXIgbGV2ZWwgPSAxOworCisJCQl3aGlsZSAoIGN1ciAmJiBjdXIub3duZXJEb2N1bWVudCAmJiBjdXIgIT09IGNvbnRleHQgKSB7CisJCQkJZm9yICggaSA9IDA7IGkgPCBzZWxlY3RvcnMubGVuZ3RoOyBpKysgKSB7CisKKwkJCQkJaWYgKCBqUXVlcnkoIGN1ciApLmlzKCBzZWxlY3RvcnNbIGkgXSApICkgeworCQkJCQkJcmV0LnB1c2goeyBzZWxlY3Rvcjogc2VsZWN0b3JzWyBpIF0sIGVsZW06IGN1ciwgbGV2ZWw6IGxldmVsIH0pOworCQkJCQl9CisJCQkJfQorCisJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CisJCQkJbGV2ZWwrKzsKKwkJCX0KKworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8vIFN0cmluZworCQl2YXIgcG9zID0gUE9TLnRlc3QoIHNlbGVjdG9ycyApIHx8IHR5cGVvZiBzZWxlY3RvcnMgIT09ICJzdHJpbmciID8KKwkJCQlqUXVlcnkoIHNlbGVjdG9ycywgY29udGV4dCB8fCB0aGlzLmNvbnRleHQgKSA6CisJCQkJMDsKKworCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJY3VyID0gdGhpc1tpXTsKKworCQkJd2hpbGUgKCBjdXIgKSB7CisJCQkJaWYgKCBwb3MgPyBwb3MuaW5kZXgoY3VyKSA+IC0xIDogalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSApIHsKKwkJCQkJcmV0LnB1c2goIGN1ciApOworCQkJCQlicmVhazsKKworCQkJCX0gZWxzZSB7CisJCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOworCQkJCQlpZiAoICFjdXIgfHwgIWN1ci5vd25lckRvY3VtZW50IHx8IGN1ciA9PT0gY29udGV4dCB8fCBjdXIubm9kZVR5cGUgPT09IDExICkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXQgPSByZXQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0OworCisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCAiY2xvc2VzdCIsIHNlbGVjdG9ycyApOworCX0sCisKKwkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCisJLy8gdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzCisJaW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkgeworCisJCS8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50CisJCWlmICggIWVsZW0gKSB7CisJCQlyZXR1cm4gKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApID8gdGhpcy5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CisJCX0KKworCQkvLyBpbmRleCBpbiBzZWxlY3RvcgorCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKKwkJCXJldHVybiBqUXVlcnkuaW5BcnJheSggdGhpc1swXSwgalF1ZXJ5KCBlbGVtICkgKTsKKwkJfQorCisJCS8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudAorCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCisJCQkvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWQKKwkJCWVsZW0uanF1ZXJ5ID8gZWxlbVswXSA6IGVsZW0sIHRoaXMgKTsKKwl9LAorCisJYWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCXZhciBzZXQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KKwkJCQlqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgOgorCQkJCWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yICYmIHNlbGVjdG9yLm5vZGVUeXBlID8gWyBzZWxlY3RvciBdIDogc2VsZWN0b3IgKSwKKwkJCWFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CisKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBpc0Rpc2Nvbm5lY3RlZCggc2V0WzBdICkgfHwgaXNEaXNjb25uZWN0ZWQoIGFsbFswXSApID8KKwkJCWFsbCA6CisJCQlqUXVlcnkudW5pcXVlKCBhbGwgKSApOworCX0sCisKKwlhbmRTZWxmOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuYWRkKCB0aGlzLnByZXZPYmplY3QgKTsKKwl9Cit9KTsKKworLy8gQSBwYWluZnVsbHkgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhbiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZAorLy8gZnJvbSBhIGRvY3VtZW50IChzaG91bGQgYmUgaW1wcm92ZWQsIHdoZXJlIGZlYXNpYmxlKS4KK2Z1bmN0aW9uIGlzRGlzY29ubmVjdGVkKCBub2RlICkgeworCXJldHVybiAhbm9kZSB8fCAhbm9kZS5wYXJlbnROb2RlIHx8IG5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMTE7Cit9CisKK2pRdWVyeS5lYWNoKHsKKwlwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOworCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOworCX0sCisJcGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIgKTsKKwl9LAorCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgeworCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiLCB1bnRpbCApOworCX0sCisJbmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkubnRoKCBlbGVtLCAyLCAibmV4dFNpYmxpbmciICk7CisJfSwKKwlwcmV2OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5udGgoIGVsZW0sIDIsICJwcmV2aW91c1NpYmxpbmciICk7CisJfSwKKwluZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKKwl9LAorCXByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKKwl9LAorCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgeworCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiwgdW50aWwgKTsKKwl9LAorCXByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgeworCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7CisJfSwKKwlzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkuc2libGluZyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7CisJfSwKKwljaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5maXJzdENoaWxkICk7CisJfSwKKwljb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgPworCQkJZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgZWxlbS5jb250ZW50V2luZG93LmRvY3VtZW50IDoKKwkJCWpRdWVyeS5tYWtlQXJyYXkoIGVsZW0uY2hpbGROb2RlcyApOworCX0KK30sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7CisJCXZhciByZXQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTsKKworCQlpZiAoICFydW50aWwudGVzdCggbmFtZSApICkgeworCQkJc2VsZWN0b3IgPSB1bnRpbDsKKwkJfQorCisJCWlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKKwkJCXJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKKwkJfQorCisJCXJldCA9IHRoaXMubGVuZ3RoID4gMSAmJiAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CisKKwkJaWYgKCAodGhpcy5sZW5ndGggPiAxIHx8IHJtdWx0aXNlbGVjdG9yLnRlc3QoIHNlbGVjdG9yICkpICYmIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CisJCQlyZXQgPSByZXQucmV2ZXJzZSgpOworCQl9CisKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLmpvaW4oIiwiKSApOworCX07Cit9KTsKKworalF1ZXJ5LmV4dGVuZCh7CisJZmlsdGVyOiBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsKKwkJaWYgKCBub3QgKSB7CisJCQlleHByID0gIjpub3QoIiArIGV4cHIgKyAiKSI7CisJCX0KKworCQlyZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxID8KKwkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihlbGVtc1swXSwgZXhwcikgPyBbIGVsZW1zWzBdIF0gOiBbXSA6CisJCQlqUXVlcnkuZmluZC5tYXRjaGVzKGV4cHIsIGVsZW1zKTsKKwl9LAorCisJZGlyOiBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHsKKwkJdmFyIG1hdGNoZWQgPSBbXSwKKwkJCWN1ciA9IGVsZW1bIGRpciBdOworCisJCXdoaWxlICggY3VyICYmIGN1ci5ub2RlVHlwZSAhPT0gOSAmJiAodW50aWwgPT09IHVuZGVmaW5lZCB8fCBjdXIubm9kZVR5cGUgIT09IDEgfHwgIWpRdWVyeSggY3VyICkuaXMoIHVudGlsICkpICkgeworCQkJaWYgKCBjdXIubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJbWF0Y2hlZC5wdXNoKCBjdXIgKTsKKwkJCX0KKwkJCWN1ciA9IGN1cltkaXJdOworCQl9CisJCXJldHVybiBtYXRjaGVkOworCX0sCisKKwludGg6IGZ1bmN0aW9uKCBjdXIsIHJlc3VsdCwgZGlyLCBlbGVtICkgeworCQlyZXN1bHQgPSByZXN1bHQgfHwgMTsKKwkJdmFyIG51bSA9IDA7CisKKwkJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkgeworCQkJaWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgKytudW0gPT09IHJlc3VsdCApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXJldHVybiBjdXI7CisJfSwKKworCXNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgeworCQl2YXIgciA9IFtdOworCisJCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CisJCQlpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHsKKwkJCQlyLnB1c2goIG4gKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByOworCX0KK30pOworCisvLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdAorZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBrZWVwICkgeworCisJLy8gQ2FuJ3QgcGFzcyBudWxsIG9yIHVuZGVmaW5lZCB0byBpbmRleE9mIGluIEZpcmVmb3ggNAorCS8vIFNldCB0byAwIHRvIHNraXAgc3RyaW5nIGNoZWNrCisJcXVhbGlmaWVyID0gcXVhbGlmaWVyIHx8IDA7CisKKwlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKKwkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKKwkJCXZhciByZXRWYWwgPSAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CisJCQlyZXR1cm4gcmV0VmFsID09PSBrZWVwOworCQl9KTsKKworCX0gZWxzZSBpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHsKKwkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKKwkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApID09PSBrZWVwOworCQl9KTsKKworCX0gZWxzZSBpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgeworCQl2YXIgZmlsdGVyZWQgPSBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKKwkJfSk7CisKKwkJaWYgKCBpc1NpbXBsZS50ZXN0KCBxdWFsaWZpZXIgKSApIHsKKwkJCXJldHVybiBqUXVlcnkuZmlsdGVyKHF1YWxpZmllciwgZmlsdGVyZWQsICFrZWVwKTsKKwkJfSBlbHNlIHsKKwkJCXF1YWxpZmllciA9IGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZmlsdGVyZWQgKTsKKwkJfQorCX0KKworCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CisJCXJldHVybiAoIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBxdWFsaWZpZXIgKSA+PSAwICkgPT09IGtlZXA7CisJfSk7Cit9CisKKworCisKK2Z1bmN0aW9uIGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKSB7CisJdmFyIGxpc3QgPSBub2RlTmFtZXMuc3BsaXQoICJ8IiApLAorCXNhZmVGcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOworCisJaWYgKCBzYWZlRnJhZy5jcmVhdGVFbGVtZW50ICkgeworCQl3aGlsZSAoIGxpc3QubGVuZ3RoICkgeworCQkJc2FmZUZyYWcuY3JlYXRlRWxlbWVudCgKKwkJCQlsaXN0LnBvcCgpCisJCQkpOworCQl9CisJfQorCXJldHVybiBzYWZlRnJhZzsKK30KKwordmFyIG5vZGVOYW1lcyA9ICJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfCIgKworCQkiaGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW8iLAorCXJpbmxpbmVqUXVlcnkgPSAvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLAorCXJsZWFkaW5nV2hpdGVzcGFjZSA9IC9eXHMrLywKKwlyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLAorCXJ0YWdOYW1lID0gLzwoW1x3Ol0rKS8sCisJcnRib2R5ID0gLzx0Ym9keS9pLAorCXJodG1sID0gLzx8JiM/XHcrOy8sCisJcm5vSW5uZXJodG1sID0gLzwoPzpzY3JpcHR8c3R5bGUpL2ksCisJcm5vY2FjaGUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLAorCXJub3NoaW1jYWNoZSA9IG5ldyBSZWdFeHAoIjwoPzoiICsgbm9kZU5hbWVzICsgIilbXFxzLz5dIiwgImkiKSwKKwkvLyBjaGVja2VkPSJjaGVja2VkIiBvciBjaGVja2VkCisJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKKwlyc2NyaXB0VHlwZSA9IC9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksCisJcmNsZWFuU2NyaXB0ID0gL15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8sCisJd3JhcE1hcCA9IHsKKwkJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKKwkJbGVnZW5kOiBbIDEsICI8ZmllbGRzZXQ+IiwgIjwvZmllbGRzZXQ+IiBdLAorCQl0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKKwkJdHI6IFsgMiwgIjx0YWJsZT48dGJvZHk+IiwgIjwvdGJvZHk+PC90YWJsZT4iIF0sCisJCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAorCQljb2w6IFsgMiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCisJCWFyZWE6IFsgMSwgIjxtYXA+IiwgIjwvbWFwPiIgXSwKKwkJX2RlZmF1bHQ6IFsgMCwgIiIsICIiIF0KKwl9LAorCXNhZmVGcmFnbWVudCA9IGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKTsKKword3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uOword3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDsKK3dyYXBNYXAudGggPSB3cmFwTWFwLnRkOworCisvLyBJRSBjYW4ndCBzZXJpYWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5CitpZiAoICFqUXVlcnkuc3VwcG9ydC5odG1sU2VyaWFsaXplICkgeworCXdyYXBNYXAuX2RlZmF1bHQgPSBbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF07Cit9CisKK2pRdWVyeS5mbi5leHRlbmQoeworCXRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJCXJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8KKwkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKKwkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCAoIHRoaXNbMF0gJiYgdGhpc1swXS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50ICkuY3JlYXRlVGV4dE5vZGUoIHZhbHVlICkgKTsKKwkJfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsKKwl9LAorCisJd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworCQkJCWpRdWVyeSh0aGlzKS53cmFwQWxsKCBodG1sLmNhbGwodGhpcywgaSkgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCB0aGlzWzBdICkgeworCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKKwkJCXZhciB3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWzBdLm93bmVyRG9jdW1lbnQgKS5lcSgwKS5jbG9uZSh0cnVlKTsKKworCQkJaWYgKCB0aGlzWzBdLnBhcmVudE5vZGUgKSB7CisJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbMF0gKTsKKwkJCX0KKworCQkJd3JhcC5tYXAoZnVuY3Rpb24oKSB7CisJCQkJdmFyIGVsZW0gPSB0aGlzOworCisJCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgJiYgZWxlbS5maXJzdENoaWxkLm5vZGVUeXBlID09PSAxICkgeworCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOworCQkJCX0KKworCQkJCXJldHVybiBlbGVtOworCQkJfSkuYXBwZW5kKCB0aGlzICk7CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CisJCQkJalF1ZXJ5KHRoaXMpLndyYXBJbm5lciggaHRtbC5jYWxsKHRoaXMsIGkpICk7CisJCQl9KTsKKwkJfQorCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAorCQkJCWNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpOworCisJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKKwkJCQljb250ZW50cy53cmFwQWxsKCBodG1sICk7CisKKwkJCX0gZWxzZSB7CisJCQkJc2VsZi5hcHBlbmQoIGh0bWwgKTsKKwkJCX0KKwkJfSk7CisJfSwKKworCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgeworCQl2YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICk7CisKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CisJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKHRoaXMsIGkpIDogaHRtbCApOworCQl9KTsKKwl9LAorCisJdW53cmFwOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpIHsKKwkJCWlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgImJvZHkiICkgKSB7CisJCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOworCQkJfQorCQl9KS5lbmQoKTsKKwl9LAorCisJYXBwZW5kOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHsKKwkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQl0aGlzLmFwcGVuZENoaWxkKCBlbGVtICk7CisJCQl9CisJCX0pOworCX0sCisKKwlwcmVwZW5kOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHsKKwkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQl0aGlzLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5maXJzdENoaWxkICk7CisJCQl9CisJCX0pOworCX0sCisKKwliZWZvcmU6IGZ1bmN0aW9uKCkgeworCQlpZiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgeworCQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApOworCQkJfSk7CisJCX0gZWxzZSBpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CisJCQl2YXIgc2V0ID0galF1ZXJ5LmNsZWFuKCBhcmd1bWVudHMgKTsKKwkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIHRoaXMudG9BcnJheSgpICk7CisJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNldCwgImJlZm9yZSIsIGFyZ3VtZW50cyApOworCQl9CisJfSwKKworCWFmdGVyOiBmdW5jdGlvbigpIHsKKwkJaWYgKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKKwkJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTsKKwkJCX0pOworCQl9IGVsc2UgaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgeworCQkJdmFyIHNldCA9IHRoaXMucHVzaFN0YWNrKCB0aGlzLCAiYWZ0ZXIiLCBhcmd1bWVudHMgKTsKKwkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIGpRdWVyeS5jbGVhbihhcmd1bWVudHMpICk7CisJCQlyZXR1cm4gc2V0OworCQl9CisJfSwKKworCS8vIGtlZXBEYXRhIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS0tZG8gbm90IGRvY3VtZW50CisJcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IsIGtlZXBEYXRhICkgeworCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkgeworCQkJaWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIFsgZWxlbSBdICkubGVuZ3RoICkgeworCQkJCWlmICggIWtlZXBEYXRhICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOworCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCBbIGVsZW0gXSApOworCQkJCX0KKworCQkJCWlmICggZWxlbS5wYXJlbnROb2RlICkgeworCQkJCQllbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsZW0gKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZW1wdHk6IGZ1bmN0aW9uKCkgeworCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkgeworCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCisJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpICk7CisJCQl9CisKKwkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCisJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApIHsKKwkJCQllbGVtLnJlbW92ZUNoaWxkKCBlbGVtLmZpcnN0Q2hpbGQgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0aGlzOworCX0sCisKKwljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgeworCQlkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOworCQlkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7CisKKwkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbiAoKSB7CisJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOworCQl9KTsKKwl9LAorCisJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgeworCQkJdmFyIGVsZW0gPSB0aGlzWzBdIHx8IHt9LAorCQkJCWkgPSAwLAorCQkJCWwgPSB0aGlzLmxlbmd0aDsKKworCQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeworCQkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxID8KKwkJCQkJZWxlbS5pbm5lckhUTUwucmVwbGFjZSggcmlubGluZWpRdWVyeSwgIiIgKSA6CisJCQkJCW51bGw7CisJCQl9CisKKworCQkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJgorCQkJCSggalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgfHwgIXJsZWFkaW5nV2hpdGVzcGFjZS50ZXN0KCB2YWx1ZSApICkgJiYKKwkJCQkhd3JhcE1hcFsgKCBydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsiIiwgIiJdIClbMV0udG9Mb3dlckNhc2UoKSBdICkgeworCisJCQkJdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCByeGh0bWxUYWcsICI8JDE+PC8kMj4iICk7CisKKwkJCQl0cnkgeworCQkJCQlmb3IgKDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJCS8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrcworCQkJCQkJZWxlbSA9IHRoaXNbaV0gfHwge307CisJCQkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICkgKTsKKwkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJZWxlbSA9IDA7CisKKwkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKKwkJCQl9IGNhdGNoKGUpIHt9CisJCQl9CisKKwkJCWlmICggZWxlbSApIHsKKwkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOworCQkJfQorCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOworCX0sCisKKwlyZXBsYWNlV2l0aDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlpZiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgeworCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGVsZW1lbnRzIGFyZSByZW1vdmVkIGZyb20gdGhlIERPTSBiZWZvcmUgdGhleSBhcmUgaW5zZXJ0ZWQKKwkJCS8vIHRoaXMgY2FuIGhlbHAgZml4IHJlcGxhY2luZyBhIHBhcmVudCB3aXRoIGNoaWxkIGVsZW1lbnRzCisJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworCQkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworCQkJCQl2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKSwgb2xkID0gc2VsZi5odG1sKCk7CisJCQkJCXNlbGYucmVwbGFjZVdpdGgoIHZhbHVlLmNhbGwoIHRoaXMsIGksIG9sZCApICk7CisJCQkJfSk7CisJCQl9CisKKwkJCWlmICggdHlwZW9mIHZhbHVlICE9PSAic3RyaW5nIiApIHsKKwkJCQl2YWx1ZSA9IGpRdWVyeSggdmFsdWUgKS5kZXRhY2goKTsKKwkJCX0KKworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQl2YXIgbmV4dCA9IHRoaXMubmV4dFNpYmxpbmcsCisJCQkJCXBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKKworCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZSgpOworCisJCQkJaWYgKCBuZXh0ICkgeworCQkJCQlqUXVlcnkobmV4dCkuYmVmb3JlKCB2YWx1ZSApOworCQkJCX0gZWxzZSB7CisJCQkJCWpRdWVyeShwYXJlbnQpLmFwcGVuZCggdmFsdWUgKTsKKwkJCQl9CisJCQl9KTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLmxlbmd0aCA/CisJCQkJdGhpcy5wdXNoU3RhY2soIGpRdWVyeShqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZSgpIDogdmFsdWUpLCAicmVwbGFjZVdpdGgiLCB2YWx1ZSApIDoKKwkJCQl0aGlzOworCQl9CisJfSwKKworCWRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9yLCB0cnVlICk7CisJfSwKKworCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgeworCQl2YXIgcmVzdWx0cywgZmlyc3QsIGZyYWdtZW50LCBwYXJlbnQsCisJCQl2YWx1ZSA9IGFyZ3NbMF0sCisJCQlzY3JpcHRzID0gW107CisKKwkJLy8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0CisJCWlmICggIWpRdWVyeS5zdXBwb3J0LmNoZWNrQ2xvbmUgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJCWpRdWVyeSh0aGlzKS5kb21NYW5pcCggYXJncywgdGFibGUsIGNhbGxiYWNrLCB0cnVlICk7CisJCQl9KTsKKwkJfQorCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24odmFsdWUpICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CisJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyk7CisJCQkJYXJnc1swXSA9IHZhbHVlLmNhbGwodGhpcywgaSwgdGFibGUgPyBzZWxmLmh0bWwoKSA6IHVuZGVmaW5lZCk7CisJCQkJc2VsZi5kb21NYW5pcCggYXJncywgdGFibGUsIGNhbGxiYWNrICk7CisJCQl9KTsKKwkJfQorCisJCWlmICggdGhpc1swXSApIHsKKwkJCXBhcmVudCA9IHZhbHVlICYmIHZhbHVlLnBhcmVudE5vZGU7CisKKwkJCS8vIElmIHdlJ3JlIGluIGEgZnJhZ21lbnQsIGp1c3QgdXNlIHRoYXQgaW5zdGVhZCBvZiBidWlsZGluZyBhIG5ldyBvbmUKKwkJCWlmICggalF1ZXJ5LnN1cHBvcnQucGFyZW50Tm9kZSAmJiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlID09PSAxMSAmJiBwYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IHRoaXMubGVuZ3RoICkgeworCQkJCXJlc3VsdHMgPSB7IGZyYWdtZW50OiBwYXJlbnQgfTsKKworCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHRzID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIGFyZ3MsIHRoaXMsIHNjcmlwdHMgKTsKKwkJCX0KKworCQkJZnJhZ21lbnQgPSByZXN1bHRzLmZyYWdtZW50OworCisJCQlpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICkgeworCQkJCWZpcnN0ID0gZnJhZ21lbnQgPSBmcmFnbWVudC5maXJzdENoaWxkOworCQkJfSBlbHNlIHsKKwkJCQlmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CisJCQl9CisKKwkJCWlmICggZmlyc3QgKSB7CisJCQkJdGFibGUgPSB0YWJsZSAmJiBqUXVlcnkubm9kZU5hbWUoIGZpcnN0LCAidHIiICk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aCwgbGFzdEluZGV4ID0gbCAtIDE7IGkgPCBsOyBpKysgKSB7CisJCQkJCWNhbGxiYWNrLmNhbGwoCisJCQkJCQl0YWJsZSA/CisJCQkJCQkJcm9vdCh0aGlzW2ldLCBmaXJzdCkgOgorCQkJCQkJCXRoaXNbaV0sCisJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgbGVhayBtZW1vcnkgYnkgaW5hZHZlcnRlbnRseSBkaXNjYXJkaW5nCisJCQkJCQkvLyB0aGUgb3JpZ2luYWwgZnJhZ21lbnQgKHdoaWNoIG1pZ2h0IGhhdmUgYXR0YWNoZWQgZGF0YSkgaW5zdGVhZCBvZgorCQkJCQkJLy8gdXNpbmcgaXQ7IGluIGFkZGl0aW9uLCB1c2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IG9iamVjdCBmb3IgdGhlIGxhc3QKKwkJCQkJCS8vIGl0ZW0gaW5zdGVhZCBvZiBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAgYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseQorCQkJCQkJLy8gaW4gY2VydGFpbiBzaXR1YXRpb25zIChCdWcgIzgwNzApLgorCQkJCQkJLy8gRnJhZ21lbnRzIGZyb20gdGhlIGZyYWdtZW50IGNhY2hlIG11c3QgYWx3YXlzIGJlIGNsb25lZCBhbmQgbmV2ZXIgdXNlZAorCQkJCQkJLy8gaW4gcGxhY2UuCisJCQkJCQlyZXN1bHRzLmNhY2hlYWJsZSB8fCAoIGwgPiAxICYmIGkgPCBsYXN0SW5kZXggKSA/CisJCQkJCQkJalF1ZXJ5LmNsb25lKCBmcmFnbWVudCwgdHJ1ZSwgdHJ1ZSApIDoKKwkJCQkJCQlmcmFnbWVudAorCQkJCQkpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCBzY3JpcHRzLmxlbmd0aCApIHsKKwkJCQlqUXVlcnkuZWFjaCggc2NyaXB0cywgZnVuY3Rpb24oIGksIGVsZW0gKSB7CisJCQkJCWlmICggZWxlbS5zcmMgKSB7CisJCQkJCQlqUXVlcnkuYWpheCh7CisJCQkJCQkJdHlwZTogIkdFVCIsCisJCQkJCQkJZ2xvYmFsOiBmYWxzZSwKKwkJCQkJCQl1cmw6IGVsZW0uc3JjLAorCQkJCQkJCWFzeW5jOiBmYWxzZSwKKwkJCQkJCQlkYXRhVHlwZTogInNjcmlwdCIKKwkJCQkJCX0pOworCQkJCQl9IGVsc2UgeworCQkJCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoICggZWxlbS50ZXh0IHx8IGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lckhUTUwgfHwgIiIgKS5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIvKiQwKi8iICkgKTsKKwkJCQkJfQorCisJCQkJCWlmICggZWxlbS5wYXJlbnROb2RlICkgeworCQkJCQkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0aGlzOworCX0KK30pOworCitmdW5jdGlvbiByb290KCBlbGVtLCBjdXIgKSB7CisJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUiKSA/CisJCShlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdIHx8CisJCWVsZW0uYXBwZW5kQ2hpbGQoZWxlbS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpKSA6CisJCWVsZW07Cit9CisKK2Z1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7CisKKwlpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgfHwgIWpRdWVyeS5oYXNEYXRhKCBzcmMgKSApIHsKKwkJcmV0dXJuOworCX0KKworCXZhciB0eXBlLCBpLCBsLAorCQlvbGREYXRhID0galF1ZXJ5Ll9kYXRhKCBzcmMgKSwKKwkJY3VyRGF0YSA9IGpRdWVyeS5fZGF0YSggZGVzdCwgb2xkRGF0YSApLAorCQlldmVudHMgPSBvbGREYXRhLmV2ZW50czsKKworCWlmICggZXZlbnRzICkgeworCQlkZWxldGUgY3VyRGF0YS5oYW5kbGU7CisJCWN1ckRhdGEuZXZlbnRzID0ge307CisKKwkJZm9yICggdHlwZSBpbiBldmVudHMgKSB7CisJCQlmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQlqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7CisJCQl9CisJCX0KKwl9CisKKwkvLyBtYWtlIHRoZSBjbG9uZWQgcHVibGljIGRhdGEgb2JqZWN0IGEgY29weSBmcm9tIHRoZSBvcmlnaW5hbAorCWlmICggY3VyRGF0YS5kYXRhICkgeworCQljdXJEYXRhLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyRGF0YS5kYXRhICk7CisJfQorfQorCitmdW5jdGlvbiBjbG9uZUZpeEF0dHJpYnV0ZXMoIHNyYywgZGVzdCApIHsKKwl2YXIgbm9kZU5hbWU7CisKKwkvLyBXZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZyBmb3Igbm9uLUVsZW1lbnRzCisJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgeworCQlyZXR1cm47CisJfQorCisJLy8gY2xlYXJBdHRyaWJ1dGVzIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZXMsIHdoaWNoIHdlIGRvbid0IHdhbnQsCisJLy8gYnV0IGFsc28gcmVtb3ZlcyB0aGUgYXR0YWNoRXZlbnQgZXZlbnRzLCB3aGljaCB3ZSAqZG8qIHdhbnQKKwlpZiAoIGRlc3QuY2xlYXJBdHRyaWJ1dGVzICkgeworCQlkZXN0LmNsZWFyQXR0cmlidXRlcygpOworCX0KKworCS8vIG1lcmdlQXR0cmlidXRlcywgaW4gY29udHJhc3QsIG9ubHkgbWVyZ2VzIGJhY2sgb24gdGhlCisJLy8gb3JpZ2luYWwgYXR0cmlidXRlcywgbm90IHRoZSBldmVudHMKKwlpZiAoIGRlc3QubWVyZ2VBdHRyaWJ1dGVzICkgeworCQlkZXN0Lm1lcmdlQXR0cmlidXRlcyggc3JjICk7CisJfQorCisJbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisKKwkvLyBJRTYtOCBmYWlsIHRvIGNsb25lIGNoaWxkcmVuIGluc2lkZSBvYmplY3QgZWxlbWVudHMgdGhhdCB1c2UKKwkvLyB0aGUgcHJvcHJpZXRhcnkgY2xhc3NpZCBhdHRyaWJ1dGUgdmFsdWUgKHJhdGhlciB0aGFuIHRoZSB0eXBlCisJLy8gYXR0cmlidXRlKSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBjb250ZW50IHRvIGRpc3BsYXkKKwlpZiAoIG5vZGVOYW1lID09PSAib2JqZWN0IiApIHsKKwkJZGVzdC5vdXRlckhUTUwgPSBzcmMub3V0ZXJIVE1MOworCisJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgKHNyYy50eXBlID09PSAiY2hlY2tib3giIHx8IHNyYy50eXBlID09PSAicmFkaW8iKSApIHsKKwkJLy8gSUU2LTggZmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveAorCQkvLyBvciByYWRpbyBidXR0b24uIFdvcnNlLCBJRTYtNyBmYWlsIHRvIGdpdmUgdGhlIGNsb25lZCBlbGVtZW50CisJCS8vIGEgY2hlY2tlZCBhcHBlYXJhbmNlIGlmIHRoZSBkZWZhdWx0Q2hlY2tlZCB2YWx1ZSBpc24ndCBhbHNvIHNldAorCQlpZiAoIHNyYy5jaGVja2VkICkgeworCQkJZGVzdC5kZWZhdWx0Q2hlY2tlZCA9IGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkOworCQl9CisKKwkJLy8gSUU2LTcgZ2V0IGNvbmZ1c2VkIGFuZCBlbmQgdXAgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjbG9uZWQKKwkJLy8gY2hlY2tib3gvcmFkaW8gYnV0dG9uIHRvIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICJvbiIKKwkJaWYgKCBkZXN0LnZhbHVlICE9PSBzcmMudmFsdWUgKSB7CisJCQlkZXN0LnZhbHVlID0gc3JjLnZhbHVlOworCQl9CisKKwkvLyBJRTYtOCBmYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZAorCS8vIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zCisJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJvcHRpb24iICkgeworCQlkZXN0LnNlbGVjdGVkID0gc3JjLmRlZmF1bHRTZWxlY3RlZDsKKworCS8vIElFNi04IGZhaWxzIHRvIHNldCB0aGUgZGVmYXVsdFZhbHVlIHRvIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4KKwkvLyBjbG9uaW5nIG90aGVyIHR5cGVzIG9mIGlucHV0IGZpZWxkcworCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiIHx8IG5vZGVOYW1lID09PSAidGV4dGFyZWEiICkgeworCQlkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7CisKKwkvLyBJRSBibGFua3MgY29udGVudHMgd2hlbiBjbG9uaW5nIHNjcmlwdHMKKwl9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gInNjcmlwdCIgJiYgZGVzdC50ZXh0ICE9PSBzcmMudGV4dCApIHsKKwkJZGVzdC50ZXh0ID0gc3JjLnRleHQ7CisJfQorCisJLy8gRXZlbnQgZGF0YSBnZXRzIHJlZmVyZW5jZWQgaW5zdGVhZCBvZiBjb3BpZWQgaWYgdGhlIGV4cGFuZG8KKwkvLyBnZXRzIGNvcGllZCB0b28KKwlkZXN0LnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKKworCS8vIENsZWFyIGZsYWdzIGZvciBidWJibGluZyBzcGVjaWFsIGNoYW5nZS9zdWJtaXQgZXZlbnRzLCB0aGV5IG11c3QKKwkvLyBiZSByZWF0dGFjaGVkIHdoZW4gdGhlIG5ld2x5IGNsb25lZCBldmVudHMgYXJlIGZpcnN0IGFjdGl2YXRlZAorCWRlc3QucmVtb3ZlQXR0cmlidXRlKCAiX3N1Ym1pdF9hdHRhY2hlZCIgKTsKKwlkZXN0LnJlbW92ZUF0dHJpYnV0ZSggIl9jaGFuZ2VfYXR0YWNoZWQiICk7Cit9CisKK2pRdWVyeS5idWlsZEZyYWdtZW50ID0gZnVuY3Rpb24oIGFyZ3MsIG5vZGVzLCBzY3JpcHRzICkgeworCXZhciBmcmFnbWVudCwgY2FjaGVhYmxlLCBjYWNoZXJlc3VsdHMsIGRvYywKKwlmaXJzdCA9IGFyZ3NbIDAgXTsKKworCS8vIG5vZGVzIG1heSBjb250YWluIGVpdGhlciBhbiBleHBsaWNpdCBkb2N1bWVudCBvYmplY3QsCisJLy8gYSBqUXVlcnkgY29sbGVjdGlvbiBvciBjb250ZXh0IG9iamVjdC4KKwkvLyBJZiBub2Rlc1swXSBjb250YWlucyBhIHZhbGlkIG9iamVjdCB0byBhc3NpZ24gdG8gZG9jCisJaWYgKCBub2RlcyAmJiBub2Rlc1swXSApIHsKKwkJZG9jID0gbm9kZXNbMF0ub3duZXJEb2N1bWVudCB8fCBub2Rlc1swXTsKKwl9CisKKwkvLyBFbnN1cmUgdGhhdCBhbiBhdHRyIG9iamVjdCBkb2Vzbid0IGluY29ycmVjdGx5IHN0YW5kIGluIGFzIGEgZG9jdW1lbnQgb2JqZWN0CisJLy8gQ2hyb21lIGFuZCBGaXJlZm94IHNlZW0gdG8gYWxsb3cgdGhpcyB0byBvY2N1ciBhbmQgd2lsbCB0aHJvdyBleGNlcHRpb24KKwkvLyBGaXhlcyAjODk1MAorCWlmICggIWRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50ICkgeworCQlkb2MgPSBkb2N1bWVudDsKKwl9CisKKwkvLyBPbmx5IGNhY2hlICJzbWFsbCIgKDEvMiBLQikgSFRNTCBzdHJpbmdzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFpbiBkb2N1bWVudAorCS8vIENsb25pbmcgb3B0aW9ucyBsb3NlcyB0aGUgc2VsZWN0ZWQgc3RhdGUsIHNvIGRvbid0IGNhY2hlIHRoZW0KKwkvLyBJRSA2IGRvZXNuJ3QgbGlrZSBpdCB3aGVuIHlvdSBwdXQgPG9iamVjdD4gb3IgPGVtYmVkPiBlbGVtZW50cyBpbiBhIGZyYWdtZW50CisJLy8gQWxzbywgV2ViS2l0IGRvZXMgbm90IGNsb25lICdjaGVja2VkJyBhdHRyaWJ1dGVzIG9uIGNsb25lTm9kZSwgc28gZG9uJ3QgY2FjaGUKKwkvLyBMYXN0bHksIElFNiw3LDggd2lsbCBub3QgY29ycmVjdGx5IHJldXNlIGNhY2hlZCBmcmFnbWVudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSB1bmtub3duIGVsZW1zICMxMDUwMQorCWlmICggYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGZpcnN0ID09PSAic3RyaW5nIiAmJiBmaXJzdC5sZW5ndGggPCA1MTIgJiYgZG9jID09PSBkb2N1bWVudCAmJgorCQlmaXJzdC5jaGFyQXQoMCkgPT09ICI8IiAmJiAhcm5vY2FjaGUudGVzdCggZmlyc3QgKSAmJgorCQkoalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSB8fCAhcmNoZWNrZWQudGVzdCggZmlyc3QgKSkgJiYKKwkJKGpRdWVyeS5zdXBwb3J0Lmh0bWw1Q2xvbmUgfHwgIXJub3NoaW1jYWNoZS50ZXN0KCBmaXJzdCApKSApIHsKKworCQljYWNoZWFibGUgPSB0cnVlOworCisJCWNhY2hlcmVzdWx0cyA9IGpRdWVyeS5mcmFnbWVudHNbIGZpcnN0IF07CisJCWlmICggY2FjaGVyZXN1bHRzICYmIGNhY2hlcmVzdWx0cyAhPT0gMSApIHsKKwkJCWZyYWdtZW50ID0gY2FjaGVyZXN1bHRzOworCQl9CisJfQorCisJaWYgKCAhZnJhZ21lbnQgKSB7CisJCWZyYWdtZW50ID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKwkJalF1ZXJ5LmNsZWFuKCBhcmdzLCBkb2MsIGZyYWdtZW50LCBzY3JpcHRzICk7CisJfQorCisJaWYgKCBjYWNoZWFibGUgKSB7CisJCWpRdWVyeS5mcmFnbWVudHNbIGZpcnN0IF0gPSBjYWNoZXJlc3VsdHMgPyBmcmFnbWVudCA6IDE7CisJfQorCisJcmV0dXJuIHsgZnJhZ21lbnQ6IGZyYWdtZW50LCBjYWNoZWFibGU6IGNhY2hlYWJsZSB9OworfTsKKworalF1ZXJ5LmZyYWdtZW50cyA9IHt9OworCitqUXVlcnkuZWFjaCh7CisJYXBwZW5kVG86ICJhcHBlbmQiLAorCXByZXBlbmRUbzogInByZXBlbmQiLAorCWluc2VydEJlZm9yZTogImJlZm9yZSIsCisJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCisJcmVwbGFjZUFsbDogInJlcGxhY2VXaXRoIgorfSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkgeworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgcmV0ID0gW10sCisJCQlpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksCisJCQlwYXJlbnQgPSB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzWzBdLnBhcmVudE5vZGU7CisKKwkJaWYgKCBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlID09PSAxMSAmJiBwYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgJiYgaW5zZXJ0Lmxlbmd0aCA9PT0gMSApIHsKKwkJCWluc2VydFsgb3JpZ2luYWwgXSggdGhpc1swXSApOworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGluc2VydC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJdmFyIGVsZW1zID0gKCBpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzICkuZ2V0KCk7CisJCQkJalF1ZXJ5KCBpbnNlcnRbaV0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTsKKwkJCQlyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApOworCQkJfQorCisJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgaW5zZXJ0LnNlbGVjdG9yICk7CisJCX0KKwl9OworfSk7CisKK2Z1bmN0aW9uIGdldEFsbCggZWxlbSApIHsKKwlpZiAoIHR5cGVvZiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSAidW5kZWZpbmVkIiApIHsKKwkJcmV0dXJuIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICIqIiApOworCisJfSBlbHNlIGlmICggdHlwZW9mIGVsZW0ucXVlcnlTZWxlY3RvckFsbCAhPT0gInVuZGVmaW5lZCIgKSB7CisJCXJldHVybiBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoICIqIiApOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIFtdOworCX0KK30KKworLy8gVXNlZCBpbiBjbGVhbiwgZml4ZXMgdGhlIGRlZmF1bHRDaGVja2VkIHByb3BlcnR5CitmdW5jdGlvbiBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHsKKwlpZiAoIGVsZW0udHlwZSA9PT0gImNoZWNrYm94IiB8fCBlbGVtLnR5cGUgPT09ICJyYWRpbyIgKSB7CisJCWVsZW0uZGVmYXVsdENoZWNrZWQgPSBlbGVtLmNoZWNrZWQ7CisJfQorfQorLy8gRmluZHMgYWxsIGlucHV0cyBhbmQgcGFzc2VzIHRoZW0gdG8gZml4RGVmYXVsdENoZWNrZWQKK2Z1bmN0aW9uIGZpbmRJbnB1dHMoIGVsZW0gKSB7CisJdmFyIG5vZGVOYW1lID0gKCBlbGVtLm5vZGVOYW1lIHx8ICIiICkudG9Mb3dlckNhc2UoKTsKKwlpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiICkgeworCQlmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApOworCS8vIFNraXAgc2NyaXB0cywgZ2V0IG90aGVyIGNoaWxkcmVuCisJfSBlbHNlIGlmICggbm9kZU5hbWUgIT09ICJzY3JpcHQiICYmIHR5cGVvZiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSAidW5kZWZpbmVkIiApIHsKKwkJalF1ZXJ5LmdyZXAoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksIGZpeERlZmF1bHRDaGVja2VkICk7CisJfQorfQorCisvLyBEZXJpdmVkIEZyb206IGh0dHA6Ly93d3cuaWVjc3MuY29tL3NoaW1wcm92ZS9qYXZhc2NyaXB0L3NoaW1wcm92ZS4xLTAtMS5qcworZnVuY3Rpb24gc2hpbUNsb25lTm9kZSggZWxlbSApIHsKKwl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKTsKKwlzYWZlRnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRpdiApOworCisJZGl2LmlubmVySFRNTCA9IGVsZW0ub3V0ZXJIVE1MOworCXJldHVybiBkaXYuZmlyc3RDaGlsZDsKK30KKworalF1ZXJ5LmV4dGVuZCh7CisJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKKwkJdmFyIHNyY0VsZW1lbnRzLAorCQkJZGVzdEVsZW1lbnRzLAorCQkJaSwKKwkJCS8vIElFPD04IGRvZXMgbm90IHByb3Blcmx5IGNsb25lIGRldGFjaGVkLCB1bmtub3duIGVsZW1lbnQgbm9kZXMKKwkJCWNsb25lID0galF1ZXJ5LnN1cHBvcnQuaHRtbDVDbG9uZSB8fCBqUXVlcnkuaXNYTUxEb2MoZWxlbSkgfHwgIXJub3NoaW1jYWNoZS50ZXN0KCAiPCIgKyBlbGVtLm5vZGVOYW1lICsgIj4iICkgPworCQkJCWVsZW0uY2xvbmVOb2RlKCB0cnVlICkgOgorCQkJCXNoaW1DbG9uZU5vZGUoIGVsZW0gKTsKKworCQlpZiAoICghalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50IHx8ICFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkgJiYKKwkJCQkoZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSkgJiYgIWpRdWVyeS5pc1hNTERvYyhlbGVtKSApIHsKKwkJCS8vIElFIGNvcGllcyBldmVudHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50IHdoZW4gdXNpbmcgY2xvbmVOb2RlLgorCQkJLy8gQ2FsbGluZyBkZXRhY2hFdmVudCBvbiB0aGUgY2xvbmUgd2lsbCBhbHNvIHJlbW92ZSB0aGUgZXZlbnRzCisJCQkvLyBmcm9tIHRoZSBvcmlnaW5hbC4gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2Ugc29tZQorCQkJLy8gcHJvcHJpZXRhcnkgbWV0aG9kcyB0byBjbGVhciB0aGUgZXZlbnRzLiBUaGFua3MgdG8gTW9vVG9vbHMKKwkJCS8vIGd1eXMgZm9yIHRoaXMgaG90bmVzcy4KKworCQkJY2xvbmVGaXhBdHRyaWJ1dGVzKCBlbGVtLCBjbG9uZSApOworCisJCQkvLyBVc2luZyBTaXp6bGUgaGVyZSBpcyBjcmF6eSBzbG93LCBzbyB3ZSB1c2UgZ2V0RWxlbWVudHNCeVRhZ05hbWUgaW5zdGVhZAorCQkJc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTsKKwkJCWRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTsKKworCQkJLy8gV2VpcmQgaXRlcmF0aW9uIGJlY2F1c2UgSUUgd2lsbCByZXBsYWNlIHRoZSBsZW5ndGggcHJvcGVydHkKKwkJCS8vIHdpdGggYW4gZWxlbWVudCBpZiB5b3UgYXJlIGNsb25pbmcgdGhlIGJvZHkgYW5kIG9uZSBvZiB0aGUKKwkJCS8vIGVsZW1lbnRzIG9uIHRoZSBwYWdlIGhhcyBhIG5hbWUgb3IgaWQgb2YgImxlbmd0aCIKKwkJCWZvciAoIGkgPSAwOyBzcmNFbGVtZW50c1tpXTsgKytpICkgeworCQkJCS8vIEVuc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBub2RlIGlzIG5vdCBudWxsOyBGaXhlcyAjOTU4NworCQkJCWlmICggZGVzdEVsZW1lbnRzW2ldICkgeworCQkJCQljbG9uZUZpeEF0dHJpYnV0ZXMoIHNyY0VsZW1lbnRzW2ldLCBkZXN0RWxlbWVudHNbaV0gKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCisJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKKwkJCWNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApOworCisJCQlpZiAoIGRlZXBEYXRhQW5kRXZlbnRzICkgeworCQkJCXNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7CisJCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOworCisJCQkJZm9yICggaSA9IDA7IHNyY0VsZW1lbnRzW2ldOyArK2kgKSB7CisJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1tpXSwgZGVzdEVsZW1lbnRzW2ldICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJc3JjRWxlbWVudHMgPSBkZXN0RWxlbWVudHMgPSBudWxsOworCisJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAorCQlyZXR1cm4gY2xvbmU7CisJfSwKKworCWNsZWFuOiBmdW5jdGlvbiggZWxlbXMsIGNvbnRleHQsIGZyYWdtZW50LCBzY3JpcHRzICkgeworCQl2YXIgY2hlY2tTY3JpcHRUeXBlLCBzY3JpcHQsIGosCisJCQkJcmV0ID0gW107CisKKwkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisKKwkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JworCQlpZiAoIHR5cGVvZiBjb250ZXh0LmNyZWF0ZUVsZW1lbnQgPT09ICJ1bmRlZmluZWQiICkgeworCQkJY29udGV4dCA9IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0WzBdICYmIGNvbnRleHRbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDsKKwkJfQorCisJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgeworCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gIm51bWJlciIgKSB7CisJCQkJZWxlbSArPSAiIjsKKwkJCX0KKworCQkJaWYgKCAhZWxlbSApIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcworCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gInN0cmluZyIgKSB7CisJCQkJaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgeworCQkJCQllbGVtID0gY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIEZpeCAiWEhUTUwiLXN0eWxlIHRhZ3MgaW4gYWxsIGJyb3dzZXJzCisJCQkJCWVsZW0gPSBlbGVtLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CisKKwkJCQkJLy8gVHJpbSB3aGl0ZXNwYWNlLCBvdGhlcndpc2UgaW5kZXhPZiB3b24ndCB3b3JrIGFzIGV4cGVjdGVkCisJCQkJCXZhciB0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIiIsICIiXSApWzFdLnRvTG93ZXJDYXNlKCksCisJCQkJCQl3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdCwKKwkJCQkJCWRlcHRoID0gd3JhcFswXSwKKwkJCQkJCWRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2IiksCisJCQkJCQlzYWZlQ2hpbGROb2RlcyA9IHNhZmVGcmFnbWVudC5jaGlsZE5vZGVzLAorCQkJCQkJcmVtb3ZlOworCisJCQkJCS8vIEFwcGVuZCB3cmFwcGVyIGVsZW1lbnQgdG8gdW5rbm93biBlbGVtZW50IHNhZmUgZG9jIGZyYWdtZW50CisJCQkJCWlmICggY29udGV4dCA9PT0gZG9jdW1lbnQgKSB7CisJCQkJCQkvLyBVc2UgdGhlIGZyYWdtZW50IHdlJ3ZlIGFscmVhZHkgY3JlYXRlZCBmb3IgdGhpcyBkb2N1bWVudAorCQkJCQkJc2FmZUZyYWdtZW50LmFwcGVuZENoaWxkKCBkaXYgKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIFVzZSBhIGZyYWdtZW50IGNyZWF0ZWQgd2l0aCB0aGUgb3duZXIgZG9jdW1lbnQKKwkJCQkJCWNyZWF0ZVNhZmVGcmFnbWVudCggY29udGV4dCApLmFwcGVuZENoaWxkKCBkaXYgKTsKKwkJCQkJfQorCisJCQkJCS8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnMKKwkJCQkJZGl2LmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtICsgd3JhcFsyXTsKKworCQkJCQkvLyBNb3ZlIHRvIHRoZSByaWdodCBkZXB0aAorCQkJCQl3aGlsZSAoIGRlcHRoLS0gKSB7CisJCQkJCQlkaXYgPSBkaXYubGFzdENoaWxkOworCQkJCQl9CisKKwkJCQkJLy8gUmVtb3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0YWJsZSBmcmFnbWVudHMKKwkJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQudGJvZHkgKSB7CisKKwkJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KKwkJCQkJCXZhciBoYXNCb2R5ID0gcnRib2R5LnRlc3QoZWxlbSksCisJCQkJCQkJdGJvZHkgPSB0YWcgPT09ICJ0YWJsZSIgJiYgIWhhc0JvZHkgPworCQkJCQkJCQlkaXYuZmlyc3RDaGlsZCAmJiBkaXYuZmlyc3RDaGlsZC5jaGlsZE5vZGVzIDoKKworCQkJCQkJCQkvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KKwkJCQkJCQkJd3JhcFsxXSA9PT0gIjx0YWJsZT4iICYmICFoYXNCb2R5ID8KKwkJCQkJCQkJCWRpdi5jaGlsZE5vZGVzIDoKKwkJCQkJCQkJCVtdOworCisJCQkJCQlmb3IgKCBqID0gdGJvZHkubGVuZ3RoIC0gMTsgaiA+PSAwIDsgLS1qICkgeworCQkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKSB7CisJCQkJCQkJCXRib2R5WyBqIF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGJvZHlbIGogXSApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQKKwkJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgJiYgcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIGVsZW0gKSApIHsKKwkJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIHJsZWFkaW5nV2hpdGVzcGFjZS5leGVjKGVsZW0pWzBdICksIGRpdi5maXJzdENoaWxkICk7CisJCQkJCX0KKworCQkJCQllbGVtID0gZGl2LmNoaWxkTm9kZXM7CisKKwkJCQkJLy8gQ2xlYXIgZWxlbWVudHMgZnJvbSBEb2N1bWVudEZyYWdtZW50IChzYWZlRnJhZ21lbnQgb3Igb3RoZXJ3aXNlKQorCQkJCQkvLyB0byBhdm9pZCBob2FyZGluZyBlbGVtZW50cy4gRml4ZXMgIzExMzU2CisJCQkJCWlmICggZGl2ICkgeworCQkJCQkJZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApOworCisJCQkJCQkvLyBHdWFyZCBhZ2FpbnN0IC0xIGluZGV4IGV4Y2VwdGlvbnMgaW4gRkYzLjYKKwkJCQkJCWlmICggc2FmZUNoaWxkTm9kZXMubGVuZ3RoID4gMCApIHsKKwkJCQkJCQlyZW1vdmUgPSBzYWZlQ2hpbGROb2Rlc1sgc2FmZUNoaWxkTm9kZXMubGVuZ3RoIC0gMSBdOworCisJCQkJCQkJaWYgKCByZW1vdmUgJiYgcmVtb3ZlLnBhcmVudE5vZGUgKSB7CisJCQkJCQkJCXJlbW92ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByZW1vdmUgKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIFJlc2V0cyBkZWZhdWx0Q2hlY2tlZCBmb3IgYW55IHJhZGlvcyBhbmQgY2hlY2tib3hlcworCQkJLy8gYWJvdXQgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIERPTSBpbiBJRSA2LzcgKCM4MDYwKQorCQkJdmFyIGxlbjsKKwkJCWlmICggIWpRdWVyeS5zdXBwb3J0LmFwcGVuZENoZWNrZWQgKSB7CisJCQkJaWYgKCBlbGVtWzBdICYmIHR5cGVvZiAobGVuID0gZWxlbS5sZW5ndGgpID09PSAibnVtYmVyIiApIHsKKwkJCQkJZm9yICggaiA9IDA7IGogPCBsZW47IGorKyApIHsKKwkJCQkJCWZpbmRJbnB1dHMoIGVsZW1bal0gKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWZpbmRJbnB1dHMoIGVsZW0gKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICggZWxlbS5ub2RlVHlwZSApIHsKKwkJCQlyZXQucHVzaCggZWxlbSApOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSBqUXVlcnkubWVyZ2UoIHJldCwgZWxlbSApOworCQkJfQorCQl9CisKKwkJaWYgKCBmcmFnbWVudCApIHsKKwkJCWNoZWNrU2NyaXB0VHlwZSA9IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXJldHVybiAhZWxlbS50eXBlIHx8IHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSApOworCQkJfTsKKwkJCWZvciAoIGkgPSAwOyByZXRbaV07IGkrKyApIHsKKwkJCQlzY3JpcHQgPSByZXRbaV07CisJCQkJaWYgKCBzY3JpcHRzICYmIGpRdWVyeS5ub2RlTmFtZSggc2NyaXB0LCAic2NyaXB0IiApICYmICghc2NyaXB0LnR5cGUgfHwgcnNjcmlwdFR5cGUudGVzdCggc2NyaXB0LnR5cGUgKSkgKSB7CisJCQkJCXNjcmlwdHMucHVzaCggc2NyaXB0LnBhcmVudE5vZGUgPyBzY3JpcHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICkgOiBzY3JpcHQgKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCWlmICggc2NyaXB0Lm5vZGVUeXBlID09PSAxICkgeworCQkJCQkJdmFyIGpzVGFncyA9IGpRdWVyeS5ncmVwKCBzY3JpcHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJzY3JpcHQiICksIGNoZWNrU2NyaXB0VHlwZSApOworCisJCQkJCQlyZXQuc3BsaWNlLmFwcGx5KCByZXQsIFtpICsgMSwgMF0uY29uY2F0KCBqc1RhZ3MgKSApOworCQkJCQl9CisJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCBzY3JpcHQgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwljbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHsKKwkJdmFyIGRhdGEsIGlkLAorCQkJY2FjaGUgPSBqUXVlcnkuY2FjaGUsCisJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWwsCisJCQlkZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbzsKKworCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCWlmICggZWxlbS5ub2RlTmFtZSAmJiBqUXVlcnkubm9EYXRhW2VsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0gKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlkID0gZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKKworCQkJaWYgKCBpZCApIHsKKwkJCQlkYXRhID0gY2FjaGVbIGlkIF07CisKKwkJCQlpZiAoIGRhdGEgJiYgZGF0YS5ldmVudHMgKSB7CisJCQkJCWZvciAoIHZhciB0eXBlIGluIGRhdGEuZXZlbnRzICkgeworCQkJCQkJaWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7CisJCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApOworCisJCQkJCQkvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCS8vIE51bGwgdGhlIERPTSByZWZlcmVuY2UgdG8gYXZvaWQgSUU2LzcvOCBsZWFrICgjNzA1NCkKKwkJCQkJaWYgKCBkYXRhLmhhbmRsZSApIHsKKwkJCQkJCWRhdGEuaGFuZGxlLmVsZW0gPSBudWxsOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCBkZWxldGVFeHBhbmRvICkgeworCQkJCQlkZWxldGUgZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKKworCQkJCX0gZWxzZSBpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkgeworCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKKwkJCQl9CisKKwkJCQlkZWxldGUgY2FjaGVbIGlkIF07CisJCQl9CisJCX0KKwl9Cit9KTsKKworCisKKwordmFyIHJhbHBoYSA9IC9hbHBoYVwoW14pXSpcKS9pLAorCXJvcGFjaXR5ID0gL29wYWNpdHk9KFteKV0qKS8sCisJLy8gZml4ZWQgZm9yIElFOSwgc2VlICM4MzQ2CisJcnVwcGVyID0gLyhbQS1aXXxebXMpL2csCisJcm51bSA9IC9eW1wtK10/KD86XGQqXC4pP1xkKyQvaSwKKwlybnVtbm9ucHggPSAvXi0/KD86XGQqXC4pP1xkKyg/IXB4KVteXGRcc10rJC9pLAorCXJyZWxOdW0gPSAvXihbXC0rXSk9KFtcLSsuXGRlXSspLywKKwlybWFyZ2luID0gL15tYXJnaW4vLAorCisJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCisKKwkvLyBvcmRlciBpcyBpbXBvcnRhbnQhCisJY3NzRXhwYW5kID0gWyAiVG9wIiwgIlJpZ2h0IiwgIkJvdHRvbSIsICJMZWZ0IiBdLAorCisJY3VyQ1NTLAorCisJZ2V0Q29tcHV0ZWRTdHlsZSwKKwljdXJyZW50U3R5bGU7CisKK2pRdWVyeS5mbi5jc3MgPSBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKKwkJcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPworCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDoKKwkJCWpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTsKKwl9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTsKK307CisKK2pRdWVyeS5leHRlbmQoeworCS8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdAorCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQorCWNzc0hvb2tzOiB7CisJCW9wYWNpdHk6IHsKKwkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworCQkJCWlmICggY29tcHV0ZWQgKSB7CisJCQkJCS8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5CisJCQkJCXZhciByZXQgPSBjdXJDU1MoIGVsZW0sICJvcGFjaXR5IiApOworCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKKworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBlbGVtLnN0eWxlLm9wYWNpdHk7CisJCQkJfQorCQkJfQorCQl9CisJfSwKKworCS8vIEV4Y2x1ZGUgdGhlIGZvbGxvd2luZyBjc3MgcHJvcGVydGllcyB0byBhZGQgcHgKKwljc3NOdW1iZXI6IHsKKwkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKKwkJImZvbnRXZWlnaHQiOiB0cnVlLAorCQkibGluZUhlaWdodCI6IHRydWUsCisJCSJvcGFjaXR5IjogdHJ1ZSwKKwkJIm9ycGhhbnMiOiB0cnVlLAorCQkid2lkb3dzIjogdHJ1ZSwKKwkJInpJbmRleCI6IHRydWUsCisJCSJ6b29tIjogdHJ1ZQorCX0sCisKKwkvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlCisJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQorCWNzc1Byb3BzOiB7CisJCS8vIG5vcm1hbGl6ZSBmbG9hdCBjc3MgcHJvcGVydHkKKwkJImZsb2F0IjogalF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCisJfSwKKworCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCisJc3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7CisJCS8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQorCQl2YXIgcmV0LCB0eXBlLCBvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSwKKwkJCXN0eWxlID0gZWxlbS5zdHlsZSwgaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CisKKwkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCBvcmlnTmFtZTsKKworCQkvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWUKKwkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworCQkJdHlwZSA9IHR5cGVvZiB2YWx1ZTsKKworCQkJLy8gY29udmVydCByZWxhdGl2ZSBudW1iZXIgc3RyaW5ncyAoKz0gb3IgLT0pIHRvIHJlbGF0aXZlIG51bWJlcnMuICM3MzQ1CisJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICYmIChyZXQgPSBycmVsTnVtLmV4ZWMoIHZhbHVlICkpICkgeworCQkJCXZhbHVlID0gKCArKCByZXRbMV0gKyAxKSAqICtyZXRbMl0gKSArIHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKSApOworCQkJCS8vIEZpeGVzIGJ1ZyAjOTIzNworCQkJCXR5cGUgPSAibnVtYmVyIjsKKwkJCX0KKworCQkJLy8gTWFrZSBzdXJlIHRoYXQgTmFOIGFuZCBudWxsIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2CisJCQlpZiAoIHZhbHVlID09IG51bGwgfHwgdHlwZSA9PT0gIm51bWJlciIgJiYgaXNOYU4oIHZhbHVlICkgKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgJ3B4JyB0byB0aGUgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcykKKwkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7CisJCQkJdmFsdWUgKz0gInB4IjsKKwkJCX0KKworCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlCisJCQlpZiAoICFob29rcyB8fCAhKCJzZXQiIGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlICkpICE9PSB1bmRlZmluZWQgKSB7CisJCQkJLy8gV3JhcHBlZCB0byBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgZXJyb3JzIHdoZW4gJ2ludmFsaWQnIHZhbHVlcyBhcmUgcHJvdmlkZWQKKwkJCQkvLyBGaXhlcyBidWcgIzU1MDkKKwkJCQl0cnkgeworCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CisJCQkJfSBjYXRjaChlKSB7fQorCQkJfQorCisJCX0gZWxzZSB7CisJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKKwkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQkJLy8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3QKKwkJCXJldHVybiBzdHlsZVsgbmFtZSBdOworCQl9CisJfSwKKworCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhICkgeworCQl2YXIgcmV0LCBob29rczsKKworCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKKwkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTsKKwkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKKwkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IG5hbWU7CisKKwkJLy8gY3NzRmxvYXQgbmVlZHMgYSBzcGVjaWFsIHRyZWF0bWVudAorCQlpZiAoIG5hbWUgPT09ICJjc3NGbG9hdCIgKSB7CisJCQluYW1lID0gImZsb2F0IjsKKwkJfQorCisJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCisJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5lZCApIHsKKwkJCXJldHVybiByZXQ7CisKKwkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKKwkJfSBlbHNlIGlmICggY3VyQ1NTICkgeworCQkJcmV0dXJuIGN1ckNTUyggZWxlbSwgbmFtZSApOworCQl9CisJfSwKKworCS8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMKKwlzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7CisJCXZhciBvbGQgPSB7fSwKKwkJCXJldCwgbmFtZTsKKworCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKKwkJZm9yICggbmFtZSBpbiBvcHRpb25zICkgeworCQkJb2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07CisJCQllbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07CisJCX0KKworCQlyZXQgPSBjYWxsYmFjay5jYWxsKCBlbGVtICk7CisKKwkJLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzCisJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKKwkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOworCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9Cit9KTsKKworLy8gREVQUkVDQVRFRCBpbiAxLjMsIFVzZSBqUXVlcnkuY3NzKCkgaW5zdGVhZAoralF1ZXJ5LmN1ckNTUyA9IGpRdWVyeS5jc3M7CisKK2lmICggZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKKwlnZXRDb21wdXRlZFN0eWxlID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJCXZhciByZXQsIGRlZmF1bHRWaWV3LCBjb21wdXRlZFN0eWxlLCB3aWR0aCwKKwkJCXN0eWxlID0gZWxlbS5zdHlsZTsKKworCQluYW1lID0gbmFtZS5yZXBsYWNlKCBydXBwZXIsICItJDEiICkudG9Mb3dlckNhc2UoKTsKKworCQlpZiAoIChkZWZhdWx0VmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgJiYKKwkJCQkoY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKSkgKSB7CisKKwkJCXJldCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApOworCQkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGVsZW0gKSApIHsKKwkJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKKwkJCX0KKwkJfQorCisJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCisJCS8vIFdlYktpdCB1c2VzICJjb21wdXRlZCB2YWx1ZSAocGVyY2VudGFnZSBpZiBzcGVjaWZpZWQpIiBpbnN0ZWFkIG9mICJ1c2VkIHZhbHVlIiBmb3IgbWFyZ2lucworCQkvLyB3aGljaCBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOiBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzCisJCWlmICggIWpRdWVyeS5zdXBwb3J0LnBpeGVsTWFyZ2luICYmIGNvbXB1dGVkU3R5bGUgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICkgeworCQkJd2lkdGggPSBzdHlsZS53aWR0aDsKKwkJCXN0eWxlLndpZHRoID0gcmV0OworCQkJcmV0ID0gY29tcHV0ZWRTdHlsZS53aWR0aDsKKwkJCXN0eWxlLndpZHRoID0gd2lkdGg7CisJCX0KKworCQlyZXR1cm4gcmV0OworCX07Cit9CisKK2lmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSApIHsKKwljdXJyZW50U3R5bGUgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKwkJdmFyIGxlZnQsIHJzTGVmdCwgdW5jb21wdXRlZCwKKwkJCXJldCA9IGVsZW0uY3VycmVudFN0eWxlICYmIGVsZW0uY3VycmVudFN0eWxlWyBuYW1lIF0sCisJCQlzdHlsZSA9IGVsZW0uc3R5bGU7CisKKwkJLy8gQXZvaWQgc2V0dGluZyByZXQgdG8gZW1wdHkgc3RyaW5nIGhlcmUKKwkJLy8gc28gd2UgZG9uJ3QgZGVmYXVsdCB0byBhdXRvCisJCWlmICggcmV0ID09IG51bGwgJiYgc3R5bGUgJiYgKHVuY29tcHV0ZWQgPSBzdHlsZVsgbmFtZSBdKSApIHsKKwkJCXJldCA9IHVuY29tcHV0ZWQ7CisJCX0KKworCQkvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCisJCS8vIGh0dHA6Ly9lcmlrLmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8jY29tbWVudC0xMDIyOTEKKworCQkvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhlbCBudW1iZXIKKwkJLy8gYnV0IGEgbnVtYmVyIHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5nLCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxzCisJCWlmICggcm51bW5vbnB4LnRlc3QoIHJldCApICkgeworCisJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCisJCQlsZWZ0ID0gc3R5bGUubGVmdDsKKwkJCXJzTGVmdCA9IGVsZW0ucnVudGltZVN0eWxlICYmIGVsZW0ucnVudGltZVN0eWxlLmxlZnQ7CisKKwkJCS8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKKwkJCWlmICggcnNMZWZ0ICkgeworCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OworCQkJfQorCQkJc3R5bGUubGVmdCA9IG5hbWUgPT09ICJmb250U2l6ZSIgPyAiMWVtIiA6IHJldDsKKwkJCXJldCA9IHN0eWxlLnBpeGVsTGVmdCArICJweCI7CisKKwkJCS8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXMKKwkJCXN0eWxlLmxlZnQgPSBsZWZ0OworCQkJaWYgKCByc0xlZnQgKSB7CisJCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IHJzTGVmdDsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQgPT09ICIiID8gImF1dG8iIDogcmV0OworCX07Cit9CisKK2N1ckNTUyA9IGdldENvbXB1dGVkU3R5bGUgfHwgY3VycmVudFN0eWxlOworCitmdW5jdGlvbiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApIHsKKworCS8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5CisJdmFyIHZhbCA9IG5hbWUgPT09ICJ3aWR0aCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQsCisJCWkgPSBuYW1lID09PSAid2lkdGgiID8gMSA6IDAsCisJCWxlbiA9IDQ7CisKKwlpZiAoIHZhbCA+IDAgKSB7CisJCWlmICggZXh0cmEgIT09ICJib3JkZXIiICkgeworCQkJZm9yICggOyBpIDwgbGVuOyBpICs9IDIgKSB7CisJCQkJaWYgKCAhZXh0cmEgKSB7CisJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSApICkgfHwgMDsKKwkJCQl9CisJCQkJaWYgKCBleHRyYSA9PT0gIm1hcmdpbiIgKSB7CisJCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIGNzc0V4cGFuZFsgaSBdICkgKSB8fCAwOworCQkJCX0gZWxzZSB7CisJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiApICkgfHwgMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gdmFsICsgInB4IjsKKwl9CisKKwkvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBpZiBuZWNlc3NhcnkKKwl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUgKTsKKwlpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7CisJCXZhbCA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKKwl9CisKKwkvLyBDb21wdXRlZCB1bml0IGlzIG5vdCBwaXhlbHMuIFN0b3AgaGVyZSBhbmQgcmV0dXJuLgorCWlmICggcm51bW5vbnB4LnRlc3QodmFsKSApIHsKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwkvLyBOb3JtYWxpemUgIiIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYQorCXZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7CisKKwkvLyBBZGQgcGFkZGluZywgYm9yZGVyLCBtYXJnaW4KKwlpZiAoIGV4dHJhICkgeworCQlmb3IgKCA7IGkgPCBsZW47IGkgKz0gMiApIHsKKwkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSApICkgfHwgMDsKKwkJCWlmICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKKwkJCQl2YWwgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIgKSApIHx8IDA7CisJCQl9CisJCQlpZiAoIGV4dHJhID09PSAibWFyZ2luIiApIHsKKwkJCQl2YWwgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBhbmRbIGkgXSkgKSB8fCAwOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHZhbCArICJweCI7Cit9CisKK2pRdWVyeS5lYWNoKFsgImhlaWdodCIsICJ3aWR0aCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisJalF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7CisJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKKwkJCWlmICggY29tcHV0ZWQgKSB7CisJCQkJaWYgKCBlbGVtLm9mZnNldFdpZHRoICE9PSAwICkgeworCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4galF1ZXJ5LnN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkgeworCQkJCQkJcmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7CisJCQkJCX0pOworCQkJCX0KKwkJCX0KKwkJfSwKKworCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKwkJCXJldHVybiBybnVtLnRlc3QoIHZhbHVlICkgPworCQkJCXZhbHVlICsgInB4IiA6CisJCQkJdmFsdWU7CisJCX0KKwl9OworfSk7CisKK2lmICggIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7CisJalF1ZXJ5LmNzc0hvb2tzLm9wYWNpdHkgPSB7CisJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworCQkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CisJCQlyZXR1cm4gcm9wYWNpdHkudGVzdCggKGNvbXB1dGVkICYmIGVsZW0uY3VycmVudFN0eWxlID8gZWxlbS5jdXJyZW50U3R5bGUuZmlsdGVyIDogZWxlbS5zdHlsZS5maWx0ZXIpIHx8ICIiICkgPworCQkJCSggcGFyc2VGbG9hdCggUmVnRXhwLiQxICkgLyAxMDAgKSArICIiIDoKKwkJCQljb21wdXRlZCA/ICIxIiA6ICIiOworCQl9LAorCisJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworCQkJdmFyIHN0eWxlID0gZWxlbS5zdHlsZSwKKwkJCQljdXJyZW50U3R5bGUgPSBlbGVtLmN1cnJlbnRTdHlsZSwKKwkJCQlvcGFjaXR5ID0galF1ZXJ5LmlzTnVtZXJpYyggdmFsdWUgKSA/ICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSAqIDEwMCArICIpIiA6ICIiLAorCQkJCWZpbHRlciA9IGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUuZmlsdGVyIHx8IHN0eWxlLmZpbHRlciB8fCAiIjsKKworCQkJLy8gSUUgaGFzIHRyb3VibGUgd2l0aCBvcGFjaXR5IGlmIGl0IGRvZXMgbm90IGhhdmUgbGF5b3V0CisJCQkvLyBGb3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsCisJCQlzdHlsZS56b29tID0gMTsKKworCQkJLy8gaWYgc2V0dGluZyBvcGFjaXR5IHRvIDEsIGFuZCBubyBvdGhlciBmaWx0ZXJzIGV4aXN0IC0gYXR0ZW1wdCB0byByZW1vdmUgZmlsdGVyIGF0dHJpYnV0ZSAjNjY1MgorCQkJaWYgKCB2YWx1ZSA+PSAxICYmIGpRdWVyeS50cmltKCBmaWx0ZXIucmVwbGFjZSggcmFscGhhLCAiIiApICkgPT09ICIiICkgeworCisJCQkJLy8gU2V0dGluZyBzdHlsZS5maWx0ZXIgdG8gbnVsbCwgIiIgJiAiICIgc3RpbGwgbGVhdmUgImZpbHRlcjoiIGluIHRoZSBjc3NUZXh0CisJCQkJLy8gaWYgImZpbHRlcjoiIGlzIHByZXNlbnQgYXQgYWxsLCBjbGVhclR5cGUgaXMgZGlzYWJsZWQsIHdlIHdhbnQgdG8gYXZvaWQgdGhpcworCQkJCS8vIHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSBpcyBJRSBPbmx5LCBidXQgc28gYXBwYXJlbnRseSBpcyB0aGlzIGNvZGUgcGF0aC4uLgorCQkJCXN0eWxlLnJlbW92ZUF0dHJpYnV0ZSggImZpbHRlciIgKTsKKworCQkJCS8vIGlmIHRoZXJlIHRoZXJlIGlzIG5vIGZpbHRlciBzdHlsZSBhcHBsaWVkIGluIGEgY3NzIHJ1bGUsIHdlIGFyZSBkb25lCisJCQkJaWYgKCBjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5maWx0ZXIgKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisKKwkJCS8vIG90aGVyd2lzZSwgc2V0IG5ldyBmaWx0ZXIgdmFsdWVzCisJCQlzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgPworCQkJCWZpbHRlci5yZXBsYWNlKCByYWxwaGEsIG9wYWNpdHkgKSA6CisJCQkJZmlsdGVyICsgIiAiICsgb3BhY2l0eTsKKwkJfQorCX07Cit9CisKK2pRdWVyeShmdW5jdGlvbigpIHsKKwkvLyBUaGlzIGhvb2sgY2Fubm90IGJlIGFkZGVkIHVudGlsIERPTSByZWFkeSBiZWNhdXNlIHRoZSBzdXBwb3J0IHRlc3QKKwkvLyBmb3IgaXQgaXMgbm90IHJ1biB1bnRpbCBhZnRlciBET00gcmVhZHkKKwlpZiAoICFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0ICkgeworCQlqUXVlcnkuY3NzSG9va3MubWFyZ2luUmlnaHQgPSB7CisJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKKwkJCQkvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHQKKwkJCQkvLyBXb3JrIGFyb3VuZCBieSB0ZW1wb3JhcmlseSBzZXR0aW5nIGVsZW1lbnQgZGlzcGxheSB0byBpbmxpbmUtYmxvY2sKKwkJCQlyZXR1cm4galF1ZXJ5LnN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJsb2NrIiB9LCBmdW5jdGlvbigpIHsKKwkJCQkJaWYgKCBjb21wdXRlZCApIHsKKwkJCQkJCXJldHVybiBjdXJDU1MoIGVsZW0sICJtYXJnaW4tcmlnaHQiICk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gZWxlbS5zdHlsZS5tYXJnaW5SaWdodDsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9OworCX0KK30pOworCitpZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7CisJalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHsKKwkJdmFyIHdpZHRoID0gZWxlbS5vZmZzZXRXaWR0aCwKKwkJCWhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OworCisJCXJldHVybiAoIHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCApIHx8ICghalF1ZXJ5LnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzICYmICgoZWxlbS5zdHlsZSAmJiBlbGVtLnN0eWxlLmRpc3BsYXkpIHx8IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApKSA9PT0gIm5vbmUiKTsKKwl9OworCisJalF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiAhalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4oIGVsZW0gKTsKKwl9OworfQorCisvLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCitqUXVlcnkuZWFjaCh7CisJbWFyZ2luOiAiIiwKKwlwYWRkaW5nOiAiIiwKKwlib3JkZXI6ICJXaWR0aCIKK30sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHsKKworCWpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7CisJCWV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkgeworCQkJdmFyIGksCisKKwkJCQkvLyBhc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKKwkJCQlwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgPyB2YWx1ZS5zcGxpdCgiICIpIDogWyB2YWx1ZSBdLAorCQkJCWV4cGFuZGVkID0ge307CisKKwkJCWZvciAoIGkgPSAwOyBpIDwgNDsgaSsrICkgeworCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KKwkJCQkJcGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdOworCQkJfQorCisJCQlyZXR1cm4gZXhwYW5kZWQ7CisJCX0KKwl9OworfSk7CisKKworCisKK3ZhciByMjAgPSAvJTIwL2csCisJcmJyYWNrZXQgPSAvXFtcXSQvLAorCXJDUkxGID0gL1xyP1xuL2csCisJcmhhc2ggPSAvIy4qJC8sCisJcmhlYWRlcnMgPSAvXiguKj8pOlsgXHRdKihbXlxyXG5dKilccj8kL21nLCAvLyBJRSBsZWF2ZXMgYW4gXHIgY2hhcmFjdGVyIGF0IEVPTAorCXJpbnB1dCA9IC9eKD86Y29sb3J8ZGF0ZXxkYXRldGltZXxkYXRldGltZS1sb2NhbHxlbWFpbHxoaWRkZW58bW9udGh8bnVtYmVyfHBhc3N3b3JkfHJhbmdlfHNlYXJjaHx0ZWx8dGV4dHx0aW1lfHVybHx3ZWVrKSQvaSwKKwkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KKwlybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcFwtc3RvcmFnZXwuK1wtZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCisJcm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sCisJcnByb3RvY29sID0gL15cL1wvLywKKwlycXVlcnkgPSAvXD8vLAorCXJzY3JpcHQgPSAvPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSwKKwlyc2VsZWN0VGV4dGFyZWEgPSAvXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSwKKwlyc3BhY2VzQWpheCA9IC9ccysvLAorCXJ0cyA9IC8oWz8mXSlfPVteJl0qLywKKwlydXJsID0gL14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLAorCisJLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZAorCV9sb2FkID0galF1ZXJ5LmZuLmxvYWQsCisKKwkvKiBQcmVmaWx0ZXJzCisJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKKwkgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOgorCSAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3BvcnQKKwkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCisJICogMykga2V5IGlzIHRoZSBkYXRhVHlwZQorCSAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkCisJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCisJICovCisJcHJlZmlsdGVycyA9IHt9LAorCisJLyogVHJhbnNwb3J0cyBiaW5kaW5ncworCSAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGUKKwkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAorCSAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvICIqIiBpZiBuZWVkZWQKKwkgKi8KKwl0cmFuc3BvcnRzID0ge30sCisKKwkvLyBEb2N1bWVudCBsb2NhdGlvbgorCWFqYXhMb2NhdGlvbiwKKworCS8vIERvY3VtZW50IGxvY2F0aW9uIHNlZ21lbnRzCisJYWpheExvY1BhcnRzLAorCisJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCisJYWxsVHlwZXMgPSBbIiovIl0gKyBbIioiXTsKKworLy8gIzgxMzgsIElFIG1heSB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcKKy8vIGEgZmllbGQgZnJvbSB3aW5kb3cubG9jYXRpb24gaWYgZG9jdW1lbnQuZG9tYWluIGhhcyBiZWVuIHNldAordHJ5IHsKKwlhamF4TG9jYXRpb24gPSBsb2NhdGlvbi5ocmVmOworfSBjYXRjaCggZSApIHsKKwkvLyBVc2UgdGhlIGhyZWYgYXR0cmlidXRlIG9mIGFuIEEgZWxlbWVudAorCS8vIHNpbmNlIElFIHdpbGwgbW9kaWZ5IGl0IGdpdmVuIGRvY3VtZW50LmxvY2F0aW9uCisJYWpheExvY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImEiICk7CisJYWpheExvY2F0aW9uLmhyZWYgPSAiIjsKKwlhamF4TG9jYXRpb24gPSBhamF4TG9jYXRpb24uaHJlZjsKK30KKworLy8gU2VnbWVudCBsb2NhdGlvbiBpbnRvIHBhcnRzCithamF4TG9jUGFydHMgPSBydXJsLmV4ZWMoIGFqYXhMb2NhdGlvbi50b0xvd2VyQ2FzZSgpICkgfHwgW107CisKKy8vIEJhc2UgImNvbnN0cnVjdG9yIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0CitmdW5jdGlvbiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSApIHsKKworCS8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gIioiCisJcmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7CisKKwkJaWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSAic3RyaW5nIiApIHsKKwkJCWZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247CisJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CisJCX0KKworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7CisJCQl2YXIgZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkuc3BsaXQoIHJzcGFjZXNBamF4ICksCisJCQkJaSA9IDAsCisJCQkJbGVuZ3RoID0gZGF0YVR5cGVzLmxlbmd0aCwKKwkJCQlkYXRhVHlwZSwKKwkJCQlsaXN0LAorCQkJCXBsYWNlQmVmb3JlOworCisJCQkvLyBGb3IgZWFjaCBkYXRhVHlwZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uCisJCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSBdOworCQkJCS8vIFdlIGNvbnRyb2wgaWYgd2UncmUgYXNrZWQgdG8gYWRkIGJlZm9yZQorCQkJCS8vIGFueSBleGlzdGluZyBlbGVtZW50CisJCQkJcGxhY2VCZWZvcmUgPSAvXlwrLy50ZXN0KCBkYXRhVHlwZSApOworCQkJCWlmICggcGxhY2VCZWZvcmUgKSB7CisJCQkJCWRhdGFUeXBlID0gZGF0YVR5cGUuc3Vic3RyKCAxICkgfHwgIioiOworCQkJCX0KKwkJCQlsaXN0ID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdOworCQkJCS8vIHRoZW4gd2UgYWRkIHRvIHRoZSBzdHJ1Y3R1cmUgYWNjb3JkaW5nbHkKKwkJCQlsaXN0WyBwbGFjZUJlZm9yZSA/ICJ1bnNoaWZ0IiA6ICJwdXNoIiBdKCBmdW5jICk7CisJCQl9CisJCX0KKwl9OworfQorCisvLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKK2Z1bmN0aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIsCisJCWRhdGFUeXBlIC8qIGludGVybmFsICovLCBpbnNwZWN0ZWQgLyogaW50ZXJuYWwgKi8gKSB7CisKKwlkYXRhVHlwZSA9IGRhdGFUeXBlIHx8IG9wdGlvbnMuZGF0YVR5cGVzWyAwIF07CisJaW5zcGVjdGVkID0gaW5zcGVjdGVkIHx8IHt9OworCisJaW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTsKKworCXZhciBsaXN0ID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdLAorCQlpID0gMCwKKwkJbGVuZ3RoID0gbGlzdCA/IGxpc3QubGVuZ3RoIDogMCwKKwkJZXhlY3V0ZU9ubHkgPSAoIHN0cnVjdHVyZSA9PT0gcHJlZmlsdGVycyApLAorCQlzZWxlY3Rpb247CisKKwlmb3IgKCA7IGkgPCBsZW5ndGggJiYgKCBleGVjdXRlT25seSB8fCAhc2VsZWN0aW9uICk7IGkrKyApIHsKKwkJc2VsZWN0aW9uID0gbGlzdFsgaSBdKCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7CisJCS8vIElmIHdlIGdvdCByZWRpcmVjdGVkIHRvIGFub3RoZXIgZGF0YVR5cGUKKwkJLy8gd2UgdHJ5IHRoZXJlIGlmIGV4ZWN1dGluZyBvbmx5IGFuZCBub3QgZG9uZSBhbHJlYWR5CisJCWlmICggdHlwZW9mIHNlbGVjdGlvbiA9PT0gInN0cmluZyIgKSB7CisJCQlpZiAoICFleGVjdXRlT25seSB8fCBpbnNwZWN0ZWRbIHNlbGVjdGlvbiBdICkgeworCQkJCXNlbGVjdGlvbiA9IHVuZGVmaW5lZDsKKwkJCX0gZWxzZSB7CisJCQkJb3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggc2VsZWN0aW9uICk7CisJCQkJc2VsZWN0aW9uID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoCisJCQkJCQlzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIsIHNlbGVjdGlvbiwgaW5zcGVjdGVkICk7CisJCQl9CisJCX0KKwl9CisJLy8gSWYgd2UncmUgb25seSBleGVjdXRpbmcgb3Igbm90aGluZyB3YXMgc2VsZWN0ZWQKKwkvLyB3ZSB0cnkgdGhlIGNhdGNoYWxsIGRhdGFUeXBlIGlmIG5vdCBkb25lIGFscmVhZHkKKwlpZiAoICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApICYmICFpbnNwZWN0ZWRbICIqIiBdICkgeworCQlzZWxlY3Rpb24gPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cygKKwkJCQlzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIsICIqIiwgaW5zcGVjdGVkICk7CisJfQorCS8vIHVubmVjZXNzYXJ5IHdoZW4gb25seSBleGVjdXRpbmcgKHByZWZpbHRlcnMpCisJLy8gYnV0IGl0J2xsIGJlIGlnbm9yZWQgYnkgdGhlIGNhbGxlciBpbiB0aGF0IGNhc2UKKwlyZXR1cm4gc2VsZWN0aW9uOworfQorCisvLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnMKKy8vIHRoYXQgdGFrZXMgImZsYXQiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKQorLy8gRml4ZXMgIzk4ODcKK2Z1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkgeworCXZhciBrZXksIGRlZXAsCisJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKKwlmb3IgKCBrZXkgaW4gc3JjICkgeworCQlpZiAoIHNyY1sga2V5IF0gIT09IHVuZGVmaW5lZCApIHsKKwkJCSggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07CisJCX0KKwl9CisJaWYgKCBkZWVwICkgeworCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKKwl9Cit9CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CisJCWlmICggdHlwZW9mIHVybCAhPT0gInN0cmluZyIgJiYgX2xvYWQgKSB7CisJCQlyZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCisJCS8vIERvbid0IGRvIGEgcmVxdWVzdCBpZiBubyBlbGVtZW50cyBhcmUgYmVpbmcgcmVxdWVzdGVkCisJCX0gZWxzZSBpZiAoICF0aGlzLmxlbmd0aCApIHsKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKKwkJaWYgKCBvZmYgPj0gMCApIHsKKwkJCXZhciBzZWxlY3RvciA9IHVybC5zbGljZSggb2ZmLCB1cmwubGVuZ3RoICk7CisJCQl1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApOworCQl9CisKKwkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CisJCXZhciB0eXBlID0gIkdFVCI7CisKKwkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCisJCWlmICggcGFyYW1zICkgeworCQkJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCisJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKKwkJCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjaworCQkJCWNhbGxiYWNrID0gcGFyYW1zOworCQkJCXBhcmFtcyA9IHVuZGVmaW5lZDsKKworCQkJLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZworCQkJfSBlbHNlIGlmICggdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CisJCQkJcGFyYW1zID0galF1ZXJ5LnBhcmFtKCBwYXJhbXMsIGpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwgKTsKKwkJCQl0eXBlID0gIlBPU1QiOworCQkJfQorCQl9CisKKwkJdmFyIHNlbGYgPSB0aGlzOworCisJCS8vIFJlcXVlc3QgdGhlIHJlbW90ZSBkb2N1bWVudAorCQlqUXVlcnkuYWpheCh7CisJCQl1cmw6IHVybCwKKwkJCXR5cGU6IHR5cGUsCisJCQlkYXRhVHlwZTogImh0bWwiLAorCQkJZGF0YTogcGFyYW1zLAorCQkJLy8gQ29tcGxldGUgY2FsbGJhY2sgKHJlc3BvbnNlVGV4dCBpcyB1c2VkIGludGVybmFsbHkpCisJCQljb21wbGV0ZTogZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMsIHJlc3BvbnNlVGV4dCApIHsKKwkJCQkvLyBTdG9yZSB0aGUgcmVzcG9uc2UgYXMgc3BlY2lmaWVkIGJ5IHRoZSBqcVhIUiBvYmplY3QKKwkJCQlyZXNwb25zZVRleHQgPSBqcVhIUi5yZXNwb25zZVRleHQ7CisJCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaW5qZWN0IHRoZSBIVE1MIGludG8gYWxsIHRoZSBtYXRjaGVkIGVsZW1lbnRzCisJCQkJaWYgKCBqcVhIUi5pc1Jlc29sdmVkKCkgKSB7CisJCQkJCS8vICM0ODI1OiBHZXQgdGhlIGFjdHVhbCByZXNwb25zZSBpbiBjYXNlCisJCQkJCS8vIGEgZGF0YUZpbHRlciBpcyBwcmVzZW50IGluIGFqYXhTZXR0aW5ncworCQkJCQlqcVhIUi5kb25lKGZ1bmN0aW9uKCByICkgeworCQkJCQkJcmVzcG9uc2VUZXh0ID0gcjsKKwkJCQkJfSk7CisJCQkJCS8vIFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQKKwkJCQkJc2VsZi5odG1sKCBzZWxlY3RvciA/CisJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cworCQkJCQkJalF1ZXJ5KCI8ZGl2PiIpCisJCQkJCQkJLy8gaW5qZWN0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgaW4sIHJlbW92aW5nIHRoZSBzY3JpcHRzCisJCQkJCQkJLy8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFCisJCQkJCQkJLmFwcGVuZChyZXNwb25zZVRleHQucmVwbGFjZShyc2NyaXB0LCAiIikpCisKKwkJCQkJCQkvLyBMb2NhdGUgdGhlIHNwZWNpZmllZCBlbGVtZW50cworCQkJCQkJCS5maW5kKHNlbGVjdG9yKSA6CisKKwkJCQkJCS8vIElmIG5vdCwganVzdCBpbmplY3QgdGhlIGZ1bGwgcmVzdWx0CisJCQkJCQlyZXNwb25zZVRleHQgKTsKKwkJCQl9CisKKwkJCQlpZiAoIGNhbGxiYWNrICkgeworCQkJCQlzZWxmLmVhY2goIGNhbGxiYWNrLCBbIHJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CisJCQkJfQorCQkJfQorCQl9KTsKKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7CisJfSwKKworCXNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gdGhpcy5lbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIHRoaXMuZWxlbWVudHMgKSA6IHRoaXM7CisJCX0pCisJCS5maWx0ZXIoZnVuY3Rpb24oKXsKKwkJCXJldHVybiB0aGlzLm5hbWUgJiYgIXRoaXMuZGlzYWJsZWQgJiYKKwkJCQkoIHRoaXMuY2hlY2tlZCB8fCByc2VsZWN0VGV4dGFyZWEudGVzdCggdGhpcy5ub2RlTmFtZSApIHx8CisJCQkJCXJpbnB1dC50ZXN0KCB0aGlzLnR5cGUgKSApOworCQl9KQorCQkubWFwKGZ1bmN0aW9uKCBpLCBlbGVtICl7CisJCQl2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7CisKKwkJCXJldHVybiB2YWwgPT0gbnVsbCA/CisJCQkJbnVsbCA6CisJCQkJalF1ZXJ5LmlzQXJyYXkoIHZhbCApID8KKwkJCQkJalF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsLCBpICl7CisJCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CisJCQkJCX0pIDoKKwkJCQkJeyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CisJCX0pLmdldCgpOworCX0KK30pOworCisvLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cworalF1ZXJ5LmVhY2goICJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoICIgIiApLCBmdW5jdGlvbiggaSwgbyApeworCWpRdWVyeS5mblsgbyBdID0gZnVuY3Rpb24oIGYgKXsKKwkJcmV0dXJuIHRoaXMub24oIG8sIGYgKTsKKwl9OworfSk7CisKK2pRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKKwlqUXVlcnlbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7CisJCS8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKKwkJCXR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrOworCQkJY2FsbGJhY2sgPSBkYXRhOworCQkJZGF0YSA9IHVuZGVmaW5lZDsKKwkJfQorCisJCXJldHVybiBqUXVlcnkuYWpheCh7CisJCQl0eXBlOiBtZXRob2QsCisJCQl1cmw6IHVybCwKKwkJCWRhdGE6IGRhdGEsCisJCQlzdWNjZXNzOiBjYWxsYmFjaywKKwkJCWRhdGFUeXBlOiB0eXBlCisJCX0pOworCX07Cit9KTsKKworalF1ZXJ5LmV4dGVuZCh7CisKKwlnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgeworCQlyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCAic2NyaXB0IiApOworCX0sCisKKwlnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOworCX0sCisKKwkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAorCS8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy4KKwkvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLgorCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CisJCWlmICggc2V0dGluZ3MgKSB7CisJCQkvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdAorCQkJYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICk7CisJCX0gZWxzZSB7CisJCQkvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzCisJCQlzZXR0aW5ncyA9IHRhcmdldDsKKwkJCXRhcmdldCA9IGpRdWVyeS5hamF4U2V0dGluZ3M7CisJCX0KKwkJYWpheEV4dGVuZCggdGFyZ2V0LCBzZXR0aW5ncyApOworCQlyZXR1cm4gdGFyZ2V0OworCX0sCisKKwlhamF4U2V0dGluZ3M6IHsKKwkJdXJsOiBhamF4TG9jYXRpb24sCisJCWlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGFqYXhMb2NQYXJ0c1sgMSBdICksCisJCWdsb2JhbDogdHJ1ZSwKKwkJdHlwZTogIkdFVCIsCisJCWNvbnRlbnRUeXBlOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IiwKKwkJcHJvY2Vzc0RhdGE6IHRydWUsCisJCWFzeW5jOiB0cnVlLAorCQkvKgorCQl0aW1lb3V0OiAwLAorCQlkYXRhOiBudWxsLAorCQlkYXRhVHlwZTogbnVsbCwKKwkJdXNlcm5hbWU6IG51bGwsCisJCXBhc3N3b3JkOiBudWxsLAorCQljYWNoZTogbnVsbCwKKwkJdHJhZGl0aW9uYWw6IGZhbHNlLAorCQloZWFkZXJzOiB7fSwKKwkJKi8KKworCQlhY2NlcHRzOiB7CisJCQl4bWw6ICJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIiwKKwkJCWh0bWw6ICJ0ZXh0L2h0bWwiLAorCQkJdGV4dDogInRleHQvcGxhaW4iLAorCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCisJCQkiKiI6IGFsbFR5cGVzCisJCX0sCisKKwkJY29udGVudHM6IHsKKwkJCXhtbDogL3htbC8sCisJCQlodG1sOiAvaHRtbC8sCisJCQlqc29uOiAvanNvbi8KKwkJfSwKKworCQlyZXNwb25zZUZpZWxkczogeworCQkJeG1sOiAicmVzcG9uc2VYTUwiLAorCQkJdGV4dDogInJlc3BvbnNlVGV4dCIKKwkJfSwKKworCQkvLyBMaXN0IG9mIGRhdGEgY29udmVydGVycworCQkvLyAxKSBrZXkgZm9ybWF0IGlzICJzb3VyY2VfdHlwZSBkZXN0aW5hdGlvbl90eXBlIiAoYSBzaW5nbGUgc3BhY2UgaW4tYmV0d2VlbikKKwkJLy8gMikgdGhlIGNhdGNoYWxsIHN5bWJvbCAiKiIgY2FuIGJlIHVzZWQgZm9yIHNvdXJjZV90eXBlCisJCWNvbnZlcnRlcnM6IHsKKworCQkJLy8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0CisJCQkiKiB0ZXh0Ijogd2luZG93LlN0cmluZywKKworCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCisJCQkidGV4dCBodG1sIjogdHJ1ZSwKKworCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgorCQkJInRleHQganNvbiI6IGpRdWVyeS5wYXJzZUpTT04sCisKKwkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCisJCQkidGV4dCB4bWwiOiBqUXVlcnkucGFyc2VYTUwKKwkJfSwKKworCQkvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOgorCQkvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmCisJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCisJCS8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKQorCQlmbGF0T3B0aW9uczogeworCQkJY29udGV4dDogdHJ1ZSwKKwkJCXVybDogdHJ1ZQorCQl9CisJfSwKKworCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAorCWFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLAorCisJLy8gTWFpbiBtZXRob2QKKwlhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkgeworCisJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCisJCWlmICggdHlwZW9mIHVybCA9PT0gIm9iamVjdCIgKSB7CisJCQlvcHRpb25zID0gdXJsOworCQkJdXJsID0gdW5kZWZpbmVkOworCQl9CisKKwkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKKwkJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisKKwkJdmFyIC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKKwkJCXMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLAorCQkJLy8gQ2FsbGJhY2tzIGNvbnRleHQKKwkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAorCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cworCQkJLy8gSXQncyB0aGUgY2FsbGJhY2tDb250ZXh0IGlmIG9uZSB3YXMgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbnMKKwkJCS8vIGFuZCBpZiBpdCdzIGEgRE9NIG5vZGUgb3IgYSBqUXVlcnkgY29sbGVjdGlvbgorCQkJZ2xvYmFsRXZlbnRDb250ZXh0ID0gY2FsbGJhY2tDb250ZXh0ICE9PSBzICYmCisJCQkJKCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ICkgPworCQkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6IGpRdWVyeS5ldmVudCwKKwkJCS8vIERlZmVycmVkcworCQkJZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSwKKwkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCisJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcworCQkJc3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSwKKwkJCS8vIGlmTW9kaWZpZWQga2V5CisJCQlpZk1vZGlmaWVkS2V5LAorCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKKwkJCXJlcXVlc3RIZWFkZXJzID0ge30sCisJCQlyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sCisJCQkvLyBSZXNwb25zZSBoZWFkZXJzCisJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcsCisJCQlyZXNwb25zZUhlYWRlcnMsCisJCQkvLyB0cmFuc3BvcnQKKwkJCXRyYW5zcG9ydCwKKwkJCS8vIHRpbWVvdXQgaGFuZGxlCisJCQl0aW1lb3V0VGltZXIsCisJCQkvLyBDcm9zcy1kb21haW4gZGV0ZWN0aW9uIHZhcnMKKwkJCXBhcnRzLAorCQkJLy8gVGhlIGpxWEhSIHN0YXRlCisJCQlzdGF0ZSA9IDAsCisJCQkvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWQKKwkJCWZpcmVHbG9iYWxzLAorCQkJLy8gTG9vcCB2YXJpYWJsZQorCQkJaSwKKwkJCS8vIEZha2UgeGhyCisJCQlqcVhIUiA9IHsKKworCQkJCXJlYWR5U3RhdGU6IDAsCisKKwkJCQkvLyBDYWNoZXMgdGhlIGhlYWRlcgorCQkJCXNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKKwkJCQkJaWYgKCAhc3RhdGUgKSB7CisJCQkJCQl2YXIgbG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJCQkJCQluYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gfHwgbmFtZTsKKwkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdGhpczsKKwkJCQl9LAorCisJCQkJLy8gUmF3IHN0cmluZworCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CisJCQkJCXJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CisJCQkJfSwKKworCQkJCS8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0YWJsZSBpZiBuZWVkZWQKKwkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKKwkJCQkJdmFyIG1hdGNoOworCQkJCQlpZiAoIHN0YXRlID09PSAyICkgeworCQkJCQkJaWYgKCAhcmVzcG9uc2VIZWFkZXJzICkgeworCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OworCQkJCQkJCXdoaWxlKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKKwkJCQkJCQkJcmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCW1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdOworCQkJCQl9CisJCQkJCXJldHVybiBtYXRjaCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IG1hdGNoOworCQkJCX0sCisKKwkJCQkvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlcgorCQkJCW92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkgeworCQkJCQlpZiAoICFzdGF0ZSApIHsKKwkJCQkJCXMubWltZVR5cGUgPSB0eXBlOworCQkJCQl9CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0sCisKKwkJCQkvLyBDYW5jZWwgdGhlIHJlcXVlc3QKKwkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CisJCQkJCXN0YXR1c1RleHQgPSBzdGF0dXNUZXh0IHx8ICJhYm9ydCI7CisJCQkJCWlmICggdHJhbnNwb3J0ICkgeworCQkJCQkJdHJhbnNwb3J0LmFib3J0KCBzdGF0dXNUZXh0ICk7CisJCQkJCX0KKwkJCQkJZG9uZSggMCwgc3RhdHVzVGV4dCApOworCQkJCQlyZXR1cm4gdGhpczsKKwkJCQl9CisJCQl9OworCisJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQorCQkvLyBJdCBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBqc2xpbnQgY29tcGxhaW5zIGlmIGl0IGlzIGRlY2xhcmVkCisJCS8vIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uICh3aGljaCB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgYW5kIHJlYWRhYmxlKQorCQlmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHsKKworCQkJLy8gQ2FsbGVkIG9uY2UKKwkJCWlmICggc3RhdGUgPT09IDIgKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBTdGF0ZSBpcyAiZG9uZSIgbm93CisJCQlzdGF0ZSA9IDI7CisKKwkJCS8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzCisJCQlpZiAoIHRpbWVvdXRUaW1lciApIHsKKwkJCQljbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApOworCQkJfQorCisJCQkvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvbgorCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKKwkJCXRyYW5zcG9ydCA9IHVuZGVmaW5lZDsKKworCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycworCQkJcmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCAiIjsKKworCQkJLy8gU2V0IHJlYWR5U3RhdGUKKwkJCWpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7CisKKwkJCXZhciBpc1N1Y2Nlc3MsCisJCQkJc3VjY2VzcywKKwkJCQllcnJvciwKKwkJCQlzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dCwKKwkJCQlyZXNwb25zZSA9IHJlc3BvbnNlcyA/IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSA6IHVuZGVmaW5lZCwKKwkJCQlsYXN0TW9kaWZpZWQsCisJCQkJZXRhZzsKKworCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKKwkJCWlmICggc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQgKSB7CisKKwkJCQkvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLgorCQkJCWlmICggcy5pZk1vZGlmaWVkICkgeworCisJCQkJCWlmICggKCBsYXN0TW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggIkxhc3QtTW9kaWZpZWQiICkgKSApIHsKKwkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSA9IGxhc3RNb2RpZmllZDsKKwkJCQkJfQorCQkJCQlpZiAoICggZXRhZyA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCAiRXRhZyIgKSApICkgeworCQkJCQkJalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSA9IGV0YWc7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBJZiBub3QgbW9kaWZpZWQKKwkJCQlpZiAoIHN0YXR1cyA9PT0gMzA0ICkgeworCisJCQkJCXN0YXR1c1RleHQgPSAibm90bW9kaWZpZWQiOworCQkJCQlpc1N1Y2Nlc3MgPSB0cnVlOworCisJCQkJLy8gSWYgd2UgaGF2ZSBkYXRhCisJCQkJfSBlbHNlIHsKKworCQkJCQl0cnkgeworCQkJCQkJc3VjY2VzcyA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSApOworCQkJCQkJc3RhdHVzVGV4dCA9ICJzdWNjZXNzIjsKKwkJCQkJCWlzU3VjY2VzcyA9IHRydWU7CisJCQkJCX0gY2F0Y2goZSkgeworCQkJCQkJLy8gV2UgaGF2ZSBhIHBhcnNlcmVycm9yCisJCQkJCQlzdGF0dXNUZXh0ID0gInBhcnNlcmVycm9yIjsKKwkJCQkJCWVycm9yID0gZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gV2UgZXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQKKwkJCQkvLyB0aGVuIG5vcm1hbGl6ZSBzdGF0dXNUZXh0IGFuZCBzdGF0dXMgZm9yIG5vbi1hYm9ydHMKKwkJCQllcnJvciA9IHN0YXR1c1RleHQ7CisJCQkJaWYgKCAhc3RhdHVzVGV4dCB8fCBzdGF0dXMgKSB7CisJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOworCQkJCQlpZiAoIHN0YXR1cyA8IDAgKSB7CisJCQkJCQlzdGF0dXMgPSAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdAorCQkJanFYSFIuc3RhdHVzID0gc3RhdHVzOworCQkJanFYSFIuc3RhdHVzVGV4dCA9ICIiICsgKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKTsKKworCQkJLy8gU3VjY2Vzcy9FcnJvcgorCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CisJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7CisJCQl9IGVsc2UgeworCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOworCQkJfQorCisJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcworCQkJanFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOworCQkJc3RhdHVzQ29kZSA9IHVuZGVmaW5lZDsKKworCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKKwkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXgiICsgKCBpc1N1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRXJyb3IiICksCisJCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOworCQkJfQorCisJCQkvLyBDb21wbGV0ZQorCQkJY29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTsKKworCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKKwkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFsganFYSFIsIHMgXSApOworCQkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgorCQkJCWlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7CisJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gQXR0YWNoIGRlZmVycmVkcworCQlkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApOworCQlqcVhIUi5zdWNjZXNzID0ganFYSFIuZG9uZTsKKwkJanFYSFIuZXJyb3IgPSBqcVhIUi5mYWlsOworCQlqcVhIUi5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkOworCisJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCisJCWpxWEhSLnN0YXR1c0NvZGUgPSBmdW5jdGlvbiggbWFwICkgeworCQkJaWYgKCBtYXAgKSB7CisJCQkJdmFyIHRtcDsKKwkJCQlpZiAoIHN0YXRlIDwgMiApIHsKKwkJCQkJZm9yICggdG1wIGluIG1hcCApIHsKKwkJCQkJCXN0YXR1c0NvZGVbIHRtcCBdID0gWyBzdGF0dXNDb2RlW3RtcF0sIG1hcFt0bXBdIF07CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl0bXAgPSBtYXBbIGpxWEhSLnN0YXR1cyBdOworCQkJCQlqcVhIUi50aGVuKCB0bXAsIHRtcCApOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0aGlzOworCQl9OworCisJCS8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQorCQkvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkICgjNTg2NjogSUU3IGlzc3VlIHdpdGggcHJvdG9jb2wtbGVzcyB1cmxzKQorCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKKwkJcy51cmwgPSAoICggdXJsIHx8IHMudXJsICkgKyAiIiApLnJlcGxhY2UoIHJoYXNoLCAiIiApLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7CisKKwkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAorCQlzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkuc3BsaXQoIHJzcGFjZXNBamF4ICk7CisKKwkJLy8gRGV0ZXJtaW5lIGlmIGEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIKKwkJaWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7CisJCQlwYXJ0cyA9IHJ1cmwuZXhlYyggcy51cmwudG9Mb3dlckNhc2UoKSApOworCQkJcy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAmJgorCQkJCSggcGFydHNbIDEgXSAhPSBhamF4TG9jUGFydHNbIDEgXSB8fCBwYXJ0c1sgMiBdICE9IGFqYXhMb2NQYXJ0c1sgMiBdIHx8CisJCQkJCSggcGFydHNbIDMgXSB8fCAoIHBhcnRzWyAxIF0gPT09ICJodHRwOiIgPyA4MCA6IDQ0MyApICkgIT0KKwkJCQkJCSggYWpheExvY1BhcnRzWyAzIF0gfHwgKCBhamF4TG9jUGFydHNbIDEgXSA9PT0gImh0dHA6IiA/IDgwIDogNDQzICkgKSApCisJCQkpOworCQl9CisKKwkJLy8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCisJCWlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gInN0cmluZyIgKSB7CisJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOworCQl9CisKKwkJLy8gQXBwbHkgcHJlZmlsdGVycworCQlpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTsKKworCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQorCQlpZiAoIHN0YXRlID09PSAyICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG8KKwkJZmlyZUdsb2JhbHMgPSBzLmdsb2JhbDsKKworCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKKwkJcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7CisKKwkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKKwkJcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7CisKKwkJLy8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0cworCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0YXJ0IiApOworCQl9CisKKwkJLy8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnQKKwkJaWYgKCAhcy5oYXNDb250ZW50ICkgeworCisJCQkvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsCisJCQlpZiAoIHMuZGF0YSApIHsKKwkJCQlzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyBzLmRhdGE7CisJCQkJLy8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeQorCQkJCWRlbGV0ZSBzLmRhdGE7CisJCQl9CisKKwkJCS8vIEdldCBpZk1vZGlmaWVkS2V5IGJlZm9yZSBhZGRpbmcgdGhlIGFudGktY2FjaGUgcGFyYW1ldGVyCisJCQlpZk1vZGlmaWVkS2V5ID0gcy51cmw7CisKKwkJCS8vIEFkZCBhbnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWQKKwkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CisKKwkJCQl2YXIgdHMgPSBqUXVlcnkubm93KCksCisJCQkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYgaXQgaXMgdGhlcmUKKwkJCQkJcmV0ID0gcy51cmwucmVwbGFjZSggcnRzLCAiJDFfPSIgKyB0cyApOworCisJCQkJLy8gaWYgbm90aGluZyB3YXMgcmVwbGFjZWQsIGFkZCB0aW1lc3RhbXAgdG8gdGhlIGVuZAorCQkJCXMudXJsID0gcmV0ICsgKCAoIHJldCA9PT0gcy51cmwgKSA/ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyAiJiIgOiAiPyIgKSArICJfPSIgKyB0cyA6ICIiICk7CisJCQl9CisJCX0KKworCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKKwkJaWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7CisJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAiQ29udGVudC1UeXBlIiwgcy5jb250ZW50VHlwZSApOworCQl9CisKKwkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KKwkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CisJCQlpZk1vZGlmaWVkS2V5ID0gaWZNb2RpZmllZEtleSB8fCBzLnVybDsKKwkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgaWZNb2RpZmllZEtleSBdICkgeworCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApOworCQkJfQorCQkJaWYgKCBqUXVlcnkuZXRhZ1sgaWZNb2RpZmllZEtleSBdICkgeworCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApOworCQkJfQorCQl9CisKKwkJLy8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZQorCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAorCQkJIkFjY2VwdCIsCisJCQlzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSA/CisJCQkJcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdICsgKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CisJCQkJcy5hY2NlcHRzWyAiKiIgXQorCQkpOworCisJCS8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvbgorCQlmb3IgKCBpIGluIHMuaGVhZGVycyApIHsKKwkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7CisJCX0KKworCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CisJCWlmICggcy5iZWZvcmVTZW5kICYmICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHsKKwkJCQkvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5CisJCQkJanFYSFIuYWJvcnQoKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJfQorCisJCS8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkcworCQlmb3IgKCBpIGluIHsgc3VjY2VzczogMSwgZXJyb3I6IDEsIGNvbXBsZXRlOiAxIH0gKSB7CisJCQlqcVhIUlsgaSBdKCBzWyBpIF0gKTsKKwkJfQorCisJCS8vIEdldCB0cmFuc3BvcnQKKwkJdHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7CisKKwkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CisJCWlmICggIXRyYW5zcG9ydCApIHsKKwkJCWRvbmUoIC0xLCAiTm8gVHJhbnNwb3J0IiApOworCQl9IGVsc2UgeworCQkJanFYSFIucmVhZHlTdGF0ZSA9IDE7CisJCQkvLyBTZW5kIGdsb2JhbCBldmVudAorCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKKwkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CisJCQl9CisJCQkvLyBUaW1lb3V0CisJCQlpZiAoIHMuYXN5bmMgJiYgcy50aW1lb3V0ID4gMCApIHsKKwkJCQl0aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpeworCQkJCQlqcVhIUi5hYm9ydCggInRpbWVvdXQiICk7CisJCQkJfSwgcy50aW1lb3V0ICk7CisJCQl9CisKKwkJCXRyeSB7CisJCQkJc3RhdGUgPSAxOworCQkJCXRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApOworCQkJfSBjYXRjaCAoZSkgeworCQkJCS8vIFByb3BhZ2F0ZSBleGNlcHRpb24gYXMgZXJyb3IgaWYgbm90IGRvbmUKKwkJCQlpZiAoIHN0YXRlIDwgMiApIHsKKwkJCQkJZG9uZSggLTEsIGUgKTsKKwkJCQkvLyBTaW1wbHkgcmV0aHJvdyBvdGhlcndpc2UKKwkJCQl9IGVsc2UgeworCQkJCQl0aHJvdyBlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBqcVhIUjsKKwl9LAorCisJLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKKwkvLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmcKKwlwYXJhbTogZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkgeworCQl2YXIgcyA9IFtdLAorCQkJYWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CisJCQkJLy8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlCisJCQkJdmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiB2YWx1ZTsKKwkJCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKKwkJCX07CisKKwkJLy8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci4KKwkJaWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkgeworCQkJdHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsOworCQl9CisKKwkJLy8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy4KKwkJaWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHsKKwkJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cworCQkJalF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkgeworCQkJCWFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7CisJCQl9KTsKKworCQl9IGVsc2UgeworCQkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCisJCQkvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS4KKwkJCWZvciAoIHZhciBwcmVmaXggaW4gYSApIHsKKwkJCQlidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApOworCQkJfQorCQl9CisKKwkJLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvbgorCQlyZXR1cm4gcy5qb2luKCAiJiIgKS5yZXBsYWNlKCByMjAsICIrIiApOworCX0KK30pOworCitmdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7CisJaWYgKCBqUXVlcnkuaXNBcnJheSggb2JqICkgKSB7CisJCS8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLgorCQlqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHsKKwkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CisJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgorCQkJCWFkZCggcHJlZml4LCB2ICk7CisKKwkJCX0gZWxzZSB7CisJCQkJLy8gSWYgYXJyYXkgaXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzCisJCQkJLy8gbnVtZXJpYyBpbmRleCB0byByZXNvbHZlIGRlc2VyaWFsaXphdGlvbiBhbWJpZ3VpdHkgaXNzdWVzLgorCQkJCS8vIE5vdGUgdGhhdCByYWNrIChhcyBvZiAxLjAuMCkgY2FuJ3QgY3VycmVudGx5IGRlc2VyaWFsaXplCisJCQkJLy8gbmVzdGVkIGFycmF5cyBwcm9wZXJseSwgYW5kIGF0dGVtcHRpbmcgdG8gZG8gc28gbWF5IGNhdXNlCisJCQkJLy8gYSBzZXJ2ZXIgZXJyb3IuIFBvc3NpYmxlIGZpeGVzIGFyZSB0byBtb2RpZnkgcmFjaydzCisJCQkJLy8gZGVzZXJpYWxpemF0aW9uIGFsZ29yaXRobSBvciB0byBwcm92aWRlIGFuIG9wdGlvbiBvciBmbGFnCisJCQkJLy8gdG8gZm9yY2UgYXJyYXkgc2VyaWFsaXphdGlvbiB0byBiZSBzaGFsbG93LgorCQkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiA/IGkgOiAiIiApICsgIl0iLCB2LCB0cmFkaXRpb25hbCwgYWRkICk7CisJCQl9CisJCX0pOworCisJfSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CisJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KKwkJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgeworCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CisJCX0KKworCX0gZWxzZSB7CisJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KKwkJYWRkKCBwcmVmaXgsIG9iaiApOworCX0KK30KKworLy8gVGhpcyBpcyBzdGlsbCBvbiB0aGUgalF1ZXJ5IG9iamVjdC4uLiBmb3Igbm93CisvLyBXYW50IHRvIG1vdmUgdGhpcyB0byBqUXVlcnkuYWpheCBzb21lIGRheQoralF1ZXJ5LmV4dGVuZCh7CisKKwkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKKwlhY3RpdmU6IDAsCisKKwkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CisJbGFzdE1vZGlmaWVkOiB7fSwKKwlldGFnOiB7fQorCit9KTsKKworLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OgorICogLSBzZXRzIGFsbCByZXNwb25zZVhYWCBmaWVsZHMgYWNjb3JkaW5nbHkKKyAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCisgKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKKyAqLworZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKKworCXZhciBjb250ZW50cyA9IHMuY29udGVudHMsCisJCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLAorCQlyZXNwb25zZUZpZWxkcyA9IHMucmVzcG9uc2VGaWVsZHMsCisJCWN0LAorCQl0eXBlLAorCQlmaW5hbERhdGFUeXBlLAorCQlmaXJzdERhdGFUeXBlOworCisJLy8gRmlsbCByZXNwb25zZVhYWCBmaWVsZHMKKwlmb3IgKCB0eXBlIGluIHJlc3BvbnNlRmllbGRzICkgeworCQlpZiAoIHR5cGUgaW4gcmVzcG9uc2VzICkgeworCQkJanFYSFJbIHJlc3BvbnNlRmllbGRzW3R5cGVdIF0gPSByZXNwb25zZXNbIHR5cGUgXTsKKwkJfQorCX0KKworCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCisJd2hpbGUoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CisJCWRhdGFUeXBlcy5zaGlmdCgpOworCQlpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7CisJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJjb250ZW50LXR5cGUiICk7CisJCX0KKwl9CisKKwkvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGUKKwlpZiAoIGN0ICkgeworCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgeworCQkJaWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHsKKwkJCQlkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlCisJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CisJCWZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTsKKwl9IGVsc2UgeworCQkvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzCisJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgeworCQkJaWYgKCAhZGF0YVR5cGVzWyAwIF0gfHwgcy5jb252ZXJ0ZXJzWyB0eXBlICsgIiAiICsgZGF0YVR5cGVzWzBdIF0gKSB7CisJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgeworCQkJCWZpcnN0RGF0YVR5cGUgPSB0eXBlOworCQkJfQorCQl9CisJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQorCQlmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlOworCX0KKworCS8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGUKKwkvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZAorCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKKwlpZiAoIGZpbmFsRGF0YVR5cGUgKSB7CisJCWlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7CisJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOworCQl9CisJCXJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTsKKwl9Cit9CisKKy8vIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKK2Z1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSApIHsKKworCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCisJaWYgKCBzLmRhdGFGaWx0ZXIgKSB7CisJCXJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApOworCX0KKworCXZhciBkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKKwkJY29udmVydGVycyA9IHt9LAorCQlpLAorCQlrZXksCisJCWxlbmd0aCA9IGRhdGFUeXBlcy5sZW5ndGgsCisJCXRtcCwKKwkJLy8gQ3VycmVudCBhbmQgcHJldmlvdXMgZGF0YVR5cGVzCisJCWN1cnJlbnQgPSBkYXRhVHlwZXNbIDAgXSwKKwkJcHJldiwKKwkJLy8gQ29udmVyc2lvbiBleHByZXNzaW9uCisJCWNvbnZlcnNpb24sCisJCS8vIENvbnZlcnNpb24gZnVuY3Rpb24KKwkJY29udiwKKwkJLy8gQ29udmVyc2lvbiBmdW5jdGlvbnMgKHRyYW5zaXRpdmUgY29udmVyc2lvbikKKwkJY29udjEsCisJCWNvbnYyOworCisJLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGNoYWluCisJZm9yICggaSA9IDE7IGkgPCBsZW5ndGg7IGkrKyApIHsKKworCQkvLyBDcmVhdGUgY29udmVydGVycyBtYXAKKwkJLy8gd2l0aCBsb3dlcmNhc2VkIGtleXMKKwkJaWYgKCBpID09PSAxICkgeworCQkJZm9yICgga2V5IGluIHMuY29udmVydGVycyApIHsKKwkJCQlpZiAoIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgeworCQkJCQljb252ZXJ0ZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBrZXkgXTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBHZXQgdGhlIGRhdGFUeXBlcworCQlwcmV2ID0gY3VycmVudDsKKwkJY3VycmVudCA9IGRhdGFUeXBlc1sgaSBdOworCisJCS8vIElmIGN1cnJlbnQgaXMgYXV0byBkYXRhVHlwZSwgdXBkYXRlIGl0IHRvIHByZXYKKwkJaWYgKCBjdXJyZW50ID09PSAiKiIgKSB7CisJCQljdXJyZW50ID0gcHJldjsKKwkJLy8gSWYgbm8gYXV0byBhbmQgZGF0YVR5cGVzIGFyZSBhY3R1YWxseSBkaWZmZXJlbnQKKwkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CisKKwkJCS8vIEdldCB0aGUgY29udmVydGVyCisJCQljb252ZXJzaW9uID0gcHJldiArICIgIiArIGN1cnJlbnQ7CisJCQljb252ID0gY29udmVydGVyc1sgY29udmVyc2lvbiBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CisKKwkJCS8vIElmIHRoZXJlIGlzIG5vIGRpcmVjdCBjb252ZXJ0ZXIsIHNlYXJjaCB0cmFuc2l0aXZlbHkKKwkJCWlmICggIWNvbnYgKSB7CisJCQkJY29udjIgPSB1bmRlZmluZWQ7CisJCQkJZm9yICggY29udjEgaW4gY29udmVydGVycyApIHsKKwkJCQkJdG1wID0gY29udjEuc3BsaXQoICIgIiApOworCQkJCQlpZiAoIHRtcFsgMCBdID09PSBwcmV2IHx8IHRtcFsgMCBdID09PSAiKiIgKSB7CisJCQkJCQljb252MiA9IGNvbnZlcnRlcnNbIHRtcFsxXSArICIgIiArIGN1cnJlbnQgXTsKKwkJCQkJCWlmICggY29udjIgKSB7CisJCQkJCQkJY29udjEgPSBjb252ZXJ0ZXJzWyBjb252MSBdOworCQkJCQkJCWlmICggY29udjEgPT09IHRydWUgKSB7CisJCQkJCQkJCWNvbnYgPSBjb252MjsKKwkJCQkJCQl9IGVsc2UgaWYgKCBjb252MiA9PT0gdHJ1ZSApIHsKKwkJCQkJCQkJY29udiA9IGNvbnYxOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIElmIHdlIGZvdW5kIG5vIGNvbnZlcnRlciwgZGlzcGF0Y2ggYW4gZXJyb3IKKwkJCWlmICggISggY29udiB8fCBjb252MiApICkgeworCQkJCWpRdWVyeS5lcnJvciggIk5vIGNvbnZlcnNpb24gZnJvbSAiICsgY29udmVyc2lvbi5yZXBsYWNlKCIgIiwiIHRvICIpICk7CisJCQl9CisJCQkvLyBJZiBmb3VuZCBjb252ZXJ0ZXIgaXMgbm90IGFuIGVxdWl2YWxlbmNlCisJCQlpZiAoIGNvbnYgIT09IHRydWUgKSB7CisJCQkJLy8gQ29udmVydCB3aXRoIDEgb3IgMiBjb252ZXJ0ZXJzIGFjY29yZGluZ2x5CisJCQkJcmVzcG9uc2UgPSBjb252ID8gY29udiggcmVzcG9uc2UgKSA6IGNvbnYyKCBjb252MShyZXNwb25zZSkgKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmVzcG9uc2U7Cit9CisKKworCisKK3ZhciBqc2MgPSBqUXVlcnkubm93KCksCisJanNyZSA9IC8oXD0pXD8oJnwkKXxcP1w/L2k7CisKKy8vIERlZmF1bHQganNvbnAgc2V0dGluZ3MKK2pRdWVyeS5hamF4U2V0dXAoeworCWpzb25wOiAiY2FsbGJhY2siLAorCWpzb25wQ2FsbGJhY2s6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4galF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIGpzYysrICk7CisJfQorfSk7CisKKy8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0cworalF1ZXJ5LmFqYXhQcmVmaWx0ZXIoICJqc29uIGpzb25wIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkgeworCisJdmFyIGluc3BlY3REYXRhID0gKCB0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiApICYmIC9eYXBwbGljYXRpb25cL3hcLXd3d1wtZm9ybVwtdXJsZW5jb2RlZC8udGVzdCggcy5jb250ZW50VHlwZSApOworCisJaWYgKCBzLmRhdGFUeXBlc1sgMCBdID09PSAianNvbnAiIHx8CisJCXMuanNvbnAgIT09IGZhbHNlICYmICgganNyZS50ZXN0KCBzLnVybCApIHx8CisJCQkJaW5zcGVjdERhdGEgJiYganNyZS50ZXN0KCBzLmRhdGEgKSApICkgeworCisJCXZhciByZXNwb25zZUNvbnRhaW5lciwKKwkJCWpzb25wQ2FsbGJhY2sgPSBzLmpzb25wQ2FsbGJhY2sgPQorCQkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/IHMuanNvbnBDYWxsYmFjaygpIDogcy5qc29ucENhbGxiYWNrLAorCQkJcHJldmlvdXMgPSB3aW5kb3dbIGpzb25wQ2FsbGJhY2sgXSwKKwkJCXVybCA9IHMudXJsLAorCQkJZGF0YSA9IHMuZGF0YSwKKwkJCXJlcGxhY2UgPSAiJDEiICsganNvbnBDYWxsYmFjayArICIkMiI7CisKKwkJaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKKwkJCXVybCA9IHVybC5yZXBsYWNlKCBqc3JlLCByZXBsYWNlICk7CisJCQlpZiAoIHMudXJsID09PSB1cmwgKSB7CisJCQkJaWYgKCBpbnNwZWN0RGF0YSApIHsKKwkJCQkJZGF0YSA9IGRhdGEucmVwbGFjZSgganNyZSwgcmVwbGFjZSApOworCQkJCX0KKwkJCQlpZiAoIHMuZGF0YSA9PT0gZGF0YSApIHsKKwkJCQkJLy8gQWRkIGNhbGxiYWNrIG1hbnVhbGx5CisJCQkJCXVybCArPSAoL1w/Ly50ZXN0KCB1cmwgKSA/ICImIiA6ICI/IikgKyBzLmpzb25wICsgIj0iICsganNvbnBDYWxsYmFjazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlzLnVybCA9IHVybDsKKwkJcy5kYXRhID0gZGF0YTsKKworCQkvLyBJbnN0YWxsIGNhbGxiYWNrCisJCXdpbmRvd1sganNvbnBDYWxsYmFjayBdID0gZnVuY3Rpb24oIHJlc3BvbnNlICkgeworCQkJcmVzcG9uc2VDb250YWluZXIgPSBbIHJlc3BvbnNlIF07CisJCX07CisKKwkJLy8gQ2xlYW4tdXAgZnVuY3Rpb24KKwkJanFYSFIuYWx3YXlzKGZ1bmN0aW9uKCkgeworCQkJLy8gU2V0IGNhbGxiYWNrIGJhY2sgdG8gcHJldmlvdXMgdmFsdWUKKwkJCXdpbmRvd1sganNvbnBDYWxsYmFjayBdID0gcHJldmlvdXM7CisJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKKwkJCWlmICggcmVzcG9uc2VDb250YWluZXIgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHByZXZpb3VzICkgKSB7CisJCQkJd2luZG93WyBqc29ucENhbGxiYWNrIF0oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKKwkJCX0KKwkJfSk7CisKKwkJLy8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvbgorCQlzLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl0gPSBmdW5jdGlvbigpIHsKKwkJCWlmICggIXJlc3BvbnNlQ29udGFpbmVyICkgeworCQkJCWpRdWVyeS5lcnJvcigganNvbnBDYWxsYmFjayArICIgd2FzIG5vdCBjYWxsZWQiICk7CisJCQl9CisJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKKwkJfTsKKworCQkvLyBmb3JjZSBqc29uIGRhdGFUeXBlCisJCXMuZGF0YVR5cGVzWyAwIF0gPSAianNvbiI7CisKKwkJLy8gRGVsZWdhdGUgdG8gc2NyaXB0CisJCXJldHVybiAic2NyaXB0IjsKKwl9Cit9KTsKKworCisKKworLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKK2pRdWVyeS5hamF4U2V0dXAoeworCWFjY2VwdHM6IHsKKwkJc2NyaXB0OiAidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCisJfSwKKwljb250ZW50czogeworCQlzY3JpcHQ6IC9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvCisJfSwKKwljb252ZXJ0ZXJzOiB7CisJCSJ0ZXh0IHNjcmlwdCI6IGZ1bmN0aW9uKCB0ZXh0ICkgeworCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTsKKwkJCXJldHVybiB0ZXh0OworCQl9CisJfQorfSk7CisKKy8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgZ2xvYmFsCitqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgeworCWlmICggcy5jYWNoZSA9PT0gdW5kZWZpbmVkICkgeworCQlzLmNhY2hlID0gZmFsc2U7CisJfQorCWlmICggcy5jcm9zc0RvbWFpbiApIHsKKwkJcy50eXBlID0gIkdFVCI7CisJCXMuZ2xvYmFsID0gZmFsc2U7CisJfQorfSk7CisKKy8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydAoralF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbihzKSB7CisKKwkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCisJaWYgKCBzLmNyb3NzRG9tYWluICkgeworCisJCXZhciBzY3JpcHQsCisJCQloZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCisJCXJldHVybiB7CisKKwkJCXNlbmQ6IGZ1bmN0aW9uKCBfLCBjYWxsYmFjayApIHsKKworCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzY3JpcHQiICk7CisKKwkJCQlzY3JpcHQuYXN5bmMgPSAiYXN5bmMiOworCisJCQkJaWYgKCBzLnNjcmlwdENoYXJzZXQgKSB7CisJCQkJCXNjcmlwdC5jaGFyc2V0ID0gcy5zY3JpcHRDaGFyc2V0OworCQkJCX0KKworCQkJCXNjcmlwdC5zcmMgPSBzLnVybDsKKworCQkJCS8vIEF0dGFjaCBoYW5kbGVycyBmb3IgYWxsIGJyb3dzZXJzCisJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHsKKworCQkJCQlpZiAoIGlzQWJvcnQgfHwgIXNjcmlwdC5yZWFkeVN0YXRlIHx8IC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoIHNjcmlwdC5yZWFkeVN0YXRlICkgKSB7CisKKwkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQorCQkJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOworCisJCQkJCQkvLyBSZW1vdmUgdGhlIHNjcmlwdAorCQkJCQkJaWYgKCBoZWFkICYmIHNjcmlwdC5wYXJlbnROb2RlICkgeworCQkJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCQkJCQkJfQorCisJCQkJCQkvLyBEZXJlZmVyZW5jZSB0aGUgc2NyaXB0CisJCQkJCQlzY3JpcHQgPSB1bmRlZmluZWQ7CisKKwkJCQkJCS8vIENhbGxiYWNrIGlmIG5vdCBhYm9ydAorCQkJCQkJaWYgKCAhaXNBYm9ydCApIHsKKwkJCQkJCQljYWxsYmFjayggMjAwLCAic3VjY2VzcyIgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX07CisJCQkJLy8gVXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIGFwcGVuZENoaWxkICB0byBjaXJjdW12ZW50IGFuIElFNiBidWcuCisJCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSBhbmQgIzQzNzgpLgorCQkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOworCQkJfSwKKworCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgeworCQkJCWlmICggc2NyaXB0ICkgeworCQkJCQlzY3JpcHQub25sb2FkKCAwLCAxICk7CisJCQkJfQorCQkJfQorCQl9OworCX0KK30pOworCisKKworCit2YXIgLy8gIzUyODA6IEludGVybmV0IEV4cGxvcmVyIHdpbGwga2VlcCBjb25uZWN0aW9ucyBhbGl2ZSBpZiB3ZSBkb24ndCBhYm9ydCBvbiB1bmxvYWQKKwl4aHJPblVubG9hZEFib3J0ID0gd2luZG93LkFjdGl2ZVhPYmplY3QgPyBmdW5jdGlvbigpIHsKKwkJLy8gQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMKKwkJZm9yICggdmFyIGtleSBpbiB4aHJDYWxsYmFja3MgKSB7CisJCQl4aHJDYWxsYmFja3NbIGtleSBdKCAwLCAxICk7CisJCX0KKwl9IDogZmFsc2UsCisJeGhySWQgPSAwLAorCXhockNhbGxiYWNrczsKKworLy8gRnVuY3Rpb25zIHRvIGNyZWF0ZSB4aHJzCitmdW5jdGlvbiBjcmVhdGVTdGFuZGFyZFhIUigpIHsKKwl0cnkgeworCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOworCX0gY2F0Y2goIGUgKSB7fQorfQorCitmdW5jdGlvbiBjcmVhdGVBY3RpdmVYSFIoKSB7CisJdHJ5IHsKKwkJcmV0dXJuIG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCggIk1pY3Jvc29mdC5YTUxIVFRQIiApOworCX0gY2F0Y2goIGUgKSB7fQorfQorCisvLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0CisvLyAoVGhpcyBpcyBzdGlsbCBhdHRhY2hlZCB0byBhamF4U2V0dGluZ3MgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpCitqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ID8KKwkvKiBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CisJICogaW1wbGVtZW50IHRoZSBYTUxIdHRwUmVxdWVzdCBpbiBJRTcgKGNhbid0IHJlcXVlc3QgbG9jYWwgZmlsZXMpLAorCSAqIHNvIHdlIHVzZSB0aGUgQWN0aXZlWE9iamVjdCB3aGVuIGl0IGlzIGF2YWlsYWJsZQorCSAqIEFkZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQgaW4gSUU3L0lFOCBzbworCSAqIHdlIG5lZWQgYSBmYWxsYmFjay4KKwkgKi8KKwlmdW5jdGlvbigpIHsKKwkJcmV0dXJuICF0aGlzLmlzTG9jYWwgJiYgY3JlYXRlU3RhbmRhcmRYSFIoKSB8fCBjcmVhdGVBY3RpdmVYSFIoKTsKKwl9IDoKKwkvLyBGb3IgYWxsIG90aGVyIGJyb3dzZXJzLCB1c2UgdGhlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IG9iamVjdAorCWNyZWF0ZVN0YW5kYXJkWEhSOworCisvLyBEZXRlcm1pbmUgc3VwcG9ydCBwcm9wZXJ0aWVzCisoZnVuY3Rpb24oIHhociApIHsKKwlqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuc3VwcG9ydCwgeworCQlhamF4OiAhIXhociwKKwkJY29yczogISF4aHIgJiYgKCAid2l0aENyZWRlbnRpYWxzIiBpbiB4aHIgKQorCX0pOworfSkoIGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCkgKTsKKworLy8gQ3JlYXRlIHRyYW5zcG9ydCBpZiB0aGUgYnJvd3NlciBjYW4gcHJvdmlkZSBhbiB4aHIKK2lmICggalF1ZXJ5LnN1cHBvcnQuYWpheCApIHsKKworCWpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBzICkgeworCQkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CisJCWlmICggIXMuY3Jvc3NEb21haW4gfHwgalF1ZXJ5LnN1cHBvcnQuY29ycyApIHsKKworCQkJdmFyIGNhbGxiYWNrOworCisJCQlyZXR1cm4geworCQkJCXNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKKworCQkJCQkvLyBHZXQgYSBuZXcgeGhyCisJCQkJCXZhciB4aHIgPSBzLnhocigpLAorCQkJCQkJaGFuZGxlLAorCQkJCQkJaTsKKworCQkJCQkvLyBPcGVuIHRoZSBzb2NrZXQKKwkJCQkJLy8gUGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAoIzI4NjUpCisJCQkJCWlmICggcy51c2VybmFtZSApIHsKKwkJCQkJCXhoci5vcGVuKCBzLnR5cGUsIHMudXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkICk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYyApOworCQkJCQl9CisKKwkJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAorCQkJCQlpZiAoIHMueGhyRmllbGRzICkgeworCQkJCQkJZm9yICggaSBpbiBzLnhockZpZWxkcyApIHsKKwkJCQkJCQl4aHJbIGkgXSA9IHMueGhyRmllbGRzWyBpIF07CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkCisJCQkJCWlmICggcy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKKwkJCQkJCXhoci5vdmVycmlkZU1pbWVUeXBlKCBzLm1pbWVUeXBlICk7CisJCQkJCX0KKworCQkJCQkvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgorCQkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCisJCQkJCS8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuCisJCQkJCS8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQorCQkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KKwkJCQkJaWYgKCAhcy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1siWC1SZXF1ZXN0ZWQtV2l0aCJdICkgeworCQkJCQkJaGVhZGVyc1sgIlgtUmVxdWVzdGVkLVdpdGgiIF0gPSAiWE1MSHR0cFJlcXVlc3QiOworCQkJCQl9CisKKwkJCQkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMKKwkJCQkJdHJ5IHsKKwkJCQkJCWZvciAoIGkgaW4gaGVhZGVycyApIHsKKwkJCQkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7CisJCQkJCQl9CisJCQkJCX0gY2F0Y2goIF8gKSB7fQorCisJCQkJCS8vIERvIHNlbmQgdGhlIHJlcXVlc3QKKwkJCQkJLy8gVGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uIHdoaWNoIGlzIGFjdHVhbGx5CisJCQkJCS8vIGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQorCQkJCQl4aHIuc2VuZCggKCBzLmhhc0NvbnRlbnQgJiYgcy5kYXRhICkgfHwgbnVsbCApOworCisJCQkJCS8vIExpc3RlbmVyCisJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CisKKwkJCQkJCXZhciBzdGF0dXMsCisJCQkJCQkJc3RhdHVzVGV4dCwKKwkJCQkJCQlyZXNwb25zZUhlYWRlcnMsCisJCQkJCQkJcmVzcG9uc2VzLAorCQkJCQkJCXhtbDsKKworCQkJCQkJLy8gRmlyZWZveCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2luZyBwcm9wZXJ0aWVzCisJCQkJCQkvLyBvZiBhbiB4aHIgd2hlbiBhIG5ldHdvcmsgZXJyb3Igb2NjdXJlZAorCQkJCQkJLy8gaHR0cDovL2hlbHBmdWwua25vYnMtZGlhbHMuY29tL2luZGV4LnBocC9Db21wb25lbnRfcmV0dXJuZWRfZmFpbHVyZV9jb2RlOl8weDgwMDQwMTExXyhOU19FUlJPUl9OT1RfQVZBSUxBQkxFKQorCQkJCQkJdHJ5IHsKKworCQkJCQkJCS8vIFdhcyBuZXZlciBjYWxsZWQgYW5kIGlzIGFib3J0ZWQgb3IgY29tcGxldGUKKwkJCQkJCQlpZiAoIGNhbGxiYWNrICYmICggaXNBYm9ydCB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApICkgeworCisJCQkJCQkJCS8vIE9ubHkgY2FsbGVkIG9uY2UKKwkJCQkJCQkJY2FsbGJhY2sgPSB1bmRlZmluZWQ7CisKKwkJCQkJCQkJLy8gRG8gbm90IGtlZXAgYXMgYWN0aXZlIGFueW1vcmUKKwkJCQkJCQkJaWYgKCBoYW5kbGUgKSB7CisJCQkJCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0galF1ZXJ5Lm5vb3A7CisJCQkJCQkJCQlpZiAoIHhock9uVW5sb2FkQWJvcnQgKSB7CisJCQkJCQkJCQkJZGVsZXRlIHhockNhbGxiYWNrc1sgaGFuZGxlIF07CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKworCQkJCQkJCQkvLyBJZiBpdCdzIGFuIGFib3J0CisJCQkJCQkJCWlmICggaXNBYm9ydCApIHsKKwkJCQkJCQkJCS8vIEFib3J0IGl0IG1hbnVhbGx5IGlmIG5lZWRlZAorCQkJCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSAhPT0gNCApIHsKKwkJCQkJCQkJCQl4aHIuYWJvcnQoKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXN0YXR1cyA9IHhoci5zdGF0dXM7CisJCQkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisJCQkJCQkJCQlyZXNwb25zZXMgPSB7fTsKKwkJCQkJCQkJCXhtbCA9IHhoci5yZXNwb25zZVhNTDsKKworCQkJCQkJCQkJLy8gQ29uc3RydWN0IHJlc3BvbnNlIGxpc3QKKwkJCQkJCQkJCWlmICggeG1sICYmIHhtbC5kb2N1bWVudEVsZW1lbnQgLyogIzQ5NTggKi8gKSB7CisJCQkJCQkJCQkJcmVzcG9uc2VzLnhtbCA9IHhtbDsKKwkJCQkJCQkJCX0KKworCQkJCQkJCQkJLy8gV2hlbiByZXF1ZXN0aW5nIGJpbmFyeSBkYXRhLCBJRTYtOSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbgorCQkJCQkJCQkJLy8gb24gYW55IGF0dGVtcHQgdG8gYWNjZXNzIHJlc3BvbnNlVGV4dCAoIzExNDI2KQorCQkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCQlyZXNwb25zZXMudGV4dCA9IHhoci5yZXNwb25zZVRleHQ7CisJCQkJCQkJCQl9IGNhdGNoKCBfICkgeworCQkJCQkJCQkJfQorCisJCQkJCQkJCQkvLyBGaXJlZm94IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcKKwkJCQkJCQkJCS8vIHN0YXR1c1RleHQgZm9yIGZhdWx0eSBjcm9zcy1kb21haW4gcmVxdWVzdHMKKwkJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQkJc3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0OworCQkJCQkJCQkJfSBjYXRjaCggZSApIHsKKwkJCQkJCQkJCQkvLyBXZSBub3JtYWxpemUgd2l0aCBXZWJraXQgZ2l2aW5nIGFuIGVtcHR5IHN0YXR1c1RleHQKKwkJCQkJCQkJCQlzdGF0dXNUZXh0ID0gIiI7CisJCQkJCQkJCQl9CisKKwkJCQkJCQkJCS8vIEZpbHRlciBzdGF0dXMgZm9yIG5vbiBzdGFuZGFyZCBiZWhhdmlvcnMKKworCQkJCQkJCQkJLy8gSWYgdGhlIHJlcXVlc3QgaXMgbG9jYWwgYW5kIHdlIGhhdmUgZGF0YTogYXNzdW1lIGEgc3VjY2VzcworCQkJCQkJCQkJLy8gKHN1Y2Nlc3Mgd2l0aCBubyBkYXRhIHdvbid0IGdldCBub3RpZmllZCwgdGhhdCdzIHRoZSBiZXN0IHdlCisJCQkJCQkJCQkvLyBjYW4gZG8gZ2l2ZW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbnMpCisJCQkJCQkJCQlpZiAoICFzdGF0dXMgJiYgcy5pc0xvY2FsICYmICFzLmNyb3NzRG9tYWluICkgeworCQkJCQkJCQkJCXN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0OworCQkJCQkJCQkJLy8gSUUgLSAjMTQ1MDogc29tZXRpbWVzIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDQKKwkJCQkJCQkJCX0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMTIyMyApIHsKKwkJCQkJCQkJCQlzdGF0dXMgPSAyMDQ7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9IGNhdGNoKCBmaXJlZm94QWNjZXNzRXhjZXB0aW9uICkgeworCQkJCQkJCWlmICggIWlzQWJvcnQgKSB7CisJCQkJCQkJCWNvbXBsZXRlKCAtMSwgZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gQ2FsbCBjb21wbGV0ZSBpZiBuZWVkZWQKKwkJCQkJCWlmICggcmVzcG9uc2VzICkgeworCQkJCQkJCWNvbXBsZXRlKCBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzICk7CisJCQkJCQl9CisJCQkJCX07CisKKwkJCQkJLy8gaWYgd2UncmUgaW4gc3luYyBtb2RlIG9yIGl0J3MgaW4gY2FjaGUKKwkJCQkJLy8gYW5kIGhhcyBiZWVuIHJldHJpZXZlZCBkaXJlY3RseSAoSUU2ICYgSUU3KQorCQkJCQkvLyB3ZSBuZWVkIHRvIG1hbnVhbGx5IGZpcmUgdGhlIGNhbGxiYWNrCisJCQkJCWlmICggIXMuYXN5bmMgfHwgeGhyLnJlYWR5U3RhdGUgPT09IDQgKSB7CisJCQkJCQljYWxsYmFjaygpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaGFuZGxlID0gKyt4aHJJZDsKKwkJCQkJCWlmICggeGhyT25VbmxvYWRBYm9ydCApIHsKKwkJCQkJCQkvLyBDcmVhdGUgdGhlIGFjdGl2ZSB4aHJzIGNhbGxiYWNrcyBsaXN0IGlmIG5lZWRlZAorCQkJCQkJCS8vIGFuZCBhdHRhY2ggdGhlIHVubG9hZCBoYW5kbGVyCisJCQkJCQkJaWYgKCAheGhyQ2FsbGJhY2tzICkgeworCQkJCQkJCQl4aHJDYWxsYmFja3MgPSB7fTsKKwkJCQkJCQkJalF1ZXJ5KCB3aW5kb3cgKS51bmxvYWQoIHhock9uVW5sb2FkQWJvcnQgKTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gQWRkIHRvIGxpc3Qgb2YgYWN0aXZlIHhocnMgY2FsbGJhY2tzCisJCQkJCQkJeGhyQ2FsbGJhY2tzWyBoYW5kbGUgXSA9IGNhbGxiYWNrOworCQkJCQkJfQorCQkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrOworCQkJCQl9CisJCQkJfSwKKworCQkJCWFib3J0OiBmdW5jdGlvbigpIHsKKwkJCQkJaWYgKCBjYWxsYmFjayApIHsKKwkJCQkJCWNhbGxiYWNrKDAsMSk7CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQl9CisJfSk7Cit9CisKKworCisKK3ZhciBlbGVtZGlzcGxheSA9IHt9LAorCWlmcmFtZSwgaWZyYW1lRG9jLAorCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAorCXJmeG51bSA9IC9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksCisJdGltZXJJZCwKKwlmeEF0dHJzID0gWworCQkvLyBoZWlnaHQgYW5pbWF0aW9ucworCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCisJCS8vIHdpZHRoIGFuaW1hdGlvbnMKKwkJWyAid2lkdGgiLCAibWFyZ2luTGVmdCIsICJtYXJnaW5SaWdodCIsICJwYWRkaW5nTGVmdCIsICJwYWRkaW5nUmlnaHQiIF0sCisJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucworCQlbICJvcGFjaXR5IiBdCisJXSwKKwlmeE5vdzsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJc2hvdzogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgeworCQl2YXIgZWxlbSwgZGlzcGxheTsKKworCQlpZiAoIHNwZWVkIHx8IHNwZWVkID09PSAwICkgeworCQkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggZ2VuRngoInNob3ciLCAzKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKKworCQl9IGVsc2UgeworCQkJZm9yICggdmFyIGkgPSAwLCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKysgKSB7CisJCQkJZWxlbSA9IHRoaXNbIGkgXTsKKworCQkJCWlmICggZWxlbS5zdHlsZSApIHsKKwkJCQkJZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTsKKworCQkJCQkvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzCisJCQkJCS8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxlcyBvciBub3QKKwkJCQkJaWYgKCAhalF1ZXJ5Ll9kYXRhKGVsZW0sICJvbGRkaXNwbGF5IikgJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgeworCQkJCQkJZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSA9ICIiOworCQkJCQl9CisKKwkJCQkJLy8gU2V0IGVsZW1lbnRzIHdoaWNoIGhhdmUgYmVlbiBvdmVycmlkZGVuIHdpdGggZGlzcGxheTogbm9uZQorCQkJCQkvLyBpbiBhIHN0eWxlc2hlZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgYnJvd3NlciBzdHlsZSBpcworCQkJCQkvLyBmb3Igc3VjaCBhbiBlbGVtZW50CisJCQkJCWlmICggKGRpc3BsYXkgPT09ICIiICYmIGpRdWVyeS5jc3MoZWxlbSwgImRpc3BsYXkiKSA9PT0gIm5vbmUiKSB8fAorCQkJCQkJIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgZWxlbSApICkgeworCQkJCQkJalF1ZXJ5Ll9kYXRhKCBlbGVtLCAib2xkZGlzcGxheSIsIGRlZmF1bHREaXNwbGF5KGVsZW0ubm9kZU5hbWUpICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiBtb3N0IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wCisJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CisJCQlmb3IgKCBpID0gMDsgaSA8IGo7IGkrKyApIHsKKwkJCQllbGVtID0gdGhpc1sgaSBdOworCisJCQkJaWYgKCBlbGVtLnN0eWxlICkgeworCQkJCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OworCisJCQkJCWlmICggZGlzcGxheSA9PT0gIiIgfHwgZGlzcGxheSA9PT0gIm5vbmUiICkgeworCQkJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCAib2xkZGlzcGxheSIgKSB8fCAiIjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwl9LAorCisJaGlkZTogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgeworCQlpZiAoIHNwZWVkIHx8IHNwZWVkID09PSAwICkgeworCQkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggZ2VuRngoImhpZGUiLCAzKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOworCisJCX0gZWxzZSB7CisJCQl2YXIgZWxlbSwgZGlzcGxheSwKKwkJCQlpID0gMCwKKwkJCQlqID0gdGhpcy5sZW5ndGg7CisKKwkJCWZvciAoIDsgaSA8IGo7IGkrKyApIHsKKwkJCQllbGVtID0gdGhpc1tpXTsKKwkJCQlpZiAoIGVsZW0uc3R5bGUgKSB7CisJCQkJCWRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKTsKKworCQkJCQlpZiAoIGRpc3BsYXkgIT09ICJub25lIiAmJiAhalF1ZXJ5Ll9kYXRhKCBlbGVtLCAib2xkZGlzcGxheSIgKSApIHsKKwkJCQkJCWpRdWVyeS5fZGF0YSggZWxlbSwgIm9sZGRpc3BsYXkiLCBkaXNwbGF5ICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAorCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdworCQkJZm9yICggaSA9IDA7IGkgPCBqOyBpKysgKSB7CisJCQkJaWYgKCB0aGlzW2ldLnN0eWxlICkgeworCQkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKwkJfQorCX0sCisKKwkvLyBTYXZlIHRoZSBvbGQgdG9nZ2xlIGZ1bmN0aW9uCisJX3RvZ2dsZTogalF1ZXJ5LmZuLnRvZ2dsZSwKKworCXRvZ2dsZTogZnVuY3Rpb24oIGZuLCBmbjIsIGNhbGxiYWNrICkgeworCQl2YXIgYm9vbCA9IHR5cGVvZiBmbiA9PT0gImJvb2xlYW4iOworCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oZm4pICYmIGpRdWVyeS5pc0Z1bmN0aW9uKGZuMikgKSB7CisJCQl0aGlzLl90b2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCisJCX0gZWxzZSBpZiAoIGZuID09IG51bGwgfHwgYm9vbCApIHsKKwkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQl2YXIgc3RhdGUgPSBib29sID8gZm4gOiBqUXVlcnkodGhpcykuaXMoIjpoaWRkZW4iKTsKKwkJCQlqUXVlcnkodGhpcylbIHN0YXRlID8gInNob3ciIDogImhpZGUiIF0oKTsKKwkJCX0pOworCisJCX0gZWxzZSB7CisJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yLCBjYWxsYmFjayk7CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgeworCQlyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLCAwKS5zaG93KCkuZW5kKCkKKwkJCQkJLmFuaW1hdGUoe29wYWNpdHk6IHRvfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOworCX0sCisKKwlhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CisJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7CisKKwkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaCggb3B0YWxsLmNvbXBsZXRlLCBbIGZhbHNlIF0gKTsKKwkJfQorCisJCS8vIERvIG5vdCBjaGFuZ2UgcmVmZXJlbmNlZCBwcm9wZXJ0aWVzIGFzIHBlci1wcm9wZXJ0eSBlYXNpbmcgd2lsbCBiZSBsb3N0CisJCXByb3AgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApOworCisJCWZ1bmN0aW9uIGRvQW5pbWF0aW9uKCkgeworCQkJLy8gWFhYICd0aGlzJyBkb2VzIG5vdCBhbHdheXMgaGF2ZSBhIG5vZGVOYW1lIHdoZW4gcnVubmluZyB0aGUKKwkJCS8vIHRlc3Qgc3VpdGUKKworCQkJaWYgKCBvcHRhbGwucXVldWUgPT09IGZhbHNlICkgeworCQkJCWpRdWVyeS5fbWFyayggdGhpcyApOworCQkJfQorCisJCQl2YXIgb3B0ID0galF1ZXJ5LmV4dGVuZCgge30sIG9wdGFsbCApLAorCQkJCWlzRWxlbWVudCA9IHRoaXMubm9kZVR5cGUgPT09IDEsCisJCQkJaGlkZGVuID0gaXNFbGVtZW50ICYmIGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLAorCQkJCW5hbWUsIHZhbCwgcCwgZSwgaG9va3MsIHJlcGxhY2UsCisJCQkJcGFydHMsIHN0YXJ0LCBlbmQsIHVuaXQsCisJCQkJbWV0aG9kOworCisJCQkvLyB3aWxsIHN0b3JlIHBlciBwcm9wZXJ0eSBlYXNpbmcgYW5kIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gYW4gYW5pbWF0aW9uIGlzIGNvbXBsZXRlCisJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzID0ge307CisKKwkJCS8vIGZpcnN0IHBhc3Mgb3ZlciBwcm9wZXJ0eXMgdG8gZXhwYW5kIC8gbm9ybWFsaXplCisJCQlmb3IgKCBwIGluIHByb3AgKSB7CisJCQkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIHAgKTsKKwkJCQlpZiAoIHAgIT09IG5hbWUgKSB7CisJCQkJCXByb3BbIG5hbWUgXSA9IHByb3BbIHAgXTsKKwkJCQkJZGVsZXRlIHByb3BbIHAgXTsKKwkJCQl9CisKKwkJCQlpZiAoICggaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSApICYmICJleHBhbmQiIGluIGhvb2tzICkgeworCQkJCQlyZXBsYWNlID0gaG9va3MuZXhwYW5kKCBwcm9wWyBuYW1lIF0gKTsKKwkJCQkJZGVsZXRlIHByb3BbIG5hbWUgXTsKKworCQkJCQkvLyBub3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29udCBvdmVyd3JpdGUga2V5cyBhbHJlYWR5IHByZXNlbnQuCisJCQkJCS8vIGFsc28gLSByZXVzaW5nICdwJyBmcm9tIGFib3ZlIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCAibmFtZSIKKwkJCQkJZm9yICggcCBpbiByZXBsYWNlICkgeworCQkJCQkJaWYgKCAhICggcCBpbiBwcm9wICkgKSB7CisJCQkJCQkJcHJvcFsgcCBdID0gcmVwbGFjZVsgcCBdOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlmb3IgKCBuYW1lIGluIHByb3AgKSB7CisJCQkJdmFsID0gcHJvcFsgbmFtZSBdOworCQkJCS8vIGVhc2luZyByZXNvbHV0aW9uOiBwZXIgcHJvcGVydHkgPiBvcHQuc3BlY2lhbEVhc2luZyA+IG9wdC5lYXNpbmcgPiAnc3dpbmcnIChkZWZhdWx0KQorCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkgeworCQkJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzWyBuYW1lIF0gPSB2YWxbIDEgXTsKKwkJCQkJdmFsID0gcHJvcFsgbmFtZSBdID0gdmFsWyAwIF07CisJCQkJfSBlbHNlIHsKKwkJCQkJb3B0LmFuaW1hdGVkUHJvcGVydGllc1sgbmFtZSBdID0gb3B0LnNwZWNpYWxFYXNpbmcgJiYgb3B0LnNwZWNpYWxFYXNpbmdbIG5hbWUgXSB8fCBvcHQuZWFzaW5nIHx8ICdzd2luZyc7CisJCQkJfQorCisJCQkJaWYgKCB2YWwgPT09ICJoaWRlIiAmJiBoaWRkZW4gfHwgdmFsID09PSAic2hvdyIgJiYgIWhpZGRlbiApIHsKKwkJCQkJcmV0dXJuIG9wdC5jb21wbGV0ZS5jYWxsKCB0aGlzICk7CisJCQkJfQorCisJCQkJaWYgKCBpc0VsZW1lbnQgJiYgKCBuYW1lID09PSAiaGVpZ2h0IiB8fCBuYW1lID09PSAid2lkdGgiICkgKSB7CisJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dAorCQkJCQkvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90CisJCQkJCS8vIGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAorCQkJCQkvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQorCQkJCQlvcHQub3ZlcmZsb3cgPSBbIHRoaXMuc3R5bGUub3ZlcmZsb3csIHRoaXMuc3R5bGUub3ZlcmZsb3dYLCB0aGlzLnN0eWxlLm92ZXJmbG93WSBdOworCisJCQkJCS8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoCisJCQkJCS8vIGFuaW1hdGlvbnMgb24gaW5saW5lIGVsZW1lbnRzIHRoYXQgYXJlIGhhdmluZyB3aWR0aC9oZWlnaHQgYW5pbWF0ZWQKKwkJCQkJaWYgKCBqUXVlcnkuY3NzKCB0aGlzLCAiZGlzcGxheSIgKSA9PT0gImlubGluZSIgJiYKKwkJCQkJCQlqUXVlcnkuY3NzKCB0aGlzLCAiZmxvYXQiICkgPT09ICJub25lIiApIHsKKworCQkJCQkJLy8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxvY2s7CisJCQkJCQkvLyBibG9jay1sZXZlbCBlbGVtZW50cyBuZWVkIHRvIGJlIGlubGluZSB3aXRoIGxheW91dAorCQkJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCB8fCBkZWZhdWx0RGlzcGxheSggdGhpcy5ub2RlTmFtZSApID09PSAiaW5saW5lIiApIHsKKwkJCQkJCQl0aGlzLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lLWJsb2NrIjsKKworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aGlzLnN0eWxlLnpvb20gPSAxOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoIG9wdC5vdmVyZmxvdyAhPSBudWxsICkgeworCQkJCXRoaXMuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJCX0KKworCQkJZm9yICggcCBpbiBwcm9wICkgeworCQkJCWUgPSBuZXcgalF1ZXJ5LmZ4KCB0aGlzLCBvcHQsIHAgKTsKKwkJCQl2YWwgPSBwcm9wWyBwIF07CisKKwkJCQlpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbCApICkgeworCisJCQkJCS8vIFRyYWNrcyB3aGV0aGVyIHRvIHNob3cgb3IgaGlkZSBiYXNlZCBvbiBwcml2YXRlCisJCQkJCS8vIGRhdGEgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQKKwkJCQkJbWV0aG9kID0galF1ZXJ5Ll9kYXRhKCB0aGlzLCAidG9nZ2xlIiArIHAgKSB8fCAoIHZhbCA9PT0gInRvZ2dsZSIgPyBoaWRkZW4gPyAic2hvdyIgOiAiaGlkZSIgOiAwICk7CisJCQkJCWlmICggbWV0aG9kICkgeworCQkJCQkJalF1ZXJ5Ll9kYXRhKCB0aGlzLCAidG9nZ2xlIiArIHAsIG1ldGhvZCA9PT0gInNob3ciID8gImhpZGUiIDogInNob3ciICk7CisJCQkJCQllWyBtZXRob2QgXSgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZVsgdmFsIF0oKTsKKwkJCQkJfQorCisJCQkJfSBlbHNlIHsKKwkJCQkJcGFydHMgPSByZnhudW0uZXhlYyggdmFsICk7CisJCQkJCXN0YXJ0ID0gZS5jdXIoKTsKKworCQkJCQlpZiAoIHBhcnRzICkgeworCQkJCQkJZW5kID0gcGFyc2VGbG9hdCggcGFydHNbMl0gKTsKKwkJCQkJCXVuaXQgPSBwYXJ0c1szXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHAgXSA/ICIiIDogInB4IiApOworCisJCQkJCQkvLyBXZSBuZWVkIHRvIGNvbXB1dGUgc3RhcnRpbmcgdmFsdWUKKwkJCQkJCWlmICggdW5pdCAhPT0gInB4IiApIHsKKwkJCQkJCQlqUXVlcnkuc3R5bGUoIHRoaXMsIHAsIChlbmQgfHwgMSkgKyB1bml0KTsKKwkJCQkJCQlzdGFydCA9ICggKGVuZCB8fCAxKSAvIGUuY3VyKCkgKSAqIHN0YXJ0OworCQkJCQkJCWpRdWVyeS5zdHlsZSggdGhpcywgcCwgc3RhcnQgKyB1bml0KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCisJCQkJCQlpZiAoIHBhcnRzWzFdICkgeworCQkJCQkJCWVuZCA9ICggKHBhcnRzWyAxIF0gPT09ICItPSIgPyAtMSA6IDEpICogZW5kICkgKyBzdGFydDsKKwkJCQkJCX0KKworCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCBlbmQsIHVuaXQgKTsKKworCQkJCQl9IGVsc2UgeworCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCB2YWwsICIiICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIEZvciBKUyBzdHJpY3QgY29tcGxpYW5jZQorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/CisJCQl0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOgorCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOworCX0sCisKKwlzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHsKKwkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CisJCQlnb3RvRW5kID0gY2xlYXJRdWV1ZTsKKwkJCWNsZWFyUXVldWUgPSB0eXBlOworCQkJdHlwZSA9IHVuZGVmaW5lZDsKKwkJfQorCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CisJCQl0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7CisJCX0KKworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJdmFyIGluZGV4LAorCQkJCWhhZFRpbWVycyA9IGZhbHNlLAorCQkJCXRpbWVycyA9IGpRdWVyeS50aW1lcnMsCisJCQkJZGF0YSA9IGpRdWVyeS5fZGF0YSggdGhpcyApOworCisJCQkvLyBjbGVhciBtYXJrZXIgY291bnRlcnMgaWYgd2Uga25vdyB0aGV5IHdvbid0IGJlCisJCQlpZiAoICFnb3RvRW5kICkgeworCQkJCWpRdWVyeS5fdW5tYXJrKCB0cnVlLCB0aGlzICk7CisJCQl9CisKKwkJCWZ1bmN0aW9uIHN0b3BRdWV1ZSggZWxlbSwgZGF0YSwgaW5kZXggKSB7CisJCQkJdmFyIGhvb2tzID0gZGF0YVsgaW5kZXggXTsKKwkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgaW5kZXgsIHRydWUgKTsKKwkJCQlob29rcy5zdG9wKCBnb3RvRW5kICk7CisJCQl9CisKKwkJCWlmICggdHlwZSA9PSBudWxsICkgeworCQkJCWZvciAoIGluZGV4IGluIGRhdGEgKSB7CisJCQkJCWlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgaW5kZXguaW5kZXhPZigiLnJ1biIpID09PSBpbmRleC5sZW5ndGggLSA0ICkgeworCQkJCQkJc3RvcFF1ZXVlKCB0aGlzLCBkYXRhLCBpbmRleCApOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmICggZGF0YVsgaW5kZXggPSB0eXBlICsgIi5ydW4iIF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICl7CisJCQkJc3RvcFF1ZXVlKCB0aGlzLCBkYXRhLCBpbmRleCApOworCQkJfQorCisJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgeworCQkJCWlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgKHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUpICkgeworCQkJCQlpZiAoIGdvdG9FbmQgKSB7CisKKwkJCQkJCS8vIGZvcmNlIHRoZSBuZXh0IHN0ZXAgdG8gYmUgdGhlIGxhc3QKKwkJCQkJCXRpbWVyc1sgaW5kZXggXSggdHJ1ZSApOworCQkJCQl9IGVsc2UgeworCQkJCQkJdGltZXJzWyBpbmRleCBdLnNhdmVTdGF0ZSgpOworCQkJCQl9CisJCQkJCWhhZFRpbWVycyA9IHRydWU7CisJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CisJCQkJfQorCQkJfQorCisJCQkvLyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkCisJCQkvLyB0aW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1ZQorCQkJLy8gYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQKKwkJCWlmICggISggZ290b0VuZCAmJiBoYWRUaW1lcnMgKSApIHsKKwkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOworCQkJfQorCQl9KTsKKwl9CisKK30pOworCisvLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5CitmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKKwlzZXRUaW1lb3V0KCBjbGVhckZ4Tm93LCAwICk7CisJcmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkgKTsKK30KKworZnVuY3Rpb24gY2xlYXJGeE5vdygpIHsKKwlmeE5vdyA9IHVuZGVmaW5lZDsKK30KKworLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb24KK2Z1bmN0aW9uIGdlbkZ4KCB0eXBlLCBudW0gKSB7CisJdmFyIG9iaiA9IHt9OworCisJalF1ZXJ5LmVhY2goIGZ4QXR0cnMuY29uY2F0LmFwcGx5KFtdLCBmeEF0dHJzLnNsaWNlKCAwLCBudW0gKSksIGZ1bmN0aW9uKCkgeworCQlvYmpbIHRoaXMgXSA9IHR5cGU7CisJfSk7CisKKwlyZXR1cm4gb2JqOworfQorCisvLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zCitqUXVlcnkuZWFjaCh7CisJc2xpZGVEb3duOiBnZW5GeCggInNob3ciLCAxICksCisJc2xpZGVVcDogZ2VuRngoICJoaWRlIiwgMSApLAorCXNsaWRlVG9nZ2xlOiBnZW5GeCggInRvZ2dsZSIsIDEgKSwKKwlmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCisJZmFkZU91dDogeyBvcGFjaXR5OiAiaGlkZSIgfSwKKwlmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6ICJ0b2dnbGUiIH0KK30sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7CisJfTsKK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKwlzcGVlZDogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkgeworCQl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogeworCQkJY29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHwKKwkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKKwkJCWR1cmF0aW9uOiBzcGVlZCwKKwkJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZworCQl9OworCisJCW9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gIm51bWJlciIgPyBvcHQuZHVyYXRpb24gOgorCQkJb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgPyBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXSA6IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7CisKKwkJLy8gbm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gImZ4IgorCQlpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKKwkJCW9wdC5xdWV1ZSA9ICJmeCI7CisJCX0KKworCQkvLyBRdWV1ZWluZworCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOworCisJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCBub1VubWFyayApIHsKKwkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHsKKwkJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKKwkJCX0KKworCQkJaWYgKCBvcHQucXVldWUgKSB7CisJCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApOworCQkJfSBlbHNlIGlmICggbm9Vbm1hcmsgIT09IGZhbHNlICkgeworCQkJCWpRdWVyeS5fdW5tYXJrKCB0aGlzICk7CisJCQl9CisJCX07CisKKwkJcmV0dXJuIG9wdDsKKwl9LAorCisJZWFzaW5nOiB7CisJCWxpbmVhcjogZnVuY3Rpb24oIHAgKSB7CisJCQlyZXR1cm4gcDsKKwkJfSwKKwkJc3dpbmc6IGZ1bmN0aW9uKCBwICkgeworCQkJcmV0dXJuICggLU1hdGguY29zKCBwKk1hdGguUEkgKSAvIDIgKSArIDAuNTsKKwkJfQorCX0sCisKKwl0aW1lcnM6IFtdLAorCisJZng6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wICkgeworCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworCQl0aGlzLmVsZW0gPSBlbGVtOworCQl0aGlzLnByb3AgPSBwcm9wOworCisJCW9wdGlvbnMub3JpZyA9IG9wdGlvbnMub3JpZyB8fCB7fTsKKwl9CisKK30pOworCitqUXVlcnkuZngucHJvdG90eXBlID0geworCS8vIFNpbXBsZSBmdW5jdGlvbiBmb3Igc2V0dGluZyBhIHN0eWxlIHZhbHVlCisJdXBkYXRlOiBmdW5jdGlvbigpIHsKKwkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKKwkJCXRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTsKKwkJfQorCisJCSggalF1ZXJ5LmZ4LnN0ZXBbIHRoaXMucHJvcCBdIHx8IGpRdWVyeS5meC5zdGVwLl9kZWZhdWx0ICkoIHRoaXMgKTsKKwl9LAorCisJLy8gR2V0IHRoZSBjdXJyZW50IHNpemUKKwljdXI6IGZ1bmN0aW9uKCkgeworCQlpZiAoIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbIHRoaXMucHJvcCBdID09IG51bGwpICkgeworCQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CisJCX0KKworCQl2YXIgcGFyc2VkLAorCQkJciA9IGpRdWVyeS5jc3MoIHRoaXMuZWxlbSwgdGhpcy5wcm9wICk7CisJCS8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgImF1dG8iIGFyZSBjb252ZXJ0ZWQgdG8gMCwKKwkJLy8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyAicm90YXRlKDFyYWQpIiBhcmUgcmV0dXJuZWQgYXMgaXMsCisJCS8vIHNpbXBsZSB2YWx1ZXMgc3VjaCBhcyAiMTBweCIgYXJlIHBhcnNlZCB0byBGbG9hdC4KKwkJcmV0dXJuIGlzTmFOKCBwYXJzZWQgPSBwYXJzZUZsb2F0KCByICkgKSA/ICFyIHx8IHIgPT09ICJhdXRvIiA/IDAgOiByIDogcGFyc2VkOworCX0sCisKKwkvLyBTdGFydCBhbiBhbmltYXRpb24gZnJvbSBvbmUgbnVtYmVyIHRvIGFub3RoZXIKKwljdXN0b206IGZ1bmN0aW9uKCBmcm9tLCB0bywgdW5pdCApIHsKKwkJdmFyIHNlbGYgPSB0aGlzLAorCQkJZnggPSBqUXVlcnkuZng7CisKKwkJdGhpcy5zdGFydFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpOworCQl0aGlzLmVuZCA9IHRvOworCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQgPSBmcm9tOworCQl0aGlzLnBvcyA9IHRoaXMuc3RhdGUgPSAwOworCQl0aGlzLnVuaXQgPSB1bml0IHx8IHRoaXMudW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHRoaXMucHJvcCBdID8gIiIgOiAicHgiICk7CisKKwkJZnVuY3Rpb24gdCggZ290b0VuZCApIHsKKwkJCXJldHVybiBzZWxmLnN0ZXAoIGdvdG9FbmQgKTsKKwkJfQorCisJCXQucXVldWUgPSB0aGlzLm9wdGlvbnMucXVldWU7CisJCXQuZWxlbSA9IHRoaXMuZWxlbTsKKwkJdC5zYXZlU3RhdGUgPSBmdW5jdGlvbigpIHsKKwkJCWlmICggalF1ZXJ5Ll9kYXRhKCBzZWxmLmVsZW0sICJmeHNob3ciICsgc2VsZi5wcm9wICkgPT09IHVuZGVmaW5lZCApIHsKKwkJCQlpZiAoIHNlbGYub3B0aW9ucy5oaWRlICkgeworCQkJCQlqUXVlcnkuX2RhdGEoIHNlbGYuZWxlbSwgImZ4c2hvdyIgKyBzZWxmLnByb3AsIHNlbGYuc3RhcnQgKTsKKwkJCQl9IGVsc2UgaWYgKCBzZWxmLm9wdGlvbnMuc2hvdyApIHsKKwkJCQkJalF1ZXJ5Ll9kYXRhKCBzZWxmLmVsZW0sICJmeHNob3ciICsgc2VsZi5wcm9wLCBzZWxmLmVuZCApOworCQkJCX0KKwkJCX0KKwkJfTsKKworCQlpZiAoIHQoKSAmJiBqUXVlcnkudGltZXJzLnB1c2godCkgJiYgIXRpbWVySWQgKSB7CisJCQl0aW1lcklkID0gc2V0SW50ZXJ2YWwoIGZ4LnRpY2ssIGZ4LmludGVydmFsICk7CisJCX0KKwl9LAorCisJLy8gU2ltcGxlICdzaG93JyBmdW5jdGlvbgorCXNob3c6IGZ1bmN0aW9uKCkgeworCQl2YXIgZGF0YVNob3cgPSBqUXVlcnkuX2RhdGEoIHRoaXMuZWxlbSwgImZ4c2hvdyIgKyB0aGlzLnByb3AgKTsKKworCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkLCBzbyB0aGF0IHdlIGNhbiBnbyBiYWNrIHRvIGl0IGxhdGVyCisJCXRoaXMub3B0aW9ucy5vcmlnWyB0aGlzLnByb3AgXSA9IGRhdGFTaG93IHx8IGpRdWVyeS5zdHlsZSggdGhpcy5lbGVtLCB0aGlzLnByb3AgKTsKKwkJdGhpcy5vcHRpb25zLnNob3cgPSB0cnVlOworCisJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KKwkJLy8gTWFrZSBzdXJlIHRoYXQgd2Ugc3RhcnQgYXQgYSBzbWFsbCB3aWR0aC9oZWlnaHQgdG8gYXZvaWQgYW55IGZsYXNoIG9mIGNvbnRlbnQKKwkJaWYgKCBkYXRhU2hvdyAhPT0gdW5kZWZpbmVkICkgeworCQkJLy8gVGhpcyBzaG93IGlzIHBpY2tpbmcgdXAgd2hlcmUgYSBwcmV2aW91cyBoaWRlIG9yIHNob3cgbGVmdCBvZmYKKwkJCXRoaXMuY3VzdG9tKCB0aGlzLmN1cigpLCBkYXRhU2hvdyApOworCQl9IGVsc2UgeworCQkJdGhpcy5jdXN0b20oIHRoaXMucHJvcCA9PT0gIndpZHRoIiB8fCB0aGlzLnByb3AgPT09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkgKTsKKwkJfQorCisJCS8vIFN0YXJ0IGJ5IHNob3dpbmcgdGhlIGVsZW1lbnQKKwkJalF1ZXJ5KCB0aGlzLmVsZW0gKS5zaG93KCk7CisJfSwKKworCS8vIFNpbXBsZSAnaGlkZScgZnVuY3Rpb24KKwloaWRlOiBmdW5jdGlvbigpIHsKKwkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgorCQl0aGlzLm9wdGlvbnMub3JpZ1sgdGhpcy5wcm9wIF0gPSBqUXVlcnkuX2RhdGEoIHRoaXMuZWxlbSwgImZ4c2hvdyIgKyB0aGlzLnByb3AgKSB8fCBqUXVlcnkuc3R5bGUoIHRoaXMuZWxlbSwgdGhpcy5wcm9wICk7CisJCXRoaXMub3B0aW9ucy5oaWRlID0gdHJ1ZTsKKworCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCisJCXRoaXMuY3VzdG9tKCB0aGlzLmN1cigpLCAwICk7CisJfSwKKworCS8vIEVhY2ggc3RlcCBvZiBhbiBhbmltYXRpb24KKwlzdGVwOiBmdW5jdGlvbiggZ290b0VuZCApIHsKKwkJdmFyIHAsIG4sIGNvbXBsZXRlLAorCQkJdCA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCisJCQlkb25lID0gdHJ1ZSwKKwkJCWVsZW0gPSB0aGlzLmVsZW0sCisJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zOworCisJCWlmICggZ290b0VuZCB8fCB0ID49IG9wdGlvbnMuZHVyYXRpb24gKyB0aGlzLnN0YXJ0VGltZSApIHsKKwkJCXRoaXMubm93ID0gdGhpcy5lbmQ7CisJCQl0aGlzLnBvcyA9IHRoaXMuc3RhdGUgPSAxOworCQkJdGhpcy51cGRhdGUoKTsKKworCQkJb3B0aW9ucy5hbmltYXRlZFByb3BlcnRpZXNbIHRoaXMucHJvcCBdID0gdHJ1ZTsKKworCQkJZm9yICggcCBpbiBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllcyApIHsKKwkJCQlpZiAoIG9wdGlvbnMuYW5pbWF0ZWRQcm9wZXJ0aWVzWyBwIF0gIT09IHRydWUgKSB7CisJCQkJCWRvbmUgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICggZG9uZSApIHsKKwkJCQkvLyBSZXNldCB0aGUgb3ZlcmZsb3cKKwkJCQlpZiAoIG9wdGlvbnMub3ZlcmZsb3cgIT0gbnVsbCAmJiAhalF1ZXJ5LnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyApIHsKKworCQkJCQlqUXVlcnkuZWFjaCggWyAiIiwgIlgiLCAiWSIgXSwgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKKwkJCQkJCWVsZW0uc3R5bGVbICJvdmVyZmxvdyIgKyB2YWx1ZSBdID0gb3B0aW9ucy5vdmVyZmxvd1sgaW5kZXggXTsKKwkJCQkJfSk7CisJCQkJfQorCisJCQkJLy8gSGlkZSB0aGUgZWxlbWVudCBpZiB0aGUgImhpZGUiIG9wZXJhdGlvbiB3YXMgZG9uZQorCQkJCWlmICggb3B0aW9ucy5oaWRlICkgeworCQkJCQlqUXVlcnkoIGVsZW0gKS5oaWRlKCk7CisJCQkJfQorCisJCQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgorCQkJCWlmICggb3B0aW9ucy5oaWRlIHx8IG9wdGlvbnMuc2hvdyApIHsKKwkJCQkJZm9yICggcCBpbiBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllcyApIHsKKwkJCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgcCwgb3B0aW9ucy5vcmlnWyBwIF0gKTsKKwkJCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAiZnhzaG93IiArIHAsIHRydWUgKTsKKwkJCQkJCS8vIFRvZ2dsZSBkYXRhIGlzIG5vIGxvbmdlciBuZWVkZWQKKwkJCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAidG9nZ2xlIiArIHAsIHRydWUgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIEV4ZWN1dGUgdGhlIGNvbXBsZXRlIGZ1bmN0aW9uCisJCQkJLy8gaW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvbXBsZXRlIGZ1bmN0aW9uIHRocm93cyBhbiBleGNlcHRpb24KKwkJCQkvLyB3ZSBtdXN0IGVuc3VyZSBpdCB3b24ndCBiZSBjYWxsZWQgdHdpY2UuICM1Njg0CisKKwkJCQljb21wbGV0ZSA9IG9wdGlvbnMuY29tcGxldGU7CisJCQkJaWYgKCBjb21wbGV0ZSApIHsKKworCQkJCQlvcHRpb25zLmNvbXBsZXRlID0gZmFsc2U7CisJCQkJCWNvbXBsZXRlLmNhbGwoIGVsZW0gKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKworCQl9IGVsc2UgeworCQkJLy8gY2xhc3NpY2FsIGVhc2luZyBjYW5ub3QgYmUgdXNlZCB3aXRoIGFuIEluZmluaXR5IGR1cmF0aW9uCisJCQlpZiAoIG9wdGlvbnMuZHVyYXRpb24gPT0gSW5maW5pdHkgKSB7CisJCQkJdGhpcy5ub3cgPSB0OworCQkJfSBlbHNlIHsKKwkJCQluID0gdCAtIHRoaXMuc3RhcnRUaW1lOworCQkJCXRoaXMuc3RhdGUgPSBuIC8gb3B0aW9ucy5kdXJhdGlvbjsKKworCQkJCS8vIFBlcmZvcm0gdGhlIGVhc2luZyBmdW5jdGlvbiwgZGVmYXVsdHMgdG8gc3dpbmcKKwkJCQl0aGlzLnBvcyA9IGpRdWVyeS5lYXNpbmdbIG9wdGlvbnMuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF0gXSggdGhpcy5zdGF0ZSwgbiwgMCwgMSwgb3B0aW9ucy5kdXJhdGlvbiApOworCQkJCXRoaXMubm93ID0gdGhpcy5zdGFydCArICggKHRoaXMuZW5kIC0gdGhpcy5zdGFydCkgKiB0aGlzLnBvcyApOworCQkJfQorCQkJLy8gUGVyZm9ybSB0aGUgbmV4dCBzdGVwIG9mIHRoZSBhbmltYXRpb24KKwkJCXRoaXMudXBkYXRlKCk7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9OworCitqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuZngsIHsKKwl0aWNrOiBmdW5jdGlvbigpIHsKKwkJdmFyIHRpbWVyLAorCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKKwkJCWkgPSAwOworCisJCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKKwkJCXRpbWVyID0gdGltZXJzWyBpIF07CisJCQkvLyBDaGVja3MgdGhlIHRpbWVyIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlbW92ZWQKKwkJCWlmICggIXRpbWVyKCkgJiYgdGltZXJzWyBpIF0gPT09IHRpbWVyICkgeworCQkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOworCQkJfQorCQl9CisKKwkJaWYgKCAhdGltZXJzLmxlbmd0aCApIHsKKwkJCWpRdWVyeS5meC5zdG9wKCk7CisJCX0KKwl9LAorCisJaW50ZXJ2YWw6IDEzLAorCisJc3RvcDogZnVuY3Rpb24oKSB7CisJCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKKwkJdGltZXJJZCA9IG51bGw7CisJfSwKKworCXNwZWVkczogeworCQlzbG93OiA2MDAsCisJCWZhc3Q6IDIwMCwKKwkJLy8gRGVmYXVsdCBzcGVlZAorCQlfZGVmYXVsdDogNDAwCisJfSwKKworCXN0ZXA6IHsKKwkJb3BhY2l0eTogZnVuY3Rpb24oIGZ4ICkgeworCQkJalF1ZXJ5LnN0eWxlKCBmeC5lbGVtLCAib3BhY2l0eSIsIGZ4Lm5vdyApOworCQl9LAorCisJCV9kZWZhdWx0OiBmdW5jdGlvbiggZnggKSB7CisJCQlpZiAoIGZ4LmVsZW0uc3R5bGUgJiYgZnguZWxlbS5zdHlsZVsgZngucHJvcCBdICE9IG51bGwgKSB7CisJCQkJZnguZWxlbS5zdHlsZVsgZngucHJvcCBdID0gZngubm93ICsgZngudW5pdDsKKwkJCX0gZWxzZSB7CisJCQkJZnguZWxlbVsgZngucHJvcCBdID0gZngubm93OworCQkJfQorCQl9CisJfQorfSk7CisKKy8vIEVuc3VyZSBwcm9wcyB0aGF0IGNhbid0IGJlIG5lZ2F0aXZlIGRvbid0IGdvIHRoZXJlIG9uIHVuZGVyc2hvb3QgZWFzaW5nCitqUXVlcnkuZWFjaCggZnhBdHRycy5jb25jYXQuYXBwbHkoIFtdLCBmeEF0dHJzICksIGZ1bmN0aW9uKCBpLCBwcm9wICkgeworCS8vIGV4Y2x1ZGUgbWFyZ2luVG9wLCBtYXJnaW5MZWZ0LCBtYXJnaW5Cb3R0b20gYW5kIG1hcmdpblJpZ2h0IGZyb20gdGhpcyBsaXN0CisJaWYgKCBwcm9wLmluZGV4T2YoICJtYXJnaW4iICkgKSB7CisJCWpRdWVyeS5meC5zdGVwWyBwcm9wIF0gPSBmdW5jdGlvbiggZnggKSB7CisJCQlqUXVlcnkuc3R5bGUoIGZ4LmVsZW0sIHByb3AsIE1hdGgubWF4KDAsIGZ4Lm5vdykgKyBmeC51bml0ICk7CisJCX07CisJfQorfSk7CisKK2lmICggalF1ZXJ5LmV4cHIgJiYgalF1ZXJ5LmV4cHIuZmlsdGVycyApIHsKKwlqUXVlcnkuZXhwci5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7CisJCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKKwkJfSkubGVuZ3RoOworCX07Cit9CisKKy8vIFRyeSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVudAorZnVuY3Rpb24gZGVmYXVsdERpc3BsYXkoIG5vZGVOYW1lICkgeworCisJaWYgKCAhZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gKSB7CisKKwkJdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5LAorCQkJZWxlbSA9IGpRdWVyeSggIjwiICsgbm9kZU5hbWUgKyAiPiIgKS5hcHBlbmRUbyggYm9keSApLAorCQkJZGlzcGxheSA9IGVsZW0uY3NzKCAiZGlzcGxheSIgKTsKKwkJZWxlbS5yZW1vdmUoKTsKKworCQkvLyBJZiB0aGUgc2ltcGxlIHdheSBmYWlscywKKwkJLy8gZ2V0IGVsZW1lbnQncyByZWFsIGRlZmF1bHQgZGlzcGxheSBieSBhdHRhY2hpbmcgaXQgdG8gYSB0ZW1wIGlmcmFtZQorCQlpZiAoIGRpc3BsYXkgPT09ICJub25lIiB8fCBkaXNwbGF5ID09PSAiIiApIHsKKwkJCS8vIE5vIGlmcmFtZSB0byB1c2UgeWV0LCBzbyBjcmVhdGUgaXQKKwkJCWlmICggIWlmcmFtZSApIHsKKwkJCQlpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiaWZyYW1lIiApOworCQkJCWlmcmFtZS5mcmFtZUJvcmRlciA9IGlmcmFtZS53aWR0aCA9IGlmcmFtZS5oZWlnaHQgPSAwOworCQkJfQorCisJCQlib2R5LmFwcGVuZENoaWxkKCBpZnJhbWUgKTsKKworCQkJLy8gQ3JlYXRlIGEgY2FjaGVhYmxlIGNvcHkgb2YgdGhlIGlmcmFtZSBkb2N1bWVudCBvbiBmaXJzdCBjYWxsLgorCQkJLy8gSUUgYW5kIE9wZXJhIHdpbGwgYWxsb3cgdXMgdG8gcmV1c2UgdGhlIGlmcmFtZURvYyB3aXRob3V0IHJlLXdyaXRpbmcgdGhlIGZha2UgSFRNTAorCQkJLy8gZG9jdW1lbnQgdG8gaXQ7IFdlYktpdCAmIEZpcmVmb3ggd29uJ3QgYWxsb3cgcmV1c2luZyB0aGUgaWZyYW1lIGRvY3VtZW50LgorCQkJaWYgKCAhaWZyYW1lRG9jIHx8ICFpZnJhbWUuY3JlYXRlRWxlbWVudCApIHsKKwkJCQlpZnJhbWVEb2MgPSAoIGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgKS5kb2N1bWVudDsKKwkJCQlpZnJhbWVEb2Mud3JpdGUoICggalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgPyAiPCFkb2N0eXBlIGh0bWw+IiA6ICIiICkgKyAiPGh0bWw+PGJvZHk+IiApOworCQkJCWlmcmFtZURvYy5jbG9zZSgpOworCQkJfQorCisJCQllbGVtID0gaWZyYW1lRG9jLmNyZWF0ZUVsZW1lbnQoIG5vZGVOYW1lICk7CisKKwkJCWlmcmFtZURvYy5ib2R5LmFwcGVuZENoaWxkKCBlbGVtICk7CisKKwkJCWRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKTsKKwkJCWJvZHkucmVtb3ZlQ2hpbGQoIGlmcmFtZSApOworCQl9CisKKwkJLy8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBkaXNwbGF5CisJCWVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTsKKwl9CisKKwlyZXR1cm4gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07Cit9CisKKworCisKK3ZhciBnZXRPZmZzZXQsCisJcnRhYmxlID0gL150KD86YWJsZXxkfGgpJC9pLAorCXJyb290ID0gL14oPzpib2R5fGh0bWwpJC9pOworCitpZiAoICJnZXRCb3VuZGluZ0NsaWVudFJlY3QiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCApIHsKKwlnZXRPZmZzZXQgPSBmdW5jdGlvbiggZWxlbSwgZG9jLCBkb2NFbGVtLCBib3ggKSB7CisJCXRyeSB7CisJCQlib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOworCQl9IGNhdGNoKGUpIHt9CisKKwkJLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGUKKwkJaWYgKCAhYm94IHx8ICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsKKwkJCXJldHVybiBib3ggPyB7IHRvcDogYm94LnRvcCwgbGVmdDogYm94LmxlZnQgfSA6IHsgdG9wOiAwLCBsZWZ0OiAwIH07CisJCX0KKworCQl2YXIgYm9keSA9IGRvYy5ib2R5LAorCQkJd2luID0gZ2V0V2luZG93KCBkb2MgKSwKKwkJCWNsaWVudFRvcCAgPSBkb2NFbGVtLmNsaWVudFRvcCAgfHwgYm9keS5jbGllbnRUb3AgIHx8IDAsCisJCQljbGllbnRMZWZ0ID0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwLAorCQkJc2Nyb2xsVG9wICA9IHdpbi5wYWdlWU9mZnNldCB8fCBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCAmJiBkb2NFbGVtLnNjcm9sbFRvcCAgfHwgYm9keS5zY3JvbGxUb3AsCisJCQlzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0IHx8IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsTGVmdCB8fCBib2R5LnNjcm9sbExlZnQsCisJCQl0b3AgID0gYm94LnRvcCAgKyBzY3JvbGxUb3AgIC0gY2xpZW50VG9wLAorCQkJbGVmdCA9IGJveC5sZWZ0ICsgc2Nyb2xsTGVmdCAtIGNsaWVudExlZnQ7CisKKwkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKKwl9OworCit9IGVsc2UgeworCWdldE9mZnNldCA9IGZ1bmN0aW9uKCBlbGVtLCBkb2MsIGRvY0VsZW0gKSB7CisJCXZhciBjb21wdXRlZFN0eWxlLAorCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQsCisJCQlwcmV2T2Zmc2V0UGFyZW50ID0gZWxlbSwKKwkJCWJvZHkgPSBkb2MuYm9keSwKKwkJCWRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3LAorCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0VmlldyA/IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKSA6IGVsZW0uY3VycmVudFN0eWxlLAorCQkJdG9wID0gZWxlbS5vZmZzZXRUb3AsCisJCQlsZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0OworCisJCXdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0gIT09IGJvZHkgJiYgZWxlbSAhPT0gZG9jRWxlbSApIHsKKwkJCWlmICggalF1ZXJ5LnN1cHBvcnQuZml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3ID8gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBudWxsKSA6IGVsZW0uY3VycmVudFN0eWxlOworCQkJdG9wICAtPSBlbGVtLnNjcm9sbFRvcDsKKwkJCWxlZnQgLT0gZWxlbS5zY3JvbGxMZWZ0OworCisJCQlpZiAoIGVsZW0gPT09IG9mZnNldFBhcmVudCApIHsKKwkJCQl0b3AgICs9IGVsZW0ub2Zmc2V0VG9wOworCQkJCWxlZnQgKz0gZWxlbS5vZmZzZXRMZWZ0OworCisJCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5kb2VzTm90QWRkQm9yZGVyICYmICEoalF1ZXJ5LnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgJiYgcnRhYmxlLnRlc3QoZWxlbS5ub2RlTmFtZSkpICkgeworCQkJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGggICkgfHwgMDsKKwkJCQkJbGVmdCArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlckxlZnRXaWR0aCApIHx8IDA7CisJCQkJfQorCisJCQkJcHJldk9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudDsKKwkJCQlvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudDsKKwkJCX0KKworCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUgJiYgY29tcHV0ZWRTdHlsZS5vdmVyZmxvdyAhPT0gInZpc2libGUiICkgeworCQkJCXRvcCAgKz0gcGFyc2VGbG9hdCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCAgKSB8fCAwOworCQkJCWxlZnQgKz0gcGFyc2VGbG9hdCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGggKSB8fCAwOworCQkJfQorCisJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGNvbXB1dGVkU3R5bGU7CisJCX0KKworCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAicmVsYXRpdmUiIHx8IHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAic3RhdGljIiApIHsKKwkJCXRvcCAgKz0gYm9keS5vZmZzZXRUb3A7CisJCQlsZWZ0ICs9IGJvZHkub2Zmc2V0TGVmdDsKKwkJfQorCisJCWlmICggalF1ZXJ5LnN1cHBvcnQuZml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKKwkJCXRvcCAgKz0gTWF0aC5tYXgoIGRvY0VsZW0uc2Nyb2xsVG9wLCBib2R5LnNjcm9sbFRvcCApOworCQkJbGVmdCArPSBNYXRoLm1heCggZG9jRWxlbS5zY3JvbGxMZWZ0LCBib2R5LnNjcm9sbExlZnQgKTsKKwkJfQorCisJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07CisJfTsKK30KKworalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgeworCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKKwkJcmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/CisJCQl0aGlzIDoKKwkJCXRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKwkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOworCQkJfSk7CisJfQorCisJdmFyIGVsZW0gPSB0aGlzWzBdLAorCQlkb2MgPSBlbGVtICYmIGVsZW0ub3duZXJEb2N1bWVudDsKKworCWlmICggIWRvYyApIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJaWYgKCBlbGVtID09PSBkb2MuYm9keSApIHsKKwkJcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggZWxlbSApOworCX0KKworCXJldHVybiBnZXRPZmZzZXQoIGVsZW0sIGRvYywgZG9jLmRvY3VtZW50RWxlbWVudCApOworfTsKKworalF1ZXJ5Lm9mZnNldCA9IHsKKworCWJvZHlPZmZzZXQ6IGZ1bmN0aW9uKCBib2R5ICkgeworCQl2YXIgdG9wID0gYm9keS5vZmZzZXRUb3AsCisJCQlsZWZ0ID0gYm9keS5vZmZzZXRMZWZ0OworCisJCWlmICggalF1ZXJ5LnN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgKSB7CisJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoYm9keSwgIm1hcmdpblRvcCIpICkgfHwgMDsKKwkJCWxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luTGVmdCIpICkgfHwgMDsKKwkJfQorCisJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07CisJfSwKKworCXNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7CisJCXZhciBwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKTsKKworCQkvLyBzZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCisJCWlmICggcG9zaXRpb24gPT09ICJzdGF0aWMiICkgeworCQkJZWxlbS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisJCX0KKworCQl2YXIgY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAorCQkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKSwKKwkJCWN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sICJ0b3AiICksCisJCQljdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgImxlZnQiICksCisJCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJiBqUXVlcnkuaW5BcnJheSgiYXV0byIsIFtjdXJDU1NUb3AsIGN1ckNTU0xlZnRdKSA+IC0xLAorCQkJcHJvcHMgPSB7fSwgY3VyUG9zaXRpb24gPSB7fSwgY3VyVG9wLCBjdXJMZWZ0OworCisJCS8vIG5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAorCQlpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgeworCQkJY3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7CisJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CisJCQljdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKKwkJfSBlbHNlIHsKKwkJCWN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7CisJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CisJCX0KKworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CisJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBjdXJPZmZzZXQgKTsKKwkJfQorCisJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKKwkJCXByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7CisJCX0KKwkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKKwkJCXByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0OworCQl9CisKKwkJaWYgKCAidXNpbmciIGluIG9wdGlvbnMgKSB7CisJCQlvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7CisJCX0gZWxzZSB7CisJCQljdXJFbGVtLmNzcyggcHJvcHMgKTsKKwkJfQorCX0KK307CisKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisKKwlwb3NpdGlvbjogZnVuY3Rpb24oKSB7CisJCWlmICggIXRoaXNbMF0gKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXZhciBlbGVtID0gdGhpc1swXSwKKworCQkvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudAorCQlvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAorCisJCS8vIEdldCBjb3JyZWN0IG9mZnNldHMKKwkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZzZXQoKSwKKwkJcGFyZW50T2Zmc2V0ID0gcnJvb3QudGVzdChvZmZzZXRQYXJlbnRbMF0ubm9kZU5hbWUpID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQoKTsKKworCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKKwkJLy8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnQKKwkJLy8gYXJlIHRoZSBzYW1lIGluIFNhZmFyaSBjYXVzaW5nIG9mZnNldC5sZWZ0IHRvIGluY29ycmVjdGx5IGJlIDAKKwkJb2Zmc2V0LnRvcCAgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhlbGVtLCAibWFyZ2luVG9wIikgKSB8fCAwOworCQlvZmZzZXQubGVmdCAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGVsZW0sICJtYXJnaW5MZWZ0IikgKSB8fCAwOworCisJCS8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycworCQlwYXJlbnRPZmZzZXQudG9wICArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKG9mZnNldFBhcmVudFswXSwgImJvcmRlclRvcFdpZHRoIikgKSB8fCAwOworCQlwYXJlbnRPZmZzZXQubGVmdCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKG9mZnNldFBhcmVudFswXSwgImJvcmRlckxlZnRXaWR0aCIpICkgfHwgMDsKKworCQkvLyBTdWJ0cmFjdCB0aGUgdHdvIG9mZnNldHMKKwkJcmV0dXJuIHsKKwkJCXRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCwKKwkJCWxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQKKwkJfTsKKwl9LAorCisJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgeworCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJvZHk7CisJCQl3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoIXJyb290LnRlc3Qob2Zmc2V0UGFyZW50Lm5vZGVOYW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVudCwgInBvc2l0aW9uIikgPT09ICJzdGF0aWMiKSApIHsKKwkJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OworCQkJfQorCQkJcmV0dXJuIG9mZnNldFBhcmVudDsKKwkJfSk7CisJfQorfSk7CisKKworLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzCitqUXVlcnkuZWFjaCgge3Njcm9sbExlZnQ6ICJwYWdlWE9mZnNldCIsIHNjcm9sbFRvcDogInBhZ2VZT2Zmc2V0In0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7CisJdmFyIHRvcCA9IC9ZLy50ZXN0KCBwcm9wICk7CisKKwlqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKKwkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHsKKwkJCXZhciB3aW4gPSBnZXRXaW5kb3coIGVsZW0gKTsKKworCQkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKKwkJCQlyZXR1cm4gd2luID8gKHByb3AgaW4gd2luKSA/IHdpblsgcHJvcCBdIDoKKwkJCQkJalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgJiYgd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgbWV0aG9kIF0gfHwKKwkJCQkJCXdpbi5kb2N1bWVudC5ib2R5WyBtZXRob2QgXSA6CisJCQkJCWVsZW1bIG1ldGhvZCBdOworCQkJfQorCisJCQlpZiAoIHdpbiApIHsKKwkJCQl3aW4uc2Nyb2xsVG8oCisJCQkJCSF0b3AgPyB2YWwgOiBqUXVlcnkoIHdpbiApLnNjcm9sbExlZnQoKSwKKwkJCQkJIHRvcCA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsVG9wKCkKKwkJCQkpOworCisJCQl9IGVsc2UgeworCQkJCWVsZW1bIG1ldGhvZCBdID0gdmFsOworCQkJfQorCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApOworCX07Cit9KTsKKworZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkgeworCXJldHVybiBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSA/CisJCWVsZW0gOgorCQllbGVtLm5vZGVUeXBlID09PSA5ID8KKwkJCWVsZW0uZGVmYXVsdFZpZXcgfHwgZWxlbS5wYXJlbnRXaW5kb3cgOgorCQkJZmFsc2U7Cit9CisKKworCisKKy8vIENyZWF0ZSB3aWR0aCwgaGVpZ2h0LCBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcworalF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiAiaGVpZ2h0IiwgV2lkdGg6ICJ3aWR0aCIgfSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7CisJdmFyIGNsaWVudFByb3AgPSAiY2xpZW50IiArIG5hbWUsCisJCXNjcm9sbFByb3AgPSAic2Nyb2xsIiArIG5hbWUsCisJCW9mZnNldFByb3AgPSAib2Zmc2V0IiArIG5hbWU7CisKKwkvLyBpbm5lckhlaWdodCBhbmQgaW5uZXJXaWR0aAorCWpRdWVyeS5mblsgImlubmVyIiArIG5hbWUgXSA9IGZ1bmN0aW9uKCkgeworCQl2YXIgZWxlbSA9IHRoaXNbMF07CisJCXJldHVybiBlbGVtID8KKwkJCWVsZW0uc3R5bGUgPworCQkJcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgInBhZGRpbmciICkgKSA6CisJCQl0aGlzWyB0eXBlIF0oKSA6CisJCQludWxsOworCX07CisKKwkvLyBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aAorCWpRdWVyeS5mblsgIm91dGVyIiArIG5hbWUgXSA9IGZ1bmN0aW9uKCBtYXJnaW4gKSB7CisJCXZhciBlbGVtID0gdGhpc1swXTsKKwkJcmV0dXJuIGVsZW0gPworCQkJZWxlbS5zdHlsZSA/CisJCQlwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBtYXJnaW4gPyAibWFyZ2luIiA6ICJib3JkZXIiICkgKSA6CisJCQl0aGlzWyB0eXBlIF0oKSA6CisJCQludWxsOworCX07CisKKwlqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKKwkJCXZhciBkb2MsIGRvY0VsZW1Qcm9wLCBvcmlnLCByZXQ7CisKKwkJCWlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7CisJCQkJLy8gM3JkIGNvbmRpdGlvbiBhbGxvd3MgTm9raWEgc3VwcG9ydCwgYXMgaXQgc3VwcG9ydHMgdGhlIGRvY0VsZW0gcHJvcCBidXQgbm90IENTUzFDb21wYXQKKwkJCQlkb2MgPSBlbGVtLmRvY3VtZW50OworCQkJCWRvY0VsZW1Qcm9wID0gZG9jLmRvY3VtZW50RWxlbWVudFsgY2xpZW50UHJvcCBdOworCQkJCXJldHVybiBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCAmJiBkb2NFbGVtUHJvcCB8fAorCQkJCQlkb2MuYm9keSAmJiBkb2MuYm9keVsgY2xpZW50UHJvcCBdIHx8IGRvY0VsZW1Qcm9wOworCQkJfQorCisJCQkvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0CisJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CisJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdLCB3aGljaGV2ZXIgaXMgZ3JlYXRlcgorCQkJCWRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50OworCisJCQkJLy8gd2hlbiBhIHdpbmRvdyA+IGRvY3VtZW50LCBJRTYgcmVwb3J0cyBhIG9mZnNldFtXaWR0aC9IZWlnaHRdID4gY2xpZW50W1dpZHRoL0hlaWdodF0KKwkJCQkvLyBzbyB3ZSBjYW4ndCB1c2UgbWF4LCBhcyBpdCdsbCBjaG9vc2UgdGhlIGluY29ycmVjdCBvZmZzZXRbV2lkdGgvSGVpZ2h0XQorCQkJCS8vIGluc3RlYWQgd2UgdXNlIHRoZSBjb3JyZWN0IGNsaWVudFtXaWR0aC9IZWlnaHRdCisJCQkJLy8gc3VwcG9ydDpJRTYKKwkJCQlpZiAoIGRvY1sgY2xpZW50UHJvcCBdID49IGRvY1sgc2Nyb2xsUHJvcCBdICkgeworCQkJCQlyZXR1cm4gZG9jWyBjbGllbnRQcm9wIF07CisJCQkJfQorCisJCQkJcmV0dXJuIE1hdGgubWF4KAorCQkJCQllbGVtLmJvZHlbIHNjcm9sbFByb3AgXSwgZG9jWyBzY3JvbGxQcm9wIF0sCisJCQkJCWVsZW0uYm9keVsgb2Zmc2V0UHJvcCBdLCBkb2NbIG9mZnNldFByb3AgXQorCQkJCSk7CisJCQl9CisKKwkJCS8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKKwkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKKwkJCQlvcmlnID0galF1ZXJ5LmNzcyggZWxlbSwgdHlwZSApOworCQkJCXJldCA9IHBhcnNlRmxvYXQoIG9yaWcgKTsKKwkJCQlyZXR1cm4galF1ZXJ5LmlzTnVtZXJpYyggcmV0ICkgPyByZXQgOiBvcmlnOworCQkJfQorCisJCQkvLyBTZXQgdGhlIHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudAorCQkJalF1ZXJ5KCBlbGVtICkuY3NzKCB0eXBlLCB2YWx1ZSApOworCQl9LCB0eXBlLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApOworCX07Cit9KTsKKworCisKKworLy8gRXhwb3NlIGpRdWVyeSB0byB0aGUgZ2xvYmFsIG9iamVjdAord2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5OworCisvLyBFeHBvc2UgalF1ZXJ5IGFzIGFuIEFNRCBtb2R1bGUsIGJ1dCBvbmx5IGZvciBBTUQgbG9hZGVycyB0aGF0CisvLyB1bmRlcnN0YW5kIHRoZSBpc3N1ZXMgd2l0aCBsb2FkaW5nIG11bHRpcGxlIHZlcnNpb25zIG9mIGpRdWVyeQorLy8gaW4gYSBwYWdlIHRoYXQgYWxsIG1pZ2h0IGNhbGwgZGVmaW5lKCkuIFRoZSBsb2FkZXIgd2lsbCBpbmRpY2F0ZQorLy8gdGhleSBoYXZlIHNwZWNpYWwgYWxsb3dhbmNlcyBmb3IgbXVsdGlwbGUgalF1ZXJ5IHZlcnNpb25zIGJ5CisvLyBzcGVjaWZ5aW5nIGRlZmluZS5hbWQualF1ZXJ5ID0gdHJ1ZS4gUmVnaXN0ZXIgYXMgYSBuYW1lZCBtb2R1bGUsCisvLyBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyIGZpbGVzIHRoYXQgbWF5IHVzZSBkZWZpbmUsCisvLyBidXQgbm90IHVzZSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0IHVuZGVyc3RhbmRzIGFub255bW91cworLy8gQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Qgd2F5IHRvIHJlZ2lzdGVyLgorLy8gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tCisvLyBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZSBmaWxlIG5hbWUuCisvLyBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzIHRvIGNhbGwKKy8vIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuCitpZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCAmJiBkZWZpbmUuYW1kLmpRdWVyeSApIHsKKwlkZWZpbmUoICJqcXVlcnkiLCBbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4galF1ZXJ5OyB9ICk7Cit9CisKKworCit9KSggd2luZG93ICk7CmRpZmYgLS1naXQgYS9fc3RhdGljL21pbnVzLnBuZyBiL19zdGF0aWMvbWludXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWM1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9fc3RhdGljL21pbnVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9fc3RhdGljL3BsdXMucG5nIGIvX3N0YXRpYy9wbHVzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NiMzc0Ci0tLSAvZGV2L251bGwKKysrIGIvX3N0YXRpYy9wbHVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9fc3RhdGljL3B5Z21lbnRzLmNzcyBiL19zdGF0aWMvcHlnbWVudHMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OWNhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9fc3RhdGljL3B5Z21lbnRzLmNzcwpAQCAtMCwwICsxLDYyIEBACisuaGlnaGxpZ2h0IC5obGwgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmNjIH0KKy5oaWdobGlnaHQgIHsgYmFja2dyb3VuZDogI2VlZmZjYzsgfQorLmhpZ2hsaWdodCAuYyB7IGNvbG9yOiAjNDA4MDkwOyBmb250LXN0eWxlOiBpdGFsaWMgfSAvKiBDb21tZW50ICovCisuaGlnaGxpZ2h0IC5lcnIgeyBib3JkZXI6IDFweCBzb2xpZCAjRkYwMDAwIH0gLyogRXJyb3IgKi8KKy5oaWdobGlnaHQgLmsgeyBjb2xvcjogIzAwNzAyMDsgZm9udC13ZWlnaHQ6IGJvbGQgfSAvKiBLZXl3b3JkICovCisuaGlnaGxpZ2h0IC5vIHsgY29sb3I6ICM2NjY2NjYgfSAvKiBPcGVyYXRvciAqLworLmhpZ2hsaWdodCAuY20geyBjb2xvcjogIzQwODA5MDsgZm9udC1zdHlsZTogaXRhbGljIH0gLyogQ29tbWVudC5NdWx0aWxpbmUgKi8KKy5oaWdobGlnaHQgLmNwIHsgY29sb3I6ICMwMDcwMjAgfSAvKiBDb21tZW50LlByZXByb2MgKi8KKy5oaWdobGlnaHQgLmMxIHsgY29sb3I6ICM0MDgwOTA7IGZvbnQtc3R5bGU6IGl0YWxpYyB9IC8qIENvbW1lbnQuU2luZ2xlICovCisuaGlnaGxpZ2h0IC5jcyB7IGNvbG9yOiAjNDA4MDkwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmMGYwIH0gLyogQ29tbWVudC5TcGVjaWFsICovCisuaGlnaGxpZ2h0IC5nZCB7IGNvbG9yOiAjQTAwMDAwIH0gLyogR2VuZXJpYy5EZWxldGVkICovCisuaGlnaGxpZ2h0IC5nZSB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9IC8qIEdlbmVyaWMuRW1waCAqLworLmhpZ2hsaWdodCAuZ3IgeyBjb2xvcjogI0ZGMDAwMCB9IC8qIEdlbmVyaWMuRXJyb3IgKi8KKy5oaWdobGlnaHQgLmdoIHsgY29sb3I6ICMwMDAwODA7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLyogR2VuZXJpYy5IZWFkaW5nICovCisuaGlnaGxpZ2h0IC5naSB7IGNvbG9yOiAjMDBBMDAwIH0gLyogR2VuZXJpYy5JbnNlcnRlZCAqLworLmhpZ2hsaWdodCAuZ28geyBjb2xvcjogIzMzMzMzMyB9IC8qIEdlbmVyaWMuT3V0cHV0ICovCisuaGlnaGxpZ2h0IC5ncCB7IGNvbG9yOiAjYzY1ZDA5OyBmb250LXdlaWdodDogYm9sZCB9IC8qIEdlbmVyaWMuUHJvbXB0ICovCisuaGlnaGxpZ2h0IC5ncyB7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLyogR2VuZXJpYy5TdHJvbmcgKi8KKy5oaWdobGlnaHQgLmd1IHsgY29sb3I6ICM4MDAwODA7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLyogR2VuZXJpYy5TdWJoZWFkaW5nICovCisuaGlnaGxpZ2h0IC5ndCB7IGNvbG9yOiAjMDA0NEREIH0gLyogR2VuZXJpYy5UcmFjZWJhY2sgKi8KKy5oaWdobGlnaHQgLmtjIHsgY29sb3I6ICMwMDcwMjA7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLyogS2V5d29yZC5Db25zdGFudCAqLworLmhpZ2hsaWdodCAua2QgeyBjb2xvcjogIzAwNzAyMDsgZm9udC13ZWlnaHQ6IGJvbGQgfSAvKiBLZXl3b3JkLkRlY2xhcmF0aW9uICovCisuaGlnaGxpZ2h0IC5rbiB7IGNvbG9yOiAjMDA3MDIwOyBmb250LXdlaWdodDogYm9sZCB9IC8qIEtleXdvcmQuTmFtZXNwYWNlICovCisuaGlnaGxpZ2h0IC5rcCB7IGNvbG9yOiAjMDA3MDIwIH0gLyogS2V5d29yZC5Qc2V1ZG8gKi8KKy5oaWdobGlnaHQgLmtyIHsgY29sb3I6ICMwMDcwMjA7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLyogS2V5d29yZC5SZXNlcnZlZCAqLworLmhpZ2hsaWdodCAua3QgeyBjb2xvcjogIzkwMjAwMCB9IC8qIEtleXdvcmQuVHlwZSAqLworLmhpZ2hsaWdodCAubSB7IGNvbG9yOiAjMjA4MDUwIH0gLyogTGl0ZXJhbC5OdW1iZXIgKi8KKy5oaWdobGlnaHQgLnMgeyBjb2xvcjogIzQwNzBhMCB9IC8qIExpdGVyYWwuU3RyaW5nICovCisuaGlnaGxpZ2h0IC5uYSB7IGNvbG9yOiAjNDA3MGEwIH0gLyogTmFtZS5BdHRyaWJ1dGUgKi8KKy5oaWdobGlnaHQgLm5iIHsgY29sb3I6ICMwMDcwMjAgfSAvKiBOYW1lLkJ1aWx0aW4gKi8KKy5oaWdobGlnaHQgLm5jIHsgY29sb3I6ICMwZTg0YjU7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLyogTmFtZS5DbGFzcyAqLworLmhpZ2hsaWdodCAubm8geyBjb2xvcjogIzYwYWRkNSB9IC8qIE5hbWUuQ29uc3RhbnQgKi8KKy5oaWdobGlnaHQgLm5kIHsgY29sb3I6ICM1NTU1NTU7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLyogTmFtZS5EZWNvcmF0b3IgKi8KKy5oaWdobGlnaHQgLm5pIHsgY29sb3I6ICNkNTU1Mzc7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLyogTmFtZS5FbnRpdHkgKi8KKy5oaWdobGlnaHQgLm5lIHsgY29sb3I6ICMwMDcwMjAgfSAvKiBOYW1lLkV4Y2VwdGlvbiAqLworLmhpZ2hsaWdodCAubmYgeyBjb2xvcjogIzA2Mjg3ZSB9IC8qIE5hbWUuRnVuY3Rpb24gKi8KKy5oaWdobGlnaHQgLm5sIHsgY29sb3I6ICMwMDIwNzA7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLyogTmFtZS5MYWJlbCAqLworLmhpZ2hsaWdodCAubm4geyBjb2xvcjogIzBlODRiNTsgZm9udC13ZWlnaHQ6IGJvbGQgfSAvKiBOYW1lLk5hbWVzcGFjZSAqLworLmhpZ2hsaWdodCAubnQgeyBjb2xvcjogIzA2Mjg3MzsgZm9udC13ZWlnaHQ6IGJvbGQgfSAvKiBOYW1lLlRhZyAqLworLmhpZ2hsaWdodCAubnYgeyBjb2xvcjogI2JiNjBkNSB9IC8qIE5hbWUuVmFyaWFibGUgKi8KKy5oaWdobGlnaHQgLm93IHsgY29sb3I6ICMwMDcwMjA7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLyogT3BlcmF0b3IuV29yZCAqLworLmhpZ2hsaWdodCAudyB7IGNvbG9yOiAjYmJiYmJiIH0gLyogVGV4dC5XaGl0ZXNwYWNlICovCisuaGlnaGxpZ2h0IC5tZiB7IGNvbG9yOiAjMjA4MDUwIH0gLyogTGl0ZXJhbC5OdW1iZXIuRmxvYXQgKi8KKy5oaWdobGlnaHQgLm1oIHsgY29sb3I6ICMyMDgwNTAgfSAvKiBMaXRlcmFsLk51bWJlci5IZXggKi8KKy5oaWdobGlnaHQgLm1pIHsgY29sb3I6ICMyMDgwNTAgfSAvKiBMaXRlcmFsLk51bWJlci5JbnRlZ2VyICovCisuaGlnaGxpZ2h0IC5tbyB7IGNvbG9yOiAjMjA4MDUwIH0gLyogTGl0ZXJhbC5OdW1iZXIuT2N0ICovCisuaGlnaGxpZ2h0IC5zYiB7IGNvbG9yOiAjNDA3MGEwIH0gLyogTGl0ZXJhbC5TdHJpbmcuQmFja3RpY2sgKi8KKy5oaWdobGlnaHQgLnNjIHsgY29sb3I6ICM0MDcwYTAgfSAvKiBMaXRlcmFsLlN0cmluZy5DaGFyICovCisuaGlnaGxpZ2h0IC5zZCB7IGNvbG9yOiAjNDA3MGEwOyBmb250LXN0eWxlOiBpdGFsaWMgfSAvKiBMaXRlcmFsLlN0cmluZy5Eb2MgKi8KKy5oaWdobGlnaHQgLnMyIHsgY29sb3I6ICM0MDcwYTAgfSAvKiBMaXRlcmFsLlN0cmluZy5Eb3VibGUgKi8KKy5oaWdobGlnaHQgLnNlIHsgY29sb3I6ICM0MDcwYTA7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLyogTGl0ZXJhbC5TdHJpbmcuRXNjYXBlICovCisuaGlnaGxpZ2h0IC5zaCB7IGNvbG9yOiAjNDA3MGEwIH0gLyogTGl0ZXJhbC5TdHJpbmcuSGVyZWRvYyAqLworLmhpZ2hsaWdodCAuc2kgeyBjb2xvcjogIzcwYTBkMDsgZm9udC1zdHlsZTogaXRhbGljIH0gLyogTGl0ZXJhbC5TdHJpbmcuSW50ZXJwb2wgKi8KKy5oaWdobGlnaHQgLnN4IHsgY29sb3I6ICNjNjVkMDkgfSAvKiBMaXRlcmFsLlN0cmluZy5PdGhlciAqLworLmhpZ2hsaWdodCAuc3IgeyBjb2xvcjogIzIzNTM4OCB9IC8qIExpdGVyYWwuU3RyaW5nLlJlZ2V4ICovCisuaGlnaGxpZ2h0IC5zMSB7IGNvbG9yOiAjNDA3MGEwIH0gLyogTGl0ZXJhbC5TdHJpbmcuU2luZ2xlICovCisuaGlnaGxpZ2h0IC5zcyB7IGNvbG9yOiAjNTE3OTE4IH0gLyogTGl0ZXJhbC5TdHJpbmcuU3ltYm9sICovCisuaGlnaGxpZ2h0IC5icCB7IGNvbG9yOiAjMDA3MDIwIH0gLyogTmFtZS5CdWlsdGluLlBzZXVkbyAqLworLmhpZ2hsaWdodCAudmMgeyBjb2xvcjogI2JiNjBkNSB9IC8qIE5hbWUuVmFyaWFibGUuQ2xhc3MgKi8KKy5oaWdobGlnaHQgLnZnIHsgY29sb3I6ICNiYjYwZDUgfSAvKiBOYW1lLlZhcmlhYmxlLkdsb2JhbCAqLworLmhpZ2hsaWdodCAudmkgeyBjb2xvcjogI2JiNjBkNSB9IC8qIE5hbWUuVmFyaWFibGUuSW5zdGFuY2UgKi8KKy5oaWdobGlnaHQgLmlsIHsgY29sb3I6ICMyMDgwNTAgfSAvKiBMaXRlcmFsLk51bWJlci5JbnRlZ2VyLkxvbmcgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fc3RhdGljL3NlYXJjaHRvb2xzLmpzIGIvX3N0YXRpYy9zZWFyY2h0b29scy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFmMDZiCi0tLSAvZGV2L251bGwKKysrIGIvX3N0YXRpYy9zZWFyY2h0b29scy5qcwpAQCAtMCwwICsxLDYyMiBAQAorLyoKKyAqIHNlYXJjaHRvb2xzLmpzX3QKKyAqIH5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBTcGhpbnggSmF2YVNjcmlwdCB1dGlsdGllcyBmb3IgdGhlIGZ1bGwtdGV4dCBzZWFyY2guCisgKgorICogOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMDctMjAxNCBieSB0aGUgU3BoaW54IHRlYW0sIHNlZSBBVVRIT1JTLgorICogOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCisgKgorICovCisKKworLyoqCisgKiBQb3J0ZXIgU3RlbW1lcgorICovCit2YXIgU3RlbW1lciA9IGZ1bmN0aW9uKCkgeworCisgIHZhciBzdGVwMmxpc3QgPSB7CisgICAgYXRpb25hbDogJ2F0ZScsCisgICAgdGlvbmFsOiAndGlvbicsCisgICAgZW5jaTogJ2VuY2UnLAorICAgIGFuY2k6ICdhbmNlJywKKyAgICBpemVyOiAnaXplJywKKyAgICBibGk6ICdibGUnLAorICAgIGFsbGk6ICdhbCcsCisgICAgZW50bGk6ICdlbnQnLAorICAgIGVsaTogJ2UnLAorICAgIG91c2xpOiAnb3VzJywKKyAgICBpemF0aW9uOiAnaXplJywKKyAgICBhdGlvbjogJ2F0ZScsCisgICAgYXRvcjogJ2F0ZScsCisgICAgYWxpc206ICdhbCcsCisgICAgaXZlbmVzczogJ2l2ZScsCisgICAgZnVsbmVzczogJ2Z1bCcsCisgICAgb3VzbmVzczogJ291cycsCisgICAgYWxpdGk6ICdhbCcsCisgICAgaXZpdGk6ICdpdmUnLAorICAgIGJpbGl0aTogJ2JsZScsCisgICAgbG9naTogJ2xvZycKKyAgfTsKKworICB2YXIgc3RlcDNsaXN0ID0geworICAgIGljYXRlOiAnaWMnLAorICAgIGF0aXZlOiAnJywKKyAgICBhbGl6ZTogJ2FsJywKKyAgICBpY2l0aTogJ2ljJywKKyAgICBpY2FsOiAnaWMnLAorICAgIGZ1bDogJycsCisgICAgbmVzczogJycKKyAgfTsKKworICB2YXIgYyA9ICJbXmFlaW91XSI7ICAgICAgICAgIC8vIGNvbnNvbmFudAorICB2YXIgdiA9ICJbYWVpb3V5XSI7ICAgICAgICAgIC8vIHZvd2VsCisgIHZhciBDID0gYyArICJbXmFlaW91eV0qIjsgICAgLy8gY29uc29uYW50IHNlcXVlbmNlCisgIHZhciBWID0gdiArICJbYWVpb3VdKiI7ICAgICAgLy8gdm93ZWwgc2VxdWVuY2UKKworICB2YXIgbWdyMCA9ICJeKCIgKyBDICsgIik/IiArIFYgKyBDOyAgICAgICAgICAgICAgICAgICAgICAvLyBbQ11WQy4uLiBpcyBtPjAKKyAgdmFyIG1lcTEgPSAiXigiICsgQyArICIpPyIgKyBWICsgQyArICIoIiArIFYgKyAiKT8kIjsgICAgLy8gW0NdVkNbVl0gaXMgbT0xCisgIHZhciBtZ3IxID0gIl4oIiArIEMgKyAiKT8iICsgViArIEMgKyBWICsgQzsgICAgICAgICAgICAgIC8vIFtDXVZDVkMuLi4gaXMgbT4xCisgIHZhciBzX3YgICA9ICJeKCIgKyBDICsgIik/IiArIHY7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvd2VsIGluIHN0ZW0KKworICB0aGlzLnN0ZW1Xb3JkID0gZnVuY3Rpb24gKHcpIHsKKyAgICB2YXIgc3RlbTsKKyAgICB2YXIgc3VmZml4OworICAgIHZhciBmaXJzdGNoOworICAgIHZhciBvcmlnd29yZCA9IHc7CisKKyAgICBpZiAody5sZW5ndGggPCAzKQorICAgICAgcmV0dXJuIHc7CisKKyAgICB2YXIgcmU7CisgICAgdmFyIHJlMjsKKyAgICB2YXIgcmUzOworICAgIHZhciByZTQ7CisKKyAgICBmaXJzdGNoID0gdy5zdWJzdHIoMCwxKTsKKyAgICBpZiAoZmlyc3RjaCA9PSAieSIpCisgICAgICB3ID0gZmlyc3RjaC50b1VwcGVyQ2FzZSgpICsgdy5zdWJzdHIoMSk7CisKKyAgICAvLyBTdGVwIDFhCisgICAgcmUgPSAvXiguKz8pKHNzfGkpZXMkLzsKKyAgICByZTIgPSAvXiguKz8pKFtec10pcyQvOworCisgICAgaWYgKHJlLnRlc3QodykpCisgICAgICB3ID0gdy5yZXBsYWNlKHJlLCIkMSQyIik7CisgICAgZWxzZSBpZiAocmUyLnRlc3QodykpCisgICAgICB3ID0gdy5yZXBsYWNlKHJlMiwiJDEkMiIpOworCisgICAgLy8gU3RlcCAxYgorICAgIHJlID0gL14oLis/KWVlZCQvOworICAgIHJlMiA9IC9eKC4rPykoZWR8aW5nKSQvOworICAgIGlmIChyZS50ZXN0KHcpKSB7CisgICAgICB2YXIgZnAgPSByZS5leGVjKHcpOworICAgICAgcmUgPSBuZXcgUmVnRXhwKG1ncjApOworICAgICAgaWYgKHJlLnRlc3QoZnBbMV0pKSB7CisgICAgICAgIHJlID0gLy4kLzsKKyAgICAgICAgdyA9IHcucmVwbGFjZShyZSwiIik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHJlMi50ZXN0KHcpKSB7CisgICAgICB2YXIgZnAgPSByZTIuZXhlYyh3KTsKKyAgICAgIHN0ZW0gPSBmcFsxXTsKKyAgICAgIHJlMiA9IG5ldyBSZWdFeHAoc192KTsKKyAgICAgIGlmIChyZTIudGVzdChzdGVtKSkgeworICAgICAgICB3ID0gc3RlbTsKKyAgICAgICAgcmUyID0gLyhhdHxibHxpeikkLzsKKyAgICAgICAgcmUzID0gbmV3IFJlZ0V4cCgiKFteYWVpb3V5bHN6XSlcXDEkIik7CisgICAgICAgIHJlNCA9IG5ldyBSZWdFeHAoIl4iICsgQyArIHYgKyAiW15hZWlvdXd4eV0kIik7CisgICAgICAgIGlmIChyZTIudGVzdCh3KSkKKyAgICAgICAgICB3ID0gdyArICJlIjsKKyAgICAgICAgZWxzZSBpZiAocmUzLnRlc3QodykpIHsKKyAgICAgICAgICByZSA9IC8uJC87CisgICAgICAgICAgdyA9IHcucmVwbGFjZShyZSwiIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocmU0LnRlc3QodykpCisgICAgICAgICAgdyA9IHcgKyAiZSI7CisgICAgICB9CisgICAgfQorCisgICAgLy8gU3RlcCAxYworICAgIHJlID0gL14oLis/KXkkLzsKKyAgICBpZiAocmUudGVzdCh3KSkgeworICAgICAgdmFyIGZwID0gcmUuZXhlYyh3KTsKKyAgICAgIHN0ZW0gPSBmcFsxXTsKKyAgICAgIHJlID0gbmV3IFJlZ0V4cChzX3YpOworICAgICAgaWYgKHJlLnRlc3Qoc3RlbSkpCisgICAgICAgIHcgPSBzdGVtICsgImkiOworICAgIH0KKworICAgIC8vIFN0ZXAgMgorICAgIHJlID0gL14oLis/KShhdGlvbmFsfHRpb25hbHxlbmNpfGFuY2l8aXplcnxibGl8YWxsaXxlbnRsaXxlbGl8b3VzbGl8aXphdGlvbnxhdGlvbnxhdG9yfGFsaXNtfGl2ZW5lc3N8ZnVsbmVzc3xvdXNuZXNzfGFsaXRpfGl2aXRpfGJpbGl0aXxsb2dpKSQvOworICAgIGlmIChyZS50ZXN0KHcpKSB7CisgICAgICB2YXIgZnAgPSByZS5leGVjKHcpOworICAgICAgc3RlbSA9IGZwWzFdOworICAgICAgc3VmZml4ID0gZnBbMl07CisgICAgICByZSA9IG5ldyBSZWdFeHAobWdyMCk7CisgICAgICBpZiAocmUudGVzdChzdGVtKSkKKyAgICAgICAgdyA9IHN0ZW0gKyBzdGVwMmxpc3Rbc3VmZml4XTsKKyAgICB9CisKKyAgICAvLyBTdGVwIDMKKyAgICByZSA9IC9eKC4rPykoaWNhdGV8YXRpdmV8YWxpemV8aWNpdGl8aWNhbHxmdWx8bmVzcykkLzsKKyAgICBpZiAocmUudGVzdCh3KSkgeworICAgICAgdmFyIGZwID0gcmUuZXhlYyh3KTsKKyAgICAgIHN0ZW0gPSBmcFsxXTsKKyAgICAgIHN1ZmZpeCA9IGZwWzJdOworICAgICAgcmUgPSBuZXcgUmVnRXhwKG1ncjApOworICAgICAgaWYgKHJlLnRlc3Qoc3RlbSkpCisgICAgICAgIHcgPSBzdGVtICsgc3RlcDNsaXN0W3N1ZmZpeF07CisgICAgfQorCisgICAgLy8gU3RlcCA0CisgICAgcmUgPSAvXiguKz8pKGFsfGFuY2V8ZW5jZXxlcnxpY3xhYmxlfGlibGV8YW50fGVtZW50fG1lbnR8ZW50fG91fGlzbXxhdGV8aXRpfG91c3xpdmV8aXplKSQvOworICAgIHJlMiA9IC9eKC4rPykoc3x0KShpb24pJC87CisgICAgaWYgKHJlLnRlc3QodykpIHsKKyAgICAgIHZhciBmcCA9IHJlLmV4ZWModyk7CisgICAgICBzdGVtID0gZnBbMV07CisgICAgICByZSA9IG5ldyBSZWdFeHAobWdyMSk7CisgICAgICBpZiAocmUudGVzdChzdGVtKSkKKyAgICAgICAgdyA9IHN0ZW07CisgICAgfQorICAgIGVsc2UgaWYgKHJlMi50ZXN0KHcpKSB7CisgICAgICB2YXIgZnAgPSByZTIuZXhlYyh3KTsKKyAgICAgIHN0ZW0gPSBmcFsxXSArIGZwWzJdOworICAgICAgcmUyID0gbmV3IFJlZ0V4cChtZ3IxKTsKKyAgICAgIGlmIChyZTIudGVzdChzdGVtKSkKKyAgICAgICAgdyA9IHN0ZW07CisgICAgfQorCisgICAgLy8gU3RlcCA1CisgICAgcmUgPSAvXiguKz8pZSQvOworICAgIGlmIChyZS50ZXN0KHcpKSB7CisgICAgICB2YXIgZnAgPSByZS5leGVjKHcpOworICAgICAgc3RlbSA9IGZwWzFdOworICAgICAgcmUgPSBuZXcgUmVnRXhwKG1ncjEpOworICAgICAgcmUyID0gbmV3IFJlZ0V4cChtZXExKTsKKyAgICAgIHJlMyA9IG5ldyBSZWdFeHAoIl4iICsgQyArIHYgKyAiW15hZWlvdXd4eV0kIik7CisgICAgICBpZiAocmUudGVzdChzdGVtKSB8fCAocmUyLnRlc3Qoc3RlbSkgJiYgIShyZTMudGVzdChzdGVtKSkpKQorICAgICAgICB3ID0gc3RlbTsKKyAgICB9CisgICAgcmUgPSAvbGwkLzsKKyAgICByZTIgPSBuZXcgUmVnRXhwKG1ncjEpOworICAgIGlmIChyZS50ZXN0KHcpICYmIHJlMi50ZXN0KHcpKSB7CisgICAgICByZSA9IC8uJC87CisgICAgICB3ID0gdy5yZXBsYWNlKHJlLCIiKTsKKyAgICB9CisKKyAgICAvLyBhbmQgdHVybiBpbml0aWFsIFkgYmFjayB0byB5CisgICAgaWYgKGZpcnN0Y2ggPT0gInkiKQorICAgICAgdyA9IGZpcnN0Y2gudG9Mb3dlckNhc2UoKSArIHcuc3Vic3RyKDEpOworICAgIHJldHVybiB3OworICB9Cit9CisKKworCisvKioKKyAqIFNpbXBsZSByZXN1bHQgc2NvcmluZyBjb2RlLgorICovCit2YXIgU2NvcmVyID0geworICAvLyBJbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBmdXJ0aGVyIHR3ZWFrIHRoZSBzY29yZSBmb3IgZWFjaCByZXN1bHQKKyAgLy8gVGhlIGZ1bmN0aW9uIHRha2VzIGEgcmVzdWx0IGFycmF5IFtmaWxlbmFtZSwgdGl0bGUsIGFuY2hvciwgZGVzY3IsIHNjb3JlXQorICAvLyBhbmQgcmV0dXJucyB0aGUgbmV3IHNjb3JlLgorICAvKgorICBzY29yZTogZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgcmV0dXJuIHJlc3VsdFs0XTsKKyAgfSwKKyAgKi8KKworICAvLyBxdWVyeSBtYXRjaGVzIHRoZSBmdWxsIG5hbWUgb2YgYW4gb2JqZWN0CisgIG9iak5hbWVNYXRjaDogMTEsCisgIC8vIG9yIG1hdGNoZXMgaW4gdGhlIGxhc3QgZG90dGVkIHBhcnQgb2YgdGhlIG9iamVjdCBuYW1lCisgIG9ialBhcnRpYWxNYXRjaDogNiwKKyAgLy8gQWRkaXRpdmUgc2NvcmVzIGRlcGVuZGluZyBvbiB0aGUgcHJpb3JpdHkgb2YgdGhlIG9iamVjdAorICBvYmpQcmlvOiB7MDogIDE1LCAgIC8vIHVzZWQgdG8gYmUgaW1wb3J0YW50UmVzdWx0cworICAgICAgICAgICAgMTogIDUsICAgLy8gdXNlZCB0byBiZSBvYmplY3RSZXN1bHRzCisgICAgICAgICAgICAyOiAtNX0sICAvLyB1c2VkIHRvIGJlIHVuaW1wb3J0YW50UmVzdWx0cworICAvLyAgVXNlZCB3aGVuIHRoZSBwcmlvcml0eSBpcyBub3QgaW4gdGhlIG1hcHBpbmcuCisgIG9ialByaW9EZWZhdWx0OiAwLAorCisgIC8vIHF1ZXJ5IGZvdW5kIGluIHRpdGxlCisgIHRpdGxlOiAxNSwKKyAgLy8gcXVlcnkgZm91bmQgaW4gdGVybXMKKyAgdGVybTogNQorfTsKKworCisvKioKKyAqIFNlYXJjaCBNb2R1bGUKKyAqLwordmFyIFNlYXJjaCA9IHsKKworICBfaW5kZXggOiBudWxsLAorICBfcXVldWVkX3F1ZXJ5IDogbnVsbCwKKyAgX3B1bHNlX3N0YXR1cyA6IC0xLAorCisgIGluaXQgOiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBwYXJhbXMgPSAkLmdldFF1ZXJ5UGFyYW1ldGVycygpOworICAgICAgaWYgKHBhcmFtcy5xKSB7CisgICAgICAgICAgdmFyIHF1ZXJ5ID0gcGFyYW1zLnFbMF07CisgICAgICAgICAgJCgnaW5wdXRbbmFtZT0icSJdJylbMF0udmFsdWUgPSBxdWVyeTsKKyAgICAgICAgICB0aGlzLnBlcmZvcm1TZWFyY2gocXVlcnkpOworICAgICAgfQorICB9LAorCisgIGxvYWRJbmRleCA6IGZ1bmN0aW9uKHVybCkgeworICAgICQuYWpheCh7dHlwZTogIkdFVCIsIHVybDogdXJsLCBkYXRhOiBudWxsLAorICAgICAgICAgICAgZGF0YVR5cGU6ICJzY3JpcHQiLCBjYWNoZTogdHJ1ZSwKKyAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbihqcXhociwgdGV4dHN0YXR1cykgeworICAgICAgICAgICAgICBpZiAodGV4dHN0YXR1cyAhPSAic3VjY2VzcyIpIHsKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VhcmNoaW5kZXhsb2FkZXIiKS5zcmMgPSB1cmw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH19KTsKKyAgfSwKKworICBzZXRJbmRleCA6IGZ1bmN0aW9uKGluZGV4KSB7CisgICAgdmFyIHE7CisgICAgdGhpcy5faW5kZXggPSBpbmRleDsKKyAgICBpZiAoKHEgPSB0aGlzLl9xdWV1ZWRfcXVlcnkpICE9PSBudWxsKSB7CisgICAgICB0aGlzLl9xdWV1ZWRfcXVlcnkgPSBudWxsOworICAgICAgU2VhcmNoLnF1ZXJ5KHEpOworICAgIH0KKyAgfSwKKworICBoYXNJbmRleCA6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMuX2luZGV4ICE9PSBudWxsOworICB9LAorCisgIGRlZmVyUXVlcnkgOiBmdW5jdGlvbihxdWVyeSkgeworICAgICAgdGhpcy5fcXVldWVkX3F1ZXJ5ID0gcXVlcnk7CisgIH0sCisKKyAgc3RvcFB1bHNlIDogZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLl9wdWxzZV9zdGF0dXMgPSAwOworICB9LAorCisgIHN0YXJ0UHVsc2UgOiBmdW5jdGlvbigpIHsKKyAgICBpZiAodGhpcy5fcHVsc2Vfc3RhdHVzID49IDApCisgICAgICAgIHJldHVybjsKKyAgICBmdW5jdGlvbiBwdWxzZSgpIHsKKyAgICAgIHZhciBpOworICAgICAgU2VhcmNoLl9wdWxzZV9zdGF0dXMgPSAoU2VhcmNoLl9wdWxzZV9zdGF0dXMgKyAxKSAlIDQ7CisgICAgICB2YXIgZG90U3RyaW5nID0gJyc7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU2VhcmNoLl9wdWxzZV9zdGF0dXM7IGkrKykKKyAgICAgICAgZG90U3RyaW5nICs9ICcuJzsKKyAgICAgIFNlYXJjaC5kb3RzLnRleHQoZG90U3RyaW5nKTsKKyAgICAgIGlmIChTZWFyY2guX3B1bHNlX3N0YXR1cyA+IC0xKQorICAgICAgICB3aW5kb3cuc2V0VGltZW91dChwdWxzZSwgNTAwKTsKKyAgICB9CisgICAgcHVsc2UoKTsKKyAgfSwKKworICAvKioKKyAgICogcGVyZm9ybSBhIHNlYXJjaCBmb3Igc29tZXRoaW5nIChvciB3YWl0IHVudGlsIGluZGV4IGlzIGxvYWRlZCkKKyAgICovCisgIHBlcmZvcm1TZWFyY2ggOiBmdW5jdGlvbihxdWVyeSkgeworICAgIC8vIGNyZWF0ZSB0aGUgcmVxdWlyZWQgaW50ZXJmYWNlIGVsZW1lbnRzCisgICAgdGhpcy5vdXQgPSAkKCcjc2VhcmNoLXJlc3VsdHMnKTsKKyAgICB0aGlzLnRpdGxlID0gJCgnPGgyPicgKyBfKCdTZWFyY2hpbmcnKSArICc8L2gyPicpLmFwcGVuZFRvKHRoaXMub3V0KTsKKyAgICB0aGlzLmRvdHMgPSAkKCc8c3Bhbj48L3NwYW4+JykuYXBwZW5kVG8odGhpcy50aXRsZSk7CisgICAgdGhpcy5zdGF0dXMgPSAkKCc8cCBzdHlsZT0iZGlzcGxheTogbm9uZSI+PC9wPicpLmFwcGVuZFRvKHRoaXMub3V0KTsKKyAgICB0aGlzLm91dHB1dCA9ICQoJzx1bCBjbGFzcz0ic2VhcmNoIi8+JykuYXBwZW5kVG8odGhpcy5vdXQpOworCisgICAgJCgnI3NlYXJjaC1wcm9ncmVzcycpLnRleHQoXygnUHJlcGFyaW5nIHNlYXJjaC4uLicpKTsKKyAgICB0aGlzLnN0YXJ0UHVsc2UoKTsKKworICAgIC8vIGluZGV4IGFscmVhZHkgbG9hZGVkLCB0aGUgYnJvd3NlciB3YXMgcXVpY2shCisgICAgaWYgKHRoaXMuaGFzSW5kZXgoKSkKKyAgICAgIHRoaXMucXVlcnkocXVlcnkpOworICAgIGVsc2UKKyAgICAgIHRoaXMuZGVmZXJRdWVyeShxdWVyeSk7CisgIH0sCisKKyAgLyoqCisgICAqIGV4ZWN1dGUgc2VhcmNoIChyZXF1aXJlcyBzZWFyY2ggaW5kZXggdG8gYmUgbG9hZGVkKQorICAgKi8KKyAgcXVlcnkgOiBmdW5jdGlvbihxdWVyeSkgeworICAgIHZhciBpOworICAgIHZhciBzdG9wd29yZHMgPSBbImEiLCJhbmQiLCJhcmUiLCJhcyIsImF0IiwiYmUiLCJidXQiLCJieSIsImZvciIsImlmIiwiaW4iLCJpbnRvIiwiaXMiLCJpdCIsIm5lYXIiLCJubyIsIm5vdCIsIm9mIiwib24iLCJvciIsInN1Y2giLCJ0aGF0IiwidGhlIiwidGhlaXIiLCJ0aGVuIiwidGhlcmUiLCJ0aGVzZSIsInRoZXkiLCJ0aGlzIiwidG8iLCJ3YXMiLCJ3aWxsIiwid2l0aCJdOworCisgICAgLy8gc3RlbSB0aGUgc2VhcmNodGVybXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjb3JyZWN0IGxpc3QKKyAgICB2YXIgc3RlbW1lciA9IG5ldyBTdGVtbWVyKCk7CisgICAgdmFyIHNlYXJjaHRlcm1zID0gW107CisgICAgdmFyIGV4Y2x1ZGVkID0gW107CisgICAgdmFyIGhsdGVybXMgPSBbXTsKKyAgICB2YXIgdG1wID0gcXVlcnkuc3BsaXQoL1xzKy8pOworICAgIHZhciBvYmplY3R0ZXJtcyA9IFtdOworICAgIGZvciAoaSA9IDA7IGkgPCB0bXAubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmICh0bXBbaV0gIT09ICIiKSB7CisgICAgICAgICAgb2JqZWN0dGVybXMucHVzaCh0bXBbaV0udG9Mb3dlckNhc2UoKSk7CisgICAgICB9CisKKyAgICAgIGlmICgkdS5pbmRleE9mKHN0b3B3b3JkcywgdG1wW2ldLnRvTG93ZXJDYXNlKCkpICE9IC0xIHx8IHRtcFtpXS5tYXRjaCgvXlxkKyQvKSB8fAorICAgICAgICAgIHRtcFtpXSA9PT0gIiIpIHsKKyAgICAgICAgLy8gc2tpcCB0aGlzICJ3b3JkIgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIC8vIHN0ZW0gdGhlIHdvcmQKKyAgICAgIHZhciB3b3JkID0gc3RlbW1lci5zdGVtV29yZCh0bXBbaV0udG9Mb3dlckNhc2UoKSk7CisgICAgICB2YXIgdG9BcHBlbmQ7CisgICAgICAvLyBzZWxlY3QgdGhlIGNvcnJlY3QgbGlzdAorICAgICAgaWYgKHdvcmRbMF0gPT0gJy0nKSB7CisgICAgICAgIHRvQXBwZW5kID0gZXhjbHVkZWQ7CisgICAgICAgIHdvcmQgPSB3b3JkLnN1YnN0cigxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICB0b0FwcGVuZCA9IHNlYXJjaHRlcm1zOworICAgICAgICBobHRlcm1zLnB1c2godG1wW2ldLnRvTG93ZXJDYXNlKCkpOworICAgICAgfQorICAgICAgLy8gb25seSBhZGQgaWYgbm90IGFscmVhZHkgaW4gdGhlIGxpc3QKKyAgICAgIGlmICghJHUuY29udGFpbnModG9BcHBlbmQsIHdvcmQpKQorICAgICAgICB0b0FwcGVuZC5wdXNoKHdvcmQpOworICAgIH0KKyAgICB2YXIgaGlnaGxpZ2h0c3RyaW5nID0gJz9oaWdobGlnaHQ9JyArICQudXJsZW5jb2RlKGhsdGVybXMuam9pbigiICIpKTsKKworICAgIC8vIGNvbnNvbGUuZGVidWcoJ1NFQVJDSDogc2VhcmNoaW5nIGZvcjonKTsKKyAgICAvLyBjb25zb2xlLmluZm8oJ3JlcXVpcmVkOiAnLCBzZWFyY2h0ZXJtcyk7CisgICAgLy8gY29uc29sZS5pbmZvKCdleGNsdWRlZDogJywgZXhjbHVkZWQpOworCisgICAgLy8gcHJlcGFyZSBzZWFyY2gKKyAgICB2YXIgdGVybXMgPSB0aGlzLl9pbmRleC50ZXJtczsKKyAgICB2YXIgdGl0bGV0ZXJtcyA9IHRoaXMuX2luZGV4LnRpdGxldGVybXM7CisKKyAgICAvLyBhcnJheSBvZiBbZmlsZW5hbWUsIHRpdGxlLCBhbmNob3IsIGRlc2NyLCBzY29yZV0KKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgICQoJyNzZWFyY2gtcHJvZ3Jlc3MnKS5lbXB0eSgpOworCisgICAgLy8gbG9va3VwIGFzIG9iamVjdAorICAgIGZvciAoaSA9IDA7IGkgPCBvYmplY3R0ZXJtcy5sZW5ndGg7IGkrKykgeworICAgICAgdmFyIG90aGVycyA9IFtdLmNvbmNhdChvYmplY3R0ZXJtcy5zbGljZSgwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0dGVybXMuc2xpY2UoaSsxLCBvYmplY3R0ZXJtcy5sZW5ndGgpKTsKKyAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdCh0aGlzLnBlcmZvcm1PYmplY3RTZWFyY2gob2JqZWN0dGVybXNbaV0sIG90aGVycykpOworICAgIH0KKworICAgIC8vIGxvb2t1cCBhcyBzZWFyY2ggdGVybXMgaW4gZnVsbHRleHQKKyAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQodGhpcy5wZXJmb3JtVGVybXNTZWFyY2goc2VhcmNodGVybXMsIGV4Y2x1ZGVkLCB0ZXJtcywgU2NvcmVyLnRlcm0pKQorICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCh0aGlzLnBlcmZvcm1UZXJtc1NlYXJjaChzZWFyY2h0ZXJtcywgZXhjbHVkZWQsIHRpdGxldGVybXMsIFNjb3Jlci50aXRsZSkpOworCisgICAgLy8gbGV0IHRoZSBzY29yZXIgb3ZlcnJpZGUgc2NvcmVzIHdpdGggYSBjdXN0b20gc2NvcmluZyBmdW5jdGlvbgorICAgIGlmIChTY29yZXIuc2NvcmUpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKQorICAgICAgICByZXN1bHRzW2ldWzRdID0gU2NvcmVyLnNjb3JlKHJlc3VsdHNbaV0pOworICAgIH0KKworICAgIC8vIG5vdyBzb3J0IHRoZSByZXN1bHRzIGJ5IHNjb3JlIChpbiBvcHBvc2l0ZSBvcmRlciBvZiBhcHBlYXJhbmNlLCBzaW5jZSB0aGUKKyAgICAvLyBkaXNwbGF5IGZ1bmN0aW9uIGJlbG93IHVzZXMgcG9wKCkgdG8gcmV0cmlldmUgaXRlbXMpIGFuZCB0aGVuCisgICAgLy8gYWxwaGFiZXRpY2FsbHkKKyAgICByZXN1bHRzLnNvcnQoZnVuY3Rpb24oYSwgYikgeworICAgICAgdmFyIGxlZnQgPSBhWzRdOworICAgICAgdmFyIHJpZ2h0ID0gYls0XTsKKyAgICAgIGlmIChsZWZ0ID4gcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9IGVsc2UgaWYgKGxlZnQgPCByaWdodCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBzYW1lIHNjb3JlOiBzb3J0IGFscGhhYmV0aWNhbGx5CisgICAgICAgIGxlZnQgPSBhWzFdLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIHJpZ2h0ID0gYlsxXS50b0xvd2VyQ2FzZSgpOworICAgICAgICByZXR1cm4gKGxlZnQgPiByaWdodCkgPyAtMSA6ICgobGVmdCA8IHJpZ2h0KSA/IDEgOiAwKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIC8vIGZvciBkZWJ1Z2dpbmcKKyAgICAvL1NlYXJjaC5sYXN0cmVzdWx0cyA9IHJlc3VsdHMuc2xpY2UoKTsgIC8vIGEgY29weQorICAgIC8vY29uc29sZS5pbmZvKCdzZWFyY2ggcmVzdWx0czonLCBTZWFyY2gubGFzdHJlc3VsdHMpOworCisgICAgLy8gcHJpbnQgdGhlIHJlc3VsdHMKKyAgICB2YXIgcmVzdWx0Q291bnQgPSByZXN1bHRzLmxlbmd0aDsKKyAgICBmdW5jdGlvbiBkaXNwbGF5TmV4dEl0ZW0oKSB7CisgICAgICAvLyByZXN1bHRzIGxlZnQsIGxvYWQgdGhlIHN1bW1hcnkgYW5kIGRpc3BsYXkgaXQKKyAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCkgeworICAgICAgICB2YXIgaXRlbSA9IHJlc3VsdHMucG9wKCk7CisgICAgICAgIHZhciBsaXN0SXRlbSA9ICQoJzxsaSBzdHlsZT0iZGlzcGxheTpub25lIj48L2xpPicpOworICAgICAgICBpZiAoRE9DVU1FTlRBVElPTl9PUFRJT05TLkZJTEVfU1VGRklYID09PSAnJykgeworICAgICAgICAgIC8vIGRpcmh0bWwgYnVpbGRlcgorICAgICAgICAgIHZhciBkaXJuYW1lID0gaXRlbVswXSArICcvJzsKKyAgICAgICAgICBpZiAoZGlybmFtZS5tYXRjaCgvXC9pbmRleFwvJC8pKSB7CisgICAgICAgICAgICBkaXJuYW1lID0gZGlybmFtZS5zdWJzdHJpbmcoMCwgZGlybmFtZS5sZW5ndGgtNik7CisgICAgICAgICAgfSBlbHNlIGlmIChkaXJuYW1lID09ICdpbmRleC8nKSB7CisgICAgICAgICAgICBkaXJuYW1lID0gJyc7CisgICAgICAgICAgfQorICAgICAgICAgIGxpc3RJdGVtLmFwcGVuZCgkKCc8YS8+JykuYXR0cignaHJlZicsCisgICAgICAgICAgICBET0NVTUVOVEFUSU9OX09QVElPTlMuVVJMX1JPT1QgKyBkaXJuYW1lICsKKyAgICAgICAgICAgIGhpZ2hsaWdodHN0cmluZyArIGl0ZW1bMl0pLmh0bWwoaXRlbVsxXSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIG5vcm1hbCBodG1sIGJ1aWxkZXJzCisgICAgICAgICAgbGlzdEl0ZW0uYXBwZW5kKCQoJzxhLz4nKS5hdHRyKCdocmVmJywKKyAgICAgICAgICAgIGl0ZW1bMF0gKyBET0NVTUVOVEFUSU9OX09QVElPTlMuRklMRV9TVUZGSVggKworICAgICAgICAgICAgaGlnaGxpZ2h0c3RyaW5nICsgaXRlbVsyXSkuaHRtbChpdGVtWzFdKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZW1bM10pIHsKKyAgICAgICAgICBsaXN0SXRlbS5hcHBlbmQoJCgnPHNwYW4+ICgnICsgaXRlbVszXSArICcpPC9zcGFuPicpKTsKKyAgICAgICAgICBTZWFyY2gub3V0cHV0LmFwcGVuZChsaXN0SXRlbSk7CisgICAgICAgICAgbGlzdEl0ZW0uc2xpZGVEb3duKDUsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgZGlzcGxheU5leHRJdGVtKCk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSBpZiAoRE9DVU1FTlRBVElPTl9PUFRJT05TLkhBU19TT1VSQ0UpIHsKKyAgICAgICAgICAkLmFqYXgoe3VybDogRE9DVU1FTlRBVElPTl9PUFRJT05TLlVSTF9ST09UICsgJ19zb3VyY2VzLycgKyBpdGVtWzBdICsgJy50eHQnLAorICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6ICJ0ZXh0IiwKKyAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbihqcXhociwgdGV4dHN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGpxeGhyLnJlc3BvbnNlVGV4dDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT09ICcnKSB7CisgICAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW0uYXBwZW5kKFNlYXJjaC5tYWtlU2VhcmNoU3VtbWFyeShkYXRhLCBzZWFyY2h0ZXJtcywgaGx0ZXJtcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNlYXJjaC5vdXRwdXQuYXBwZW5kKGxpc3RJdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW0uc2xpZGVEb3duKDUsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOZXh0SXRlbSgpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBubyBzb3VyY2UgYXZhaWxhYmxlLCBqdXN0IGRpc3BsYXkgdGl0bGUKKyAgICAgICAgICBTZWFyY2gub3V0cHV0LmFwcGVuZChsaXN0SXRlbSk7CisgICAgICAgICAgbGlzdEl0ZW0uc2xpZGVEb3duKDUsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgZGlzcGxheU5leHRJdGVtKCk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIHNlYXJjaCBmaW5pc2hlZCwgdXBkYXRlIHRpdGxlIGFuZCBzdGF0dXMgbWVzc2FnZQorICAgICAgZWxzZSB7CisgICAgICAgIFNlYXJjaC5zdG9wUHVsc2UoKTsKKyAgICAgICAgU2VhcmNoLnRpdGxlLnRleHQoXygnU2VhcmNoIFJlc3VsdHMnKSk7CisgICAgICAgIGlmICghcmVzdWx0Q291bnQpCisgICAgICAgICAgU2VhcmNoLnN0YXR1cy50ZXh0KF8oJ1lvdXIgc2VhcmNoIGRpZCBub3QgbWF0Y2ggYW55IGRvY3VtZW50cy4gUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IGFsbCB3b3JkcyBhcmUgc3BlbGxlZCBjb3JyZWN0bHkgYW5kIHRoYXQgeW91XCd2ZSBzZWxlY3RlZCBlbm91Z2ggY2F0ZWdvcmllcy4nKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNlYXJjaC5zdGF0dXMudGV4dChfKCdTZWFyY2ggZmluaXNoZWQsIGZvdW5kICVzIHBhZ2UocykgbWF0Y2hpbmcgdGhlIHNlYXJjaCBxdWVyeS4nKS5yZXBsYWNlKCclcycsIHJlc3VsdENvdW50KSk7CisgICAgICAgIFNlYXJjaC5zdGF0dXMuZmFkZUluKDUwMCk7CisgICAgICB9CisgICAgfQorICAgIGRpc3BsYXlOZXh0SXRlbSgpOworICB9LAorCisgIC8qKgorICAgKiBzZWFyY2ggZm9yIG9iamVjdCBuYW1lcworICAgKi8KKyAgcGVyZm9ybU9iamVjdFNlYXJjaCA6IGZ1bmN0aW9uKG9iamVjdCwgb3RoZXJ0ZXJtcykgeworICAgIHZhciBmaWxlbmFtZXMgPSB0aGlzLl9pbmRleC5maWxlbmFtZXM7CisgICAgdmFyIG9iamVjdHMgPSB0aGlzLl9pbmRleC5vYmplY3RzOworICAgIHZhciBvYmpuYW1lcyA9IHRoaXMuX2luZGV4Lm9iam5hbWVzOworICAgIHZhciB0aXRsZXMgPSB0aGlzLl9pbmRleC50aXRsZXM7CisKKyAgICB2YXIgaTsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworCisgICAgZm9yICh2YXIgcHJlZml4IGluIG9iamVjdHMpIHsKKyAgICAgIGZvciAodmFyIG5hbWUgaW4gb2JqZWN0c1twcmVmaXhdKSB7CisgICAgICAgIHZhciBmdWxsbmFtZSA9IChwcmVmaXggPyBwcmVmaXggKyAnLicgOiAnJykgKyBuYW1lOworICAgICAgICBpZiAoZnVsbG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKG9iamVjdCkgPiAtMSkgeworICAgICAgICAgIHZhciBzY29yZSA9IDA7CisgICAgICAgICAgdmFyIHBhcnRzID0gZnVsbG5hbWUuc3BsaXQoJy4nKTsKKyAgICAgICAgICAvLyBjaGVjayBmb3IgZGlmZmVyZW50IG1hdGNoIHR5cGVzOiBleGFjdCBtYXRjaGVzIG9mIGZ1bGwgbmFtZSBvcgorICAgICAgICAgIC8vICJsYXN0IG5hbWUiIChpLmUuIGxhc3QgZG90dGVkIHBhcnQpCisgICAgICAgICAgaWYgKGZ1bGxuYW1lID09IG9iamVjdCB8fCBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PSBvYmplY3QpIHsKKyAgICAgICAgICAgIHNjb3JlICs9IFNjb3Jlci5vYmpOYW1lTWF0Y2g7CisgICAgICAgICAgLy8gbWF0Y2hlcyBpbiBsYXN0IG5hbWUKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLmluZGV4T2Yob2JqZWN0KSA+IC0xKSB7CisgICAgICAgICAgICBzY29yZSArPSBTY29yZXIub2JqUGFydGlhbE1hdGNoOworICAgICAgICAgIH0KKyAgICAgICAgICB2YXIgbWF0Y2ggPSBvYmplY3RzW3ByZWZpeF1bbmFtZV07CisgICAgICAgICAgdmFyIG9iam5hbWUgPSBvYmpuYW1lc1ttYXRjaFsxXV1bMl07CisgICAgICAgICAgdmFyIHRpdGxlID0gdGl0bGVzW21hdGNoWzBdXTsKKyAgICAgICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIHRlcm0gc2VhcmNoZWQgZm9yLCB3ZSByZXF1aXJlIG90aGVyIHdvcmRzIHRvIGJlCisgICAgICAgICAgLy8gZm91bmQgaW4gdGhlIG5hbWUvdGl0bGUvZGVzY3JpcHRpb24KKyAgICAgICAgICBpZiAob3RoZXJ0ZXJtcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICB2YXIgaGF5c3RhY2sgPSAocHJlZml4ICsgJyAnICsgbmFtZSArICcgJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqbmFtZSArICcgJyArIHRpdGxlKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgdmFyIGFsbGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdGhlcnRlcm1zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgIGlmIChoYXlzdGFjay5pbmRleE9mKG90aGVydGVybXNbaV0pID09IC0xKSB7CisgICAgICAgICAgICAgICAgYWxsZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFhbGxmb3VuZCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIGRlc2NyID0gb2JqbmFtZSArIF8oJywgaW4gJykgKyB0aXRsZTsKKworICAgICAgICAgIHZhciBhbmNob3IgPSBtYXRjaFszXTsKKyAgICAgICAgICBpZiAoYW5jaG9yID09PSAnJykKKyAgICAgICAgICAgIGFuY2hvciA9IGZ1bGxuYW1lOworICAgICAgICAgIGVsc2UgaWYgKGFuY2hvciA9PSAnLScpCisgICAgICAgICAgICBhbmNob3IgPSBvYmpuYW1lc1ttYXRjaFsxXV1bMV0gKyAnLScgKyBmdWxsbmFtZTsKKyAgICAgICAgICAvLyBhZGQgY3VzdG9tIHNjb3JlIGZvciBzb21lIG9iamVjdHMgYWNjb3JkaW5nIHRvIHNjb3JlcgorICAgICAgICAgIGlmIChTY29yZXIub2JqUHJpby5oYXNPd25Qcm9wZXJ0eShtYXRjaFsyXSkpIHsKKyAgICAgICAgICAgIHNjb3JlICs9IFNjb3Jlci5vYmpQcmlvW21hdGNoWzJdXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2NvcmUgKz0gU2NvcmVyLm9ialByaW9EZWZhdWx0OworICAgICAgICAgIH0KKyAgICAgICAgICByZXN1bHRzLnB1c2goW2ZpbGVuYW1lc1ttYXRjaFswXV0sIGZ1bGxuYW1lLCAnIycrYW5jaG9yLCBkZXNjciwgc2NvcmVdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHRzOworICB9LAorCisgIC8qKgorICAgKiBzZWFyY2ggZm9yIGZ1bGwtdGV4dCB0ZXJtcyBpbiB0aGUgaW5kZXgKKyAgICovCisgIHBlcmZvcm1UZXJtc1NlYXJjaCA6IGZ1bmN0aW9uKHNlYXJjaHRlcm1zLCBleGNsdWRlZCwgdGVybXMsIHNjb3JlKSB7CisgICAgdmFyIGZpbGVuYW1lcyA9IHRoaXMuX2luZGV4LmZpbGVuYW1lczsKKyAgICB2YXIgdGl0bGVzID0gdGhpcy5faW5kZXgudGl0bGVzOworCisgICAgdmFyIGksIGosIGZpbGUsIGZpbGVzOworICAgIHZhciBmaWxlTWFwID0ge307CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKworICAgIC8vIHBlcmZvcm0gdGhlIHNlYXJjaCBvbiB0aGUgcmVxdWlyZWQgdGVybXMKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VhcmNodGVybXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciB3b3JkID0gc2VhcmNodGVybXNbaV07CisgICAgICAvLyBubyBtYXRjaCBidXQgd29yZCB3YXMgYSByZXF1aXJlZCBvbmUKKyAgICAgIGlmICgoZmlsZXMgPSB0ZXJtc1t3b3JkXSkgPT09IHVuZGVmaW5lZCkKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAoZmlsZXMubGVuZ3RoID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgZmlsZXMgPSBbZmlsZXNdOworICAgICAgfQorICAgICAgLy8gY3JlYXRlIHRoZSBtYXBwaW5nCisgICAgICBmb3IgKGogPSAwOyBqIDwgZmlsZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgZmlsZSA9IGZpbGVzW2pdOworICAgICAgICBpZiAoZmlsZSBpbiBmaWxlTWFwKQorICAgICAgICAgIGZpbGVNYXBbZmlsZV0ucHVzaCh3b3JkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZpbGVNYXBbZmlsZV0gPSBbd29yZF07CisgICAgICB9CisgICAgfQorCisgICAgLy8gbm93IGNoZWNrIGlmIHRoZSBmaWxlcyBkb24ndCBjb250YWluIGV4Y2x1ZGVkIHRlcm1zCisgICAgZm9yIChmaWxlIGluIGZpbGVNYXApIHsKKyAgICAgIHZhciB2YWxpZCA9IHRydWU7CisKKyAgICAgIC8vIGNoZWNrIGlmIGFsbCByZXF1aXJlbWVudHMgYXJlIG1hdGNoZWQKKyAgICAgIGlmIChmaWxlTWFwW2ZpbGVdLmxlbmd0aCAhPSBzZWFyY2h0ZXJtcy5sZW5ndGgpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIGVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlIGV4Y2x1ZGVkIHRlcm1zIGlzIGluIHRoZSBzZWFyY2ggcmVzdWx0CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZXhjbHVkZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKHRlcm1zW2V4Y2x1ZGVkW2ldXSA9PSBmaWxlIHx8CisgICAgICAgICAgJHUuY29udGFpbnModGVybXNbZXhjbHVkZWRbaV1dIHx8IFtdLCBmaWxlKSkgeworICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gaWYgd2UgaGF2ZSBzdGlsbCBhIHZhbGlkIHJlc3VsdCB3ZSBjYW4gYWRkIGl0IHRvIHRoZSByZXN1bHQgbGlzdAorICAgICAgaWYgKHZhbGlkKSB7CisgICAgICAgIHJlc3VsdHMucHVzaChbZmlsZW5hbWVzW2ZpbGVdLCB0aXRsZXNbZmlsZV0sICcnLCBudWxsLCBzY29yZV0pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwKKworICAvKioKKyAgICogaGVscGVyIGZ1bmN0aW9uIHRvIHJldHVybiBhIG5vZGUgY29udGFpbmluZyB0aGUKKyAgICogc2VhcmNoIHN1bW1hcnkgZm9yIGEgZ2l2ZW4gdGV4dC4ga2V5d29yZHMgaXMgYSBsaXN0CisgICAqIG9mIHN0ZW1tZWQgd29yZHMsIGhsd29yZHMgaXMgdGhlIGxpc3Qgb2Ygbm9ybWFsLCB1bnN0ZW1tZWQKKyAgICogd29yZHMuIHRoZSBmaXJzdCBvbmUgaXMgdXNlZCB0byBmaW5kIHRoZSBvY2N1cmFuY2UsIHRoZQorICAgKiBsYXR0ZXIgZm9yIGhpZ2hsaWdodGluZyBpdC4KKyAgICovCisgIG1ha2VTZWFyY2hTdW1tYXJ5IDogZnVuY3Rpb24odGV4dCwga2V5d29yZHMsIGhsd29yZHMpIHsKKyAgICB2YXIgdGV4dExvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpOworICAgIHZhciBzdGFydCA9IDA7CisgICAgJC5lYWNoKGtleXdvcmRzLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBpID0gdGV4dExvd2VyLmluZGV4T2YodGhpcy50b0xvd2VyQ2FzZSgpKTsKKyAgICAgIGlmIChpID4gLTEpCisgICAgICAgIHN0YXJ0ID0gaTsKKyAgICB9KTsKKyAgICBzdGFydCA9IE1hdGgubWF4KHN0YXJ0IC0gMTIwLCAwKTsKKyAgICB2YXIgZXhjZXJwdCA9ICgoc3RhcnQgPiAwKSA/ICcuLi4nIDogJycpICsKKyAgICAgICQudHJpbSh0ZXh0LnN1YnN0cihzdGFydCwgMjQwKSkgKworICAgICAgKChzdGFydCArIDI0MCAtIHRleHQubGVuZ3RoKSA/ICcuLi4nIDogJycpOworICAgIHZhciBydiA9ICQoJzxkaXYgY2xhc3M9ImNvbnRleHQiPjwvZGl2PicpLnRleHQoZXhjZXJwdCk7CisgICAgJC5lYWNoKGhsd29yZHMsIGZ1bmN0aW9uKCkgeworICAgICAgcnYgPSBydi5oaWdobGlnaHRUZXh0KHRoaXMsICdoaWdobGlnaHRlZCcpOworICAgIH0pOworICAgIHJldHVybiBydjsKKyAgfQorfTsKKworJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CisgIFNlYXJjaC5pbml0KCk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fc3RhdGljL3NpZGViYXIuanMgYi9fc3RhdGljL3NpZGViYXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwOWEwZAotLS0gL2Rldi9udWxsCisrKyBiL19zdGF0aWMvc2lkZWJhci5qcwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIHNpZGViYXIuanMKKyAqIH5+fn5+fn5+fn4KKyAqCisgKiBUaGlzIHNjcmlwdCBtYWtlcyB0aGUgU3BoaW54IHNpZGViYXIgY29sbGFwc2libGUuCisgKgorICogLnNwaGlueHNpZGViYXIgY29udGFpbnMgLnNwaGlueHNpZGViYXJ3cmFwcGVyLiAgVGhpcyBzY3JpcHQgYWRkcworICogaW4gLnNwaGl4c2lkZWJhciwgYWZ0ZXIgLnNwaGlueHNpZGViYXJ3cmFwcGVyLCB0aGUgI3NpZGViYXJidXR0b24KKyAqIHVzZWQgdG8gY29sbGFwc2UgYW5kIGV4cGFuZCB0aGUgc2lkZWJhci4KKyAqCisgKiBXaGVuIHRoZSBzaWRlYmFyIGlzIGNvbGxhcHNlZCB0aGUgLnNwaGlueHNpZGViYXJ3cmFwcGVyIGlzIGhpZGRlbgorICogYW5kIHRoZSB3aWR0aCBvZiB0aGUgc2lkZWJhciBhbmQgdGhlIG1hcmdpbi1sZWZ0IG9mIHRoZSBkb2N1bWVudAorICogYXJlIGRlY3JlYXNlZC4gV2hlbiB0aGUgc2lkZWJhciBpcyBleHBhbmRlZCB0aGUgb3Bwb3NpdGUgaGFwcGVucy4KKyAqIFRoaXMgc2NyaXB0IHNhdmVzIGEgcGVyLWJyb3dzZXIvcGVyLXNlc3Npb24gY29va2llIHVzZWQgdG8KKyAqIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2lkZWJhciBhbW9uZyB0aGUgcGFnZXMuCisgKiBPbmNlIHRoZSBicm93c2VyIGlzIGNsb3NlZCB0aGUgY29va2llIGlzIGRlbGV0ZWQgYW5kIHRoZSBwb3NpdGlvbgorICogcmVzZXQgdG8gdGhlIGRlZmF1bHQgKGV4cGFuZGVkKS4KKyAqCisgKiA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAwNy0yMDE0IGJ5IHRoZSBTcGhpbnggdGVhbSwgc2VlIEFVVEhPUlMuCisgKiA6bGljZW5zZTogQlNELCBzZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KKyAqCisgKi8KKworJChmdW5jdGlvbigpIHsKKyAgCisgIAorICAKKyAgCisgIAorICAKKyAgCisKKyAgLy8gZ2xvYmFsIGVsZW1lbnRzIHVzZWQgYnkgdGhlIGZ1bmN0aW9ucy4KKyAgLy8gdGhlICdzaWRlYmFyYnV0dG9uJyBlbGVtZW50IGlzIGRlZmluZWQgYXMgZ2xvYmFsIGFmdGVyIGl0cworICAvLyBjcmVhdGlvbiwgaW4gdGhlIGFkZF9zaWRlYmFyX2J1dHRvbiBmdW5jdGlvbgorICB2YXIgYm9keXdyYXBwZXIgPSAkKCcuYm9keXdyYXBwZXInKTsKKyAgdmFyIHNpZGViYXIgPSAkKCcuc3BoaW54c2lkZWJhcicpOworICB2YXIgc2lkZWJhcndyYXBwZXIgPSAkKCcuc3BoaW54c2lkZWJhcndyYXBwZXInKTsKKworICAvLyBmb3Igc29tZSByZWFzb24sIHRoZSBkb2N1bWVudCBoYXMgbm8gc2lkZWJhcjsgZG8gbm90IHJ1biBpbnRvIGVycm9ycworICBpZiAoIXNpZGViYXIubGVuZ3RoKSByZXR1cm47CisKKyAgLy8gb3JpZ2luYWwgbWFyZ2luLWxlZnQgb2YgdGhlIGJvZHl3cmFwcGVyIGFuZCB3aWR0aCBvZiB0aGUgc2lkZWJhcgorICAvLyB3aXRoIHRoZSBzaWRlYmFyIGV4cGFuZGVkCisgIHZhciBid19tYXJnaW5fZXhwYW5kZWQgPSBib2R5d3JhcHBlci5jc3MoJ21hcmdpbi1sZWZ0Jyk7CisgIHZhciBzc2Jfd2lkdGhfZXhwYW5kZWQgPSBzaWRlYmFyLndpZHRoKCk7CisKKyAgLy8gbWFyZ2luLWxlZnQgb2YgdGhlIGJvZHl3cmFwcGVyIGFuZCB3aWR0aCBvZiB0aGUgc2lkZWJhcgorICAvLyB3aXRoIHRoZSBzaWRlYmFyIGNvbGxhcHNlZAorICB2YXIgYndfbWFyZ2luX2NvbGxhcHNlZCA9ICcuOGVtJzsKKyAgdmFyIHNzYl93aWR0aF9jb2xsYXBzZWQgPSAnLjhlbSc7CisKKyAgLy8gY29sb3JzIHVzZWQgYnkgdGhlIGN1cnJlbnQgdGhlbWUKKyAgdmFyIGRhcmtfY29sb3IgPSAkKCcucmVsYXRlZCcpLmNzcygnYmFja2dyb3VuZC1jb2xvcicpOworICB2YXIgbGlnaHRfY29sb3IgPSAkKCcuZG9jdW1lbnQnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InKTsKKworICBmdW5jdGlvbiBzaWRlYmFyX2lzX2NvbGxhcHNlZCgpIHsKKyAgICByZXR1cm4gc2lkZWJhcndyYXBwZXIuaXMoJzpub3QoOnZpc2libGUpJyk7CisgIH0KKworICBmdW5jdGlvbiB0b2dnbGVfc2lkZWJhcigpIHsKKyAgICBpZiAoc2lkZWJhcl9pc19jb2xsYXBzZWQoKSkKKyAgICAgIGV4cGFuZF9zaWRlYmFyKCk7CisgICAgZWxzZQorICAgICAgY29sbGFwc2Vfc2lkZWJhcigpOworICB9CisKKyAgZnVuY3Rpb24gY29sbGFwc2Vfc2lkZWJhcigpIHsKKyAgICBzaWRlYmFyd3JhcHBlci5oaWRlKCk7CisgICAgc2lkZWJhci5jc3MoJ3dpZHRoJywgc3NiX3dpZHRoX2NvbGxhcHNlZCk7CisgICAgYm9keXdyYXBwZXIuY3NzKCdtYXJnaW4tbGVmdCcsIGJ3X21hcmdpbl9jb2xsYXBzZWQpOworICAgIHNpZGViYXJidXR0b24uY3NzKHsKKyAgICAgICAgJ21hcmdpbi1sZWZ0JzogJzAnLAorICAgICAgICAnaGVpZ2h0JzogYm9keXdyYXBwZXIuaGVpZ2h0KCkKKyAgICB9KTsKKyAgICBzaWRlYmFyYnV0dG9uLmZpbmQoJ3NwYW4nKS50ZXh0KCfCuycpOworICAgIHNpZGViYXJidXR0b24uYXR0cigndGl0bGUnLCBfKCdFeHBhbmQgc2lkZWJhcicpKTsKKyAgICBkb2N1bWVudC5jb29raWUgPSAnc2lkZWJhcj1jb2xsYXBzZWQnOworICB9CisKKyAgZnVuY3Rpb24gZXhwYW5kX3NpZGViYXIoKSB7CisgICAgYm9keXdyYXBwZXIuY3NzKCdtYXJnaW4tbGVmdCcsIGJ3X21hcmdpbl9leHBhbmRlZCk7CisgICAgc2lkZWJhci5jc3MoJ3dpZHRoJywgc3NiX3dpZHRoX2V4cGFuZGVkKTsKKyAgICBzaWRlYmFyd3JhcHBlci5zaG93KCk7CisgICAgc2lkZWJhcmJ1dHRvbi5jc3MoeworICAgICAgICAnbWFyZ2luLWxlZnQnOiBzc2Jfd2lkdGhfZXhwYW5kZWQtMTIsCisgICAgICAgICdoZWlnaHQnOiBib2R5d3JhcHBlci5oZWlnaHQoKQorICAgIH0pOworICAgIHNpZGViYXJidXR0b24uZmluZCgnc3BhbicpLnRleHQoJ8KrJyk7CisgICAgc2lkZWJhcmJ1dHRvbi5hdHRyKCd0aXRsZScsIF8oJ0NvbGxhcHNlIHNpZGViYXInKSk7CisgICAgZG9jdW1lbnQuY29va2llID0gJ3NpZGViYXI9ZXhwYW5kZWQnOworICB9CisKKyAgZnVuY3Rpb24gYWRkX3NpZGViYXJfYnV0dG9uKCkgeworICAgIHNpZGViYXJ3cmFwcGVyLmNzcyh7CisgICAgICAgICdmbG9hdCc6ICdsZWZ0JywKKyAgICAgICAgJ21hcmdpbi1yaWdodCc6ICcwJywKKyAgICAgICAgJ3dpZHRoJzogc3NiX3dpZHRoX2V4cGFuZGVkIC0gMjgKKyAgICB9KTsKKyAgICAvLyBjcmVhdGUgdGhlIGJ1dHRvbgorICAgIHNpZGViYXIuYXBwZW5kKAorICAgICAgICAnPGRpdiBpZD0ic2lkZWJhcmJ1dHRvbiI+PHNwYW4+JmxhcXVvOzwvc3Bhbj48L2Rpdj4nCisgICAgKTsKKyAgICB2YXIgc2lkZWJhcmJ1dHRvbiA9ICQoJyNzaWRlYmFyYnV0dG9uJyk7CisgICAgbGlnaHRfY29sb3IgPSBzaWRlYmFyYnV0dG9uLmNzcygnYmFja2dyb3VuZC1jb2xvcicpOworICAgIC8vIGZpbmQgdGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQgdG8gY2VudGVyIHRoZSAnPDwnIGluIHRoZSBwYWdlCisgICAgdmFyIHZpZXdwb3J0X2hlaWdodDsKKyAgICBpZiAod2luZG93LmlubmVySGVpZ2h0KQorIAkgIHZpZXdwb3J0X2hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsKKyAgICBlbHNlCisJICB2aWV3cG9ydF9oZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7CisgICAgc2lkZWJhcmJ1dHRvbi5maW5kKCdzcGFuJykuY3NzKHsKKyAgICAgICAgJ2Rpc3BsYXknOiAnYmxvY2snLAorICAgICAgICAnbWFyZ2luLXRvcCc6ICh2aWV3cG9ydF9oZWlnaHQgLSBzaWRlYmFyLnBvc2l0aW9uKCkudG9wIC0gMjApIC8gMgorICAgIH0pOworCisgICAgc2lkZWJhcmJ1dHRvbi5jbGljayh0b2dnbGVfc2lkZWJhcik7CisgICAgc2lkZWJhcmJ1dHRvbi5hdHRyKCd0aXRsZScsIF8oJ0NvbGxhcHNlIHNpZGViYXInKSk7CisgICAgc2lkZWJhcmJ1dHRvbi5jc3MoeworICAgICAgICAnY29sb3InOiAnI0ZGRkZGRicsCisgICAgICAgICdib3JkZXItbGVmdCc6ICcxcHggc29saWQgJyArIGRhcmtfY29sb3IsCisgICAgICAgICdmb250LXNpemUnOiAnMS4yZW0nLAorICAgICAgICAnY3Vyc29yJzogJ3BvaW50ZXInLAorICAgICAgICAnaGVpZ2h0JzogYm9keXdyYXBwZXIuaGVpZ2h0KCksCisgICAgICAgICdwYWRkaW5nLXRvcCc6ICcxcHgnLAorICAgICAgICAnbWFyZ2luLWxlZnQnOiBzc2Jfd2lkdGhfZXhwYW5kZWQgLSAxMgorICAgIH0pOworCisgICAgc2lkZWJhcmJ1dHRvbi5ob3ZlcigKKyAgICAgIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAkKHRoaXMpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsIGRhcmtfY29sb3IpOworICAgICAgfSwKKyAgICAgIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAkKHRoaXMpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsIGxpZ2h0X2NvbG9yKTsKKyAgICAgIH0KKyAgICApOworICB9CisKKyAgZnVuY3Rpb24gc2V0X3Bvc2l0aW9uX2Zyb21fY29va2llKCkgeworICAgIGlmICghZG9jdW1lbnQuY29va2llKQorICAgICAgcmV0dXJuOworICAgIHZhciBpdGVtcyA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOworICAgIGZvcih2YXIgaz0wOyBrPGl0ZW1zLmxlbmd0aDsgaysrKSB7CisgICAgICB2YXIga2V5X3ZhbCA9IGl0ZW1zW2tdLnNwbGl0KCc9Jyk7CisgICAgICB2YXIga2V5ID0ga2V5X3ZhbFswXS5yZXBsYWNlKC8gLywgIiIpOyAgLy8gc3RyaXAgbGVhZGluZyBzcGFjZXMKKyAgICAgIGlmIChrZXkgPT0gJ3NpZGViYXInKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IGtleV92YWxbMV07CisgICAgICAgIGlmICgodmFsdWUgPT0gJ2NvbGxhcHNlZCcpICYmICghc2lkZWJhcl9pc19jb2xsYXBzZWQoKSkpCisgICAgICAgICAgY29sbGFwc2Vfc2lkZWJhcigpOworICAgICAgICBlbHNlIGlmICgodmFsdWUgPT0gJ2V4cGFuZGVkJykgJiYgKHNpZGViYXJfaXNfY29sbGFwc2VkKCkpKQorICAgICAgICAgIGV4cGFuZF9zaWRlYmFyKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgYWRkX3NpZGViYXJfYnV0dG9uKCk7CisgIHZhciBzaWRlYmFyYnV0dG9uID0gJCgnI3NpZGViYXJidXR0b24nKTsKKyAgc2V0X3Bvc2l0aW9uX2Zyb21fY29va2llKCk7Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fc3RhdGljL3VuZGVyc2NvcmUuanMgYi9fc3RhdGljL3VuZGVyc2NvcmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyZjBkOQotLS0gL2Rldi9udWxsCisrKyBiL19zdGF0aWMvdW5kZXJzY29yZS5qcwpAQCAtMCwwICsxLDEyMjYgQEAKKy8vICAgICBVbmRlcnNjb3JlLmpzIDEuNC40CisvLyAgICAgaHR0cDovL3VuZGVyc2NvcmVqcy5vcmcKKy8vICAgICAoYykgMjAwOS0yMDEzIEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBJbmMuCisvLyAgICAgVW5kZXJzY29yZSBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KKworKGZ1bmN0aW9uKCkgeworCisgIC8vIEJhc2VsaW5lIHNldHVwCisgIC8vIC0tLS0tLS0tLS0tLS0tCisKKyAgLy8gRXN0YWJsaXNoIHRoZSByb290IG9iamVjdCwgYHdpbmRvd2AgaW4gdGhlIGJyb3dzZXIsIG9yIGBnbG9iYWxgIG9uIHRoZSBzZXJ2ZXIuCisgIHZhciByb290ID0gdGhpczsKKworICAvLyBTYXZlIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgYF9gIHZhcmlhYmxlLgorICB2YXIgcHJldmlvdXNVbmRlcnNjb3JlID0gcm9vdC5fOworCisgIC8vIEVzdGFibGlzaCB0aGUgb2JqZWN0IHRoYXQgZ2V0cyByZXR1cm5lZCB0byBicmVhayBvdXQgb2YgYSBsb29wIGl0ZXJhdGlvbi4KKyAgdmFyIGJyZWFrZXIgPSB7fTsKKworICAvLyBTYXZlIGJ5dGVzIGluIHRoZSBtaW5pZmllZCAoYnV0IG5vdCBnemlwcGVkKSB2ZXJzaW9uOgorICB2YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSwgT2JqUHJvdG8gPSBPYmplY3QucHJvdG90eXBlLCBGdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7CisKKyAgLy8gQ3JlYXRlIHF1aWNrIHJlZmVyZW5jZSB2YXJpYWJsZXMgZm9yIHNwZWVkIGFjY2VzcyB0byBjb3JlIHByb3RvdHlwZXMuCisgIHZhciBwdXNoICAgICAgICAgICAgID0gQXJyYXlQcm90by5wdXNoLAorICAgICAgc2xpY2UgICAgICAgICAgICA9IEFycmF5UHJvdG8uc2xpY2UsCisgICAgICBjb25jYXQgICAgICAgICAgID0gQXJyYXlQcm90by5jb25jYXQsCisgICAgICB0b1N0cmluZyAgICAgICAgID0gT2JqUHJvdG8udG9TdHJpbmcsCisgICAgICBoYXNPd25Qcm9wZXJ0eSAgID0gT2JqUHJvdG8uaGFzT3duUHJvcGVydHk7CisKKyAgLy8gQWxsICoqRUNNQVNjcmlwdCA1KiogbmF0aXZlIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyB0aGF0IHdlIGhvcGUgdG8gdXNlCisgIC8vIGFyZSBkZWNsYXJlZCBoZXJlLgorICB2YXIKKyAgICBuYXRpdmVGb3JFYWNoICAgICAgPSBBcnJheVByb3RvLmZvckVhY2gsCisgICAgbmF0aXZlTWFwICAgICAgICAgID0gQXJyYXlQcm90by5tYXAsCisgICAgbmF0aXZlUmVkdWNlICAgICAgID0gQXJyYXlQcm90by5yZWR1Y2UsCisgICAgbmF0aXZlUmVkdWNlUmlnaHQgID0gQXJyYXlQcm90by5yZWR1Y2VSaWdodCwKKyAgICBuYXRpdmVGaWx0ZXIgICAgICAgPSBBcnJheVByb3RvLmZpbHRlciwKKyAgICBuYXRpdmVFdmVyeSAgICAgICAgPSBBcnJheVByb3RvLmV2ZXJ5LAorICAgIG5hdGl2ZVNvbWUgICAgICAgICA9IEFycmF5UHJvdG8uc29tZSwKKyAgICBuYXRpdmVJbmRleE9mICAgICAgPSBBcnJheVByb3RvLmluZGV4T2YsCisgICAgbmF0aXZlTGFzdEluZGV4T2YgID0gQXJyYXlQcm90by5sYXN0SW5kZXhPZiwKKyAgICBuYXRpdmVJc0FycmF5ICAgICAgPSBBcnJheS5pc0FycmF5LAorICAgIG5hdGl2ZUtleXMgICAgICAgICA9IE9iamVjdC5rZXlzLAorICAgIG5hdGl2ZUJpbmQgICAgICAgICA9IEZ1bmNQcm90by5iaW5kOworCisgIC8vIENyZWF0ZSBhIHNhZmUgcmVmZXJlbmNlIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdCBmb3IgdXNlIGJlbG93LgorICB2YXIgXyA9IGZ1bmN0aW9uKG9iaikgeworICAgIGlmIChvYmogaW5zdGFuY2VvZiBfKSByZXR1cm4gb2JqOworICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBfKSkgcmV0dXJuIG5ldyBfKG9iaik7CisgICAgdGhpcy5fd3JhcHBlZCA9IG9iajsKKyAgfTsKKworICAvLyBFeHBvcnQgdGhlIFVuZGVyc2NvcmUgb2JqZWN0IGZvciAqKk5vZGUuanMqKiwgd2l0aAorICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgdGhlIG9sZCBgcmVxdWlyZSgpYCBBUEkuIElmIHdlJ3JlIGluCisgIC8vIHRoZSBicm93c2VyLCBhZGQgYF9gIGFzIGEgZ2xvYmFsIG9iamVjdCB2aWEgYSBzdHJpbmcgaWRlbnRpZmllciwKKyAgLy8gZm9yIENsb3N1cmUgQ29tcGlsZXIgImFkdmFuY2VkIiBtb2RlLgorICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7CisgICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7CisgICAgICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfOworICAgIH0KKyAgICBleHBvcnRzLl8gPSBfOworICB9IGVsc2UgeworICAgIHJvb3QuXyA9IF87CisgIH0KKworICAvLyBDdXJyZW50IHZlcnNpb24uCisgIF8uVkVSU0lPTiA9ICcxLjQuNCc7CisKKyAgLy8gQ29sbGVjdGlvbiBGdW5jdGlvbnMKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBUaGUgY29ybmVyc3RvbmUsIGFuIGBlYWNoYCBpbXBsZW1lbnRhdGlvbiwgYWthIGBmb3JFYWNoYC4KKyAgLy8gSGFuZGxlcyBvYmplY3RzIHdpdGggdGhlIGJ1aWx0LWluIGBmb3JFYWNoYCwgYXJyYXlzLCBhbmQgcmF3IG9iamVjdHMuCisgIC8vIERlbGVnYXRlcyB0byAqKkVDTUFTY3JpcHQgNSoqJ3MgbmF0aXZlIGBmb3JFYWNoYCBpZiBhdmFpbGFibGUuCisgIHZhciBlYWNoID0gXy5lYWNoID0gXy5mb3JFYWNoID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRvciwgY29udGV4dCkgeworICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuOworICAgIGlmIChuYXRpdmVGb3JFYWNoICYmIG9iai5mb3JFYWNoID09PSBuYXRpdmVGb3JFYWNoKSB7CisgICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCk7CisgICAgfSBlbHNlIGlmIChvYmoubGVuZ3RoID09PSArb2JqLmxlbmd0aCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKSA9PT0gYnJlYWtlcikgcmV0dXJuOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7CisgICAgICAgIGlmIChfLmhhcyhvYmosIGtleSkpIHsKKyAgICAgICAgICBpZiAoaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopID09PSBicmVha2VyKSByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgLy8gUmV0dXJuIHRoZSByZXN1bHRzIG9mIGFwcGx5aW5nIHRoZSBpdGVyYXRvciB0byBlYWNoIGVsZW1lbnQuCisgIC8vIERlbGVnYXRlcyB0byAqKkVDTUFTY3JpcHQgNSoqJ3MgbmF0aXZlIGBtYXBgIGlmIGF2YWlsYWJsZS4KKyAgXy5tYXAgPSBfLmNvbGxlY3QgPSBmdW5jdGlvbihvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICBpZiAob2JqID09IG51bGwpIHJldHVybiByZXN1bHRzOworICAgIGlmIChuYXRpdmVNYXAgJiYgb2JqLm1hcCA9PT0gbmF0aXZlTWFwKSByZXR1cm4gb2JqLm1hcChpdGVyYXRvciwgY29udGV4dCk7CisgICAgZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgbGlzdCkgeworICAgICAgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aF0gPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH07CisKKyAgdmFyIHJlZHVjZUVycm9yID0gJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnOworCisgIC8vICoqUmVkdWNlKiogYnVpbGRzIHVwIGEgc2luZ2xlIHJlc3VsdCBmcm9tIGEgbGlzdCBvZiB2YWx1ZXMsIGFrYSBgaW5qZWN0YCwKKyAgLy8gb3IgYGZvbGRsYC4gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYHJlZHVjZWAgaWYgYXZhaWxhYmxlLgorICBfLnJlZHVjZSA9IF8uZm9sZGwgPSBfLmluamVjdCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0b3IsIG1lbW8sIGNvbnRleHQpIHsKKyAgICB2YXIgaW5pdGlhbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOworICAgIGlmIChvYmogPT0gbnVsbCkgb2JqID0gW107CisgICAgaWYgKG5hdGl2ZVJlZHVjZSAmJiBvYmoucmVkdWNlID09PSBuYXRpdmVSZWR1Y2UpIHsKKyAgICAgIGlmIChjb250ZXh0KSBpdGVyYXRvciA9IF8uYmluZChpdGVyYXRvciwgY29udGV4dCk7CisgICAgICByZXR1cm4gaW5pdGlhbCA/IG9iai5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pIDogb2JqLnJlZHVjZShpdGVyYXRvcik7CisgICAgfQorICAgIGVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHsKKyAgICAgIGlmICghaW5pdGlhbCkgeworICAgICAgICBtZW1vID0gdmFsdWU7CisgICAgICAgIGluaXRpYWwgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtbyA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgbWVtbywgdmFsdWUsIGluZGV4LCBsaXN0KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAoIWluaXRpYWwpIHRocm93IG5ldyBUeXBlRXJyb3IocmVkdWNlRXJyb3IpOworICAgIHJldHVybiBtZW1vOworICB9OworCisgIC8vIFRoZSByaWdodC1hc3NvY2lhdGl2ZSB2ZXJzaW9uIG9mIHJlZHVjZSwgYWxzbyBrbm93biBhcyBgZm9sZHJgLgorICAvLyBEZWxlZ2F0ZXMgdG8gKipFQ01BU2NyaXB0IDUqKidzIG5hdGl2ZSBgcmVkdWNlUmlnaHRgIGlmIGF2YWlsYWJsZS4KKyAgXy5yZWR1Y2VSaWdodCA9IF8uZm9sZHIgPSBmdW5jdGlvbihvYmosIGl0ZXJhdG9yLCBtZW1vLCBjb250ZXh0KSB7CisgICAgdmFyIGluaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKKyAgICBpZiAob2JqID09IG51bGwpIG9iaiA9IFtdOworICAgIGlmIChuYXRpdmVSZWR1Y2VSaWdodCAmJiBvYmoucmVkdWNlUmlnaHQgPT09IG5hdGl2ZVJlZHVjZVJpZ2h0KSB7CisgICAgICBpZiAoY29udGV4dCkgaXRlcmF0b3IgPSBfLmJpbmQoaXRlcmF0b3IsIGNvbnRleHQpOworICAgICAgcmV0dXJuIGluaXRpYWwgPyBvYmoucmVkdWNlUmlnaHQoaXRlcmF0b3IsIG1lbW8pIDogb2JqLnJlZHVjZVJpZ2h0KGl0ZXJhdG9yKTsKKyAgICB9CisgICAgdmFyIGxlbmd0aCA9IG9iai5sZW5ndGg7CisgICAgaWYgKGxlbmd0aCAhPT0gK2xlbmd0aCkgeworICAgICAgdmFyIGtleXMgPSBfLmtleXMob2JqKTsKKyAgICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoOworICAgIH0KKyAgICBlYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7CisgICAgICBpbmRleCA9IGtleXMgPyBrZXlzWy0tbGVuZ3RoXSA6IC0tbGVuZ3RoOworICAgICAgaWYgKCFpbml0aWFsKSB7CisgICAgICAgIG1lbW8gPSBvYmpbaW5kZXhdOworICAgICAgICBpbml0aWFsID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lbW8gPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG1lbW8sIG9ialtpbmRleF0sIGluZGV4LCBsaXN0KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAoIWluaXRpYWwpIHRocm93IG5ldyBUeXBlRXJyb3IocmVkdWNlRXJyb3IpOworICAgIHJldHVybiBtZW1vOworICB9OworCisgIC8vIFJldHVybiB0aGUgZmlyc3QgdmFsdWUgd2hpY2ggcGFzc2VzIGEgdHJ1dGggdGVzdC4gQWxpYXNlZCBhcyBgZGV0ZWN0YC4KKyAgXy5maW5kID0gXy5kZXRlY3QgPSBmdW5jdGlvbihvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgdmFyIHJlc3VsdDsKKyAgICBhbnkob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHsKKyAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkpIHsKKyAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH07CisKKyAgLy8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgdGhhdCBwYXNzIGEgdHJ1dGggdGVzdC4KKyAgLy8gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYGZpbHRlcmAgaWYgYXZhaWxhYmxlLgorICAvLyBBbGlhc2VkIGFzIGBzZWxlY3RgLgorICBfLmZpbHRlciA9IF8uc2VsZWN0ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRvciwgY29udGV4dCkgeworICAgIHZhciByZXN1bHRzID0gW107CisgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gcmVzdWx0czsKKyAgICBpZiAobmF0aXZlRmlsdGVyICYmIG9iai5maWx0ZXIgPT09IG5hdGl2ZUZpbHRlcikgcmV0dXJuIG9iai5maWx0ZXIoaXRlcmF0b3IsIGNvbnRleHQpOworICAgIGVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHsKKyAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkpIHJlc3VsdHNbcmVzdWx0cy5sZW5ndGhdID0gdmFsdWU7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH07CisKKyAgLy8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgZm9yIHdoaWNoIGEgdHJ1dGggdGVzdCBmYWlscy4KKyAgXy5yZWplY3QgPSBmdW5jdGlvbihvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgcmV0dXJuIF8uZmlsdGVyKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7CisgICAgICByZXR1cm4gIWl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0KTsKKyAgICB9LCBjb250ZXh0KTsKKyAgfTsKKworICAvLyBEZXRlcm1pbmUgd2hldGhlciBhbGwgb2YgdGhlIGVsZW1lbnRzIG1hdGNoIGEgdHJ1dGggdGVzdC4KKyAgLy8gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYGV2ZXJ5YCBpZiBhdmFpbGFibGUuCisgIC8vIEFsaWFzZWQgYXMgYGFsbGAuCisgIF8uZXZlcnkgPSBfLmFsbCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciB8fCAoaXRlcmF0b3IgPSBfLmlkZW50aXR5KTsKKyAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsKKyAgICBpZiAob2JqID09IG51bGwpIHJldHVybiByZXN1bHQ7CisgICAgaWYgKG5hdGl2ZUV2ZXJ5ICYmIG9iai5ldmVyeSA9PT0gbmF0aXZlRXZlcnkpIHJldHVybiBvYmouZXZlcnkoaXRlcmF0b3IsIGNvbnRleHQpOworICAgIGVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHsKKyAgICAgIGlmICghKHJlc3VsdCA9IHJlc3VsdCAmJiBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkpKSByZXR1cm4gYnJlYWtlcjsKKyAgICB9KTsKKyAgICByZXR1cm4gISFyZXN1bHQ7CisgIH07CisKKyAgLy8gRGV0ZXJtaW5lIGlmIGF0IGxlYXN0IG9uZSBlbGVtZW50IGluIHRoZSBvYmplY3QgbWF0Y2hlcyBhIHRydXRoIHRlc3QuCisgIC8vIERlbGVnYXRlcyB0byAqKkVDTUFTY3JpcHQgNSoqJ3MgbmF0aXZlIGBzb21lYCBpZiBhdmFpbGFibGUuCisgIC8vIEFsaWFzZWQgYXMgYGFueWAuCisgIHZhciBhbnkgPSBfLnNvbWUgPSBfLmFueSA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciB8fCAoaXRlcmF0b3IgPSBfLmlkZW50aXR5KTsKKyAgICB2YXIgcmVzdWx0ID0gZmFsc2U7CisgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gcmVzdWx0OworICAgIGlmIChuYXRpdmVTb21lICYmIG9iai5zb21lID09PSBuYXRpdmVTb21lKSByZXR1cm4gb2JqLnNvbWUoaXRlcmF0b3IsIGNvbnRleHQpOworICAgIGVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHsKKyAgICAgIGlmIChyZXN1bHQgfHwgKHJlc3VsdCA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0KSkpIHJldHVybiBicmVha2VyOworICAgIH0pOworICAgIHJldHVybiAhIXJlc3VsdDsKKyAgfTsKKworICAvLyBEZXRlcm1pbmUgaWYgdGhlIGFycmF5IG9yIG9iamVjdCBjb250YWlucyBhIGdpdmVuIHZhbHVlICh1c2luZyBgPT09YCkuCisgIC8vIEFsaWFzZWQgYXMgYGluY2x1ZGVgLgorICBfLmNvbnRhaW5zID0gXy5pbmNsdWRlID0gZnVuY3Rpb24ob2JqLCB0YXJnZXQpIHsKKyAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICBpZiAobmF0aXZlSW5kZXhPZiAmJiBvYmouaW5kZXhPZiA9PT0gbmF0aXZlSW5kZXhPZikgcmV0dXJuIG9iai5pbmRleE9mKHRhcmdldCkgIT0gLTE7CisgICAgcmV0dXJuIGFueShvYmosIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICByZXR1cm4gdmFsdWUgPT09IHRhcmdldDsKKyAgICB9KTsKKyAgfTsKKworICAvLyBJbnZva2UgYSBtZXRob2QgKHdpdGggYXJndW1lbnRzKSBvbiBldmVyeSBpdGVtIGluIGEgY29sbGVjdGlvbi4KKyAgXy5pbnZva2UgPSBmdW5jdGlvbihvYmosIG1ldGhvZCkgeworICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOworICAgIHZhciBpc0Z1bmMgPSBfLmlzRnVuY3Rpb24obWV0aG9kKTsKKyAgICByZXR1cm4gXy5tYXAob2JqLCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJuIChpc0Z1bmMgPyBtZXRob2QgOiB2YWx1ZVttZXRob2RdKS5hcHBseSh2YWx1ZSwgYXJncyk7CisgICAgfSk7CisgIH07CisKKyAgLy8gQ29udmVuaWVuY2UgdmVyc2lvbiBvZiBhIGNvbW1vbiB1c2UgY2FzZSBvZiBgbWFwYDogZmV0Y2hpbmcgYSBwcm9wZXJ0eS4KKyAgXy5wbHVjayA9IGZ1bmN0aW9uKG9iaiwga2V5KSB7CisgICAgcmV0dXJuIF8ubWFwKG9iaiwgZnVuY3Rpb24odmFsdWUpeyByZXR1cm4gdmFsdWVba2V5XTsgfSk7CisgIH07CisKKyAgLy8gQ29udmVuaWVuY2UgdmVyc2lvbiBvZiBhIGNvbW1vbiB1c2UgY2FzZSBvZiBgZmlsdGVyYDogc2VsZWN0aW5nIG9ubHkgb2JqZWN0cworICAvLyBjb250YWluaW5nIHNwZWNpZmljIGBrZXk6dmFsdWVgIHBhaXJzLgorICBfLndoZXJlID0gZnVuY3Rpb24ob2JqLCBhdHRycywgZmlyc3QpIHsKKyAgICBpZiAoXy5pc0VtcHR5KGF0dHJzKSkgcmV0dXJuIGZpcnN0ID8gbnVsbCA6IFtdOworICAgIHJldHVybiBfW2ZpcnN0ID8gJ2ZpbmQnIDogJ2ZpbHRlciddKG9iaiwgZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiBhdHRycykgeworICAgICAgICBpZiAoYXR0cnNba2V5XSAhPT0gdmFsdWVba2V5XSkgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfSk7CisgIH07CisKKyAgLy8gQ29udmVuaWVuY2UgdmVyc2lvbiBvZiBhIGNvbW1vbiB1c2UgY2FzZSBvZiBgZmluZGA6IGdldHRpbmcgdGhlIGZpcnN0IG9iamVjdAorICAvLyBjb250YWluaW5nIHNwZWNpZmljIGBrZXk6dmFsdWVgIHBhaXJzLgorICBfLmZpbmRXaGVyZSA9IGZ1bmN0aW9uKG9iaiwgYXR0cnMpIHsKKyAgICByZXR1cm4gXy53aGVyZShvYmosIGF0dHJzLCB0cnVlKTsKKyAgfTsKKworICAvLyBSZXR1cm4gdGhlIG1heGltdW0gZWxlbWVudCBvciAoZWxlbWVudC1iYXNlZCBjb21wdXRhdGlvbikuCisgIC8vIENhbid0IG9wdGltaXplIGFycmF5cyBvZiBpbnRlZ2VycyBsb25nZXIgdGhhbiA2NSw1MzUgZWxlbWVudHMuCisgIC8vIFNlZTogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgwNzk3CisgIF8ubWF4ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRvciwgY29udGV4dCkgeworICAgIGlmICghaXRlcmF0b3IgJiYgXy5pc0FycmF5KG9iaikgJiYgb2JqWzBdID09PSArb2JqWzBdICYmIG9iai5sZW5ndGggPCA2NTUzNSkgeworICAgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsIG9iaik7CisgICAgfQorICAgIGlmICghaXRlcmF0b3IgJiYgXy5pc0VtcHR5KG9iaikpIHJldHVybiAtSW5maW5pdHk7CisgICAgdmFyIHJlc3VsdCA9IHtjb21wdXRlZCA6IC1JbmZpbml0eSwgdmFsdWU6IC1JbmZpbml0eX07CisgICAgZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgbGlzdCkgeworICAgICAgdmFyIGNvbXB1dGVkID0gaXRlcmF0b3IgPyBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkgOiB2YWx1ZTsKKyAgICAgIGNvbXB1dGVkID49IHJlc3VsdC5jb21wdXRlZCAmJiAocmVzdWx0ID0ge3ZhbHVlIDogdmFsdWUsIGNvbXB1dGVkIDogY29tcHV0ZWR9KTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlOworICB9OworCisgIC8vIFJldHVybiB0aGUgbWluaW11bSBlbGVtZW50IChvciBlbGVtZW50LWJhc2VkIGNvbXB1dGF0aW9uKS4KKyAgXy5taW4gPSBmdW5jdGlvbihvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaWYgKCFpdGVyYXRvciAmJiBfLmlzQXJyYXkob2JqKSAmJiBvYmpbMF0gPT09ICtvYmpbMF0gJiYgb2JqLmxlbmd0aCA8IDY1NTM1KSB7CisgICAgICByZXR1cm4gTWF0aC5taW4uYXBwbHkoTWF0aCwgb2JqKTsKKyAgICB9CisgICAgaWYgKCFpdGVyYXRvciAmJiBfLmlzRW1wdHkob2JqKSkgcmV0dXJuIEluZmluaXR5OworICAgIHZhciByZXN1bHQgPSB7Y29tcHV0ZWQgOiBJbmZpbml0eSwgdmFsdWU6IEluZmluaXR5fTsKKyAgICBlYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7CisgICAgICB2YXIgY29tcHV0ZWQgPSBpdGVyYXRvciA/IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0KSA6IHZhbHVlOworICAgICAgY29tcHV0ZWQgPCByZXN1bHQuY29tcHV0ZWQgJiYgKHJlc3VsdCA9IHt2YWx1ZSA6IHZhbHVlLCBjb21wdXRlZCA6IGNvbXB1dGVkfSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTsKKyAgfTsKKworICAvLyBTaHVmZmxlIGFuIGFycmF5LgorICBfLnNodWZmbGUgPSBmdW5jdGlvbihvYmopIHsKKyAgICB2YXIgcmFuZDsKKyAgICB2YXIgaW5kZXggPSAwOworICAgIHZhciBzaHVmZmxlZCA9IFtdOworICAgIGVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmFuZCA9IF8ucmFuZG9tKGluZGV4KyspOworICAgICAgc2h1ZmZsZWRbaW5kZXggLSAxXSA9IHNodWZmbGVkW3JhbmRdOworICAgICAgc2h1ZmZsZWRbcmFuZF0gPSB2YWx1ZTsKKyAgICB9KTsKKyAgICByZXR1cm4gc2h1ZmZsZWQ7CisgIH07CisKKyAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgbG9va3VwIGl0ZXJhdG9ycy4KKyAgdmFyIGxvb2t1cEl0ZXJhdG9yID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgICByZXR1cm4gXy5pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlIDogZnVuY3Rpb24ob2JqKXsgcmV0dXJuIG9ialt2YWx1ZV07IH07CisgIH07CisKKyAgLy8gU29ydCB0aGUgb2JqZWN0J3MgdmFsdWVzIGJ5IGEgY3JpdGVyaW9uIHByb2R1Y2VkIGJ5IGFuIGl0ZXJhdG9yLgorICBfLnNvcnRCeSA9IGZ1bmN0aW9uKG9iaiwgdmFsdWUsIGNvbnRleHQpIHsKKyAgICB2YXIgaXRlcmF0b3IgPSBsb29rdXBJdGVyYXRvcih2YWx1ZSk7CisgICAgcmV0dXJuIF8ucGx1Y2soXy5tYXAob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZhbHVlIDogdmFsdWUsCisgICAgICAgIGluZGV4IDogaW5kZXgsCisgICAgICAgIGNyaXRlcmlhIDogaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGxpc3QpCisgICAgICB9OworICAgIH0pLnNvcnQoZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKKyAgICAgIHZhciBhID0gbGVmdC5jcml0ZXJpYTsKKyAgICAgIHZhciBiID0gcmlnaHQuY3JpdGVyaWE7CisgICAgICBpZiAoYSAhPT0gYikgeworICAgICAgICBpZiAoYSA+IGIgfHwgYSA9PT0gdm9pZCAwKSByZXR1cm4gMTsKKyAgICAgICAgaWYgKGEgPCBiIHx8IGIgPT09IHZvaWQgMCkgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgcmV0dXJuIGxlZnQuaW5kZXggPCByaWdodC5pbmRleCA/IC0xIDogMTsKKyAgICB9KSwgJ3ZhbHVlJyk7CisgIH07CisKKyAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBmb3IgYWdncmVnYXRlICJncm91cCBieSIgb3BlcmF0aW9ucy4KKyAgdmFyIGdyb3VwID0gZnVuY3Rpb24ob2JqLCB2YWx1ZSwgY29udGV4dCwgYmVoYXZpb3IpIHsKKyAgICB2YXIgcmVzdWx0ID0ge307CisgICAgdmFyIGl0ZXJhdG9yID0gbG9va3VwSXRlcmF0b3IodmFsdWUgfHwgXy5pZGVudGl0eSk7CisgICAgZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgdmFyIGtleSA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBvYmopOworICAgICAgYmVoYXZpb3IocmVzdWx0LCBrZXksIHZhbHVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9OworCisgIC8vIEdyb3VwcyB0aGUgb2JqZWN0J3MgdmFsdWVzIGJ5IGEgY3JpdGVyaW9uLiBQYXNzIGVpdGhlciBhIHN0cmluZyBhdHRyaWJ1dGUKKyAgLy8gdG8gZ3JvdXAgYnksIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBjcml0ZXJpb24uCisgIF8uZ3JvdXBCeSA9IGZ1bmN0aW9uKG9iaiwgdmFsdWUsIGNvbnRleHQpIHsKKyAgICByZXR1cm4gZ3JvdXAob2JqLCB2YWx1ZSwgY29udGV4dCwgZnVuY3Rpb24ocmVzdWx0LCBrZXksIHZhbHVlKSB7CisgICAgICAoXy5oYXMocmVzdWx0LCBrZXkpID8gcmVzdWx0W2tleV0gOiAocmVzdWx0W2tleV0gPSBbXSkpLnB1c2godmFsdWUpOworICAgIH0pOworICB9OworCisgIC8vIENvdW50cyBpbnN0YW5jZXMgb2YgYW4gb2JqZWN0IHRoYXQgZ3JvdXAgYnkgYSBjZXJ0YWluIGNyaXRlcmlvbi4gUGFzcworICAvLyBlaXRoZXIgYSBzdHJpbmcgYXR0cmlidXRlIHRvIGNvdW50IGJ5LCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKKyAgLy8gY3JpdGVyaW9uLgorICBfLmNvdW50QnkgPSBmdW5jdGlvbihvYmosIHZhbHVlLCBjb250ZXh0KSB7CisgICAgcmV0dXJuIGdyb3VwKG9iaiwgdmFsdWUsIGNvbnRleHQsIGZ1bmN0aW9uKHJlc3VsdCwga2V5KSB7CisgICAgICBpZiAoIV8uaGFzKHJlc3VsdCwga2V5KSkgcmVzdWx0W2tleV0gPSAwOworICAgICAgcmVzdWx0W2tleV0rKzsKKyAgICB9KTsKKyAgfTsKKworICAvLyBVc2UgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlIHNtYWxsZXN0IGluZGV4IGF0IHdoaWNoCisgIC8vIGFuIG9iamVjdCBzaG91bGQgYmUgaW5zZXJ0ZWQgc28gYXMgdG8gbWFpbnRhaW4gb3JkZXIuIFVzZXMgYmluYXJ5IHNlYXJjaC4KKyAgXy5zb3J0ZWRJbmRleCA9IGZ1bmN0aW9uKGFycmF5LCBvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaXRlcmF0b3IgPSBpdGVyYXRvciA9PSBudWxsID8gXy5pZGVudGl0eSA6IGxvb2t1cEl0ZXJhdG9yKGl0ZXJhdG9yKTsKKyAgICB2YXIgdmFsdWUgPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9iaik7CisgICAgdmFyIGxvdyA9IDAsIGhpZ2ggPSBhcnJheS5sZW5ndGg7CisgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHsKKyAgICAgIHZhciBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDE7CisgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIGFycmF5W21pZF0pIDwgdmFsdWUgPyBsb3cgPSBtaWQgKyAxIDogaGlnaCA9IG1pZDsKKyAgICB9CisgICAgcmV0dXJuIGxvdzsKKyAgfTsKKworICAvLyBTYWZlbHkgY29udmVydCBhbnl0aGluZyBpdGVyYWJsZSBpbnRvIGEgcmVhbCwgbGl2ZSBhcnJheS4KKyAgXy50b0FycmF5ID0gZnVuY3Rpb24ob2JqKSB7CisgICAgaWYgKCFvYmopIHJldHVybiBbXTsKKyAgICBpZiAoXy5pc0FycmF5KG9iaikpIHJldHVybiBzbGljZS5jYWxsKG9iaik7CisgICAgaWYgKG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoKSByZXR1cm4gXy5tYXAob2JqLCBfLmlkZW50aXR5KTsKKyAgICByZXR1cm4gXy52YWx1ZXMob2JqKTsKKyAgfTsKKworICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBvYmplY3QuCisgIF8uc2l6ZSA9IGZ1bmN0aW9uKG9iaikgeworICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIChvYmoubGVuZ3RoID09PSArb2JqLmxlbmd0aCkgPyBvYmoubGVuZ3RoIDogXy5rZXlzKG9iaikubGVuZ3RoOworICB9OworCisgIC8vIEFycmF5IEZ1bmN0aW9ucworICAvLyAtLS0tLS0tLS0tLS0tLS0KKworICAvLyBHZXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYW4gYXJyYXkuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gdGhlIGZpcnN0IE4KKyAgLy8gdmFsdWVzIGluIHRoZSBhcnJheS4gQWxpYXNlZCBhcyBgaGVhZGAgYW5kIGB0YWtlYC4gVGhlICoqZ3VhcmQqKiBjaGVjaworICAvLyBhbGxvd3MgaXQgdG8gd29yayB3aXRoIGBfLm1hcGAuCisgIF8uZmlyc3QgPSBfLmhlYWQgPSBfLnRha2UgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHsKKyAgICBpZiAoYXJyYXkgPT0gbnVsbCkgcmV0dXJuIHZvaWQgMDsKKyAgICByZXR1cm4gKG4gIT0gbnVsbCkgJiYgIWd1YXJkID8gc2xpY2UuY2FsbChhcnJheSwgMCwgbikgOiBhcnJheVswXTsKKyAgfTsKKworICAvLyBSZXR1cm5zIGV2ZXJ5dGhpbmcgYnV0IHRoZSBsYXN0IGVudHJ5IG9mIHRoZSBhcnJheS4gRXNwZWNpYWxseSB1c2VmdWwgb24KKyAgLy8gdGhlIGFyZ3VtZW50cyBvYmplY3QuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gYWxsIHRoZSB2YWx1ZXMgaW4KKyAgLy8gdGhlIGFycmF5LCBleGNsdWRpbmcgdGhlIGxhc3QgTi4gVGhlICoqZ3VhcmQqKiBjaGVjayBhbGxvd3MgaXQgdG8gd29yayB3aXRoCisgIC8vIGBfLm1hcGAuCisgIF8uaW5pdGlhbCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkgeworICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCAwLCBhcnJheS5sZW5ndGggLSAoKG4gPT0gbnVsbCkgfHwgZ3VhcmQgPyAxIDogbikpOworICB9OworCisgIC8vIEdldCB0aGUgbGFzdCBlbGVtZW50IG9mIGFuIGFycmF5LiBQYXNzaW5nICoqbioqIHdpbGwgcmV0dXJuIHRoZSBsYXN0IE4KKyAgLy8gdmFsdWVzIGluIHRoZSBhcnJheS4gVGhlICoqZ3VhcmQqKiBjaGVjayBhbGxvd3MgaXQgdG8gd29yayB3aXRoIGBfLm1hcGAuCisgIF8ubGFzdCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkgeworICAgIGlmIChhcnJheSA9PSBudWxsKSByZXR1cm4gdm9pZCAwOworICAgIGlmICgobiAhPSBudWxsKSAmJiAhZ3VhcmQpIHsKKyAgICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCBNYXRoLm1heChhcnJheS5sZW5ndGggLSBuLCAwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTsKKyAgICB9CisgIH07CisKKyAgLy8gUmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIGFycmF5LiBBbGlhc2VkIGFzIGB0YWlsYCBhbmQgYGRyb3BgLgorICAvLyBFc3BlY2lhbGx5IHVzZWZ1bCBvbiB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyBhbiAqKm4qKiB3aWxsIHJldHVybgorICAvLyB0aGUgcmVzdCBOIHZhbHVlcyBpbiB0aGUgYXJyYXkuIFRoZSAqKmd1YXJkKioKKyAgLy8gY2hlY2sgYWxsb3dzIGl0IHRvIHdvcmsgd2l0aCBgXy5tYXBgLgorICBfLnJlc3QgPSBfLnRhaWwgPSBfLmRyb3AgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHsKKyAgICByZXR1cm4gc2xpY2UuY2FsbChhcnJheSwgKG4gPT0gbnVsbCkgfHwgZ3VhcmQgPyAxIDogbik7CisgIH07CisKKyAgLy8gVHJpbSBvdXQgYWxsIGZhbHN5IHZhbHVlcyBmcm9tIGFuIGFycmF5LgorICBfLmNvbXBhY3QgPSBmdW5jdGlvbihhcnJheSkgeworICAgIHJldHVybiBfLmZpbHRlcihhcnJheSwgXy5pZGVudGl0eSk7CisgIH07CisKKyAgLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgYSByZWN1cnNpdmUgYGZsYXR0ZW5gIGZ1bmN0aW9uLgorICB2YXIgZmxhdHRlbiA9IGZ1bmN0aW9uKGlucHV0LCBzaGFsbG93LCBvdXRwdXQpIHsKKyAgICBlYWNoKGlucHV0LCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgaWYgKF8uaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgc2hhbGxvdyA/IHB1c2guYXBwbHkob3V0cHV0LCB2YWx1ZSkgOiBmbGF0dGVuKHZhbHVlLCBzaGFsbG93LCBvdXRwdXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0LnB1c2godmFsdWUpOworICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBvdXRwdXQ7CisgIH07CisKKyAgLy8gUmV0dXJuIGEgY29tcGxldGVseSBmbGF0dGVuZWQgdmVyc2lvbiBvZiBhbiBhcnJheS4KKyAgXy5mbGF0dGVuID0gZnVuY3Rpb24oYXJyYXksIHNoYWxsb3cpIHsKKyAgICByZXR1cm4gZmxhdHRlbihhcnJheSwgc2hhbGxvdywgW10pOworICB9OworCisgIC8vIFJldHVybiBhIHZlcnNpb24gb2YgdGhlIGFycmF5IHRoYXQgZG9lcyBub3QgY29udGFpbiB0aGUgc3BlY2lmaWVkIHZhbHVlKHMpLgorICBfLndpdGhvdXQgPSBmdW5jdGlvbihhcnJheSkgeworICAgIHJldHVybiBfLmRpZmZlcmVuY2UoYXJyYXksIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CisgIH07CisKKyAgLy8gUHJvZHVjZSBhIGR1cGxpY2F0ZS1mcmVlIHZlcnNpb24gb2YgdGhlIGFycmF5LiBJZiB0aGUgYXJyYXkgaGFzIGFscmVhZHkKKyAgLy8gYmVlbiBzb3J0ZWQsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgdXNpbmcgYSBmYXN0ZXIgYWxnb3JpdGhtLgorICAvLyBBbGlhc2VkIGFzIGB1bmlxdWVgLgorICBfLnVuaXEgPSBfLnVuaXF1ZSA9IGZ1bmN0aW9uKGFycmF5LCBpc1NvcnRlZCwgaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpZiAoXy5pc0Z1bmN0aW9uKGlzU29ydGVkKSkgeworICAgICAgY29udGV4dCA9IGl0ZXJhdG9yOworICAgICAgaXRlcmF0b3IgPSBpc1NvcnRlZDsKKyAgICAgIGlzU29ydGVkID0gZmFsc2U7CisgICAgfQorICAgIHZhciBpbml0aWFsID0gaXRlcmF0b3IgPyBfLm1hcChhcnJheSwgaXRlcmF0b3IsIGNvbnRleHQpIDogYXJyYXk7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB2YXIgc2VlbiA9IFtdOworICAgIGVhY2goaW5pdGlhbCwgZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAoaXNTb3J0ZWQgPyAoIWluZGV4IHx8IHNlZW5bc2Vlbi5sZW5ndGggLSAxXSAhPT0gdmFsdWUpIDogIV8uY29udGFpbnMoc2VlbiwgdmFsdWUpKSB7CisgICAgICAgIHNlZW4ucHVzaCh2YWx1ZSk7CisgICAgICAgIHJlc3VsdHMucHVzaChhcnJheVtpbmRleF0pOworICAgICAgfQorICAgIH0pOworICAgIHJldHVybiByZXN1bHRzOworICB9OworCisgIC8vIFByb2R1Y2UgYW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgdW5pb246IGVhY2ggZGlzdGluY3QgZWxlbWVudCBmcm9tIGFsbCBvZgorICAvLyB0aGUgcGFzc2VkLWluIGFycmF5cy4KKyAgXy51bmlvbiA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBfLnVuaXEoY29uY2F0LmFwcGx5KEFycmF5UHJvdG8sIGFyZ3VtZW50cykpOworICB9OworCisgIC8vIFByb2R1Y2UgYW4gYXJyYXkgdGhhdCBjb250YWlucyBldmVyeSBpdGVtIHNoYXJlZCBiZXR3ZWVuIGFsbCB0aGUKKyAgLy8gcGFzc2VkLWluIGFycmF5cy4KKyAgXy5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbihhcnJheSkgeworICAgIHZhciByZXN0ID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBfLmZpbHRlcihfLnVuaXEoYXJyYXkpLCBmdW5jdGlvbihpdGVtKSB7CisgICAgICByZXR1cm4gXy5ldmVyeShyZXN0LCBmdW5jdGlvbihvdGhlcikgeworICAgICAgICByZXR1cm4gXy5pbmRleE9mKG90aGVyLCBpdGVtKSA+PSAwOworICAgICAgfSk7CisgICAgfSk7CisgIH07CisKKyAgLy8gVGFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9uZSBhcnJheSBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgYXJyYXlzLgorICAvLyBPbmx5IHRoZSBlbGVtZW50cyBwcmVzZW50IGluIGp1c3QgdGhlIGZpcnN0IGFycmF5IHdpbGwgcmVtYWluLgorICBfLmRpZmZlcmVuY2UgPSBmdW5jdGlvbihhcnJheSkgeworICAgIHZhciByZXN0ID0gY29uY2F0LmFwcGx5KEFycmF5UHJvdG8sIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CisgICAgcmV0dXJuIF8uZmlsdGVyKGFycmF5LCBmdW5jdGlvbih2YWx1ZSl7IHJldHVybiAhXy5jb250YWlucyhyZXN0LCB2YWx1ZSk7IH0pOworICB9OworCisgIC8vIFppcCB0b2dldGhlciBtdWx0aXBsZSBsaXN0cyBpbnRvIGEgc2luZ2xlIGFycmF5IC0tIGVsZW1lbnRzIHRoYXQgc2hhcmUKKyAgLy8gYW4gaW5kZXggZ28gdG9nZXRoZXIuCisgIF8uemlwID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7CisgICAgdmFyIGxlbmd0aCA9IF8ubWF4KF8ucGx1Y2soYXJncywgJ2xlbmd0aCcpKTsKKyAgICB2YXIgcmVzdWx0cyA9IG5ldyBBcnJheShsZW5ndGgpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHJlc3VsdHNbaV0gPSBfLnBsdWNrKGFyZ3MsICIiICsgaSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHRzOworICB9OworCisgIC8vIENvbnZlcnRzIGxpc3RzIGludG8gb2JqZWN0cy4gUGFzcyBlaXRoZXIgYSBzaW5nbGUgYXJyYXkgb2YgYFtrZXksIHZhbHVlXWAKKyAgLy8gcGFpcnMsIG9yIHR3byBwYXJhbGxlbCBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIC0tIG9uZSBvZiBrZXlzLCBhbmQgb25lIG9mCisgIC8vIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcy4KKyAgXy5vYmplY3QgPSBmdW5jdGlvbihsaXN0LCB2YWx1ZXMpIHsKKyAgICBpZiAobGlzdCA9PSBudWxsKSByZXR1cm4ge307CisgICAgdmFyIHJlc3VsdCA9IHt9OworICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGlmICh2YWx1ZXMpIHsKKyAgICAgICAgcmVzdWx0W2xpc3RbaV1dID0gdmFsdWVzW2ldOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0W2xpc3RbaV1bMF1dID0gbGlzdFtpXVsxXTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfTsKKworICAvLyBJZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBseSB1cyB3aXRoIGluZGV4T2YgKEknbSBsb29raW5nIGF0IHlvdSwgKipNU0lFKiopLAorICAvLyB3ZSBuZWVkIHRoaXMgZnVuY3Rpb24uIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYW4KKyAgLy8gaXRlbSBpbiBhbiBhcnJheSwgb3IgLTEgaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS4KKyAgLy8gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYGluZGV4T2ZgIGlmIGF2YWlsYWJsZS4KKyAgLy8gSWYgdGhlIGFycmF5IGlzIGxhcmdlIGFuZCBhbHJlYWR5IGluIHNvcnQgb3JkZXIsIHBhc3MgYHRydWVgCisgIC8vIGZvciAqKmlzU29ydGVkKiogdG8gdXNlIGJpbmFyeSBzZWFyY2guCisgIF8uaW5kZXhPZiA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBpc1NvcnRlZCkgeworICAgIGlmIChhcnJheSA9PSBudWxsKSByZXR1cm4gLTE7CisgICAgdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOworICAgIGlmIChpc1NvcnRlZCkgeworICAgICAgaWYgKHR5cGVvZiBpc1NvcnRlZCA9PSAnbnVtYmVyJykgeworICAgICAgICBpID0gKGlzU29ydGVkIDwgMCA/IE1hdGgubWF4KDAsIGwgKyBpc1NvcnRlZCkgOiBpc1NvcnRlZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpID0gXy5zb3J0ZWRJbmRleChhcnJheSwgaXRlbSk7CisgICAgICAgIHJldHVybiBhcnJheVtpXSA9PT0gaXRlbSA/IGkgOiAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG5hdGl2ZUluZGV4T2YgJiYgYXJyYXkuaW5kZXhPZiA9PT0gbmF0aXZlSW5kZXhPZikgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSwgaXNTb3J0ZWQpOworICAgIGZvciAoOyBpIDwgbDsgaSsrKSBpZiAoYXJyYXlbaV0gPT09IGl0ZW0pIHJldHVybiBpOworICAgIHJldHVybiAtMTsKKyAgfTsKKworICAvLyBEZWxlZ2F0ZXMgdG8gKipFQ01BU2NyaXB0IDUqKidzIG5hdGl2ZSBgbGFzdEluZGV4T2ZgIGlmIGF2YWlsYWJsZS4KKyAgXy5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBmcm9tKSB7CisgICAgaWYgKGFycmF5ID09IG51bGwpIHJldHVybiAtMTsKKyAgICB2YXIgaGFzSW5kZXggPSBmcm9tICE9IG51bGw7CisgICAgaWYgKG5hdGl2ZUxhc3RJbmRleE9mICYmIGFycmF5Lmxhc3RJbmRleE9mID09PSBuYXRpdmVMYXN0SW5kZXhPZikgeworICAgICAgcmV0dXJuIGhhc0luZGV4ID8gYXJyYXkubGFzdEluZGV4T2YoaXRlbSwgZnJvbSkgOiBhcnJheS5sYXN0SW5kZXhPZihpdGVtKTsKKyAgICB9CisgICAgdmFyIGkgPSAoaGFzSW5kZXggPyBmcm9tIDogYXJyYXkubGVuZ3RoKTsKKyAgICB3aGlsZSAoaS0tKSBpZiAoYXJyYXlbaV0gPT09IGl0ZW0pIHJldHVybiBpOworICAgIHJldHVybiAtMTsKKyAgfTsKKworICAvLyBHZW5lcmF0ZSBhbiBpbnRlZ2VyIEFycmF5IGNvbnRhaW5pbmcgYW4gYXJpdGhtZXRpYyBwcm9ncmVzc2lvbi4gQSBwb3J0IG9mCisgIC8vIHRoZSBuYXRpdmUgUHl0aG9uIGByYW5nZSgpYCBmdW5jdGlvbi4gU2VlCisgIC8vIFt0aGUgUHl0aG9uIGRvY3VtZW50YXRpb25dKGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS9mdW5jdGlvbnMuaHRtbCNyYW5nZSkuCisgIF8ucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgeworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDw9IDEpIHsKKyAgICAgIHN0b3AgPSBzdGFydCB8fCAwOworICAgICAgc3RhcnQgPSAwOworICAgIH0KKyAgICBzdGVwID0gYXJndW1lbnRzWzJdIHx8IDE7CisKKyAgICB2YXIgbGVuID0gTWF0aC5tYXgoTWF0aC5jZWlsKChzdG9wIC0gc3RhcnQpIC8gc3RlcCksIDApOworICAgIHZhciBpZHggPSAwOworICAgIHZhciByYW5nZSA9IG5ldyBBcnJheShsZW4pOworCisgICAgd2hpbGUoaWR4IDwgbGVuKSB7CisgICAgICByYW5nZVtpZHgrK10gPSBzdGFydDsKKyAgICAgIHN0YXJ0ICs9IHN0ZXA7CisgICAgfQorCisgICAgcmV0dXJuIHJhbmdlOworICB9OworCisgIC8vIEZ1bmN0aW9uIChhaGVtKSBGdW5jdGlvbnMKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gQ3JlYXRlIGEgZnVuY3Rpb24gYm91bmQgdG8gYSBnaXZlbiBvYmplY3QgKGFzc2lnbmluZyBgdGhpc2AsIGFuZCBhcmd1bWVudHMsCisgIC8vIG9wdGlvbmFsbHkpLiBEZWxlZ2F0ZXMgdG8gKipFQ01BU2NyaXB0IDUqKidzIG5hdGl2ZSBgRnVuY3Rpb24uYmluZGAgaWYKKyAgLy8gYXZhaWxhYmxlLgorICBfLmJpbmQgPSBmdW5jdGlvbihmdW5jLCBjb250ZXh0KSB7CisgICAgaWYgKGZ1bmMuYmluZCA9PT0gbmF0aXZlQmluZCAmJiBuYXRpdmVCaW5kKSByZXR1cm4gbmF0aXZlQmluZC5hcHBseShmdW5jLCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOworICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOworICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpOworICAgIH07CisgIH07CisKKyAgLy8gUGFydGlhbGx5IGFwcGx5IGEgZnVuY3Rpb24gYnkgY3JlYXRpbmcgYSB2ZXJzaW9uIHRoYXQgaGFzIGhhZCBzb21lIG9mIGl0cworICAvLyBhcmd1bWVudHMgcHJlLWZpbGxlZCwgd2l0aG91dCBjaGFuZ2luZyBpdHMgZHluYW1pYyBgdGhpc2AgY29udGV4dC4KKyAgXy5wYXJ0aWFsID0gZnVuY3Rpb24oZnVuYykgeworICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpOworICAgIH07CisgIH07CisKKyAgLy8gQmluZCBhbGwgb2YgYW4gb2JqZWN0J3MgbWV0aG9kcyB0byB0aGF0IG9iamVjdC4gVXNlZnVsIGZvciBlbnN1cmluZyB0aGF0CisgIC8vIGFsbCBjYWxsYmFja3MgZGVmaW5lZCBvbiBhbiBvYmplY3QgYmVsb25nIHRvIGl0LgorICBfLmJpbmRBbGwgPSBmdW5jdGlvbihvYmopIHsKKyAgICB2YXIgZnVuY3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMCkgZnVuY3MgPSBfLmZ1bmN0aW9ucyhvYmopOworICAgIGVhY2goZnVuY3MsIGZ1bmN0aW9uKGYpIHsgb2JqW2ZdID0gXy5iaW5kKG9ialtmXSwgb2JqKTsgfSk7CisgICAgcmV0dXJuIG9iajsKKyAgfTsKKworICAvLyBNZW1vaXplIGFuIGV4cGVuc2l2ZSBmdW5jdGlvbiBieSBzdG9yaW5nIGl0cyByZXN1bHRzLgorICBfLm1lbW9pemUgPSBmdW5jdGlvbihmdW5jLCBoYXNoZXIpIHsKKyAgICB2YXIgbWVtbyA9IHt9OworICAgIGhhc2hlciB8fCAoaGFzaGVyID0gXy5pZGVudGl0eSk7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGtleSA9IGhhc2hlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgcmV0dXJuIF8uaGFzKG1lbW8sIGtleSkgPyBtZW1vW2tleV0gOiAobWVtb1trZXldID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKKyAgICB9OworICB9OworCisgIC8vIERlbGF5cyBhIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgYW5kIHRoZW4gY2FsbHMKKyAgLy8gaXQgd2l0aCB0aGUgYXJndW1lbnRzIHN1cHBsaWVkLgorICBfLmRlbGF5ID0gZnVuY3Rpb24oZnVuYywgd2FpdCkgeworICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOworICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IHJldHVybiBmdW5jLmFwcGx5KG51bGwsIGFyZ3MpOyB9LCB3YWl0KTsKKyAgfTsKKworICAvLyBEZWZlcnMgYSBmdW5jdGlvbiwgc2NoZWR1bGluZyBpdCB0byBydW4gYWZ0ZXIgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXMKKyAgLy8gY2xlYXJlZC4KKyAgXy5kZWZlciA9IGZ1bmN0aW9uKGZ1bmMpIHsKKyAgICByZXR1cm4gXy5kZWxheS5hcHBseShfLCBbZnVuYywgMV0uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSkpOworICB9OworCisgIC8vIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgd2hlbiBpbnZva2VkLCB3aWxsIG9ubHkgYmUgdHJpZ2dlcmVkIGF0IG1vc3Qgb25jZQorICAvLyBkdXJpbmcgYSBnaXZlbiB3aW5kb3cgb2YgdGltZS4KKyAgXy50aHJvdHRsZSA9IGZ1bmN0aW9uKGZ1bmMsIHdhaXQpIHsKKyAgICB2YXIgY29udGV4dCwgYXJncywgdGltZW91dCwgcmVzdWx0OworICAgIHZhciBwcmV2aW91cyA9IDA7CisgICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oKSB7CisgICAgICBwcmV2aW91cyA9IG5ldyBEYXRlOworICAgICAgdGltZW91dCA9IG51bGw7CisgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpOworICAgIH07CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlOworICAgICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAobm93IC0gcHJldmlvdXMpOworICAgICAgY29udGV4dCA9IHRoaXM7CisgICAgICBhcmdzID0gYXJndW1lbnRzOworICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSB7CisgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgdGltZW91dCA9IG51bGw7CisgICAgICAgIHByZXZpb3VzID0gbm93OworICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpOworICAgICAgfSBlbHNlIGlmICghdGltZW91dCkgeworICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfTsKKyAgfTsKKworICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90CisgIC8vIGJlIHRyaWdnZXJlZC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3IKKyAgLy8gTiBtaWxsaXNlY29uZHMuIElmIGBpbW1lZGlhdGVgIGlzIHBhc3NlZCwgdHJpZ2dlciB0aGUgZnVuY3Rpb24gb24gdGhlCisgIC8vIGxlYWRpbmcgZWRnZSwgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcuCisgIF8uZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHsKKyAgICB2YXIgdGltZW91dCwgcmVzdWx0OworICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBjb250ZXh0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsKKyAgICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICB0aW1lb3V0ID0gbnVsbDsKKyAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7CisgICAgICB9OworICAgICAgdmFyIGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7CisgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7CisgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7CisgICAgICBpZiAoY2FsbE5vdykgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfTsKKyAgfTsKKworICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGF0IG1vc3Qgb25lIHRpbWUsIG5vIG1hdHRlciBob3cKKyAgLy8gb2Z0ZW4geW91IGNhbGwgaXQuIFVzZWZ1bCBmb3IgbGF6eSBpbml0aWFsaXphdGlvbi4KKyAgXy5vbmNlID0gZnVuY3Rpb24oZnVuYykgeworICAgIHZhciByYW4gPSBmYWxzZSwgbWVtbzsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICBpZiAocmFuKSByZXR1cm4gbWVtbzsKKyAgICAgIHJhbiA9IHRydWU7CisgICAgICBtZW1vID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgZnVuYyA9IG51bGw7CisgICAgICByZXR1cm4gbWVtbzsKKyAgICB9OworICB9OworCisgIC8vIFJldHVybnMgdGhlIGZpcnN0IGZ1bmN0aW9uIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgc2Vjb25kLAorICAvLyBhbGxvd2luZyB5b3UgdG8gYWRqdXN0IGFyZ3VtZW50cywgcnVuIGNvZGUgYmVmb3JlIGFuZCBhZnRlciwgYW5kCisgIC8vIGNvbmRpdGlvbmFsbHkgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uCisgIF8ud3JhcCA9IGZ1bmN0aW9uKGZ1bmMsIHdyYXBwZXIpIHsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICB2YXIgYXJncyA9IFtmdW5jXTsKKyAgICAgIHB1c2guYXBwbHkoYXJncywgYXJndW1lbnRzKTsKKyAgICAgIHJldHVybiB3cmFwcGVyLmFwcGx5KHRoaXMsIGFyZ3MpOworICAgIH07CisgIH07CisKKyAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIGNvbXBvc2l0aW9uIG9mIGEgbGlzdCBvZiBmdW5jdGlvbnMsIGVhY2gKKyAgLy8gY29uc3VtaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgZm9sbG93cy4KKyAgXy5jb21wb3NlID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIGZ1bmNzID0gYXJndW1lbnRzOworICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzOworICAgICAgZm9yICh2YXIgaSA9IGZ1bmNzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGFyZ3MgPSBbZnVuY3NbaV0uYXBwbHkodGhpcywgYXJncyldOworICAgICAgfQorICAgICAgcmV0dXJuIGFyZ3NbMF07CisgICAgfTsKKyAgfTsKKworICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgYWZ0ZXIgYmVpbmcgY2FsbGVkIE4gdGltZXMuCisgIF8uYWZ0ZXIgPSBmdW5jdGlvbih0aW1lcywgZnVuYykgeworICAgIGlmICh0aW1lcyA8PSAwKSByZXR1cm4gZnVuYygpOworICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIGlmICgtLXRpbWVzIDwgMSkgeworICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfQorICAgIH07CisgIH07CisKKyAgLy8gT2JqZWN0IEZ1bmN0aW9ucworICAvLyAtLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gUmV0cmlldmUgdGhlIG5hbWVzIG9mIGFuIG9iamVjdCdzIHByb3BlcnRpZXMuCisgIC8vIERlbGVnYXRlcyB0byAqKkVDTUFTY3JpcHQgNSoqJ3MgbmF0aXZlIGBPYmplY3Qua2V5c2AKKyAgXy5rZXlzID0gbmF0aXZlS2V5cyB8fCBmdW5jdGlvbihvYmopIHsKKyAgICBpZiAob2JqICE9PSBPYmplY3Qob2JqKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBvYmplY3QnKTsKKyAgICB2YXIga2V5cyA9IFtdOworICAgIGZvciAodmFyIGtleSBpbiBvYmopIGlmIChfLmhhcyhvYmosIGtleSkpIGtleXNba2V5cy5sZW5ndGhdID0ga2V5OworICAgIHJldHVybiBrZXlzOworICB9OworCisgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZXMgb2YgYW4gb2JqZWN0J3MgcHJvcGVydGllcy4KKyAgXy52YWx1ZXMgPSBmdW5jdGlvbihvYmopIHsKKyAgICB2YXIgdmFsdWVzID0gW107CisgICAgZm9yICh2YXIga2V5IGluIG9iaikgaWYgKF8uaGFzKG9iaiwga2V5KSkgdmFsdWVzLnB1c2gob2JqW2tleV0pOworICAgIHJldHVybiB2YWx1ZXM7CisgIH07CisKKyAgLy8gQ29udmVydCBhbiBvYmplY3QgaW50byBhIGxpc3Qgb2YgYFtrZXksIHZhbHVlXWAgcGFpcnMuCisgIF8ucGFpcnMgPSBmdW5jdGlvbihvYmopIHsKKyAgICB2YXIgcGFpcnMgPSBbXTsKKyAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSBpZiAoXy5oYXMob2JqLCBrZXkpKSBwYWlycy5wdXNoKFtrZXksIG9ialtrZXldXSk7CisgICAgcmV0dXJuIHBhaXJzOworICB9OworCisgIC8vIEludmVydCB0aGUga2V5cyBhbmQgdmFsdWVzIG9mIGFuIG9iamVjdC4gVGhlIHZhbHVlcyBtdXN0IGJlIHNlcmlhbGl6YWJsZS4KKyAgXy5pbnZlcnQgPSBmdW5jdGlvbihvYmopIHsKKyAgICB2YXIgcmVzdWx0ID0ge307CisgICAgZm9yICh2YXIga2V5IGluIG9iaikgaWYgKF8uaGFzKG9iaiwga2V5KSkgcmVzdWx0W29ialtrZXldXSA9IGtleTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9OworCisgIC8vIFJldHVybiBhIHNvcnRlZCBsaXN0IG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBhdmFpbGFibGUgb24gdGhlIG9iamVjdC4KKyAgLy8gQWxpYXNlZCBhcyBgbWV0aG9kc2AKKyAgXy5mdW5jdGlvbnMgPSBfLm1ldGhvZHMgPSBmdW5jdGlvbihvYmopIHsKKyAgICB2YXIgbmFtZXMgPSBbXTsKKyAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7CisgICAgICBpZiAoXy5pc0Z1bmN0aW9uKG9ialtrZXldKSkgbmFtZXMucHVzaChrZXkpOworICAgIH0KKyAgICByZXR1cm4gbmFtZXMuc29ydCgpOworICB9OworCisgIC8vIEV4dGVuZCBhIGdpdmVuIG9iamVjdCB3aXRoIGFsbCB0aGUgcHJvcGVydGllcyBpbiBwYXNzZWQtaW4gb2JqZWN0KHMpLgorICBfLmV4dGVuZCA9IGZ1bmN0aW9uKG9iaikgeworICAgIGVhY2goc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCBmdW5jdGlvbihzb3VyY2UpIHsKKyAgICAgIGlmIChzb3VyY2UpIHsKKyAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHsKKyAgICAgICAgICBvYmpbcHJvcF0gPSBzb3VyY2VbcHJvcF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gb2JqOworICB9OworCisgIC8vIFJldHVybiBhIGNvcHkgb2YgdGhlIG9iamVjdCBvbmx5IGNvbnRhaW5pbmcgdGhlIHdoaXRlbGlzdGVkIHByb3BlcnRpZXMuCisgIF8ucGljayA9IGZ1bmN0aW9uKG9iaikgeworICAgIHZhciBjb3B5ID0ge307CisgICAgdmFyIGtleXMgPSBjb25jYXQuYXBwbHkoQXJyYXlQcm90bywgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKKyAgICBlYWNoKGtleXMsIGZ1bmN0aW9uKGtleSkgeworICAgICAgaWYgKGtleSBpbiBvYmopIGNvcHlba2V5XSA9IG9ialtrZXldOworICAgIH0pOworICAgIHJldHVybiBjb3B5OworICB9OworCisgICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBvYmplY3Qgd2l0aG91dCB0aGUgYmxhY2tsaXN0ZWQgcHJvcGVydGllcy4KKyAgXy5vbWl0ID0gZnVuY3Rpb24ob2JqKSB7CisgICAgdmFyIGNvcHkgPSB7fTsKKyAgICB2YXIga2V5cyA9IGNvbmNhdC5hcHBseShBcnJheVByb3RvLCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOworICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKKyAgICAgIGlmICghXy5jb250YWlucyhrZXlzLCBrZXkpKSBjb3B5W2tleV0gPSBvYmpba2V5XTsKKyAgICB9CisgICAgcmV0dXJuIGNvcHk7CisgIH07CisKKyAgLy8gRmlsbCBpbiBhIGdpdmVuIG9iamVjdCB3aXRoIGRlZmF1bHQgcHJvcGVydGllcy4KKyAgXy5kZWZhdWx0cyA9IGZ1bmN0aW9uKG9iaikgeworICAgIGVhY2goc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCBmdW5jdGlvbihzb3VyY2UpIHsKKyAgICAgIGlmIChzb3VyY2UpIHsKKyAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHsKKyAgICAgICAgICBpZiAob2JqW3Byb3BdID09IG51bGwpIG9ialtwcm9wXSA9IHNvdXJjZVtwcm9wXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBvYmo7CisgIH07CisKKyAgLy8gQ3JlYXRlIGEgKHNoYWxsb3ctY2xvbmVkKSBkdXBsaWNhdGUgb2YgYW4gb2JqZWN0LgorICBfLmNsb25lID0gZnVuY3Rpb24ob2JqKSB7CisgICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7CisgICAgcmV0dXJuIF8uaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBfLmV4dGVuZCh7fSwgb2JqKTsKKyAgfTsKKworICAvLyBJbnZva2VzIGludGVyY2VwdG9yIHdpdGggdGhlIG9iaiwgYW5kIHRoZW4gcmV0dXJucyBvYmouCisgIC8vIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gInRhcCBpbnRvIiBhIG1ldGhvZCBjaGFpbiwgaW4KKyAgLy8gb3JkZXIgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9uIGludGVybWVkaWF0ZSByZXN1bHRzIHdpdGhpbiB0aGUgY2hhaW4uCisgIF8udGFwID0gZnVuY3Rpb24ob2JqLCBpbnRlcmNlcHRvcikgeworICAgIGludGVyY2VwdG9yKG9iaik7CisgICAgcmV0dXJuIG9iajsKKyAgfTsKKworICAvLyBJbnRlcm5hbCByZWN1cnNpdmUgY29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgYGlzRXF1YWxgLgorICB2YXIgZXEgPSBmdW5jdGlvbihhLCBiLCBhU3RhY2ssIGJTdGFjaykgeworICAgIC8vIElkZW50aWNhbCBvYmplY3RzIGFyZSBlcXVhbC4gYDAgPT09IC0wYCwgYnV0IHRoZXkgYXJlbid0IGlkZW50aWNhbC4KKyAgICAvLyBTZWUgdGhlIEhhcm1vbnkgYGVnYWxgIHByb3Bvc2FsOiBodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OmVnYWwuCisgICAgaWYgKGEgPT09IGIpIHJldHVybiBhICE9PSAwIHx8IDEgLyBhID09IDEgLyBiOworICAgIC8vIEEgc3RyaWN0IGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgYG51bGwgPT0gdW5kZWZpbmVkYC4KKyAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGEgPT09IGI7CisgICAgLy8gVW53cmFwIGFueSB3cmFwcGVkIG9iamVjdHMuCisgICAgaWYgKGEgaW5zdGFuY2VvZiBfKSBhID0gYS5fd3JhcHBlZDsKKyAgICBpZiAoYiBpbnN0YW5jZW9mIF8pIGIgPSBiLl93cmFwcGVkOworICAgIC8vIENvbXBhcmUgYFtbQ2xhc3NdXWAgbmFtZXMuCisgICAgdmFyIGNsYXNzTmFtZSA9IHRvU3RyaW5nLmNhbGwoYSk7CisgICAgaWYgKGNsYXNzTmFtZSAhPSB0b1N0cmluZy5jYWxsKGIpKSByZXR1cm4gZmFsc2U7CisgICAgc3dpdGNoIChjbGFzc05hbWUpIHsKKyAgICAgIC8vIFN0cmluZ3MsIG51bWJlcnMsIGRhdGVzLCBhbmQgYm9vbGVhbnMgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlLgorICAgICAgY2FzZSAnW29iamVjdCBTdHJpbmddJzoKKyAgICAgICAgLy8gUHJpbWl0aXZlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBvYmplY3Qgd3JhcHBlcnMgYXJlIGVxdWl2YWxlbnQ7IHRodXMsIGAiNSJgIGlzCisgICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gYG5ldyBTdHJpbmcoIjUiKWAuCisgICAgICAgIHJldHVybiBhID09IFN0cmluZyhiKTsKKyAgICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6CisgICAgICAgIC8vIGBOYU5gcyBhcmUgZXF1aXZhbGVudCwgYnV0IG5vbi1yZWZsZXhpdmUuIEFuIGBlZ2FsYCBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBmb3IKKyAgICAgICAgLy8gb3RoZXIgbnVtZXJpYyB2YWx1ZXMuCisgICAgICAgIHJldHVybiBhICE9ICthID8gYiAhPSArYiA6IChhID09IDAgPyAxIC8gYSA9PSAxIC8gYiA6IGEgPT0gK2IpOworICAgICAgY2FzZSAnW29iamVjdCBEYXRlXSc6CisgICAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzoKKyAgICAgICAgLy8gQ29lcmNlIGRhdGVzIGFuZCBib29sZWFucyB0byBudW1lcmljIHByaW1pdGl2ZSB2YWx1ZXMuIERhdGVzIGFyZSBjb21wYXJlZCBieSB0aGVpcgorICAgICAgICAvLyBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnMuIE5vdGUgdGhhdCBpbnZhbGlkIGRhdGVzIHdpdGggbWlsbGlzZWNvbmQgcmVwcmVzZW50YXRpb25zCisgICAgICAgIC8vIG9mIGBOYU5gIGFyZSBub3QgZXF1aXZhbGVudC4KKyAgICAgICAgcmV0dXJuICthID09ICtiOworICAgICAgLy8gUmVnRXhwcyBhcmUgY29tcGFyZWQgYnkgdGhlaXIgc291cmNlIHBhdHRlcm5zIGFuZCBmbGFncy4KKyAgICAgIGNhc2UgJ1tvYmplY3QgUmVnRXhwXSc6CisgICAgICAgIHJldHVybiBhLnNvdXJjZSA9PSBiLnNvdXJjZSAmJgorICAgICAgICAgICAgICAgYS5nbG9iYWwgPT0gYi5nbG9iYWwgJiYKKyAgICAgICAgICAgICAgIGEubXVsdGlsaW5lID09IGIubXVsdGlsaW5lICYmCisgICAgICAgICAgICAgICBhLmlnbm9yZUNhc2UgPT0gYi5pZ25vcmVDYXNlOworICAgIH0KKyAgICBpZiAodHlwZW9mIGEgIT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTsKKyAgICAvLyBBc3N1bWUgZXF1YWxpdHkgZm9yIGN5Y2xpYyBzdHJ1Y3R1cmVzLiBUaGUgYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgY3ljbGljCisgICAgLy8gc3RydWN0dXJlcyBpcyBhZGFwdGVkIGZyb20gRVMgNS4xIHNlY3Rpb24gMTUuMTIuMywgYWJzdHJhY3Qgb3BlcmF0aW9uIGBKT2AuCisgICAgdmFyIGxlbmd0aCA9IGFTdGFjay5sZW5ndGg7CisgICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgICAvLyBMaW5lYXIgc2VhcmNoLiBQZXJmb3JtYW5jZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YKKyAgICAgIC8vIHVuaXF1ZSBuZXN0ZWQgc3RydWN0dXJlcy4KKyAgICAgIGlmIChhU3RhY2tbbGVuZ3RoXSA9PSBhKSByZXR1cm4gYlN0YWNrW2xlbmd0aF0gPT0gYjsKKyAgICB9CisgICAgLy8gQWRkIHRoZSBmaXJzdCBvYmplY3QgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLgorICAgIGFTdGFjay5wdXNoKGEpOworICAgIGJTdGFjay5wdXNoKGIpOworICAgIHZhciBzaXplID0gMCwgcmVzdWx0ID0gdHJ1ZTsKKyAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgYW5kIGFycmF5cy4KKyAgICBpZiAoY2xhc3NOYW1lID09ICdbb2JqZWN0IEFycmF5XScpIHsKKyAgICAgIC8vIENvbXBhcmUgYXJyYXkgbGVuZ3RocyB0byBkZXRlcm1pbmUgaWYgYSBkZWVwIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5LgorICAgICAgc2l6ZSA9IGEubGVuZ3RoOworICAgICAgcmVzdWx0ID0gc2l6ZSA9PSBiLmxlbmd0aDsKKyAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgLy8gRGVlcCBjb21wYXJlIHRoZSBjb250ZW50cywgaWdub3Jpbmcgbm9uLW51bWVyaWMgcHJvcGVydGllcy4KKyAgICAgICAgd2hpbGUgKHNpemUtLSkgeworICAgICAgICAgIGlmICghKHJlc3VsdCA9IGVxKGFbc2l6ZV0sIGJbc2l6ZV0sIGFTdGFjaywgYlN0YWNrKSkpIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE9iamVjdHMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1aXZhbGVudCwgYnV0IGBPYmplY3RgcworICAgICAgLy8gZnJvbSBkaWZmZXJlbnQgZnJhbWVzIGFyZS4KKyAgICAgIHZhciBhQ3RvciA9IGEuY29uc3RydWN0b3IsIGJDdG9yID0gYi5jb25zdHJ1Y3RvcjsKKyAgICAgIGlmIChhQ3RvciAhPT0gYkN0b3IgJiYgIShfLmlzRnVuY3Rpb24oYUN0b3IpICYmIChhQ3RvciBpbnN0YW5jZW9mIGFDdG9yKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uaXNGdW5jdGlvbihiQ3RvcikgJiYgKGJDdG9yIGluc3RhbmNlb2YgYkN0b3IpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBEZWVwIGNvbXBhcmUgb2JqZWN0cy4KKyAgICAgIGZvciAodmFyIGtleSBpbiBhKSB7CisgICAgICAgIGlmIChfLmhhcyhhLCBrZXkpKSB7CisgICAgICAgICAgLy8gQ291bnQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBwcm9wZXJ0aWVzLgorICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgICAvLyBEZWVwIGNvbXBhcmUgZWFjaCBtZW1iZXIuCisgICAgICAgICAgaWYgKCEocmVzdWx0ID0gXy5oYXMoYiwga2V5KSAmJiBlcShhW2tleV0sIGJba2V5XSwgYVN0YWNrLCBiU3RhY2spKSkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIEVuc3VyZSB0aGF0IGJvdGggb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBwcm9wZXJ0aWVzLgorICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICBmb3IgKGtleSBpbiBiKSB7CisgICAgICAgICAgaWYgKF8uaGFzKGIsIGtleSkgJiYgIShzaXplLS0pKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSAhc2l6ZTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gUmVtb3ZlIHRoZSBmaXJzdCBvYmplY3QgZnJvbSB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMuCisgICAgYVN0YWNrLnBvcCgpOworICAgIGJTdGFjay5wb3AoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9OworCisgIC8vIFBlcmZvcm0gYSBkZWVwIGNvbXBhcmlzb24gdG8gY2hlY2sgaWYgdHdvIG9iamVjdHMgYXJlIGVxdWFsLgorICBfLmlzRXF1YWwgPSBmdW5jdGlvbihhLCBiKSB7CisgICAgcmV0dXJuIGVxKGEsIGIsIFtdLCBbXSk7CisgIH07CisKKyAgLy8gSXMgYSBnaXZlbiBhcnJheSwgc3RyaW5nLCBvciBvYmplY3QgZW1wdHk/CisgIC8vIEFuICJlbXB0eSIgb2JqZWN0IGhhcyBubyBlbnVtZXJhYmxlIG93bi1wcm9wZXJ0aWVzLgorICBfLmlzRW1wdHkgPSBmdW5jdGlvbihvYmopIHsKKyAgICBpZiAob2JqID09IG51bGwpIHJldHVybiB0cnVlOworICAgIGlmIChfLmlzQXJyYXkob2JqKSB8fCBfLmlzU3RyaW5nKG9iaikpIHJldHVybiBvYmoubGVuZ3RoID09PSAwOworICAgIGZvciAodmFyIGtleSBpbiBvYmopIGlmIChfLmhhcyhvYmosIGtleSkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfTsKKworICAvLyBJcyBhIGdpdmVuIHZhbHVlIGEgRE9NIGVsZW1lbnQ/CisgIF8uaXNFbGVtZW50ID0gZnVuY3Rpb24ob2JqKSB7CisgICAgcmV0dXJuICEhKG9iaiAmJiBvYmoubm9kZVR5cGUgPT09IDEpOworICB9OworCisgIC8vIElzIGEgZ2l2ZW4gdmFsdWUgYW4gYXJyYXk/CisgIC8vIERlbGVnYXRlcyB0byBFQ01BNSdzIG5hdGl2ZSBBcnJheS5pc0FycmF5CisgIF8uaXNBcnJheSA9IG5hdGl2ZUlzQXJyYXkgfHwgZnVuY3Rpb24ob2JqKSB7CisgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PSAnW29iamVjdCBBcnJheV0nOworICB9OworCisgIC8vIElzIGEgZ2l2ZW4gdmFyaWFibGUgYW4gb2JqZWN0PworICBfLmlzT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7CisgICAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaik7CisgIH07CisKKyAgLy8gQWRkIHNvbWUgaXNUeXBlIG1ldGhvZHM6IGlzQXJndW1lbnRzLCBpc0Z1bmN0aW9uLCBpc1N0cmluZywgaXNOdW1iZXIsIGlzRGF0ZSwgaXNSZWdFeHAuCisgIGVhY2goWydBcmd1bWVudHMnLCAnRnVuY3Rpb24nLCAnU3RyaW5nJywgJ051bWJlcicsICdEYXRlJywgJ1JlZ0V4cCddLCBmdW5jdGlvbihuYW1lKSB7CisgICAgX1snaXMnICsgbmFtZV0gPSBmdW5jdGlvbihvYmopIHsKKyAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT0gJ1tvYmplY3QgJyArIG5hbWUgKyAnXSc7CisgICAgfTsKKyAgfSk7CisKKyAgLy8gRGVmaW5lIGEgZmFsbGJhY2sgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIGluIGJyb3dzZXJzIChhaGVtLCBJRSksIHdoZXJlCisgIC8vIHRoZXJlIGlzbid0IGFueSBpbnNwZWN0YWJsZSAiQXJndW1lbnRzIiB0eXBlLgorICBpZiAoIV8uaXNBcmd1bWVudHMoYXJndW1lbnRzKSkgeworICAgIF8uaXNBcmd1bWVudHMgPSBmdW5jdGlvbihvYmopIHsKKyAgICAgIHJldHVybiAhIShvYmogJiYgXy5oYXMob2JqLCAnY2FsbGVlJykpOworICAgIH07CisgIH0KKworICAvLyBPcHRpbWl6ZSBgaXNGdW5jdGlvbmAgaWYgYXBwcm9wcmlhdGUuCisgIGlmICh0eXBlb2YgKC8uLykgIT09ICdmdW5jdGlvbicpIHsKKyAgICBfLmlzRnVuY3Rpb24gPSBmdW5jdGlvbihvYmopIHsKKyAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nOworICAgIH07CisgIH0KKworICAvLyBJcyBhIGdpdmVuIG9iamVjdCBhIGZpbml0ZSBudW1iZXI/CisgIF8uaXNGaW5pdGUgPSBmdW5jdGlvbihvYmopIHsKKyAgICByZXR1cm4gaXNGaW5pdGUob2JqKSAmJiAhaXNOYU4ocGFyc2VGbG9hdChvYmopKTsKKyAgfTsKKworICAvLyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYE5hTmA/IChOYU4gaXMgdGhlIG9ubHkgbnVtYmVyIHdoaWNoIGRvZXMgbm90IGVxdWFsIGl0c2VsZikuCisgIF8uaXNOYU4gPSBmdW5jdGlvbihvYmopIHsKKyAgICByZXR1cm4gXy5pc051bWJlcihvYmopICYmIG9iaiAhPSArb2JqOworICB9OworCisgIC8vIElzIGEgZ2l2ZW4gdmFsdWUgYSBib29sZWFuPworICBfLmlzQm9vbGVhbiA9IGZ1bmN0aW9uKG9iaikgeworICAgIHJldHVybiBvYmogPT09IHRydWUgfHwgb2JqID09PSBmYWxzZSB8fCB0b1N0cmluZy5jYWxsKG9iaikgPT0gJ1tvYmplY3QgQm9vbGVhbl0nOworICB9OworCisgIC8vIElzIGEgZ2l2ZW4gdmFsdWUgZXF1YWwgdG8gbnVsbD8KKyAgXy5pc051bGwgPSBmdW5jdGlvbihvYmopIHsKKyAgICByZXR1cm4gb2JqID09PSBudWxsOworICB9OworCisgIC8vIElzIGEgZ2l2ZW4gdmFyaWFibGUgdW5kZWZpbmVkPworICBfLmlzVW5kZWZpbmVkID0gZnVuY3Rpb24ob2JqKSB7CisgICAgcmV0dXJuIG9iaiA9PT0gdm9pZCAwOworICB9OworCisgIC8vIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBjaGVja2luZyBpZiBhbiBvYmplY3QgaGFzIGEgZ2l2ZW4gcHJvcGVydHkgZGlyZWN0bHkKKyAgLy8gb24gaXRzZWxmIChpbiBvdGhlciB3b3Jkcywgbm90IG9uIGEgcHJvdG90eXBlKS4KKyAgXy5oYXMgPSBmdW5jdGlvbihvYmosIGtleSkgeworICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTsKKyAgfTsKKworICAvLyBVdGlsaXR5IEZ1bmN0aW9ucworICAvLyAtLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFJ1biBVbmRlcnNjb3JlLmpzIGluICpub0NvbmZsaWN0KiBtb2RlLCByZXR1cm5pbmcgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHMKKyAgLy8gcHJldmlvdXMgb3duZXIuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0LgorICBfLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHsKKyAgICByb290Ll8gPSBwcmV2aW91c1VuZGVyc2NvcmU7CisgICAgcmV0dXJuIHRoaXM7CisgIH07CisKKyAgLy8gS2VlcCB0aGUgaWRlbnRpdHkgZnVuY3Rpb24gYXJvdW5kIGZvciBkZWZhdWx0IGl0ZXJhdG9ycy4KKyAgXy5pZGVudGl0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9OworCisgIC8vIFJ1biBhIGZ1bmN0aW9uICoqbioqIHRpbWVzLgorICBfLnRpbWVzID0gZnVuY3Rpb24obiwgaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICB2YXIgYWNjdW0gPSBBcnJheShuKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgYWNjdW1baV0gPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIGkpOworICAgIHJldHVybiBhY2N1bTsKKyAgfTsKKworICAvLyBSZXR1cm4gYSByYW5kb20gaW50ZWdlciBiZXR3ZWVuIG1pbiBhbmQgbWF4IChpbmNsdXNpdmUpLgorICBfLnJhbmRvbSA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7CisgICAgaWYgKG1heCA9PSBudWxsKSB7CisgICAgICBtYXggPSBtaW47CisgICAgICBtaW4gPSAwOworICAgIH0KKyAgICByZXR1cm4gbWluICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKTsKKyAgfTsKKworICAvLyBMaXN0IG9mIEhUTUwgZW50aXRpZXMgZm9yIGVzY2FwaW5nLgorICB2YXIgZW50aXR5TWFwID0geworICAgIGVzY2FwZTogeworICAgICAgJyYnOiAnJmFtcDsnLAorICAgICAgJzwnOiAnJmx0OycsCisgICAgICAnPic6ICcmZ3Q7JywKKyAgICAgICciJzogJyZxdW90OycsCisgICAgICAiJyI6ICcmI3gyNzsnLAorICAgICAgJy8nOiAnJiN4MkY7JworICAgIH0KKyAgfTsKKyAgZW50aXR5TWFwLnVuZXNjYXBlID0gXy5pbnZlcnQoZW50aXR5TWFwLmVzY2FwZSk7CisKKyAgLy8gUmVnZXhlcyBjb250YWluaW5nIHRoZSBrZXlzIGFuZCB2YWx1ZXMgbGlzdGVkIGltbWVkaWF0ZWx5IGFib3ZlLgorICB2YXIgZW50aXR5UmVnZXhlcyA9IHsKKyAgICBlc2NhcGU6ICAgbmV3IFJlZ0V4cCgnWycgKyBfLmtleXMoZW50aXR5TWFwLmVzY2FwZSkuam9pbignJykgKyAnXScsICdnJyksCisgICAgdW5lc2NhcGU6IG5ldyBSZWdFeHAoJygnICsgXy5rZXlzKGVudGl0eU1hcC51bmVzY2FwZSkuam9pbignfCcpICsgJyknLCAnZycpCisgIH07CisKKyAgLy8gRnVuY3Rpb25zIGZvciBlc2NhcGluZyBhbmQgdW5lc2NhcGluZyBzdHJpbmdzIHRvL2Zyb20gSFRNTCBpbnRlcnBvbGF0aW9uLgorICBfLmVhY2goWydlc2NhcGUnLCAndW5lc2NhcGUnXSwgZnVuY3Rpb24obWV0aG9kKSB7CisgICAgX1ttZXRob2RdID0gZnVuY3Rpb24oc3RyaW5nKSB7CisgICAgICBpZiAoc3RyaW5nID09IG51bGwpIHJldHVybiAnJzsKKyAgICAgIHJldHVybiAoJycgKyBzdHJpbmcpLnJlcGxhY2UoZW50aXR5UmVnZXhlc1ttZXRob2RdLCBmdW5jdGlvbihtYXRjaCkgeworICAgICAgICByZXR1cm4gZW50aXR5TWFwW21ldGhvZF1bbWF0Y2hdOworICAgICAgfSk7CisgICAgfTsKKyAgfSk7CisKKyAgLy8gSWYgdGhlIHZhbHVlIG9mIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcyBhIGZ1bmN0aW9uIHRoZW4gaW52b2tlIGl0OworICAvLyBvdGhlcndpc2UsIHJldHVybiBpdC4KKyAgXy5yZXN1bHQgPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7CisgICAgaWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICB2YXIgdmFsdWUgPSBvYmplY3RbcHJvcGVydHldOworICAgIHJldHVybiBfLmlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUuY2FsbChvYmplY3QpIDogdmFsdWU7CisgIH07CisKKyAgLy8gQWRkIHlvdXIgb3duIGN1c3RvbSBmdW5jdGlvbnMgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0LgorICBfLm1peGluID0gZnVuY3Rpb24ob2JqKSB7CisgICAgZWFjaChfLmZ1bmN0aW9ucyhvYmopLCBmdW5jdGlvbihuYW1lKXsKKyAgICAgIHZhciBmdW5jID0gX1tuYW1lXSA9IG9ialtuYW1lXTsKKyAgICAgIF8ucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBhcmdzID0gW3RoaXMuX3dyYXBwZWRdOworICAgICAgICBwdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7CisgICAgICAgIHJldHVybiByZXN1bHQuY2FsbCh0aGlzLCBmdW5jLmFwcGx5KF8sIGFyZ3MpKTsKKyAgICAgIH07CisgICAgfSk7CisgIH07CisKKyAgLy8gR2VuZXJhdGUgYSB1bmlxdWUgaW50ZWdlciBpZCAodW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIGNsaWVudCBzZXNzaW9uKS4KKyAgLy8gVXNlZnVsIGZvciB0ZW1wb3JhcnkgRE9NIGlkcy4KKyAgdmFyIGlkQ291bnRlciA9IDA7CisgIF8udW5pcXVlSWQgPSBmdW5jdGlvbihwcmVmaXgpIHsKKyAgICB2YXIgaWQgPSArK2lkQ291bnRlciArICcnOworICAgIHJldHVybiBwcmVmaXggPyBwcmVmaXggKyBpZCA6IGlkOworICB9OworCisgIC8vIEJ5IGRlZmF1bHQsIFVuZGVyc2NvcmUgdXNlcyBFUkItc3R5bGUgdGVtcGxhdGUgZGVsaW1pdGVycywgY2hhbmdlIHRoZQorICAvLyBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlIGRlbGltaXRlcnMuCisgIF8udGVtcGxhdGVTZXR0aW5ncyA9IHsKKyAgICBldmFsdWF0ZSAgICA6IC88JShbXHNcU10rPyklPi9nLAorICAgIGludGVycG9sYXRlIDogLzwlPShbXHNcU10rPyklPi9nLAorICAgIGVzY2FwZSAgICAgIDogLzwlLShbXHNcU10rPyklPi9nCisgIH07CisKKyAgLy8gV2hlbiBjdXN0b21pemluZyBgdGVtcGxhdGVTZXR0aW5nc2AsIGlmIHlvdSBkb24ndCB3YW50IHRvIGRlZmluZSBhbgorICAvLyBpbnRlcnBvbGF0aW9uLCBldmFsdWF0aW9uIG9yIGVzY2FwaW5nIHJlZ2V4LCB3ZSBuZWVkIG9uZSB0aGF0IGlzCisgIC8vIGd1YXJhbnRlZWQgbm90IHRvIG1hdGNoLgorICB2YXIgbm9NYXRjaCA9IC8oLileLzsKKworICAvLyBDZXJ0YWluIGNoYXJhY3RlcnMgbmVlZCB0byBiZSBlc2NhcGVkIHNvIHRoYXQgdGhleSBjYW4gYmUgcHV0IGludG8gYQorICAvLyBzdHJpbmcgbGl0ZXJhbC4KKyAgdmFyIGVzY2FwZXMgPSB7CisgICAgIiciOiAgICAgICInIiwKKyAgICAnXFwnOiAgICAgJ1xcJywKKyAgICAnXHInOiAgICAgJ3InLAorICAgICdcbic6ICAgICAnbicsCisgICAgJ1x0JzogICAgICd0JywKKyAgICAnXHUyMDI4JzogJ3UyMDI4JywKKyAgICAnXHUyMDI5JzogJ3UyMDI5JworICB9OworCisgIHZhciBlc2NhcGVyID0gL1xcfCd8XHJ8XG58XHR8XHUyMDI4fFx1MjAyOS9nOworCisgIC8vIEphdmFTY3JpcHQgbWljcm8tdGVtcGxhdGluZywgc2ltaWxhciB0byBKb2huIFJlc2lnJ3MgaW1wbGVtZW50YXRpb24uCisgIC8vIFVuZGVyc2NvcmUgdGVtcGxhdGluZyBoYW5kbGVzIGFyYml0cmFyeSBkZWxpbWl0ZXJzLCBwcmVzZXJ2ZXMgd2hpdGVzcGFjZSwKKyAgLy8gYW5kIGNvcnJlY3RseSBlc2NhcGVzIHF1b3RlcyB3aXRoaW4gaW50ZXJwb2xhdGVkIGNvZGUuCisgIF8udGVtcGxhdGUgPSBmdW5jdGlvbih0ZXh0LCBkYXRhLCBzZXR0aW5ncykgeworICAgIHZhciByZW5kZXI7CisgICAgc2V0dGluZ3MgPSBfLmRlZmF1bHRzKHt9LCBzZXR0aW5ncywgXy50ZW1wbGF0ZVNldHRpbmdzKTsKKworICAgIC8vIENvbWJpbmUgZGVsaW1pdGVycyBpbnRvIG9uZSByZWd1bGFyIGV4cHJlc3Npb24gdmlhIGFsdGVybmF0aW9uLgorICAgIHZhciBtYXRjaGVyID0gbmV3IFJlZ0V4cChbCisgICAgICAoc2V0dGluZ3MuZXNjYXBlIHx8IG5vTWF0Y2gpLnNvdXJjZSwKKyAgICAgIChzZXR0aW5ncy5pbnRlcnBvbGF0ZSB8fCBub01hdGNoKS5zb3VyY2UsCisgICAgICAoc2V0dGluZ3MuZXZhbHVhdGUgfHwgbm9NYXRjaCkuc291cmNlCisgICAgXS5qb2luKCd8JykgKyAnfCQnLCAnZycpOworCisgICAgLy8gQ29tcGlsZSB0aGUgdGVtcGxhdGUgc291cmNlLCBlc2NhcGluZyBzdHJpbmcgbGl0ZXJhbHMgYXBwcm9wcmlhdGVseS4KKyAgICB2YXIgaW5kZXggPSAwOworICAgIHZhciBzb3VyY2UgPSAiX19wKz0nIjsKKyAgICB0ZXh0LnJlcGxhY2UobWF0Y2hlciwgZnVuY3Rpb24obWF0Y2gsIGVzY2FwZSwgaW50ZXJwb2xhdGUsIGV2YWx1YXRlLCBvZmZzZXQpIHsKKyAgICAgIHNvdXJjZSArPSB0ZXh0LnNsaWNlKGluZGV4LCBvZmZzZXQpCisgICAgICAgIC5yZXBsYWNlKGVzY2FwZXIsIGZ1bmN0aW9uKG1hdGNoKSB7IHJldHVybiAnXFwnICsgZXNjYXBlc1ttYXRjaF07IH0pOworCisgICAgICBpZiAoZXNjYXBlKSB7CisgICAgICAgIHNvdXJjZSArPSAiJytcbigoX190PSgiICsgZXNjYXBlICsgIikpPT1udWxsPycnOl8uZXNjYXBlKF9fdCkpK1xuJyI7CisgICAgICB9CisgICAgICBpZiAoaW50ZXJwb2xhdGUpIHsKKyAgICAgICAgc291cmNlICs9ICInK1xuKChfX3Q9KCIgKyBpbnRlcnBvbGF0ZSArICIpKT09bnVsbD8nJzpfX3QpK1xuJyI7CisgICAgICB9CisgICAgICBpZiAoZXZhbHVhdGUpIHsKKyAgICAgICAgc291cmNlICs9ICInO1xuIiArIGV2YWx1YXRlICsgIlxuX19wKz0nIjsKKyAgICAgIH0KKyAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoOworICAgICAgcmV0dXJuIG1hdGNoOworICAgIH0pOworICAgIHNvdXJjZSArPSAiJztcbiI7CisKKyAgICAvLyBJZiBhIHZhcmlhYmxlIGlzIG5vdCBzcGVjaWZpZWQsIHBsYWNlIGRhdGEgdmFsdWVzIGluIGxvY2FsIHNjb3BlLgorICAgIGlmICghc2V0dGluZ3MudmFyaWFibGUpIHNvdXJjZSA9ICd3aXRoKG9ianx8e30pe1xuJyArIHNvdXJjZSArICd9XG4nOworCisgICAgc291cmNlID0gInZhciBfX3QsX19wPScnLF9faj1BcnJheS5wcm90b3R5cGUuam9pbiwiICsKKyAgICAgICJwcmludD1mdW5jdGlvbigpe19fcCs9X19qLmNhbGwoYXJndW1lbnRzLCcnKTt9O1xuIiArCisgICAgICBzb3VyY2UgKyAicmV0dXJuIF9fcDtcbiI7CisKKyAgICB0cnkgeworICAgICAgcmVuZGVyID0gbmV3IEZ1bmN0aW9uKHNldHRpbmdzLnZhcmlhYmxlIHx8ICdvYmonLCAnXycsIHNvdXJjZSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgZS5zb3VyY2UgPSBzb3VyY2U7CisgICAgICB0aHJvdyBlOworICAgIH0KKworICAgIGlmIChkYXRhKSByZXR1cm4gcmVuZGVyKGRhdGEsIF8pOworICAgIHZhciB0ZW1wbGF0ZSA9IGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgIHJldHVybiByZW5kZXIuY2FsbCh0aGlzLCBkYXRhLCBfKTsKKyAgICB9OworCisgICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24gc291cmNlIGFzIGEgY29udmVuaWVuY2UgZm9yIHByZWNvbXBpbGF0aW9uLgorICAgIHRlbXBsYXRlLnNvdXJjZSA9ICdmdW5jdGlvbignICsgKHNldHRpbmdzLnZhcmlhYmxlIHx8ICdvYmonKSArICcpe1xuJyArIHNvdXJjZSArICd9JzsKKworICAgIHJldHVybiB0ZW1wbGF0ZTsKKyAgfTsKKworICAvLyBBZGQgYSAiY2hhaW4iIGZ1bmN0aW9uLCB3aGljaCB3aWxsIGRlbGVnYXRlIHRvIHRoZSB3cmFwcGVyLgorICBfLmNoYWluID0gZnVuY3Rpb24ob2JqKSB7CisgICAgcmV0dXJuIF8ob2JqKS5jaGFpbigpOworICB9OworCisgIC8vIE9PUAorICAvLyAtLS0tLS0tLS0tLS0tLS0KKyAgLy8gSWYgVW5kZXJzY29yZSBpcyBjYWxsZWQgYXMgYSBmdW5jdGlvbiwgaXQgcmV0dXJucyBhIHdyYXBwZWQgb2JqZWN0IHRoYXQKKyAgLy8gY2FuIGJlIHVzZWQgT08tc3R5bGUuIFRoaXMgd3JhcHBlciBob2xkcyBhbHRlcmVkIHZlcnNpb25zIG9mIGFsbCB0aGUKKyAgLy8gdW5kZXJzY29yZSBmdW5jdGlvbnMuIFdyYXBwZWQgb2JqZWN0cyBtYXkgYmUgY2hhaW5lZC4KKworICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY29udGludWUgY2hhaW5pbmcgaW50ZXJtZWRpYXRlIHJlc3VsdHMuCisgIHZhciByZXN1bHQgPSBmdW5jdGlvbihvYmopIHsKKyAgICByZXR1cm4gdGhpcy5fY2hhaW4gPyBfKG9iaikuY2hhaW4oKSA6IG9iajsKKyAgfTsKKworICAvLyBBZGQgYWxsIG9mIHRoZSBVbmRlcnNjb3JlIGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlciBvYmplY3QuCisgIF8ubWl4aW4oXyk7CisKKyAgLy8gQWRkIGFsbCBtdXRhdG9yIEFycmF5IGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci4KKyAgZWFjaChbJ3BvcCcsICdwdXNoJywgJ3JldmVyc2UnLCAnc2hpZnQnLCAnc29ydCcsICdzcGxpY2UnLCAndW5zaGlmdCddLCBmdW5jdGlvbihuYW1lKSB7CisgICAgdmFyIG1ldGhvZCA9IEFycmF5UHJvdG9bbmFtZV07CisgICAgXy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBvYmogPSB0aGlzLl93cmFwcGVkOworICAgICAgbWV0aG9kLmFwcGx5KG9iaiwgYXJndW1lbnRzKTsKKyAgICAgIGlmICgobmFtZSA9PSAnc2hpZnQnIHx8IG5hbWUgPT0gJ3NwbGljZScpICYmIG9iai5sZW5ndGggPT09IDApIGRlbGV0ZSBvYmpbMF07CisgICAgICByZXR1cm4gcmVzdWx0LmNhbGwodGhpcywgb2JqKTsKKyAgICB9OworICB9KTsKKworICAvLyBBZGQgYWxsIGFjY2Vzc29yIEFycmF5IGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci4KKyAgZWFjaChbJ2NvbmNhdCcsICdqb2luJywgJ3NsaWNlJ10sIGZ1bmN0aW9uKG5hbWUpIHsKKyAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90b1tuYW1lXTsKKyAgICBfLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHJlc3VsdC5jYWxsKHRoaXMsIG1ldGhvZC5hcHBseSh0aGlzLl93cmFwcGVkLCBhcmd1bWVudHMpKTsKKyAgICB9OworICB9KTsKKworICBfLmV4dGVuZChfLnByb3RvdHlwZSwgeworCisgICAgLy8gU3RhcnQgY2hhaW5pbmcgYSB3cmFwcGVkIFVuZGVyc2NvcmUgb2JqZWN0LgorICAgIGNoYWluOiBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuX2NoYWluID0gdHJ1ZTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvLyBFeHRyYWN0cyB0aGUgcmVzdWx0IGZyb20gYSB3cmFwcGVkIGFuZCBjaGFpbmVkIG9iamVjdC4KKyAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gdGhpcy5fd3JhcHBlZDsKKyAgICB9CisKKyAgfSk7CisKK30pLmNhbGwodGhpcyk7CmRpZmYgLS1naXQgYS9fc3RhdGljL3VwLXByZXNzZWQucG5nIGIvX3N0YXRpYy91cC1wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ1ODdhCi0tLSAvZGV2L251bGwKKysrIGIvX3N0YXRpYy91cC1wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9fc3RhdGljL3VwLnBuZyBiL19zdGF0aWMvdXAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NDYyNTYKLS0tIC9kZXYvbnVsbAorKysgYi9fc3RhdGljL3VwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9fc3RhdGljL3dlYnN1cHBvcnQuanMgYi9fc3RhdGljL3dlYnN1cHBvcnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjMGExMwotLS0gL2Rldi9udWxsCisrKyBiL19zdGF0aWMvd2Vic3VwcG9ydC5qcwpAQCAtMCwwICsxLDgwOCBAQAorLyoKKyAqIHdlYnN1cHBvcnQuanMKKyAqIH5+fn5+fn5+fn5+fn4KKyAqCisgKiBzcGhpbngud2Vic3VwcG9ydCB1dGlsdGllcyBmb3IgYWxsIGRvY3VtZW50YXRpb24uCisgKgorICogOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMDctMjAxNCBieSB0aGUgU3BoaW54IHRlYW0sIHNlZSBBVVRIT1JTLgorICogOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCisgKgorICovCisKKyhmdW5jdGlvbigkKSB7CisgICQuZm4uYXV0b2dyb3cgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworICAgIHZhciB0ZXh0YXJlYSA9IHRoaXM7CisKKyAgICAkLmZuLmF1dG9ncm93LnJlc2l6ZSh0ZXh0YXJlYSk7CisKKyAgICAkKHRleHRhcmVhKQorICAgICAgLmZvY3VzKGZ1bmN0aW9uKCkgeworICAgICAgICB0ZXh0YXJlYS5pbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgeworICAgICAgICAgICQuZm4uYXV0b2dyb3cucmVzaXplKHRleHRhcmVhKTsKKyAgICAgICAgfSwgNTAwKTsKKyAgICAgIH0pCisgICAgICAuYmx1cihmdW5jdGlvbigpIHsKKyAgICAgICAgY2xlYXJJbnRlcnZhbCh0ZXh0YXJlYS5pbnRlcnZhbCk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfTsKKworICAkLmZuLmF1dG9ncm93LnJlc2l6ZSA9IGZ1bmN0aW9uKHRleHRhcmVhKSB7CisgICAgdmFyIGxpbmVIZWlnaHQgPSBwYXJzZUludCgkKHRleHRhcmVhKS5jc3MoJ2xpbmUtaGVpZ2h0JyksIDEwKTsKKyAgICB2YXIgbGluZXMgPSB0ZXh0YXJlYS52YWx1ZS5zcGxpdCgnXG4nKTsKKyAgICB2YXIgY29sdW1ucyA9IHRleHRhcmVhLmNvbHM7CisgICAgdmFyIGxpbmVDb3VudCA9IDA7CisgICAgJC5lYWNoKGxpbmVzLCBmdW5jdGlvbigpIHsKKyAgICAgIGxpbmVDb3VudCArPSBNYXRoLmNlaWwodGhpcy5sZW5ndGggLyBjb2x1bW5zKSB8fCAxOworICAgIH0pOworICAgIHZhciBoZWlnaHQgPSBsaW5lSGVpZ2h0ICogKGxpbmVDb3VudCArIDEpOworICAgICQodGV4dGFyZWEpLmNzcygnaGVpZ2h0JywgaGVpZ2h0KTsKKyAgfTsKK30pKGpRdWVyeSk7CisKKyhmdW5jdGlvbigkKSB7CisgIHZhciBjb21wLCBieTsKKworICBmdW5jdGlvbiBpbml0KCkgeworICAgIGluaXRFdmVudHMoKTsKKyAgICBpbml0Q29tcGFyYXRvcigpOworICB9CisKKyAgZnVuY3Rpb24gaW5pdEV2ZW50cygpIHsKKyAgICAkKCdhLmNvbW1lbnQtY2xvc2UnKS5saXZlKCJjbGljayIsIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgaGlkZSgkKHRoaXMpLmF0dHIoJ2lkJykuc3Vic3RyaW5nKDIpKTsKKyAgICB9KTsKKyAgICAkKCdhLnZvdGUnKS5saXZlKCJjbGljayIsIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgaGFuZGxlVm90ZSgkKHRoaXMpKTsKKyAgICB9KTsKKyAgICAkKCdhLnJlcGx5JykubGl2ZSgiY2xpY2siLCBmdW5jdGlvbihldmVudCkgeworICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgIG9wZW5SZXBseSgkKHRoaXMpLmF0dHIoJ2lkJykuc3Vic3RyaW5nKDIpKTsKKyAgICB9KTsKKyAgICAkKCdhLmNsb3NlLXJlcGx5JykubGl2ZSgiY2xpY2siLCBmdW5jdGlvbihldmVudCkgeworICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgIGNsb3NlUmVwbHkoJCh0aGlzKS5hdHRyKCdpZCcpLnN1YnN0cmluZygyKSk7CisgICAgfSk7CisgICAgJCgnYS5zb3J0LW9wdGlvbicpLmxpdmUoImNsaWNrIiwgZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICBoYW5kbGVSZVNvcnQoJCh0aGlzKSk7CisgICAgfSk7CisgICAgJCgnYS5zaG93LXByb3Bvc2FsJykubGl2ZSgiY2xpY2siLCBmdW5jdGlvbihldmVudCkgeworICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgIHNob3dQcm9wb3NhbCgkKHRoaXMpLmF0dHIoJ2lkJykuc3Vic3RyaW5nKDIpKTsKKyAgICB9KTsKKyAgICAkKCdhLmhpZGUtcHJvcG9zYWwnKS5saXZlKCJjbGljayIsIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgaGlkZVByb3Bvc2FsKCQodGhpcykuYXR0cignaWQnKS5zdWJzdHJpbmcoMikpOworICAgIH0pOworICAgICQoJ2Euc2hvdy1wcm9wb3NlLWNoYW5nZScpLmxpdmUoImNsaWNrIiwgZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICBzaG93UHJvcG9zZUNoYW5nZSgkKHRoaXMpLmF0dHIoJ2lkJykuc3Vic3RyaW5nKDIpKTsKKyAgICB9KTsKKyAgICAkKCdhLmhpZGUtcHJvcG9zZS1jaGFuZ2UnKS5saXZlKCJjbGljayIsIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgaGlkZVByb3Bvc2VDaGFuZ2UoJCh0aGlzKS5hdHRyKCdpZCcpLnN1YnN0cmluZygyKSk7CisgICAgfSk7CisgICAgJCgnYS5hY2NlcHQtY29tbWVudCcpLmxpdmUoImNsaWNrIiwgZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICBhY2NlcHRDb21tZW50KCQodGhpcykuYXR0cignaWQnKS5zdWJzdHJpbmcoMikpOworICAgIH0pOworICAgICQoJ2EuZGVsZXRlLWNvbW1lbnQnKS5saXZlKCJjbGljayIsIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgZGVsZXRlQ29tbWVudCgkKHRoaXMpLmF0dHIoJ2lkJykuc3Vic3RyaW5nKDIpKTsKKyAgICB9KTsKKyAgICAkKCdhLmNvbW1lbnQtbWFya3VwJykubGl2ZSgiY2xpY2siLCBmdW5jdGlvbihldmVudCkgeworICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgIHRvZ2dsZUNvbW1lbnRNYXJrdXBCb3goJCh0aGlzKS5hdHRyKCdpZCcpLnN1YnN0cmluZygyKSk7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICogU2V0IGNvbXAsIHdoaWNoIGlzIGEgY29tcGFyYXRvciBmdW5jdGlvbiB1c2VkIGZvciBzb3J0aW5nIGFuZAorICAgKiBpbnNlcnRpbmcgY29tbWVudHMgaW50byB0aGUgbGlzdC4KKyAgICovCisgIGZ1bmN0aW9uIHNldENvbXBhcmF0b3IoKSB7CisgICAgLy8gSWYgdGhlIGZpcnN0IHRocmVlIGxldHRlcnMgYXJlICJhc2MiLCBzb3J0IGluIGFzY2VuZGluZyBvcmRlcgorICAgIC8vIGFuZCByZW1vdmUgdGhlIHByZWZpeC4KKyAgICBpZiAoYnkuc3Vic3RyaW5nKDAsMykgPT0gJ2FzYycpIHsKKyAgICAgIHZhciBpID0gYnkuc3Vic3RyaW5nKDMpOworICAgICAgY29tcCA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGFbaV0gLSBiW2ldOyB9OworICAgIH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2Ugc29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyLgorICAgICAgY29tcCA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGJbYnldIC0gYVtieV07IH07CisgICAgfQorCisgICAgLy8gUmVzZXQgbGluayBzdHlsZXMgYW5kIGZvcm1hdCB0aGUgc2VsZWN0ZWQgc29ydCBvcHRpb24uCisgICAgJCgnYS5zZWwnKS5hdHRyKCdocmVmJywgJyMnKS5yZW1vdmVDbGFzcygnc2VsJyk7CisgICAgJCgnYS5ieScgKyBieSkucmVtb3ZlQXR0cignaHJlZicpLmFkZENsYXNzKCdzZWwnKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBjb21wIGZ1bmN0aW9uLiBJZiB0aGUgdXNlciBoYXMgcHJlZmVyZW5jZXMgc3RvcmVkIGluCisgICAqIHRoZSBzb3J0QnkgY29va2llLCB1c2UgdGhvc2UsIG90aGVyd2lzZSB1c2UgdGhlIGRlZmF1bHQuCisgICAqLworICBmdW5jdGlvbiBpbml0Q29tcGFyYXRvcigpIHsKKyAgICBieSA9ICdyYXRpbmcnOyAvLyBEZWZhdWx0IHRvIHNvcnQgYnkgcmF0aW5nLgorICAgIC8vIElmIHRoZSBzb3J0QnkgY29va2llIGlzIHNldCwgdXNlIHRoYXQgaW5zdGVhZC4KKyAgICBpZiAoZG9jdW1lbnQuY29va2llLmxlbmd0aCA+IDApIHsKKyAgICAgIHZhciBzdGFydCA9IGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCdzb3J0Qnk9Jyk7CisgICAgICBpZiAoc3RhcnQgIT0gLTEpIHsKKyAgICAgICAgc3RhcnQgPSBzdGFydCArIDc7CisgICAgICAgIHZhciBlbmQgPSBkb2N1bWVudC5jb29raWUuaW5kZXhPZigiOyIsIHN0YXJ0KTsKKyAgICAgICAgaWYgKGVuZCA9PSAtMSkgeworICAgICAgICAgIGVuZCA9IGRvY3VtZW50LmNvb2tpZS5sZW5ndGg7CisgICAgICAgICAgYnkgPSB1bmVzY2FwZShkb2N1bWVudC5jb29raWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBzZXRDb21wYXJhdG9yKCk7CisgIH0KKworICAvKioKKyAgICogU2hvdyBhIGNvbW1lbnQgZGl2LgorICAgKi8KKyAgZnVuY3Rpb24gc2hvdyhpZCkgeworICAgICQoJyNhbycgKyBpZCkuaGlkZSgpOworICAgICQoJyNhaCcgKyBpZCkuc2hvdygpOworICAgIHZhciBjb250ZXh0ID0gJC5leHRlbmQoe2lkOiBpZH0sIG9wdHMpOworICAgIHZhciBwb3B1cCA9ICQocmVuZGVyVGVtcGxhdGUocG9wdXBUZW1wbGF0ZSwgY29udGV4dCkpLmhpZGUoKTsKKyAgICBwb3B1cC5maW5kKCd0ZXh0YXJlYVtuYW1lPSJwcm9wb3NhbCJdJykuaGlkZSgpOworICAgIHBvcHVwLmZpbmQoJ2EuYnknICsgYnkpLmFkZENsYXNzKCdzZWwnKTsKKyAgICB2YXIgZm9ybSA9IHBvcHVwLmZpbmQoJyNjZicgKyBpZCk7CisgICAgZm9ybS5zdWJtaXQoZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICBhZGRDb21tZW50KGZvcm0pOworICAgIH0pOworICAgICQoJyNzJyArIGlkKS5hZnRlcihwb3B1cCk7CisgICAgcG9wdXAuc2xpZGVEb3duKCdmYXN0JywgZnVuY3Rpb24oKSB7CisgICAgICBnZXRDb21tZW50cyhpZCk7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICogSGlkZSBhIGNvbW1lbnQgZGl2LgorICAgKi8KKyAgZnVuY3Rpb24gaGlkZShpZCkgeworICAgICQoJyNhaCcgKyBpZCkuaGlkZSgpOworICAgICQoJyNhbycgKyBpZCkuc2hvdygpOworICAgIHZhciBkaXYgPSAkKCcjc2MnICsgaWQpOworICAgIGRpdi5zbGlkZVVwKCdmYXN0JywgZnVuY3Rpb24oKSB7CisgICAgICBkaXYucmVtb3ZlKCk7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybSBhbiBhamF4IHJlcXVlc3QgdG8gZ2V0IGNvbW1lbnRzIGZvciBhIG5vZGUKKyAgICogYW5kIGluc2VydCB0aGUgY29tbWVudHMgaW50byB0aGUgY29tbWVudHMgdHJlZS4KKyAgICovCisgIGZ1bmN0aW9uIGdldENvbW1lbnRzKGlkKSB7CisgICAgJC5hamF4KHsKKyAgICAgdHlwZTogJ0dFVCcsCisgICAgIHVybDogb3B0cy5nZXRDb21tZW50c1VSTCwKKyAgICAgZGF0YToge25vZGU6IGlkfSwKKyAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywgcmVxdWVzdCkgeworICAgICAgIHZhciB1bCA9ICQoJyNjbCcgKyBpZCk7CisgICAgICAgdmFyIHNwZWVkID0gMTAwOworICAgICAgICQoJyNjZicgKyBpZCkKKyAgICAgICAgIC5maW5kKCd0ZXh0YXJlYVtuYW1lPSJwcm9wb3NhbCJdJykKKyAgICAgICAgIC5kYXRhKCdzb3VyY2UnLCBkYXRhLnNvdXJjZSk7CisKKyAgICAgICBpZiAoZGF0YS5jb21tZW50cy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgIHVsLmh0bWwoJzxsaT5ObyBjb21tZW50cyB5ZXQuPC9saT4nKTsKKyAgICAgICAgIHVsLmRhdGEoJ2VtcHR5JywgdHJ1ZSk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBjb21tZW50cywgc29ydCB0aGVtIGFuZCBwdXQgdGhlbSBpbiB0aGUgbGlzdC4KKyAgICAgICAgIHZhciBjb21tZW50cyA9IHNvcnRDb21tZW50cyhkYXRhLmNvbW1lbnRzKTsKKyAgICAgICAgIHNwZWVkID0gZGF0YS5jb21tZW50cy5sZW5ndGggKiAxMDA7CisgICAgICAgICBhcHBlbmRDb21tZW50cyhjb21tZW50cywgdWwpOworICAgICAgICAgdWwuZGF0YSgnZW1wdHknLCBmYWxzZSk7CisgICAgICAgfQorICAgICAgICQoJyNjbicgKyBpZCkuc2xpZGVVcChzcGVlZCArIDIwMCk7CisgICAgICAgdWwuc2xpZGVEb3duKHNwZWVkKTsKKyAgICAgfSwKKyAgICAgZXJyb3I6IGZ1bmN0aW9uKHJlcXVlc3QsIHRleHRTdGF0dXMsIGVycm9yKSB7CisgICAgICAgc2hvd0Vycm9yKCdPb3BzLCB0aGVyZSB3YXMgYSBwcm9ibGVtIHJldHJpZXZpbmcgdGhlIGNvbW1lbnRzLicpOworICAgICB9LAorICAgICBkYXRhVHlwZTogJ2pzb24nCisgICAgfSk7CisgIH0KKworICAvKioKKyAgICogQWRkIGEgY29tbWVudCB2aWEgYWpheCBhbmQgaW5zZXJ0IHRoZSBjb21tZW50IGludG8gdGhlIGNvbW1lbnQgdHJlZS4KKyAgICovCisgIGZ1bmN0aW9uIGFkZENvbW1lbnQoZm9ybSkgeworICAgIHZhciBub2RlX2lkID0gZm9ybS5maW5kKCdpbnB1dFtuYW1lPSJub2RlIl0nKS52YWwoKTsKKyAgICB2YXIgcGFyZW50X2lkID0gZm9ybS5maW5kKCdpbnB1dFtuYW1lPSJwYXJlbnQiXScpLnZhbCgpOworICAgIHZhciB0ZXh0ID0gZm9ybS5maW5kKCd0ZXh0YXJlYVtuYW1lPSJjb21tZW50Il0nKS52YWwoKTsKKyAgICB2YXIgcHJvcG9zYWwgPSBmb3JtLmZpbmQoJ3RleHRhcmVhW25hbWU9InByb3Bvc2FsIl0nKS52YWwoKTsKKworICAgIGlmICh0ZXh0ID09ICcnKSB7CisgICAgICBzaG93RXJyb3IoJ1BsZWFzZSBlbnRlciBhIGNvbW1lbnQuJyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRGlzYWJsZSB0aGUgZm9ybSB0aGF0IGlzIGJlaW5nIHN1Ym1pdHRlZC4KKyAgICBmb3JtLmZpbmQoJ3RleHRhcmVhLGlucHV0JykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTsKKworICAgIC8vIFNlbmQgdGhlIGNvbW1lbnQgdG8gdGhlIHNlcnZlci4KKyAgICAkLmFqYXgoeworICAgICAgdHlwZTogIlBPU1QiLAorICAgICAgdXJsOiBvcHRzLmFkZENvbW1lbnRVUkwsCisgICAgICBkYXRhVHlwZTogJ2pzb24nLAorICAgICAgZGF0YTogeworICAgICAgICBub2RlOiBub2RlX2lkLAorICAgICAgICBwYXJlbnQ6IHBhcmVudF9pZCwKKyAgICAgICAgdGV4dDogdGV4dCwKKyAgICAgICAgcHJvcG9zYWw6IHByb3Bvc2FsCisgICAgICB9LAorICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywgZXJyb3IpIHsKKyAgICAgICAgLy8gUmVzZXQgdGhlIGZvcm0uCisgICAgICAgIGlmIChub2RlX2lkKSB7CisgICAgICAgICAgaGlkZVByb3Bvc2VDaGFuZ2Uobm9kZV9pZCk7CisgICAgICAgIH0KKyAgICAgICAgZm9ybS5maW5kKCd0ZXh0YXJlYScpCisgICAgICAgICAgLnZhbCgnJykKKyAgICAgICAgICAuYWRkKGZvcm0uZmluZCgnaW5wdXQnKSkKKyAgICAgICAgICAucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKKwl2YXIgdWwgPSAkKCcjY2wnICsgKG5vZGVfaWQgfHwgcGFyZW50X2lkKSk7CisgICAgICAgIGlmICh1bC5kYXRhKCdlbXB0eScpKSB7CisgICAgICAgICAgJCh1bCkuZW1wdHkoKTsKKyAgICAgICAgICB1bC5kYXRhKCdlbXB0eScsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpbnNlcnRDb21tZW50KGRhdGEuY29tbWVudCk7CisgICAgICAgIHZhciBhbyA9ICQoJyNhbycgKyBub2RlX2lkKTsKKyAgICAgICAgYW8uZmluZCgnaW1nJykuYXR0cih7J3NyYyc6IG9wdHMuY29tbWVudEJyaWdodEltYWdlfSk7CisgICAgICAgIGlmIChub2RlX2lkKSB7CisgICAgICAgICAgLy8gaWYgdGhpcyB3YXMgYSAicm9vdCIgY29tbWVudCwgcmVtb3ZlIHRoZSBjb21tZW50aW5nIGJveAorICAgICAgICAgIC8vICh0aGUgdXNlciBjYW4gZ2V0IGl0IGJhY2sgYnkgcmVvcGVuaW5nIHRoZSBjb21tZW50IHBvcHVwKQorICAgICAgICAgICQoJyNjYScgKyBub2RlX2lkKS5zbGlkZVVwKCk7CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBlcnJvcjogZnVuY3Rpb24ocmVxdWVzdCwgdGV4dFN0YXR1cywgZXJyb3IpIHsKKyAgICAgICAgZm9ybS5maW5kKCd0ZXh0YXJlYSxpbnB1dCcpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CisgICAgICAgIHNob3dFcnJvcignT29wcywgdGhlcmUgd2FzIGEgcHJvYmxlbSBhZGRpbmcgdGhlIGNvbW1lbnQuJyk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICogUmVjdXJzaXZlbHkgYXBwZW5kIGNvbW1lbnRzIHRvIHRoZSBtYWluIGNvbW1lbnQgbGlzdCBhbmQgY2hpbGRyZW4KKyAgICogbGlzdHMsIGNyZWF0aW5nIHRoZSBjb21tZW50IHRyZWUuCisgICAqLworICBmdW5jdGlvbiBhcHBlbmRDb21tZW50cyhjb21tZW50cywgdWwpIHsKKyAgICAkLmVhY2goY29tbWVudHMsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGRpdiA9IGNyZWF0ZUNvbW1lbnREaXYodGhpcyk7CisgICAgICB1bC5hcHBlbmQoJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpKS5odG1sKGRpdikpOworICAgICAgYXBwZW5kQ29tbWVudHModGhpcy5jaGlsZHJlbiwgZGl2LmZpbmQoJ3VsLmNvbW1lbnQtY2hpbGRyZW4nKSk7CisgICAgICAvLyBUbyBhdm9pZCBzdGFnbmF0aW5nIGRhdGEsIGRvbid0IHN0b3JlIHRoZSBjb21tZW50cyBjaGlsZHJlbiBpbiBkYXRhLgorICAgICAgdGhpcy5jaGlsZHJlbiA9IG51bGw7CisgICAgICBkaXYuZGF0YSgnY29tbWVudCcsIHRoaXMpOworICAgIH0pOworICB9CisKKyAgLyoqCisgICAqIEFmdGVyIGFkZGluZyBhIG5ldyBjb21tZW50LCBpdCBtdXN0IGJlIGluc2VydGVkIGluIHRoZSBjb3JyZWN0CisgICAqIGxvY2F0aW9uIGluIHRoZSBjb21tZW50IHRyZWUuCisgICAqLworICBmdW5jdGlvbiBpbnNlcnRDb21tZW50KGNvbW1lbnQpIHsKKyAgICB2YXIgZGl2ID0gY3JlYXRlQ29tbWVudERpdihjb21tZW50KTsKKworICAgIC8vIFRvIGF2b2lkIHN0YWduYXRpbmcgZGF0YSwgZG9uJ3Qgc3RvcmUgdGhlIGNvbW1lbnRzIGNoaWxkcmVuIGluIGRhdGEuCisgICAgY29tbWVudC5jaGlsZHJlbiA9IG51bGw7CisgICAgZGl2LmRhdGEoJ2NvbW1lbnQnLCBjb21tZW50KTsKKworICAgIHZhciB1bCA9ICQoJyNjbCcgKyAoY29tbWVudC5ub2RlIHx8IGNvbW1lbnQucGFyZW50KSk7CisgICAgdmFyIHNpYmxpbmdzID0gZ2V0Q2hpbGRyZW4odWwpOworCisgICAgdmFyIGxpID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpKTsKKyAgICBsaS5oaWRlKCk7CisKKyAgICAvLyBEZXRlcm1pbmUgd2hlcmUgaW4gdGhlIHBhcmVudHMgY2hpbGRyZW4gbGlzdCB0byBpbnNlcnQgdGhpcyBjb21tZW50LgorICAgIGZvcihpPTA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKGNvbXAoY29tbWVudCwgc2libGluZ3NbaV0pIDw9IDApIHsKKyAgICAgICAgJCgnI2NkJyArIHNpYmxpbmdzW2ldLmlkKQorICAgICAgICAgIC5wYXJlbnQoKQorICAgICAgICAgIC5iZWZvcmUobGkuaHRtbChkaXYpKTsKKyAgICAgICAgbGkuc2xpZGVEb3duKCdmYXN0Jyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgdGhpcyBjb21tZW50IHJhdGVzIGxvd2VyIHRoYW4gYWxsIHRoZSBvdGhlcnMsCisgICAgLy8gb3IgaXQgaXMgdGhlIG9ubHkgY29tbWVudCBpbiB0aGUgbGlzdC4KKyAgICB1bC5hcHBlbmQobGkuaHRtbChkaXYpKTsKKyAgICBsaS5zbGlkZURvd24oJ2Zhc3QnKTsKKyAgfQorCisgIGZ1bmN0aW9uIGFjY2VwdENvbW1lbnQoaWQpIHsKKyAgICAkLmFqYXgoeworICAgICAgdHlwZTogJ1BPU1QnLAorICAgICAgdXJsOiBvcHRzLmFjY2VwdENvbW1lbnRVUkwsCisgICAgICBkYXRhOiB7aWQ6IGlkfSwKKyAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEsIHRleHRTdGF0dXMsIHJlcXVlc3QpIHsKKyAgICAgICAgJCgnI2NtJyArIGlkKS5mYWRlT3V0KCdmYXN0Jyk7CisgICAgICAgICQoJyNjZCcgKyBpZCkucmVtb3ZlQ2xhc3MoJ21vZGVyYXRlJyk7CisgICAgICB9LAorICAgICAgZXJyb3I6IGZ1bmN0aW9uKHJlcXVlc3QsIHRleHRTdGF0dXMsIGVycm9yKSB7CisgICAgICAgIHNob3dFcnJvcignT29wcywgdGhlcmUgd2FzIGEgcHJvYmxlbSBhY2NlcHRpbmcgdGhlIGNvbW1lbnQuJyk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBkZWxldGVDb21tZW50KGlkKSB7CisgICAgJC5hamF4KHsKKyAgICAgIHR5cGU6ICdQT1NUJywKKyAgICAgIHVybDogb3B0cy5kZWxldGVDb21tZW50VVJMLAorICAgICAgZGF0YToge2lkOiBpZH0sCisgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhLCB0ZXh0U3RhdHVzLCByZXF1ZXN0KSB7CisgICAgICAgIHZhciBkaXYgPSAkKCcjY2QnICsgaWQpOworICAgICAgICBpZiAoZGF0YSA9PSAnZGVsZXRlJykgeworICAgICAgICAgIC8vIE1vZGVyYXRvciBtb2RlOiByZW1vdmUgdGhlIGNvbW1lbnQgYW5kIGFsbCBjaGlsZHJlbiBpbW1lZGlhdGVseQorICAgICAgICAgIGRpdi5zbGlkZVVwKCdmYXN0JywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBkaXYucmVtb3ZlKCk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFVzZXIgbW9kZTogb25seSBtYXJrIHRoZSBjb21tZW50IGFzIGRlbGV0ZWQKKyAgICAgICAgZGl2CisgICAgICAgICAgLmZpbmQoJ3NwYW4udXNlci1pZDpmaXJzdCcpCisgICAgICAgICAgLnRleHQoJ1tkZWxldGVkXScpLmVuZCgpCisgICAgICAgICAgLmZpbmQoJ2Rpdi5jb21tZW50LXRleHQ6Zmlyc3QnKQorICAgICAgICAgIC50ZXh0KCdbZGVsZXRlZF0nKS5lbmQoKQorICAgICAgICAgIC5maW5kKCcjY20nICsgaWQgKyAnLCAjZGMnICsgaWQgKyAnLCAjYWMnICsgaWQgKyAnLCAjcmMnICsgaWQgKworICAgICAgICAgICAgICAgICcsICNzcCcgKyBpZCArICcsICNocCcgKyBpZCArICcsICNjcicgKyBpZCArICcsICNybCcgKyBpZCkKKyAgICAgICAgICAucmVtb3ZlKCk7CisgICAgICAgIHZhciBjb21tZW50ID0gZGl2LmRhdGEoJ2NvbW1lbnQnKTsKKyAgICAgICAgY29tbWVudC51c2VybmFtZSA9ICdbZGVsZXRlZF0nOworICAgICAgICBjb21tZW50LnRleHQgPSAnW2RlbGV0ZWRdJzsKKyAgICAgICAgZGl2LmRhdGEoJ2NvbW1lbnQnLCBjb21tZW50KTsKKyAgICAgIH0sCisgICAgICBlcnJvcjogZnVuY3Rpb24ocmVxdWVzdCwgdGV4dFN0YXR1cywgZXJyb3IpIHsKKyAgICAgICAgc2hvd0Vycm9yKCdPb3BzLCB0aGVyZSB3YXMgYSBwcm9ibGVtIGRlbGV0aW5nIHRoZSBjb21tZW50LicpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gc2hvd1Byb3Bvc2FsKGlkKSB7CisgICAgJCgnI3NwJyArIGlkKS5oaWRlKCk7CisgICAgJCgnI2hwJyArIGlkKS5zaG93KCk7CisgICAgJCgnI3ByJyArIGlkKS5zbGlkZURvd24oJ2Zhc3QnKTsKKyAgfQorCisgIGZ1bmN0aW9uIGhpZGVQcm9wb3NhbChpZCkgeworICAgICQoJyNocCcgKyBpZCkuaGlkZSgpOworICAgICQoJyNzcCcgKyBpZCkuc2hvdygpOworICAgICQoJyNwcicgKyBpZCkuc2xpZGVVcCgnZmFzdCcpOworICB9CisKKyAgZnVuY3Rpb24gc2hvd1Byb3Bvc2VDaGFuZ2UoaWQpIHsKKyAgICAkKCcjcGMnICsgaWQpLmhpZGUoKTsKKyAgICAkKCcjaGMnICsgaWQpLnNob3coKTsKKyAgICB2YXIgdGV4dGFyZWEgPSAkKCcjcHQnICsgaWQpOworICAgIHRleHRhcmVhLnZhbCh0ZXh0YXJlYS5kYXRhKCdzb3VyY2UnKSk7CisgICAgJC5mbi5hdXRvZ3Jvdy5yZXNpemUodGV4dGFyZWFbMF0pOworICAgIHRleHRhcmVhLnNsaWRlRG93bignZmFzdCcpOworICB9CisKKyAgZnVuY3Rpb24gaGlkZVByb3Bvc2VDaGFuZ2UoaWQpIHsKKyAgICAkKCcjaGMnICsgaWQpLmhpZGUoKTsKKyAgICAkKCcjcGMnICsgaWQpLnNob3coKTsKKyAgICB2YXIgdGV4dGFyZWEgPSAkKCcjcHQnICsgaWQpOworICAgIHRleHRhcmVhLnZhbCgnJykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKKyAgICB0ZXh0YXJlYS5zbGlkZVVwKCdmYXN0Jyk7CisgIH0KKworICBmdW5jdGlvbiB0b2dnbGVDb21tZW50TWFya3VwQm94KGlkKSB7CisgICAgJCgnI21iJyArIGlkKS50b2dnbGUoKTsKKyAgfQorCisgIC8qKiBIYW5kbGUgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSBzb3J0IGJ5IGxpbmsuICovCisgIGZ1bmN0aW9uIGhhbmRsZVJlU29ydChsaW5rKSB7CisgICAgdmFyIGNsYXNzZXMgPSBsaW5rLmF0dHIoJ2NsYXNzJykuc3BsaXQoL1xzKy8pOworICAgIGZvciAodmFyIGk9MDsgaTxjbGFzc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoY2xhc3Nlc1tpXSAhPSAnc29ydC1vcHRpb24nKSB7CisJYnkgPSBjbGFzc2VzW2ldLnN1YnN0cmluZygyKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2V0Q29tcGFyYXRvcigpOworICAgIC8vIFNhdmUvdXBkYXRlIHRoZSBzb3J0QnkgY29va2llLgorICAgIHZhciBleHBpcmF0aW9uID0gbmV3IERhdGUoKTsKKyAgICBleHBpcmF0aW9uLnNldERhdGUoZXhwaXJhdGlvbi5nZXREYXRlKCkgKyAzNjUpOworICAgIGRvY3VtZW50LmNvb2tpZT0gJ3NvcnRCeT0nICsgZXNjYXBlKGJ5KSArCisgICAgICAgICAgICAgICAgICAgICAnO2V4cGlyZXM9JyArIGV4cGlyYXRpb24udG9VVENTdHJpbmcoKTsKKyAgICAkKCd1bC5jb21tZW50LXVsJykuZWFjaChmdW5jdGlvbihpbmRleCwgdWwpIHsKKyAgICAgIHZhciBjb21tZW50cyA9IGdldENoaWxkcmVuKCQodWwpLCB0cnVlKTsKKyAgICAgIGNvbW1lbnRzID0gc29ydENvbW1lbnRzKGNvbW1lbnRzKTsKKyAgICAgIGFwcGVuZENvbW1lbnRzKGNvbW1lbnRzLCAkKHVsKS5lbXB0eSgpKTsKKyAgICB9KTsKKyAgfQorCisgIC8qKgorICAgKiBGdW5jdGlvbiB0byBwcm9jZXNzIGEgdm90ZSB3aGVuIGEgdXNlciBjbGlja3MgYW4gYXJyb3cuCisgICAqLworICBmdW5jdGlvbiBoYW5kbGVWb3RlKGxpbmspIHsKKyAgICBpZiAoIW9wdHMudm90aW5nKSB7CisgICAgICBzaG93RXJyb3IoIllvdSdsbCBuZWVkIHRvIGxvZ2luIHRvIHZvdGUuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGlkID0gbGluay5hdHRyKCdpZCcpOworICAgIGlmICghaWQpIHsKKyAgICAgIC8vIERpZG4ndCBjbGljayBvbiBvbmUgb2YgdGhlIHZvdGluZyBhcnJvd3MuCisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIElmIGl0IGlzIGFuIHVudm90ZSwgdGhlIG5ldyB2b3RlIHZhbHVlIGlzIDAsCisgICAgLy8gT3RoZXJ3aXNlIGl0J3MgMSBmb3IgYW4gdXB2b3RlLCBvciAtMSBmb3IgYSBkb3dudm90ZS4KKyAgICB2YXIgdmFsdWUgPSAwOworICAgIGlmIChpZC5jaGFyQXQoMSkgIT0gJ3UnKSB7CisgICAgICB2YWx1ZSA9IGlkLmNoYXJBdCgwKSA9PSAndScgPyAxIDogLTE7CisgICAgfQorICAgIC8vIFRoZSBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4KKyAgICB2YXIgZCA9IHsKKyAgICAgIGNvbW1lbnRfaWQ6IGlkLnN1YnN0cmluZygyKSwKKyAgICAgIHZhbHVlOiB2YWx1ZQorICAgIH07CisKKyAgICAvLyBTd2FwIHRoZSB2b3RlIGFuZCB1bnZvdGUgbGlua3MuCisgICAgbGluay5oaWRlKCk7CisgICAgJCgnIycgKyBpZC5jaGFyQXQoMCkgKyAoaWQuY2hhckF0KDEpID09ICd1JyA/ICd2JyA6ICd1JykgKyBkLmNvbW1lbnRfaWQpCisgICAgICAuc2hvdygpOworCisgICAgLy8gVGhlIGRpdiB0aGUgY29tbWVudCBpcyBkaXNwbGF5ZWQgaW4uCisgICAgdmFyIGRpdiA9ICQoJ2RpdiNjZCcgKyBkLmNvbW1lbnRfaWQpOworICAgIHZhciBkYXRhID0gZGl2LmRhdGEoJ2NvbW1lbnQnKTsKKworICAgIC8vIElmIHRoaXMgaXMgbm90IGFuIHVudm90ZSwgYW5kIHRoZSBvdGhlciB2b3RlIGFycm93IGhhcworICAgIC8vIGFscmVhZHkgYmVlbiBwcmVzc2VkLCB1bnByZXNzIGl0LgorICAgIGlmICgoZC52YWx1ZSAhPT0gMCkgJiYgKGRhdGEudm90ZSA9PT0gZC52YWx1ZSAqIC0xKSkgeworICAgICAgJCgnIycgKyAoZC52YWx1ZSA9PSAxID8gJ2QnIDogJ3UnKSArICd1JyArIGQuY29tbWVudF9pZCkuaGlkZSgpOworICAgICAgJCgnIycgKyAoZC52YWx1ZSA9PSAxID8gJ2QnIDogJ3UnKSArICd2JyArIGQuY29tbWVudF9pZCkuc2hvdygpOworICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgY29tbWVudHMgcmF0aW5nIGluIHRoZSBsb2NhbCBkYXRhLgorICAgIGRhdGEucmF0aW5nICs9IChkYXRhLnZvdGUgPT09IDApID8gZC52YWx1ZSA6IChkLnZhbHVlIC0gZGF0YS52b3RlKTsKKyAgICBkYXRhLnZvdGUgPSBkLnZhbHVlOworICAgIGRpdi5kYXRhKCdjb21tZW50JywgZGF0YSk7CisKKyAgICAvLyBDaGFuZ2UgdGhlIHJhdGluZyB0ZXh0LgorICAgIGRpdi5maW5kKCcucmF0aW5nOmZpcnN0JykKKyAgICAgIC50ZXh0KGRhdGEucmF0aW5nICsgJyBwb2ludCcgKyAoZGF0YS5yYXRpbmcgPT0gMSA/ICcnIDogJ3MnKSk7CisKKyAgICAvLyBTZW5kIHRoZSB2b3RlIGluZm9ybWF0aW9uIHRvIHRoZSBzZXJ2ZXIuCisgICAgJC5hamF4KHsKKyAgICAgIHR5cGU6ICJQT1NUIiwKKyAgICAgIHVybDogb3B0cy5wcm9jZXNzVm90ZVVSTCwKKyAgICAgIGRhdGE6IGQsCisgICAgICBlcnJvcjogZnVuY3Rpb24ocmVxdWVzdCwgdGV4dFN0YXR1cywgZXJyb3IpIHsKKyAgICAgICAgc2hvd0Vycm9yKCdPb3BzLCB0aGVyZSB3YXMgYSBwcm9ibGVtIGNhc3RpbmcgdGhhdCB2b3RlLicpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgLyoqCisgICAqIE9wZW4gYSByZXBseSBmb3JtIHVzZWQgdG8gcmVwbHkgdG8gYW4gZXhpc3RpbmcgY29tbWVudC4KKyAgICovCisgIGZ1bmN0aW9uIG9wZW5SZXBseShpZCkgeworICAgIC8vIFN3YXAgb3V0IHRoZSByZXBseSBsaW5rIGZvciB0aGUgaGlkZSBsaW5rCisgICAgJCgnI3JsJyArIGlkKS5oaWRlKCk7CisgICAgJCgnI2NyJyArIGlkKS5zaG93KCk7CisKKyAgICAvLyBBZGQgdGhlIHJlcGx5IGxpIHRvIHRoZSBjaGlsZHJlbiB1bC4KKyAgICB2YXIgZGl2ID0gJChyZW5kZXJUZW1wbGF0ZShyZXBseVRlbXBsYXRlLCB7aWQ6IGlkfSkpLmhpZGUoKTsKKyAgICAkKCcjY2wnICsgaWQpCisgICAgICAucHJlcGVuZChkaXYpCisgICAgICAvLyBTZXR1cCB0aGUgc3VibWl0IGhhbmRsZXIgZm9yIHRoZSByZXBseSBmb3JtLgorICAgICAgLmZpbmQoJyNyZicgKyBpZCkKKyAgICAgIC5zdWJtaXQoZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgYWRkQ29tbWVudCgkKCcjcmYnICsgaWQpKTsKKyAgICAgICAgY2xvc2VSZXBseShpZCk7CisgICAgICB9KQorICAgICAgLmZpbmQoJ2lucHV0W3R5cGU9YnV0dG9uXScpCisgICAgICAuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgIGNsb3NlUmVwbHkoaWQpOworICAgICAgfSk7CisgICAgZGl2LnNsaWRlRG93bignZmFzdCcsIGZ1bmN0aW9uKCkgeworICAgICAgJCgnI3JmJyArIGlkKS5maW5kKCd0ZXh0YXJlYScpLmZvY3VzKCk7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICogQ2xvc2UgdGhlIHJlcGx5IGZvcm0gb3BlbmVkIHdpdGggb3BlblJlcGx5LgorICAgKi8KKyAgZnVuY3Rpb24gY2xvc2VSZXBseShpZCkgeworICAgIC8vIFJlbW92ZSB0aGUgcmVwbHkgZGl2IGZyb20gdGhlIERPTS4KKyAgICAkKCcjcmQnICsgaWQpLnNsaWRlVXAoJ2Zhc3QnLCBmdW5jdGlvbigpIHsKKyAgICAgICQodGhpcykucmVtb3ZlKCk7CisgICAgfSk7CisKKyAgICAvLyBTd2FwIG91dCB0aGUgaGlkZSBsaW5rIGZvciB0aGUgcmVwbHkgbGluaworICAgICQoJyNjcicgKyBpZCkuaGlkZSgpOworICAgICQoJyNybCcgKyBpZCkuc2hvdygpOworICB9CisKKyAgLyoqCisgICAqIFJlY3Vyc2l2ZWx5IHNvcnQgYSB0cmVlIG9mIGNvbW1lbnRzIHVzaW5nIHRoZSBjb21wIGNvbXBhcmF0b3IuCisgICAqLworICBmdW5jdGlvbiBzb3J0Q29tbWVudHMoY29tbWVudHMpIHsKKyAgICBjb21tZW50cy5zb3J0KGNvbXApOworICAgICQuZWFjaChjb21tZW50cywgZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLmNoaWxkcmVuID0gc29ydENvbW1lbnRzKHRoaXMuY2hpbGRyZW4pOworICAgIH0pOworICAgIHJldHVybiBjb21tZW50czsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGNoaWxkcmVuIGNvbW1lbnRzIGZyb20gYSB1bC4gSWYgcmVjdXJzaXZlIGlzIHRydWUsCisgICAqIHJlY3Vyc2l2ZWx5IGluY2x1ZGUgY2hpbGRyZW5zJyBjaGlsZHJlbi4KKyAgICovCisgIGZ1bmN0aW9uIGdldENoaWxkcmVuKHVsLCByZWN1cnNpdmUpIHsKKyAgICB2YXIgY2hpbGRyZW4gPSBbXTsKKyAgICB1bC5jaGlsZHJlbigpLmNoaWxkcmVuKCJbaWRePSdjZCddIikKKyAgICAgIC5lYWNoKGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgY29tbWVudCA9ICQodGhpcykuZGF0YSgnY29tbWVudCcpOworICAgICAgICBpZiAocmVjdXJzaXZlKQorICAgICAgICAgIGNvbW1lbnQuY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigkKHRoaXMpLmZpbmQoJyNjbCcgKyBjb21tZW50LmlkKSwgdHJ1ZSk7CisgICAgICAgIGNoaWxkcmVuLnB1c2goY29tbWVudCk7CisgICAgICB9KTsKKyAgICByZXR1cm4gY2hpbGRyZW47CisgIH0KKworICAvKiogQ3JlYXRlIGEgZGl2IHRvIGRpc3BsYXkgYSBjb21tZW50IGluLiAqLworICBmdW5jdGlvbiBjcmVhdGVDb21tZW50RGl2KGNvbW1lbnQpIHsKKyAgICBpZiAoIWNvbW1lbnQuZGlzcGxheWVkICYmICFvcHRzLm1vZGVyYXRvcikgeworICAgICAgcmV0dXJuICQoJzxkaXYgY2xhc3M9Im1vZGVyYXRlIj5UaGFuayB5b3UhICBZb3VyIGNvbW1lbnQgd2lsbCBzaG93IHVwICcKKyAgICAgICAgICAgICAgICsgJ29uY2UgaXQgaXMgaGFzIGJlZW4gYXBwcm92ZWQgYnkgYSBtb2RlcmF0b3IuPC9kaXY+Jyk7CisgICAgfQorICAgIC8vIFByZXR0aWZ5IHRoZSBjb21tZW50IHJhdGluZy4KKyAgICBjb21tZW50LnByZXR0eV9yYXRpbmcgPSBjb21tZW50LnJhdGluZyArICcgcG9pbnQnICsKKyAgICAgIChjb21tZW50LnJhdGluZyA9PSAxID8gJycgOiAncycpOworICAgIC8vIE1ha2UgYSBjbGFzcyAoZm9yIGRpc3BsYXlpbmcgbm90IHlldCBtb2RlcmF0ZWQgY29tbWVudHMgZGlmZmVyZW50bHkpCisgICAgY29tbWVudC5jc3NfY2xhc3MgPSBjb21tZW50LmRpc3BsYXllZCA/ICcnIDogJyBtb2RlcmF0ZSc7CisgICAgLy8gQ3JlYXRlIGEgZGl2IGZvciB0aGlzIGNvbW1lbnQuCisgICAgdmFyIGNvbnRleHQgPSAkLmV4dGVuZCh7fSwgb3B0cywgY29tbWVudCk7CisgICAgdmFyIGRpdiA9ICQocmVuZGVyVGVtcGxhdGUoY29tbWVudFRlbXBsYXRlLCBjb250ZXh0KSk7CisKKyAgICAvLyBJZiB0aGUgdXNlciBoYXMgdm90ZWQgb24gdGhpcyBjb21tZW50LCBoaWdobGlnaHQgdGhlIGNvcnJlY3QgYXJyb3cuCisgICAgaWYgKGNvbW1lbnQudm90ZSkgeworICAgICAgdmFyIGRpcmVjdGlvbiA9IChjb21tZW50LnZvdGUgPT0gMSkgPyAndScgOiAnZCc7CisgICAgICBkaXYuZmluZCgnIycgKyBkaXJlY3Rpb24gKyAndicgKyBjb21tZW50LmlkKS5oaWRlKCk7CisgICAgICBkaXYuZmluZCgnIycgKyBkaXJlY3Rpb24gKyAndScgKyBjb21tZW50LmlkKS5zaG93KCk7CisgICAgfQorCisgICAgaWYgKG9wdHMubW9kZXJhdG9yIHx8IGNvbW1lbnQudGV4dCAhPSAnW2RlbGV0ZWRdJykgeworICAgICAgZGl2LmZpbmQoJ2EucmVwbHknKS5zaG93KCk7CisgICAgICBpZiAoY29tbWVudC5wcm9wb3NhbF9kaWZmKQorICAgICAgICBkaXYuZmluZCgnI3NwJyArIGNvbW1lbnQuaWQpLnNob3coKTsKKyAgICAgIGlmIChvcHRzLm1vZGVyYXRvciAmJiAhY29tbWVudC5kaXNwbGF5ZWQpCisgICAgICAgIGRpdi5maW5kKCcjY20nICsgY29tbWVudC5pZCkuc2hvdygpOworICAgICAgaWYgKG9wdHMubW9kZXJhdG9yIHx8IChvcHRzLnVzZXJuYW1lID09IGNvbW1lbnQudXNlcm5hbWUpKQorICAgICAgICBkaXYuZmluZCgnI2RjJyArIGNvbW1lbnQuaWQpLnNob3coKTsKKyAgICB9CisgICAgcmV0dXJuIGRpdjsKKyAgfQorCisgIC8qKgorICAgKiBBIHNpbXBsZSB0ZW1wbGF0ZSByZW5kZXJlci4gUGxhY2Vob2xkZXJzIHN1Y2ggYXMgPCVpZCU+IGFyZSByZXBsYWNlZAorICAgKiBieSBjb250ZXh0WydpZCddIHdpdGggaXRlbXMgYmVpbmcgZXNjYXBlZC4gUGxhY2Vob2xkZXJzIHN1Y2ggYXMgPCNpZCM+CisgICAqIGFyZSBub3QgZXNjYXBlZC4KKyAgICovCisgIGZ1bmN0aW9uIHJlbmRlclRlbXBsYXRlKHRlbXBsYXRlLCBjb250ZXh0KSB7CisgICAgdmFyIGVzYyA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOworCisgICAgZnVuY3Rpb24gaGFuZGxlKHBoLCBlc2NhcGUpIHsKKyAgICAgIHZhciBjdXIgPSBjb250ZXh0OworICAgICAgJC5lYWNoKHBoLnNwbGl0KCcuJyksIGZ1bmN0aW9uKCkgeworICAgICAgICBjdXIgPSBjdXJbdGhpc107CisgICAgICB9KTsKKyAgICAgIHJldHVybiBlc2NhcGUgPyBlc2MudGV4dChjdXIgfHwgIiIpLmh0bWwoKSA6IGN1cjsKKyAgICB9CisKKyAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvPChbJSNdKShbXHdcLl0qKVwxPi9nLCBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBoYW5kbGUoYXJndW1lbnRzWzJdLCBhcmd1bWVudHNbMV0gPT0gJyUnID8gdHJ1ZSA6IGZhbHNlKTsKKyAgICB9KTsKKyAgfQorCisgIC8qKiBGbGFzaCBhbiBlcnJvciBtZXNzYWdlIGJyaWVmbHkuICovCisgIGZ1bmN0aW9uIHNob3dFcnJvcihtZXNzYWdlKSB7CisgICAgJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuYXR0cih7J2NsYXNzJzogJ3BvcHVwLWVycm9yJ30pCisgICAgICAuYXBwZW5kKCQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpCisgICAgICAgICAgICAgICAuYXR0cih7J2NsYXNzJzogJ2Vycm9yLW1lc3NhZ2UnfSkudGV4dChtZXNzYWdlKSkKKyAgICAgIC5hcHBlbmRUbygnYm9keScpCisgICAgICAuZmFkZUluKCJzbG93IikKKyAgICAgIC5kZWxheSgyMDAwKQorICAgICAgLmZhZGVPdXQoInNsb3ciKTsKKyAgfQorCisgIC8qKiBBZGQgYSBsaW5rIHRoZSB1c2VyIHVzZXMgdG8gb3BlbiB0aGUgY29tbWVudHMgcG9wdXAuICovCisgICQuZm4uY29tbWVudCA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICB2YXIgaWQgPSAkKHRoaXMpLmF0dHIoJ2lkJykuc3Vic3RyaW5nKDEpOworICAgICAgdmFyIGNvdW50ID0gQ09NTUVOVF9NRVRBREFUQVtpZF07CisgICAgICB2YXIgdGl0bGUgPSBjb3VudCArICcgY29tbWVudCcgKyAoY291bnQgPT0gMSA/ICcnIDogJ3MnKTsKKyAgICAgIHZhciBpbWFnZSA9IGNvdW50ID4gMCA/IG9wdHMuY29tbWVudEJyaWdodEltYWdlIDogb3B0cy5jb21tZW50SW1hZ2U7CisgICAgICB2YXIgYWRkY2xzID0gY291bnQgPT0gMCA/ICcgbm9jb21tZW50JyA6ICcnOworICAgICAgJCh0aGlzKQorICAgICAgICAuYXBwZW5kKAorICAgICAgICAgICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpKS5hdHRyKHsKKyAgICAgICAgICAgIGhyZWY6ICcjJywKKyAgICAgICAgICAgICdjbGFzcyc6ICdzcGhpbngtY29tbWVudC1vcGVuJyArIGFkZGNscywKKyAgICAgICAgICAgIGlkOiAnYW8nICsgaWQKKyAgICAgICAgICB9KQorICAgICAgICAgICAgLmFwcGVuZCgkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpKS5hdHRyKHsKKyAgICAgICAgICAgICAgc3JjOiBpbWFnZSwKKyAgICAgICAgICAgICAgYWx0OiAnY29tbWVudCcsCisgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZQorICAgICAgICAgICAgfSkpCisgICAgICAgICAgICAuY2xpY2soZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgICAgICAgc2hvdygkKHRoaXMpLmF0dHIoJ2lkJykuc3Vic3RyaW5nKDIpKTsKKyAgICAgICAgICAgIH0pCisgICAgICAgICkKKyAgICAgICAgLmFwcGVuZCgKKyAgICAgICAgICAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKSkuYXR0cih7CisgICAgICAgICAgICBocmVmOiAnIycsCisgICAgICAgICAgICAnY2xhc3MnOiAnc3BoaW54LWNvbW1lbnQtY2xvc2UgaGlkZGVuJywKKyAgICAgICAgICAgIGlkOiAnYWgnICsgaWQKKyAgICAgICAgICB9KQorICAgICAgICAgICAgLmFwcGVuZCgkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpKS5hdHRyKHsKKyAgICAgICAgICAgICAgc3JjOiBvcHRzLmNsb3NlQ29tbWVudEltYWdlLAorICAgICAgICAgICAgICBhbHQ6ICdjbG9zZScsCisgICAgICAgICAgICAgIHRpdGxlOiAnY2xvc2UnCisgICAgICAgICAgICB9KSkKKyAgICAgICAgICAgIC5jbGljayhmdW5jdGlvbihldmVudCkgeworICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgICBoaWRlKCQodGhpcykuYXR0cignaWQnKS5zdWJzdHJpbmcoMikpOworICAgICAgICAgICAgfSkKKyAgICAgICAgKTsKKyAgICB9KTsKKyAgfTsKKworICB2YXIgb3B0cyA9IHsKKyAgICBwcm9jZXNzVm90ZVVSTDogJy9fcHJvY2Vzc192b3RlJywKKyAgICBhZGRDb21tZW50VVJMOiAnL19hZGRfY29tbWVudCcsCisgICAgZ2V0Q29tbWVudHNVUkw6ICcvX2dldF9jb21tZW50cycsCisgICAgYWNjZXB0Q29tbWVudFVSTDogJy9fYWNjZXB0X2NvbW1lbnQnLAorICAgIGRlbGV0ZUNvbW1lbnRVUkw6ICcvX2RlbGV0ZV9jb21tZW50JywKKyAgICBjb21tZW50SW1hZ2U6ICcvc3RhdGljL19zdGF0aWMvY29tbWVudC5wbmcnLAorICAgIGNsb3NlQ29tbWVudEltYWdlOiAnL3N0YXRpYy9fc3RhdGljL2NvbW1lbnQtY2xvc2UucG5nJywKKyAgICBsb2FkaW5nSW1hZ2U6ICcvc3RhdGljL19zdGF0aWMvYWpheC1sb2FkZXIuZ2lmJywKKyAgICBjb21tZW50QnJpZ2h0SW1hZ2U6ICcvc3RhdGljL19zdGF0aWMvY29tbWVudC1icmlnaHQucG5nJywKKyAgICB1cEFycm93OiAnL3N0YXRpYy9fc3RhdGljL3VwLnBuZycsCisgICAgZG93bkFycm93OiAnL3N0YXRpYy9fc3RhdGljL2Rvd24ucG5nJywKKyAgICB1cEFycm93UHJlc3NlZDogJy9zdGF0aWMvX3N0YXRpYy91cC1wcmVzc2VkLnBuZycsCisgICAgZG93bkFycm93UHJlc3NlZDogJy9zdGF0aWMvX3N0YXRpYy9kb3duLXByZXNzZWQucG5nJywKKyAgICB2b3Rpbmc6IGZhbHNlLAorICAgIG1vZGVyYXRvcjogZmFsc2UKKyAgfTsKKworICBpZiAodHlwZW9mIENPTU1FTlRfT1BUSU9OUyAhPSAidW5kZWZpbmVkIikgeworICAgIG9wdHMgPSBqUXVlcnkuZXh0ZW5kKG9wdHMsIENPTU1FTlRfT1BUSU9OUyk7CisgIH0KKworICB2YXIgcG9wdXBUZW1wbGF0ZSA9ICdcCisgICAgPGRpdiBjbGFzcz0ic3BoaW54LWNvbW1lbnRzIiBpZD0ic2M8JWlkJT4iPlwKKyAgICAgIDxwIGNsYXNzPSJzb3J0LW9wdGlvbnMiPlwKKyAgICAgICAgU29ydCBieTpcCisgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJzb3J0LW9wdGlvbiBieXJhdGluZyI+YmVzdCByYXRlZDwvYT5cCisgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJzb3J0LW9wdGlvbiBieWFzY2FnZSI+bmV3ZXN0PC9hPlwKKyAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InNvcnQtb3B0aW9uIGJ5YWdlIj5vbGRlc3Q8L2E+XAorICAgICAgPC9wPlwKKyAgICAgIDxkaXYgY2xhc3M9ImNvbW1lbnQtaGVhZGVyIj5Db21tZW50czwvZGl2PlwKKyAgICAgIDxkaXYgY2xhc3M9ImNvbW1lbnQtbG9hZGluZyIgaWQ9ImNuPCVpZCU+Ij5cCisgICAgICAgIGxvYWRpbmcgY29tbWVudHMuLi4gPGltZyBzcmM9IjwlbG9hZGluZ0ltYWdlJT4iIGFsdD0iIiAvPjwvZGl2PlwKKyAgICAgIDx1bCBpZD0iY2w8JWlkJT4iIGNsYXNzPSJjb21tZW50LXVsIj48L3VsPlwKKyAgICAgIDxkaXYgaWQ9ImNhPCVpZCU+Ij5cCisgICAgICA8cCBjbGFzcz0iYWRkLWEtY29tbWVudCI+QWRkIGEgY29tbWVudFwKKyAgICAgICAgKDxhIGhyZWY9IiMiIGNsYXNzPSJjb21tZW50LW1hcmt1cCIgaWQ9ImFiPCVpZCU+Ij5tYXJrdXA8L2E+KTo8L3A+XAorICAgICAgPGRpdiBjbGFzcz0iY29tbWVudC1tYXJrdXAtYm94IiBpZD0ibWI8JWlkJT4iPlwKKyAgICAgICAgcmVTdHJ1Y3R1cmVkIHRleHQgbWFya3VwOiA8aT4qZW1waCo8L2k+LCA8Yj4qKnN0cm9uZyoqPC9iPiwgXAorICAgICAgICA8dHQ+YGBjb2RlYGA8L3R0PiwgXAorICAgICAgICBjb2RlIGJsb2NrczogPHR0Pjo6PC90dD4gYW5kIGFuIGluZGVudGVkIGJsb2NrIGFmdGVyIGJsYW5rIGxpbmU8L2Rpdj5cCisgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJjZjwlaWQlPiIgY2xhc3M9ImNvbW1lbnQtZm9ybSIgYWN0aW9uPSIiPlwKKyAgICAgICAgPHRleHRhcmVhIG5hbWU9ImNvbW1lbnQiIGNvbHM9IjgwIj48L3RleHRhcmVhPlwKKyAgICAgICAgPHAgY2xhc3M9InByb3Bvc2UtYnV0dG9uIj5cCisgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9InBjPCVpZCU+IiBjbGFzcz0ic2hvdy1wcm9wb3NlLWNoYW5nZSI+XAorICAgICAgICAgICAgUHJvcG9zZSBhIGNoYW5nZSAmIzk2NTc7XAorICAgICAgICAgIDwvYT5cCisgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9ImhjPCVpZCU+IiBjbGFzcz0iaGlkZS1wcm9wb3NlLWNoYW5nZSI+XAorICAgICAgICAgICAgUHJvcG9zZSBhIGNoYW5nZSAmIzk2NjM7XAorICAgICAgICAgIDwvYT5cCisgICAgICAgIDwvcD5cCisgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJwcm9wb3NhbCIgaWQ9InB0PCVpZCU+IiBjb2xzPSI4MCJcCisgICAgICAgICAgICAgICAgICBzcGVsbGNoZWNrPSJmYWxzZSI+PC90ZXh0YXJlYT5cCisgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJBZGQgY29tbWVudCIgLz5cCisgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im5vZGUiIHZhbHVlPSI8JWlkJT4iIC8+XAorICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYXJlbnQiIHZhbHVlPSIiIC8+XAorICAgICAgPC9mb3JtPlwKKyAgICAgIDwvZGl2PlwKKyAgICA8L2Rpdj4nOworCisgIHZhciBjb21tZW50VGVtcGxhdGUgPSAnXAorICAgIDxkaXYgaWQ9ImNkPCVpZCU+IiBjbGFzcz0ic3BoaW54LWNvbW1lbnQ8JWNzc19jbGFzcyU+Ij5cCisgICAgICA8ZGl2IGNsYXNzPSJ2b3RlIj5cCisgICAgICAgIDxkaXYgY2xhc3M9ImFycm93Ij5cCisgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9InV2PCVpZCU+IiBjbGFzcz0idm90ZSIgdGl0bGU9InZvdGUgdXAiPlwKKyAgICAgICAgICAgIDxpbWcgc3JjPSI8JXVwQXJyb3clPiIgLz5cCisgICAgICAgICAgPC9hPlwKKyAgICAgICAgICA8YSBocmVmPSIjIiBpZD0idXU8JWlkJT4iIGNsYXNzPSJ1biB2b3RlIiB0aXRsZT0idm90ZSB1cCI+XAorICAgICAgICAgICAgPGltZyBzcmM9IjwldXBBcnJvd1ByZXNzZWQlPiIgLz5cCisgICAgICAgICAgPC9hPlwKKyAgICAgICAgPC9kaXY+XAorICAgICAgICA8ZGl2IGNsYXNzPSJhcnJvdyI+XAorICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJkdjwlaWQlPiIgY2xhc3M9InZvdGUiIHRpdGxlPSJ2b3RlIGRvd24iPlwKKyAgICAgICAgICAgIDxpbWcgc3JjPSI8JWRvd25BcnJvdyU+IiBpZD0iZGE8JWlkJT4iIC8+XAorICAgICAgICAgIDwvYT5cCisgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9ImR1PCVpZCU+IiBjbGFzcz0idW4gdm90ZSIgdGl0bGU9InZvdGUgZG93biI+XAorICAgICAgICAgICAgPGltZyBzcmM9IjwlZG93bkFycm93UHJlc3NlZCU+IiAvPlwKKyAgICAgICAgICA8L2E+XAorICAgICAgICA8L2Rpdj5cCisgICAgICA8L2Rpdj5cCisgICAgICA8ZGl2IGNsYXNzPSJjb21tZW50LWNvbnRlbnQiPlwKKyAgICAgICAgPHAgY2xhc3M9InRhZ2xpbmUgY29tbWVudCI+XAorICAgICAgICAgIDxzcGFuIGNsYXNzPSJ1c2VyLWlkIj48JXVzZXJuYW1lJT48L3NwYW4+XAorICAgICAgICAgIDxzcGFuIGNsYXNzPSJyYXRpbmciPjwlcHJldHR5X3JhdGluZyU+PC9zcGFuPlwKKyAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVsdGEiPjwldGltZS5kZWx0YSU+PC9zcGFuPlwKKyAgICAgICAgPC9wPlwKKyAgICAgICAgPGRpdiBjbGFzcz0iY29tbWVudC10ZXh0IGNvbW1lbnQiPjwjdGV4dCM+PC9kaXY+XAorICAgICAgICA8cCBjbGFzcz0iY29tbWVudC1vcHRzIGNvbW1lbnQiPlwKKyAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icmVwbHkgaGlkZGVuIiBpZD0icmw8JWlkJT4iPnJlcGx5ICYjOTY1Nzs8L2E+XAorICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJjbG9zZS1yZXBseSIgaWQ9ImNyPCVpZCU+Ij5yZXBseSAmIzk2NjM7PC9hPlwKKyAgICAgICAgICA8YSBocmVmPSIjIiBpZD0ic3A8JWlkJT4iIGNsYXNzPSJzaG93LXByb3Bvc2FsIj5wcm9wb3NhbCAmIzk2NTc7PC9hPlwKKyAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iaHA8JWlkJT4iIGNsYXNzPSJoaWRlLXByb3Bvc2FsIj5wcm9wb3NhbCAmIzk2NjM7PC9hPlwKKyAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iZGM8JWlkJT4iIGNsYXNzPSJkZWxldGUtY29tbWVudCBoaWRkZW4iPmRlbGV0ZTwvYT5cCisgICAgICAgICAgPHNwYW4gaWQ9ImNtPCVpZCU+IiBjbGFzcz0ibW9kZXJhdGlvbiBoaWRkZW4iPlwKKyAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJhYzwlaWQlPiIgY2xhc3M9ImFjY2VwdC1jb21tZW50Ij5hY2NlcHQ8L2E+XAorICAgICAgICAgIDwvc3Bhbj5cCisgICAgICAgIDwvcD5cCisgICAgICAgIDxwcmUgY2xhc3M9InByb3Bvc2FsIiBpZD0icHI8JWlkJT4iPlwKKzwjcHJvcG9zYWxfZGlmZiM+XAorICAgICAgICA8L3ByZT5cCisgICAgICAgICAgPHVsIGNsYXNzPSJjb21tZW50LWNoaWxkcmVuIiBpZD0iY2w8JWlkJT4iPjwvdWw+XAorICAgICAgICA8L2Rpdj5cCisgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFybGVmdCI+PC9kaXY+XAorICAgICAgPC9kaXY+XAorICAgIDwvZGl2Pic7CisKKyAgdmFyIHJlcGx5VGVtcGxhdGUgPSAnXAorICAgIDxsaT5cCisgICAgICA8ZGl2IGNsYXNzPSJyZXBseS1kaXYiIGlkPSJyZDwlaWQlPiI+XAorICAgICAgICA8Zm9ybSBpZD0icmY8JWlkJT4iPlwKKyAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iY29tbWVudCIgY29scz0iODAiPjwvdGV4dGFyZWE+XAorICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJBZGQgcmVwbHkiIC8+XAorICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJDYW5jZWwiIC8+XAorICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhcmVudCIgdmFsdWU9IjwlaWQlPiIgLz5cCisgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibm9kZSIgdmFsdWU9IiIgLz5cCisgICAgICAgIDwvZm9ybT5cCisgICAgICA8L2Rpdj5cCisgICAgPC9saT4nOworCisgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworICAgIGluaXQoKTsKKyAgfSk7Cit9KShqUXVlcnkpOworCiskKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKyAgLy8gYWRkIGNvbW1lbnQgYW5jaG9ycyBmb3IgYWxsIHBhcmFncmFwaHMgdGhhdCBhcmUgY29tbWVudGFibGUKKyAgJCgnLnNwaGlueC1oYXMtY29tbWVudCcpLmNvbW1lbnQoKTsKKworICAvLyBoaWdobGlnaHQgc2VhcmNoIHdvcmRzIGluIHNlYXJjaCByZXN1bHRzCisgICQoImRpdi5jb250ZXh0IikuZWFjaChmdW5jdGlvbigpIHsKKyAgICB2YXIgcGFyYW1zID0gJC5nZXRRdWVyeVBhcmFtZXRlcnMoKTsKKyAgICB2YXIgdGVybXMgPSAocGFyYW1zLnEpID8gcGFyYW1zLnFbMF0uc3BsaXQoL1xzKy8pIDogW107CisgICAgdmFyIHJlc3VsdCA9ICQodGhpcyk7CisgICAgJC5lYWNoKHRlcm1zLCBmdW5jdGlvbigpIHsKKyAgICAgIHJlc3VsdC5oaWdobGlnaHRUZXh0KHRoaXMudG9Mb3dlckNhc2UoKSwgJ2hpZ2hsaWdodGVkJyk7CisgICAgfSk7CisgIH0pOworCisgIC8vIGRpcmVjdGx5IG9wZW4gY29tbWVudCB3aW5kb3cgaWYgcmVxdWVzdGVkCisgIHZhciBhbmNob3IgPSBkb2N1bWVudC5sb2NhdGlvbi5oYXNoOworICBpZiAoYW5jaG9yLnN1YnN0cmluZygwLCA5KSA9PSAnI2NvbW1lbnQtJykgeworICAgICQoJyNhbycgKyBhbmNob3Iuc3Vic3RyaW5nKDkpKS5jbGljaygpOworICAgIGRvY3VtZW50LmxvY2F0aW9uLmhhc2ggPSAnI3MnICsgYW5jaG9yLnN1YnN0cmluZyg5KTsKKyAgfQorfSk7CmRpZmYgLS1naXQgYS9hbnNpYmxlLmh0bWwgYi9hbnNpYmxlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmNzkzNAotLS0gL2Rldi9udWxsCisrKyBiL2Fuc2libGUuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKKyAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorCisKKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgCisgICAgPHRpdGxlPlVzaW5nIHJlY2xhc3Mgd2l0aCBBbnNpYmxlICZtZGFzaDsgcmVjbGFzcyAxLjQuMSBkb2N1bWVudGF0aW9uPC90aXRsZT4KKyAgICAKKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9zdGF0aWMvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iX3N0YXRpYy9weWdtZW50cy5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgIAorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgIHZhciBET0NVTUVOVEFUSU9OX09QVElPTlMgPSB7CisgICAgICAgIFVSTF9ST09UOiAgICAnLi8nLAorICAgICAgICBWRVJTSU9OOiAgICAgJzEuNC4xJywKKyAgICAgICAgQ09MTEFQU0VfSU5ERVg6IGZhbHNlLAorICAgICAgICBGSUxFX1NVRkZJWDogJy5odG1sJywKKyAgICAgICAgSEFTX1NPVVJDRTogIHRydWUKKyAgICAgIH07CisgICAgPC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy9qcXVlcnkuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvdW5kZXJzY29yZS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy9kb2N0b29scy5qcyI+PC9zY3JpcHQ+CisgICAgPGxpbmsgcmVsPSJ0b3AiIHRpdGxlPSJyZWNsYXNzIDEuNC4xIGRvY3VtZW50YXRpb24iIGhyZWY9ImluZGV4Lmh0bWwiIC8+CisgICAgPGxpbmsgcmVsPSJuZXh0IiB0aXRsZT0iVXNpbmcgcmVjbGFzcyB3aXRoIFB1cHBldCIgaHJlZj0icHVwcGV0Lmh0bWwiIC8+CisgICAgPGxpbmsgcmVsPSJwcmV2IiB0aXRsZT0iVXNpbmcgcmVjbGFzcyB3aXRoIFNhbHQiIGhyZWY9InNhbHQuaHRtbCIgLz4gCisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGRpdiBjbGFzcz0icmVsYXRlZCI+CisgICAgICA8aDM+TmF2aWdhdGlvbjwvaDM+CisgICAgICA8dWw+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHgiPgorICAgICAgICAgIDxhIGhyZWY9ImdlbmluZGV4Lmh0bWwiIHRpdGxlPSJHZW5lcmFsIEluZGV4IgorICAgICAgICAgICAgIGFjY2Vzc2tleT0iSSI+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InB1cHBldC5odG1sIiB0aXRsZT0iVXNpbmcgcmVjbGFzcyB3aXRoIFB1cHBldCIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9Ik4iPm5leHQ8L2E+IHw8L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0ic2FsdC5odG1sIiB0aXRsZT0iVXNpbmcgcmVjbGFzcyB3aXRoIFNhbHQiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJQIj5wcmV2aW91czwvYT4gfDwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PiAgCisKKyAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudCI+CisgICAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudHdyYXBwZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJib2R5d3JhcHBlciI+CisgICAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+CisgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InVzaW5nLXJlY2xhc3Mtd2l0aC1hbnNpYmxlIj4KKzxoMT5Vc2luZyByZWNsYXNzIHdpdGggQW5zaWJsZTxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjdXNpbmctcmVjbGFzcy13aXRoLWFuc2libGUiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMT4KKzxkaXYgY2xhc3M9ImFkbW9uaXRpb24gd2FybmluZyI+Cis8cCBjbGFzcz0iZmlyc3QgYWRtb25pdGlvbi10aXRsZSI+V2FybmluZzwvcD4KKzxwIGNsYXNzPSJsYXN0Ij5JIHdhcyBraWNrZWQgb3V0IG9mIHRoZSBBbnNpYmxlIGNvbW11bml0eSwgcHJlc3VtYWJseSBmb3IgPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hZGR1Y2svcmVjbGFzcy9pc3N1ZXMvNiI+YXNraW5nIHRoZSB3cm9uZworcXVlc3Rpb25zPC9hPiwgYW5kIHRoZXJlZm9yZSBJIGhhdmUgbm8gaW50ZXJlc3QgaW4gZGV2ZWxvcGluZyB0aGlzIGFkYXB0ZXIKK2FueW1vcmUuIElmIHlvdSB1c2UgaXQgYW5kIGhhdmUgY2hhbmdlcywgSSB3aWxsIHRha2UgeW91ciBwYXRjaC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJxdWljay1zdGFydC13aXRoLWFuc2libGUiPgorPGgyPlF1aWNrIHN0YXJ0IHdpdGggQW5zaWJsZTxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjcXVpY2stc3RhcnQtd2l0aC1hbnNpYmxlIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD5UaGUgZm9sbG93aW5nIHN0ZXBzIHNob3VsZCBnZXQgeW91IHVwIGFuZCBydW5uaW5nIHF1aWNrbHkgd2l0aCA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gYW5kCis8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vd3d3LmFuc2libGV3b3Jrcy5jb20iPkFuc2libGU8L2E+LiBHZW5lcmFsbHksIHdlIHdpbGwgYmUgd29ya2luZyBpbiA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi9ldGMvYW5zaWJsZTwvc3Bhbj48L3R0Pi4gSG93ZXZlciwgaWYgeW91CithcmUgdXNpbmcgYSBzb3VyY2UtY29kZSBjaGVja291dCBvZiBBbnNpYmxlLCB5b3UgbWlnaHQgYWxzbyB3YW50IHRvIHdvcmsKK2luc2lkZSB0aGUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4uL2hhY2tpbmc8L3NwYW4+PC90dD4gZGlyZWN0b3J5IGluc3RlYWQuPC9wPgorPHA+T3IgeW91IGNhbiBhbHNvIGp1c3QgbG9vayBpbnRvIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+Li9leGFtcGxlcy9hbnNpYmxlPC9zcGFuPjwvdHQ+IG9mIHlvdXIgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+CitjaGVja291dCwgd2hlcmUgdGhlIGZvbGxvd2luZyBzdGVwcyBoYXZlIGFscmVhZHkgYmVlbiBwcmVwYXJlZC48L3A+Cis8cD4v4oCmL3JlY2xhc3MgcmVmZXJzIHRvIHRoZSBsb2NhdGlvbiBvZiB5b3VyIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBjaGVja291dC48L3A+Cis8b2wgY2xhc3M9ImFyYWJpYyI+Cis8bGk+PHAgY2xhc3M9ImZpcnN0Ij5Db21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIHN0ZXBzIGRlc2NyaWJlZCBpbiB0aGUgPGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iaW5zdGFsbC5odG1sIj48ZW0+aW5zdGFsbGF0aW9uIHNlY3Rpb248L2VtPjwvYT4uPC9wPgorPC9saT4KKzxsaT48cCBjbGFzcz0iZmlyc3QiPlN5bWxpbmsgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vdXNyL3NoYXJlL3JlY2xhc3MvcmVjbGFzcy1hbnNpYmxlPC9zcGFuPjwvdHQ+IChvciB3aGVyZXZlciB5b3VyIGRpc3RybyBwdXQKK3RoYXQgZmlsZSksIG9yIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+L+KApi9yZWNsYXNzL3JlY2xhc3MvYWRhcHRlcnMvYW5zaWJsZS5weTwvc3Bhbj48L3R0PiAoaWYgcnVubmluZyBmcm9tCitzb3VyY2UpIHRvIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+L2V0Yy9hbnNpYmxlL2hvc3RzPC9zcGFuPjwvdHQ+IChvciA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi4vaGFja2luZy9ob3N0czwvc3Bhbj48L3R0PikuPC9wPgorPC9saT4KKzxsaT48cCBjbGFzcz0iZmlyc3QiPkNvcHkgdGhlIHR3byBkaXJlY3RvcmllcyA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPm5vZGVzPC9zcGFuPjwvdHQ+IGFuZCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmNsYXNzZXM8L3NwYW4+PC90dD4gZnJvbSB0aGUgZXhhbXBsZQorc3ViZGlyZWN0b3J5IGluIHRoZSA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gY2hlY2tvdXQgdG8gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vZXRjL2Fuc2libGU8L3NwYW4+PC90dD48L3A+Cis8cD5JZiB5b3UgcHJlZmVyIHRvIHB1dCB0aG9zZSBkaXJlY3RvcmllcyBlbHNld2hlcmUsIHlvdSBjYW4gY3JlYXRlCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi9ldGMvYW5zaWJsZS9yZWNsYXNzLWNvbmZpZy55bWw8L3NwYW4+PC90dD4gd2l0aCBjb250ZW50cyBzdWNoIGFzOjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT5zdG9yYWdlX3R5cGU6IHlhbWxfZnMKK2ludmVudG9yeV9iYXNlX3VyaTogL3Nydi9yZWNsYXNzCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+Tm90ZSB0aGF0IDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+eWFtbF9mczwvc3Bhbj48L3R0PiBpcyBjdXJyZW50bHkgdGhlIG9ubHkgc3VwcG9ydGVkIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+c3RvcmFnZV90eXBlPC9zcGFuPjwvdHQ+LCBhbmQKK2l0JiM4MjE3O3MgdGhlIGRlZmF1bHQgaWYgeW91IGRvbiYjODIxNzt0IHNldCBpdC48L3A+Cis8L2xpPgorPGxpPjxwIGNsYXNzPSJmaXJzdCI+Q2hlY2sgb3V0IHlvdXIgaW52ZW50b3J5IGJ5IGludm9raW5nPC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPiQgLi9ob3N0cyAtLWxpc3QKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8cD53aGljaCBzaG91bGQgcmV0dXJuIDUgZ3JvdXBzIGluIEpTT04gZm9ybWF0LCBhbmQgZWFjaCBncm91cCBoYXMgZXhhY3RseQorb25lIG1lbWJlciA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmxvY2FsaG9zdDwvc3Bhbj48L3R0Pi48L3A+Cis8L2xpPgorPC9vbD4KKzxvbCBjbGFzcz0iYXJhYmljIiBzdGFydD0iNCI+Cis8bGk+PHAgY2xhc3M9ImZpcnN0Ij5TZWUgdGhlIG5vZGUgaW5mb3JtYXRpb24gZm9yIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+bG9jYWxob3N0PC9zcGFuPjwvdHQ+OjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT4kIC4vaG9zdHMgLS1ob3N0IGxvY2FsaG9zdAorPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzxwPlRoaXMgc2hvdWxkIHByaW50IGEgc2V0IG9mIGtleXMgYW5kIHZhbHVlcywgaW5jbHVkaW5nIGEgZ3JlZXRpbmcsCithIGNvbG91ciwgYW5kIGEgc3ViLWNsYXNzIGNhbGxlZCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPl9fcmVjbGFzX188L3NwYW4+PC90dD4uPC9wPgorPC9saT4KKzxsaT48cCBjbGFzcz0iZmlyc3QiPkV4ZWN1dGUgc29tZSBhbnNpYmxlIGNvbW1hbmRzLCBlLmcuOjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT4kIGFuc2libGUgLWkgaG9zdHMgXCogLS1saXN0LWhvc3RzCiskIGFuc2libGUgLWkgaG9zdHMgXCogLW0gcGluZworJCBhbnNpYmxlIC1pIGhvc3RzIFwqIC1tIGRlYnVnIC1hICYjMzk7bXNnPSZxdW90OyR7Z3JlZXRpbmd9JnF1b3Q7JiMzOTsKKyQgYW5zaWJsZSAtaSBob3N0cyBcKiAtbSBzZXR1cAorJCBhbnNpYmxlLXBsYXlib29rIC1pIGhvc3RzIHRlc3QueW1sCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPC9saT4KKzxsaT48cCBjbGFzcz0iZmlyc3QiPllvdSBjYW4gYWxzbyBpbnZva2UgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGRpcmVjdGx5LCB3aGljaCBnaXZlcyBhIHNsaWdodGx5IGRpZmZlcmVudAordmlldyBvbnRvIHRoZSBzYW1lIGRhdGEsIGkuZS4gYmVmb3JlIGl0IGhhcyBiZWVuIGFkYXB0ZWQgZm9yIEFuc2libGU6PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPiQgL+KApi9yZWNsYXNzL3JlY2xhc3MucHkgLS1wcmV0dHktcHJpbnQgLS1pbnZlbnRvcnkKKyQgL+KApi9yZWNsYXNzL3JlY2xhc3MucHkgLS1wcmV0dHktcHJpbnQgLS1ub2RlaW5mbyBsb2NhbGhvc3QKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8cD5PciwgaWYgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGlzIHByb3Blcmx5IGluc3RhbGxlZCwganVzdCB1c2UgdGhlIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBjb21tYW5kLjwvcD4KKzwvbGk+Cis8L29sPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iaW50ZWdyYXRpb24td2l0aC1hbnNpYmxlIj4KKzxoMj5JbnRlZ3JhdGlvbiB3aXRoIEFuc2libGU8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI2ludGVncmF0aW9uLXdpdGgtYW5zaWJsZSIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gyPgorPHA+VGhlIGludGVncmF0aW9uIGJldHdlZW4gPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGFuZCBBbnNpYmxlIGlzIHBlcmZvcm1lZCB0aHJvdWdoIGFuIGFkYXB0ZXIsCithbmQgbmVlZHMgbm90IGJlIG9mIG91ciBjb25jZXJuIHRvbyBtdWNoLjwvcD4KKzxwPkhvd2V2ZXIsIEFuc2libGUgaGFzIG5vIGNvbmNlcHQgb2YgJiM4MjIwO25vZGVzJiM4MjIxOywgJiM4MjIwO2FwcGxpY2F0aW9ucyYjODIyMTssICYjODIyMDtwYXJhbWV0ZXJzJiM4MjIxOywgYW5kCismIzgyMjA7Y2xhc3NlcyYjODIyMTsuIFRoZXJlZm9yZSBpdCBpcyBuZWNlc3NhcnkgdG8gZXhwbGFpbiBob3cgdGhvc2UgY29ycmVzcG9uZCB0bworQW5zaWJsZS4gQ3J1ZGVseSwgdGhlIGZvbGxvd2luZyBtYXBwaW5nIGV4aXN0czo8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjbGFzcz0iZG9jdXRpbHMiPgorPGNvbGdyb3VwPgorPGNvbCB3aWR0aD0iNTMlIiAvPgorPGNvbCB3aWR0aD0iNDclIiAvPgorPC9jb2xncm91cD4KKzx0aGVhZCB2YWxpZ249ImJvdHRvbSI+Cis8dHIgY2xhc3M9InJvdy1vZGQiPjx0aCBjbGFzcz0iaGVhZCI+PHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGNvbmNlcHQ8L3RoPgorPHRoIGNsYXNzPSJoZWFkIj5BbnNpYmxlIGNvbmNlcHQ8L3RoPgorPC90cj4KKzwvdGhlYWQ+Cis8dGJvZHkgdmFsaWduPSJ0b3AiPgorPHRyIGNsYXNzPSJyb3ctZXZlbiI+PHRkPm5vZGVzPC90ZD4KKzx0ZD5ob3N0czwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJyb3ctb2RkIj48dGQ+Y2xhc3NlczwvdGQ+Cis8dGQ+Z3JvdXBzPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9InJvdy1ldmVuIj48dGQ+YXBwbGljYXRpb25zPC90ZD4KKzx0ZD5wbGF5Ym9va3M8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0icm93LW9kZCI+PHRkPnBhcmFtZXRlcnM8L3RkPgorPHRkPmhvc3RfdmFyczwvdGQ+Cis8L3RyPgorPC90Ym9keT4KKzwvdGFibGU+Cis8cD48c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gZG9lcyBub3QgcHJvdmlkZSBhbnkgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5ncm91cF92YXJzPC9zcGFuPjwvdHQ+IGJlY2F1c2Ugb2YgaXRzIG5vZGUtY2VudHJpYworcGVyc3BlY3RpdmUuIFdoaWxlIGNsYXNzIGRlZmluaXRpb25zIGluY2x1ZGUgcGFyYW1ldGVycywgdGhvc2UgYXJlIGluaGVyaXRlZAorYnkgdGhlIG5vZGUgZGVmaW5pdGlvbnMgYW5kIGhlbmNlIGJlY29tZSBub2RlX3ZhcnMuPC9wPgorPHA+PHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGFsc28gZG9lcyBub3QgcHJvdmlkZSBwbGF5Ym9va3MsIG5vciBkb2VzIGl0IGRlYWwgd2l0aCBhbnkgb2YgdGhlCityZWxhdGVkIEFuc2libGUgY29uY2VwdHMsIGkuZS4gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj52YXJzX2ZpbGVzPC9zcGFuPjwvdHQ+LCB2YXJzLCB0YXNrcywgaGFuZGxlcnMsIHJvbGVzLCBldGMuLjwvcD4KKzxibG9ja3F1b3RlPgorPGRpdj5MZXQgaXQgYmUgc2FpZCBhdCB0aGlzIHBvaW50IHRoYXQgeW91JiM4MjE3O2xsIHByb2JhYmx5IHdhbnQgdG8gc3RvcCB1c2luZworPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5ob3N0X3ZhcnM8L3NwYW4+PC90dD4sIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+Z3JvdXBfdmFyczwvc3Bhbj48L3R0PiBhbmQgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj52YXJzX2ZpbGVzPC9zcGFuPjwvdHQ+IGFsdG9nZXRoZXIsIGFuZCBpZiBvbmx5CitiZWNhdXNlIHlvdSBzaG91bGQgbm8gbG9uZ2VyIG5lZWQgdGhlbSwgYnV0IGFsc28gYmVjYXVzZSB0aGUgdmFyaWFibGUKK3ByZWNlZGVuY2UgcnVsZXMgb2YgQW5zaWJsZSBhcmUgZnVsbCBvZiBzdXJwcmlzZXMsIGF0IGxlYXN0IHRvIG1lLjwvZGl2PjwvYmxvY2txdW90ZT4KKzxwPjxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiYjODIxNjsgQW5zaWJsZSBhZGFwdGVyIG1hc3NhZ2UgdGhlIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBvdXRwdXQgaW50byBBbnNpYmxlLXVzYWJsZSBkYXRhLAorbmFtZWx5OjwvcD4KKzx1bD4KKzxsaT48cCBjbGFzcz0iZmlyc3QiPkV2ZXJ5IGNsYXNzIGluIHRoZSBhbmNlc3RyeSBvZiBhIG5vZGUgYmVjb21lcyBhIGdyb3VwIHRvIEFuc2libGUuIFRoaXMgaXMKK21haW5seSB1c2VmdWwgdG8gYmUgYWJsZSB0byB0YXJnZXQgbm9kZXMgZHVyaW5nIGludGVyYWN0aXZlIHVzZSBvZgorQW5zaWJsZSwgZS5nLjo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCBhbnNpYmxlIGRlYmlhbm5vZGVAd2hlZXp5IC1tIGNvbW1hbmQgLWEgJiMzOTthcHQtZ2V0IHVwZ3JhZGUmIzM5OworICDihpIgdXBncmFkZSBhbGwgRGViaWFuIG5vZGVzIHJ1bm5pbmcgd2hlZXp5CisKKyQgYW5zaWJsZSBzc2guc2VydmVyIC1tIGNvbW1hbmQgLWEgJiMzOTtpbnZva2UtcmMuZCBzc2ggcmVzdGFydCYjMzk7CisgIOKGkiByZXN0YXJ0IGFsbCBTU0ggc2VydmVyIHByb2Nlc3NlcworCiskIGFuc2libGUgbWFpbHNlcnZlciAtbSBjb21tYW5kIC1hICYjMzk7dGFpbCAtbjEwMDAgL3Zhci9sb2cvbWFpbC5lcnImIzM5OworICDihpIgb2J0YWluIHRoZSBsYXN0IDEsMDAwIGxpbmVzIG9mIGFsbCBtYWlsc2VydmVyIGVycm9yIGxvZyBmaWxlcworPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzxwPlRoZSBhdHRlbnRpdmUgcmVhZGVyIG1pZ2h0IHN0dW1ibGUgb3ZlciB0aGUgdXNlIG9mIHNpbmd1bGFyIHdvcmRzLCB3aGVyZWFzCitpdCBtaWdodCBtYWtlIG1vcmUgc2Vuc2UgdG8gYWRkcmVzcyBhbGwgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5tYWlsc2VydmVyKnMqPC9zcGFuPjwvdHQ+IHdpdGggdGhpcyB0b29sLgorVGhpcyBpcyBjb252ZW50aW9uIGFuZCB1cCB0byB5b3UuIEkgcHJlZmVyIHRvIHRoaW5rIG9mIG15IG5vZGUgYXMKK2EgKHNpbmd1bGFyKSBtYWlsc2VydmVyIHdoZW4gSSBhZGQgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5tYWlsc2VydmVyPC9zcGFuPjwvdHQ+IHRvIGl0cyBwYXJlbnQgY2xhc3Nlcy48L3A+Cis8L2xpPgorPGxpPjxwIGNsYXNzPSJmaXJzdCI+RXZlcnkgZW50cnkgaW4gdGhlIGxpc3Qgb2YgYSBob3N0JiM4MjE3O3MgYXBwbGljYXRpb25zIG1pZ2h0IHdlbGwgY29ycmVzcG9uZCB0bworYW4gQW5zaWJsZSBwbGF5Ym9vay4gVGhlcmVmb3JlLCA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gY3JlYXRlcyBhIChBbnNpYmxlLSlncm91cCBmb3IKK2V2ZXJ5IGFwcGxpY2F0aW9uLCBhbmQgYWRkcyA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPl9ob3N0czwvc3Bhbj48L3R0PiB0byB0aGUgbmFtZS4gVGhpcyBwb3N0Zml4IGNhbiBiZQorY29uZmlndXJlZCB3aXRoIGEgQ0xJIG9wdGlvbiAoPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4tLWFwcGxpY2F0aW9ucy1wb3N0Zml4PC9zcGFuPjwvdHQ+KSBvciBpbiB0aGUKK2NvbmZpZ3VyYXRpb24gZmlsZSAoPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5hcHBsaWNhdGlvbnNfcG9zdGZpeDwvc3Bhbj48L3R0PikuPC9wPgorPHA+Rm9yIGluc3RhbmNlLCB0aGUgc3NoLnNlcnZlciBjbGFzcyBhZGRzIHRoZSBzc2guc2VydmVyIGFwcGxpY2F0aW9uIHRvCithIG5vZGUmIzgyMTc7cyBhcHBsaWNhdGlvbiBsaXN0LiBOb3cgdGhlIGFkbWluIG1pZ2h0IGNyZWF0ZSBhbiBBbnNpYmxlIHBsYXlib29rCitsaWtlIHNvOjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT4tIG5hbWU6IFNTSCBzZXJ2ZXIgbWFuYWdlbWVudAorICBob3N0czogc3NoLnNlcnZlcl9ob3N0cyAgICAgICAgICAgICAg4oaQIFNFRSBIRVJFCisgIHRhc2tzOgorICAgIC0gbmFtZTogaW5zdGFsbCBTU0ggcGFja2FnZQorICAgICAgYWN0aW9uOiDigKYKKyAg4oCmCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+VGhlcmUmIzgyMTc7cyBhIGJpdCBvZiByZWR1bmRhbmN5IGluIHRoaXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IEFuc2libGUgcGxheWJvb2tzCitoYXJkY29kZSB0aGUgbm9kZXMgdG8gd2hpY2ggYSBwbGF5Ym9vayBhcHBsaWVzLjwvcD4KKzxwPkl0JiM4MjE3O3Mgbm93IHRyaXZpYWwgdG8gYXBwbHkgdGhpcyBwbGF5Ym9vayBhY3Jvc3MgeW91ciBpbmZyYXN0cnVjdHVyZTo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCBhbnNpYmxlLXBsYXlib29rIHNzaC5zZXJ2ZXIueW1sCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+TXkgc3VnZ2VzdGVkIHdheSB0byB1c2UgQW5zaWJsZSBzaXRlLXdpZGUgaXMgdGhlbiB0byBjcmVhdGUgYSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnNpdGUueW1sPC9zcGFuPjwvdHQ+CitwbGF5Ym9vayB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgb3RoZXIgcGxheWJvb2tzICh3aGljaCBzaGFsbCBob3BlZnVsbHkgYmUKK2Jhc2VkIG9uIEFuc2libGUgcm9sZXMpLCBhbmQgdGhlbiB0byBpbnZva2UgQW5zaWJsZSBsaWtlIHRoaXM6PC9wPgorPGJsb2NrcXVvdGU+Cis8ZGl2PjxwPmFuc2libGUtcGxheWJvb2sgc2l0ZS55bWw8L3A+Cis8L2Rpdj48L2Jsb2NrcXVvdGU+Cis8cD5vciwgaWYgeW91IHByZWZlciBvbmx5IHRvIHJlY29uZmlndXJlIGEgc3Vic2V0IG9mIG5vZGVzLCBlLmcuIGFsbAord2Vic2VydmVyczo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCBhbnNpYmxlLXBsYXlib29rIHNpdGUueW1sIC0tbGltaXQgd2Vic2VydmVyCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+QWdhaW4sIGlmIHRoZSBzaW5ndWxhciB3b3JkIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+d2Vic2VydmVyPC9zcGFuPjwvdHQ+IHB1dHMgeW91IG9mZiwgY2hhbmdlIHRoZQorY29udmVudGlvbiBhcyB5b3Ugd2lzaC48L3A+Cis8cD5BbmQgaWYgYW55b25lIGNvbWVzIHVwIHdpdGggYSB3YXkgdG8gZGlyZWN0bHkgY29ubmVjdCBncm91cHMgaW4gdGhlCitpbnZlbnRvcnkgd2l0aCByb2xlcywgdGhlcmVieSBtYWtpbmcgaXQgdW5uZWNlc3NhcnkgdG8gd3JpdGUgcGxheWJvb2sKK2ZpbGVzIChjb250YWluaW5nIHJlZHVuZGFudCBpbmZvcm1hdGlvbiksIHBsZWFzZSB0ZWxsIG1lITwvcD4KKzwvbGk+Cis8bGk+PHAgY2xhc3M9ImZpcnN0Ij5QYXJhbWV0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gYSBub2RlIGJlY29tZSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmhvc3RfdmFyczwvc3Bhbj48L3R0PiBmb3IgdGhhdCBob3N0LjwvcD4KKzwvbGk+Cis8L3VsPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0idmFyaWFibGUtaW50ZXJwb2xhdGlvbiI+Cis8aDI+VmFyaWFibGUgaW50ZXJwb2xhdGlvbjxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjdmFyaWFibGUtaW50ZXJwb2xhdGlvbiIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gyPgorPHA+QW5zaWJsZSBhbGxvd3MgeW91IHRvIGluY2x1ZGUgPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL2ppbmphLnBvY29vLm9yZyI+SmluamEyPC9hPi1zdHlsZSB2YXJpYWJsZXMgaW4gcGFyYW1ldGVyIHZhbHVlczo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+cGFyYW1ldGVyczoKKyAgbW90ZDoKKyAgICBncmVldGluZzogV2VsY29tZSB0byB7eyBhbnNpYmxlX2ZxZG4gfX0hCisgICAgY2xvc2luZzogVGhpcyBzeXN0ZW0gaXMgcGFydCBvZiB7eyByZWFsbSB9fQorICBkaWN0X3JlZmVyZW5jZToge3sgbW90ZCB9fQorPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzxwPkhvd2V2ZXIsIGluIHJlc29sdmluZyB0aGlzLCBBbnNpYmxlIGNhc3RzIGV2ZXJ5dGhpbmcgdG8gYSBzdHJpbmcsIHNvIGluIHRoaXMKK2V4YW1wbGUsIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+ZGljdF9yZWZlcmVuY2U8L3NwYW4+PC90dD4gd291bGQgYmUgdGhlIHN0cmluZy1yZXByZXNlbnRhdGlvbiBvZiB0aGUKK2RpY3Rpb25hcnkgdW5kZXIgdGhlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+bW90ZDwvc3Bhbj48L3R0PiBrZXkgPGEgY2xhc3M9ImZvb3Rub3RlLXJlZmVyZW5jZSIgaHJlZj0iI3N0cmluZy1jYXN0cyIgaWQ9ImlkMSI+WzFdPC9hPi4gVG8gZ2V0IGF0IGZhY3RzIChzdWNoIGFzCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmFuc2libGVfZnFkbjwvc3Bhbj48L3R0PiksIHlvdSBzdGlsbCBoYXZlIHRvIHVzZSB0aGlzIGFwcHJvYWNoLCBidXQgZm9yIHB1cmUgcGFyYW1ldGVyCityZWZlcmVuY2VzLCBJIHN0cm9uZ2x5IHN1Z2dlc3QgdG8gdXNlIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBpbnRlcnBvbGF0aW9uIGluc3RlYWQsIGFzIGl0CitzdXBwb3J0cyBkZWVwIHJlZmVyZW5jZXMsIGRvZXMgbm90IGNsb2JiZXIgdHlwZSBpbmZvcm1hdGlvbiwgYW5kIGlzIG1vcmUKK2VmZmljaWVudCBhbnl3YXk6PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPnBhcmFtZXRlcnM6CisgIG1vdGQ6CisgICAgZ3JlZXRpbmc6IFdlbGNvbWUgdG8ge3sgYW5zaWJsZV9mcWRuIH19IQorICAgIGNsb3Npbmc6IFRoaXMgc3lzdGVtIGlzIHBhcnQgb2YgJHtyZWFsbX0KKyAgZGljdF9yZWZlcmVuY2U6ICR7bW90ZH0KKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8cD5Ob3cgeW91IGp1c3QgbmVlZCB0byBzcGVjaWZ5IHJlYWxtIHNvbWV3aGVyZS4gVGhlIHJlZmVyZW5jZSBjYW4gcmVzaWRlIGluCithIHBhcmVudCBjbGFzcywgd2hpbGUgdGhlIHZhcmlhYmxlIGlzIGRlZmluZWQgZS5nLiBpbiB0aGUgbm9kZSBkZWZpbml0aW9uLjwvcD4KKzxwPkFuZCBhcyBleHBlY3RlZCwgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5kaWN0X3JlZmVyZW5jZTwvc3Bhbj48L3R0PiBub3cgcG9pbnRzIHRvIGEgZGljdGlvbmFyeSwgbm90CithIHN0cmluZy1yZXByZXNlbnRhdGlvbiB0aGVyZW9mLjwvcD4KKzx0YWJsZSBjbGFzcz0iZG9jdXRpbHMgZm9vdG5vdGUiIGZyYW1lPSJ2b2lkIiBpZD0ic3RyaW5nLWNhc3RzIiBydWxlcz0ibm9uZSI+Cis8Y29sZ3JvdXA+PGNvbCBjbGFzcz0ibGFiZWwiIC8+PGNvbCAvPjwvY29sZ3JvdXA+Cis8dGJvZHkgdmFsaWduPSJ0b3AiPgorPHRyPjx0ZCBjbGFzcz0ibGFiZWwiPjxhIGNsYXNzPSJmbi1iYWNrcmVmIiBocmVmPSIjaWQxIj5bMV08L2E+PC90ZD48dGQ+SSBwb2ludGVkIHRoaXMgb3V0IHRvIE1pY2hhZWwgRGVoYWFuLCBBbnNpYmxlJiM4MjE3O3MgY2hpZWYKK2RldmVsb3BlciwgYnV0IGhlIGRlbmllZCB0aGlzIGJlaGF2aW91ci4gV2hlbiBJIHRyaWVkIHRvIHByb3ZpZGUgZnVydGhlcgoraW5zaWdodHMsIEkgZm91bmQgbXlzZWxmIGJhbm5lZCBmcm9tIHRoZSBtYWlsaW5nIGxpc3QsIGFwcGFyZW50bHkgYmVjYXVzZQorSSBkYXJlZCB0byBwb2ludCBvdXQgZmxhd3MuIElmIHlvdSBjYXJlLCB5b3UgbWF5IGxvb2sgYXQKKzxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYWRkdWNrL3JlY2xhc3MvaXNzdWVzLzYiPmh0dHBzOi8vZ2l0aHViLmNvbS9tYWRkdWNrL3JlY2xhc3MvaXNzdWVzLzY8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvdGQ+PC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorPC9kaXY+Cis8L2Rpdj4KKworCisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic3BoaW54c2lkZWJhcndyYXBwZXIiPgorICA8aDM+PGEgaHJlZj0iaW5kZXguaHRtbCI+VGFibGUgT2YgQ29udGVudHM8L2E+PC9oMz4KKyAgPHVsPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiMiPlVzaW5nIHJlY2xhc3Mgd2l0aCBBbnNpYmxlPC9hPjx1bD4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjcXVpY2stc3RhcnQtd2l0aC1hbnNpYmxlIj5RdWljayBzdGFydCB3aXRoIEFuc2libGU8L2E+PC9saT4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjaW50ZWdyYXRpb24td2l0aC1hbnNpYmxlIj5JbnRlZ3JhdGlvbiB3aXRoIEFuc2libGU8L2E+PC9saT4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjdmFyaWFibGUtaW50ZXJwb2xhdGlvbiI+VmFyaWFibGUgaW50ZXJwb2xhdGlvbjwvYT48L2xpPgorPC91bD4KKzwvbGk+Cis8L3VsPgorCisgIDxoND5QcmV2aW91cyB0b3BpYzwvaDQ+CisgIDxwIGNsYXNzPSJ0b3BsZXNzIj48YSBocmVmPSJzYWx0Lmh0bWwiCisgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0icHJldmlvdXMgY2hhcHRlciI+VXNpbmcgcmVjbGFzcyB3aXRoIFNhbHQ8L2E+PC9wPgorICA8aDQ+TmV4dCB0b3BpYzwvaDQ+CisgIDxwIGNsYXNzPSJ0b3BsZXNzIj48YSBocmVmPSJwdXBwZXQuaHRtbCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJuZXh0IGNoYXB0ZXIiPlVzaW5nIHJlY2xhc3Mgd2l0aCBQdXBwZXQ8L2E+PC9wPgorPGRpdiBpZD0ic2VhcmNoYm94IiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CisgIDxoMz5RdWljayBzZWFyY2g8L2gzPgorICAgIDxmb3JtIGNsYXNzPSJzZWFyY2giIGFjdGlvbj0ic2VhcmNoLmh0bWwiIG1ldGhvZD0iZ2V0Ij4KKyAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiAvPgorICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkdvIiAvPgorICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2hlY2tfa2V5d29yZHMiIHZhbHVlPSJ5ZXMiIC8+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhcmVhIiB2YWx1ZT0iZGVmYXVsdCIgLz4KKyAgICA8L2Zvcm0+CisgICAgPHAgY2xhc3M9InNlYXJjaHRpcCIgc3R5bGU9ImZvbnQtc2l6ZTogOTAlIj4KKyAgICBFbnRlciBzZWFyY2ggdGVybXMgb3IgYSBtb2R1bGUsIGNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUuCisgICAgPC9wPgorPC9kaXY+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JCgnI3NlYXJjaGJveCcpLnNob3coMCk7PC9zY3JpcHQ+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmVyIj48L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJyZWxhdGVkIj4KKyAgICAgIDxoMz5OYXZpZ2F0aW9uPC9oMz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweCI+CisgICAgICAgICAgPGEgaHJlZj0iZ2VuaW5kZXguaHRtbCIgdGl0bGU9IkdlbmVyYWwgSW5kZXgiCisgICAgICAgICAgICAgPmluZGV4PC9hPjwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJwdXBwZXQuaHRtbCIgdGl0bGU9IlVzaW5nIHJlY2xhc3Mgd2l0aCBQdXBwZXQiCisgICAgICAgICAgICAgPm5leHQ8L2E+IHw8L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0ic2FsdC5odG1sIiB0aXRsZT0iVXNpbmcgcmVjbGFzcyB3aXRoIFNhbHQiCisgICAgICAgICAgICAgPnByZXZpb3VzPC9hPiB8PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9ImluZGV4Lmh0bWwiPnJlY2xhc3M8L2E+ICZyYXF1bzs8L2xpPiAKKyAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZm9vdGVyIj4KKyAgICAgICAgJmNvcHk7IENvcHlyaWdodCAyMDEzLCBtYXJ0aW4gZi4ga3JhZmZ0LgorICAgICAgQ3JlYXRlZCB1c2luZyA8YSBocmVmPSJodHRwOi8vc3BoaW54LWRvYy5vcmcvIj5TcGhpbng8L2E+IDEuMi4zLgorICAgIDwvZGl2PgorICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2hhbmdlbG9nLmh0bWwgYi9jaGFuZ2Vsb2cuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmYyZGVhCi0tLSAvZGV2L251bGwKKysrIGIvY2hhbmdlbG9nLmh0bWwKQEAgLTAsMCArMSwxOTMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKworCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgIAorICAgIDx0aXRsZT5DaGFuZ2VMb2cgJm1kYXNoOyByZWNsYXNzIDEuNC4xIGRvY3VtZW50YXRpb248L3RpdGxlPgorICAgIAorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iX3N0YXRpYy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL3B5Z21lbnRzLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgCisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgdmFyIERPQ1VNRU5UQVRJT05fT1BUSU9OUyA9IHsKKyAgICAgICAgVVJMX1JPT1Q6ICAgICcuLycsCisgICAgICAgIFZFUlNJT046ICAgICAnMS40LjEnLAorICAgICAgICBDT0xMQVBTRV9JTkRFWDogZmFsc2UsCisgICAgICAgIEZJTEVfU1VGRklYOiAnLmh0bWwnLAorICAgICAgICBIQVNfU09VUkNFOiAgdHJ1ZQorICAgICAgfTsKKyAgICA8L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL2pxdWVyeS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy91bmRlcnNjb3JlLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL2RvY3Rvb2xzLmpzIj48L3NjcmlwdD4KKyAgICA8bGluayByZWw9InRvcCIgdGl0bGU9InJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbiIgaHJlZj0iaW5kZXguaHRtbCIgLz4KKyAgICA8bGluayByZWw9InByZXYiIHRpdGxlPSJyZWNsYXNzIHRvLWRvIGxpc3QiIGhyZWY9InRvZG8uaHRtbCIgLz4gCisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGRpdiBjbGFzcz0icmVsYXRlZCI+CisgICAgICA8aDM+TmF2aWdhdGlvbjwvaDM+CisgICAgICA8dWw+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHgiPgorICAgICAgICAgIDxhIGhyZWY9ImdlbmluZGV4Lmh0bWwiIHRpdGxlPSJHZW5lcmFsIEluZGV4IgorICAgICAgICAgICAgIGFjY2Vzc2tleT0iSSI+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InRvZG8uaHRtbCIgdGl0bGU9InJlY2xhc3MgdG8tZG8gbGlzdCIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9IlAiPnByZXZpb3VzPC9hPiB8PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9ImluZGV4Lmh0bWwiPnJlY2xhc3M8L2E+ICZyYXF1bzs8L2xpPiAKKyAgICAgIDwvdWw+CisgICAgPC9kaXY+ICAKKworICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50Ij4KKyAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50d3JhcHBlciI+CisgICAgICAgIDxkaXYgY2xhc3M9ImJvZHl3cmFwcGVyIj4KKyAgICAgICAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KKyAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iY2hhbmdlbG9nIj4KKzxoMT5DaGFuZ2VMb2c8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI2NoYW5nZWxvZyIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gxPgorPHRhYmxlIGJvcmRlcj0iMSIgY2xhc3M9ImRvY3V0aWxzIj4KKzxjb2xncm91cD4KKzxjb2wgd2lkdGg9IjEyJSIgLz4KKzxjb2wgd2lkdGg9IjEzJSIgLz4KKzxjb2wgd2lkdGg9Ijc1JSIgLz4KKzwvY29sZ3JvdXA+Cis8dGhlYWQgdmFsaWduPSJib3R0b20iPgorPHRyIGNsYXNzPSJyb3ctb2RkIj48dGggY2xhc3M9ImhlYWQiPlZlcnNpb248L3RoPgorPHRoIGNsYXNzPSJoZWFkIj5EYXRlPC90aD4KKzx0aCBjbGFzcz0iaGVhZCI+Q2hhbmdlczwvdGg+Cis8L3RyPgorPC90aGVhZD4KKzx0Ym9keSB2YWxpZ249InRvcCI+Cis8dHIgY2xhc3M9InJvdy1ldmVuIj48dGQ+MS40LjE8L3RkPgorPHRkPjIwMTQtMTAtMjg8L3RkPgorPHRkPjx1bCBjbGFzcz0iZmlyc3QgbGFzdCBzaW1wbGUiPgorPGxpPlJldmVydCBkZWJ1ZyBsb2dnaW5nLCB3aGljaCB3YXNuJiM4MjE3O3QgZmF1bHQtZnJlZSBhbmQgc28KK2l0IG5lZWRzIG1vcmUgdGltZSB0byBtYXR1cmUuPC9saT4KKzwvdWw+Cis8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0icm93LW9kZCI+PHRkPjEuNDwvdGQ+Cis8dGQ+MjAxNC0xMC0yNTwvdGQ+Cis8dGQ+PHVsIGNsYXNzPSJmaXJzdCBsYXN0IHNpbXBsZSI+Cis8bGk+QWRkIHJ1ZGltZW50YXJ5IGRlYnVnIGxvZ2dpbmc8L2xpPgorPGxpPlByZXZlbnQgaW50ZXJwb2xhdGUoKSBmcm9tIG92ZXJ3cml0aW5nIG1lcmdlZCB2YWx1ZXM8L2xpPgorPGxpPkxvb2sgZm9yICYjODIyMDtpbml0JiM4MjIxOyBpbnN0ZWFkIG9mICYjODIyMDtpbmRleCYjODIyMTsgd2hlbiBiZWluZyBmZWQKK2EgZGlyZWN0b3J5LjwvbGk+Cis8bGk+Rml4IGVycm9yIHJlcG9ydGluZyBvbiBub2RlIG5hbWUgY29sbGlzaW9uIGFjcm9zcworc3ViZGlyZWN0b3JpZXMuPC9saT4KKzwvdWw+Cis8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0icm93LWV2ZW4iPjx0ZD4xLjM8L3RkPgorPHRkPjIwMTQtMDMtMDE8L3RkPgorPHRkPjx1bCBjbGFzcz0iZmlyc3QgbGFzdCBzaW1wbGUiPgorPGxpPlNhbHQ6IHBpbGxhciBkYXRhIGZyb20gcHJldmlvdXMgcGlsbGFycyBhcmUgbm93CithdmFpbGFibGUgdG8gcmVjbGFzcyBwYXJhbWV0ZXIgaW50ZXJwb2xhdGlvbjwvbGk+Cis8bGk+eWFtbF9mczogY2xhc3NlcyBtYXkgYmUgZGVmaW5lZCBpbiBzdWJkaXJlY3RvcmllcworKGNsb3NlczogIzEyLCAjMTksICMyMCk8L2xpPgorPGxpPk1pZ3JhdGUgU2FsdCBhZGFwdGVyIHRvIG5ldyBjb3JlIEFQSSAoY2xvc2VzOiAjMTgpPC9saT4KKzxsaT5GaXggJiM4MjExO25vZGVpbmZvIGludm9jYXRpb24gaW4gZG9jcyAoY2xvc2VzOiAjMjEpPC9saT4KKzwvdWw+Cis8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0icm93LW9kZCI+PHRkPjEuMi4yPC90ZD4KKzx0ZD4yMDEzLTEyLTI3PC90ZD4KKzx0ZD48dWwgY2xhc3M9ImZpcnN0IGxhc3Qgc2ltcGxlIj4KKzxsaT5SZWN1cnNlIGNsYXNzZXMgb2J0YWluZWQgZnJvbSBjbGFzcyBtYXBwaW5ncworKGNsb3NlczogIzE2KTwvbGk+Cis8bGk+Rml4IGNsYXNzIG1hcHBpbmcgcmVnZXhwIHJlbmRlcmluZyBpbiBkb2NzCisoY2xvc2VzOiAjMTUpPC9saT4KKzwvdWw+Cis8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0icm93LWV2ZW4iPjx0ZD4xLjIuMTwvdGQ+Cis8dGQ+MjAxMy0xMi0yNjwvdGQ+Cis8dGQ+PHVsIGNsYXNzPSJmaXJzdCBsYXN0IHNpbXBsZSI+Cis8bGk+Rml4IFNhbHQgYWRhcHRlciB3cnQuIGNsYXNzIG1hcHBpbmdzCisoY2xvc2VzOiAjMTQpPC9saT4KKzwvdWw+Cis8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0icm93LW9kZCI+PHRkPjEuMjwvdGQ+Cis8dGQ+MjAxMy0xMi0xMDwvdGQ+Cis8dGQ+PHVsIGNsYXNzPSJmaXJzdCBsYXN0IHNpbXBsZSI+Cis8bGk+SW50cm9kdWNlIGNsYXNzIG1hcHBpbmdzIChzZWUgPGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0ib3BlcmF0aW9ucy5odG1sIj48ZW0+cmVjbGFzcyBvcGVyYXRpb25zPC9lbT48L2E+KQorKGNsb3NlczogIzUpPC9saT4KKzxsaT5GaXggcGFyYW1ldGVyIGludGVycG9sYXRpb24gYWNyb3NzIG1lcmdlZCBsaXN0cworKGNsb3NlczogIzEzKS48L2xpPgorPGxpPkNhY2hpbmcgb2YgY2xhc3NlcyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgZXNwZWNpYWxseQorZHVyaW5nIHRoZSBpbnZlbnRvcnkgcnVuczwvbGk+Cis8bGk+eWFtbF9mczogbm9kZXMgbWF5IGJlIGRlZmluZWQgaW4gc3ViZGlyZWN0b3JpZXMKKyhjbG9zZXM6ICMxMCkuPC9saT4KKzxsaT5DbGFzc2VzIGFuZCBub2RlcyBVUkkgbXVzdCBub3Qgb3ZlcmxhcCBhbnltb3JlPC9saT4KKzxsaT5DbGFzcyBuYW1lcyBtdXN0IG5vdCBjb250YWluIHNwYWNlczwvbGk+Cis8L3VsPgorPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9InJvdy1ldmVuIj48dGQ+MS4xPC90ZD4KKzx0ZD4yMDEzLTA4LTI4PC90ZD4KKzx0ZD5TYWx0IGFkYXB0ZXI6IGZpeCBpbnRlcmZhY2UgdG8gaW5jbHVkZSBtaW5pb25faWQsIGZpbHRlcgorb3V0cHV0IGFjY29yZGluZ2x5OyBmaXhlcyBtYXN0ZXJfdG9wczwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJyb3ctb2RkIj48dGQ+MS4wLjI8L3RkPgorPHRkPjIwMTMtMDgtMjc8L3RkPgorPHRkPkZpeCBpbmNvcnJlY3QgdmVyc2lvbmluZyBpbiBzZXR1cHRvb2xzPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9InJvdy1ldmVuIj48dGQ+MS4wLjE8L3RkPgorPHRkPjIwMTMtMDgtMjc8L3RkPgorPHRkPkRvY3VtZW50YXRpb24gdXBkYXRlcywgbmV3IGhvbWVwYWdlPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9InJvdy1vZGQiPjx0ZD4xLjA8L3RkPgorPHRkPjIwMTMtMDgtMjY8L3RkPgorPHRkPkluaXRpYWwgcmVsZWFzZTwvdGQ+Cis8L3RyPgorPC90Ym9keT4KKzwvdGFibGU+Cis8L2Rpdj4KKworCisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic3BoaW54c2lkZWJhcndyYXBwZXIiPgorICA8aDQ+UHJldmlvdXMgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0idG9kby5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9InByZXZpb3VzIGNoYXB0ZXIiPnJlY2xhc3MgdG8tZG8gbGlzdDwvYT48L3A+Cis8ZGl2IGlkPSJzZWFyY2hib3giIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KKyAgPGgzPlF1aWNrIHNlYXJjaDwvaDM+CisgICAgPGZvcm0gY2xhc3M9InNlYXJjaCIgYWN0aW9uPSJzZWFyY2guaHRtbCIgbWV0aG9kPSJnZXQiPgorICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InEiIC8+CisgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iIC8+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaGVja19rZXl3b3JkcyIgdmFsdWU9InllcyIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFyZWEiIHZhbHVlPSJkZWZhdWx0IiAvPgorICAgIDwvZm9ybT4KKyAgICA8cCBjbGFzcz0ic2VhcmNodGlwIiBzdHlsZT0iZm9udC1zaXplOiA5MCUiPgorICAgIEVudGVyIHNlYXJjaCB0ZXJtcyBvciBhIG1vZHVsZSwgY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZS4KKyAgICA8L3A+Cis8L2Rpdj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4kKCcjc2VhcmNoYm94Jykuc2hvdygwKTs8L3NjcmlwdD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZXIiPjwvZGl2PgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICA+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InRvZG8uaHRtbCIgdGl0bGU9InJlY2xhc3MgdG8tZG8gbGlzdCIKKyAgICAgICAgICAgICA+cHJldmlvdXM8L2E+IHw8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmb290ZXIiPgorICAgICAgICAmY29weTsgQ29weXJpZ2h0IDIwMTMsIG1hcnRpbiBmLiBrcmFmZnQuCisgICAgICBDcmVhdGVkIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9zcGhpbngtZG9jLm9yZy8iPlNwaGlueDwvYT4gMS4yLjMuCisgICAgPC9kaXY+CisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb25jZXB0cy5odG1sIGIvY29uY2VwdHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWZhYzgwCi0tLSAvZGV2L251bGwKKysrIGIvY29uY2VwdHMuaHRtbApAQCAtMCwwICsxLDIyNyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKKyAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorCisKKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgCisgICAgPHRpdGxlPnJlY2xhc3MgY29uY2VwdHMgJm1kYXNoOyByZWNsYXNzIDEuNC4xIGRvY3VtZW50YXRpb248L3RpdGxlPgorICAgIAorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iX3N0YXRpYy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL3B5Z21lbnRzLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgCisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgdmFyIERPQ1VNRU5UQVRJT05fT1BUSU9OUyA9IHsKKyAgICAgICAgVVJMX1JPT1Q6ICAgICcuLycsCisgICAgICAgIFZFUlNJT046ICAgICAnMS40LjEnLAorICAgICAgICBDT0xMQVBTRV9JTkRFWDogZmFsc2UsCisgICAgICAgIEZJTEVfU1VGRklYOiAnLmh0bWwnLAorICAgICAgICBIQVNfU09VUkNFOiAgdHJ1ZQorICAgICAgfTsKKyAgICA8L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL2pxdWVyeS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy91bmRlcnNjb3JlLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL2RvY3Rvb2xzLmpzIj48L3NjcmlwdD4KKyAgICA8bGluayByZWw9InRvcCIgdGl0bGU9InJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbiIgaHJlZj0iaW5kZXguaHRtbCIgLz4KKyAgICA8bGluayByZWw9Im5leHQiIHRpdGxlPSJyZWNsYXNzIG9wZXJhdGlvbnMiIGhyZWY9Im9wZXJhdGlvbnMuaHRtbCIgLz4KKyAgICA8bGluayByZWw9InByZXYiIHRpdGxlPSJJbnN0YWxsYXRpb24iIGhyZWY9Imluc3RhbGwuaHRtbCIgLz4gCisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGRpdiBjbGFzcz0icmVsYXRlZCI+CisgICAgICA8aDM+TmF2aWdhdGlvbjwvaDM+CisgICAgICA8dWw+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHgiPgorICAgICAgICAgIDxhIGhyZWY9ImdlbmluZGV4Lmh0bWwiIHRpdGxlPSJHZW5lcmFsIEluZGV4IgorICAgICAgICAgICAgIGFjY2Vzc2tleT0iSSI+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9Im9wZXJhdGlvbnMuaHRtbCIgdGl0bGU9InJlY2xhc3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9Ik4iPm5leHQ8L2E+IHw8L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0iaW5zdGFsbC5odG1sIiB0aXRsZT0iSW5zdGFsbGF0aW9uIgorICAgICAgICAgICAgIGFjY2Vzc2tleT0iUCI+cHJldmlvdXM8L2E+IHw8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4gIAorCisgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQiPgorICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnR3cmFwcGVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYm9keXdyYXBwZXIiPgorICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJyZWNsYXNzLWNvbmNlcHRzIj4KKzxoMT5yZWNsYXNzIGNvbmNlcHRzPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNyZWNsYXNzLWNvbmNlcHRzIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDE+Cis8cD48c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gYXNzdW1lcyBhIG5vZGUtY2VudHJpYyBwZXJzcGVjdGl2ZSBpbnRvIHlvdXIgaW52ZW50b3J5LiBUaGlzIGlzCitvYnZpb3VzIHdoZW4geW91IHF1ZXJ5IDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBmb3Igbm9kZS1zcGVjaWZpYyBpbmZvcm1hdGlvbiwgYnV0IGl0IG1pZ2h0IG5vdAorYmUgY2xlYXIgd2hlbiB5b3UgYXNrIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiB0byBwcm92aWRlIHlvdSB3aXRoIGEgbGlzdCBvZiBncm91cHMuIEluIHRoYXQKK2Nhc2UsIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBsb29wcyBvdmVyIGFsbCBub2RlcyBpdCBjYW4gZmluZCBpbiBpdHMgZGF0YWJhc2UsIHJlYWRzIGFsbAoraW5mb3JtYXRpb24gaXQgY2FuIGZpbmQgYWJvdXQgdGhlIG5vZGVzLCBhbmQgZmluYWxseSByZW9yZGVycyB0aGUgcmVzdWx0IHRvCitwcm92aWRlIGEgbGlzdCBvZiBncm91cHMgd2l0aCB0aGUgbm9kZXMgdGhleSBjb250YWluLjwvcD4KKzxwPlNpbmNlIHRoZSB0ZXJtICYjODIyMDtncm91cHMmIzgyMjE7IGlzIHNvbWV3aGF0IGFtYmlndW91cywgaXQgaGVscHMgdG8gc3RhcnQgb2ZmIHdpdGgKK2Egc2hvcnQgZ2xvc3Nhcnkgb2YgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+LXNwZWNpZmljIHRlcm1pbm9sb2d5OjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNsYXNzPSJkb2N1dGlscyI+Cis8Y29sZ3JvdXA+Cis8Y29sIHdpZHRoPSIxNiUiIC8+Cis8Y29sIHdpZHRoPSI4NCUiIC8+Cis8L2NvbGdyb3VwPgorPHRoZWFkIHZhbGlnbj0iYm90dG9tIj4KKzx0ciBjbGFzcz0icm93LW9kZCI+PHRoIGNsYXNzPSJoZWFkIj5Db25jZXB0PC90aD4KKzx0aCBjbGFzcz0iaGVhZCI+RGVzY3JpcHRpb248L3RoPgorPC90cj4KKzwvdGhlYWQ+Cis8dGJvZHkgdmFsaWduPSJ0b3AiPgorPHRyIGNsYXNzPSJyb3ctZXZlbiI+PHRkPm5vZGU8L3RkPgorPHRkPkEgbm9kZSwgdXN1YWxseSBhIGNvbXB1dGVyIGluIHlvdXIgaW5mcmFzdHJ1Y3R1cmU8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0icm93LW9kZCI+PHRkPmNsYXNzPC90ZD4KKzx0ZD5BIGNhdGVnb3J5LCB0YWcsIGZlYXR1cmUsIG9yIHJvbGUgdGhhdCBhcHBsaWVzIHRvIGEgbm9kZQorQ2xhc3NlcyBtYXkgYmUgbmVzdGVkLCBpLmUuIHRoZXJlIGNhbiBiZSBhIGNsYXNzIGhpZXJhcmNoeTwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJyb3ctZXZlbiI+PHRkPmFwcGxpY2F0aW9uPC90ZD4KKzx0ZD5BIHNwZWNpZmljIHNldCBvZiBiZWhhdmlvdXIgdG8gYXBwbHk8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0icm93LW9kZCI+PHRkPnBhcmFtZXRlcjwvdGQ+Cis8dGQ+Tm9kZS1zcGVjaWZpYyB2YXJpYWJsZXMsIHdpdGggaW5oZXJpdGFuY2UgdGhyb3VnaG91dCB0aGUgY2xhc3MKK2hpZXJhcmNoeS48L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorPHA+QSBjbGFzcyBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgcGFyZW50IGNsYXNzZXMsIHplcm8gb3IgbW9yZSBhcHBsaWNhdGlvbnMsCithbmQgYW55IG51bWJlciBvZiBwYXJhbWV0ZXJzLjwvcD4KKzxwPkEgY2xhc3MgbmFtZSBtdXN0IG5vdCBjb250YWluIHNwYWNlcy48L3A+Cis8cD5BIG5vZGUgaXMgYWxtb3N0IGVxdWl2YWxlbnQgdG8gYSBjbGFzcywgZXhjZXB0IHRoYXQgaXQgdXN1YWxseSBkb2VzIG5vdCAoYnV0CitjYW4pIHNwZWNpZnkgYXBwbGljYXRpb25zLjwvcD4KKzxwPldoZW4gPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IHBhcnNlcyBhIG5vZGUgKG9yIGNsYXNzKSBkZWZpbml0aW9uIGFuZCBlbmNvdW50ZXJzIGEgcGFyZW50CitjbGFzcywgaXQgcmVjdXJzZXMgdG8gdGhpcyBwYXJlbnQgY2xhc3MgZmlyc3QgYmVmb3JlIHJlYWRpbmcgYW55IGRhdGEgb2YgdGhlCitub2RlIChvciBjbGFzcykuIFdoZW4gPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IHJldHVybnMgZnJvbSB0aGUgcmVjdXJzaXZlLCBkZXB0aCBmaXJzdCB3YWxrLCBpdAordGhlbiBtZXJnZXMgYWxsIGluZm9ybWF0aW9uIG9mIHRoZSBjdXJyZW50IG5vZGUgKG9yIGNsYXNzKSBpbnRvIHRoZQoraW5mb3JtYXRpb24gaXQgb2J0YWluZWQgZHVyaW5nIHRoZSByZWN1cnNpb24uPC9wPgorPHA+RnVydGhlcm1vcmUsIGEgbm9kZSAob3IgY2xhc3MpIG1heSBkZWZpbmUgYSBsaXN0IG9mIGNsYXNzZXMgaXQgZGVyaXZlcyBmcm9tLAoraW4gd2hpY2ggY2FzZSBjbGFzc2VzIGRlZmluZWQgZnVydGhlciBkb3duIHRoZSBsaXN0IHdpbGwgYmUgYWJsZSB0byBvdmVycmlkZQorY2xhc3NlcyBmdXJ0aGVyIHVwIHRoZSBsaXN0LjwvcD4KKzxwPkluZm9ybWF0aW9uIGluIHRoaXMgY29udGV4dCBpcyBlc3NlbnRpYWxseSBvbmUgb2YgYSBsaXN0IG9mIGFwcGxpY2F0aW9ucyBvcgorYSBsaXN0IG9mIHBhcmFtZXRlcnMuPC9wPgorPHA+VGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIGRlcHRoLWZpcnN0IHdhbGsgYW5kIHRoZSBkZWxheWVkIG1lcmdpbmcgb2YgZGF0YQorbWVhbnMgdGhhdCB0aGUgbm9kZSAoYW5kIGFueSBjbGFzcykgbWF5IG92ZXJyaWRlIGFueSBvZiB0aGUgZGF0YSBkZWZpbmVkIGJ5Cithbnkgb2YgdGhlIHBhcmVudCBjbGFzc2VzIChhbmNlc3RvcnMpLiBUaGlzIGlzIGluIGxpbmUgd2l0aCB0aGUgYXNzdW1wdGlvbgordGhhdCBtb3JlIHNwZWNpZmljIGRlZmluaXRpb25zICgmIzgyMjA7dGhpcyBzcGVjaWZpYyBob3N0JiM4MjIxOykgc2hvdWxkIGhhdmUgYSBoaWdoZXIKK3ByZWNlZGVuY2UgdGhhbiBtb3JlIGdlbmVyYWwgZGVmaW5pdGlvbnMgKCYjODIyMDthbGwgd2Vic2VydmVycyYjODIyMTssIHdoaWNoIGluY2x1ZGVzIGFsbAord2Vic2VydmVycyBpbiBNdW5pY2gsIHdoaWNoIGluY2x1ZGVzICYjODIyMDt0aGlzIHNwZWNpZmljIGhvc3QmIzgyMjE7LCBmb3IgZXhhbXBsZSkuPC9wPgorPHA+SGVyZSYjODIxNztzIGEgcXVpY2sgZXhhbXBsZSwgc2hvd2luZyBob3cgcGFyYW1ldGVycyBhY2N1bXVsYXRlIGFuZCBjYW4gZ2V0CityZXBsYWNlZC48L3A+Cis8YmxvY2txdW90ZT4KKzxkaXY+PHA+QWxsICYjODIyMDt1bml4bm9kZXMmIzgyMjE7IChpLmUuIG5vZGVzIHdobyBoYXZlIHRoZSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnVuaXhub2RlPC9zcGFuPjwvdHQ+IGNsYXNzIGluIHRoZWlyCithbmNlc3RyeSkgaGF2ZSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi9ldGMvbW90ZDwvc3Bhbj48L3R0PiBjZW50cmFsbHktbWFuYWdlZCAodGhyb3VnaCB0aGUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5tb3RkPC9zcGFuPjwvdHQ+CithcHBsaWNhdGlvbiksIGFuZCB0aGUgPGNpdGU+dW5peG5vZGU8L2NpdGU+IGNsYXNzIGRlZmluaXRpb24gcHJvdmlkZXMgYSBnZW5lcmljCittZXNzYWdlLW9mLXRoZS1kYXkgdG8gYmUgcHV0IGludG8gdGhpcyBmaWxlLjwvcD4KKzxwPkFsbCBkZXNjZW5kYW50cyBvZiB0aGUgY2xhc3MgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5kZWJpYW5ub2RlPC9zcGFuPjwvdHQ+LCBhIGRlc2NlbmRhbnQgb2YgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj51bml4bm9kZTwvc3Bhbj48L3R0PiwKK3Nob3VsZCBpbmNsdWRlIHRoZSBEZWJpYW4gY29kZW5hbWUgaW4gdGhpcyBtZXNzYWdlLCBzbyB0aGUKK21lc3NhZ2Utb2YtdGhlLWRheSBpcyBvdmVyd3JpdHRlbiBpbiB0aGUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5kZWJpYW5ub2Rlczwvc3Bhbj48L3R0PiBjbGFzcy48L3A+Cis8cD5UaGUgbm9kZSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnF1YW50dW0uZXhhbXBsZS5vcmc8L3NwYW4+PC90dD4gKGEgPGNpdGU+ZGViaWFubm9kZTwvY2l0ZT4pIHdpbGwgaGF2ZSBhIHNjaGVkdWxlZAorZG93bnRpbWUgdGhpcyB3ZWVrZW5kLCBzbyB1bnRpbCBNb25kYXksIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2Utb2YtdGhlLWRheSBpcworYWRkZWQgdG8gdGhlIG5vZGUgZGVmaW5pdGlvbi48L3A+Cis8cD5XaGVuIHRoZSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPm1vdGQ8L3NwYW4+PC90dD4gYXBwbGljYXRpb24gcnVucywgaXQgcmVjZWl2ZXMgdGhlIGFwcHJvcHJpYXRlCittZXNzYWdlLW9mLXRoZS1kYXkgKGZyb20gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5xdWFudHVtLmV4YW1wbGUub3JnPC9zcGFuPjwvdHQ+IHdoZW4gcnVuIG9uIHRoYXQgbm9kZSkgYW5kCit3cml0ZXMgaXQgaW50byA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi9ldGMvbW90ZDwvc3Bhbj48L3R0Pi48L3A+Cis8L2Rpdj48L2Jsb2NrcXVvdGU+Cis8cD5BdCB0aGlzIHBvaW50IGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHBhcmFtZXRlcnMgd2hvc2UgdmFsdWVzIGFyZSBsaXN0cyBvcgora2V5LXZhbHVlIHBhaXJzIGRvbiYjODIxNzt0IGdldCBvdmVyd3JpdHRlbiBieSBjaGlsZHJlbiBjbGFzc2VzIG9yIG5vZGUgZGVmaW5pdGlvbnMsCitidXQgdGhlIGluZm9ybWF0aW9uIGdldHMgbWVyZ2VkIChyZWN1cnNpdmVseSkgaW5zdGVhZC48L3A+Cis8cD5TaW1pbGFybHkgdG8gcGFyYW1ldGVycywgYXBwbGljYXRpb25zIGFsc28gYWNjdW11bGF0ZSBkdXJpbmcgdGhlIHJlY3Vyc2l2ZQord2FsayB0aHJvdWdoIHRoZSBjbGFzcyBhbmNlc3RyeS4gSXQgaXMgcG9zc2libGUgZm9yIGEgbm9kZSBvciBjaGlsZCBjbGFzcyB0bworPGVtPnJlbW92ZTwvZW0+IGFuIGFwcGxpY2F0aW9uIGFkZGVkIGJ5IGEgcGFyZW50IGNsYXNzLCBieSBwcmVmaXhpbmcgdGhlIGFwcGxpY2F0aW9uCit3aXRoIDxjaXRlPn48L2NpdGU+LjwvcD4KKzxwPkZpbmFsbHksIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBoYXBwaWx5IGxldHMgeW91IHVzZSBtdWx0aXBsZSBpbmhlcml0YW5jZSwgYW5kIGVuc3VyZXMgdGhhdAordGhlIHJlc29sdXRpb24gb2YgcGFyYW1ldGVycyBpcyBzdGlsbCB3ZWxsLWRlZmluZWQuIEhlcmUmIzgyMTc7cyBhbm90aGVyIGV4YW1wbGUKK2J1aWxkaW5nIHVwb24gdGhlIG9uZSBhYm91dCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi9ldGMvbW90ZDwvc3Bhbj48L3R0PiBhYm92ZTo8L3A+Cis8YmxvY2txdW90ZT4KKzxkaXY+PHA+PHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5xdWFudHVtLmV4YW1wbGUub3JnPC9zcGFuPjwvdHQ+ICh3aGljaCBpcyBiYWNrIHVwIGFuZCB0aGVyZWZvcmUgaXRzIG5vZGUgZGVmaW5pdGlvbgorbm8gbG9uZ2VyIGNvbnRhaW5zIGEgbWVzc2FnZS1vZi10aGUtZGF5KSBpcyBhdCBhIHNpdGUgaW4gTXVuaWNoLiBUaGVyZWZvcmUsCitpdCBpcyBhIGNoaWxkIG9mIHRoZSBjbGFzcyA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmhvc3RlZCYjNjQ7bXVuaWNoPC9zcGFuPjwvdHQ+LiBUaGlzIGNsYXNzIGlzIGluZGVwZW5kZW50IG9mCit0aGUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj51bml4bm9kZTwvc3Bhbj48L3R0PiBoaWVyYXJjaHksIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+cXVhbnR1bS5leGFtcGxlLm9yZzwvc3Bhbj48L3R0PiBkZXJpdmVzIGZyb20gYm90aC48L3A+Cis8cD5JbiB0aGlzIGV4YW1wbGUgaW5mcmFzdHJ1Y3R1cmUsIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+aG9zdGVkJiM2NDttdW5pY2g8L3NwYW4+PC90dD4gaXMgbW9yZSBzcGVjaWZpYyB0aGFuCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmRlYmlhbm5vZGU8L3NwYW4+PC90dD4gYmVjYXVzZSB0aGVyZSBhcmUgcGxlbnR5IG9mIERlYmlhbiBub2RlcyBhdCBvdGhlciBzaXRlcyAoYW5kCitzb21lIG5vbi1EZWJpYW4gbm9kZXMgaW4gTXVuaWNoKS4gVGhlcmVmb3JlLCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnF1YW50dW0uZXhhbXBsZS5vcmc8L3NwYW4+PC90dD4gZGVyaXZlcworZnJvbSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmhvc3RlZCYjNjQ7bXVuaWNoPC9zcGFuPjwvdHQ+IF9hZnRlcl8gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5kZWJpYW5ub2Rlczwvc3Bhbj48L3R0Pi48L3A+Cis8cD5XaGVuIGFuIGVsZWN0cmljaXR5IG91dGFnZSBpcyBleHBlY3RlZCBvdmVyIHRoZSB3ZWVrZW5kIGluIE11bmljaCwgdGhlIGFkbWluCitjYW4gY2hhbmdlIHRoZSBtZXNzYWdlLW9mLXRoZS1kYXkgaW4gdGhlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+aG9zdGVkJiM2NDttdW5pY2g8L3NwYW4+PC90dD4gY2xhc3MsIGFuZCBpdAord2lsbCBhcHBseSB0byBhbGwgaG9zdHMgaW4gTXVuaWNoLjwvcD4KKzxwPkhvd2V2ZXIsIG5vdCBhbGwgaG9zdHMgaW4gTXVuaWNoIGhhdmUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vZXRjL21vdGQ8L3NwYW4+PC90dD4sIGJlY2F1c2Ugc29tZSBvZiB0aGVtCithcmUgb2YgY2xhc3MgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj53aW5kb3dzbm9kZTwvc3Bhbj48L3R0Pi4gU2luY2UgdGhlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+d2luZG93c25vZGU8L3NwYW4+PC90dD4gYW5jZXN0cnkgZG9lcyBub3QKK3NwZWNpZnkgdGhlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+bW90ZDwvc3Bhbj48L3R0PiBhcHBsaWNhdGlvbiwgdGhvc2UgaG9zdHMgaGF2ZSBhY2Nlc3MgdG8gdGhlCittZXNzYWdlLW9mLXRoZS1kYXkgaW4gdGhlIG5vZGUgdmFyaWFibGVzLCBidXQgdGhlIG1lc3NhZ2Ugd29uJiM4MjE3O3QgZ2V0IHVzZWTigKY8L3A+Cis8cD7igKYgdW5sZXNzLCBvZiBjb3Vyc2UsIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+d2luZG93c25vZGU8L3NwYW4+PC90dD4gc3BlY2lmaWVkIGEgV2luZG93cy1zcGVjaWZpYworYXBwbGljYXRpb24gdG8gYnJpbmcgc3VjaCBub3RpY2VzIHRvIHRoZSBhdHRlbnRpb24gb2YgdGhlIHVzZXIuPC9wPgorPC9kaXY+PC9ibG9ja3F1b3RlPgorPHA+SXQmIzgyMTc7cyBhbHNvIHRyaXZpYWwgdG8gZW5zdXJlIGEgY2VydGFpbiBvcmRlciBvZiBjbGFzcyBldmFsdWF0aW9uLiBIZXJlJiM4MjE3O3MKK2Fub3RoZXIgZXhhbXBsZTo8L3A+Cis8YmxvY2txdW90ZT4KKzxkaXY+PHA+VGhlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+c3NoLnNlcnZlcjwvc3Bhbj48L3R0PiBjbGFzcyBkZWZpbmVzIHRoZSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnBlcm1pdF9yb290X2xvZ2luPC9zcGFuPjwvdHQ+IHBhcmFtZXRlciB0byA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPm5vPC9zcGFuPjwvdHQ+LjwvcD4KKzxwPlRoZSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmJhY2t1cHBjLmNsaWVudDwvc3Bhbj48L3R0PiBjbGFzcyBkZWZpbmVzIHRoZSBwYXJhbWV0ZXIgdG8gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj53aXRob3V0LXBhc3N3b3JkPC9zcGFuPjwvdHQ+LAorYmVjYXVzZSB0aGUgQmFja3VwUEMgc2VydmVyIG1pZ2h0IG5lZWQgdG8gbG9nIGluIHRvIHRoZSBob3N0IGFzIHJvb3QuPC9wPgorPHA+Tm93LCB3aGF0IGhhcHBlbnMgaWYgdGhlIGFkbWluIGFjY2lkZW50YWxseSBwcm92aWRlcyB0aGUgZm9sbG93aW5nIHR3bworY2xhc3Nlcz88L3A+Cis8dWwgY2xhc3M9InNpbXBsZSI+Cis8bGk+PHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5iYWNrdXBwYy5jbGllbnQ8L3NwYW4+PC90dD48L2xpPgorPGxpPjx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+c3NoLnNlcnZlcjwvc3Bhbj48L3R0PjwvbGk+Cis8L3VsPgorPHA+VGhlb3JldGljYWxseSwgdGhpcyB3b3VsZCBtZWFuIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+cGVybWl0X3Jvb3RfbG9naW48L3NwYW4+PC90dD4gZ2V0cyBzZXQgdG8gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5ubzwvc3Bhbj48L3R0Pi48L3A+Cis8cD5Ib3dldmVyLCBzaW5jZSBhbGwgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5iYWNrdXBwYy5jbGllbnQ8L3NwYW4+PC90dD4gbm9kZXMgbmVlZCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnNzaC5zZXJ2ZXI8L3NwYW4+PC90dD4gKGF0IGxlYXN0CitpbiBtb3N0IHNldHVwcyksIHRoZSBjbGFzcyA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmJhY2t1cHBjLmNsaWVudDwvc3Bhbj48L3R0PiBpdHNlbGYgZGVyaXZlcyBmcm9tCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnNzaC5zZXJ2ZXI8L3NwYW4+PC90dD4sIGVuc3VyaW5nIHRoYXQgaXQgZ2V0cyBwYXJzZWQgYmVmb3JlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+YmFja3VwcGMuY2xpZW50PC9zcGFuPjwvdHQ+LjwvcD4KKzxwPldoZW4gPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IHJldHVybnMgdG8gdGhlIG5vZGUgYW5kIGVuY291bnRlcnMgdGhlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+c3NoLnNlcnZlcjwvc3Bhbj48L3R0PiBjbGFzcworZGVmaW5lZCB0aGVyZSwgaXQgc2ltcGx5IHNraXBzIGl0LCBhcyBpdCYjODIxNztzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuPC9wPgorPC9kaXY+PC9ibG9ja3F1b3RlPgorPHA+Tm93IHJlYWQgYWJvdXQgPGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0ib3BlcmF0aW9ucy5odG1sIj48ZW0+cmVjbGFzcyBvcGVyYXRpb25zPC9lbT48L2E+ITwvcD4KKzwvZGl2PgorCisKKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9InNwaGlueHNpZGViYXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyd3JhcHBlciI+CisgIDxoND5QcmV2aW91cyB0b3BpYzwvaDQ+CisgIDxwIGNsYXNzPSJ0b3BsZXNzIj48YSBocmVmPSJpbnN0YWxsLmh0bWwiCisgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0icHJldmlvdXMgY2hhcHRlciI+SW5zdGFsbGF0aW9uPC9hPjwvcD4KKyAgPGg0Pk5leHQgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0ib3BlcmF0aW9ucy5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Im5leHQgY2hhcHRlciI+cmVjbGFzcyBvcGVyYXRpb25zPC9hPjwvcD4KKzxkaXYgaWQ9InNlYXJjaGJveCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgorICA8aDM+UXVpY2sgc2VhcmNoPC9oMz4KKyAgICA8Zm9ybSBjbGFzcz0ic2VhcmNoIiBhY3Rpb249InNlYXJjaC5odG1sIiBtZXRob2Q9ImdldCI+CisgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJHbyIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNoZWNrX2tleXdvcmRzIiB2YWx1ZT0ieWVzIiAvPgorICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYXJlYSIgdmFsdWU9ImRlZmF1bHQiIC8+CisgICAgPC9mb3JtPgorICAgIDxwIGNsYXNzPSJzZWFyY2h0aXAiIHN0eWxlPSJmb250LXNpemU6IDkwJSI+CisgICAgRW50ZXIgc2VhcmNoIHRlcm1zIG9yIGEgbW9kdWxlLCBjbGFzcyBvciBmdW5jdGlvbiBuYW1lLgorICAgIDwvcD4KKzwvZGl2PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiQoJyNzZWFyY2hib3gnKS5zaG93KDApOzwvc2NyaXB0PgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0iY2xlYXJlciI+PC9kaXY+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0icmVsYXRlZCI+CisgICAgICA8aDM+TmF2aWdhdGlvbjwvaDM+CisgICAgICA8dWw+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHgiPgorICAgICAgICAgIDxhIGhyZWY9ImdlbmluZGV4Lmh0bWwiIHRpdGxlPSJHZW5lcmFsIEluZGV4IgorICAgICAgICAgICAgID5pbmRleDwvYT48L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0ib3BlcmF0aW9ucy5odG1sIiB0aXRsZT0icmVjbGFzcyBvcGVyYXRpb25zIgorICAgICAgICAgICAgID5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9Imluc3RhbGwuaHRtbCIgdGl0bGU9Ikluc3RhbGxhdGlvbiIKKyAgICAgICAgICAgICA+cHJldmlvdXM8L2E+IHw8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmb290ZXIiPgorICAgICAgICAmY29weTsgQ29weXJpZ2h0IDIwMTMsIG1hcnRpbiBmLiBrcmFmZnQuCisgICAgICBDcmVhdGVkIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9zcGhpbngtZG9jLm9yZy8iPlNwaGlueDwvYT4gMS4yLjMuCisgICAgPC9kaXY+CisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb25maWdmaWxlLmh0bWwgYi9jb25maWdmaWxlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxMjQxMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ2ZpbGUuaHRtbApAQCAtMCwwICsxLDEzMCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKKyAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorCisKKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgCisgICAgPHRpdGxlPnJlY2xhc3MgY29uZmlndXJhdGlvbiBmaWxlICZtZGFzaDsgcmVjbGFzcyAxLjQuMSBkb2N1bWVudGF0aW9uPC90aXRsZT4KKyAgICAKKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9zdGF0aWMvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iX3N0YXRpYy9weWdtZW50cy5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgIAorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgIHZhciBET0NVTUVOVEFUSU9OX09QVElPTlMgPSB7CisgICAgICAgIFVSTF9ST09UOiAgICAnLi8nLAorICAgICAgICBWRVJTSU9OOiAgICAgJzEuNC4xJywKKyAgICAgICAgQ09MTEFQU0VfSU5ERVg6IGZhbHNlLAorICAgICAgICBGSUxFX1NVRkZJWDogJy5odG1sJywKKyAgICAgICAgSEFTX1NPVVJDRTogIHRydWUKKyAgICAgIH07CisgICAgPC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy9qcXVlcnkuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvdW5kZXJzY29yZS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy9kb2N0b29scy5qcyI+PC9zY3JpcHQ+CisgICAgPGxpbmsgcmVsPSJ0b3AiIHRpdGxlPSJyZWNsYXNzIDEuNC4xIGRvY3VtZW50YXRpb24iIGhyZWY9ImluZGV4Lmh0bWwiIC8+CisgICAgPGxpbmsgcmVsPSJuZXh0IiB0aXRsZT0iVXNpbmcgcmVjbGFzcyB3aXRoIFNhbHQiIGhyZWY9InNhbHQuaHRtbCIgLz4KKyAgICA8bGluayByZWw9InByZXYiIHRpdGxlPSJyZWNsYXNzIG1hbnBhZ2UiIGhyZWY9Im1hbnBhZ2UuaHRtbCIgLz4gCisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGRpdiBjbGFzcz0icmVsYXRlZCI+CisgICAgICA8aDM+TmF2aWdhdGlvbjwvaDM+CisgICAgICA8dWw+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHgiPgorICAgICAgICAgIDxhIGhyZWY9ImdlbmluZGV4Lmh0bWwiIHRpdGxlPSJHZW5lcmFsIEluZGV4IgorICAgICAgICAgICAgIGFjY2Vzc2tleT0iSSI+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InNhbHQuaHRtbCIgdGl0bGU9IlVzaW5nIHJlY2xhc3Mgd2l0aCBTYWx0IgorICAgICAgICAgICAgIGFjY2Vzc2tleT0iTiI+bmV4dDwvYT4gfDwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJtYW5wYWdlLmh0bWwiIHRpdGxlPSJyZWNsYXNzIG1hbnBhZ2UiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJQIj5wcmV2aW91czwvYT4gfDwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PiAgCisKKyAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudCI+CisgICAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudHdyYXBwZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJib2R5d3JhcHBlciI+CisgICAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+CisgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InJlY2xhc3MtY29uZmlndXJhdGlvbi1maWxlIj4KKzxoMT5yZWNsYXNzIGNvbmZpZ3VyYXRpb24gZmlsZTxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjcmVjbGFzcy1jb25maWd1cmF0aW9uLWZpbGUiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMT4KKzxwPjxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBjYW4gcmVhZCBzb21lIG9mIGl0cyBjb25maWd1cmF0aW9uIGZyb20gYSBmaWxlLiBUaGUgZmlsZSBpcworYSBZQU1MLWZpbGUgYW5kIHNpbXBseSBkZWZpbmVzIGtleS12YWx1ZSBwYWlycy48L3A+Cis8cD5UaGUgY29uZmlndXJhdGlvbiBmaWxlIGNhbiBiZSB1c2VkIHRvIHNldCBkZWZhdWx0cyBmb3IgYWxsIHRoZSBvcHRpb25zIHRoYXQKK2FyZSBvdGhlcndpc2UgY29uZmlndXJhYmxlIHZpYSB0aGUgY29tbWFuZC1saW5lIGludGVyZmFjZSwgc28gcGxlYXNlIHVzZSB0aGUKKzx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+LS1oZWxwPC9zcGFuPjwvdHQ+IG91dHB1dCBvZiA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gKG9yIHRoZSA8YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJtYW5wYWdlLmh0bWwiPjxlbT5tYW51YWwgcGFnZTwvZW0+PC9hPikgZm9yCityZWZlcmVuY2UuIFRoZSBjb21tYW5kLWxpbmUgb3B0aW9uIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+LS1ub2Rlcy11cmk8L3NwYW4+PC90dD4gY29ycmVzcG9uZHMgdG8gdGhlIGtleQorPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5ub2Rlc191cmk8L3NwYW4+PC90dD4gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gRm9yIGV4YW1wbGU6PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPnN0b3JhZ2VfdHlwZTogeWFtbF9mcworcHJldHR5X3ByaW50OiBUcnVlCitvdXRwdXQ6IGpzb24KK2ludmVudG9yeV9iYXNlX3VyaTogL2V0Yy9yZWNsYXNzCitub2Rlc191cmk6IC4uL25vZGVzCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+PHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGZpcnN0IGxvb2tzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmb3IgdGhlIGZpbGUgY2FsbGVkCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnJlY2xhc3MtY29uZmlnLnltbDwvc3Bhbj48L3R0PiAoc2VlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+cmVjbGFzcy9kZWZhdWx0cy5weTwvc3Bhbj48L3R0PikgYW5kIGlmIG5vIHN1Y2ggZmlsZSBpcworZm91bmQsIGl0IGxvb2tzIGluIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+JEhPTUU8L3NwYW4+PC90dD4sIHRoZW4gaW4gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vZXRjL3JlY2xhc3M8L3NwYW4+PC90dD4sIGFuZCB0aGVuICYjODIyMDtuZXh0IHRvJiM4MjIxOyB0aGUKKzx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+cmVjbGFzczwvc3Bhbj48L3R0PiBzY3JpcHQgaXRzZWxmLCBpLmUuIGlmIHRoZSBzY3JpcHQgaXMgc3ltbGlua2VkIHRvCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi9zcnYvcHJvdmlzaW9uaW5nL3JlY2xhc3M8L3NwYW4+PC90dD4sIHRoZW4gdGhlIHRoZSBzY3JpcHQgd2lsbCB0cnkgdG8gYWNjZXNzCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi9zcnYvcHJvdmlzaW9uaW5nL3JlY2xhc3MtY29uZmlnLnltbDwvc3Bhbj48L3R0Pi48L3A+Cis8cD5Ob3RlIHRoYXQgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj55YW1sX2ZzPC9zcGFuPjwvdHQ+IGlzIGN1cnJlbnRseSB0aGUgb25seSBzdXBwb3J0ZWQgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5zdG9yYWdlX3R5cGU8L3NwYW4+PC90dD4sIGFuZAoraXQmIzgyMTc7cyB0aGUgZGVmYXVsdCBpZiB5b3UgZG9uJiM4MjE3O3Qgc2V0IGl0LjwvcD4KKzxwPkFkYXB0ZXJzIG1heSBpbXBsZW1lbnQgdGhlaXIgb3duIGxvb2t1cCBsb2dpYywgb2YgY291cnNlLCBzbyBtYWtlIHN1cmUgdG8gcmVhZAordGhlaXIgZG9jdW1lbnRhdGlvbiAoZm9yIDxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9InNhbHQuaHRtbCI+PGVtPlNhbHQ8L2VtPjwvYT4sIGZvciA8YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJhbnNpYmxlLmh0bWwiPjxlbT5BbnNpYmxlPC9lbT48L2E+LCBhbmQKK2ZvciA8YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJwdXBwZXQuaHRtbCI+PGVtPlB1cHBldDwvZW0+PC9hPikuPC9wPgorPC9kaXY+CisKKworICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ic3BoaW54c2lkZWJhciI+CisgICAgICAgIDxkaXYgY2xhc3M9InNwaGlueHNpZGViYXJ3cmFwcGVyIj4KKyAgPGg0PlByZXZpb3VzIHRvcGljPC9oND4KKyAgPHAgY2xhc3M9InRvcGxlc3MiPjxhIGhyZWY9Im1hbnBhZ2UuaHRtbCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJwcmV2aW91cyBjaGFwdGVyIj5yZWNsYXNzIG1hbnBhZ2U8L2E+PC9wPgorICA8aDQ+TmV4dCB0b3BpYzwvaDQ+CisgIDxwIGNsYXNzPSJ0b3BsZXNzIj48YSBocmVmPSJzYWx0Lmh0bWwiCisgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0ibmV4dCBjaGFwdGVyIj5Vc2luZyByZWNsYXNzIHdpdGggU2FsdDwvYT48L3A+Cis8ZGl2IGlkPSJzZWFyY2hib3giIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KKyAgPGgzPlF1aWNrIHNlYXJjaDwvaDM+CisgICAgPGZvcm0gY2xhc3M9InNlYXJjaCIgYWN0aW9uPSJzZWFyY2guaHRtbCIgbWV0aG9kPSJnZXQiPgorICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InEiIC8+CisgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iIC8+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaGVja19rZXl3b3JkcyIgdmFsdWU9InllcyIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFyZWEiIHZhbHVlPSJkZWZhdWx0IiAvPgorICAgIDwvZm9ybT4KKyAgICA8cCBjbGFzcz0ic2VhcmNodGlwIiBzdHlsZT0iZm9udC1zaXplOiA5MCUiPgorICAgIEVudGVyIHNlYXJjaCB0ZXJtcyBvciBhIG1vZHVsZSwgY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZS4KKyAgICA8L3A+Cis8L2Rpdj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4kKCcjc2VhcmNoYm94Jykuc2hvdygwKTs8L3NjcmlwdD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZXIiPjwvZGl2PgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICA+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InNhbHQuaHRtbCIgdGl0bGU9IlVzaW5nIHJlY2xhc3Mgd2l0aCBTYWx0IgorICAgICAgICAgICAgID5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9Im1hbnBhZ2UuaHRtbCIgdGl0bGU9InJlY2xhc3MgbWFucGFnZSIKKyAgICAgICAgICAgICA+cHJldmlvdXM8L2E+IHw8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmb290ZXIiPgorICAgICAgICAmY29weTsgQ29weXJpZ2h0IDIwMTMsIG1hcnRpbiBmLiBrcmFmZnQuCisgICAgICBDcmVhdGVkIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9zcGhpbngtZG9jLm9yZy8iPlNwaGlueDwvYT4gMS4yLjMuCisgICAgPC9kaXY+CisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZW5pbmRleC5odG1sIGIvZ2VuaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTRmMGMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2VuaW5kZXguaHRtbApAQCAtMCwwICsxLDkyIEBACisKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKworCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgIAorICAgIDx0aXRsZT5JbmRleCAmbWRhc2g7IHJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbjwvdGl0bGU+CisgICAgCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9zdGF0aWMvcHlnbWVudHMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICAKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICB2YXIgRE9DVU1FTlRBVElPTl9PUFRJT05TID0geworICAgICAgICBVUkxfUk9PVDogICAgJy4vJywKKyAgICAgICAgVkVSU0lPTjogICAgICcxLjQuMScsCisgICAgICAgIENPTExBUFNFX0lOREVYOiBmYWxzZSwKKyAgICAgICAgRklMRV9TVUZGSVg6ICcuaHRtbCcsCisgICAgICAgIEhBU19TT1VSQ0U6ICB0cnVlCisgICAgICB9OworICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvanF1ZXJ5LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL3VuZGVyc2NvcmUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvZG9jdG9vbHMuanMiPjwvc2NyaXB0PgorICAgIDxsaW5rIHJlbD0idG9wIiB0aXRsZT0icmVjbGFzcyAxLjQuMSBkb2N1bWVudGF0aW9uIiBocmVmPSJpbmRleC5odG1sIiAvPiAKKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8ZGl2IGNsYXNzPSJyZWxhdGVkIj4KKyAgICAgIDxoMz5OYXZpZ2F0aW9uPC9oMz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweCI+CisgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IkdlbmVyYWwgSW5kZXgiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJJIj5pbmRleDwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4gIAorCisgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQiPgorICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnR3cmFwcGVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYm9keXdyYXBwZXIiPgorICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgCisKKzxoMSBpZD0iaW5kZXgiPkluZGV4PC9oMT4KKworPGRpdiBjbGFzcz0iZ2VuaW5kZXgtanVtcGJveCI+CisgCis8L2Rpdj4KKworCisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic3BoaW54c2lkZWJhcndyYXBwZXIiPgorCisgICAKKworPGRpdiBpZD0ic2VhcmNoYm94IiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CisgIDxoMz5RdWljayBzZWFyY2g8L2gzPgorICAgIDxmb3JtIGNsYXNzPSJzZWFyY2giIGFjdGlvbj0ic2VhcmNoLmh0bWwiIG1ldGhvZD0iZ2V0Ij4KKyAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiAvPgorICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkdvIiAvPgorICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2hlY2tfa2V5d29yZHMiIHZhbHVlPSJ5ZXMiIC8+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhcmVhIiB2YWx1ZT0iZGVmYXVsdCIgLz4KKyAgICA8L2Zvcm0+CisgICAgPHAgY2xhc3M9InNlYXJjaHRpcCIgc3R5bGU9ImZvbnQtc2l6ZTogOTAlIj4KKyAgICBFbnRlciBzZWFyY2ggdGVybXMgb3IgYSBtb2R1bGUsIGNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUuCisgICAgPC9wPgorPC9kaXY+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JCgnI3NlYXJjaGJveCcpLnNob3coMCk7PC9zY3JpcHQ+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmVyIj48L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJyZWxhdGVkIj4KKyAgICAgIDxoMz5OYXZpZ2F0aW9uPC9oMz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweCI+CisgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IkdlbmVyYWwgSW5kZXgiCisgICAgICAgICAgICAgPmluZGV4PC9hPjwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImZvb3RlciI+CisgICAgICAgICZjb3B5OyBDb3B5cmlnaHQgMjAxMywgbWFydGluIGYuIGtyYWZmdC4KKyAgICAgIENyZWF0ZWQgdXNpbmcgPGEgaHJlZj0iaHR0cDovL3NwaGlueC1kb2Mub3JnLyI+U3BoaW54PC9hPiAxLjIuMy4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hhY2tpbmcuaHRtbCBiL2hhY2tpbmcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjFiYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvaGFja2luZy5odG1sCkBAIC0wLDAgKzEsMTYwIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgorICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CisKKworPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICAKKyAgICA8dGl0bGU+SGFja2luZyBvbiByZWNsYXNzICZtZGFzaDsgcmVjbGFzcyAxLjQuMSBkb2N1bWVudGF0aW9uPC90aXRsZT4KKyAgICAKKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9zdGF0aWMvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iX3N0YXRpYy9weWdtZW50cy5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgIAorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgIHZhciBET0NVTUVOVEFUSU9OX09QVElPTlMgPSB7CisgICAgICAgIFVSTF9ST09UOiAgICAnLi8nLAorICAgICAgICBWRVJTSU9OOiAgICAgJzEuNC4xJywKKyAgICAgICAgQ09MTEFQU0VfSU5ERVg6IGZhbHNlLAorICAgICAgICBGSUxFX1NVRkZJWDogJy5odG1sJywKKyAgICAgICAgSEFTX1NPVVJDRTogIHRydWUKKyAgICAgIH07CisgICAgPC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy9qcXVlcnkuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvdW5kZXJzY29yZS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy9kb2N0b29scy5qcyI+PC9zY3JpcHQ+CisgICAgPGxpbmsgcmVsPSJ0b3AiIHRpdGxlPSJyZWNsYXNzIDEuNC4xIGRvY3VtZW50YXRpb24iIGhyZWY9ImluZGV4Lmh0bWwiIC8+CisgICAgPGxpbmsgcmVsPSJuZXh0IiB0aXRsZT0icmVjbGFzcyB0by1kbyBsaXN0IiBocmVmPSJ0b2RvLmh0bWwiIC8+CisgICAgPGxpbmsgcmVsPSJwcmV2IiB0aXRsZT0iVXNpbmcgcmVjbGFzcyB3aXRoIFB1cHBldCIgaHJlZj0icHVwcGV0Lmh0bWwiIC8+IAorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9IkkiPmluZGV4PC9hPjwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJ0b2RvLmh0bWwiIHRpdGxlPSJyZWNsYXNzIHRvLWRvIGxpc3QiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJOIj5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InB1cHBldC5odG1sIiB0aXRsZT0iVXNpbmcgcmVjbGFzcyB3aXRoIFB1cHBldCIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9IlAiPnByZXZpb3VzPC9hPiB8PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9ImluZGV4Lmh0bWwiPnJlY2xhc3M8L2E+ICZyYXF1bzs8L2xpPiAKKyAgICAgIDwvdWw+CisgICAgPC9kaXY+ICAKKworICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50Ij4KKyAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50d3JhcHBlciI+CisgICAgICAgIDxkaXYgY2xhc3M9ImJvZHl3cmFwcGVyIj4KKyAgICAgICAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KKyAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iaGFja2luZy1vbi1yZWNsYXNzIj4KKzxoMT5IYWNraW5nIG9uIHJlY2xhc3M8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI2hhY2tpbmctb24tcmVjbGFzcyIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gxPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9Imluc3RhbGxhdGlvbiI+Cis8aDI+SW5zdGFsbGF0aW9uPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNpbnN0YWxsYXRpb24iIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPklmIHlvdSBqdXN0IHdhbnQgdG8gcnVuIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBmcm9tIHNvdXJjZSwgZS5nLiBiZWNhdXNlIHlvdSBhcmUgZ29pbmcgdG8gYmUKK21ha2luZyBhbmQgdGVzdGluZyBjaGFuZ2VzLCBpbnN0YWxsIGl0IGluICYjODIyMDtkZXZlbG9wbWVudCBtb2RlJiM4MjIxOzo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+cHl0aG9uIHNldHVwLnB5IGRldmVsb3AKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8cD5Ob3cgdGhlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+cmVjbGFzczwvc3Bhbj48L3R0PiBzY3JpcHQsIGFzIHdlbGwgYXMgdGhlIGFkYXB0ZXJzLCB3aWxsIGJlIGF2YWlsYWJsZSBpbgorPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vdXNyL2xvY2FsL2Jpbjwvc3Bhbj48L3R0PiwgYW5kIHlvdSBjYW4gYWxzbyBpbnZva2UgdGhlbSBkaXJlY3RseSBmcm9tIHRoZSBzb3VyY2UKK3RyZWUuPC9wPgorPHA+VG8gdW5pbnN0YWxsOjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT5weXRob24gc2V0dXAucHkgZGV2ZWxvcCAtLXVuaW5zdGFsbAorPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9ImRpc2N1c3NpbmctcmVjbGFzcyI+Cis8aDI+RGlzY3Vzc2luZyByZWNsYXNzPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNkaXNjdXNzaW5nLXJlY2xhc3MiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPklmIHlvdSB3YW50IHRvIHRhbGsgYWJvdXQgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+LCB1c2UgdGhlIDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly9saXN0cy5wYW50c2Z1bGxvZnVuaXgubmV0L2xpc3RpbmZvL3JlY2xhc3MiPm1haWxpbmcgbGlzdDwvYT4gb3IgdG8gZmluZCBtZSBvbgorSVJDLCBpbiA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPiNyZWNsYXNzPC9zcGFuPjwvdHQ+IG9uIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+aXJjLm9mdGMubmV0PC9zcGFuPjwvdHQ+LjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9ImNvbnRyaWJ1dGluZy10by1yZWNsYXNzIj4KKzxoMj5Db250cmlidXRpbmcgdG8gcmVjbGFzczxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjY29udHJpYnV0aW5nLXRvLXJlY2xhc3MiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPjxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBpcyBjdXJyZW50bHkgbWFpbnRhaW5lZCA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9tYWRkdWNrL3JlY2xhc3MiPm9uIEdpdGh1YjwvYT4uPC9wPgorPHA+Q29udHRyaWJ1dGlvbnMgdG8gPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGFyZSB2ZXJ5IHdlbGNvbWUuIFNpbmNlIEkgcHJlZmVyIHRvIGtlZXAgYSBzb21ld2hhdAorY2xlYW4gaGlzdG9yeSwgSSB3aWxsIG5vdCBqdXN0IG1lcmdlIHB1bGwgcmVxdWVzdC48L3A+Cis8cD5Zb3UgY2FuIHN1Ym1pdCBwdWxsIHJlcXVlc3RzLCBvZiBjb3Vyc2UsIGFuZCBJJiM4MjE3O2xsIHJlYmFzZSB0aGVtIG9udG8gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5IRUFEPC9zcGFuPjwvdHQ+CitiZWZvcmUgbWVyZ2luZy4gT3Igc2VuZCB5b3VyIHBhdGNoZXMgdXNpbmcgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5naXQtZm9ybWF0LXBhdGNoPC9zcGFuPjwvdHQ+IGFuZAorPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5naXQtc2VuZC1lLW1haWw8L3NwYW4+PC90dD4gdG8gPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0ibWFpbHRvOnJlY2xhc3MmIzM3OyYjNTI7JiM0ODtsaXN0cyYjNDY7cGFudHNmdWxsb2Z1bml4JiM0NjtuZXQiPnRoZSBtYWlsaW5nIGxpc3Q8L2E+LjwvcD4KKzxwPkkgaGF2ZSBhZGRlZCBydWRpbWVudGFyeSB1bml0IHRlc3RzLCBhbmQgaXQgd291bGQgYmUgbmljZSBpZiB5b3UgY291bGQgc3VibWl0Cit5b3VyIGNoYW5nZXMgd2l0aCBhcHByb3ByaWF0ZSBjaGFuZ2VzIHRvIHRoZSB0ZXN0cy4gVG8gcnVuIHRlc3RzLCBpbnZva2U8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCBtYWtlIHRlc3RzCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+aW4gdGhlIHRvcC1sZXZlbCBjaGVja291dCBkaXJlY3RvcnkuIFRoZSB0ZXN0cyBhcmUgcmF0aGVyIGluY29uc2lzdGVudCwgc29tZQordXNpbmcgbW9jayBvYmplY3RzLCBhbmQgb25seSB0aGUgZGF0YXR5cGVzLXJlbGF0ZWQgY29kZSBpcyBjb3ZlcmVkLiBJZiB5b3UgYXJlCithIHRlc3RpbmcgZXhwZXJ0LCBJIGNvdWxkIGNlcnRhaW5seSB1c2Ugc29tZSBoZWxwIGhlcmUgdG8gaW1wcm92ZSB0aGUKK2NvbnNpc3RlbmN5IG9mIHRoZSBleGlzdGluZyB0ZXN0cywgYXMgd2VsbCBhcyB0aGVpciBjb3ZlcmFnZS48L3A+Cis8cD5BbHNvLCB0aGVyZSBpcyBhIE1ha2VmaWxlIGdpdmluZyBhY2Nlc3MgdG8gUHlMaW50IGFuZCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmNvdmVyYWdlLnB5PC9zcGFuPjwvdHQ+IChydW5uaW5nCit0ZXN0cykuIElmIHlvdSBydW4gdGhhdCwgeW91IGNhbiBzZWUgdGhlcmUgaXMgYSBsb3Qgb2Ygd29yayB0byBiZSBkb25lCitjbGVhbmluZyB1cCB0aGUgY29kZS4gSWYgdGhpcyBpcyB0aGUgc29ydCBvZiBzdHVmZiB5b3Ugd2FudCB0byBkbyDigJQgYnkgYWxsCittZWFucyDigJQgYmUgbXkgZ3Vlc3QhIDspPC9wPgorPHA+VGhlcmUgYXJlIGEgbnVtYmVyIG9mIGl0ZW1zIG9uIHRoZSA8YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJ0b2RvLmh0bWwiPjxlbT50by1kbyBsaXN0PC9lbT48L2E+LCBzbyBpZiB5b3UgYXJlCitib3JlZOKApjwvcD4KKzxwPklmIHlvdSBoYXZlIGxhcmdlciBpZGVhcywgSSYjODIxNztsbCBiZSBsb29raW5nIGZvcndhcmQgdG8gZGlzY3VzcyB0aGVtIHdpdGggeW91LjwvcD4KKzwvZGl2PgorPC9kaXY+CisKKworICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ic3BoaW54c2lkZWJhciI+CisgICAgICAgIDxkaXYgY2xhc3M9InNwaGlueHNpZGViYXJ3cmFwcGVyIj4KKyAgPGgzPjxhIGhyZWY9ImluZGV4Lmh0bWwiPlRhYmxlIE9mIENvbnRlbnRzPC9hPjwvaDM+CisgIDx1bD4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjIj5IYWNraW5nIG9uIHJlY2xhc3M8L2E+PHVsPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNpbnN0YWxsYXRpb24iPkluc3RhbGxhdGlvbjwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNkaXNjdXNzaW5nLXJlY2xhc3MiPkRpc2N1c3NpbmcgcmVjbGFzczwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNjb250cmlidXRpbmctdG8tcmVjbGFzcyI+Q29udHJpYnV0aW5nIHRvIHJlY2xhc3M8L2E+PC9saT4KKzwvdWw+Cis8L2xpPgorPC91bD4KKworICA8aDQ+UHJldmlvdXMgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0icHVwcGV0Lmh0bWwiCisgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0icHJldmlvdXMgY2hhcHRlciI+VXNpbmcgcmVjbGFzcyB3aXRoIFB1cHBldDwvYT48L3A+CisgIDxoND5OZXh0IHRvcGljPC9oND4KKyAgPHAgY2xhc3M9InRvcGxlc3MiPjxhIGhyZWY9InRvZG8uaHRtbCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJuZXh0IGNoYXB0ZXIiPnJlY2xhc3MgdG8tZG8gbGlzdDwvYT48L3A+Cis8ZGl2IGlkPSJzZWFyY2hib3giIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KKyAgPGgzPlF1aWNrIHNlYXJjaDwvaDM+CisgICAgPGZvcm0gY2xhc3M9InNlYXJjaCIgYWN0aW9uPSJzZWFyY2guaHRtbCIgbWV0aG9kPSJnZXQiPgorICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InEiIC8+CisgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iIC8+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaGVja19rZXl3b3JkcyIgdmFsdWU9InllcyIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFyZWEiIHZhbHVlPSJkZWZhdWx0IiAvPgorICAgIDwvZm9ybT4KKyAgICA8cCBjbGFzcz0ic2VhcmNodGlwIiBzdHlsZT0iZm9udC1zaXplOiA5MCUiPgorICAgIEVudGVyIHNlYXJjaCB0ZXJtcyBvciBhIG1vZHVsZSwgY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZS4KKyAgICA8L3A+Cis8L2Rpdj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4kKCcjc2VhcmNoYm94Jykuc2hvdygwKTs8L3NjcmlwdD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZXIiPjwvZGl2PgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICA+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InRvZG8uaHRtbCIgdGl0bGU9InJlY2xhc3MgdG8tZG8gbGlzdCIKKyAgICAgICAgICAgICA+bmV4dDwvYT4gfDwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJwdXBwZXQuaHRtbCIgdGl0bGU9IlVzaW5nIHJlY2xhc3Mgd2l0aCBQdXBwZXQiCisgICAgICAgICAgICAgPnByZXZpb3VzPC9hPiB8PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9ImluZGV4Lmh0bWwiPnJlY2xhc3M8L2E+ICZyYXF1bzs8L2xpPiAKKyAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZm9vdGVyIj4KKyAgICAgICAgJmNvcHk7IENvcHlyaWdodCAyMDEzLCBtYXJ0aW4gZi4ga3JhZmZ0LgorICAgICAgQ3JlYXRlZCB1c2luZyA8YSBocmVmPSJodHRwOi8vc3BoaW54LWRvYy5vcmcvIj5TcGhpbng8L2E+IDEuMi4zLgorICAgIDwvZGl2PgorICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5kZXguaHRtbCBiL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyYzg1OAotLS0gL2Rldi9udWxsCisrKyBiL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwyMzQgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKworCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgIAorICAgIDx0aXRsZT5yZWNsYXNzIOKAlCBSZWN1cnNpdmUgZXh0ZXJuYWwgbm9kZSBjbGFzc2lmaWNhdGlvbiAmbWRhc2g7IHJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbjwvdGl0bGU+CisgICAgCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9zdGF0aWMvcHlnbWVudHMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICAKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICB2YXIgRE9DVU1FTlRBVElPTl9PUFRJT05TID0geworICAgICAgICBVUkxfUk9PVDogICAgJy4vJywKKyAgICAgICAgVkVSU0lPTjogICAgICcxLjQuMScsCisgICAgICAgIENPTExBUFNFX0lOREVYOiBmYWxzZSwKKyAgICAgICAgRklMRV9TVUZGSVg6ICcuaHRtbCcsCisgICAgICAgIEhBU19TT1VSQ0U6ICB0cnVlCisgICAgICB9OworICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvanF1ZXJ5LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL3VuZGVyc2NvcmUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvZG9jdG9vbHMuanMiPjwvc2NyaXB0PgorICAgIDxsaW5rIHJlbD0idG9wIiB0aXRsZT0icmVjbGFzcyAxLjQuMSBkb2N1bWVudGF0aW9uIiBocmVmPSIjIiAvPgorICAgIDxsaW5rIHJlbD0ibmV4dCIgdGl0bGU9Ikluc3RhbGxhdGlvbiIgaHJlZj0iaW5zdGFsbC5odG1sIiAvPiAKKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8ZGl2IGNsYXNzPSJyZWxhdGVkIj4KKyAgICAgIDxoMz5OYXZpZ2F0aW9uPC9oMz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweCI+CisgICAgICAgICAgPGEgaHJlZj0iZ2VuaW5kZXguaHRtbCIgdGl0bGU9IkdlbmVyYWwgSW5kZXgiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJJIj5pbmRleDwvYT48L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0iaW5zdGFsbC5odG1sIiB0aXRsZT0iSW5zdGFsbGF0aW9uIgorICAgICAgICAgICAgIGFjY2Vzc2tleT0iTiI+bmV4dDwvYT4gfDwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSIjIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PiAgCisKKyAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudCI+CisgICAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudHdyYXBwZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJib2R5d3JhcHBlciI+CisgICAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+CisgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InJlY2xhc3MtcmVjdXJzaXZlLWV4dGVybmFsLW5vZGUtY2xhc3NpZmljYXRpb24iPgorPGgxPnJlY2xhc3Mg4oCUIFJlY3Vyc2l2ZSBleHRlcm5hbCBub2RlIGNsYXNzaWZpY2F0aW9uPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNyZWNsYXNzLXJlY3Vyc2l2ZS1leHRlcm5hbC1ub2RlLWNsYXNzaWZpY2F0aW9uIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDE+Cis8cD48c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gaXMgYW4gJiM4MjIwO2V4dGVybmFsIG5vZGUgY2xhc3NpZmllciYjODIyMTsgKEVOQykgYXMgY2FuIGJlIHVzZWQgd2l0aAorYXV0b21hdGlvbiB0b29scywgc3VjaCBhcyA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vcHVwcGV0bGFicy5jb20vcHVwcGV0L3B1cHBldC1vcGVuLXNvdXJjZSI+UHVwcGV0PC9hPiwgPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3NhbHRzdGFjay5jb20vY29tbXVuaXR5Ij5TYWx0PC9hPiwgYW5kIDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93d3cuYW5zaWJsZXdvcmtzLmNvbSI+QW5zaWJsZTwvYT4uIEl0IGlzIGFsc28KK2Egc3RhbmQtYWxvbmUgdG9vbCBmb3IgbWVyZ2luZyBkYXRhIHNvdXJjZXMgcmVjdXJzaXZlbHkuPC9wPgorPHA+VGhlIHB1cnBvc2Ugb2YgYW4gRU5DIGlzIHRvIGFsbG93IGEgc3lzdGVtIGFkbWluaXN0cmF0b3IgdG8gbWFpbnRhaW4gYW4KK2ludmVudG9yeSBvZiBub2RlcyB0byBiZSBtYW5hZ2VkLCBjb21wbGV0ZWx5IHNlcGFyYXRlbHkgZnJvbSB0aGUgY29uZmlndXJhdGlvbgorb2YgdGhlIGF1dG9tYXRpb24gdG9vbC4gVXN1YWxseSwgdGhlIGV4dGVybmFsIG5vZGUgY2xhc3NpZmllciBjb21wbGV0ZWx5CityZXBsYWNlcyB0aGUgdG9vbC1zcGVjaWZpYyBpbnZlbnRvcnkgKHN1Y2ggYXMgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5zaXRlLnBwPC9zcGFuPjwvdHQ+IGZvciBQdXBwZXQsCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmV4dF9waWxsYXI8L3NwYW4+PC90dD4vPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5tYXN0ZXJfdG9wczwvc3Bhbj48L3R0PiBmb3IgU2FsdCwgb3IgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vZXRjL2Fuc2libGUvaG9zdHM8L3NwYW4+PC90dD4pLjwvcD4KKzxwPldpdGggcmVzcGVjdCB0byB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHRvb2wsIHRoZSBFTkMgdGhlbiBmdWxmaWxscyB0d28KK2pvYnM6PC9wPgorPHVsIGNsYXNzPSJzaW1wbGUiPgorPGxpPml0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGdyb3VwcyBvZiBub2RlcyBhbmQgZ3JvdXAgbWVtYmVyc2hpcHM8L2xpPgorPGxpPml0IGdpdmVzIGFjY2VzcyB0byBub2RlLXNwZWNpZmljIGluZm9ybWF0aW9uLCBzdWNoIGFzIHZhcmlhYmxlczwvbGk+Cis8L3VsPgorPHA+PHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGFsbG93cyB5b3UgdG8gZGVmaW5lIHlvdXIgbm9kZXMgdGhyb3VnaCBjbGFzcyBpbmhlcml0YW5jZSwgd2hpbGUKK2Fsd2F5cyBhYmxlIHRvIG92ZXJyaWRlIGRldGFpbHMgZnVydGhlciB1cCB0aGUgdHJlZSAoaS5lLiBpbiBtb3JlIHNwZWNpZmljCitub2RlcykuIFRoaW5rIG9mIGNsYXNzZXMgYXMgZmVhdHVyZSBzZXRzLCBhcyBjb21tb25hbGl0aWVzIGJldHdlZW4gbm9kZXMsIG9yCithcyB0YWdzLiBBZGQgdG8gdGhhdCB0aGUgYWJpbGl0eSB0byBuZXN0IGNsYXNzZXMgKG11bHRpcGxlIGluaGVyaXRhbmNlIGlzCithbGxvd2VkLCB3ZWxsLWRlZmluZWQsIGFuZCBlbmNvdXJhZ2VkKSwgYW5kIHlvdSBjYW4gYXNzZW1ibGUgeW91cgoraW5mcmFzdHJ1Y3R1cmUgZnJvbSBzbWFsbGVyIGJpdHMsIGVsaW1pbmF0aW5nIGR1cGxpY2F0aW9uIGFuZCBleHBvc2luZyBhbGwKK2ltcG9ydGFudCBwYXJhbWV0ZXJzIHRvIGEgc2luZ2xlIGxvY2F0aW9uLCBsb2dpY2FsbHkgb3JnYW5pc2VkLiBBbmQgaWYgdGhhdAoraXNuJiM4MjE3O3QgZW5vdWdoLCA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gbGV0cyB5b3UgcmVmZXJlbmNlIG90aGVyIHBhcmFtZXRlcnMgaW4gdGhlIHZlcnkKK2hpZXJhcmNoeSB5b3UgYXJlIGN1cnJlbnRseSBhc3NlbWJsaW5nLjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJyZWxlYXNlcy1hbmQtc291cmNlLWNvZGUiPgorPGgyPlJlbGVhc2VzIGFuZCBzb3VyY2UgY29kZTxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjcmVsZWFzZXMtYW5kLXNvdXJjZS1jb2RlIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD5UaGUgbGF0ZXN0IHJlbGVhc2VkIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiB2ZXJzaW9uIGlzIDEuNC4xLiBQbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlCis8YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJjaGFuZ2Vsb2cuaHRtbCI+PGVtPmNoYW5nZSBsb2c8L2VtPjwvYT4gZm9yIGluZm9ybWF0aW9uIGFib3V0IHJlY2VudCBjaGFuZ2VzLjwvcD4KKzxwPkZvciBub3csIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBpcyBob3N0ZWQgPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hZGR1Y2svcmVjbGFzcyI+b24gR2l0aHViPC9hPiwgYW5kIHlvdSBtYXkgY2xvbmUgaXQgd2l0aCB0aGUKK2ZvbGxvd2luZyBjb21tYW5kOjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT5naXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL21hZGR1Y2svcmVjbGFzcy5naXQKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8cD5QbGVhc2Ugc2VlIHRoZSA8YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJpbnN0YWxsLmh0bWwiPjxlbT5pbnN0YWxsIGluc3RydWN0aW9uczwvZW0+PC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQKK2Rpc3RyaWJ1dGlvbiBwYWNrYWdlcyBhbmQgdGFyYmFsbHMuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iY29tbXVuaXR5Ij4KKzxoMj5Db21tdW5pdHk8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI2NvbW11bml0eSIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gyPgorPHA+VGhlcmUgaXMgYSA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vbGlzdHMucGFudHNmdWxsb2Z1bml4Lm5ldC9saXN0aW5mby9yZWNsYXNzIj5tYWlsaW5nIGxpc3Q8L2E+LCB3aGVyZSB5b3UgY2FuIGJyaW5nIHVwIGFueXRoaW5nIHJlbGF0ZWQgdG8KKzxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPi48L3A+Cis8cD5Gb3IgcmVhbC10aW1lIGNvbW11bmljYXRpb24sIHBsZWFzZSBqb2luIHRoZSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPiNyZWNsYXNzPC9zcGFuPjwvdHQ+IElSQyBjaGFubmVsIG9uCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmlyYy5vZnRjLm5ldDwvc3Bhbj48L3R0Pi48L3A+Cis8cD5JZiB5b3UmIzgyMTc7cmUgdXNpbmcgPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3NhbHRzdGFjay5jb20vY29tbXVuaXR5Ij5TYWx0PC9hPiwgeW91IGNhbiBhbHNvIGFzayB5b3VyIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPi1hbmQtU2FsdC1yZWxhdGVkCitxdWVzdGlvbnMgb24gdGhlIG1haWxpbmcgbGlzdCwgaWRlYWxseSBzcGVjaWZ5aW5nICYjODIyMDtyZWNsYXNzJiM4MjIxOyBpbiB0aGUgc3ViamVjdCBvZgoreW91ciBtZXNzYWdlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9ImxpY2VuY2UiPgorPGgyPkxpY2VuY2U8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI2xpY2VuY2UiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPjxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBpcyDCqSAyMDA34oCTMjAxNCBieSBtYXJ0aW4gZi4ga3JhZmZ0IGFuZCByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YKK3RoZSA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQXJ0aXN0aWMtMi4wIj5BcnRpc3RpYyBMaWNlbmNlIDIuMDwvYT4uPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iY29udGVudHMiPgorPGgyPkNvbnRlbnRzPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNjb250ZW50cyIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gyPgorPHA+VGhlc2UgZG9jdW1lbnRzIGFpbSB0byBnZXQgeW91IHN0YXJ0ZWQgd2l0aCA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz46PC9wPgorPGRpdiBjbGFzcz0idG9jdHJlZS13cmFwcGVyIGNvbXBvdW5kIj4KKzx1bD4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMSI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iaW5zdGFsbC5odG1sIj5JbnN0YWxsYXRpb248L2E+PHVsPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJpbnN0YWxsLmh0bWwjZm9yLWRlYmlhbi11c2Vycy1pbmNsdWRpbmctdWJ1bnR1Ij5Gb3IgRGViaWFuIHVzZXJzIChpbmNsdWRpbmcgVWJ1bnR1KTwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJpbnN0YWxsLmh0bWwjZm9yLWFyY2hsaW51eC11c2VycyI+Rm9yIEFyY2hMaW51eCB1c2VyczwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJpbnN0YWxsLmh0bWwjb3RoZXItZGlzdHJpYnV0aW9ucyI+T3RoZXIgZGlzdHJpYnV0aW9uczwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJpbnN0YWxsLmh0bWwjZnJvbS1zb3VyY2UiPkZyb20gc291cmNlPC9hPjwvbGk+Cis8L3VsPgorPC9saT4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMSI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iY29uY2VwdHMuaHRtbCI+cmVjbGFzcyBjb25jZXB0czwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwxIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJvcGVyYXRpb25zLmh0bWwiPnJlY2xhc3Mgb3BlcmF0aW9uczwvYT48dWw+Cis8bGkgY2xhc3M9InRvY3RyZWUtbDIiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9Im9wZXJhdGlvbnMuaHRtbCN5YW1sLWZzLXN0b3JhZ2UiPllBTUwgRlMgc3RvcmFnZTwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJvcGVyYXRpb25zLmh0bWwjZGF0YS1tZXJnaW5nIj5EYXRhIG1lcmdpbmc8L2E+PC9saT4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMiI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0ib3BlcmF0aW9ucy5odG1sI3dpbGRjYXJkLXJlZ2V4cC1tYXBwaW5ncyI+V2lsZGNhcmQvUmVnZXhwIG1hcHBpbmdzPC9hPjwvbGk+Cis8bGkgY2xhc3M9InRvY3RyZWUtbDIiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9Im9wZXJhdGlvbnMuaHRtbCNwYXJhbWV0ZXItaW50ZXJwb2xhdGlvbiI+UGFyYW1ldGVyIGludGVycG9sYXRpb248L2E+PC9saT4KKzwvdWw+Cis8L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwxIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJ1c2FnZS5odG1sIj5Vc2luZyByZWNsYXNzPC9hPjwvbGk+Cis8bGkgY2xhc3M9InRvY3RyZWUtbDEiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9InJlZnMuaHRtbCI+RXh0ZXJuYWwgcmVmZXJlbmNlczwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwxIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJtYW5wYWdlLmh0bWwiPnJlY2xhc3MgbWFucGFnZTwvYT48dWw+Cis8bGkgY2xhc3M9InRvY3RyZWUtbDIiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9Im1hbnBhZ2UuaHRtbCNzeW5vcHNpcyI+U3lub3BzaXM8L2E+PC9saT4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMiI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0ibWFucGFnZS5odG1sI2Rlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJtYW5wYWdlLmh0bWwjb3B0aW9ucyI+T3B0aW9uczwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJtYW5wYWdlLmh0bWwjc2VlLWFsc28iPlNlZSBhbHNvPC9hPjwvbGk+Cis8L3VsPgorPC9saT4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMSI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iY29uZmlnZmlsZS5odG1sIj5yZWNsYXNzIGNvbmZpZ3VyYXRpb24gZmlsZTwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwxIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJzYWx0Lmh0bWwiPlVzaW5nIHJlY2xhc3Mgd2l0aCBTYWx0PC9hPjx1bD4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMiI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0ic2FsdC5odG1sI3F1aWNrLXN0YXJ0Ij5RdWljayBzdGFydDwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJzYWx0Lmh0bWwjY29uZmlndXJhdGlvbi1maWxlLWFuZC1tYXN0ZXItY29uZmlndXJhdGlvbiI+Q29uZmlndXJhdGlvbiBmaWxlIGFuZCBtYXN0ZXIgY29uZmlndXJhdGlvbjwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJzYWx0Lmh0bWwjaW50ZWdyYXRpb24td2l0aC1zYWx0Ij5JbnRlZ3JhdGlvbiB3aXRoIFNhbHQ8L2E+PC9saT4KKzwvdWw+Cis8L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwxIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJhbnNpYmxlLmh0bWwiPlVzaW5nIHJlY2xhc3Mgd2l0aCBBbnNpYmxlPC9hPjx1bD4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMiI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iYW5zaWJsZS5odG1sI3F1aWNrLXN0YXJ0LXdpdGgtYW5zaWJsZSI+UXVpY2sgc3RhcnQgd2l0aCBBbnNpYmxlPC9hPjwvbGk+Cis8bGkgY2xhc3M9InRvY3RyZWUtbDIiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9ImFuc2libGUuaHRtbCNpbnRlZ3JhdGlvbi13aXRoLWFuc2libGUiPkludGVncmF0aW9uIHdpdGggQW5zaWJsZTwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJhbnNpYmxlLmh0bWwjdmFyaWFibGUtaW50ZXJwb2xhdGlvbiI+VmFyaWFibGUgaW50ZXJwb2xhdGlvbjwvYT48L2xpPgorPC91bD4KKzwvbGk+Cis8bGkgY2xhc3M9InRvY3RyZWUtbDEiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9InB1cHBldC5odG1sIj5Vc2luZyByZWNsYXNzIHdpdGggUHVwcGV0PC9hPjwvbGk+Cis8bGkgY2xhc3M9InRvY3RyZWUtbDEiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9ImhhY2tpbmcuaHRtbCI+SGFja2luZyBvbiByZWNsYXNzPC9hPjx1bD4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMiI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iaGFja2luZy5odG1sI2luc3RhbGxhdGlvbiI+SW5zdGFsbGF0aW9uPC9hPjwvbGk+Cis8bGkgY2xhc3M9InRvY3RyZWUtbDIiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9ImhhY2tpbmcuaHRtbCNkaXNjdXNzaW5nLXJlY2xhc3MiPkRpc2N1c3NpbmcgcmVjbGFzczwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJoYWNraW5nLmh0bWwjY29udHJpYnV0aW5nLXRvLXJlY2xhc3MiPkNvbnRyaWJ1dGluZyB0byByZWNsYXNzPC9hPjwvbGk+Cis8L3VsPgorPC9saT4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMSI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0idG9kby5odG1sIj5yZWNsYXNzIHRvLWRvIGxpc3Q8L2E+PHVsPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJ0b2RvLmh0bWwjY29tbW9uLXNldC1vZi1jbGFzc2VzIj5Db21tb24gc2V0IG9mIGNsYXNzZXM8L2E+PC9saT4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMiI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0idG9kby5odG1sI3Rlc3RpbmctZnJhbWV3b3JrIj5UZXN0aW5nIGZyYW1ld29yazwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJ0b2RvLmh0bWwjY29uZmlndXJhYmxlLWZpbGUtZXh0ZW5zaW9uIj5Db25maWd1cmFibGUgZmlsZSBleHRlbnNpb248L2E+PC9saT4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMiI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0idG9kby5odG1sI3ZlcmJvc2l0eS1kZWJ1Z2dpbmciPlZlcmJvc2l0eSwgZGVidWdnaW5nPC9hPjwvbGk+Cis8bGkgY2xhc3M9InRvY3RyZWUtbDIiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9InRvZG8uaHRtbCNkYXRhLWZyb20tY21zLWZvci1pbnRlcnBvbGF0aW9uIj5EYXRhIGZyb20gQ01TIGZvciBpbnRlcnBvbGF0aW9uPC9hPjwvbGk+Cis8bGkgY2xhc3M9InRvY3RyZWUtbDIiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9InRvZG8uaHRtbCNtZW1iZXJzaGlwLWluZm9ybWF0aW9uIj5NZW1iZXJzaGlwIGluZm9ybWF0aW9uPC9hPjwvbGk+Cis8bGkgY2xhc3M9InRvY3RyZWUtbDIiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9InRvZG8uaHRtbCNjb25maWd1cmF0aW9uLWZpbGUtbG9va3VwLWltcHJvdmVtZW50cyI+Q29uZmlndXJhdGlvbiBmaWxlIGxvb2t1cCBpbXByb3ZlbWVudHM8L2E+PC9saT4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMiI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0idG9kby5odG1sI2FkYXB0ZXItY2xhc3MtaGllcmFyY2h5Ij5BZGFwdGVyIGNsYXNzIGhpZXJhcmNoeTwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJ0b2RvLmh0bWwjbm9kZS1saXN0cyI+Tm9kZSBsaXN0czwvYT48L2xpPgorPGxpIGNsYXNzPSJ0b2N0cmVlLWwyIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJ0b2RvLmh0bWwjaW52ZW50b3J5LWZpbHRlcnMiPkludmVudG9yeSBmaWx0ZXJzPC9hPjwvbGk+Cis8L3VsPgorPC9saT4KKzxsaSBjbGFzcz0idG9jdHJlZS1sMSI+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iY2hhbmdlbG9nLmh0bWwiPkNoYW5nZUxvZzwvYT48L2xpPgorPC91bD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iYWJvdXQtdGhlLW5hbWUiPgorPGgyPkFib3V0IHRoZSBuYW1lPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNhYm91dC10aGUtbmFtZSIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gyPgorPHA+JiM4MjIwO3JlY2xhc3MmIzgyMjE7IHN0YW5kcyBmb3IgPHN0cm9uZz5yPC9zdHJvbmc+ZWN1cnNpdmUgPHN0cm9uZz5lPC9zdHJvbmc+eHRlcm5hbCBub2RlIDxzdHJvbmc+Y2xhc3M8L3N0cm9uZz5pZmllciwKK3doaWNoIGlzIHNvbWV3aGF0IG9mIGEgbWlzbm9tZXIuIEkgY2hvc2UgdGhlIG5hbWUgdmVyeSBlYXJseSBvbiwgYmFzZWQgb24gdGhlCityZWN1cnNpdmUgbmF0dXJlIG9mIHRoZSBkYXRhIG1lcmdpbmcuIEhvd2V2ZXIsIHRvIHRoZSB1c2VyLCBhIGJldHRlciBwYXJhZGlnbQord291bGQgYmUgJiM4MjIwO2hpZXJhcmNoaWNhbCYjODIyMTssIGFzIHMvaGUgZG9lcyBub3QgYW5kIHNob3VsZCBub3QgY2FyZSB0b28gbXVjaCBhYm91dAordGhlIGltcGxlbWVudGF0aW9uIGludGVybmFscy4gQnkgdGhlIHRpbWUgdGhhdCBJIHJlYWxpc2VkIHRoaXMsIHVuZm9ydHVuYXRlbHksCis8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vcHJvamVjdHMucHVwcGV0bGFicy5jb20vcHJvamVjdHMvaGllcmEiPkhpZXJhPC9hPiAoUHVwcGV0LXNwZWNpZmljKSBoYWQgYWxyZWFkeSBvY2N1cGllZCB0aGlzIHByZWZpeC4gT2ggd2VsbC4gT25jZSB5b3UKK3N0YXJ0IHVzaW5nIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiwgeW91JiM4MjE3O2xsIHRoaW5rIHJlY3Vyc2l2ZWx5IGFzIHdlbGwgYXMgaGllcmFyY2hpY2FsbHkgYXQKK3RoZSBzYW1lIHRpbWUuIEl0JiM4MjE3O3MgcmVhbGx5IHF1aXRlIHNpbXBsZS48L3A+Cis8L2Rpdj4KKzwvZGl2PgorCisKKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9InNwaGlueHNpZGViYXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyd3JhcHBlciI+CisgIDxoMz48YSBocmVmPSIjIj5UYWJsZSBPZiBDb250ZW50czwvYT48L2gzPgorICA8dWw+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iIyI+cmVjbGFzcyDigJQgUmVjdXJzaXZlIGV4dGVybmFsIG5vZGUgY2xhc3NpZmljYXRpb248L2E+PHVsPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNyZWxlYXNlcy1hbmQtc291cmNlLWNvZGUiPlJlbGVhc2VzIGFuZCBzb3VyY2UgY29kZTwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNjb21tdW5pdHkiPkNvbW11bml0eTwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNsaWNlbmNlIj5MaWNlbmNlPC9hPjwvbGk+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI2NvbnRlbnRzIj5Db250ZW50czwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNhYm91dC10aGUtbmFtZSI+QWJvdXQgdGhlIG5hbWU8L2E+PC9saT4KKzwvdWw+Cis8L2xpPgorPC91bD4KKworICA8aDQ+TmV4dCB0b3BpYzwvaDQ+CisgIDxwIGNsYXNzPSJ0b3BsZXNzIj48YSBocmVmPSJpbnN0YWxsLmh0bWwiCisgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0ibmV4dCBjaGFwdGVyIj5JbnN0YWxsYXRpb248L2E+PC9wPgorPGRpdiBpZD0ic2VhcmNoYm94IiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CisgIDxoMz5RdWljayBzZWFyY2g8L2gzPgorICAgIDxmb3JtIGNsYXNzPSJzZWFyY2giIGFjdGlvbj0ic2VhcmNoLmh0bWwiIG1ldGhvZD0iZ2V0Ij4KKyAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiAvPgorICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkdvIiAvPgorICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2hlY2tfa2V5d29yZHMiIHZhbHVlPSJ5ZXMiIC8+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhcmVhIiB2YWx1ZT0iZGVmYXVsdCIgLz4KKyAgICA8L2Zvcm0+CisgICAgPHAgY2xhc3M9InNlYXJjaHRpcCIgc3R5bGU9ImZvbnQtc2l6ZTogOTAlIj4KKyAgICBFbnRlciBzZWFyY2ggdGVybXMgb3IgYSBtb2R1bGUsIGNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUuCisgICAgPC9wPgorPC9kaXY+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JCgnI3NlYXJjaGJveCcpLnNob3coMCk7PC9zY3JpcHQ+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmVyIj48L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJyZWxhdGVkIj4KKyAgICAgIDxoMz5OYXZpZ2F0aW9uPC9oMz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweCI+CisgICAgICAgICAgPGEgaHJlZj0iZ2VuaW5kZXguaHRtbCIgdGl0bGU9IkdlbmVyYWwgSW5kZXgiCisgICAgICAgICAgICAgPmluZGV4PC9hPjwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJpbnN0YWxsLmh0bWwiIHRpdGxlPSJJbnN0YWxsYXRpb24iCisgICAgICAgICAgICAgPm5leHQ8L2E+IHw8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iIyI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmb290ZXIiPgorICAgICAgICAmY29weTsgQ29weXJpZ2h0IDIwMTMsIG1hcnRpbiBmLiBrcmFmZnQuCisgICAgICBDcmVhdGVkIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9zcGhpbngtZG9jLm9yZy8iPlNwaGlueDwvYT4gMS4yLjMuCisgICAgPC9kaXY+CisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbnN0YWxsLmh0bWwgYi9pbnN0YWxsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmNTY4OQotLS0gL2Rldi9udWxsCisrKyBiL2luc3RhbGwuaHRtbApAQCAtMCwwICsxLDE5MiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKKyAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorCisKKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgCisgICAgPHRpdGxlPkluc3RhbGxhdGlvbiAmbWRhc2g7IHJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbjwvdGl0bGU+CisgICAgCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9zdGF0aWMvcHlnbWVudHMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICAKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICB2YXIgRE9DVU1FTlRBVElPTl9PUFRJT05TID0geworICAgICAgICBVUkxfUk9PVDogICAgJy4vJywKKyAgICAgICAgVkVSU0lPTjogICAgICcxLjQuMScsCisgICAgICAgIENPTExBUFNFX0lOREVYOiBmYWxzZSwKKyAgICAgICAgRklMRV9TVUZGSVg6ICcuaHRtbCcsCisgICAgICAgIEhBU19TT1VSQ0U6ICB0cnVlCisgICAgICB9OworICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvanF1ZXJ5LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL3VuZGVyc2NvcmUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvZG9jdG9vbHMuanMiPjwvc2NyaXB0PgorICAgIDxsaW5rIHJlbD0idG9wIiB0aXRsZT0icmVjbGFzcyAxLjQuMSBkb2N1bWVudGF0aW9uIiBocmVmPSJpbmRleC5odG1sIiAvPgorICAgIDxsaW5rIHJlbD0ibmV4dCIgdGl0bGU9InJlY2xhc3MgY29uY2VwdHMiIGhyZWY9ImNvbmNlcHRzLmh0bWwiIC8+CisgICAgPGxpbmsgcmVsPSJwcmV2IiB0aXRsZT0icmVjbGFzcyDigJQgUmVjdXJzaXZlIGV4dGVybmFsIG5vZGUgY2xhc3NpZmljYXRpb24iIGhyZWY9ImluZGV4Lmh0bWwiIC8+IAorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9IkkiPmluZGV4PC9hPjwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJjb25jZXB0cy5odG1sIiB0aXRsZT0icmVjbGFzcyBjb25jZXB0cyIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9Ik4iPm5leHQ8L2E+IHw8L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9InJlY2xhc3Mg4oCUIFJlY3Vyc2l2ZSBleHRlcm5hbCBub2RlIGNsYXNzaWZpY2F0aW9uIgorICAgICAgICAgICAgIGFjY2Vzc2tleT0iUCI+cHJldmlvdXM8L2E+IHw8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4gIAorCisgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQiPgorICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnR3cmFwcGVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYm9keXdyYXBwZXIiPgorICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJpbnN0YWxsYXRpb24iPgorPGgxPkluc3RhbGxhdGlvbjxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjaW5zdGFsbGF0aW9uIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDE+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iZm9yLWRlYmlhbi11c2Vycy1pbmNsdWRpbmctdWJ1bnR1Ij4KKzxoMj5Gb3IgRGViaWFuIHVzZXJzIChpbmNsdWRpbmcgVWJ1bnR1KTxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjZm9yLWRlYmlhbi11c2Vycy1pbmNsdWRpbmctdWJ1bnR1IiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD48c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gaGFzIGJlZW4gPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3BhY2thZ2VzLmRlYmlhbi5vcmcvc2VhcmNoP2tleXdvcmRzPXJlY2xhc3MiPnBhY2thZ2VkIGZvciBEZWJpYW48L2E+LiBUbyB1c2UgaXQsIGp1c3QgaW5zdGFsbCBpdCB3aXRoCitBUFQ6PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPiQgYXB0LWdldCBpbnN0YWxsIHJlY2xhc3MgW3JlY2xhc3MtZG9jXQorPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9ImZvci1hcmNobGludXgtdXNlcnMiPgorPGgyPkZvciBBcmNoTGludXggdXNlcnM8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI2Zvci1hcmNobGludXgtdXNlcnMiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPjxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBpcyA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwczovL2F1ci5hcmNobGludXgub3JnL3BhY2thZ2VzL3JlY2xhc3MtZ2l0LyI+YXZhaWxhYmxlIGZvciBBcmNoTGludXg8L2E+LCB0aGFua3MgdG8gTmllbHMgQWJzcG9lbC4KK0Rvd2xvYWQgdGhlIDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHBzOi8vYXVyLmFyY2hsaW51eC5vcmcvcGFja2FnZXMvcmUvcmVjbGFzcy1naXQvcmVjbGFzcy1naXQudGFyLmd6Ij50YXJiYWxsPC9hPiBmcm9tIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+YXVyPC9zcGFuPjwvdHQ+IG9yIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+eWFvdXJ0PC9zcGFuPjwvdHQ+OjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT4kIHlhb3VydCAtUyByZWNsYXNzCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+b3I6PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPiQgdGFyIHh2emYgcmVjbGFzcy1naXQudGFyLmd6CiskIGNkIHJlY2xhc3MtZ2l0OyBtYWtlcGtnCiskIHN1ZG8gcGFjbWFuIC1VIHJlY2xhc3MtZ2l0LSZsdDtnaXQtY29tbWl0LWhhc2gmZ3Q7LnRhci5negorPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9Im90aGVyLWRpc3RyaWJ1dGlvbnMiPgorPGgyPk90aGVyIGRpc3RyaWJ1dGlvbnM8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI290aGVyLWRpc3RyaWJ1dGlvbnMiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPkRldmVsb3BlcnMgb2Ygb3RoZXIgZGlzdHJpYnV0aW9ucyBhcmUgY29yZGlhbGx5IGludml0ZWQgdG8gcGFja2FnZSA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4KK3RoZW1zZWx2ZXMgYW5kIDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Im1haWx0bzpyZWNsYXNzJiMzNzsmIzUyOyYjNDg7cGFudHNmdWxsb2Z1bml4JiM0NjtuZXQiPndyaXRlIHRvIHRoZSBtYWlsaW5nIGxpc3Q8L2E+IHRvIGhhdmUgZGV0YWlscyBpbmNsdWRlZCBoZXJlLiBPciBzZW5kCithIHBhdGNoITwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9ImZyb20tc291cmNlIj4KKzxoMj5Gcm9tIHNvdXJjZTxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjZnJvbS1zb3VyY2UiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPjxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBpcyBjdXJyZW50bHkgbWFpbnRhaW5lZCA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9tYWRkdWNrL3JlY2xhc3MiPm9uIEdpdGh1YjwvYT4sIHNvIHRvIG9idGFpbiB0aGUgc291cmNlLCBydW46PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPiQgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWRkdWNrL3JlY2xhc3MuZ2l0Cis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+b3I6PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPiQgZ2l0IGNsb25lIHNzaDovL2dpdEBnaXRodWIuY29tOm1hZGR1Y2svcmVjbGFzcy5naXQKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8cD5JZiB5b3Ugd2FudCBhIHRhcmJhbGwsIHBsZWFzZSA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vaHR0cC5kZWJpYW4ubmV0L2RlYmlhbi9wb29sL21haW4vci9yZWNsYXNzLyI+b2J0YWluIGl0IGZyb20gdGhlIERlYmlhbiBhcmNoaXZlPC9hPi48L3A+Cis8cD5CZWZvcmUgeW91IGNhbiB1c2UgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+LCB5b3UgbmVlZCB0byBpbnN0YWxsIGl0IGludG8gYSBwbGFjZSB3aGVyZSBQeXRob24KK2NhbiBmaW5kIGl0LiBUaGUgZm9sbG93aW5nIHN0ZXAgc2hvdWxkIGluc3RhbGwgdGhlIHBhY2thZ2UgdG8gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vdXNyL2xvY2FsPC9zcGFuPjwvdHQ+OjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT4kIHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+SWYgeW91IHdhbnQgdG8gaW5zdGFsbCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiwgdXNlICYjODIxMTtwcmVmaXggbGlrZSBzbzo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCBweXRob24gc2V0dXAucHkgaW5zdGFsbCAtLXByZWZpeD0vb3B0L2xvY2FsCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+SnVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgaW4gdGhlIFB5dGhvbiBtb2R1bGUgc2VhcmNoIHBhdGgsIHdoaWNoCit5b3UgY2FuIGNoZWNrIGxpa2UgdGhpczo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCBweXRob24gLWMgJiMzOTtpbXBvcnQgc3lzOyBwcmludCBzeXMucGF0aCYjMzk7Cis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+TW9yZSBvcHRpb25zIGNhbiBiZSBmb3VuZCBpbiB0aGUgb3V0cHV0IG9mPC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPiQgcHl0aG9uIHNldHVwLnB5IGluc3RhbGwgLS1oZWxwCiskIHB5dGhvbiBzZXR1cC5weSAtLWhlbHAKKyQgcHl0aG9uIHNldHVwLnB5IC0taGVscC1jb21tYW5kcworJCBweXRob24gc2V0dXAucHkgLS1oZWxwIFtjbWRdCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+SWYgeW91IGp1c3Qgd2FudCB0byBydW4gPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGZyb20gc291cmNlLCBlLmcuIGJlY2F1c2UgeW91IGFyZSBnb2luZyB0byBiZQorbWFraW5nIGFuZCB0ZXN0aW5nIGNoYW5nZXMsIGluc3RhbGwgaXQgaW4gJiM4MjIwO2RldmVsb3BtZW50IG1vZGUmIzgyMjE7OjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT4kIHB5dGhvbiBzZXR1cC5weSBkZXZlbG9wCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+VG8gdW5pbnN0YWxsICh0aGUgcm0gY2FsbCBpcyBuZWNlc3NhcnkgZHVlIHRvIDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvNzE0OTYwIj5hIGJ1ZyBpbiBzZXR1cHRvb2xzPC9hPik6PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPiQgcHl0aG9uIHNldHVwLnB5IGRldmVsb3AgLS11bmluc3RhbGwKKyQgcm0gL3Vzci9sb2NhbC9iaW4vcmVjbGFzcyoKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8cD48YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNDY3MyI+VW5pbnN0YWxsYXRpb24gY3VycmVudGx5IGlzbiYjODIxNzt0IHBvc3NpYmxlPC9hPiBmb3IgcGFja2FnZXMgaW5zdGFsbGVkIHRvCisvdXNyL2xvY2FsIGFzIHBlciB0aGUgYWJvdmUgbWV0aG9kLCB1bmZvcnR1bmF0ZWx5LiBUaGUgZm9sbG93aW5nIHNob3VsZCBkbzo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCBybSAtciAvdXNyL2xvY2FsL2xpYi9weXRob24qL2Rpc3QtcGFja2FnZXMvcmVjbGFzcyogL3Vzci9sb2NhbC9iaW4vcmVjbGFzcyoKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorCisKKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9InNwaGlueHNpZGViYXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyd3JhcHBlciI+CisgIDxoMz48YSBocmVmPSJpbmRleC5odG1sIj5UYWJsZSBPZiBDb250ZW50czwvYT48L2gzPgorICA8dWw+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iIyI+SW5zdGFsbGF0aW9uPC9hPjx1bD4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjZm9yLWRlYmlhbi11c2Vycy1pbmNsdWRpbmctdWJ1bnR1Ij5Gb3IgRGViaWFuIHVzZXJzIChpbmNsdWRpbmcgVWJ1bnR1KTwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNmb3ItYXJjaGxpbnV4LXVzZXJzIj5Gb3IgQXJjaExpbnV4IHVzZXJzPC9hPjwvbGk+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI290aGVyLWRpc3RyaWJ1dGlvbnMiPk90aGVyIGRpc3RyaWJ1dGlvbnM8L2E+PC9saT4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjZnJvbS1zb3VyY2UiPkZyb20gc291cmNlPC9hPjwvbGk+Cis8L3VsPgorPC9saT4KKzwvdWw+CisKKyAgPGg0PlByZXZpb3VzIHRvcGljPC9oND4KKyAgPHAgY2xhc3M9InRvcGxlc3MiPjxhIGhyZWY9ImluZGV4Lmh0bWwiCisgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0icHJldmlvdXMgY2hhcHRlciI+cmVjbGFzcyDigJQgUmVjdXJzaXZlIGV4dGVybmFsIG5vZGUgY2xhc3NpZmljYXRpb248L2E+PC9wPgorICA8aDQ+TmV4dCB0b3BpYzwvaDQ+CisgIDxwIGNsYXNzPSJ0b3BsZXNzIj48YSBocmVmPSJjb25jZXB0cy5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Im5leHQgY2hhcHRlciI+cmVjbGFzcyBjb25jZXB0czwvYT48L3A+Cis8ZGl2IGlkPSJzZWFyY2hib3giIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KKyAgPGgzPlF1aWNrIHNlYXJjaDwvaDM+CisgICAgPGZvcm0gY2xhc3M9InNlYXJjaCIgYWN0aW9uPSJzZWFyY2guaHRtbCIgbWV0aG9kPSJnZXQiPgorICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InEiIC8+CisgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iIC8+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaGVja19rZXl3b3JkcyIgdmFsdWU9InllcyIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFyZWEiIHZhbHVlPSJkZWZhdWx0IiAvPgorICAgIDwvZm9ybT4KKyAgICA8cCBjbGFzcz0ic2VhcmNodGlwIiBzdHlsZT0iZm9udC1zaXplOiA5MCUiPgorICAgIEVudGVyIHNlYXJjaCB0ZXJtcyBvciBhIG1vZHVsZSwgY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZS4KKyAgICA8L3A+Cis8L2Rpdj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4kKCcjc2VhcmNoYm94Jykuc2hvdygwKTs8L3NjcmlwdD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZXIiPjwvZGl2PgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICA+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9ImNvbmNlcHRzLmh0bWwiIHRpdGxlPSJyZWNsYXNzIGNvbmNlcHRzIgorICAgICAgICAgICAgID5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9ImluZGV4Lmh0bWwiIHRpdGxlPSJyZWNsYXNzIOKAlCBSZWN1cnNpdmUgZXh0ZXJuYWwgbm9kZSBjbGFzc2lmaWNhdGlvbiIKKyAgICAgICAgICAgICA+cHJldmlvdXM8L2E+IHw8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmb290ZXIiPgorICAgICAgICAmY29weTsgQ29weXJpZ2h0IDIwMTMsIG1hcnRpbiBmLiBrcmFmZnQuCisgICAgICBDcmVhdGVkIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9zcGhpbngtZG9jLm9yZy8iPlNwaGlueDwvYT4gMS4yLjMuCisgICAgPC9kaXY+CisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYW5wYWdlLmh0bWwgYi9tYW5wYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhYzJkNAotLS0gL2Rldi9udWxsCisrKyBiL21hbnBhZ2UuaHRtbApAQCAtMCwwICsxLDI0MyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKKyAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorCisKKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgCisgICAgPHRpdGxlPnJlY2xhc3MgbWFucGFnZSAmbWRhc2g7IHJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbjwvdGl0bGU+CisgICAgCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9zdGF0aWMvcHlnbWVudHMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICAKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICB2YXIgRE9DVU1FTlRBVElPTl9PUFRJT05TID0geworICAgICAgICBVUkxfUk9PVDogICAgJy4vJywKKyAgICAgICAgVkVSU0lPTjogICAgICcxLjQuMScsCisgICAgICAgIENPTExBUFNFX0lOREVYOiBmYWxzZSwKKyAgICAgICAgRklMRV9TVUZGSVg6ICcuaHRtbCcsCisgICAgICAgIEhBU19TT1VSQ0U6ICB0cnVlCisgICAgICB9OworICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvanF1ZXJ5LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL3VuZGVyc2NvcmUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvZG9jdG9vbHMuanMiPjwvc2NyaXB0PgorICAgIDxsaW5rIHJlbD0idG9wIiB0aXRsZT0icmVjbGFzcyAxLjQuMSBkb2N1bWVudGF0aW9uIiBocmVmPSJpbmRleC5odG1sIiAvPgorICAgIDxsaW5rIHJlbD0ibmV4dCIgdGl0bGU9InJlY2xhc3MgY29uZmlndXJhdGlvbiBmaWxlIiBocmVmPSJjb25maWdmaWxlLmh0bWwiIC8+CisgICAgPGxpbmsgcmVsPSJwcmV2IiB0aXRsZT0iRXh0ZXJuYWwgcmVmZXJlbmNlcyIgaHJlZj0icmVmcy5odG1sIiAvPiAKKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8ZGl2IGNsYXNzPSJyZWxhdGVkIj4KKyAgICAgIDxoMz5OYXZpZ2F0aW9uPC9oMz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweCI+CisgICAgICAgICAgPGEgaHJlZj0iZ2VuaW5kZXguaHRtbCIgdGl0bGU9IkdlbmVyYWwgSW5kZXgiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJJIj5pbmRleDwvYT48L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0iY29uZmlnZmlsZS5odG1sIiB0aXRsZT0icmVjbGFzcyBjb25maWd1cmF0aW9uIGZpbGUiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJOIj5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InJlZnMuaHRtbCIgdGl0bGU9IkV4dGVybmFsIHJlZmVyZW5jZXMiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJQIj5wcmV2aW91czwvYT4gfDwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PiAgCisKKyAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudCI+CisgICAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudHdyYXBwZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJib2R5d3JhcHBlciI+CisgICAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+CisgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InJlY2xhc3MtbWFucGFnZSI+Cis8aDE+cmVjbGFzcyBtYW5wYWdlPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNyZWNsYXNzLW1hbnBhZ2UiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMT4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJzeW5vcHNpcyI+Cis8aDI+U3lub3BzaXM8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI3N5bm9wc2lzIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8ZGl2IGNsYXNzPSJsaW5lLWJsb2NrIj4KKzxkaXYgY2xhc3M9ImxpbmUiPjxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiAmIzgyMTE7aGVscDwvZGl2PgorPGRpdiBjbGFzcz0ibGluZSI+PHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IDxlbT5bb3B0aW9uc108L2VtPiAmIzgyMTE7aW52ZW50b3J5PC9kaXY+Cis8ZGl2IGNsYXNzPSJsaW5lIj48c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gPGVtPltvcHRpb25zXTwvZW0+ICYjODIxMTtub2RlaW5mbz1OT0RFTkFNRTwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJkZXNjcmlwdGlvbiI+Cis8aDI+RGVzY3JpcHRpb248YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI2Rlc2NyaXB0aW9uIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD48c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gaXMgYW4gJiM4MjIwO2V4dGVybmFsIG5vZGUgY2xhc3NpZmllciYjODIyMTsgKEVOQykgYXMgY2FuIGJlIHVzZWQgd2l0aAorYXV0b21hdGlvbiB0b29scywgc3VjaCBhcyA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vcHVwcGV0bGFicy5jb20vcHVwcGV0L3B1cHBldC1vcGVuLXNvdXJjZSI+UHVwcGV0PC9hPiwgPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3NhbHRzdGFjay5jb20vY29tbXVuaXR5Ij5TYWx0PC9hPiwgYW5kIDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93d3cuYW5zaWJsZXdvcmtzLmNvbSI+QW5zaWJsZTwvYT4uIEl0IGlzIGFsc28KK2Egc3RhbmQtYWxvbmUgdG9vbCBmb3IgbWVyZ2luZyBkYXRhIHNvdXJjZXMgcmVjdXJzaXZlbHkuPC9wPgorPHA+VGhlIHB1cnBvc2Ugb2YgYW4gRU5DIGlzIHRvIGFsbG93IGEgc3lzdGVtIGFkbWluaXN0cmF0b3IgdG8gbWFpbnRhaW4gYW4KK2ludmVudG9yeSBvZiBub2RlcyB0byBiZSBtYW5hZ2VkLCBjb21wbGV0ZWx5IHNlcGFyYXRlbHkgZnJvbSB0aGUgY29uZmlndXJhdGlvbgorb2YgdGhlIGF1dG9tYXRpb24gdG9vbC4gVXN1YWxseSwgdGhlIGV4dGVybmFsIG5vZGUgY2xhc3NpZmllciBjb21wbGV0ZWx5CityZXBsYWNlcyB0aGUgdG9vbC1zcGVjaWZpYyBpbnZlbnRvcnkgKHN1Y2ggYXMgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5zaXRlLnBwPC9zcGFuPjwvdHQ+IGZvciBQdXBwZXQsCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmV4dF9waWxsYXI8L3NwYW4+PC90dD4vPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5tYXN0ZXJfdG9wczwvc3Bhbj48L3R0PiBmb3IgU2FsdCwgb3IgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vZXRjL2Fuc2libGUvaG9zdHM8L3NwYW4+PC90dD4pLjwvcD4KKzxwPldpdGggcmVzcGVjdCB0byB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHRvb2wsIHRoZSBFTkMgdGhlbiBmdWxmaWxscyB0d28KK2pvYnM6PC9wPgorPHVsIGNsYXNzPSJzaW1wbGUiPgorPGxpPml0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGdyb3VwcyBvZiBub2RlcyBhbmQgZ3JvdXAgbWVtYmVyc2hpcHM8L2xpPgorPGxpPml0IGdpdmVzIGFjY2VzcyB0byBub2RlLXNwZWNpZmljIGluZm9ybWF0aW9uLCBzdWNoIGFzIHZhcmlhYmxlczwvbGk+Cis8L3VsPgorPHA+PHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGFsbG93cyB5b3UgdG8gZGVmaW5lIHlvdXIgbm9kZXMgdGhyb3VnaCBjbGFzcyBpbmhlcml0YW5jZSwgd2hpbGUKK2Fsd2F5cyBhYmxlIHRvIG92ZXJyaWRlIGRldGFpbHMgZnVydGhlciB1cCB0aGUgdHJlZSAoaS5lLiBpbiBtb3JlIHNwZWNpZmljCitub2RlcykuIFRoaW5rIG9mIGNsYXNzZXMgYXMgZmVhdHVyZSBzZXRzLCBhcyBjb21tb25hbGl0aWVzIGJldHdlZW4gbm9kZXMsIG9yCithcyB0YWdzLiBBZGQgdG8gdGhhdCB0aGUgYWJpbGl0eSB0byBuZXN0IGNsYXNzZXMgKG11bHRpcGxlIGluaGVyaXRhbmNlIGlzCithbGxvd2VkLCB3ZWxsLWRlZmluZWQsIGFuZCBlbmNvdXJhZ2VkKSwgYW5kIHlvdSBjYW4gYXNzZW1ibGUgeW91cgoraW5mcmFzdHJ1Y3R1cmUgZnJvbSBzbWFsbGVyIGJpdHMsIGVsaW1pbmF0aW5nIGR1cGxpY2F0aW9uIGFuZCBleHBvc2luZyBhbGwKK2ltcG9ydGFudCBwYXJhbWV0ZXJzIHRvIGEgc2luZ2xlIGxvY2F0aW9uLCBsb2dpY2FsbHkgb3JnYW5pc2VkLiBBbmQgaWYgdGhhdAoraXNuJiM4MjE3O3QgZW5vdWdoLCA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gbGV0cyB5b3UgcmVmZXJlbmNlIG90aGVyIHBhcmFtZXRlcnMgaW4gdGhlIHZlcnkKK2hpZXJhcmNoeSB5b3UgYXJlIGN1cnJlbnRseSBhc3NlbWJsaW5nLjwvcD4KKzxwPjxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiB3aWxsIGJlIHVzZWQgaW5kaXJlY3RseSB0aHJvdWdoIGFkYXB0ZXJzIG1vc3Qgb2YgdGhlIHRpbWUuIEhvd2V2ZXIsCit0aGVyZSBleGlzdHMgYSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHF1ZXJ5aW5nIHRoZSBkYXRhYmFzZS4gVGhpcworbWFudWFsIHBhZ2UgZGVzY3JpYmVzIHRoaXMgaW50ZXJmYWNlLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9Im9wdGlvbnMiPgorPGgyPk9wdGlvbnM8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI29wdGlvbnMiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPlBsZWFzZSBzZWUgdGhlIG91dHB1dCBvZiA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnJlY2xhc3M8L3NwYW4+IDxzcGFuIGNsYXNzPSJwcmUiPi0taGVscDwvc3Bhbj48L3R0PiBmb3IgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZXNlCitvcHRpb25zOjwvcD4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJkYXRhYmFzZS1vcHRpb25zIj4KKzxoMz5EYXRhYmFzZSBvcHRpb25zPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNkYXRhYmFzZS1vcHRpb25zIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDM+Cis8dGFibGUgY2xhc3M9ImRvY3V0aWxzIG9wdGlvbi1saXN0IiBmcmFtZT0idm9pZCIgcnVsZXM9Im5vbmUiPgorPGNvbCBjbGFzcz0ib3B0aW9uIiAvPgorPGNvbCBjbGFzcz0iZGVzY3JpcHRpb24iIC8+Cis8dGJvZHkgdmFsaWduPSJ0b3AiPgorPHRyPjx0ZCBjbGFzcz0ib3B0aW9uLWdyb3VwIiBjb2xzcGFuPSIyIj4KKzxrYmQ+PHNwYW4gY2xhc3M9Im9wdGlvbiI+LXM8L3NwYW4+LCA8c3BhbiBjbGFzcz0ib3B0aW9uIj4tLXN0b3JhZ2UtdHlwZTwvc3Bhbj48L2tiZD48L3RkPgorPC90cj4KKzx0cj48dGQ+Jm5ic3A7PC90ZD48dGQ+VGhlIHR5cGUgb2Ygc3RvcmFnZSBiYWNrZW5kIHRvIHVzZTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im9wdGlvbi1ncm91cCIgY29sc3Bhbj0iMiI+Cis8a2JkPjxzcGFuIGNsYXNzPSJvcHRpb24iPi1iPC9zcGFuPiwgPHNwYW4gY2xhc3M9Im9wdGlvbiI+LS1pbnZlbnRvcnktYmFzZS11cmk8L3NwYW4+PC9rYmQ+PC90ZD4KKzwvdHI+Cis8dHI+PHRkPiZuYnNwOzwvdGQ+PHRkPlRoZSBiYXNlIFVSSSB0byBwcmVwZW5kIHRvIG5vZGVzIGFuZCBjbGFzc2VzPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ib3B0aW9uLWdyb3VwIiBjb2xzcGFuPSIyIj4KKzxrYmQ+PHNwYW4gY2xhc3M9Im9wdGlvbiI+LXU8L3NwYW4+LCA8c3BhbiBjbGFzcz0ib3B0aW9uIj4tLW5vZGVzLXVyaTwvc3Bhbj48L2tiZD48L3RkPgorPC90cj4KKzx0cj48dGQ+Jm5ic3A7PC90ZD48dGQ+VGhlIFVSSSB0byB0aGUgbm9kZXMgc3RvcmFnZTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im9wdGlvbi1ncm91cCIgY29sc3Bhbj0iMiI+Cis8a2JkPjxzcGFuIGNsYXNzPSJvcHRpb24iPi1jPC9zcGFuPiwgPHNwYW4gY2xhc3M9Im9wdGlvbiI+LS1jbGFzc2VzLXVyaTwvc3Bhbj48L2tiZD48L3RkPgorPC90cj4KKzx0cj48dGQ+Jm5ic3A7PC90ZD48dGQ+VGhlIFVSSSB0byB0aGUgY2xhc3NlcyBzdG9yYWdlPC90ZD48L3RyPgorPC90Ym9keT4KKzwvdGFibGU+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJvdXRwdXQtb3B0aW9ucyI+Cis8aDM+T3V0cHV0IG9wdGlvbnM8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI291dHB1dC1vcHRpb25zIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDM+Cis8dGFibGUgY2xhc3M9ImRvY3V0aWxzIG9wdGlvbi1saXN0IiBmcmFtZT0idm9pZCIgcnVsZXM9Im5vbmUiPgorPGNvbCBjbGFzcz0ib3B0aW9uIiAvPgorPGNvbCBjbGFzcz0iZGVzY3JpcHRpb24iIC8+Cis8dGJvZHkgdmFsaWduPSJ0b3AiPgorPHRyPjx0ZCBjbGFzcz0ib3B0aW9uLWdyb3VwIj4KKzxrYmQ+PHNwYW4gY2xhc3M9Im9wdGlvbiI+LW88L3NwYW4+LCA8c3BhbiBjbGFzcz0ib3B0aW9uIj4tLW91dHB1dDwvc3Bhbj48L2tiZD48L3RkPgorPHRkPlRoZSBvdXRwdXQgZm9ybWF0IHRvIHVzZSAoeWFtbCBvciBqc29uKTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im9wdGlvbi1ncm91cCIgY29sc3Bhbj0iMiI+Cis8a2JkPjxzcGFuIGNsYXNzPSJvcHRpb24iPi15PC9zcGFuPiwgPHNwYW4gY2xhc3M9Im9wdGlvbiI+LS1wcmV0dHktcHJpbnQ8L3NwYW4+PC9rYmQ+PC90ZD4KKzwvdHI+Cis8dHI+PHRkPiZuYnNwOzwvdGQ+PHRkPlRyeSB0byBtYWtlIHRoZSBvdXRwdXQgcHJldHRpZXI8L3RkPjwvdHI+Cis8L3Rib2R5PgorPC90YWJsZT4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9Im1vZGVzIj4KKzxoMz5Nb2RlczxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjbW9kZXMiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMz4KKzx0YWJsZSBjbGFzcz0iZG9jdXRpbHMgb3B0aW9uLWxpc3QiIGZyYW1lPSJ2b2lkIiBydWxlcz0ibm9uZSI+Cis8Y29sIGNsYXNzPSJvcHRpb24iIC8+Cis8Y29sIGNsYXNzPSJkZXNjcmlwdGlvbiIgLz4KKzx0Ym9keSB2YWxpZ249InRvcCI+Cis8dHI+PHRkIGNsYXNzPSJvcHRpb24tZ3JvdXAiIGNvbHNwYW49IjIiPgorPGtiZD48c3BhbiBjbGFzcz0ib3B0aW9uIj4taTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJvcHRpb24iPi0taW52ZW50b3J5PC9zcGFuPjwva2JkPjwvdGQ+Cis8L3RyPgorPHRyPjx0ZD4mbmJzcDs8L3RkPjx0ZD5PdXRwdXQgdGhlIGVudGlyZSBpbnZlbnRvcnk8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJvcHRpb24tZ3JvdXAiPgorPGtiZD48c3BhbiBjbGFzcz0ib3B0aW9uIj4tbjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJvcHRpb24iPi0tbm9kZWluZm88L3NwYW4+PC9rYmQ+PC90ZD4KKzx0ZD5PdXRwdXQgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgbm9kZTwvdGQ+PC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iaW5mb3JtYXRpb24iPgorPGgzPkluZm9ybWF0aW9uPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNpbmZvcm1hdGlvbiIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gzPgorPHRhYmxlIGNsYXNzPSJkb2N1dGlscyBvcHRpb24tbGlzdCIgZnJhbWU9InZvaWQiIHJ1bGVzPSJub25lIj4KKzxjb2wgY2xhc3M9Im9wdGlvbiIgLz4KKzxjb2wgY2xhc3M9ImRlc2NyaXB0aW9uIiAvPgorPHRib2R5IHZhbGlnbj0idG9wIj4KKzx0cj48dGQgY2xhc3M9Im9wdGlvbi1ncm91cCI+Cis8a2JkPjxzcGFuIGNsYXNzPSJvcHRpb24iPi1oPC9zcGFuPiwgPHNwYW4gY2xhc3M9Im9wdGlvbiI+LS1oZWxwPC9zcGFuPjwva2JkPjwvdGQ+Cis8dGQ+SGVscCBvdXRwdXQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJvcHRpb24tZ3JvdXAiPgorPGtiZD48c3BhbiBjbGFzcz0ib3B0aW9uIj4tLXZlcnNpb248L3NwYW4+PC9rYmQ+PC90ZD4KKzx0ZD5EaXNwbGF5IHZlcnNpb24gbnVtYmVyPC90ZD48L3RyPgorPC90Ym9keT4KKzwvdGFibGU+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InNlZS1hbHNvIj4KKzxoMj5TZWUgYWxzbzxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjc2VlLWFsc28iIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPlBsZWFzZSB2aXNpdCA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vcmVjbGFzcy5wYW50c2Z1bGxvZnVuaXgubmV0LyI+aHR0cDovL3JlY2xhc3MucGFudHNmdWxsb2Z1bml4Lm5ldC88L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cis8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4uPC9wPgorPHA+VGhlIGRvY3VtZW50YXRpb24gaXMgYWxzbyBhdmFpbGFibGUgZnJvbSB0aGUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4uL2RvYzwvc3Bhbj48L3R0PiBzdWJ0cmVlIGluIHRoZSBzb3VyY2UKK2NoZWNrb3V0LCBvciBmcm9tIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+L3Vzci9zaGFyZS9kb2MvcmVjbGFzcy1kb2M8L3NwYW4+PC90dD4uPC9wPgorPC9kaXY+Cis8L2Rpdj4KKworCisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic3BoaW54c2lkZWJhcndyYXBwZXIiPgorICA8aDM+PGEgaHJlZj0iaW5kZXguaHRtbCI+VGFibGUgT2YgQ29udGVudHM8L2E+PC9oMz4KKyAgPHVsPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiMiPnJlY2xhc3MgbWFucGFnZTwvYT48dWw+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI3N5bm9wc2lzIj5TeW5vcHNpczwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNkZXNjcmlwdGlvbiI+RGVzY3JpcHRpb248L2E+PC9saT4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjb3B0aW9ucyI+T3B0aW9uczwvYT48dWw+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI2RhdGFiYXNlLW9wdGlvbnMiPkRhdGFiYXNlIG9wdGlvbnM8L2E+PC9saT4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjb3V0cHV0LW9wdGlvbnMiPk91dHB1dCBvcHRpb25zPC9hPjwvbGk+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI21vZGVzIj5Nb2RlczwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNpbmZvcm1hdGlvbiI+SW5mb3JtYXRpb248L2E+PC9saT4KKzwvdWw+Cis8L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNzZWUtYWxzbyI+U2VlIGFsc288L2E+PC9saT4KKzwvdWw+Cis8L2xpPgorPC91bD4KKworICA8aDQ+UHJldmlvdXMgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0icmVmcy5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9InByZXZpb3VzIGNoYXB0ZXIiPkV4dGVybmFsIHJlZmVyZW5jZXM8L2E+PC9wPgorICA8aDQ+TmV4dCB0b3BpYzwvaDQ+CisgIDxwIGNsYXNzPSJ0b3BsZXNzIj48YSBocmVmPSJjb25maWdmaWxlLmh0bWwiCisgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0ibmV4dCBjaGFwdGVyIj5yZWNsYXNzIGNvbmZpZ3VyYXRpb24gZmlsZTwvYT48L3A+Cis8ZGl2IGlkPSJzZWFyY2hib3giIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KKyAgPGgzPlF1aWNrIHNlYXJjaDwvaDM+CisgICAgPGZvcm0gY2xhc3M9InNlYXJjaCIgYWN0aW9uPSJzZWFyY2guaHRtbCIgbWV0aG9kPSJnZXQiPgorICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InEiIC8+CisgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iIC8+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaGVja19rZXl3b3JkcyIgdmFsdWU9InllcyIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFyZWEiIHZhbHVlPSJkZWZhdWx0IiAvPgorICAgIDwvZm9ybT4KKyAgICA8cCBjbGFzcz0ic2VhcmNodGlwIiBzdHlsZT0iZm9udC1zaXplOiA5MCUiPgorICAgIEVudGVyIHNlYXJjaCB0ZXJtcyBvciBhIG1vZHVsZSwgY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZS4KKyAgICA8L3A+Cis8L2Rpdj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4kKCcjc2VhcmNoYm94Jykuc2hvdygwKTs8L3NjcmlwdD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZXIiPjwvZGl2PgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICA+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9ImNvbmZpZ2ZpbGUuaHRtbCIgdGl0bGU9InJlY2xhc3MgY29uZmlndXJhdGlvbiBmaWxlIgorICAgICAgICAgICAgID5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InJlZnMuaHRtbCIgdGl0bGU9IkV4dGVybmFsIHJlZmVyZW5jZXMiCisgICAgICAgICAgICAgPnByZXZpb3VzPC9hPiB8PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9ImluZGV4Lmh0bWwiPnJlY2xhc3M8L2E+ICZyYXF1bzs8L2xpPiAKKyAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZm9vdGVyIj4KKyAgICAgICAgJmNvcHk7IENvcHlyaWdodCAyMDEzLCBtYXJ0aW4gZi4ga3JhZmZ0LgorICAgICAgQ3JlYXRlZCB1c2luZyA8YSBocmVmPSJodHRwOi8vc3BoaW54LWRvYy5vcmcvIj5TcGhpbng8L2E+IDEuMi4zLgorICAgIDwvZGl2PgorICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy5pbnYgYi9vYmplY3RzLmludgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTkyYjE1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqZWN0cy5pbnYKQEAgLTAsMCArMSw3IEBACisjIFNwaGlueCBpbnZlbnRvcnkgdmVyc2lvbiAyCisjIFByb2plY3Q6IHJlY2xhc3MKKyMgVmVyc2lvbjogMS40CisjIFRoZSByZW1haW5kZXIgb2YgdGhpcyBmaWxlIGlzIGNvbXByZXNzZWQgdXNpbmcgemxpYi4KK3jabctBCivCMBCF4X1OMaDbCG69QReC4AFk2hnSwCQpmRTs7UUmLlrc/u97qVDMxG/QRjfBkQX8FZbNpz5c5pbkBPdCqzAM3+QC5z+nX+0Po8pYp3kPrXX2NPDAwC4X4lDLuujhgNKMn8E7bTXm8JpQ28Fh1jgKKxs15o159wF3VFFLClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3BlcmF0aW9ucy5odG1sIGIvb3BlcmF0aW9ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOWQ3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVyYXRpb25zLmh0bWwKQEAgLTAsMCArMSwyNjcgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKworCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgIAorICAgIDx0aXRsZT5yZWNsYXNzIG9wZXJhdGlvbnMgJm1kYXNoOyByZWNsYXNzIDEuNC4xIGRvY3VtZW50YXRpb248L3RpdGxlPgorICAgIAorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iX3N0YXRpYy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL3B5Z21lbnRzLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgCisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgdmFyIERPQ1VNRU5UQVRJT05fT1BUSU9OUyA9IHsKKyAgICAgICAgVVJMX1JPT1Q6ICAgICcuLycsCisgICAgICAgIFZFUlNJT046ICAgICAnMS40LjEnLAorICAgICAgICBDT0xMQVBTRV9JTkRFWDogZmFsc2UsCisgICAgICAgIEZJTEVfU1VGRklYOiAnLmh0bWwnLAorICAgICAgICBIQVNfU09VUkNFOiAgdHJ1ZQorICAgICAgfTsKKyAgICA8L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL2pxdWVyeS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy91bmRlcnNjb3JlLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL2RvY3Rvb2xzLmpzIj48L3NjcmlwdD4KKyAgICA8bGluayByZWw9InRvcCIgdGl0bGU9InJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbiIgaHJlZj0iaW5kZXguaHRtbCIgLz4KKyAgICA8bGluayByZWw9Im5leHQiIHRpdGxlPSJVc2luZyByZWNsYXNzIiBocmVmPSJ1c2FnZS5odG1sIiAvPgorICAgIDxsaW5rIHJlbD0icHJldiIgdGl0bGU9InJlY2xhc3MgY29uY2VwdHMiIGhyZWY9ImNvbmNlcHRzLmh0bWwiIC8+IAorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9IkkiPmluZGV4PC9hPjwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJ1c2FnZS5odG1sIiB0aXRsZT0iVXNpbmcgcmVjbGFzcyIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9Ik4iPm5leHQ8L2E+IHw8L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0iY29uY2VwdHMuaHRtbCIgdGl0bGU9InJlY2xhc3MgY29uY2VwdHMiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJQIj5wcmV2aW91czwvYT4gfDwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PiAgCisKKyAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudCI+CisgICAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudHdyYXBwZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJib2R5d3JhcHBlciI+CisgICAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+CisgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InJlY2xhc3Mtb3BlcmF0aW9ucyI+Cis8aDE+cmVjbGFzcyBvcGVyYXRpb25zPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNyZWNsYXNzLW9wZXJhdGlvbnMiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMT4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJ5YW1sLWZzLXN0b3JhZ2UiPgorPGgyPllBTUwgRlMgc3RvcmFnZTxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjeWFtbC1mcy1zdG9yYWdlIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD5XaGlsZSA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gaGFzIGJlZW4gYnVpbHQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgc3RvcmFnZSBiYWNrZW5kcyB0aHJvdWdoCitwbHVnaW5zLCBjdXJyZW50bHkgb25seSB0aGUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj55YW1sX2ZzPC9zcGFuPjwvdHQ+IHN0b3JhZ2UgYmFja2VuZCBleGlzdHMuIFRoaXMgaXMgYSB2ZXJ5CitzaW1wbGUsIHlldCBwb3dlcmZ1bCwgWUFNTC1iYXNlZCBiYWNrZW5kLCB1c2luZyBmbGF0IGZpbGVzIG9uIHRoZSBmaWxlc3lzdGVtCisoYXMgc3VnZ2VzdGVkIGJ5IHRoZSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPl9mczwvc3Bhbj48L3R0PiBwb3N0Zml4KS48L3A+Cis8cD48dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnlhbWxfZnM8L3NwYW4+PC90dD4gd29ya3Mgd2l0aCB0d28gZGlyZWN0b3JpZXMsIG9uZSBmb3Igbm9kZSBkZWZpbml0aW9ucywgYW5kIGFub3RoZXIKK2ZvciBjbGFzcyBkZWZpbml0aW9ucy4gVGhlIHR3byBkaXJlY3RvcmllcyBtdXN0IG5vdCBiZSB0aGUgc2FtZSwgbm9yIGNhbiBvbmUKK2JlIGEgcGFyZW50IG9mIHRoZSBvdGhlci48L3A+Cis8cD5GaWxlcyBpbiB0aG9zZSBkaXJlY3RvcmllcyBhcmUgWUFNTC1maWxlcywgc3BlY2lmeWluZyBrZXktdmFsdWUgcGFpcnMuIFRoZQorZm9sbG93aW5nIHRocmVlIGtleXMgYXJlIHJlYWQgYnkgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+OjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNsYXNzPSJkb2N1dGlscyI+Cis8Y29sZ3JvdXA+Cis8Y29sIHdpZHRoPSIxNiUiIC8+Cis8Y29sIHdpZHRoPSI4NCUiIC8+Cis8L2NvbGdyb3VwPgorPHRoZWFkIHZhbGlnbj0iYm90dG9tIj4KKzx0ciBjbGFzcz0icm93LW9kZCI+PHRoIGNsYXNzPSJoZWFkIj5LZXk8L3RoPgorPHRoIGNsYXNzPSJoZWFkIj5EZXNjcmlwdGlvbjwvdGg+Cis8L3RyPgorPC90aGVhZD4KKzx0Ym9keSB2YWxpZ249InRvcCI+Cis8dHIgY2xhc3M9InJvdy1ldmVuIj48dGQ+Y2xhc3NlczwvdGQ+Cis8dGQ+YSBsaXN0IG9mIHBhcmVudCBjbGFzc2VzPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9InJvdy1vZGQiPjx0ZD5hcHBsaWF0aW9uczwvdGQ+Cis8dGQ+YSBsaXN0IG9mIGFwcGxpY2F0aW9ucyB0byBhcHBlbmQgdG8gdGhlIGFwcGxpY2F0aW9ucyBkZWZpbmVkIGJ5CithbmNlc3RvcnMuIElmIGFuIGFwcGxpY2F0aW9uIG5hbWUgc3RhcnRzIHdpdGggPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5+PC9zcGFuPjwvdHQ+LCBpdCB3b3VsZAorcmVtb3ZlIHRoaXMgYXBwbGljYXRpb24gZnJvbSB0aGUgbGlzdCwgaWYgaXQgaGFkIGFscmVhZHkgYmVlbgorYWRkZWQg4oCUIGJ1dCBpdCBkb2VzIG5vdCBwcmV2ZW50IGEgZnV0dXJlIGFkZGl0aW9uLgorRS5nLiA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPn5maXJld2FsbGVkPC9zcGFuPjwvdHQ+PC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9InJvdy1ldmVuIj48dGQ+cGFyYW1ldGVyczwvdGQ+Cis8dGQ+PHAgY2xhc3M9ImZpcnN0Ij5rZXktdmFsdWUgcGFpcnMgdG8gc2V0IGRlZmF1bHRzIGluIGNsYXNzIGRlZmluaXRpb25zLCBvdmVycmlkZQorZXhpc3RpbmcgZGF0YSwgb3IgcHJvdmlkZSBub2RlLXNwZWNpZmljIGluZm9ybWF0aW9uIGluIG5vZGUKK3NwZWNpZmljYXRpb25zLgorQnkgY29udmVudGlvbiwgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIGFuIGFwcGxpY2F0aW9uCitzaG91bGQgYmUgcHJvdmlkZWQgYXMgc3Via2V5LXZhbHVlIHBhaXJzLCBrZXllZCBieSB0aGUgbmFtZSBvZgordGhlIGFwcGxpY2F0aW9uLCBlLmcuOjwvcD4KKzxkaXYgY2xhc3M9Imxhc3QgaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPmFwcGxpY2F0aW9uczoKKy0gc3NoLnNlcnZlcgorcGFyYW1ldGVyczoKKyAgc3NoLnNlcnZlcjoKKyAgICBwZXJtaXRfcm9vdF9sb2dpbjogbm8KKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0icm93LW9kZCI+PHRkPmVudmlyb25tZW50PC90ZD4KKzx0ZD5vbmx5IHJlbGV2YW50IGZvciBub2RlcywgdGhpcyBhbGxvd3MgdG8gc3BlY2lmeSBhbiAmIzgyMjA7ZW52aXJvbm1lbnQmIzgyMjE7CitpbnRvIHdoaWNoIHRoZSBub2RlIGRlZmluaXRpb24gaXMgc3VwcG9zZWQgdG8gYmUgcGxhY2UuPC90ZD4KKzwvdHI+Cis8L3Rib2R5PgorPC90YWJsZT4KKzxwPkNsYXNzZXMgZmlsZXMgbWF5IHJlc2lkZSBpbiBzdWJkaXJlY3Rvcmllcywgd2hpY2ggYWN0IGFzIG5hbWVzcGFjZXMuIEZvcgoraW5zdGFuY2UsIGEgY2xhc3MgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5zc2guc2VydmVyPC9zcGFuPjwvdHQ+IHdpbGwgcmVzdWx0IGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIHRvIGJlCityZWFkIGZyb20gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5zc2gvc2VydmVyLnltbDwvc3Bhbj48L3R0Pi4gU3BlY2lmeWluZyBqdXN0IDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+c3NoPC9zcGFuPjwvdHQ+IHdpbGwgY2F1c2UgdGhlIGNsYXNzCitkYXRhIHRvIGJlIHJlYWQgZnJvbSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnNzaC9pbml0LnltbDwvc3Bhbj48L3R0PiBvciA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPnNzaC55bWw8L3NwYW4+PC90dD4uIE5vdGUsIGhvd2V2ZXIsIHRoYXQgb25seQorb25lIG9mIHRob3NlIHR3byBtYXkgYmUgcHJlc2VudC48L3A+Cis8cD5Ob2RlcyBtYXkgYWxzbyBiZSBkZWZpbmVkIGluIHN1YmRpcmVjdG9yaWVzLiBIb3dldmVyLCBub2RlIG5hbWVzIChmaWxlbmFtZSkKK211c3QgYmUgdW5pcXVlIGFjcm9zcyBhbGwgc3ViZGlyZWN0b3JpZXMsIGFuZCA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gd2lsbCBleGl0IHdpdGggYW4KK2Vycm9yIGlmIGEgbm9kZSBpcyBkZWZpbmVkIG11bHRpcGxlIHRpbWVzLiBTdWJkaXJlY3RvcmllcyB0aGVyZWZvcmUgcmVhbGx5Citvbmx5IGV4aXN0IGZvciB0aGUgYWRtaW5pc3RyYXRvciYjODIxNztzIGxvY2FsIGRhdGEgc3RydWN0dXJpbmcuIFRoZXkgbWF5IGJlIHVzZWQgaW4KK21hcHBpbmdzIChzZWUgYmVsb3cpIHRvIHRhZyBhZGRpdGlvbmFsIGNsYXNzZXMgb250byBub2Rlcy48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJkYXRhLW1lcmdpbmciPgorPGgyPkRhdGEgbWVyZ2luZzxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjZGF0YS1tZXJnaW5nIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD48c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gaGFzIHR3byBtb2RlcyBvZiBvcGVyYXRpb246IG5vZGUgaW5mb3JtYXRpb24gcmV0cmlldmFsIGFuZCBpbnZlbnRvcnkKK2xpc3RpbmcuIFRoZSBzZWNvbmQgaXMgcmVhbGx5IGp1c3QgYSBsb29wIG9mIHRoZSBmaXJzdCBhY3Jvc3MgYWxsIGRlZmluZWQKK25vZGVzLCBhbmQgbmVlZHMgbm90IGJlIGZ1cnRoZXIgZGVzY3JpYmVkLjwvcD4KKzxwPldoZW4gcmV0cmlldmluZyBpbmZvcm1hdGlvbiBhYm91dCBhIG5vZGUsIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBmaXJzdCBvYnRhaW5zIHRoZSBub2RlCitkZWZpbml0aW9uIGZyb20gdGhlIHN0b3JhZ2UgYmFja2VuZC4gVGhlbiwgaXQgaXRlcmF0ZXMgdGhlIGxpc3Qgb2YgY2xhc3NlcworZGVmaW5lZCBmb3IgdGhlIG5vZGUgYW5kIHJlY3Vyc2l2ZWx5IGFza3MgdGhlIHN0b3JhZ2UgYmFja2VuZCBmb3IgZWFjaCBjbGFzcworZGVmaW5pdGlvbiAodW5sZXNzIGFscmVhZHkgY2FjaGVkKS48L3A+Cis8cD5OZXh0LCA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gcmVjdXJzaXZlbHkgZGVzY2VuZHMgZWFjaCBjbGFzcywgbG9va2luZyBhdCB0aGUgY2xhc3NlcyBpdAorZGVmaW5lcywgYW5kIHNvIG9uLCB1bnRpbCBhIGxlYWYgbm9kZSBpcyByZWFjaGVkLCBpLmUuIGEgY2xhc3MgdGhhdCByZWZlcmVuY2VzCitubyBvdGhlciBjbGFzc2VzLjwvcD4KKzxwPk5vdywgdGhlIG1lcmdpbmcgc3RhcnRzLiBBdCBldmVyeSBzdGVwLCB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbnMgYW5kIHRoZSBzZXQKK29mIHBhcmFtZXRlcnMgYXQgZWFjaCBsZXZlbCBpcyBtZXJnZWQgaW50byB3aGF0IGhhcyBiZWVuIGFjY3VtdWxhdGVkIHNvIGZhci48L3A+Cis8cD5NZXJnaW5nIG9mIHBhcmFtZXRlcnMgaXMgZG9uZSAmIzgyMjA7ZGVlcGx5JiM4MjIxOywgbWVhbmluZyB0aGF0IGxpc3RzIGFuZCBkaWN0aW9uYXJpZXMKK2FyZSBleHRlbmRlZCAocmVjdXJzaXZlbHkpLCByYXRoZXIgdGhhbiByZXBsYWNlZC4gSG93ZXZlciwgYSBzY2FsYXIgdmFsdWUKKzxlbT5kb2VzPC9lbT4gb3ZlcndyaXRlIGEgZGljdGlvbmFyeSBvciBsaXN0IHZhbHVlLiBXaGlsZSB0aGUgc2NhbGFyIGNvdWxkIGJlCithcHBlbmRlZCB0byBhbiBleGlzdGluZyBsaXN0LCB0aGVyZSBpcyBubyBzYW5lIGRlZmF1bHQgYXNzdW1wdGlvbiBpbiB0aGUKK2NvbnRleHQgb2YgYSBkaWN0aW9uYXJ5LCBzbyB0aGlzIGJlaGF2aW91ciBzZWVtcyB0aGUgbW9zdCBsb2dpY2FsLiBQbHVzLCBpdAorYWxsb3dzIGZvciBhIGRpY3Rpb25hcnkgdG8gYmUgZXJhc2VkIGJ5IG92ZXJ3cml0aW5nIGl0IHdpdGggdGhlIG51bGwgdmFsdWUuPC9wPgorPHA+QWZ0ZXIgYWxsIGNsYXNzZXMgKGFuZCB0aGUgY2xhc3NlcyB0aGV5IHJlZmVyZW5jZSkgaGF2ZSBiZWVuIHZpc2l0ZWQsCis8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gZmluYWxseSBtZXJnZXMgdGhlIGFwcGxpY2F0aW9ucyBsaXN0IGFuZCBwYXJhbWV0ZXJzIGRlZmluZWQgZm9yIHRoZQorbm9kZSBpbnRvIHdoYXQgaGFzIGJlZW4gYWNjdW11bGF0ZWQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBjbGFzc2VzLCBhbmQKK3JldHVybnMgdGhlIGZpbmFsIHJlc3VsdC48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJ3aWxkY2FyZC1yZWdleHAtbWFwcGluZ3MiPgorPGgyPldpbGRjYXJkL1JlZ2V4cCBtYXBwaW5nczxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjd2lsZGNhcmQtcmVnZXhwLW1hcHBpbmdzIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD5Vc2luZyB0aGUgPGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iY29uZmlnZmlsZS5odG1sIj48ZW0+Y29uZmlndXJhdGlvbiBmaWxlPC9lbT48L2E+LCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvCitwcm92aWRlIGEgbGlzdCBtYXBwaW5ncyBiZXR3ZWVuIG5vZGUgbmFtZXMgYW5kIGNsYXNzZXMuIEZvciBpbnN0YW5jZTo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+Y2xhc3NfbWFwcGluZ3M6CisgIC0gXCogZGVmYXVsdAorICAtIC9ed3d3XGQrLyB3ZWJzZXJ2ZXIKKyAgLSBcKi5jaCBob3N0ZWRAc3dpdHplcmxhbmQgYW5vdGhlcl9jbGFzc190b19zaG93X3RoYXRfaXRfY2FuX3Rha2VfbGlzdHMKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8cD5UaGlzIHdpbGwgYXNzaWduIHRoZSA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmRlZmF1bHQ8L3NwYW4+PC90dD4gY2xhc3MgdG8gYWxsIG5vZGVzIChtYWtlIHN1cmUgdG8gZXNjYXBlCithIGxlYWRpbmcgYXN0ZXJpc2sgKCopIHRvIGtlZXAgWUFNTCBoYXBweSksIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+d2Vic2VydmVyPC9zcGFuPjwvdHQ+IHRvIGFsbCBub2RlcyBuYW1lZAorPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj53d3cxPC9zcGFuPjwvdHQ+IG9yIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+d3d3OTk5PC9zcGFuPjwvdHQ+LCBhbmQgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5ob3N0ZWQtaW4tc3dpdHplcmxhbmQ8L3NwYW4+PC90dD4gdG8gYWxsIG5vZGVzIHdob3NlIG5hbWVzCitlbmQgd2l0aCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi5jaDwvc3Bhbj48L3R0PiAoYWdhaW4sIG5vdGUgdGhlIGVzY2FwZWQgbGVhZGluZyBhc3RlcmlzaykuIE11bHRpcGxlIGNsYXNzZXMKK2NhbiBiZSBhc3NpZ25lZCB0byBlYWNoIG1hcHBpbmcgYnkgcHJvdmlkaW5nIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3QgKGNsYXNzCituYW1lcyBjYW5ub3QgY29udGFpbiBzcGFjZXMgYW55d2F5KS48L3A+Cis8ZGl2IGNsYXNzPSJhZG1vbml0aW9uIHdhcm5pbmciPgorPHAgY2xhc3M9ImZpcnN0IGFkbW9uaXRpb24tdGl0bGUiPldhcm5pbmc8L3A+Cis8cCBjbGFzcz0ibGFzdCI+VGhlIGNsYXNzIG1hcHBpbmdzIGRvIG5vdCByZWFsbHkgYmVsb25nIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIGFzIHRoZXkKK2FyZSBkYXRhLCBub3QgY29uZmlndXJhdGlvbiBpbm1mb3JtYXRpb24uIFRoZXJlZm9yZSwgdGhleSBhcmUgbGlrZWx5IGdvaW5nCit0byBtb3ZlIGVsc2V3aGVyZSwgYnV0IEkgaGF2ZSBub3QgcXVpdGUgZmlndXJlZCBvdXQgdG8gd2hlcmUuIE1vc3QgbGlrZWx5LAordGhlcmUgd2lsbCBiZSBhbiBhZGRpdGlvbmFsIGZpbGUsIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLCB3aGljaAordGhlbiBsaXN0cyB0aGUgbWFwcGluZ3MuPC9wPgorPC9kaXY+Cis8cD5Ob3RlIHRoYXQgbWFwcGluZ3MgYXJlIG5vdCBkZXNpZ25lZCB0byByZXBsYWNlIG5vZGUgZGVmaW5pdGlvbnMuIE1hcHBpbmdzIGNhbgorYmUgdXNlZCB0byBwcmUtcG9wdWxhdGUgdGhlIGNsYXNzZXMgb2YgZXhpc3Rpbmcgbm9kZXMsIGJ1dCB5b3Ugc3RpbGwgbmVlZCB0bworZGVmaW5lIGFsbCBub2RlcyAoYW5kIGlmIG9ubHkgdG8gYWxsb3cgdGhlbSB0byBiZSBlbnVtZXJhdGVkIGZvciB0aGUKK2ludmVudG9yeSkuPC9wPgorPHA+VGhlIG1hcHBlZCBjbGFzc2VzIGNhbiBhbHNvIGNvbnRhaW4gYmFja3JlZmVyZW5jZXMgd2hlbiByZWd1bGFyIGV4cHJlc3Npb25zCithcmUgdXNlZCwgYWx0aG91Z2ggdGhleSBuZWVkIHRvIGJlIGVzY2FwZWQsIGUuZy46PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPmNsYXNzX21hcHBpbmdzOgorICAtIC9cLihcUyspJC8gdGxkLVxcMQorPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzxwPkZ1cnRoZXJtb3JlLCBzaW5jZSB0aGUgb3V0ZXIgc2xhc2hlcyAoJiM4MjE2Oy8mIzgyMTc7KSBhcmUgdXNlZCB0byAmIzgyMjA7cXVvdGUmIzgyMjE7IHRoZSByZWd1bGFyCitleHByZXNzaW9uLCA8ZW0+YW55PC9lbT4gc2xhc2hlcyB3aXRoaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtdXN0IGJlIGVzY2FwZWQuIEZvcgoraW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgY2xhc3MgbWFwcGluZyBhc3NpZ25zIGEgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5zdWJkaXItWDwvc3Bhbj48L3R0PiBjbGFzcyB0byBhbGwKK25vZGVzIHRoYXQgYXJlIGRlZmluZWQgaW4gYSBzdWJkaXJlY3RvcnkgKHVzaW5nIHlhbWxfZnMpOjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT5jbGFzc19tYXBwaW5nczoKKyAgLSAvXihbXlwvXSspXC8vIHN1YmRpci1cXDEKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJwYXJhbWV0ZXItaW50ZXJwb2xhdGlvbiI+Cis8aDI+UGFyYW1ldGVyIGludGVycG9sYXRpb248YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI3BhcmFtZXRlci1pbnRlcnBvbGF0aW9uIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD5QYXJhbWV0ZXJzIG1heSByZWZlcmVuY2UgZWFjaCBvdGhlciwgaW5jbHVkaW5nIGRlZXAgcmVmZXJlbmNlcywgZS5nLjo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+cGFyYW1ldGVyczoKKyAgbG9jYXRpb246IE11bmljaCwgR2VybWFueQorICBtb3RkOgorICAgIGhlYWRlcjogVGhpcyBub2RlIHNpdHMgaW4gJHtsb2NhdGlvbn0KKyAgZm9yX2RlbW9uc3RyYXRpb246ICR7bW90ZDpoZWFkZXJ9CisgIGRpY3RfcmVmZXJlbmNlOiAke21vdGR9Cis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+QWZ0ZXIgbWVyZ2luZyBhbmQgaW50ZXJwb2xhdGlvbiwgd2hpY2ggaGFwcGVucyBhdXRvbWF0aWNhbGx5IGluc2lkZSB0aGUKK3N0b3JhZ2UgbW9kdWxlcywgdGhlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+Zm9yX2RlbW9uc3RyYXRpb248L3NwYW4+PC90dD4gcGFyYW1ldGVyIHdpbGwgaGF2ZSBhIHZhbHVlIG9mCismIzgyMjA7VGhpcyBub2RlIHNpdHMgaW4gTXVuaWNoLCBHZXJtYW55JiM4MjIxOy48L3A+Cis8cD5UeXBlcyBhcmUgcHJlc2VydmVkIGlmIHRoZSB2YWx1ZSBjb250YWlucyBub3RoaW5nIGJ1dCBhIHJlZmVyZW5jZS4gSGVuY2UsIHRoZQordmFsdWUgb2YgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5kaWN0X3JlZmVyZW5jZTwvc3Bhbj48L3R0PiB3aWxsIGFjdHVhbGx5IGJlIGEgZGljdGlvbmFyeS48L3A+Cis8cD5Zb3Ugc2hvdWxkIG5vdyBiZSByZWFkeSB0byA8YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJ1c2FnZS5odG1sIj48ZW0+dXNlIHJlY2xhc3M8L2VtPjwvYT4hPC9wPgorPC9kaXY+Cis8L2Rpdj4KKworCisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic3BoaW54c2lkZWJhcndyYXBwZXIiPgorICA8aDM+PGEgaHJlZj0iaW5kZXguaHRtbCI+VGFibGUgT2YgQ29udGVudHM8L2E+PC9oMz4KKyAgPHVsPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiMiPnJlY2xhc3Mgb3BlcmF0aW9uczwvYT48dWw+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI3lhbWwtZnMtc3RvcmFnZSI+WUFNTCBGUyBzdG9yYWdlPC9hPjwvbGk+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI2RhdGEtbWVyZ2luZyI+RGF0YSBtZXJnaW5nPC9hPjwvbGk+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI3dpbGRjYXJkLXJlZ2V4cC1tYXBwaW5ncyI+V2lsZGNhcmQvUmVnZXhwIG1hcHBpbmdzPC9hPjwvbGk+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI3BhcmFtZXRlci1pbnRlcnBvbGF0aW9uIj5QYXJhbWV0ZXIgaW50ZXJwb2xhdGlvbjwvYT48L2xpPgorPC91bD4KKzwvbGk+Cis8L3VsPgorCisgIDxoND5QcmV2aW91cyB0b3BpYzwvaDQ+CisgIDxwIGNsYXNzPSJ0b3BsZXNzIj48YSBocmVmPSJjb25jZXB0cy5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9InByZXZpb3VzIGNoYXB0ZXIiPnJlY2xhc3MgY29uY2VwdHM8L2E+PC9wPgorICA8aDQ+TmV4dCB0b3BpYzwvaDQ+CisgIDxwIGNsYXNzPSJ0b3BsZXNzIj48YSBocmVmPSJ1c2FnZS5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Im5leHQgY2hhcHRlciI+VXNpbmcgcmVjbGFzczwvYT48L3A+Cis8ZGl2IGlkPSJzZWFyY2hib3giIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KKyAgPGgzPlF1aWNrIHNlYXJjaDwvaDM+CisgICAgPGZvcm0gY2xhc3M9InNlYXJjaCIgYWN0aW9uPSJzZWFyY2guaHRtbCIgbWV0aG9kPSJnZXQiPgorICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InEiIC8+CisgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iIC8+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaGVja19rZXl3b3JkcyIgdmFsdWU9InllcyIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFyZWEiIHZhbHVlPSJkZWZhdWx0IiAvPgorICAgIDwvZm9ybT4KKyAgICA8cCBjbGFzcz0ic2VhcmNodGlwIiBzdHlsZT0iZm9udC1zaXplOiA5MCUiPgorICAgIEVudGVyIHNlYXJjaCB0ZXJtcyBvciBhIG1vZHVsZSwgY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZS4KKyAgICA8L3A+Cis8L2Rpdj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4kKCcjc2VhcmNoYm94Jykuc2hvdygwKTs8L3NjcmlwdD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZXIiPjwvZGl2PgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICA+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InVzYWdlLmh0bWwiIHRpdGxlPSJVc2luZyByZWNsYXNzIgorICAgICAgICAgICAgID5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9ImNvbmNlcHRzLmh0bWwiIHRpdGxlPSJyZWNsYXNzIGNvbmNlcHRzIgorICAgICAgICAgICAgID5wcmV2aW91czwvYT4gfDwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImZvb3RlciI+CisgICAgICAgICZjb3B5OyBDb3B5cmlnaHQgMjAxMywgbWFydGluIGYuIGtyYWZmdC4KKyAgICAgIENyZWF0ZWQgdXNpbmcgPGEgaHJlZj0iaHR0cDovL3NwaGlueC1kb2Mub3JnLyI+U3BoaW54PC9hPiAxLjIuMy4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3B1cHBldC5odG1sIGIvcHVwcGV0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyZDk3ZgotLS0gL2Rldi9udWxsCisrKyBiL3B1cHBldC5odG1sCkBAIC0wLDAgKzEsMTA1IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgorICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CisKKworPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICAKKyAgICA8dGl0bGU+VXNpbmcgcmVjbGFzcyB3aXRoIFB1cHBldCAmbWRhc2g7IHJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbjwvdGl0bGU+CisgICAgCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9zdGF0aWMvcHlnbWVudHMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICAKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICB2YXIgRE9DVU1FTlRBVElPTl9PUFRJT05TID0geworICAgICAgICBVUkxfUk9PVDogICAgJy4vJywKKyAgICAgICAgVkVSU0lPTjogICAgICcxLjQuMScsCisgICAgICAgIENPTExBUFNFX0lOREVYOiBmYWxzZSwKKyAgICAgICAgRklMRV9TVUZGSVg6ICcuaHRtbCcsCisgICAgICAgIEhBU19TT1VSQ0U6ICB0cnVlCisgICAgICB9OworICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvanF1ZXJ5LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL3VuZGVyc2NvcmUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvZG9jdG9vbHMuanMiPjwvc2NyaXB0PgorICAgIDxsaW5rIHJlbD0idG9wIiB0aXRsZT0icmVjbGFzcyAxLjQuMSBkb2N1bWVudGF0aW9uIiBocmVmPSJpbmRleC5odG1sIiAvPgorICAgIDxsaW5rIHJlbD0ibmV4dCIgdGl0bGU9IkhhY2tpbmcgb24gcmVjbGFzcyIgaHJlZj0iaGFja2luZy5odG1sIiAvPgorICAgIDxsaW5rIHJlbD0icHJldiIgdGl0bGU9IlVzaW5nIHJlY2xhc3Mgd2l0aCBBbnNpYmxlIiBocmVmPSJhbnNpYmxlLmh0bWwiIC8+IAorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9IkkiPmluZGV4PC9hPjwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJoYWNraW5nLmh0bWwiIHRpdGxlPSJIYWNraW5nIG9uIHJlY2xhc3MiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJOIj5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9ImFuc2libGUuaHRtbCIgdGl0bGU9IlVzaW5nIHJlY2xhc3Mgd2l0aCBBbnNpYmxlIgorICAgICAgICAgICAgIGFjY2Vzc2tleT0iUCI+cHJldmlvdXM8L2E+IHw8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4gIAorCisgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQiPgorICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnR3cmFwcGVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYm9keXdyYXBwZXIiPgorICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJ1c2luZy1yZWNsYXNzLXdpdGgtcHVwcGV0Ij4KKzxoMT5Vc2luZyByZWNsYXNzIHdpdGggUHVwcGV0PGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiN1c2luZy1yZWNsYXNzLXdpdGgtcHVwcGV0IiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDE+Cis8L2Rpdj4KKworCisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic3BoaW54c2lkZWJhcndyYXBwZXIiPgorICA8aDQ+UHJldmlvdXMgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0iYW5zaWJsZS5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9InByZXZpb3VzIGNoYXB0ZXIiPlVzaW5nIHJlY2xhc3Mgd2l0aCBBbnNpYmxlPC9hPjwvcD4KKyAgPGg0Pk5leHQgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0iaGFja2luZy5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Im5leHQgY2hhcHRlciI+SGFja2luZyBvbiByZWNsYXNzPC9hPjwvcD4KKzxkaXYgaWQ9InNlYXJjaGJveCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgorICA8aDM+UXVpY2sgc2VhcmNoPC9oMz4KKyAgICA8Zm9ybSBjbGFzcz0ic2VhcmNoIiBhY3Rpb249InNlYXJjaC5odG1sIiBtZXRob2Q9ImdldCI+CisgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJHbyIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNoZWNrX2tleXdvcmRzIiB2YWx1ZT0ieWVzIiAvPgorICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYXJlYSIgdmFsdWU9ImRlZmF1bHQiIC8+CisgICAgPC9mb3JtPgorICAgIDxwIGNsYXNzPSJzZWFyY2h0aXAiIHN0eWxlPSJmb250LXNpemU6IDkwJSI+CisgICAgRW50ZXIgc2VhcmNoIHRlcm1zIG9yIGEgbW9kdWxlLCBjbGFzcyBvciBmdW5jdGlvbiBuYW1lLgorICAgIDwvcD4KKzwvZGl2PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiQoJyNzZWFyY2hib3gnKS5zaG93KDApOzwvc2NyaXB0PgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0iY2xlYXJlciI+PC9kaXY+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0icmVsYXRlZCI+CisgICAgICA8aDM+TmF2aWdhdGlvbjwvaDM+CisgICAgICA8dWw+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHgiPgorICAgICAgICAgIDxhIGhyZWY9ImdlbmluZGV4Lmh0bWwiIHRpdGxlPSJHZW5lcmFsIEluZGV4IgorICAgICAgICAgICAgID5pbmRleDwvYT48L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0iaGFja2luZy5odG1sIiB0aXRsZT0iSGFja2luZyBvbiByZWNsYXNzIgorICAgICAgICAgICAgID5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9ImFuc2libGUuaHRtbCIgdGl0bGU9IlVzaW5nIHJlY2xhc3Mgd2l0aCBBbnNpYmxlIgorICAgICAgICAgICAgID5wcmV2aW91czwvYT4gfDwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImZvb3RlciI+CisgICAgICAgICZjb3B5OyBDb3B5cmlnaHQgMjAxMywgbWFydGluIGYuIGtyYWZmdC4KKyAgICAgIENyZWF0ZWQgdXNpbmcgPGEgaHJlZj0iaHR0cDovL3NwaGlueC1kb2Mub3JnLyI+U3BoaW54PC9hPiAxLjIuMy4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlZnMuaHRtbCBiL3JlZnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTM5ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvcmVmcy5odG1sCkBAIC0wLDAgKzEsMTE5IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgorICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CisKKworPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICAKKyAgICA8dGl0bGU+RXh0ZXJuYWwgcmVmZXJlbmNlcyAmbWRhc2g7IHJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbjwvdGl0bGU+CisgICAgCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9zdGF0aWMvcHlnbWVudHMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICAKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICB2YXIgRE9DVU1FTlRBVElPTl9PUFRJT05TID0geworICAgICAgICBVUkxfUk9PVDogICAgJy4vJywKKyAgICAgICAgVkVSU0lPTjogICAgICcxLjQuMScsCisgICAgICAgIENPTExBUFNFX0lOREVYOiBmYWxzZSwKKyAgICAgICAgRklMRV9TVUZGSVg6ICcuaHRtbCcsCisgICAgICAgIEhBU19TT1VSQ0U6ICB0cnVlCisgICAgICB9OworICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvanF1ZXJ5LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL3VuZGVyc2NvcmUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvZG9jdG9vbHMuanMiPjwvc2NyaXB0PgorICAgIDxsaW5rIHJlbD0idG9wIiB0aXRsZT0icmVjbGFzcyAxLjQuMSBkb2N1bWVudGF0aW9uIiBocmVmPSJpbmRleC5odG1sIiAvPgorICAgIDxsaW5rIHJlbD0ibmV4dCIgdGl0bGU9InJlY2xhc3MgbWFucGFnZSIgaHJlZj0ibWFucGFnZS5odG1sIiAvPgorICAgIDxsaW5rIHJlbD0icHJldiIgdGl0bGU9IlVzaW5nIHJlY2xhc3MiIGhyZWY9InVzYWdlLmh0bWwiIC8+IAorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9IkkiPmluZGV4PC9hPjwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJtYW5wYWdlLmh0bWwiIHRpdGxlPSJyZWNsYXNzIG1hbnBhZ2UiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJOIj5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InVzYWdlLmh0bWwiIHRpdGxlPSJVc2luZyByZWNsYXNzIgorICAgICAgICAgICAgIGFjY2Vzc2tleT0iUCI+cHJldmlvdXM8L2E+IHw8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4gIAorCisgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQiPgorICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnR3cmFwcGVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYm9keXdyYXBwZXIiPgorICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJleHRlcm5hbC1yZWZlcmVuY2VzIj4KKzxoMT5FeHRlcm5hbCByZWZlcmVuY2VzPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNleHRlcm5hbC1yZWZlcmVuY2VzIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDE+Cis8dWwgY2xhc3M9InNpbXBsZSI+Cis8bGk+SSA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vbGludXguY29uZi5hdS9zY2hlZHVsZS8zMDIwMy92aWV3X3RhbGs/ZGF5PXdlZG5lc2RheSI+cHJlc2VudGVkIHJlY2xhc3M8L2E+IGF0IDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHBzOi8vbGNhMjAxNC5saW51eC5vcmcuYXUiPkxDQSAyMDE0PC9hPiwgd2hpY2ggYXMgYmVlbiByZWNvcmRlZDo8dWw+Cis8bGk+KFNsaWRlcyBmb3J0aGNvbWluZyk8L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly9taXJyb3IubGludXgub3JnLmF1L3B1Yi9saW51eC5jb25mLmF1LzIwMTQvV2VkbmVzZGF5LzU5LUhpZXJhcmNoaWNhbF9pbmZyYXN0cnVjdHVyZV9kZXNjcmlwdGlvbl9mb3JfeW91cl9zeXN0ZW1fbWFuYWdlbWVudF9uZWVkc18tX01hcnRpbl9LcmFmZnQubXA0Ij5WaWRlbyByZWNvcmRpbmc8L2E+PC9saT4KKzwvdWw+Cis8L2xpPgorPC91bD4KKzx1bCBjbGFzcz0ic2ltcGxlIj4KKzxsaT5JIGdhdmUgPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3BlbnRhLmRlYmNvbmYub3JnL2RjMTNfc2NoZWR1bGUvZXZlbnRzLzEwNDguZW4uaHRtbCI+YSB0YWxrIGFib3V0IHJlY2xhc3M8L2E+IGF0IDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly9kZWJjb25mMTMuZGViY29uZi5vcmciPkRlYkNvbmYxMzwvYT4sIHdoaWNoIGhhcyBiZWVuIHJlY29yZGVkOjx1bD4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vYW5uZXguZGViY29uZi5vcmcvZGViY29uZi1zaGFyZS9kZWJjb25mMTMvc2xpZGVzL3JlY2xhc3MucGRmIj5TbGlkZXM8L2E+PC9saT4KKzxsaT5WaWRlbyByZWNvcmRpbmc6IDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly9tZWV0aW5ncy1hcmNoaXZlLmRlYmlhbi5uZXQvcHViL2RlYmlhbi1tZWV0aW5ncy8yMDEzL2RlYmNvbmYxMy9oaWdoLzEwNDhfUmVjdXJzaXZlX25vZGVfY2xhc3NpZmljYXRpb25fZm9yX3N5c3RlbV9hdXRvbWF0aW9uLm9ndiI+aGlnaCBxdWFsaXR5IChvZ3YpPC9hPiB8IDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly9tZWV0aW5ncy1hcmNoaXZlLmRlYmlhbi5uZXQvcHViL2RlYmlhbi1tZWV0aW5ncy8yMDEzL2RlYmNvbmYxMy93ZWJtLWhpZ2gvMTA0OF9SZWN1cnNpdmVfbm9kZV9jbGFzc2lmaWNhdGlvbl9mb3Jfc3lzdGVtX2F1dG9tYXRpb24ud2VibSI+aGlnaCBxdWFsaXR5ICh3ZWJtKTwvYT4gfCA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwOi8vbWVldGluZ3MtYXJjaGl2ZS5kZWJpYW4ubmV0L3B1Yi9kZWJpYW4tbWVldGluZ3MvMjAxMy9kZWJjb25mMTMvbG93LzEwNDhfUmVjdXJzaXZlX25vZGVfY2xhc3NpZmljYXRpb25fZm9yX3N5c3RlbV9hdXRvbWF0aW9uLm9ndiI+bG93KGVyKSBxdWFsaXR5IChvZ3YpPC9hPjwvbGk+Cis8L3VsPgorPC9saT4KKzwvdWw+Cis8L2Rpdj4KKworCisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic3BoaW54c2lkZWJhcndyYXBwZXIiPgorICA8aDQ+UHJldmlvdXMgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0idXNhZ2UuaHRtbCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJwcmV2aW91cyBjaGFwdGVyIj5Vc2luZyByZWNsYXNzPC9hPjwvcD4KKyAgPGg0Pk5leHQgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0ibWFucGFnZS5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Im5leHQgY2hhcHRlciI+cmVjbGFzcyBtYW5wYWdlPC9hPjwvcD4KKzxkaXYgaWQ9InNlYXJjaGJveCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgorICA8aDM+UXVpY2sgc2VhcmNoPC9oMz4KKyAgICA8Zm9ybSBjbGFzcz0ic2VhcmNoIiBhY3Rpb249InNlYXJjaC5odG1sIiBtZXRob2Q9ImdldCI+CisgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJHbyIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNoZWNrX2tleXdvcmRzIiB2YWx1ZT0ieWVzIiAvPgorICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYXJlYSIgdmFsdWU9ImRlZmF1bHQiIC8+CisgICAgPC9mb3JtPgorICAgIDxwIGNsYXNzPSJzZWFyY2h0aXAiIHN0eWxlPSJmb250LXNpemU6IDkwJSI+CisgICAgRW50ZXIgc2VhcmNoIHRlcm1zIG9yIGEgbW9kdWxlLCBjbGFzcyBvciBmdW5jdGlvbiBuYW1lLgorICAgIDwvcD4KKzwvZGl2PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiQoJyNzZWFyY2hib3gnKS5zaG93KDApOzwvc2NyaXB0PgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0iY2xlYXJlciI+PC9kaXY+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0icmVsYXRlZCI+CisgICAgICA8aDM+TmF2aWdhdGlvbjwvaDM+CisgICAgICA8dWw+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHgiPgorICAgICAgICAgIDxhIGhyZWY9ImdlbmluZGV4Lmh0bWwiIHRpdGxlPSJHZW5lcmFsIEluZGV4IgorICAgICAgICAgICAgID5pbmRleDwvYT48L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0ibWFucGFnZS5odG1sIiB0aXRsZT0icmVjbGFzcyBtYW5wYWdlIgorICAgICAgICAgICAgID5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InVzYWdlLmh0bWwiIHRpdGxlPSJVc2luZyByZWNsYXNzIgorICAgICAgICAgICAgID5wcmV2aW91czwvYT4gfDwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImZvb3RlciI+CisgICAgICAgICZjb3B5OyBDb3B5cmlnaHQgMjAxMywgbWFydGluIGYuIGtyYWZmdC4KKyAgICAgIENyZWF0ZWQgdXNpbmcgPGEgaHJlZj0iaHR0cDovL3NwaGlueC1kb2Mub3JnLyI+U3BoaW54PC9hPiAxLjIuMy4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbHQuaHRtbCBiL3NhbHQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODVjZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FsdC5odG1sCkBAIC0wLDAgKzEsMzI1IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgorICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CisKKworPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICAKKyAgICA8dGl0bGU+VXNpbmcgcmVjbGFzcyB3aXRoIFNhbHQgJm1kYXNoOyByZWNsYXNzIDEuNC4xIGRvY3VtZW50YXRpb248L3RpdGxlPgorICAgIAorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iX3N0YXRpYy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL3B5Z21lbnRzLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgCisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgdmFyIERPQ1VNRU5UQVRJT05fT1BUSU9OUyA9IHsKKyAgICAgICAgVVJMX1JPT1Q6ICAgICcuLycsCisgICAgICAgIFZFUlNJT046ICAgICAnMS40LjEnLAorICAgICAgICBDT0xMQVBTRV9JTkRFWDogZmFsc2UsCisgICAgICAgIEZJTEVfU1VGRklYOiAnLmh0bWwnLAorICAgICAgICBIQVNfU09VUkNFOiAgdHJ1ZQorICAgICAgfTsKKyAgICA8L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL2pxdWVyeS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy91bmRlcnNjb3JlLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL2RvY3Rvb2xzLmpzIj48L3NjcmlwdD4KKyAgICA8bGluayByZWw9InRvcCIgdGl0bGU9InJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbiIgaHJlZj0iaW5kZXguaHRtbCIgLz4KKyAgICA8bGluayByZWw9Im5leHQiIHRpdGxlPSJVc2luZyByZWNsYXNzIHdpdGggQW5zaWJsZSIgaHJlZj0iYW5zaWJsZS5odG1sIiAvPgorICAgIDxsaW5rIHJlbD0icHJldiIgdGl0bGU9InJlY2xhc3MgY29uZmlndXJhdGlvbiBmaWxlIiBocmVmPSJjb25maWdmaWxlLmh0bWwiIC8+IAorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9IkkiPmluZGV4PC9hPjwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJhbnNpYmxlLmh0bWwiIHRpdGxlPSJVc2luZyByZWNsYXNzIHdpdGggQW5zaWJsZSIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9Ik4iPm5leHQ8L2E+IHw8L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0iY29uZmlnZmlsZS5odG1sIiB0aXRsZT0icmVjbGFzcyBjb25maWd1cmF0aW9uIGZpbGUiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJQIj5wcmV2aW91czwvYT4gfDwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PiAgCisKKyAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudCI+CisgICAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudHdyYXBwZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJib2R5d3JhcHBlciI+CisgICAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+CisgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InVzaW5nLXJlY2xhc3Mtd2l0aC1zYWx0Ij4KKzxoMT5Vc2luZyByZWNsYXNzIHdpdGggU2FsdDxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjdXNpbmctcmVjbGFzcy13aXRoLXNhbHQiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMT4KKzxkaXYgY2xhc3M9ImFkbW9uaXRpb24gd2FybmluZyI+Cis8cCBjbGFzcz0iZmlyc3QgYWRtb25pdGlvbi10aXRsZSI+V2FybmluZzwvcD4KKzxwIGNsYXNzPSJsYXN0Ij5Zb3UgbmVlZCBTYWx0IDAuMTcgdG8gdXNlIDxjaXRlPnJlY2xhc3M8L2NpdGU+LCBhcyBvbGRlciB2ZXJzaW9ucyBkbyBub3QgaW5jbHVkZSB0aGUKKzxjaXRlPnJlY2xhc3M8L2NpdGU+IGFkYXB0ZXIuIFlvdSBjb3VsZCB1c2UgdGhlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+Y21kX3lhbWw8L3NwYW4+PC90dD4gYWRhcHRlcnMsIGJ1dCBhdCBsZWFzdCBmb3IKKzx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+ZXh0X3BpbGxhcjwvc3Bhbj48L3R0PiwgdGhleSBhcmUgY3VycmVudGx5IG5vdCB1c2VhYmxlLCBhcyB0aGV5IDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYWx0c3RhY2svc2FsdC9pc3N1ZXMvMjI3NiI+ZG8gbm90IGV4cG9ydCB0aGUKK21pbmlvbiBJRCB0byB0aGUgY29tbWFuZCB0aGV5IHJ1bjwvYT4uPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0icXVpY2stc3RhcnQiPgorPGgyPlF1aWNrIHN0YXJ0PGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNxdWljay1zdGFydCIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gyPgorPHA+VGhlIGZvbGxvd2luZyBzdGVwcyBzaG91bGQgZ2V0IHlvdSB1cCBhbmQgcnVubmluZyBxdWlja2x5IHdpdGggPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGFuZAorPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3NhbHRzdGFjay5jb20vY29tbXVuaXR5Ij5TYWx0PC9hPi4gWW91IHdpbGwgbmVlZCB0byBkZWNpZGUgZm9yIHlvdXJzZWxmIHdoZXJlIHRvIHB1dCB5b3VyIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPgoraW52ZW50b3J5LiBUaGlzIGNhbiBiZSB5b3VyIGZpcnN0IDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+YmFzZTwvc3Bhbj48L3R0PiA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmZpbGVfcm9vdDwvc3Bhbj48L3R0PiAodGhlIGRlZmF1bHQpLCBvciBpdAorY291bGQgYmUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vZXRjL3JlY2xhc3M8L3NwYW4+PC90dD4sIG9yIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+L3Nydi9zYWx0PC9zcGFuPjwvdHQ+LiBUaGUgZm9sbG93aW5nIHNoYWxsIGFzc3VtZSB0aGUKK2xhdHRlci48L3A+Cis8cD5PciB5b3UgY2FuIGFsc28ganVzdCBsb29rIGludG8gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4uL2V4YW1wbGVzL3NhbHQ8L3NwYW4+PC90dD4gb2YgeW91ciA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4KK2NoZWNrb3V0ICg8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi91c3Ivc2hhcmUvZG9jL2V4YW1wbGVzL3NhbHQ8L3NwYW4+PC90dD4gb24gRGViaWFuLXN5c3RlbXMpLCB3aGVyZSB0aGUKK2ZvbGxvd2luZyBzdGVwcyBoYXZlIGFscmVhZHkgYmVlbiBwcmVwYXJlZC48L3A+Cis8cD4v4oCmL3JlY2xhc3MgcmVmZXJzIHRvIHRoZSBsb2NhdGlvbiBvZiB5b3VyIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBjaGVja291dC48L3A+Cis8b2wgY2xhc3M9ImFyYWJpYyI+Cis8bGk+PHAgY2xhc3M9ImZpcnN0Ij5Db21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIHN0ZXBzIGRlc2NyaWJlZCBpbiB0aGUgPGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iaW5zdGFsbC5odG1sIj48ZW0+aW5zdGFsbGF0aW9uIHNlY3Rpb248L2VtPjwvYT4uPC9wPgorPHA+QWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhbHNvIHRlbGwgU2FsdCB2aWEgdGhlIG1hc3RlciBjb25maWcgZmlsZSB3aGVyZSB0bworbG9vayBmb3IgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+LCBidXQgdGhlbiB5b3Ugd29uJiM4MjE3O3QgYmUgYWJsZSB0byBpbnRlcmFjdCB3aXRoCis8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gdGhyb3VnaCB0aGUgY29tbWFuZCBsaW5lLjwvcD4KKzwvbGk+Cis8bGk+PHAgY2xhc3M9ImZpcnN0Ij5Db3B5IHRoZSB0d28gZGlyZWN0b3JpZXMgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5ub2Rlczwvc3Bhbj48L3R0PiBhbmQgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5jbGFzc2VzPC9zcGFuPjwvdHQ+IGZyb20gdGhlIGV4YW1wbGUKK3N1YmRpcmVjdG9yeSBpbiB0aGUgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGNoZWNrb3V0IHRvIGUuZy4gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vc3J2L3NhbHQ8L3NwYW4+PC90dD4uPC9wPgorPHA+SXQmIzgyMTc7cyBoYW5keSB0byBzeW1saW5rIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiYjODIxNjsgU2FsdCBhZGFwdGVyIGl0c2VsZiB0byB0aGF0IGRpcmVjdG9yeTo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCBsbiAtcyAvdXNyL3NoYXJlL3JlY2xhc3MvcmVjbGFzcy1zYWx0IC9zcnYvc2FsdC9zdGF0ZXMvcmVjbGFzcworPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzxwPkFzIHlvdSBjYW4gbm93IGp1c3QgaW5zcGVjdCB0aGUgZGF0YSByaWdodCB0aGVyZSBmcm9tIHRoZSBjb21tYW5kIGxpbmU6PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPiQgLi9yZWNsYXNzIC0tdG9wCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+SWYgeW91IGRvbiYjODIxNzt0IHdhbnQgdG8gZG8gdGhpcywgeW91IGNhbiBhbHNvIGxldCA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4ga25vdyB3aGVyZSB0bworbG9vayBmb3IgdGhlIGludmVudG9yeSB3aXRoIHRoZSBmb2xsb3dpbmcgY29udGVudHMgaW4KKzx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+JEhPTUUvcmVjbGFzcy1jb25maWcueW1sPC9zcGFuPjwvdHQ+OjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT5zdG9yYWdlX3R5cGU6IHlhbWxfZnMKK2Jhc2VfaW52ZW50b3J5X3VyaTogL3Nydi9yZWNsYXNzCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+T3IgeW91IGNhbiByZXVzZSB0aGUgZmlyc3QgZW50cnkgb2YgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5maWxlX3Jvb3RzPC9zcGFuPjwvdHQ+IHVuZGVyIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+YmFzZTwvc3Bhbj48L3R0PiBpbiB0aGUgU2FsdAorbWFzdGVyIGNvbmZpZy48L3A+Cis8cD5Ob3RlIHRoYXQgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj55YW1sX2ZzPC9zcGFuPjwvdHQ+IGlzIGN1cnJlbnRseSB0aGUgb25seSBzdXBwb3J0ZWQgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5zdG9yYWdlX3R5cGU8L3NwYW4+PC90dD4sIGFuZAoraXQmIzgyMTc7cyB0aGUgZGVmYXVsdCBpZiB5b3UgZG9uJiM4MjE3O3Qgc2V0IGl0LjwvcD4KKzwvbGk+Cis8bGk+PHAgY2xhc3M9ImZpcnN0Ij5DaGVjayBvdXQgeW91ciBpbnZlbnRvcnkgYnkgaW52b2tpbmc8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCByZWNsYXNzLXNhbHQgLS10b3AKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8cD53aGljaCBzaG91bGQgcmV0dXJuIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGRlZmluZWQgbm9kZXMsIHdoaWNoIGlzCitvbmx5IDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+bG9jYWxob3N0PC9zcGFuPjwvdHQ+IGluIHRoZSBleGFtcGxlLiBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGluZm9ybWF0aW9uCit0aGF0IHlvdSB3b3VsZCBrZWVwIGluIHlvdXIgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj50b3Auc2xzPC9zcGFuPjwvdHQ+IGZpbGUuPC9wPgorPHA+SWYgeW91IHN5bWxpbmtlZCB0aGUgc2NyaXB0IHRvIHlvdXIgaW52ZW50b3J5IGJhc2UgZGlyZWN0b3J5LCB1c2U8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCAuL3JlY2xhc3MgLS10b3AKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8L2xpPgorPGxpPjxwIGNsYXNzPSJmaXJzdCI+U2VlIHRoZSBwaWxsYXIgaW5mb3JtYXRpb24gZm9yIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+bG9jYWxob3N0PC9zcGFuPjwvdHQ+OjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT4kIHJlY2xhc3Mtc2FsdCAtLXBpbGxhciBsb2NhbGhvc3QKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8L2xpPgorPGxpPjxwIGNsYXNzPSJmaXJzdCI+Tm93IGFkZCA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gdG8gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vZXRjL3NhbHQvbWFzdGVyPC9zcGFuPjwvdHQ+LCBsaWtlIHNvOjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT5yZWNsYXNzOiAmYW1wO3JlY2xhc3MKKyAgICBpbnZlbnRvcnlfYmFzZV91cmk6IC9zcnYvc2FsdAorICAgIHJlY2xhc3Nfc291cmNlX3BhdGg6IH4vY29kZS9yZWNsYXNzCisKK21hc3Rlcl90b3BzOgorICAgIFvigKZdCisgICAgcmVjbGFzczogKnJlY2xhc3MKKworZXh0X3BpbGxhcjoKKyAgICAtIHJlY2xhc3M6ICpyZWNsYXNzCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPGRpdiBjbGFzcz0iYWRtb25pdGlvbiB3YXJuaW5nIj4KKzxwIGNsYXNzPSJmaXJzdCBhZG1vbml0aW9uLXRpdGxlIj5XYXJuaW5nPC9wPgorPHAgY2xhc3M9Imxhc3QiPldoZW4gdXNpbmcgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5leHRfcGlsbGFyPC9zcGFuPjwvdHQ+IGFuZC9vciA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPm1hc3Rlcl90b3BzPC9zcGFuPjwvdHQ+LCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZQordGhhdCB5b3VyIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+ZmlsZV9yb290czwvc3Bhbj48L3R0PiBwYXRocyBkbyBub3QgY29udGFpbiBhIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+dG9wLnNsczwvc3Bhbj48L3R0PiBmaWxlLiBFdmVuCit0aG91Z2ggdGhleSBvdWdodCB0byBiZSBhYmxlIHRvIGNvZXhpc3QsIHRoZXJlIGFyZSBhIGZldyBzaGFycCBlZGdlcworYXJvdW5kIGF0IHRoZSBtb21lbnQsIHNvIGJld2FyZSE8L3A+Cis8L2Rpdj4KKzxwPklmIHlvdSBkaWQgbm90IGluc3RhbGwgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IChidXQgeW91IGFyZSBydW5uaW5nIGl0IGZyb20gc291cmNlKSwKK3lvdSBjYW4gZWl0aGVyIHNwZWNpZnkgdGhlIHNvdXJjZSBwYXRoIGxpa2UgYWJvdmUsIG9yIHlvdSBjYW4gYWRkIGl0IHRvCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPlBZVEhPTlBBVEg8L3NwYW4+PC90dD4gYmVmb3JlIGludm9raW5nIHRoZSBTYWx0IG1hc3RlciwgdG8gZW5zdXJlIHRoYXQgUHl0aG9uIGNhbgorZmluZCBpdDo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+UFlUSE9OUEFUSD0v4oCmL3JlY2xhc3MgL2V0Yy9pbml0LmQvc2FsdC1tYXN0ZXIgcmVzdGFydAorPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzwvbGk+Cis8bGk+PHAgY2xhc3M9ImZpcnN0Ij5Qcm92aWRlZCB0aGF0IHlvdSBoYXZlIHNldCB1cCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmxvY2FsaG9zdDwvc3Bhbj48L3R0PiBhcyBhIFNhbHQgbWluaW9uLCB0aGUgZm9sbG93aW5nCitjb21tYW5kcyBzaG91bGQgbm93IHJldHVybiB0aGUgc2FtZSBkYXRhIGFzIGFib3ZlLCBidXQgcHJvY2Vzc2VkIHRocm91Z2gKK3NhbHQ6PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPiQgc2FsdCBsb2NhbGhvc3QgcGlsbGFyLml0ZW1zICAgICAjIHNob3dzIGp1c3QgdGhlIHBhcmFtZXRlcnMKKyQgc2FsdCBsb2NhbGhvc3Qgc3RhdGUuc2hvd190b3AgICAjIHNob3dzIG9ubHkgdGhlIHN0YXRlcyAoYXBwbGljYXRpb25zKQorPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzxwPkFsdGVybmF0aXZlbHksIGlmIHlvdSBkb24mIzgyMTc7dCBoYXZlIHRoZSBTYWx0IG1pbmlvbiBydW5uaW5nIHlldDo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCBzYWx0LWNhbGwgcGlsbGFyLml0ZW1zICAgICAjIHNob3dzIGp1c3QgdGhlIHBhcmFtZXRlcnMKKyQgc2FsdC1jYWxsIHN0YXRlLnNob3dfdG9wICAgIyBzaG93cyBvbmx5IHRoZSBzdGF0ZXMgKGFwcGxpY2F0aW9ucykKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8L2xpPgorPGxpPjxwIGNsYXNzPSJmaXJzdCI+WW91IGNhbiBhbHNvIGludm9rZSA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gZGlyZWN0bHksIHdoaWNoIGdpdmVzIGEgc2xpZ2h0bHkgZGlmZmVyZW50Cit2aWV3IG9udG8gdGhlIHNhbWUgZGF0YSwgaS5lLiBiZWZvcmUgaXQgaGFzIGJlZW4gYWRhcHRlZCBmb3IgU2FsdDo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCByZWNsYXNzIC0taW52ZW50b3J5CiskIHJlY2xhc3MgLS1ub2RlaW5mbyBsb2NhbGhvc3QKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8L2xpPgorPC9vbD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9ImNvbmZpZ3VyYXRpb24tZmlsZS1hbmQtbWFzdGVyLWNvbmZpZ3VyYXRpb24iPgorPGgyPkNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgbWFzdGVyIGNvbmZpZ3VyYXRpb248YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI2NvbmZpZ3VyYXRpb24tZmlsZS1hbmQtbWFzdGVyLWNvbmZpZ3VyYXRpb24iIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPkV2ZW4gdGhvdWdoIHRoZSBTYWx0IGFkYXB0ZXIgb2YgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGxvb2tzIGZvciBhbmQgcmVhZHMgdGhlCis8YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJjb25maWdmaWxlLmh0bWwiPjxlbT5jb25maWd1cmF0aW9uIGZpbGU8L2VtPjwvYT4sIGEgYmV0dGVyIG1lYW5zIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KK3RoZSBhZGFwdGVyIGlzIHZpYSBTYWx0JiM4MjE3O3MgbWFzdGVyIGNvbmZpZ3VyYXRpb24gZmlsZSwgYXMgc2hvd24gYWJvdmUuIE5vdCBhbGwKK2NvbmZpZ3VyYXRpb24gb3B0aW9ucyBjYW4gYmUgcGFzc2VkIHRoaXMgd2F5IChlLmcuIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+b3V0cHV0PC9zcGFuPjwvdHQ+IGlzIGhhcmRjb2RlZCB0bworWUFNTCwgd2hpY2ggU2FsdCB1c2VzKSwgYnV0IGl0IDxlbT5pczwvZW0+IHBvc3NpYmxlIHRvIHNwZWNpZnkgPGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0ib3BlcmF0aW9ucy5odG1sIj48ZW0+Y2xhc3MgbWFwcGluZ3M8L2VtPjwvYT4gbmV4dCB0byBhbGwgdGhlIHN0b3JhZ2Utc3BlY2lmaWMgb3B0aW9ucy48L3A+Cis8ZGl2IGNsYXNzPSJhZG1vbml0aW9uIHdhcm5pbmciPgorPHAgY2xhc3M9ImZpcnN0IGFkbW9uaXRpb24tdGl0bGUiPldhcm5pbmc8L3A+Cis8cCBjbGFzcz0ibGFzdCI+VGhlIFNhbHQgQ0xJIGFkYXB0ZXIgZG9lcyA8ZW0+bm90PC9lbT4gcmVhZCBTYWx0JiM4MjE3O3MgbWFzdGVyIGNvbmZpZ3VyYXRpb24sIHNvIGlmIHlvdQorYXJlIGNhbGxpbmcgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5yZWNsYXNzLXNhbHQ8L3NwYW4+PC90dD4gZnJvbSB0aGUgY29tbWFuZC1saW5lICh0aGUgQ0xJIGV4aXN0cyBmb3IKK2RlYnVnZ2luZyBwdXJwb3NlcywgbWFpbmx5KSwgYmUgYXdhcmUgdGhhdCBpdCB3aWxsIGJlIHJ1biBpbiBhIGRpZmZlcmVudAorZW52aXJvbm1lbnQgdGhhbiB3aGVuIFNhbHQgcXVlcmllcyByZWNsYXNzIGRpcmVjdGx5LjwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iaW50ZWdyYXRpb24td2l0aC1zYWx0Ij4KKzxoMj5JbnRlZ3JhdGlvbiB3aXRoIFNhbHQ8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI2ludGVncmF0aW9uLXdpdGgtc2FsdCIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gyPgorPHA+PHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGhvb2tzIGludG8gU2FsdCBhdCB0d28gZGlmZmVyZW50IHBvaW50czogPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5tYXN0ZXJfdG9wczwvc3Bhbj48L3R0PiBhbmQKKzx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+ZXh0X3BpbGxhcjwvc3Bhbj48L3R0Pi4gRm9yIGJvdGgsIFNhbHQgcHJvdmlkZXMgcGx1Z2lucy4gVGhlc2UgcGx1Z2lucyBuZWVkIHRvIGtub3cKK3doZXJlIHRvIGZpbmQgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+LCBzbyBpZiA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gaXMgbm90IHByb3Blcmx5IGluc3RhbGxlZCAoYnV0Cit5b3UgYXJlIHJ1bm5pbmcgaXQgZnJvbSBzb3VyY2UpLCBtYWtlIHN1cmUgdG8gZXhwb3J0IDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+UFlUSE9OUEFUSDwvc3Bhbj48L3R0PgorYWNjb3JkaW5nbHkgYmVmb3JlIHlvdSBzdGFydCB5b3VyIFNhbHQgbWFzdGVyLCBvciBzcGVjaWZ5IHRoZSBwYXRoIGluIHRoZQorbWFzdGVyIGNvbmZpZ3VyYXRpb24gZmlsZSwgYXMgc2hvdyBhYm92ZS48L3A+Cis8cD5TYWx0IGhhcyBubyBjb25jZXB0IG9mICYjODIyMDtub2RlcyYjODIyMTssICYjODIyMDthcHBsaWNhdGlvbnMmIzgyMjE7LCAmIzgyMjA7cGFyYW1ldGVycyYjODIyMTssIGFuZCAmIzgyMjA7Y2xhc3NlcyYjODIyMTsuCitUaGVyZWZvcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGV4cGxhaW4gaG93IHRob3NlIGNvcnJlc3BvbmQgdG8gU2FsdC4gQ3J1ZGVseSwKK3RoZSBmb2xsb3dpbmcgbWFwcGluZyBleGlzdHM6PC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2xhc3M9ImRvY3V0aWxzIj4KKzxjb2xncm91cD4KKzxjb2wgd2lkdGg9IjQ1JSIgLz4KKzxjb2wgd2lkdGg9IjU1JSIgLz4KKzwvY29sZ3JvdXA+Cis8dGhlYWQgdmFsaWduPSJib3R0b20iPgorPHRyIGNsYXNzPSJyb3ctb2RkIj48dGggY2xhc3M9ImhlYWQiPjxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBjb25jZXB0PC90aD4KKzx0aCBjbGFzcz0iaGVhZCI+U2FsdCB0ZXJtaW5vbG9neTwvdGg+Cis8L3RyPgorPC90aGVhZD4KKzx0Ym9keSB2YWxpZ249InRvcCI+Cis8dHIgY2xhc3M9InJvdy1ldmVuIj48dGQ+bm9kZXM8L3RkPgorPHRkPmhvc3RzPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9InJvdy1vZGQiPjx0ZD5jbGFzc2VzPC90ZD4KKzx0ZD4obm9uZSkgPGEgY2xhc3M9ImZvb3Rub3RlLXJlZmVyZW5jZSIgaHJlZj0iI25vZGVncm91cHMiIGlkPSJpZDEiPlsxXTwvYT48L3RkPgorPC90cj4KKzx0ciBjbGFzcz0icm93LWV2ZW4iPjx0ZD5hcHBsaWNhdGlvbnM8L3RkPgorPHRkPnN0YXRlczwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJyb3ctb2RkIj48dGQ+cGFyYW1ldGVyczwvdGQ+Cis8dGQ+cGlsbGFyPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9InJvdy1ldmVuIj48dGQ+ZW52aXJvbm1lbnQ8L3RkPgorPHRkPmVudmlyb25tZW50PC90ZD4KKzwvdHI+Cis8L3Rib2R5PgorPC90YWJsZT4KKzx0YWJsZSBjbGFzcz0iZG9jdXRpbHMgZm9vdG5vdGUiIGZyYW1lPSJ2b2lkIiBpZD0ibm9kZWdyb3VwcyIgcnVsZXM9Im5vbmUiPgorPGNvbGdyb3VwPjxjb2wgY2xhc3M9ImxhYmVsIiAvPjxjb2wgLz48L2NvbGdyb3VwPgorPHRib2R5IHZhbGlnbj0idG9wIj4KKzx0cj48dGQgY2xhc3M9ImxhYmVsIj48YSBjbGFzcz0iZm4tYmFja3JlZiIgaHJlZj0iI2lkMSI+WzFdPC9hPjwvdGQ+PHRkPlNlZSA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2FsdHN0YWNrL3NhbHQvaXNzdWVzLzU3ODciPlNhbHQgaXNzdWUgIzU3ODc8L2E+IGZvciBzdGVwcyBpbnRvIHRoZSBkaXJlY3Rpb24gb2YgbGV0dGluZworPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IHByb3ZpZGUgbm9kZWdyb3VwIGluZm9ybWF0aW9uLjwvdGQ+PC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorPHA+V2hhdGV2ZXIgYXBwbGljYXRpb25zIHlvdSBkZWZpbmUgZm9yIGEgbm9kZSB3aWxsIGJlY29tZSBzdGF0ZXMgYXBwbGljYWJsZSB0bworYSBob3N0LiBJZiB0aG9zZSBhcHBsaWNhdGlvbnMgYXJlIGFkZGVkIHZpYSBhbmNlc3RvciBjbGFzc2VzLCB0aGVuIHRoYXQmIzgyMTc7cworZmluZSwgYnV0IGN1cnJlbnRseSwgU2FsdCBkb2VzIG5vdCBkbyBhbnl0aGluZyB3aXRoIHRoZSBjbGFzc2VzIGFuY2VzdHJ5LjwvcD4KKzxwPlNpbWlsYXJseSwgYWxsIHBhcmFtZXRlcnMgdGhhdCBhcmUgY29sbGVjdGVkIGFuZCBtZXJnZWQgZXZlbnR1YWxseSBlbmQgdXAgaW4KK3RoZSBwaWxsYXIgZGF0YSBvZiBhIHNwZWNpZmljIG5vZGUuPC9wPgorPHA+VGhlIHBpbGxhciBkYXRhIG9mIGEgbm9kZSBpbmNsdWRlIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgY2xhc3NlcyBhbmQKK2FwcGxpY2F0aW9ucywgc28geW91IGNvdWxkIHRoZW9yZXRpY2FsbHkgdXNlIHRoZW0gdG8gdGFyZ2V0IHlvdXIgU2FsdCBjYWxscyBhdAorZ3JvdXBzIG9mIG5vZGVzIGRlZmluZWQgaW4gdGhlIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBpbnZlbnRvcnksIGUuZy48L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+c2FsdCAtSSBfX3JlY2xhc3NfXzpjbGFzc2VzOnNhbHRfbWluaW9uIHRlc3QucGluZworPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzxwPlVuZm9ydHVuYXRlbHksIHRoaXMgZG9lcyBub3Qgd29yayB5ZXQsIHBsZWFzZSBzdGF5IHR1bmVkLCBhbmQgbGV0IG1lIGtub3cKK2lmIHlvdSBmaWd1cmUgb3V0IGEgd2F5LiA8YSBjbGFzcz0icmVmZXJlbmNlIGV4dGVybmFsIiBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2FsdHN0YWNrL3NhbHQvaXNzdWVzLzU3ODciPlNhbHQgaXNzdWUgIzU3ODc8L2E+IGlzIGFsc28gb2YgcmVsZXZhbmNlLjwvcD4KKzxwPk9wdGlvbmFsbHksIGRhdGEgZnJvbSBwaWxsYXJzIHRoYXQgcnVuIGJlZm9yZSB0aGUgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+ZXh0X3BpbGxhcjwvc3Bhbj48L3R0PgorKGkuZS4gU2FsdCYjODIxNztzIGJ1aWx0aW4gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5waWxsYXJfcm9vdHM8L3NwYW4+PC90dD4sIGFzIHdlbGwgYXMgb3RoZXIgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5leHRfcGlsbGFyPC9zcGFuPjwvdHQ+IG1vZHVsZXMKK2xpc3RlZCBiZWZvcmUgdGhlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+cmVjbGFzc19hZGFwdGVyPC9zcGFuPjwvdHQ+KSBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+LgorUGxlYXNlIHVzZSB0aGlzIHdpdGggY2F1dGlvbiBhcyByZWZlcmVuY2luZyBkYXRhIGZyb20gU2FsdCBpbiB0aGUgaW52ZW50b3J5Cit3aWxsIG1ha2UgaXQgaGFyZGVyIG9yIGltcG9zc2libGUgdG8gcnVuIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBpbiBvdGhlciBlbnZpcm9ubWVudHMuIFRoaXMKK2ZlYXR1cmUgaXMgdGhlcmVmb3JlIHR1cm5lZCBvZmYgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQgaW4KK3RoZSBTYWx0IG1hc3RlciBjb25maWd1cmF0aW9uIGZpbGUsIGxpa2UgdGhpczo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+ZXh0X3BpbGxhcjoKKyAgLSByZWNsYXNzOgorICAgICAgW+KApl0KKyAgICAgIHByb3BhZ2F0ZV9waWxsYXJfZGF0YV90b19yZWNsYXNzOiBUcnVlCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+VW5mb3J0dW5hdGVseSwgdG8gdXNlIHRoaXMsIGN1cnJlbnRseSB5b3UgY2Fubm90IHVzZSBZQU1MIHJlZmVyZW5jZXMgKGkuZS4KKzx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+KnJlY2xhc3M8L3NwYW4+PC90dD4pIGFzIHNob3duIGFib3ZlLCBhcyB0aGUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5tYXN0ZXJfdG9wczwvc3Bhbj48L3R0PiBzdWJzeXN0ZW0gZG9lcyBub3QgYWNjZXB0Cit0aGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLCBhbmQgdGhlcmUgc2VlbXMgdG8gYmUgbm8gd2F5IHRvIGV4dGVuZCBhbiBhbGlhcy4KK1NwZWNpZmljYWxseSwgdGhlIGZvbGxvd2luZyBpcyBub3QgcG9zc2libGUg4oCUIGxldCBtZSBrbm93IGlmIGl0IGlzITo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+ZXh0X3BpbGxhcjoKKyAgLSByZWNsYXNzOiAqcmVjbGFzcyAgICAjIFdBUk5JTkc6IHRoaXMgZG9lcyBub3Qgd29yayEKKyAgICAgIHByb3BhZ2F0ZV9waWxsYXJfZGF0YV90b19yZWNsYXNzOiBUcnVlCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KKworCisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic3BoaW54c2lkZWJhcndyYXBwZXIiPgorICA8aDM+PGEgaHJlZj0iaW5kZXguaHRtbCI+VGFibGUgT2YgQ29udGVudHM8L2E+PC9oMz4KKyAgPHVsPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiMiPlVzaW5nIHJlY2xhc3Mgd2l0aCBTYWx0PC9hPjx1bD4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjcXVpY2stc3RhcnQiPlF1aWNrIHN0YXJ0PC9hPjwvbGk+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI2NvbmZpZ3VyYXRpb24tZmlsZS1hbmQtbWFzdGVyLWNvbmZpZ3VyYXRpb24iPkNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgbWFzdGVyIGNvbmZpZ3VyYXRpb248L2E+PC9saT4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjaW50ZWdyYXRpb24td2l0aC1zYWx0Ij5JbnRlZ3JhdGlvbiB3aXRoIFNhbHQ8L2E+PC9saT4KKzwvdWw+Cis8L2xpPgorPC91bD4KKworICA8aDQ+UHJldmlvdXMgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0iY29uZmlnZmlsZS5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9InByZXZpb3VzIGNoYXB0ZXIiPnJlY2xhc3MgY29uZmlndXJhdGlvbiBmaWxlPC9hPjwvcD4KKyAgPGg0Pk5leHQgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0iYW5zaWJsZS5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Im5leHQgY2hhcHRlciI+VXNpbmcgcmVjbGFzcyB3aXRoIEFuc2libGU8L2E+PC9wPgorPGRpdiBpZD0ic2VhcmNoYm94IiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CisgIDxoMz5RdWljayBzZWFyY2g8L2gzPgorICAgIDxmb3JtIGNsYXNzPSJzZWFyY2giIGFjdGlvbj0ic2VhcmNoLmh0bWwiIG1ldGhvZD0iZ2V0Ij4KKyAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiAvPgorICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkdvIiAvPgorICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2hlY2tfa2V5d29yZHMiIHZhbHVlPSJ5ZXMiIC8+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhcmVhIiB2YWx1ZT0iZGVmYXVsdCIgLz4KKyAgICA8L2Zvcm0+CisgICAgPHAgY2xhc3M9InNlYXJjaHRpcCIgc3R5bGU9ImZvbnQtc2l6ZTogOTAlIj4KKyAgICBFbnRlciBzZWFyY2ggdGVybXMgb3IgYSBtb2R1bGUsIGNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUuCisgICAgPC9wPgorPC9kaXY+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JCgnI3NlYXJjaGJveCcpLnNob3coMCk7PC9zY3JpcHQ+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmVyIj48L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJyZWxhdGVkIj4KKyAgICAgIDxoMz5OYXZpZ2F0aW9uPC9oMz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweCI+CisgICAgICAgICAgPGEgaHJlZj0iZ2VuaW5kZXguaHRtbCIgdGl0bGU9IkdlbmVyYWwgSW5kZXgiCisgICAgICAgICAgICAgPmluZGV4PC9hPjwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJhbnNpYmxlLmh0bWwiIHRpdGxlPSJVc2luZyByZWNsYXNzIHdpdGggQW5zaWJsZSIKKyAgICAgICAgICAgICA+bmV4dDwvYT4gfDwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiID4KKyAgICAgICAgICA8YSBocmVmPSJjb25maWdmaWxlLmh0bWwiIHRpdGxlPSJyZWNsYXNzIGNvbmZpZ3VyYXRpb24gZmlsZSIKKyAgICAgICAgICAgICA+cHJldmlvdXM8L2E+IHw8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJmb290ZXIiPgorICAgICAgICAmY29weTsgQ29weXJpZ2h0IDIwMTMsIG1hcnRpbiBmLiBrcmFmZnQuCisgICAgICBDcmVhdGVkIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9zcGhpbngtZG9jLm9yZy8iPlNwaGlueDwvYT4gMS4yLjMuCisgICAgPC9kaXY+CisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZWFyY2guaHRtbCBiL3NlYXJjaC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NDJhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zZWFyY2guaHRtbApAQCAtMCwwICsxLDk5IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgorICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CisKKworPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICAKKyAgICA8dGl0bGU+U2VhcmNoICZtZGFzaDsgcmVjbGFzcyAxLjQuMSBkb2N1bWVudGF0aW9uPC90aXRsZT4KKyAgICAKKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9zdGF0aWMvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iX3N0YXRpYy9weWdtZW50cy5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgIAorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgIHZhciBET0NVTUVOVEFUSU9OX09QVElPTlMgPSB7CisgICAgICAgIFVSTF9ST09UOiAgICAnLi8nLAorICAgICAgICBWRVJTSU9OOiAgICAgJzEuNC4xJywKKyAgICAgICAgQ09MTEFQU0VfSU5ERVg6IGZhbHNlLAorICAgICAgICBGSUxFX1NVRkZJWDogJy5odG1sJywKKyAgICAgICAgSEFTX1NPVVJDRTogIHRydWUKKyAgICAgIH07CisgICAgPC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy9qcXVlcnkuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvdW5kZXJzY29yZS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy9kb2N0b29scy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy9zZWFyY2h0b29scy5qcyI+PC9zY3JpcHQ+CisgICAgPGxpbmsgcmVsPSJ0b3AiIHRpdGxlPSJyZWNsYXNzIDEuNC4xIGRvY3VtZW50YXRpb24iIGhyZWY9ImluZGV4Lmh0bWwiIC8+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBqUXVlcnkoZnVuY3Rpb24oKSB7IFNlYXJjaC5sb2FkSW5kZXgoInNlYXJjaGluZGV4LmpzIik7IH0pOworICA8L3NjcmlwdD4KKyAgCisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBpZD0ic2VhcmNoaW5kZXhsb2FkZXIiPjwvc2NyaXB0PgorICAgCisKKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8ZGl2IGNsYXNzPSJyZWxhdGVkIj4KKyAgICAgIDxoMz5OYXZpZ2F0aW9uPC9oMz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweCI+CisgICAgICAgICAgPGEgaHJlZj0iZ2VuaW5kZXguaHRtbCIgdGl0bGU9IkdlbmVyYWwgSW5kZXgiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJJIj5pbmRleDwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+cmVjbGFzczwvYT4gJnJhcXVvOzwvbGk+IAorICAgICAgPC91bD4KKyAgICA8L2Rpdj4gIAorCisgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQiPgorICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnR3cmFwcGVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYm9keXdyYXBwZXIiPgorICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgCisgIDxoMSBpZD0ic2VhcmNoLWRvY3VtZW50YXRpb24iPlNlYXJjaDwvaDE+CisgIDxkaXYgaWQ9ImZhbGxiYWNrIiBjbGFzcz0iYWRtb25pdGlvbiB3YXJuaW5nIj4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiQoJyNmYWxsYmFjaycpLmhpZGUoKTs8L3NjcmlwdD4KKyAgPHA+CisgICAgUGxlYXNlIGFjdGl2YXRlIEphdmFTY3JpcHQgdG8gZW5hYmxlIHRoZSBzZWFyY2gKKyAgICBmdW5jdGlvbmFsaXR5LgorICA8L3A+CisgIDwvZGl2PgorICA8cD4KKyAgICBGcm9tIGhlcmUgeW91IGNhbiBzZWFyY2ggdGhlc2UgZG9jdW1lbnRzLiBFbnRlciB5b3VyIHNlYXJjaAorICAgIHdvcmRzIGludG8gdGhlIGJveCBiZWxvdyBhbmQgY2xpY2sgInNlYXJjaCIuIE5vdGUgdGhhdCB0aGUgc2VhcmNoCisgICAgZnVuY3Rpb24gd2lsbCBhdXRvbWF0aWNhbGx5IHNlYXJjaCBmb3IgYWxsIG9mIHRoZSB3b3Jkcy4gUGFnZXMKKyAgICBjb250YWluaW5nIGZld2VyIHdvcmRzIHdvbid0IGFwcGVhciBpbiB0aGUgcmVzdWx0IGxpc3QuCisgIDwvcD4KKyAgPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0iZ2V0Ij4KKyAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgdmFsdWU9IiIgLz4KKyAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2VhcmNoIiAvPgorICAgIDxzcGFuIGlkPSJzZWFyY2gtcHJvZ3Jlc3MiIHN0eWxlPSJwYWRkaW5nLWxlZnQ6IDEwcHgiPjwvc3Bhbj4KKyAgPC9mb3JtPgorICAKKyAgPGRpdiBpZD0ic2VhcmNoLXJlc3VsdHMiPgorICAKKyAgPC9kaXY+CisKKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9InNwaGlueHNpZGViYXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyd3JhcHBlciI+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmVyIj48L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJyZWxhdGVkIj4KKyAgICAgIDxoMz5OYXZpZ2F0aW9uPC9oMz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweCI+CisgICAgICAgICAgPGEgaHJlZj0iZ2VuaW5kZXguaHRtbCIgdGl0bGU9IkdlbmVyYWwgSW5kZXgiCisgICAgICAgICAgICAgPmluZGV4PC9hPjwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImZvb3RlciI+CisgICAgICAgICZjb3B5OyBDb3B5cmlnaHQgMjAxMywgbWFydGluIGYuIGtyYWZmdC4KKyAgICAgIENyZWF0ZWQgdXNpbmcgPGEgaHJlZj0iaHR0cDovL3NwaGlueC1kb2Mub3JnLyI+U3BoaW54PC9hPiAxLjIuMy4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlYXJjaGluZGV4LmpzIGIvc2VhcmNoaW5kZXguanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5YzE4NwotLS0gL2Rldi9udWxsCisrKyBiL3NlYXJjaGluZGV4LmpzCkBAIC0wLDAgKzEgQEAKK1NlYXJjaC5zZXRJbmRleCh7ZW52dmVyc2lvbjo0Mix0ZXJtczp7cmVwcmVzZW50OjcsYWxsOlswLDEsMiw0LDYsNywxMCwxMSwxMiwxM10sY29kZTpbMTIsN10sZGlzdDo5LGVkZzo0LHF1ZXJpOls0LDIsMTMsMTBdLGNvbnN1bToxMyxwcmVmaXg6WzEsOSwxMF0sY29uY2VwdDo3LG92ZXJsYXA6MyxhYmlsOlsxLDJdLG9wdF9pbnZlbnRvcnlfYmFzZV91cmk6MTMsZm9sbG93OlswLDEsNCw3LDksMTAsMTEsMTNdLGNoaWxkcmVuOjEwLGhpZXJhcmNoOjEsd2hvc2U6WzAsMTMsMTBdLGRlY2lkOjQsZGVwZW5kOjEzLGVsc2V3aGVyOlswLDddLHNlbmQ6WzEyLDldLHRhaWw6NyxkZWhhYW46Nyx0aG9zZTpbMCw0LDcsMTMsMTBdLHVuZGVyOlsxLDcsNF0sc2VuczpbNywxM10saW50cm9kdWM6Myxzb3VyYzpbMTIsN10sZXZlcmk6WzAsNywxM10sc3RyaW5nOjcsd2l0aG91dDoxMCxmYXI6MCxyb2xlOls3LDEwXSxteXNlbGY6Nyx2ZXJpOlswLDEsMiwxMywxMl0sYXBwYXI6NyxyZWxldjpbMCw0XSx0cmk6NyxhZG1pbmlzdHI6WzAsMSwyXSxsZXZlbDpbMCwxMiwxM10sZGlkOjQsY21kOjksbGlzdDpbMCwxLDMsNyw5LDEwLDEyLDRdLHNjYWxhcjowLGl0ZXI6WzAsMTNdLCJ0cnkiOlsxMSwyLDZdLGl0ZW06WzEyLDRdLHN0dW1ibDo3LGdlbmVyYWxpczoxMyxwcmVwYXI6WzcsNF0scGxlYXM6WzEsMiw0LDYsNyw5LDExLDEzXSxwcmV2ZW50OlswLDEzLDNdLHNtYWxsZXI6WzEsMl0sbWluaW9uOjQsbmF0dXI6MSxkaXJlY3Q6NCxkb3dsb2FkOjksemVybzoxMCxkZXNpZ246MCxrcmFmZnQ6MSxwYXNzOjQsZnVydGhlcjpbMCwxLDIsNywxMF0sc3VibWl0OjEyLGFwcGVuZDowLGV2ZW46WzQsMTNdLGluZGV4OjMsd2hhdDpbMCwxMywxMF0sc3ViOjcsY2FzdDo3LHRyaXZpYWw6WzcsMTBdLHNlY3Rpb246WzcsNF0sYWJsOlsxLDIsNyw0LDEwXSwid2hpbGUiOlswLDEsMiw3LDEzXSxhbnl3YWk6WzAsN10sY3VycmVudDpbMCwxLDIsNCw2LDcsOSwxMCwxMiwxM10sYmFja3VwcGM6MTAsdmVyc2lvbjpbMSwyLDQsM10saGllcmE6MSxwcm9wYWdhdGVfcGlsbGFyX2RhdGFfdG9fcmVjbGFzczo0LG5ldDpbMSwyLDEyXSxob3N0X3Zhcjo3LG1ldGhvZDo5LHdoYXRldjpbNCwxM10sZWxpbWluOlsxLDJdLGNlbnRyaWM6WzcsMTBdLHRoZW1zZWx2OjksZGVyaXY6WzEzLDEwXSxhYnNvbHV0OlsxMSwxM10sam9pbjoxLGdlbmVyOls3LDEzLDEwXSxoZXJlOlsxMSwxMiw3LDksMTBdLGJlaGF2aW91cjpbMCw3LDEwXSxleHBsaWNpdGxpOjQsbGV0OlsxLDIsNyw0LDEwXSxhZGRyZXNzOls3LDEzXSxwYXRoOls0LDldLGJlY29tOls0LDcsMTNdLHNpbmM6WzAsMTIsMTBdLHZhbHU6WzAsMiwzLDYsNywxMCwxM10seWFtbF9mOlswLDYsNyw0LDNdLHNlYXJjaDo5LG5hZ2lvOjEzLGludml0OjksYW55bW9yOls3LDEzLDNdLGxhcmdlcjoxMixob3N0OlswLDEsMiw0LDcsMTAsMTNdLGFjdGlvbjo3LGNoYW5nOlsxLDMsNyw5LDEwLDEyLDEzXSxjb21tb25saToxMSx2aWE6WzYsNF0sYXBwbGk6WzcsMTBdLG1vZHVsOlswLDQsOV0scHJlZmVyOlsxMiw3XSxhcHQ6WzcsOV0scHV0Ols3LDQsMTBdLGFwaTozLGRlYmNvbmYxMzo1LGluc3RhbDo3LHVuaXQ6MTIsa2VpOlswLDYsNywxMF0sZmVkOjMsZnJvbTpbMSwzLDYsNywxMCwxMl0sZGVzY3JpYjpbMCw0LDIsNywxM10sd291bGQ6WzAsMSw0LDcsMTAsMTIsMTNdLGNvbW11bjo3LHZpc2l0OlswLDJdLHVwZ3JhZDo3LGNvdmVyYWc6MTIsbmV4dDpbMCw2LDRdLGFsbW9zdDoxMCxtYXNzYWc6WzExLDddLGhhbmRsZXI6NyxjYWxsOlsxMyw2LDcsOSwxMSw0XSx1c3I6WzIsNyw5LDExLDEyLDRdLG1zZzo3LGtpY2s6Nyx0eXBlOlswLDIsN10sdGVsbDpbNyw0XSxyZW9yZGVyOjEwLG1vcmU6WzEsMiwzLDcsOSwxMCwxMSwxM10sc29ydDoxMixmbGF0OjAsZmxhdzo3LHNhaWQ6NyxwZW9wbDoxMyxyZWxhdDpbMSwxMiw3XSxweWxpbnQ6MTIsbm90aWM6MTAsc2l0ZTpbMSwyLDcsMTBdLHdhcm46WzQsMTNdLGRlcHRoOjEwLHRlbXBsYXQ6MTMsZG93bnRpbToxMCxmaWxlX3Jvb3Q6NCxjYWNoOlswLDNdLG11c3Q6WzAsMTAsNCwzXSxub25lOjQsd29yZDo3LGVycjo3LGFsaWE6NCxzZXR1cDpbMTIsNyw5LDEwXSx3b3JrOlswLDQsMTIsNywxM10sdW5pcXU6MCxpbXBlcjoxMyxoaXN0b3JpOjEyLCJfX3JlY2xhc3NfXyI6NCxpdHNlbGY6WzYsNCwxMF0sY2FuOlswLDEsMiw0LDYsNyw5LDEwLDExLDEyLDEzXSxvZnRjOlsxLDEyXSxwdXJwb3M6WzEsMiw0XSxyb290OjEwLG92ZXJyaWQ6WzAsMSwyLDEwXSx1c2VhYmw6NCxnaXZlOlsxLDIsMTMsNywxMiw0XSxwcm9jZXNzOlswLDcsNCwxMF0sc3Vkbzo5LHNoYXJlOlsxMSw0LDIsNywxM10sYWNjZXB0OjQsaGlnaDo1LHRhZzpbMCwxLDIsMTBdLGNhdXRpb246NCx3YW50OlsxMiw3LDQsOV0sdGFyYmFsOlsxLDldLHNoYXJwOjQsdW5mb3J0dW46WzEsNyw0LDldLGRlbGFpOjEwLGFsd2FpOlsxLDJdLGNvdXJzOls2LDEyLDEwXSxlbmQ6WzAsNF0scXVvdDowLHJhdGhlcjpbMCwxMiwxM10sYW5vdGg6WzAsMTBdLHBpbmc6WzcsNF0sY2xhc3NpZmk6WzEsMiwxM10sd3JpdGU6WzcsOSwxMF0saG93OlsxMSw0LDcsMTMsMTBdLGFueW9uOjcsZm9yZWFjaDoxMyxwdXJlOjcsc3ViZGlyZWN0b3JpOlswLDcsNCwzXSxpbnN0ZWFkOlsxMCw3LDNdLGFuY2VzdG9yOlswLDQsMTBdLGNvbmZpZzpbNCw2LDcsMTNdLGRpc3Rybzo3LG1hcDpbMSw3LDNdLGNvbnR0cmlidXQ6MTIscmVmZXJlbmM6NCxzaW5ndWxhcjo3LGNsb25lOlsxLDldLGFmdGVyOjAsdXNhYmw6Nyx3YWxrOjEwLGJlZm9yOlsxMiw3LDQsOSwxMF0sd3Jvbmc6NyxlbmM6WzEsMl0sc2NyYXRjaDoxMyxhdHRlbnQ6WzcsMTBdLGRhdGU6MyxpbnZlbnRvcnlfYmFzZV91cmk6WzYsNyw0XSxyZWR1bmQ6NyxkYXRhOlsxMCwxLDIsNywzXSx3ZWxjb206WzEyLDddLCJzaG9ydCI6WzEzLDEwXSxlc3NlbnRpOls0LDEwXSxwb3N0Zml4OlswLDddLHNpdDowLGNvcnJlc3BvbmQ6WzAsNiw3LDRdLGdyZWV0OjcsYW1iaWd1OjEwLGlzc3U6WzQsNywxM10saW5mb3JtOlsxLDcsMTBdLGNoaWVmOjcscHJlY2VkOls3LDEwXSxlbnZpcm9uOlswLDRdLGFsbG93OlswLDEsMiw3LDEzXSxvcmRlcjoxMCx0YWxrOls1LDEyXSxpbmNsdWQ6WzEwLDEsNywzXSxoZWxwOlsyLDYsOSwxMCwxMSwxMiwxM10sb3ZlcjpbNywxMF0saW5zaWdodDo3LGJlY2F1czpbMTIsNywxMyw5LDEwXSxyZXBvcnQ6Myx0aHJvdWdoOlswLDEsMiw3LDEwLDExLDRdLGhpZXJhcmNoaTpbMSwyLDEwXSx0YXhvbm9taToxMyxmbGV4aWJsOjEzLG1haW5saTpbNyw0XSxwYXJhbWV0OlsxMCwxLDIsNywzXSxzdHlsZTo3LGdyb3VwOlsxLDIsNyw0LDEwXSxjbGk6WzQsNywxM10sb3ZlcndyaXQ6WzAsM10sZml4OlsxMywzXSxtYWtlcGtnOjksYmV0dGVyOlsxLDEzLDRdLHlhbWw6WzEsMiw2XSx3cnQ6MyxpbmZyYXN0cnVjdHVyOlsxLDIsNywxMF0sY3JlYXQ6WzcsMTNdLHBhbnRzZnVsbG9mdW5peDoyLGNvbXByZWhlbnM6MTMsbWFpbDpbMSwxMiw3LDldLHRoZXJlZm9yOlswLDExLDcsNCwxMF0sbWlnaHQ6WzcsMTMsMTBdLHRoZW06WzAsMTMsNywxMCwxMiw0XSxnb29kOjEzLCJyZXR1cm4iOlswLDcsNCwxMF0sdGhlaTpbMCwxMSwxMyw0LDEwXSxweXRob246WzEyLDQsOV0sZGFpOjEwLGluaXRpOjMsZnJhbWV3b3JrOjEsamluamEyOjcsdGVybWlub2xvZzpbNCwxMF0sdGhlcmViaTo3LGNsb2JiZXI6Nyxub3c6WzAsMSwzLDQsNywxMCwxMiwxM10sbm9yOlswLDddLHRlcm06WzEsMTBdLGRvY3VtZW50OlsxLDIsNiwzXSxzb21ld2hlcjo3LG5hbWU6WzEwLDcsM10sYW55dGg6WzEsNF0scGVyc3BlY3Q6WzcsMTBdLHJldmVydDozLHNlcGFyOlswLDEsMl0seWFvdXJ0OjksZXhhbXBsOlsxMyw2LDcsMTAsMTEsNF0sbW9kZTpbMTIsOV0sZWFjaDpbMCw3XSxkZWJ1ZzpbMSw3LDQsM10sZm91bmQ6WzYsNyw5XSx1cGRhdDpbMTMsM10sc2lkZToxMyxtZWFuOlswLDQsMTIsMTMsMTBdLHN1YnNldDo3LG5vZGVzX3VyaTo2LGdpdDpbMSwxMiw5XSxtaWNoYWVsOjcsaGFyZDoxMyxpZGVhOlsxMiwxM10scmVhbGxpOlswLDFdLGVuc3VyOls0LDEzLDEwXSxjb25uZWN0OjcscXVhbnR1bToxMCxvdXI6NyxoYXBwZW46WzAsMTEsMTBdLG91dDpbMCw3LDRdLHNob3duOjQscmViYXM6MTIsc3BhY2U6WzAsMTAsM10sbjEwMDA6NyxjYXRlZ29yaToxMCxzYW5lOlswLDExXSxhZGFwdDpbMSwyLDMsNiw3LDEyLDRdLHJlYWRlcjo3LHByaW50OlsyLDcsOV0sZ290OjEzLG1lcmc6WzEsMiwxMCwxMiwzXSxjd2Q6MTMsYW5jZXN0cmk6WzcsNCwxMF0scHJveGk6MTMsaW5zaWQ6WzAsN10sbWlncmF0OjMsd2hlcmVhOjcsZGlmZmVyOlswLDExLDcsNCw5XSxmcmVlOjMsYmFuOjcscmVhc29uOlsxMywzXSxiYXNlOlswLDEsMiw0LDcsMTEsMTNdLGRpY3Rpb25hcmk6WzAsNywxM10sYXNrOlswLDEsNywxMF0sb3JnOjEwLGNhcmU6WzEsN10scmVjb25maWd1cjo3LGlubWZvcm06MCxjb3VsZDpbMCw0LDEyLDEzXSxtZW1iZXJzaGlwOlsxLDJdLGtlZXA6WzAsNCwxMiwxM10sZmlsdGVyOlsxLDNdLHRoaW5nOjEzLG9yZ2FuaXM6WzEsMl0saXNuOlsxLDIsOV0sY2lyY3VpdDoxMyxzYWx0X21pbmlvbjo0LG9udG86WzAsMTIsNyw0XSx0aGluazpbMSwyLDcsMTNdLGZpcnN0OlswLDYsNCwxMF0sb3BlcjpbMSwxMCwzXSxkaXJlY3RsaTpbMTEsMTIsNyw0XSxvbmM6MSxpbmRlcGVuZDoxMCxxdWFsaXRpOjUsbnVtYmVyOlsyLDEyLDEwXSx0aGVyZW9mOjcseW91cnNlbGY6NCxtYWk6WzAsMSwzLDYsNywxMF0saW5zdHJ1Y3Q6WzExLDFdLGFscmVhZGk6WzAsMSw3LDQsMTBdLHB1cHBldDpbMSwyLDZdLGxlYXN0Ols3LDQsMTBdLHdhc246MyxyZWNsYXNzX2FkYXB0OjQsZ2l2ZW46MTMsZ3Vlc3Q6MTIsY29udmVudDpbMCw3XSxzY3JpcHQ6WzYsNCwxMl0sbWFzdGVyX3RvcDpbMSwyLDQsM10sdG9wOlsxMiw0XSxzeXN0ZW06WzExLDEsMiw3LDRdLG1lc3NhZzpbMSwxMF0sbWFzdGVyOjEsdG9vOlsxLDcsMTNdLHNpbWlsYXJsaTpbNCwxMF0sd2hpdGU6MTMsc2NoZW1lOjEzLCJmaW5hbCI6WzAsMTBdLHByZXR0aWVyOjIsZm9ydGhjb206NSxhc3NpZ246WzAsMTNdLG9wdGlvbjpbMSw2LDcsOV0sZXNwZWNpOjMsbmFtZXNwYWM6MCx0b29sOlsxMSwxLDIsNywxM10sb2d2OjUsc2V0dXB0b29sOls5LDNdLHNwZWNpZmk6WzAsMSw0LDcsMTAsMTEsMTNdLHRhc2s6WzcsMTNdLGJsYWNrbGlzdDoxMywidmFyIjo3LGdpdGh1YjpbMSwxMiw3LDEzLDldLHBhcnM6WzEzLDEwXSxzb21ld2hhdDpbMSwxMiwxMF0sY2hlY2tvdXQ6WzIsNyw0LDEyXSxoYXBwaWxpOjEwLGV4YWN0bGk6Nyx0aGFuOlswLDQsMTBdLHdpZGU6Nyx0YXJnZXQ6WzcsNF0scHJvdmlkOlswLDEsMiw0LDcsMTAsMTEsMTNdLHJlbW92OlswLDEzLDEwXSxvbGRlcjo0LCJfX3JlY2xhc19fIjo3LHNlY29uZDowLHN0cnVjdHVyOjAsb3V0YWc6MTAscmV1czpbNCwxM10sdmlkZW86NSxjb2xvdXI6Nyxwcm92aXM6NixwcmU6MCxjb21wdXQ6MTAsYW5pOlswLDcsMTMsMTBdLGdyb3VwX3Zhcjo3LHBhY2thZzpbMSw3LDldLGNvbXBsZXQ6WzEsMiw3LDRdLGhhdmU6WzAsMSw0LDcsOSwxMCwxMSwxMiwxM10sY2xvc2U6WzcsM10sbmVlZDpbMCwzLDQsNyw5LDEwLDExLDEzXSxzZWVtOlswLDRdLHR1cm46WzQsMTNdLGNhdXM6WzAsMTNdLHJlYWxtOjcsYnVpbHQ6MCxlcXVpdmFsOjEwLGxhdHRlcjo0LG5vdGU6WzAsNiw3LDQsMTBdLGFsc286WzEsMTIsNywxMF0saWRlYWw6MSxtYWludGFpbjpbMSwyLDEyLDldLHRha2U6Nyx3aGljaDpbMCwxLDMsNCw1LDcsOSwxMCwxMSwxM10sY29uY2Vybjo3LG5vdGg6MCxzaW5nbDpbMSwyXSxzaW1wbGlmaToxMyxjb3BpOls3LDRdLGdlcm1hbmk6MCxkaXN0cmlidXQ6MSxwbGVudGk6MTAsc2hhbGw6WzcsNF0sdW5zdXI6MTMscHJldHR5X3ByaW50OjYscHJldmlvdTpbMTMsM10scmVhY2g6MCxub2RlaWQ6MTMsbW9zdDpbMCwyLDEwXSxyZW5kZXI6MyxyZWd1bGFyOlswLDEzXSx0aGFuazo5LHRoaTpbMCwxLDIsNCw3LDksMTAsMTEsMTIsMTNdLHBhaXI6WzAsNiwxMF0saGVuYzpbMCw3XSxob21lcGFnOjMsImNsYXNzIjpbMCwxLDIsMyw3LDEwLDRdLGRvbjpbNCw2LDcsMTMsMTBdLGRvYzpbMTEsMiw0LDksM10sY2xlYXI6MTAsbGF0ZXI6MTMsY292ZXI6MTIsdXJpOlsxMSwyLDEzLDYsM10sZG9lOlswLDEsNyw0LDEwXSxkZW5pOjcscGFydDpbNywxM10scGxhY2U6WzAsMTMsOV0sY2xlYW46MTIsZGF0YWJhczoxMCx1c3VhbDpbMSwyLDEwXSxzYWx0OlsxLDIsNiwzXSxmYWN0Ols3LDEzXSxzaG93Ols0LDEwXSx2ZXJib3M6MSxuaWVsOjksYmluOlsxMiw5XSxicmluZzpbMSwxMF0scGxheWJvb2s6NyxoYWNrOjcsZmluZTo0LGZpbmQ6WzEyLDQsOSwxMF0sYWNjZXNzOlsxLDIsNiwxMCwxMiwxM10sb25saTpbMCwxMyw2LDcsMTIsNF0sZmlyZXdhbDowLGxvY2F0OlswLDEsMiw0LDcsOSwxMSwxM10sanVzdDpbMCwxMyw3LDksMTIsNF0scHJldHRpOlsyLDddLGFic3BvZWw6OSxleHBsYWluOls3LDRdLGNvbmZpZ3VyOjcscmVsZWFzOjMsZmlndXI6WzAsNF0sbWFrZWZpbDoxMixzaG91bGQ6WzAsMSw0LDcsOSwxMCwxM10sc2VydmVyX2hvc3Q6NyxleHBlcmltZW50OjEzLHN1cHBvczowLGNlbnRyYWw6MTAsdHVuZTo0LGxvY2FsOlswLDEyLDldLHltbDpbMCw0LDYsNywxM10sb3ZlcndyaXR0ZW46MTAsbW92ZTowLHZhcmlvdToxMyxnZXQ6WzEsNyw0LDksMTBdLGV4cHJlc3M6WzAsMTNdLHN0b3A6NyxhdXRvbTpbMTEsMSwyXSxiYWNrZW5kOlswLDJdLG9idmlvdToxMCxjYW5ub3Q6WzAsNCwxM10sc3NoOlswLDcsOSwxMF0sd2hlZXppOjcsIm5ldyI6MyxoYXJkY29kOls3LDRdLHJlc3RhcnQ6WzcsNF0scmVjZWl2OjEwLGVuYWJsOjQsYXJ0aXN0OjEsbm9kZWdyb3VwOjQseWllbGQ6MTMscGF0Y2g6WzEyLDcsOV0scmVsb2FkOjEzLHN0dWZmOjEyLGNvbW1vbjpbMSwyXSxjb250YWluOlswLDMsMTMsNywxMCw0XSxzd2l0emVybGFuZDowLHdoZXJlOlswLDEsNCw3LDksMTNdLHZpZXc6WzcsNF0sc2V0OlswLDEsMiw2LDcsMTAsNF0sbm9kZWluZm86WzExLDIsNyw0LDNdLHRyZWU6WzEsMiwxMl0sYWNjb3JkOjEzLGRhdGF0eXA6MTIsc2VlOlsxLDYsNywxMiwzXSxmdWxsOjcscmVzdWx0OlswLDEzLDEwXSxoYXNoOjksc2ltcGw6WzAsMV0scmV0cmlldjowLGJlc3Q6MTMsc3ViamVjdDoxLGF3YXI6NCxzdGlsbDpbMCw3LDEzLDEwXSxwYXJlbnQ6WzAsNywxMF0sZXhwZXJ0OjEyLGhvcGVmdWxsaTo3LHBhdHRlcm46MTMsc29tZXRoOjEzLGVudW1lcjpbMCwxM10sYW5zaWJsZV9mcWRuOjcsc3RhdGU6NCx3b246WzQsMTBdLHN1YmRpcjowLGJldHdlZW46WzAsMSwyLDcsMTAsMTEsMTNdLGNydWRlOls3LDRdLCJpbXBvcnQiOlsxLDIsOV0saXJjOlsxLDEyXSxhcHByb2FjaDo3LGFjcm9zczpbMCw3LDNdLGJhc2VfaW52ZW50b3J5X3VyaTo0LGFsdGVybjo0LG11bHRpcGw6WzAsMSwyLDEzLDEwXSxtYW5wYWc6MSwiX2FmdGVyXyI6MTAsZXh0ZW5zOjEsam9iOlsxMSwxLDJdLGVudGlyOjIsc29sdjoxMyxvdXRlcjowLGNvbWU6Nyxwb3B1bDowLGJvdGg6WzQsMTMsMTBdLGFjY2lkZW50OjEwLGxhc3Q6WzcsMTNdLGFub3RoZXJfY2xhc3NfdG9fc2hvd190aGF0X2l0X2Nhbl90YWtlX2xpc3Q6MCxwbHVnaW46WzAsNF0sYWRtaW46WzcsMTBdLGZhdWx0OjMsaG93ZXY6WzAsMSwyLDcsMTAsMTEsMTNdLGFsb246WzEsMl0sZXF1YWw6MTMsYWdhaW5zdDoxMyxldGM6WzEsMiw0LDYsNywxMCwxMSwxM10saW5zdGFuYzpbMCw3LDEzXSxncmFpbjoxMyxjb250ZXh0OlswLDEwXSxsb2dpYzpbMCwxLDIsNl0saW1wcm92OlsxLDEyXSxjb206WzEsNywxMyw5XSxzaW1wbGk6WzYsMTMsMTBdLHBvaW50Ols0LDcsMTMsMTBdLHNjaGVkdWw6MTAsdWJ1bnR1OjEsbWluaW9uX2lkOjMsYXJiaXRyYXJpbGk6MTMsaGVhZGVyOjAsbm9uOjEwLGF1cjo5LHJlc3BlY3Q6WzExLDEsMl0sdGhyb3VnaG91dDoxMCxhc3N1bTpbNCwxMF0sZHVwbGljOlsxLDJdLHBlcm1pdF9yb290X2xvZ2luOlswLDEwXSxydWRpbWVudGFyaTpbMTIsMTMsM10sbWVudGlvbjoxMyxkdWU6OSxiZWVuOlswLDUsNyw5LDEwLDRdLGFjY3VtdWw6WzAsMTBdLGpzb246WzIsNyw2XSxtdWNoOlsxLDddLGludGVyZXN0OjcsZWxlY3RyOjEwLGRlZXBsaTowLGFkZGl0OlswLDEzXSxxdWlja2xpOls3LDRdLGNvbmZpZ3Byb3hpOjEzLGNtZF95YW1sOjQsYml0OlsxLDIsNywxM10scmVzb2x1dDoxMCxtaW5lOjEzLHVuZGVyc3RhbmQ6MTMsbWFkZHVjazpbMSw3LDEzLDldLGNoaWxkOjEwLHByZXNlbnQ6WzAsNV0sc2hvd190b3A6NCwiY2FzZSI6WzEzLDEwXSx1bml4bm9kOjEwLGluaXQ6WzAsNCwzXSxsb29rOlswLDEsMyw0LDYsNywxMSwxMiwxM10saGFyZGVyOls0LDEzXSx2YXJzX2ZpbDo3LGFpbToxLGRlZmluOlswLDEsMiwzLDQsNiw3LDEwLDEzXSxpbnZvazpbMTIsNyw0XSx1bmlmaToxMyxtYXRjaDoxMyxhYm92Ols0LDEzLDksMTBdLGVycm9yOlswLDcsMTMsM10sZ2xvc3Nhcmk6MTAsZXhpc3Q6WzAsMiw3LDQsMTJdLGludm9jOlsxMSwxMywzXSxsb29wOlswLDEwXSxlYXJsaToxLHh2emY6OSxtb3RkOlswLDcsMTBdLHRhcjo5LHJlYWRpOjAscmVhZG06MTEsY29udmluYzoxMyxkZXN0aW46OSxhcmNoaXY6OSxlcmFzOjAsc3lub3BzaToxLCJudWxsIjowLGRldmVsb3A6WzEyLDcsMTMsOV0saW52ZW50b3JpOlswLDEsMiwzLDcsMTAsNF0scGVyZm9ybTpbNywzXSxzdWdnZXN0OlswLDddLG1ha2U6WzAsMiw0LDYsNyw5LDExLDEyLDEzXSxiZWxvbmc6MCxzYW1lOlswLDEsNyw0XSxtZW1iZXI6NyxyZWFkOlswLDQsNiwxMywxMF0sbGVuZ3RoaToxMyxjb21wbGV4OjEzLGRlc2NlbmQ6WzAsMTBdLHN1YnRyZToyLHN0b3JlY29uZmlnOjEzLGV2ZW50dTo0LGhpZ2hlcjoxMCxpbmNvcnJlY3Q6MyxodHRwOlsxLDIsNywxMyw5XSx3ZWJzZXJ2OlswLDcsMTBdLGltYWdpbjoxMyxuZXN0OlsxLDIsMTBdLHRsZDowLHVwb246MTAsZWZmZWN0OjEzLGhhbmQ6MTMsbW9tZW50Ols0LDEzXSx1c2VyOlsxLDEwXSxtYW5pOjEzLGJ1aWxkOjEwLHdoZXJldjo3LHN0dWRpOjExLGV4cGFuZDoxMyxyZWNlbnQ6MSxleHRfcGlsbGFyOlsxLDIsNF0sYXBwcm9wcmk6WzEyLDEwXSxvZmY6WzcsNCwxMF0sbGliOjksYmV3YXI6NCxpbmNvbnNpc3Q6WzEyLDEzXSxlbnRyaTpbNyw0XSxpZmllcjoxLHdlbGw6WzEsMiw3LDEwLDEyLDRdLGluaGVyaXQ6WzEsMiw3LDEwXSxwaGlsb3NwaGk6MTMscmVjbGFzc19zb3VyY2VfcGF0aDo0LGVmZmljaTo3LGNsaWVudDpbMTMsMTBdLGNvbW1hbmQ6WzEsMiw0LDYsNyw5LDEzXSx3d3cxOjAsZmlsZXN5c3RlbTowLGV2ZXJ5dGg6NyxwYXJhZGlnbTpbMTEsMV0sd2luZG93c25vZDoxMCxzZWxmOjEzLGxhdGVzdDoxLGV4ZWN1dDo3LG9iamVjdDpbMTIsMTNdLGZvcl9kZW1vbnN0cjowLG9idGFpbjpbMCw3LDEwLDksM10sY2hvc2U6MSx5ZXQ6WzAsNCwxM10sZXhwb3M6WzEsMl0saGFkOlswLDEsMTNdLGV4Y2VwdDoxMCx0aGVvcmV0Ols0LDEwXSxhZGQ6WzEsMiw3LDQsM10sb3RoZXI6WzEsNywxMF0sbm9kZV92YXI6Nyx4dGVybmFsOjEsb3VnaHQ6NCxnYXZlOjUsb3B0OjksYXBwbGljOlswLDcsNCwxMF0sYXJvdW5kOjQsZm9ybWF0OlsxMSwyLDcsMTJdLHByZXNlcnY6MCxzZXRfY29uZmlnZmlsZV9zZWFyY2hfcGF0aDoxMyxtdW5pY2g6WzAsMTBdLGFwcGxpY2F0aW9uc19wb3N0Zml4OjcsZW52aXM6MTMsa25vdzo0LGxjYTo1LHJlYWxpczoxLHBhc3N3b3JkOjEwLHJlY3VyczpbMTAsM10seW91OlswLDEsMiw2LDcsOSwxMCwxMSwxMiw0XSxkYXJlOjcsc3RvcmFnZV90eXA6WzYsNyw0XSxyZXNpZDpbMCw3XSxsaWtlOlswLDQsNyw5LDExLDEzXSxzcGVjaWY6WzAsMSwyLDQsMTAsMTNdLGZpbGVuYW06MCxwaWxsYXI6WzQsMTMsM10scmVhbGlzdDoxMyxtYW51YWw6WzExLDIsNl0scmVzb2x2Ojcsc2VydmVyOlswLDcsMTBdLGNvbGxlY3Q6NCxuZWNlc3Nhcmk6WzcsNCw5XSxlaXRoZXI6NCxtYXJ0aW46MSxjdXN0b21pczoxMyxvdXRwdXQ6WzYsNyw5LDNdLGhvb2s6NCxhcHBsaWF0OjAsdW5uZWNlc3Nhcmk6NyxmdWxmaWw6WzEsMl0sZW5jb3VudDpbMTMsMTBdLHd3dzowLHJpZ2h0Ols0LDEzXSx3aG86MTAsZGVhbDpbNywxM10saW50ZXJhY3Q6WzcsNCwxMF0sc29tZTpbNiw3LDEyLDEwXSxiYWNrOjEwLHdlYm06NSxjZXJ0YWluOlsxMywxMF0saW50ZXJuOjEsc3VyZTpbMCwxMSw2LDQsOV0sImV4cG9ydCI6WzQsMTNdLCJfaG9zdCI6NyxwYWluOjEzLGJvcmU6MTIsc3VycHJpczo3LGxlYWY6MCxtYWlsc2Vydjo3LGxlYWQ6MCxjaGFubmVsOjEsdGhvdWdoOjQsZGVmaW5pdDpbMCw3LDEwXSxzbGlkZTo1LHBlcjpbMTEsOV0scGlsbGFyX3Jvb3Q6NCxleGl0OjAsc2xhc2g6MCxjb250ZW50OjcsbG9jYWxob3N0OlsxMSw3LDRdLHJlZmVyOlswLDEsMiw3LDZdLGNvcmU6MyxlbmNvdXJhZzpbMSwyXSxzZW5zaWJsOjEzLHJ1bjpbMyw3LDksMTAsMTEsMTIsNF0scG93ZXI6MCxxdWl0OlswLDFdLGltcG9zczo0LGluc3BlY3Q6NCxzeW1saW5rOls2LDcsNF0sc3RlcDpbMCw3LDQsOV0sYWx0aG91Z2g6MCxyZWdleHA6WzEsM10sY29kZW5hbToxMCxkZWJpYW5ub2Q6WzcsMTBdLGhhbmRpOjQsc3RhZ2U6MTMsY29tcGFyaXNvbjoxMyxhYm91dDpbMTIsMTBdLGFjdHVhbDpbMCwxMSwxM10sZ3JlYXRsaToxMyxpbmNvcnBvcjoxMyxjb2V4aXN0OjQsc2xpZ2h0bGk6WzcsNF0scGFnZTpbMTEsMiw2XSxtaXNub206MSxzcnY6WzYsNyw0XSxlY3VyczoxLGRvbmU6WzAsMTJdLGFjdDowLGNvbW1pdDo5LHN1YnN5c3RlbTo0LG93bjpbMTEsNl0scmVhbDoxLHB5dGhvbnBhdGg6NCx3aXRoaW46MCxidWlsdGluOjQsYXV0b21hdDowLHR3bzpbMCwxLDIsNywxMCwxMSw0XSxkb3duOjEwLHdyYXA6MTMsc3RvcmFnOlsxLDJdLHlvdXI6WzEsMiw3LDEwLDExLDEyLDRdLG1hbmFnOlsxLDIsNywxMF0sb2NjdXBpOjEsYWNjb3JkaW5nbGk6WzQsM10sY2VydGFpbmxpOjEyLGFyY2hsaW51eDoxLGxvZzpbMTAsMSw3LDEzLDNdLHdhaTpbMTEsNCw3LDEzXSxmZXc6NCxhc3N1bXB0OlswLDEwXSx3ZWVrZW5kOjEwLHN1cHBvcnQ6WzAsNiw3LDRdLHF1ZXN0aW9uOlsxLDcsMTNdLGxpdmU6MTMsImxvbmciOjEzLGhhcHBpOlswLDEzXSxhdmFpbDpbMiwzLDEzLDksMTIsNF0sYWdhaW46WzAsN10sd2luZG93OjEwLGludGVyZmFjOlsyLDYsM10sbG93OjUsbG90OlsxMiwxM10scmVwbGFjOlswLDEsMiwxMywxMF0sZm9yd2FyZDpbMTIsMTNdLHN1YmtlaTowLGhlYWQ6MTIscHJvcGVybGk6WzcsNF0sZW5vdWdoOlsxLDJdLGFsdG9nZXRoOjcsY21zczoxMyx0aHJlZTpbMCwxMV0sc2tpcDoxMCx0cmFuc2xhdDoxMSx1bmluc3RhbDpbMTIsOV0sd3d3OTk5OjAsbGluZTpbMiwxMyw2LDcsMTAsNF0sc3RhbmQ6WzEsMl0sInRydWUiOls2LDRdLGJ1Zzo5LGV4dGVuZDpbMCw0XSxwdWxsOjEyLG1hZGU6WzQsMTNdLGNvbnNpc3Q6WzEyLDEzLDEwXSxwb3NzaWJsOlswLDQsMTMsOSwxMF0sImRlZmF1bHQiOlswLDIsNCw2LDcsMTEsMTNdLHdpc2g6NyxwYWNtYW46OSxkaXNwbGFpOjIsdW50aWw6WzAsMTBdLHJlY29yZDo1LGJlbG93OjAsbGltaXQ6WzcsMTNdLG90aGVyd2lzOjYscHJvYmxlbToxMyxub2RlbmFtOlsyLDEzXSxleHBlY3Q6WzExLDcsMTBdLGNvcmRpYWw6OSxmZWF0dXI6WzEsMiw0LDEwXSxldmFsdToxMCxiYWNrcmVmZXI6MCxyZXF1ZXN0OlsxMiwxM10sZHVyZTpbMCw3LDEzLDEwLDNdLGRlZXA6WzAsN10sbG9ja19jb25maWdfb3B0OjEzLHN0cm9uZ2xpOjcsaW1wbGVtZW50OlsxLDZdLGRpY3RfcmVmZXI6WzAsN10sZmlsZTpbNywxMF0saG9tZTpbNiw0XSxjaGVjazpbNyw0LDldLHByb2JhYmw6WzcsMTNdLGFzc2VtYmw6WzEsMl0sZGVub3Q6MTMsd2hlbjpbMCw3LDQsMTAsM10sZGV0YWlsOlsxLDIsOV0scHJlcGVuZDpbMTEsMl0sdmFsaWQ6MTMsbG9va3VwOlsxLDZdLGZ1dHVyOjAsdGVzdDpbMSwxMiw3LDQsOV0scHJlc3VtOjcsYmFzZWxpbjoxMyxtb2NrOlsxMiwxM10sbmljZTpbMTIsMTNdLG5vZGU6WzEwLDYsNywzXSxtYXR1cjozLHdpbGRjYXJkOjEsYXN0ZXJpc2s6MCx0cmFjazoxMyxvdXRwdXR0OjEzLG1vbmRhaToxMCx1bmxlc3M6WzAsMTEsMTBdLGRlYmlhbjpbMSw3LDEwXSxzdGFpOjQsY29uZmlnX3Byb3hpOjEzLGxvbmdlcjpbNywxMF0sZnVydGhlcm1vcjpbMCwxMywxMF0sZGlyZWN0b3JpOlswLDMsNiw3LDExLDEyLDRdLGNvbGxpczozLGRlc2NyaXB0OlsxLDEwXSxpbmRpcmVjdGxpOlsxMSwyXSxydWxlOjcsY2xhc3NfbWFwOjAsdGltZTpbMCwxLDIsM10scGx1OjAsZXNjYXA6MCx0b2dldGg6MTF9LG9ianR5cGVzOnt9LG9iam5hbWVzOnt9LGZpbGVuYW1lczpbIm9wZXJhdGlvbnMiLCJpbmRleCIsIm1hbnBhZ2UiLCJjaGFuZ2Vsb2ciLCJzYWx0IiwicmVmcyIsImNvbmZpZ2ZpbGUiLCJhbnNpYmxlIiwicHVwcGV0IiwiaW5zdGFsbCIsImNvbmNlcHRzIiwidXNhZ2UiLCJoYWNraW5nIiwidG9kbyJdLHRpdGxlczpbInJlY2xhc3Mgb3BlcmF0aW9ucyIsInJlY2xhc3MgXHUyMDE0IFJlY3Vyc2l2ZSBleHRlcm5hbCBub2RlIGNsYXNzaWZpY2F0aW9uIiwicmVjbGFzcyBtYW5wYWdlIiwiQ2hhbmdlTG9nIiwiVXNpbmcgcmVjbGFzcyB3aXRoIFNhbHQiLCJFeHRlcm5hbCByZWZlcmVuY2VzIiwicmVjbGFzcyBjb25maWd1cmF0aW9uIGZpbGUiLCJVc2luZyByZWNsYXNzIHdpdGggQW5zaWJsZSIsIlVzaW5nIHJlY2xhc3Mgd2l0aCBQdXBwZXQiLCJJbnN0YWxsYXRpb24iLCJyZWNsYXNzIGNvbmNlcHRzIiwiVXNpbmcgcmVjbGFzcyIsIkhhY2tpbmcgb24gcmVjbGFzcyIsInJlY2xhc3MgdG8tZG8gbGlzdCJdLG9iamVjdHM6e30sdGl0bGV0ZXJtczp7b3BlcjowLGNsYXNzaWY6MSxjb25jZXB0OjEwLHNldDoxMyxtZXJnOjAsZGVzY3JpcHQ6Mix2ZXJib3M6MTMsZXh0ZXJuOlsxLDVdLHNlZToyLGNvZGU6MSxwdXBwZXQ6OCxmaWxlOls0LDYsMTNdLGhhY2s6MTIsaGllcmFyY2hpOjEzLGluc3RhbDpbMTIsOV0sc3RvcmFnOjAsb3B0aW9uOjIsdmFyaWFibDo3LGZyb206WzEzLDldLGludmVudG9yaToxMyxyZWNsYXNzOlswLDEsMiw0LDYsNyw4LDEwLDExLDEyLDEzXSxjb21tdW46MSxkYXRhYmFzOjIsY29uZmlndXI6WzQsNiwxM10sImNsYXNzIjoxMyxjb250ZW50OjEseWFtbDowLGFyY2hsaW51eDo5LG1hc3Rlcjo0LGluY2x1ZDo5LHRlc3Q6MTMsbG9va3VwOjEzLGxpY2VuYzoxLHBhcmFtZXQ6MCxzdGFydDpbNyw0XSxkaXNjdXNzOjEyLGFkYXB0OjEzLG5vZGU6WzEsMTNdLG1hcDowLHNvdXJjOlsxLDldLHN5bm9wc2k6MixkaXN0cmlidXQ6OSxtYW5wYWc6MixvdXRwdXQ6MixleHRlbnM6MTMsbWVtYmVyc2hpcDoxMyx1c2VyOjkscXVpY2s6WzcsNF0sdWJ1bnR1OjkscmVsZWFzOjEscmVnZXhwOjAscmVjdXJzOjEsZGViaWFuOjksY29tbW9uOjEzLGFsc286MixhYm91dDoxLG5hbWU6MSxjaGFuZ2Vsb2c6MyxmcmFtZXdvcms6MTMsbGlzdDoxMyxkYXRhOlswLDEzXSxhbnNpYmw6NyxmaWx0ZXI6MTMsaW5mb3JtOlsyLDEzXSxpbnRlZ3I6WzcsNF0sbW9kZToyLHdpbGRjYXJkOjAsaW50ZXJwb2w6WzAsNywxM10sZGVidWc6MTMsaW1wcm92OjEzLHJlZmVyOjUsc2FsdDo0LG90aGVyOjksY29udHJpYnV0OjEyfX0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9kby5odG1sIGIvdG9kby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZmEzODcKLS0tIC9kZXYvbnVsbAorKysgYi90b2RvLmh0bWwKQEAgLTAsMCArMSwyNTAgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKworCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgIAorICAgIDx0aXRsZT5yZWNsYXNzIHRvLWRvIGxpc3QgJm1kYXNoOyByZWNsYXNzIDEuNC4xIGRvY3VtZW50YXRpb248L3RpdGxlPgorICAgIAorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iX3N0YXRpYy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL3B5Z21lbnRzLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgCisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgdmFyIERPQ1VNRU5UQVRJT05fT1BUSU9OUyA9IHsKKyAgICAgICAgVVJMX1JPT1Q6ICAgICcuLycsCisgICAgICAgIFZFUlNJT046ICAgICAnMS40LjEnLAorICAgICAgICBDT0xMQVBTRV9JTkRFWDogZmFsc2UsCisgICAgICAgIEZJTEVfU1VGRklYOiAnLmh0bWwnLAorICAgICAgICBIQVNfU09VUkNFOiAgdHJ1ZQorICAgICAgfTsKKyAgICA8L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL2pxdWVyeS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iX3N0YXRpYy91bmRlcnNjb3JlLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL2RvY3Rvb2xzLmpzIj48L3NjcmlwdD4KKyAgICA8bGluayByZWw9InRvcCIgdGl0bGU9InJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbiIgaHJlZj0iaW5kZXguaHRtbCIgLz4KKyAgICA8bGluayByZWw9Im5leHQiIHRpdGxlPSJDaGFuZ2VMb2ciIGhyZWY9ImNoYW5nZWxvZy5odG1sIiAvPgorICAgIDxsaW5rIHJlbD0icHJldiIgdGl0bGU9IkhhY2tpbmcgb24gcmVjbGFzcyIgaHJlZj0iaGFja2luZy5odG1sIiAvPiAKKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8ZGl2IGNsYXNzPSJyZWxhdGVkIj4KKyAgICAgIDxoMz5OYXZpZ2F0aW9uPC9oMz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgc3R5bGU9Im1hcmdpbi1yaWdodDogMTBweCI+CisgICAgICAgICAgPGEgaHJlZj0iZ2VuaW5kZXguaHRtbCIgdGl0bGU9IkdlbmVyYWwgSW5kZXgiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJJIj5pbmRleDwvYT48L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0iY2hhbmdlbG9nLmh0bWwiIHRpdGxlPSJDaGFuZ2VMb2ciCisgICAgICAgICAgICAgYWNjZXNza2V5PSJOIj5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9ImhhY2tpbmcuaHRtbCIgdGl0bGU9IkhhY2tpbmcgb24gcmVjbGFzcyIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9IlAiPnByZXZpb3VzPC9hPiB8PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9ImluZGV4Lmh0bWwiPnJlY2xhc3M8L2E+ICZyYXF1bzs8L2xpPiAKKyAgICAgIDwvdWw+CisgICAgPC9kaXY+ICAKKworICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50Ij4KKyAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50d3JhcHBlciI+CisgICAgICAgIDxkaXYgY2xhc3M9ImJvZHl3cmFwcGVyIj4KKyAgICAgICAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KKyAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0icmVjbGFzcy10by1kby1saXN0Ij4KKzxoMT5yZWNsYXNzIHRvLWRvIGxpc3Q8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI3JlY2xhc3MtdG8tZG8tbGlzdCIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gxPgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9ImNvbW1vbi1zZXQtb2YtY2xhc3NlcyI+Cis8aDI+Q29tbW9uIHNldCBvZiBjbGFzc2VzPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNjb21tb24tc2V0LW9mLWNsYXNzZXMiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPkEgbG90IG9mIHRoZSBjbGFzc2VzIEkgaGF2ZSBzZXQgdXAgZHVyaW5nIHRoZSB2YXJpb3VzIHN0YWdlcyBvZiBkZXZlbG9wbWVudCBvZgorPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGFyZSBnZW5lcmljLiBJdCB3b3VsZCBwcm9iYWJseSBiZSBzZW5zaWJsZSB0byBtYWtlIHRoZW0gYXZhaWxhYmxlIGFzCitwYXJ0IG9mIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiwgdG8gZ2l2ZSBwZW9wbGUgYSBjb21tb24gYmFzZWxpbmUgdG8gd29yayBmcm9tLCBhbmQgdG8KK2Vuc3VyZSBhIGNlcnRhaW4gbGV2ZWwgb2YgY29uc2lzdGVuY3kgYmV0d2VlbiB1c2Vycy48L3A+Cis8cD5UaGlzIGNvdWxkIGFsc28gcHJvdmlkZSBhIG1vcmUgcmVhbGlzdGljIGV4YW1wbGUgdG8gdXNlcnMgb24gaG93IHRvIHVzZQorPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+LjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InRlc3RpbmctZnJhbWV3b3JrIj4KKzxoMj5UZXN0aW5nIGZyYW1ld29yazxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjdGVzdGluZy1mcmFtZXdvcmsiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPlRoZXJlIGlzIHJ1ZGltZW50YXJ5IHRlc3RpbmcgaW4gcGxhY2UsIGJ1dCBpdCYjODIxNztzIGluY29uc2lzdGVudC4gSSBnb3QKK3NpZGUtdHJhY2tlZCBpbnRvIGRpc2N1c3Npb25zIGFib3V0IHRoZSBwaGlsb3NwaHkgb2YgbW9ja2luZyBvYmplY3RzLiBUaGlzCitjb3VsZCBhbGwgYmUgZml4ZWQgYW5kIHVuaWZpZWQuPC9wPgorPHA+QWxzbywgc3RvcmFnZSwgb3V0cHV0dGVycywgQ0xJIGFuZCBhZGFwdGVycyBoYXZlIGFic29sdXRlbHkgbm8gdGVzdHMgeWV04oCmPC9wPgorPHA+VGhlIHRlc3RpbmcgZnJhbWV3b3JrIHNob3VsZCBhbHNvIGluY29ycG9yYXRlIHRoZSBleGFtcGxlIGNsYXNzZXMgbWVudGlvbmVkCithYm92ZS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJjb25maWd1cmFibGUtZmlsZS1leHRlbnNpb24iPgorPGgyPkNvbmZpZ3VyYWJsZSBmaWxlIGV4dGVuc2lvbjxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjY29uZmlndXJhYmxlLWZpbGUtZXh0ZW5zaW9uIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD5SaWdodCBub3csIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+LnltbDwvc3Bhbj48L3R0PiBpcyBoYXJkLWNvZGVkLiBUaGlzIGNvdWxkIGJlIGV4cG9ydGVkIHRvIHRoZQorY29uZmlndXJhdGlvbiBmaWxlLCBvciBldmVuIGdpdmVuIGFzIGEgbGlzdCwgc28gdGhhdCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi55bWw8L3NwYW4+PC90dD4gYW5kIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+LnlhbWw8L3NwYW4+PC90dD4KK2NhbiBib3RoIGJlIHVzZWQuPC9wPgorPHA+QWN0dWFsbHksIEkgZG9uJiM4MjE3O3QgdGhpbmsgdGhpcyBpcyBzdWNoIGEgZ29vZCBpZGVhLiBJZiB3ZSBjcmVhdGUgdG9vIG1hbnkKK29wdGlvbnMgcmlnaHQgbm93LCBpdCYjODIxNztsbCBiZSBoYXJkZXIgdG8gdW5pZnkgbGF0ZXIuIFBsZWFzZSBhbHNvIHNlZSA8YSBocmVmPSIjaWQxIj48c3BhbiBjbGFzcz0icHJvYmxlbWF0aWMiIGlkPSJpZDIiPmBpc3N1ZSAjMTcKKyZsdDtodHRwczovL2dpdGh1Yi5jb20vbWFkZHVjay9yZWNsYXNzL2lzc3Vlcy8xN2BfPC9zcGFuPjwvYT4gZm9yIGEgZGlzY3Vzc2lvbiBhYm91dCB0aGlzLjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InZlcmJvc2l0eS1kZWJ1Z2dpbmciPgorPGgyPlZlcmJvc2l0eSwgZGVidWdnaW5nPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiN2ZXJib3NpdHktZGVidWdnaW5nIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD5WZXJib3NlIG91dHB1dCBhbmQgZGVidWcgbG9nZ2luZyB3b3VsZCBiZSBhIHZlcnkgdXNlZnVsIGFkZGl0aW9uIHRvIGhlbHAKK3Blb3BsZSB1bmRlcnN0YW5kIHdoYXQmIzgyMTc7cyBnb2luZyBvbiwgd2hlcmUgZGF0YSBhcmUgYmVpbmcgY2hhbmdlZC9tZXJnZWQsIGFuZCB0bworaGVscCBzb2x2ZSBwcm9ibGVtcy48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJkYXRhLWZyb20tY21zLWZvci1pbnRlcnBvbGF0aW9uIj4KKzxoMj5EYXRhIGZyb20gQ01TIGZvciBpbnRlcnBvbGF0aW9uPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNkYXRhLWZyb20tY21zLWZvci1pbnRlcnBvbGF0aW9uIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD5EZXBlbmRpbmcgb24gdGhlIENNUyBpbiBxdWVzdGlvbiwgaXQgd291bGQgYmUgbmljZSBpZiA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gaGFkIGFjY2VzcyB0bwordGhlIGhvc3Qtc3BlY2lmaWMgZGF0YSAoZmFjdHMsIGdyYWlucywgZXRjLikgYW5kIGNvdWxkIHVzZSB0aG9zZSBpbiBwYXJhbWV0ZXIKK2ludGVycG9sYXRpb24uIEkgY2FuIGltYWdpbmUgdGhpcyB3b3JraW5nIGZvciBTYWx0LCB3aGVyZSB0aGUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5ncmFpbnM8L3NwYW4+PC90dD4KK2RpY3Rpb25hcnkgKGFuZCByZXN1bHRzIGZyb20gcHJldmlvdXMgZXh0ZXJuYWwgbm9kZSBjbGFzc2lmaWVycykgaXMgbWFkZQorYXZhaWxhYmxlIHRvIHRoZSBleHRlcm5hbCBub2RlIGNsYXNzaWZpZXJzLCBidXQgSSBhbSBub3QgY29udmluY2VkIHRoaXMgd2lsbAorYmUgcG9zc2libGUgaW4gQW5zaWJsZSBhbmQgUHVwcGV0LjwvcD4KKzxwPk9uIHRoZSBvdGhlciBoYW5kLCBwcm92aWRpbmcgQ01TLXNwZWNpZmljIGRhdGEgdG8gcmVjbGFzcyB3aWxsIG1ha2UgcGVvcGxlCitkZXBlbmQgb24gaXQsIG1lYW5pbmcgU2FsdCBjYW5ub3QgYmUgdXNlZCB3aXRoIG11bHRpcGxlIHRvb2xzIGFueW1vcmUuPC9wPgorPHA+VGhlIHdheSB0byBkZWFsIHdpdGggdGhhdCB3b3VsZCBiZSB0byBtYXAgZ3JhaW5zLCBmYWN0cywgd2hhdGV2ZXIgdGhlIENNUworY2FsbHMgdGhlbSwgdG8gYSBzaGFyZWQgbmFtaW5nIHNjaGVtZS90YXhvbm9teSwgYnV0IHRoYXQmIzgyMTc7cyBhIHBhaW5mdWwgdGFzaywKK0kgdGhpbmsuIEl0IHdvdWxkIG1lYW4sIGhvd2V2ZXIsIHRoYXQgZXZlbiB0ZW1wbGF0ZXMgY291bGQgYmUgc2hhcmVkIGJldHdlZW4KK0NNU3MgaWYgdGhleSBvbmx5IHVzZSB0aGUgZGF0YSBwcm92aWRlZCBieSByZWNsYXNzIChpLmUuIGdyYWlucy9mYWN0cyBiZWNvbWUKK3BpbGxhciBkYXRhKS48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJtZW1iZXJzaGlwLWluZm9ybWF0aW9uIj4KKzxoMj5NZW1iZXJzaGlwIGluZm9ybWF0aW9uPGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNtZW1iZXJzaGlwLWluZm9ybWF0aW9uIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD5JdCB3b3VsZCBiZSBuaWNlIGlmIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBjb3VsZCBwcm92aWRlIGUuZy4gdGhlIE5hZ2lvcyBtYXN0ZXIgbm9kZSB3aXRoCithIGxpc3Qgb2YgY2xpZW50cyB0aGF0IGRlZmluZSBpdCBhcyB0aGVpciBtYXN0ZXIuIFRoYXQgd291bGQgc2hvcnQtY2lyY3VpdAorUHVwcGV0JiM4MjE3O3MgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5zdG9yZWNvbmZpZ3M8L3NwYW4+PC90dD4gYW5kIFNhbHQmIzgyMTc7cyA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPm1pbmU8L3NwYW4+PC90dD4uPC9wPgorPHA+VGhlIHdheSBJIGVudmlzaW9uIHRoaXMgY3VycmVudGx5IGlzIHRvIHByb3ZpZGUgc29tZXRoaW5nIEkgY2FsbCAmIzgyMjA7aW52ZW50b3J5CitxdWVyaWVzJiM4MjIxOy4gRm9yIGluc3RhbmNlLCB0aGUgTmFnaW9zIG1hc3RlciBub2RlJiM4MjE3O3MgcmVjbGFzcyBkYXRhIHdvdWxkIGNvbnRhaW4KK3RoZSBmb2xsb3dpbmcgKDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+JFvigKZdPC9zcGFuPjwvdHQ+IHdvdWxkIGRlbm90ZSBpbnRlcnBvbGF0aW9uIHRvIGNyZWF0ZSBhIGxpc3QsIGEgYml0CitsaWtlIGxpc3QgY29tcHJlaGVuc2lvbik6PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPnBhcmFtZXRlcnM6CisgIG5hZ2lvczoKKyAgICBob3N0czogJFtuYWdpb3M6bWFzdGVyID09IFNFTEYubm9kZW5hbWVdCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+VGhpcyB3b3VsZCBjYXVzZSA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gdG8gaXRlcmF0ZSB0aGUgaW52ZW50b3J5IGFuZCBnZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsCit0aGUgbm9kZXMgdGhhdCBkZWZpbmUgYSBwYXJhbWV0ZXIgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5uYWdpb3M6bWFzdGVyPC9zcGFuPjwvdHQ+IHdob3NlIHZhbHVlIGVxdWFscyB0byB0aGUKK25hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZS48L3A+Cis8cD5UaGlzIGNvdWxkIGJlIGdyZWF0bHkgc2ltcGxpZmllZC4gRm9yIGluc3RhbmNlLCB3ZSBjb3VsZCBzaW1wbHkgbGltaXQKK2NvbXBhcmlzb25zIGFnYWluc3QgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQganVzdCBzcGVjaWZ5PC9wPgorPGRpdiBjbGFzcz0iaGlnaGxpZ2h0LXB5dGhvbiI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlPiRbbmFnaW9zOm1hc3Rlcl0KKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8cD53aGljaCB3b3VsZCBiZSBleHBhbmRlZCB0byBhIGxpc3Qgb2Ygbm9kZSBuYW1lcyB3aG9zZSBwaWxsYXIgZGF0YSBpbmNsdWRlcworPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4ke25hZ2lvczptYXN0ZXJ9PC9zcGFuPjwvdHQ+IHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBub2RlJiM4MjE3O3MgbmFtZS48L3A+Cis8cD5PciBpdCBjb3VsZCBiZSBtYWRlIGFyYml0cmFyaWx5IGNvbXBsZXggYW5kIGZsZXhpYmxlLCBlLmcuIGFueSBvZiB0aGUKK2ZvbGxvd2luZzo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JFtuYWdpb3M6bWFzdGVyID09IFNFTEYubm9kZW5hbWVdICAgICAgICAgICAgICAgICAgIyByZXBsYWNlIHdpdGggbm9kZW5hbWUKKyRbbmFnaW9zOm1hc3RlciA9PSBTRUxGLm5vZGVuYW1lIHwgbm9kZW5hbWVdICAgICAgICMgbmFtZSByZXBsYWNlbWVudCB2YWx1ZQorJFtuYWdpb3M6bWFzdGVyID09IFNFTEYubm9kZW5hbWUgfCBuYWdpb3M6bm9kZWlkXSAgIyByZXBsYWNlIHdpdGggcGlsbGFyIGRhdGEKKyRbeDpuYWdpb3M6bm9kZWlkIGZvcmVhY2ggeCB8IHg6bmFnaW9zOm1hc3RlciA9PSBTRUxGLm5vZGVuYW1lXQor4oCmCis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+SSYjODIxNztkIHJhdGhlciBub3QgY29kZSB0aGlzIHVwIGZyb20gc2NyYXRjaCwgc28gSSBhbSBsb29raW5nIGZvciBpZGVhcyBmb3IgcmV1c2XigKY8L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJjb25maWd1cmF0aW9uLWZpbGUtbG9va3VwLWltcHJvdmVtZW50cyI+Cis8aDI+Q29uZmlndXJhdGlvbiBmaWxlIGxvb2t1cCBpbXByb3ZlbWVudHM8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI2NvbmZpZ3VyYXRpb24tZmlsZS1sb29rdXAtaW1wcm92ZW1lbnRzIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD5SaWdodCBub3csIHRoZSBhZGFwdGVycyBhbmQgdGhlIENMSSBsb29rIGZvciB0aGUgPGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iY29uZmlnZmlsZS5odG1sIj48ZW0+Y29uZmlndXJhdGlvbiBmaWxlPC9lbT48L2E+IGluIGEgZml4ZWQgc2V0IG9mIGxvY2F0aW9ucy4gT24gb2YgdGhvc2UgZGVyaXZlcyBmcm9tCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPk9QVF9JTlZFTlRPUllfQkFTRV9VUkk8L3NwYW4+PC90dD4sIHRoZSBkZWZhdWx0IGludmVudG9yeSBiYXNlIFVSSSAoPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vZXRjL3JlY2xhc3M8L3NwYW4+PC90dD4pLgorVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgdXBkYXRlZCBpbiBjYXNlIHRoZSB1c2VyIGNoYW5nZXMgdGhlIFVSSS48L3A+Cis8cD5GdXJ0aGVybW9yZSwgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4kQ1dEPC9zcGFuPjwvdHQ+IGFuZCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPn48L3NwYW4+PC90dD4gbWlnaHQgbm90IG1ha2UgYSBsb3Qgb2Ygc2Vuc2UgaW4gYWxsCit1c2UtY2FzZXMuPC9wPgorPHA+SG93ZXZlciwgdGhpcyBtaWdodCBiZSBiZXR0ZXIgYWRkcmVzc2VkIGJ5IHRoZSBmb2xsb3dpbmcgcG9pbnQ6PC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0iYWRhcHRlci1jbGFzcy1oaWVyYXJjaHkiPgorPGgyPkFkYXB0ZXIgY2xhc3MgaGllcmFyY2h5PGEgY2xhc3M9ImhlYWRlcmxpbmsiIGhyZWY9IiNhZGFwdGVyLWNsYXNzLWhpZXJhcmNoeSIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gyPgorPHA+QXQgdGhlIG1vbWVudCwgYWRhcHRlcnMgYXJlIGp1c3QgaW1wZXJhdGl2ZSBjb2RlLiBJdCBtaWdodCBtYWtlIG1vcmUgc2Vuc2UgdG8KK3dyYXAgdGhlbSBpbiBjbGFzc2VzLCB3aGljaCBjdXN0b21pc2UgdGhpbmdzIGxpa2UgY29tbWFuZC1saW5lIGFuZCBjb25maWcgZmlsZQorcGFyc2luZy48L3A+Cis8cD5PbmUgbmljZSB3YXkgd291bGQgYmUgdG8gZ2VuZXJhbGlzZSBjb25maWd1cmF0aW9uIGZpbGUgcmVhZGluZywgaW50ZWdyYXRlIGl0Cit3aXRoIGNvbW1hbmQtbGluZSBwYXJzaW5nLCBhbmQgdGhlbiBhbGxvdyB0aGUgY29uc3VtZXJzICh0aGUgYWRhcHRlcnMpIHRvCitjb25maWd1cmUgdGhlbSwgZm9yIGluc3RhbmNlLCBpbiB0aGUgU2FsdCBhZGFwdGVyOjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT48c3BhbiBjbGFzcz0ibiI+Y29uZmlnX3Byb3h5PC9zcGFuPiA8c3BhbiBjbGFzcz0ibyI+PTwvc3Bhbj4gPHNwYW4gY2xhc3M9Im4iPkNvbmZpZ1Byb3h5PC9zcGFuPjxzcGFuIGNsYXNzPSJwIj4oKTwvc3Bhbj4KKzxzcGFuIGNsYXNzPSJuIj5jb25maWdfcHJveHk8L3NwYW4+PHNwYW4gY2xhc3M9Im8iPi48L3NwYW4+PHNwYW4gY2xhc3M9Im4iPnNldF9jb25maWdmaWxlX3NlYXJjaF9wYXRoPC9zcGFuPjxzcGFuIGNsYXNzPSJwIj4oWzwvc3Bhbj48c3BhbiBjbGFzcz0icyI+JiMzOTsvZXRjL3JlY2xhc3MmIzM5Ozwvc3Bhbj48c3BhbiBjbGFzcz0icCI+LDwvc3Bhbj4gPHNwYW4gY2xhc3M9InMiPiYjMzk7L2V0Yy9zYWx0JiMzOTs8L3NwYW4+PHNwYW4gY2xhc3M9InAiPl0pPC9zcGFuPgorPHNwYW4gY2xhc3M9Im4iPmNvbmZpZ19wcm94eTwvc3Bhbj48c3BhbiBjbGFzcz0ibyI+Ljwvc3Bhbj48c3BhbiBjbGFzcz0ibiI+bG9ja19jb25maWdfb3B0aW9uPC9zcGFuPjxzcGFuIGNsYXNzPSJwIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJzIj4mIzM5O291dHB1dCYjMzk7PC9zcGFuPjxzcGFuIGNsYXNzPSJwIj4sPC9zcGFuPiA8c3BhbiBjbGFzcz0icyI+JiMzOTt5YW1sJiMzOTs8L3NwYW4+PHNwYW4gY2xhc3M9InAiPik8L3NwYW4+Cis8L3ByZT48L2Rpdj4KKzwvZGl2PgorPHA+VGhlIGxhc3QgY2FsbCB3b3VsZCBlZmZlY3RpdmVseSByZW1vdmUgdGhlIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+LS1vdXRwdXQ8L3NwYW4+PC90dD4gY29uZmlnIG9wdGlvbiBmcm9tIHRoZQorQ0xJLCBhbmQgeWllbGQgYW4gZXJyb3IgKG9yIHdhcm5pbmcpIGlmIHRoZSBvcHRpb24gd2FzIGVuY291bnRlcmVkIHdoaWxlCitwYXJzaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuPC9wPgorPHA+RnVydGhlcm1vcmUsIHRoZSBjbGFzcyBpbnN0YW5jZXMgY291bGQgYmVjb21lIGxvbmctbGl2ZWQgYW5kIGtlZXAgYSByZWZlcmVuY2UKK3RvIGEgc3RvcmFnZSBwcm94eSwgZS5nLiB0byBwcmV2ZW50IGhhdmluZyB0byByZWxvYWQgc3RvcmFnZSBvbiBldmVyeSByZXF1ZXN0LjwvcD4KKzwvZGl2PgorPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9Im5vZGUtbGlzdHMiPgorPGgyPk5vZGUgbGlzdHM8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI25vZGUtbGlzdHMiIHRpdGxlPSJQZXJtYWxpbmsgdG8gdGhpcyBoZWFkbGluZSI+wrY8L2E+PC9oMj4KKzxwPkNsYXNzIG1hcHBpbmdzIGFyZSBzdGlsbCBleHBlcmltZW50YWwsIGFuZCBvbmUgb2YgdGhlIHJlYXNvbnMgSSBhbSBub3QgdG9vCitoYXBweSB3aXRoIHRoZW0gcmlnaHQgbm93IGlzIHRoYXQgb25lIHdvdWxkIHN0aWxsIG5lZWQgdG8gcHJvdmlkZSBub2RlIGZpbGVzCitmb3IgYWxsIG5vZGVzIGZvciA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmludmVudG9yeTwvc3Bhbj48L3R0PiBpbnZvY2F0aW9ucy4gVGhpcyBpcyBiZWNhdXNlIGNsYXNzIG1hcHBpbmdzCitjYW4gYXNzaWduIGNsYXNzZXMgYmFzZWQgb24gcGF0dGVybnMgb3IgcmVndWxhciBleHByZXNzaW9ucywgYnV0IGl0IGlzIG5vdAorcG9zc2libGUgdG8gdHVybiBhIHBhdHRlcm4gb3IgcmVndWxhciBleHByZXNzaW9uIGludG8gYSBsaXN0IG9mIHZhbGlkIG5vZGVzLjwvcD4KKzxwPjxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYWRkdWNrL3JlY2xhc3MvaXNzdWVzLzkiPklzc3VlICM5PC9hPiBjb250YWlucyBhIGxlbmd0aHkKK2Rpc2N1c3Npb24gb24gdGhpcy4gQXQgdGhlIG1vbWVudCwgSSBhbSB1bnN1cmUgd2hhdCB0aGUgYmVzdCB3YXkgZm9yd2FyZCBpcy48L3A+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJpbnZlbnRvcnktZmlsdGVycyI+Cis8aDI+SW52ZW50b3J5IGZpbHRlcnM8YSBjbGFzcz0iaGVhZGVybGluayIgaHJlZj0iI2ludmVudG9yeS1maWx0ZXJzIiB0aXRsZT0iUGVybWFsaW5rIHRvIHRoaXMgaGVhZGxpbmUiPsK2PC9hPjwvaDI+Cis8cD5BcyBkZXNjcmliZWQgaW4gPGEgY2xhc3M9InJlZmVyZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hZGR1Y2svcmVjbGFzcy9pc3N1ZXMvMTEiPmlzc3VlICMxMTwvYT46Citwcm92aWRlIGEgbWVhbnMgdG8gbGltaXQgdGhlIGVudW1lcmF0aW9uIG9mIHRoZSBpbnZlbnRvcnksIGFjY29yZGluZyB0byBub2RlCituYW1lIHBhdHRlcm5zLCBvciB1c2luZyBjbGFzc2VzIHdoaXRlLS9ibGFja2xpc3RzLjwvcD4KKzwvZGl2PgorPC9kaXY+CisKKworICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ic3BoaW54c2lkZWJhciI+CisgICAgICAgIDxkaXYgY2xhc3M9InNwaGlueHNpZGViYXJ3cmFwcGVyIj4KKyAgPGgzPjxhIGhyZWY9ImluZGV4Lmh0bWwiPlRhYmxlIE9mIENvbnRlbnRzPC9hPjwvaDM+CisgIDx1bD4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjIj5yZWNsYXNzIHRvLWRvIGxpc3Q8L2E+PHVsPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNjb21tb24tc2V0LW9mLWNsYXNzZXMiPkNvbW1vbiBzZXQgb2YgY2xhc3NlczwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiN0ZXN0aW5nLWZyYW1ld29yayI+VGVzdGluZyBmcmFtZXdvcms8L2E+PC9saT4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjY29uZmlndXJhYmxlLWZpbGUtZXh0ZW5zaW9uIj5Db25maWd1cmFibGUgZmlsZSBleHRlbnNpb248L2E+PC9saT4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjdmVyYm9zaXR5LWRlYnVnZ2luZyI+VmVyYm9zaXR5LCBkZWJ1Z2dpbmc8L2E+PC9saT4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjZGF0YS1mcm9tLWNtcy1mb3ItaW50ZXJwb2xhdGlvbiI+RGF0YSBmcm9tIENNUyBmb3IgaW50ZXJwb2xhdGlvbjwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNtZW1iZXJzaGlwLWluZm9ybWF0aW9uIj5NZW1iZXJzaGlwIGluZm9ybWF0aW9uPC9hPjwvbGk+Cis8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0iI2NvbmZpZ3VyYXRpb24tZmlsZS1sb29rdXAtaW1wcm92ZW1lbnRzIj5Db25maWd1cmF0aW9uIGZpbGUgbG9va3VwIGltcHJvdmVtZW50czwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNhZGFwdGVyLWNsYXNzLWhpZXJhcmNoeSI+QWRhcHRlciBjbGFzcyBoaWVyYXJjaHk8L2E+PC9saT4KKzxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjbm9kZS1saXN0cyI+Tm9kZSBsaXN0czwvYT48L2xpPgorPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNpbnZlbnRvcnktZmlsdGVycyI+SW52ZW50b3J5IGZpbHRlcnM8L2E+PC9saT4KKzwvdWw+Cis8L2xpPgorPC91bD4KKworICA8aDQ+UHJldmlvdXMgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0iaGFja2luZy5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9InByZXZpb3VzIGNoYXB0ZXIiPkhhY2tpbmcgb24gcmVjbGFzczwvYT48L3A+CisgIDxoND5OZXh0IHRvcGljPC9oND4KKyAgPHAgY2xhc3M9InRvcGxlc3MiPjxhIGhyZWY9ImNoYW5nZWxvZy5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Im5leHQgY2hhcHRlciI+Q2hhbmdlTG9nPC9hPjwvcD4KKzxkaXYgaWQ9InNlYXJjaGJveCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgorICA8aDM+UXVpY2sgc2VhcmNoPC9oMz4KKyAgICA8Zm9ybSBjbGFzcz0ic2VhcmNoIiBhY3Rpb249InNlYXJjaC5odG1sIiBtZXRob2Q9ImdldCI+CisgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJHbyIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNoZWNrX2tleXdvcmRzIiB2YWx1ZT0ieWVzIiAvPgorICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYXJlYSIgdmFsdWU9ImRlZmF1bHQiIC8+CisgICAgPC9mb3JtPgorICAgIDxwIGNsYXNzPSJzZWFyY2h0aXAiIHN0eWxlPSJmb250LXNpemU6IDkwJSI+CisgICAgRW50ZXIgc2VhcmNoIHRlcm1zIG9yIGEgbW9kdWxlLCBjbGFzcyBvciBmdW5jdGlvbiBuYW1lLgorICAgIDwvcD4KKzwvZGl2PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiQoJyNzZWFyY2hib3gnKS5zaG93KDApOzwvc2NyaXB0PgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0iY2xlYXJlciI+PC9kaXY+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0icmVsYXRlZCI+CisgICAgICA8aDM+TmF2aWdhdGlvbjwvaDM+CisgICAgICA8dWw+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHgiPgorICAgICAgICAgIDxhIGhyZWY9ImdlbmluZGV4Lmh0bWwiIHRpdGxlPSJHZW5lcmFsIEluZGV4IgorICAgICAgICAgICAgID5pbmRleDwvYT48L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0iY2hhbmdlbG9nLmh0bWwiIHRpdGxlPSJDaGFuZ2VMb2ciCisgICAgICAgICAgICAgPm5leHQ8L2E+IHw8L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0iaGFja2luZy5odG1sIiB0aXRsZT0iSGFja2luZyBvbiByZWNsYXNzIgorICAgICAgICAgICAgID5wcmV2aW91czwvYT4gfDwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImZvb3RlciI+CisgICAgICAgICZjb3B5OyBDb3B5cmlnaHQgMjAxMywgbWFydGluIGYuIGtyYWZmdC4KKyAgICAgIENyZWF0ZWQgdXNpbmcgPGEgaHJlZj0iaHR0cDovL3NwaGlueC1kb2Mub3JnLyI+U3BoaW54PC9hPiAxLjIuMy4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VzYWdlLmh0bWwgYi91c2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmY2UyZjUKLS0tIC9kZXYvbnVsbAorKysgYi91c2FnZS5odG1sCkBAIC0wLDAgKzEsMTM0IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgorICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CisKKworPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICAKKyAgICA8dGl0bGU+VXNpbmcgcmVjbGFzcyAmbWRhc2g7IHJlY2xhc3MgMS40LjEgZG9jdW1lbnRhdGlvbjwvdGl0bGU+CisgICAgCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfc3RhdGljL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9zdGF0aWMvcHlnbWVudHMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICAKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICB2YXIgRE9DVU1FTlRBVElPTl9PUFRJT05TID0geworICAgICAgICBVUkxfUk9PVDogICAgJy4vJywKKyAgICAgICAgVkVSU0lPTjogICAgICcxLjQuMScsCisgICAgICAgIENPTExBUFNFX0lOREVYOiBmYWxzZSwKKyAgICAgICAgRklMRV9TVUZGSVg6ICcuaHRtbCcsCisgICAgICAgIEhBU19TT1VSQ0U6ICB0cnVlCisgICAgICB9OworICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvanF1ZXJ5LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJfc3RhdGljL3VuZGVyc2NvcmUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Il9zdGF0aWMvZG9jdG9vbHMuanMiPjwvc2NyaXB0PgorICAgIDxsaW5rIHJlbD0idG9wIiB0aXRsZT0icmVjbGFzcyAxLjQuMSBkb2N1bWVudGF0aW9uIiBocmVmPSJpbmRleC5odG1sIiAvPgorICAgIDxsaW5rIHJlbD0ibmV4dCIgdGl0bGU9IkV4dGVybmFsIHJlZmVyZW5jZXMiIGhyZWY9InJlZnMuaHRtbCIgLz4KKyAgICA8bGluayByZWw9InByZXYiIHRpdGxlPSJyZWNsYXNzIG9wZXJhdGlvbnMiIGhyZWY9Im9wZXJhdGlvbnMuaHRtbCIgLz4gCisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGRpdiBjbGFzcz0icmVsYXRlZCI+CisgICAgICA8aDM+TmF2aWdhdGlvbjwvaDM+CisgICAgICA8dWw+CisgICAgICAgIDxsaSBjbGFzcz0icmlnaHQiIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDEwcHgiPgorICAgICAgICAgIDxhIGhyZWY9ImdlbmluZGV4Lmh0bWwiIHRpdGxlPSJHZW5lcmFsIEluZGV4IgorICAgICAgICAgICAgIGFjY2Vzc2tleT0iSSI+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InJlZnMuaHRtbCIgdGl0bGU9IkV4dGVybmFsIHJlZmVyZW5jZXMiCisgICAgICAgICAgICAgYWNjZXNza2V5PSJOIj5uZXh0PC9hPiB8PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9Im9wZXJhdGlvbnMuaHRtbCIgdGl0bGU9InJlY2xhc3Mgb3BlcmF0aW9ucyIKKyAgICAgICAgICAgICBhY2Nlc3NrZXk9IlAiPnByZXZpb3VzPC9hPiB8PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9ImluZGV4Lmh0bWwiPnJlY2xhc3M8L2E+ICZyYXF1bzs8L2xpPiAKKyAgICAgIDwvdWw+CisgICAgPC9kaXY+ICAKKworICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50Ij4KKyAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50d3JhcHBlciI+CisgICAgICAgIDxkaXYgY2xhc3M9ImJvZHl3cmFwcGVyIj4KKyAgICAgICAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KKyAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0idXNpbmctcmVjbGFzcyI+Cis8aDE+VXNpbmcgcmVjbGFzczxhIGNsYXNzPSJoZWFkZXJsaW5rIiBocmVmPSIjdXNpbmctcmVjbGFzcyIgdGl0bGU9IlBlcm1hbGluayB0byB0aGlzIGhlYWRsaW5lIj7CtjwvYT48L2gxPgorPHA+Rm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgPHN0cm9uZz5yZWNsYXNzPC9zdHJvbmc+IGRpcmVjdGx5LCBjYWxsIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+cmVjbGFzczwvc3Bhbj4gPHNwYW4gY2xhc3M9InByZSI+LS1oZWxwPC9zcGFuPjwvdHQ+CithbmQgc3R1ZHkgdGhlIG91dHB1dCwgb3IgaGF2ZSBhIGxvb2sgYXQgaXRzIDxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9Im1hbnBhZ2UuaHRtbCI+PGVtPm1hbnVhbCBwYWdlPC9lbT48L2E+LjwvcD4KKzxwPlRoZSB0aHJlZSBvcHRpb25zLCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi0taW52ZW50b3J5LWJhc2UtdXJpPC9zcGFuPjwvdHQ+LCA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi0tbm9kZXMtdXJpPC9zcGFuPjwvdHQ+LCBhbmQKKzx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+LS1jbGFzc2VzLXVyaTwvc3Bhbj48L3R0PiB0b2dldGhlciBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgaW52ZW50b3J5LiBJZiB0aGUgYmFzZQorVVJJIGlzIHNwZWNpZmllZCwgdGhlbiBpdCBpcyBwcmVwZW5kZWQgdG8gdGhlIG90aGVyIHR3byBVUklzLCB1bmxlc3MgdGhleSBhcmUKK2Fic29sdXRlIFVSSXMuIElmIHRoZXNlIHR3byBVUklzIGFyZSBub3Qgc3BlY2lmaWVkLCB0aGV5IGRlZmF1bHQgdG8gPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5ub2Rlczwvc3Bhbj48L3R0PgorYW5kIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+Y2xhc3Nlczwvc3Bhbj48L3R0Pi4gVGhlcmVmb3JlLCBpZiB5b3VyIGludmVudG9yeSBpcyBpbiA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPi9ldGMvcmVjbGFzcy9ub2Rlczwvc3Bhbj48L3R0PiBhbmQKKzx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+L2V0Yy9yZWNsYXNzL2NsYXNzZXM8L3NwYW4+PC90dD4sIGFsbCB5b3UgbmVlZCB0byBzcGVjaWZ5IGlzIHRoZSBiYXNlIFVSSSBhcworPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj4vZXRjL3JlY2xhc3M8L3NwYW4+PC90dD4g4oCUIHdoaWNoIGlzIGFjdHVhbGx5IHRoZSBkZWZhdWx0IChzcGVjaWZpZWQgaW4KKzx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+cmVjbGFzcy9kZWZhdWx0cy5weTwvc3Bhbj48L3R0PikuPC9wPgorPHA+SWYgeW91JiM4MjE3O3ZlIGluc3RhbGxlZCA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gZnJvbSBzb3VyY2UgYXMgcGVyIHRoZSA8YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJpbnN0YWxsLmh0bWwiPjxlbT5pbnN0YWxsYXRpb24KK2luc3RydWN0aW9uczwvZW0+PC9hPiwgdHJ5IHRvIHJ1biBpdCBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGxpa2UgdGhpczo8L3A+Cis8ZGl2IGNsYXNzPSJoaWdobGlnaHQtcHl0aG9uIj48ZGl2IGNsYXNzPSJoaWdobGlnaHQiPjxwcmU+JCByZWNsYXNzIC1iIGV4YW1wbGVzLyAtLWludmVudG9yeQorJCByZWNsYXNzIC1iIGV4YW1wbGVzLyAtLW5vZGVpbmZvIGxvY2FsaG9zdAorPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzxwPlRoaXMgd2lsbCBtYWtlIGl0IHVzZSB0aGUgZGF0YSBmcm9tIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+ZXhhbXBsZXMvbm9kZXM8L3NwYW4+PC90dD4gYW5kCis8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPjxzcGFuIGNsYXNzPSJwcmUiPmV4YW1wbGVzL2NsYXNzZXM8L3NwYW4+PC90dD4sIGFuZCB5b3UgY2FuIHN1cmVseSBtYWtlIHlvdXIgb3duIHdheSBmcm9tIGhlcmUuPC9wPgorPHA+T24gRGViaWFuLXN5c3RlbXMsIHVzZSB0aGUgZm9sbG93aW5nOjwvcD4KKzxkaXYgY2xhc3M9ImhpZ2hsaWdodC1weXRob24iPjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT4kIHJlY2xhc3MgLWIgL3Vzci9zaGFyZS9kb2MvcmVjbGFzcy9leGFtcGxlcy8gLS1pbnZlbnRvcnkKKyQgcmVjbGFzcyAtYiAvdXNyL3NoYXJlL2RvYy9yZWNsYXNzL2V4YW1wbGVzLyAtLW5vZGVpbmZvIGxvY2FsaG9zdAorPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzxwPk1vcmUgY29tbW9ubHksIGhvd2V2ZXIsIHVzZSBvZiA8c3Ryb25nPnJlY2xhc3M8L3N0cm9uZz4gd2lsbCBoYXBwZW4gaW5kaXJlY3RseSwgYW5kIHRocm91Z2gKK3NvLWNhbGxlZCBhZGFwdGVycy4gVGhlIGpvYiBvZiBhbiBhZGFwdGVyIGlzIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIGRpZmZlcmVudAoraW52b2NhdGlvbiBwYXJhZGlnbXMsIHByb3ZpZGUgYSBzYW5lIHNldCBvZiBkZWZhdWx0IG9wdGlvbnMsIGFuZCBtYXNzYWdlIHRoZQorZGF0YSBmcm9tIDxzdHJvbmc+cmVjbGFzczwvc3Ryb25nPiBpbnRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgdGhlIGF1dG9tYXRpb24gdG9vbCBpbiB1c2UuCitQbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIHJlc3BlY3RpdmUgUkVBRE1FIGZpbGVzIGZvciB0aGVzZSBhZGFwdGVycywgaS5lLgorZm9yIDxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9InNhbHQuaHRtbCI+PGVtPlNhbHQ8L2VtPjwvYT4sIGZvciA8YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJhbnNpYmxlLmh0bWwiPjxlbT5BbnNpYmxlPC9lbT48L2E+LCBhbmQgZm9yIDxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9InB1cHBldC5odG1sIj48ZW0+UHVwcGV0PC9lbT48L2E+LjwvcD4KKzwvZGl2PgorCisKKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9InNwaGlueHNpZGViYXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJzcGhpbnhzaWRlYmFyd3JhcHBlciI+CisgIDxoND5QcmV2aW91cyB0b3BpYzwvaDQ+CisgIDxwIGNsYXNzPSJ0b3BsZXNzIj48YSBocmVmPSJvcGVyYXRpb25zLmh0bWwiCisgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0icHJldmlvdXMgY2hhcHRlciI+cmVjbGFzcyBvcGVyYXRpb25zPC9hPjwvcD4KKyAgPGg0Pk5leHQgdG9waWM8L2g0PgorICA8cCBjbGFzcz0idG9wbGVzcyI+PGEgaHJlZj0icmVmcy5odG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Im5leHQgY2hhcHRlciI+RXh0ZXJuYWwgcmVmZXJlbmNlczwvYT48L3A+Cis8ZGl2IGlkPSJzZWFyY2hib3giIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KKyAgPGgzPlF1aWNrIHNlYXJjaDwvaDM+CisgICAgPGZvcm0gY2xhc3M9InNlYXJjaCIgYWN0aW9uPSJzZWFyY2guaHRtbCIgbWV0aG9kPSJnZXQiPgorICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InEiIC8+CisgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28iIC8+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaGVja19rZXl3b3JkcyIgdmFsdWU9InllcyIgLz4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFyZWEiIHZhbHVlPSJkZWZhdWx0IiAvPgorICAgIDwvZm9ybT4KKyAgICA8cCBjbGFzcz0ic2VhcmNodGlwIiBzdHlsZT0iZm9udC1zaXplOiA5MCUiPgorICAgIEVudGVyIHNlYXJjaCB0ZXJtcyBvciBhIG1vZHVsZSwgY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZS4KKyAgICA8L3A+Cis8L2Rpdj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4kKCcjc2VhcmNoYm94Jykuc2hvdygwKTs8L3NjcmlwdD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZXIiPjwvZGl2PgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9InJlbGF0ZWQiPgorICAgICAgPGgzPk5hdmlnYXRpb248L2gzPgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiAxMHB4Ij4KKyAgICAgICAgICA8YSBocmVmPSJnZW5pbmRleC5odG1sIiB0aXRsZT0iR2VuZXJhbCBJbmRleCIKKyAgICAgICAgICAgICA+aW5kZXg8L2E+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJyaWdodCIgPgorICAgICAgICAgIDxhIGhyZWY9InJlZnMuaHRtbCIgdGl0bGU9IkV4dGVybmFsIHJlZmVyZW5jZXMiCisgICAgICAgICAgICAgPm5leHQ8L2E+IHw8L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJpZ2h0IiA+CisgICAgICAgICAgPGEgaHJlZj0ib3BlcmF0aW9ucy5odG1sIiB0aXRsZT0icmVjbGFzcyBvcGVyYXRpb25zIgorICAgICAgICAgICAgID5wcmV2aW91czwvYT4gfDwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5yZWNsYXNzPC9hPiAmcmFxdW87PC9saT4gCisgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImZvb3RlciI+CisgICAgICAgICZjb3B5OyBDb3B5cmlnaHQgMjAxMywgbWFydGluIGYuIGtyYWZmdC4KKyAgICAgIENyZWF0ZWQgdXNpbmcgPGEgaHJlZj0iaHR0cDovL3NwaGlueC1kb2Mub3JnLyI+U3BoaW54PC9hPiAxLjIuMy4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK