PT0gV2hhdCBJcyB0aGUgRmxleCBBSkFYIEJyaWRnZT8gPT0KClRoZSBGbGV4IEFKQVggQnJpZGdlIChGQUJyaWRnZSkgaXMgYSBzbWFsbCwgdW5vYnRydXNpdmUgY29kZSBsaWJyYXJ5IHRoYXQgeW91IGNhbiBpbnNlcnQgCmludG8gYW4gQXBhY2hlriBGbGV4IGFwcGxpY2F0aW9uLCBhIEZsZXggY29tcG9uZW50LCBvciBldmVuIGFuIGVtcHR5IFNXRiBmaWxlIHRvIGV4cG9zZSAKaXQgdG8gc2NyaXB0aW5nIGluIHRoZSBicm93c2VyLiBJdCBpcyBiZWluZyByZWxlYXNlZCB0byB0aGUgY29tbXVuaXR5IHVuZGVyIHRoZSBBcGFjaGUKU29mdHdhcmUgRm91bmRhdGlvbiwgdjIgbGljZW5zZS4gIFNlZSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuCgpUbyBodW1ibHkgYm9ycm93IGEgcGFnZSBmcm9tIHRoZSBSdWJ5IG9uIFJhaWxzIGNvbW11bml0eSwgRkFCcmlkZ2UgaXMgYnVpbHQgd2l0aCB0aGUgCiJkb24ndCByZXBlYXQgeW91cnNlbGYiIHByaW5jaXBsZSBpbiBtaW5kLiBSYXRoZXIgdGhhbiBoYXZpbmcgdG8gZGVmaW5lIG5ldywgc2ltcGxpZmllZCAKQVBJcyB0byBleHBvc2UgYSBncmFwaCBvZiBBY3Rpb25TY3JpcHQgb2JqZWN0cyB0byBKYXZhU2NyaXB0LCB3aXRoIEZBQnJpZGdlIHlvdSBjYW4gbWFrZSAKeW91ciBBY3Rpb25TY3JpcHQgY2xhc3NlcyBhdmFpbGFibGUgdG8gSmF2YVNjcmlwdCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIGNvZGluZy4gQWZ0ZXIgeW91Cmluc2VydCB0aGUgbGlicmFyeSwgZXNzZW50aWFsbHkgYW55dGhpbmcgeW91IGNhbiBkbyB3aXRoIEFjdGlvblNjcmlwdCwgeW91IGNhbiBkbyB3aXRoIApKYXZhU2NyaXB0LgoKQWRvYmWuIEZsYXNoriBQbGF5ZXIgaGFzIHRoZSBuYXRpdmUgYWJpbGl0eSwgdGhyb3VnaCB0aGUgRXh0ZXJuYWwgQVBJICh0aGUgCkV4dGVybmFsSW50ZXJmYWNlIGNsYXNzKSwgdG8gY2FsbCBKYXZhU2NyaXB0IGZyb20gQWN0aW9uU2NyaXB0LCBhbmQgdmljZSB2ZXJzYS4gQnV0IApFeHRlcm5hbEludGVyZmFjZSBoYXMgc29tZSBsaW1pdGF0aW9uczoKKiBUaGUgRXh0ZXJuYWxJbnRlcmZhY2UgY2xhc3MgcmVxdWlyZXMgeW91LCB0aGUgZGV2ZWxvcGVyLCB0byB3cml0ZSBhIGxpYnJhcnkgb2YgZXh0cmEgCmNvZGUgaW4gYm90aCBBY3Rpb25TY3JpcHQgYW5kIEphdmFTY3JpcHQsIHRvIGV4cG9zZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB5b3VyIEZsZXggCmFwcGxpY2F0aW9uIHRvIEphdmFTY3JpcHQsIGFuZCB2aWNlIHZlcnNhLiAgCiogVGhlIEV4dGVybmFsSW50ZXJmYWNlIGNsYXNzIGFsc28gbGltaXRzIHdoYXQgeW91IGNhbiBwYXNzIGFjcm9zcyB0aGUgZ2FwLiBQcmltaXRpdmUgCnR5cGVzLCBhcnJheXMsIGFuZCBzaW1wbGUgb2JqZWN0cyBhcmUgbGVnYWwsIGJ1dCB1c2VyLWRlZmluZWQgY2xhc3Nlcywgd2l0aCBhc3NvY2lhdGVkIApwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLCBhcmUgb2ZmLWxpbWl0cy4gCiogVGhlIEV4dGVybmFsSW50ZXJmYWNlIGNsYXNzIGVuYWJsZXMgeW91IHRvIGRlZmluZSBhbiBpbnRlcmZhY2Ugc28geW91ciBKYXZhU2NyaXB0IGNhbiAKY2FsbCB5b3VyIEFjdGlvblNjcmlwdC4gRkFCcmlkZ2UgZXNzZW50aWFsbHkgbGV0cyB5b3Ugd3JpdGUgSmF2YVNjcmlwdCBpbnN0ZWFkIG9mIApBY3Rpb25TY3JpcHQuCgo9PSBXaGVuIFNob3VsZCBJIFVzZSB0aGUgRmxleCBBSkFYIEJyaWRnZT8gPT0KClRoZSBGQUJyaWRnZSBsaWJyYXJ5IGlzIHVzZWZ1bCBpbiB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbnM6CiogWW91IHdhbnQgdG8gdXNlIGEgcmljaCBGbGV4IGNvbXBvbmVudCBpbiBhbiBBSkFYIGFwcGxpY2F0aW9uIGJ1dCBkbyBub3Qgd2FudCB0byB3cml0ZSBhIApsb3Qgb2YgRmxleCBjb2RlLiBJZiB5b3Ugd3JhcCB0aGUgY29tcG9uZW50IGluIGEgRkFCcmlkZ2UtZW5hYmxlZCBzdHViIGFwcGxpY2F0aW9uLCB5b3UgCmNhbiBzY3JpcHQgaXQgZW50aXJlbHkgZnJvbSBKYXZhU2NyaXB0LCBpbmNsdWRpbmcgdXNpbmcgZXZhbCgpkmQgSmF2YVNjcmlwdCBnZW5lcmF0ZWQgCnJlbW90ZWx5IGJ5IHRoZSBzZXJ2ZXIuCiogWW91IGhhdmUgb25seSBvbmUgb3IgdHdvIHBlb3BsZSBvbiB5b3VyIHRlYW0gd2hvIGtub3cgRmxleC4gIEFsdGhvdWdoIEkgd291bGQgc3Ryb25nbHkgCmVuY291cmFnZSBldmVyeW9uZSB0byBncmFiIGEgY29weSBvZiBGbGV4IGFuZCB0cnkgaXQgb3V0ICh5b3Ugd2lsbCBsb3ZlIGl0LCBJIHByb21pc2UhKSwgCnRoZSBGQUJyaWRnZSBsaWJyYXJ5IGxldHMgZXZlcnlvbmUgb24geW91ciB0ZWFtIHVzZSB0aGUgd29yayBwcm9kdWNlZCBieSBvbmUgb3IgdHdvIEZsZXggCnNwZWNpYWxpc3RzLgoqIFlvdSBhcmUgYnVpbGRpbmcgYW4gaW50ZWdyYXRlZCByaWNoIEludGVybmV0IGFwcGxpY2F0aW9uIChSSUEpIHdpdGggYm90aCBGbGV4IGFuZCBBSkFYIApwb3J0aW9ucy4gIFdoaWxlIHlvdSBjb3VsZCBidWlsZCB0aGUgaW50ZWdyYXRpb24geW91cnNlbGYgdXNpbmcgRXh0ZXJuYWxJbnRlcmZhY2UsIHlvdSAKbWlnaHQgZmluZCBpdCBmYXN0ZXIgdG8gc3RhcnQgd2l0aCB0aGUgRkFCcmlkZ2UgYXMgYSBoZWFkIHN0YXJ0LgoKPT0gV2hhdCBEbyBJIE5lZWQgdG8gVXNlIEl0PyA9PQoKVG8gdXNlIHRoZSBGQUJyaWRnZSBsaWJyYXJ5IGFuZCBzYW1wbGVzLCB5b3UgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmc6CiogQUpBWCBCcmlkZ2UsIHdoaWNoIGlzIGluY2x1ZGVkIGluIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IG9mIHRoZSBMaXZlQ3ljbGUgRGF0YSAKU2VydmljZXMgaW5zdGFsbGF0aW9uOgoKaW5zdGFsbGF0aW9uX2RpclxyZXNvdXJjZXNcRkFCcmlkZ2UKCiogRmxleCAyIFNESyBpbmNsdWRlZCBpbiB0aGUgTGl2ZUN5Y2xlIERhdGEgU2VydmljZXMgaW5zdGFsbGF0aW9uCiogRmxhc2ggUGxheWVyIDkKKiBNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIsIE1vemlsbGEgRmlyZWZveCwgb3IgT3BlcmEgd2l0aCBKYXZhU2NyaXB0IGVuYWJsZWQKKiBBbnkgSFRUUCBzZXJ2ZXIgdG8gcnVuIHRoZSBzYW1wbGVzCgo9PSBEb3dubG9hZCBhbmQgSW5zdGFsbGF0aW9uID09CgpUbyBydW4gdGhlIHNhbXBsZSBmaWxlcywgZm9sbG93IHRoZXNlIHN0ZXBzOgoKMS4gQ29weSB0aGUgc3JjIGFuZCBzYW1wbGVzIGRpcmVjdG9yaWVzIGZyb20gdGhlIGluc3RhbGxfZGlyXHJlc291cmNlc1xGQUJyaWRnZSBkaXJlY3RvcnkgCm9mIHRoZSBMaXZlQ3ljbGUgRGF0YSBTZXJ2aWNlcyBpbnN0YWxsYXRpb24gc2lkZSBieSBzaWRlIG9uIGFueSBIVFRQIHNlcnZlci4KMi4gT3BlbiBhIHdlYiBicm93c2VyIHRvIDx5b3VyIHdlYiBzZXJ2ZXI+L3NhbXBsZXMvRkFCcmlkZ2VTYW1wbGUuaHRtbCBhbmQgCnNhbXBsZXMvU2ltcGxlU2FtcGxlLmh0bWwgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIHRoZXJlLgoKTWFrZSBzdXJlIHlvdSBhY2Nlc3MgdGhlIHNhbXBsZXMgdGhyb3VnaCBodHRwOi8vIFVSTHMgYW5kIG5vdCBmaWxlOi8vIFVSTHMuIFRoZSBGbGFzaCAKUGxheWVyIHNlY3VyaXR5IHNhbmRib3ggbWF5IHByZXZlbnQgdGhlbSBmcm9tIHdvcmtpbmcgY29ycmVjdGx5IGlmIGFjY2Vzc2VkIGFzIGxvY2FsIGZpbGVzLgoKPT0gSG93IERvIEkgVXNlIHRoZSBGbGV4IEFKQVggQnJpZGdlPyA9PQoKVG8gdXNlIHRoZSBGQUJyaWRnZSBsaWJyYXJ5IGluIHlvdXIgb3duIEZsZXggYW5kIEFKQVggYXBwbGljYXRpb25zLCBmb2xsb3cgdGhlc2Ugc3RlcHM6CiogQWRkIHRoZSBzcmMgZm9sZGVyIHRvIHRoZSBBY3Rpb25TY3JpcHQgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiBvZiB5b3VyIEZsZXggYXBwbGljYXRpb24uCiogSWYgeW91IGFyZSBjb21waWxpbmcgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB5b3UgY2FuIGFkZCB0aGUgc3JjIGZvbGRlciB0byB5b3VyIAphcHBsaWNhdGlvbiBieSBzcGVjaWZ5aW5nIGl0IHVzaW5nIHRoZSAtLWFjdGlvbnNjcmlwdC1jbGFzc3BhdGggY29tcGlsZXIgb3B0aW9uLgoqIEFkZCB0aGUgZm9sbG93aW5nIHRhZyB0byB5b3VyIGFwcGxpY2F0aW9uIGZpbGU6CgogIDxteDpBcHBsaWNhdGlvbiAuLi4+CiAgICA8ZmFiOkZBQnJpZGdlIHhtbG5zOmZhYj0iYnJpZGdlLioiIC8+CiAgICAuLi4KClVzZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gYWNjZXNzIHlvdXIgYXBwbGljYXRpb24gaW5zdGFuY2UgZnJvbSBKYXZhU2NyaXB0OgoKICBmdW5jdGlvbiB1c2VCcmlkZ2UoKSAKICB7CiAgICAgIHZhciBmbGV4QXBwID0gRkFCcmlkZ2UuZmxhc2gucm9vdCgpOwogIH0KClRvIGdldCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSwgY2FsbCBpdCBsaWtlIGEgZnVuY3Rpb247IHVzZSB0aGUgc2FtZSBzeW50YXggdG8gYWNjZXNzIApvYmplY3RzIGJ5IGlkLCBhcyB0aGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3M6CgogIGZ1bmN0aW9uIGdldE1heFByaWNlKCkgCiAgewogICAgICB2YXIgZmxleEFwcCA9IEZBQnJpZGdlLmZsYXNoLnJvb3QoKTsKICAgICAgdmFyIGFwcFdpZHRoID0gZmxleEFwcC5nZXRXaWR0aCgpOwogICAgICB2YXIgbWF4UHJpY2UgPSBmbGV4QXBwLmdldE1heFByaWNlU2xpZGVyKCkuZ2V0VmFsdWUoKTsKICB9CgpUbyBzZXQgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgZnJvbSBKYXZhU2NyaXB0LCBjYWxsIHRoZSBmdW5jdGlvbiAKPGNvZGU+c2V0UHJvcGVydHlOYW1lKCk8L2NvZGU+LCBhcyB0aGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3M6CgogIGZ1bmN0aW9uIHNldE1heFByaWNlKG5ld01heFByaWNlKSAKICB7CiAgICAgIHZhciBmbGV4QXBwID0gRkFCcmlkZ2UuZmxhc2gucm9vdCgpOwogICAgICBmbGV4QXBwLmdldE1heFByaWNlU2xpZGVyKCkuc2V0VmFsdWUobmV3TWF4UHJpY2UpOwogIH0KCllvdSBjYW4gY2FsbCBvYmplY3QgbWV0aG9kcyBkaXJlY3RseSwganVzdCBhcyB5b3Ugd291bGQgZnJvbSBBY3Rpb25TY3JpcHQsIGFzIHRoZSAKZm9sbG93aW5nIGV4YW1wbGUgc2hvd3M6CgogIGZ1bmN0aW9uIHNldE1heFByaWNlKG5ld01heFByaWNlKSAKICB7CiAgICAgIHZhciBmbGV4QXBwID0gRkFCcmlkZ2UuZmxhc2gucm9vdCgpOwogICAgICBmbGV4QXBwLmdldFNob3BwaW5nQ2FydCgpLmFkZEl0ZW0oIkFudGlxdWUgRmlndXJpbmUiLCAxMi45OSk7CiAgfQoKWW91IGNhbiBhbHNvIHBhc3MgZnVuY3Rpb25zLCBzdWNoIGFzIGV2ZW50IGhhbmRsZXJzLCBmcm9tIEphdmFTY3JpcHQgdG8gQWN0aW9uU2NyaXB0LCBhcyAKdGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzOgoKICBmdW5jdGlvbiBsaXN0ZW5Ub01heFByaWNlKCkgCiAgewogICAgICB2YXIgZmxleEFwcCA9IEZBQnJpZGdlLmZsYXNoLnJvb3QoKTsKICAgICAgdmFyIG1heFByaWNlQ2FsbGJhY2sgPSBmdW5jdGlvbihldmVudCkKICAgICAgewogICAgICAgICAgZG9jdW1lbnQubWF4UHJpY2UgPSBldmVudC5nZXROZXdWYWx1ZSgpOwogICAgICAgICAgZG9jdW1lbnQubG9hZEZpbHRlcmVkUHJvZHVjdHMoZG9jdW1lbnQubWluUHJpY2UsIGRvY3VtZW50Lm1heFByaWNlKTsKICAgICAgfQogICAgICBmbGV4QXBwLmdldE1heFByaWNlU2xpZGVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgbWF4UHJpY2VDYWxsYmFjayk7CiAgfQoKVG8gcnVuIGluaXRpYWxpemF0aW9uIGNvZGUgb24gYSBGbGV4IGZpbGUsIHlvdSBtdXN0IHdhaXQgZm9yIGl0IHRvIGRvd25sb2FkIGFuZCBpbml0aWFsaXplIApmaXJzdC4gUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIG1vdmllIGlzIGluaXRpYWxpemVkLCBhcyB0aGUgZm9sbG93aW5nIApleGFtcGxlIHNob3dzOgoKIGZ1bmN0aW9uIGluaXRNYXhQcmljZShtYXhQcmljZSkKICB7CiAgICAgIHZhciBpbml0Q2FsbGJhY2sgPSBmdW5jdGlvbigpCiAgICAgIHsKICAgICAgICAgIHZhciBmbGV4QXBwID0gRkFCcmlkZ2UuZmxhc2gucm9vdCgpOwogICAgICAgICAgZmxleEFwcC5nZXRNYXhQcmljZVNsaWRlcigpLnNldFZhbHVlKG1heFByaWNlKTsKICAgICAgfQogICAgICBGQUJyaWRnZS5hZGRJbml0aWFsaXphdGlvbkNhbGxiYWNrKCJmbGFzaCIsaW5pdENhbGxiYWNrKTsKICB9IAoKVG8gc2NyaXB0IG11bHRpcGxlIEZsYXNoIGFwcGxpY2F0aW9ucyBvbiB0aGUgc2FtZSBwYWdlLCBnaXZlIHRoZW0gdW5pcXVlIGJyaWRnZSBuYW1lcyAKdGhyb3VnaCB0aGUgZmxhc2h2YXJzIG1lY2hhbmlzbS4gIFVzZSB0aGUgYnJpZGdlIG5hbWUgdG8gYWNjZXNzIHRoZW0gZnJvbSB0aGUgYnJpZGdlLCBhbmQgCnRvIHJlZ2lzdGVyIGZvciBpbml0aWFsaXphdGlvbiBjYWxsYmFja3MsIGFzIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93czoKCiAgPG9iamVjdCAuLi4+CiAgICA8cGFyYW0gbmFtZT0nZmxhc2h2YXJzJyB2YWx1ZT0nYnJpZGdlTmFtZT1zaG9wcGluZ1BhbmVsJy8+CiAgICA8cGFyYW0gbmFtZT0nc3JjJyB2YWx1ZT0nYXBwLnN3ZicvPgogICAgPGVtYmVkIC4uLiBmbGFzaHZhcnM9J2JyaWRnZU5hbWU9c2hvcHBpbmdQYW5lbCcvPgogIDwvb2JqZWN0PgogIAogIGZ1bmN0aW9uIGluaXRNYXhQcmljZShtYXhQcmljZSkKICB7CiAgICAgIHZhciBpbml0Q2FsbGJhY2sgPSBmdW5jdGlvbigpCiAgICAgIHsKICAgICAgICAgIHZhciBmbGV4QXBwID0gRkFCcmlkZ2Uuc2hvcHBpbmdQYW5lbC5yb290KCk7CiAgICAgICAgICBmbGV4QXBwLmdldE1heFByaWNlU2xpZGVyKCkuc2V0VmFsdWUobWF4UHJpY2UpOwogICAgICB9CiAgICAgIEZBQnJpZGdlLmFkZEluaXRpYWxpemF0aW9uQ2FsbGJhY2soInNob3BwaW5nUGFuZWwiLGluaXRDYWxsYmFjayk7CiAgfQoKPGI+QXV0b21hdGljIG1lbW9yeSBtYW5hZ2VtZW50PC9iPgoKVGhlIEZBQnJpZGdlIHByb3ZpZGVzIGF1dG9tYXRpYyBtZW1vcnkgbWFuYWdlbWVudCB0aGF0IHVzZXMgYSByZWZlcmVuY2UgY291bnRpbmcgbWVjaGFuaXNtCmZvciBhbGwgb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgYWNyb3NzIHRoZSBicmlkZ2UuIE9iamVjdHMgY3JlYXRlZCBmcm9tIHRoZSBKYXZhU2NyaXB0IApzaWRlIGFyZSBrZXB0IGluIG1lbW9yeSB1bmxlc3MgdGhlIG1lbW9yeSBpcyBtYW51YWxseSByZWxlYXNlZC4gRXZlbnRzIGFuZCBvdGhlciAKQWN0aW9uc2NyaXB0LWluaXRpYXRlZCBvYmplY3RzIGFyZSBkZXN0cm95ZWQgYXMgc29vbiBhcyB0aGUgY29ycmVzcG9uZGluZyBKYXZhU2NyaXB0IApmdW5jdGlvbiB0aGF0IGhhbmRsZXMgdGhlbSBkaXJlY3RseSBjb21wbGV0ZXMgaXRzIGV4ZWN1dGlvbi4gWW91IGNhbiBtYW51YWxseSBjYWxsIHRoZSAKPGNvZGU+YWRkUmVmKCk8L2NvZGU+IGZvciBhbiBvYmplY3QgdG8gaGF2ZSBpdCByZW1haW4gYXZhaWxhYmxlIG9yIGNhbGwgdGhlIAo8Y29kZT5yZWxlYXNlKCk8L2NvZGU+IG1ldGhvZCB0byBkZWNyZWFzZSBpdHMgcmVmZXJlbmNlIGNvdW50ZXIuCgpJZiB5b3UgbXVzdCBicmVhayB0aGUgZnVuY3Rpb24gY2FsbCBjaGFpbiBieSB1c2luZyB0aGUgPGNvZGU+c2V0VGltZW91dCgpPC9jb2RlPiBmdW5jdGlvbiAKaW4gSmF2YVNjcmlwdCwgZm9yIGV4YW1wbGUgdG8gYWN0IG9uIGFuIGV2ZW50IGxhdGVyIG9uIGFzIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cywgeW91Cm11c3QgZW5zdXJlIHRoYXQgdGhlIGV2ZW50IHdpbGwgc3RpbGwgZXhpc3QuIEJlY2F1c2UgdGhlIEZBQnJpZGdlIGltcGxlbWVudHMgYSByZWZlcmVuY2UgCmNvdW50aW5nIG1lY2hhbmlzbSB0byBzYXZlIG1lbW9yeSwgZXZlbnRzIHRocm93biBmcm9tIEFjdGlvblNjcmlwdCBleGlzdCBvbmx5IGZvciB0aGUgCmR1cmF0aW9uIG9mIHRoZSBkaXNwYXRjaCBmdW5jdGlvbi4KCjxwcmU+CnZhciBmbGV4QXBwID0gRkFCcmlkZ2UuZmxhc2gucm9vdCgpOwpmbGV4QXBwLmdldE1heFByaWNlU2xpZGVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgbWF4UHJpY2VDYWxsYmFjayApOwpmdW5jdGlvbiBtYXhQcmljZUNhbGxiYWNrKGV2ZW50KSB7CiAgICAvL3doZW4gdGhlIGRvU29tZXRoaW5nTGF0ZXIgZnVuY3Rpb24gaXMgaGl0LCB0aGUgZXZlbnQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZTsKICAgIC8vdG8gbWFrZSBpdCB3b3JrIHlvdSB3b3VsZCBoYXZlIHRvIGNhbGwKICAgIC8vRkFCcmlkZ2UuYWRkUmVmKGV2ZW50KTsKICAgIC8vdGhlbiwgd2hlbiB5b3UncmUgZG9uZSB3aXRoIGl0IGNhbGwgRkFCcmlkZ2UucmVsZWFzZShldmVudCk7CiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge2RvU29tZXRoaW5nTGF0ZXIoZXZlbnQpO30sMTApOwp9CjwvcHJlPiAgCgo8Yj5NYW51YWxseSBkZXN0cm95aW5nIG9iamVjdHM8L2I+CgpZb3UgY2FuIG1hbnVhbGx5IGRlc3Ryb3kgYSBzcGVjaWZpYyBvYmplY3QgdGhhdCBoYXMgYmVlbiBwYXNzZWQgYWNyb3NzIHRoZSBicmlkZ2UsIApyZWdhcmRsZXNzIG9mIGl0cyByZWZlcmVuY2UgY291bnQgYnkgaW52b2tpbmcgdGhlIDxjb2RlPnJlbGVhc2VOYW1lZEFTT2JqZWN0KG15T2JqZWN0KTwvY29kZT4gCm1ldGhvZCBmcm9tIEphdmFTY3JpcHQuIFRoaXMgaW52YWxpZGF0ZXMgdGhlIG9iamVjdCBvdmVyIHRoZSBicmlkZ2UgYW5kIGFueSBmdXR1cmUgY2FsbHMgCnRvIGl0IG9yIG9uZSBvZiBpdHMgbWV0aG9kcyB3aWxsIHRocm93IGFuIGVycm9yLgoKPGI+SGFuZGxpbmcgZXhjZXB0aW9uczwvYj4KCkV4Y2VwdGlvbnMgdGhhdCB0YWtlIHBsYWNlIGluIHRoZSBBY3Rpb25TY3JpcHQgb2YgdGhlIGJyaWRnZSBhcyBhIGRpcmVjdCBjb25zZXF1ZW5jZSBvZiAKc29tZSBKYXZhU2NyaXB0IGFjdGlvbiBhcmUgbm93IHRocm93biBvdmVyIHRoZSBicmlkZ2UgaW50byBKYXZhU2NyaXB0LiBUaGUgbWVjaGFuaXNtIAp3b3JrcyBhcyBmb2xsb3dzOgoqIFdoZW4gYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbiB0aGUgQWN0aW9uU2NyaXB0IHNlY3Rpb24sIGl0IGlzIGNhdWdodCBpbiBhIHRyeS1jYXRjaCAKYmxvY2ssIHNlcmlhbGl6ZWQsIGFuZCBwYXNzZWQgdG8gSmF2YVNjcmlwdC4gCiogV2hlbiB0aGUgSmF2YVNjcmlwdCBwYXJ0IHJlY2VpdmVzIGFuIGFuc3dlciBmcm9tIEFjdGlvblNjcmlwdCwgaXQgY2hlY2tzIGZvciB0aGUgCmV4Y2VwdGlvbiBzZXJpYWxpemF0aW9uIGFuZCwgaWYgZm91bmQsIHRocm93cyBhIEphdmFTY3JpcHQgZXJyb3Igd2l0aCB0aGUgbWVzc2FnZSByZWNlaXZlZApmcm9tIEFjdGlvblNjcmlwdC4KCk5vdGU6IFRvIGNhdGNoIGFuZCB1c2UgdGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiwgeW91IG11c3Qgc3Vycm91bmQgdGhlIGNvZGUgdGhhdCBjYWxscyAKaW50byBBY3Rpb25TY3JpcHQgd2l0aCBhIHRyeS1jYXRjaCBibG9jay4gWW91IGNhbiBoYW5kbGUgdGhlIGVycm9yIGluIHRoZSA8Y29kZT5jYXRjaChlKTwvY29kZT4gCmJsb2NrLgoKPT0gV2hhdCBBcmUgdGhlIExpbWl0YXRpb25zPyA9PQoKVGhlIEZBQnJpZGdlIGxpYnJhcnkgaXMgY3VycmVudGx5IGluIGEgYmV0YSBzdGF0ZS4gSXQgaGFzIGJlZW4gdGVzdGVkIG9uIE1vemlsbGEgRmlyZWZveCAyCihXaW5kb3dzIGFuZCBMaW51eCksIE1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciA2LCBPcGVyYSA5LCBhbmQgQXBwbGUgU2FmYXJpIDIuMC40LgoKRXhjZXB0aW9ucyB0aHJvd24gYWNyb3NzIHRoZSBicmlkZ2UgaW50byBKYXZhU2NyaXB0IGRlcGVuZCBvbiB0aGUgdXNlciBoYXZpbmcgaW5zdGFsbGVkIApGbGFzaCBEZWJ1ZyBQbGF5ZXIgdG8gZGlzcGxheSB0aGUgZW50aXJlIGVycm9yIGRlc2NyaXB0aW9uLiBPdGhlcndpc2UsIG9ubHkgdGhlIGVycm9yIElECmlzIHRocm93bi4KCkZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3aGVuIGFuIGFub255bW91cyBvYmplY3QgaXMgc2VudCBmcm9tIEFjdGlvblNjcmlwdCB0byBKYXZhU2NyaXB0LAp0aGUgYnJpZGdlIGFzc3VtZXMgaXQgY29udGFpbnMgb25seSBwcmltaXRpdmVzLCBhcnJheXMsIGFuZCBvdGhlciBhbm9ueW1vdXMgb2JqZWN0cywgYW5kIApubyBzdHJvbmdseSB0eXBlZCBvYmplY3RzIG9yIG1ldGhvZHMuIEluc3RhbmNlcyBvciBtZXRob2RzIHNlbnQgYXMgcGFydCBvZiBhbiBhbm9ueW1vdXMgCm9iamVjdCBhcmUgbm90IGJyaWRnZWQgY29ycmVjdGx5LgoKPT0gU3VtbWFyeSA9PQoKWW91IGNhbiB1c2UgdGhlIEZBQnJpZGdlIGxpYnJhcnkgdG8gYXV0b21hdGljYWxseSBleHBvc2UgeW91ciBGbGV4IGFwcGxpY2F0aW9uIHRvIApBSkFYLWJhc2VkIEhUTUwgYXBwbGljYXRpb25zLiAgVXNpbmcgdGhlIGJyaWRnZSwgeW91IGNhbiBlYXNpbHkgZW1iZWQgcmljaCBGbGV4IGNvbXBvbmVudHMKaW4geW91ciBhcHBsaWNhdGlvbnMsIGludGVncmF0aW5nIHRoZW0gdGlnaHRseSB3aXRoIHRoZSByZXN0IG9mIHRoZSBwYWdlIGNvbnRlbnQuIEFmdGVyIGEKRmxleCBhcHBsaWNhdGlvbiBpcyBlbmFibGVkIHRocm91Z2ggdGhlIGJyaWRnZSwgSmF2YVNjcmlwdCBkZXZlbG9wZXJzIGhhdmUgYWNjZXNzIHRvIGFsbApvZiB0aGUgZnVuY3Rpb25hbGl0eSBpdCBwcm92aWRlcy4K