@codingame/monaco-editor-wrapper 1.1.3 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/JavaScriptReact.tmLanguage.js +5894 -0
- package/dist/TypeScriptReact.tmLanguage.js +5894 -0
- package/dist/aspnetcorerazor.tmLanguage.js +65 -83
- package/dist/css.worker.js +1 -1
- package/dist/d2.js +92 -34
- package/dist/extensionConfigurations.js +1167 -1414
- package/dist/html.tmLanguage2.js +11 -1
- package/dist/html.worker.js +1 -1
- package/dist/json.worker.js +1 -1
- package/dist/jsonContribution.js +46 -40
- package/dist/languages/extensions/configurationLoader.d.ts +13 -1
- package/dist/languages/extensions/grammarLoader.d.ts +26206 -17207
- package/dist/languages/extensions/snippetLoader.d.ts +0 -12
- package/dist/lua.tmLanguage.js +12 -2
- package/dist/main.js +135 -29
- package/dist/markdown.tmLanguage.js +91 -14
- package/dist/pascal.tmLanguage.js +2 -2
- package/dist/php.tmLanguage.js +161 -96
- package/dist/r2.js +17 -29
- package/dist/sql.js +89 -2
- package/dist/sql.tmLanguage.js +532 -0
- package/dist/ts.worker.js +1 -1
- package/dist/worker.js +1 -1
- package/package.json +3 -2
- package/stats.html +1 -1
- package/dist/SQL.plist.js +0 -482
- package/dist/html (eex).js +0 -31
- package/dist/pgsql-sql.js +0 -21
- package/dist/r.tmLanguage.js +0 -551
package/dist/worker.js
CHANGED
|
@@ -28,7 +28,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
|
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBBdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IG9uIEV2ZW50RW1pdHRlciBieSBpbXBsZW1lbnRpbmcgYSBzdWJzZXQgb2YgdGhlIGludGVyZmFjZS4KICAgIGNsYXNzIEVycm9ySGFuZGxlciB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzID0gW107CiAgICAgICAgICAgIHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS5zdGFjaykgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS5tZXNzYWdlICsgJ1xuXG4nICsgZS5zdGFjayk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgYWRkTGlzdGVuZXIobGlzdGVuZXIpIHsKICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7CiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVtaXQoZSkgewogICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gewogICAgICAgICAgICAgICAgbGlzdGVuZXIoZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpIHsKICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKHRoaXMubGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKTsKICAgICAgICB9CiAgICAgICAgc2V0VW5leHBlY3RlZEVycm9ySGFuZGxlcihuZXdVbmV4cGVjdGVkRXJyb3JIYW5kbGVyKSB7CiAgICAgICAgICAgIHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlciA9IG5ld1VuZXhwZWN0ZWRFcnJvckhhbmRsZXI7CiAgICAgICAgfQogICAgICAgIGdldFVuZXhwZWN0ZWRFcnJvckhhbmRsZXIoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnVuZXhwZWN0ZWRFcnJvckhhbmRsZXI7CiAgICAgICAgfQogICAgICAgIG9uVW5leHBlY3RlZEVycm9yKGUpIHsKICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyKGUpOwogICAgICAgICAgICB0aGlzLmVtaXQoZSk7CiAgICAgICAgfQogICAgICAgIC8vIEZvciBleHRlcm5hbCBlcnJvcnMsIHdlIGRvbid0IHdhbnQgdGhlIGxpc3RlbmVycyB0byBiZSBjYWxsZWQKICAgICAgICBvblVuZXhwZWN0ZWRFeHRlcm5hbEVycm9yKGUpIHsKICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyKGUpOwogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTsKICAgIGZ1bmN0aW9uIG9uVW5leHBlY3RlZEVycm9yKGUpIHsKICAgICAgICAvLyBpZ25vcmUgZXJyb3JzIGZyb20gY2FuY2VsbGVkIHByb21pc2VzCiAgICAgICAgaWYgKCFpc1Byb21pc2VDYW5jZWxlZEVycm9yKGUpKSB7CiAgICAgICAgICAgIGVycm9ySGFuZGxlci5vblVuZXhwZWN0ZWRFcnJvcihlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUVycm9yRm9yU2VyaWFsaXphdGlvbihlcnJvcikgewogICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7CiAgICAgICAgICAgIGxldCB7IG5hbWUsIG1lc3NhZ2UgfSA9IGVycm9yOwogICAgICAgICAgICBjb25zdCBzdGFjayA9IGVycm9yLnN0YWNrdHJhY2UgfHwgZXJyb3Iuc3RhY2s7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAkaXNFcnJvcjogdHJ1ZSwKICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICBtZXNzYWdlLAogICAgICAgICAgICAgICAgc3RhY2sKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLy8gcmV0dXJuIGFzIGlzCiAgICAgICAgcmV0dXJuIGVycm9yOwogICAgfQogICAgY29uc3QgY2FuY2VsZWROYW1lID0gJ0NhbmNlbGVkJzsKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBlcnJvciBpcyBhIHByb21pc2UgaW4gY2FuY2VsZWQgc3RhdGUKICAgICAqLwogICAgZnVuY3Rpb24gaXNQcm9taXNlQ2FuY2VsZWRFcnJvcihlcnJvcikgewogICAgICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09IGNhbmNlbGVkTmFtZSAmJiBlcnJvci5tZXNzYWdlID09PSBjYW5jZWxlZE5hbWU7CiAgICB9CiAgICBmdW5jdGlvbiBpbGxlZ2FsQXJndW1lbnQobmFtZSkgewogICAgICAgIGlmIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYElsbGVnYWwgYXJndW1lbnQ6ICR7bmFtZX1gKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQnKTsKICAgICAgICB9CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBmdW5jdGlvbiBvbmNlKGZuKSB7CiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzOwogICAgICAgIGxldCBkaWRDYWxsID0gZmFsc2U7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoZGlkQ2FsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBkaWRDYWxsID0gdHJ1ZTsKICAgICAgICAgICAgcmVzdWx0ID0gZm4uYXBwbHkoX3RoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHZhciBJdGVyYWJsZTsKICAgIChmdW5jdGlvbiAoSXRlcmFibGUpIHsKICAgICAgICBmdW5jdGlvbiBpcyh0aGluZykgewogICAgICAgICAgICByZXR1cm4gdGhpbmcgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGhpbmdbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJzsKICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuaXMgPSBpczsKICAgICAgICBjb25zdCBfZW1wdHkgPSBPYmplY3QuZnJlZXplKFtdKTsKICAgICAgICBmdW5jdGlvbiBlbXB0eSgpIHsKICAgICAgICAgICAgcmV0dXJuIF9lbXB0eTsKICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuZW1wdHkgPSBlbXB0eTsKICAgICAgICBmdW5jdGlvbiogc2luZ2xlKGVsZW1lbnQpIHsKICAgICAgICAgICAgeWllbGQgZWxlbWVudDsKICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuc2luZ2xlID0gc2luZ2xlOwogICAgICAgIGZ1bmN0aW9uIGZyb20oaXRlcmFibGUpIHsKICAgICAgICAgICAgcmV0dXJuIGl0ZXJhYmxlIHx8IF9lbXB0eTsKICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuZnJvbSA9IGZyb207CiAgICAgICAgZnVuY3Rpb24gaXNFbXB0eShpdGVyYWJsZSkgewogICAgICAgICAgICByZXR1cm4gIWl0ZXJhYmxlIHx8IGl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKS5uZXh0KCkuZG9uZSA9PT0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuaXNFbXB0eSA9IGlzRW1wdHk7CiAgICAgICAgZnVuY3Rpb24gZmlyc3QoaXRlcmFibGUpIHsKICAgICAgICAgICAgcmV0dXJuIGl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKS5uZXh0KCkudmFsdWU7CiAgICAgICAgfQogICAgICAgIEl0ZXJhYmxlLmZpcnN0ID0gZmlyc3Q7CiAgICAgICAgZnVuY3Rpb24gc29tZShpdGVyYWJsZSwgcHJlZGljYXRlKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBpdGVyYWJsZSkgewogICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuc29tZSA9IHNvbWU7CiAgICAgICAgZnVuY3Rpb24gZmluZChpdGVyYWJsZSwgcHJlZGljYXRlKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBpdGVyYWJsZSkgewogICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIEl0ZXJhYmxlLmZpbmQgPSBmaW5kOwogICAgICAgIGZ1bmN0aW9uKiBmaWx0ZXIoaXRlcmFibGUsIHByZWRpY2F0ZSkgewogICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgaXRlcmFibGUpIHsKICAgICAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEl0ZXJhYmxlLmZpbHRlciA9IGZpbHRlcjsKICAgICAgICBmdW5jdGlvbiogbWFwKGl0ZXJhYmxlLCBmbikgewogICAgICAgICAgICBsZXQgaW5kZXggPSAwOwogICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgaXRlcmFibGUpIHsKICAgICAgICAgICAgICAgIHlpZWxkIGZuKGVsZW1lbnQsIGluZGV4KyspOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEl0ZXJhYmxlLm1hcCA9IG1hcDsKICAgICAgICBmdW5jdGlvbiogY29uY2F0KC4uLml0ZXJhYmxlcykgewogICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZXJhYmxlIG9mIGl0ZXJhYmxlcykgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGl0ZXJhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBJdGVyYWJsZS5jb25jYXQgPSBjb25jYXQ7CiAgICAgICAgZnVuY3Rpb24qIGNvbmNhdE5lc3RlZChpdGVyYWJsZXMpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBpdGVyYWJsZSBvZiBpdGVyYWJsZXMpIHsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBpdGVyYWJsZSkgewogICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuY29uY2F0TmVzdGVkID0gY29uY2F0TmVzdGVkOwogICAgICAgIGZ1bmN0aW9uIHJlZHVjZShpdGVyYWJsZSwgcmVkdWNlciwgaW5pdGlhbFZhbHVlKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGl0ZXJhYmxlKSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlZHVjZXIodmFsdWUsIGVsZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgSXRlcmFibGUucmVkdWNlID0gcmVkdWNlOwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gaXRlcmFibGUgc2xpY2Ugb2YgdGhlIGFycmF5LCB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyBgYXJyYXkuc2xpY2UoKWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24qIHNsaWNlKGFyciwgZnJvbSwgdG8gPSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChmcm9tIDwgMCkgewogICAgICAgICAgICAgICAgZnJvbSArPSBhcnIubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0byA8IDApIHsKICAgICAgICAgICAgICAgIHRvICs9IGFyci5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG8gPiBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0byA9IGFyci5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICg7IGZyb20gPCB0bzsgZnJvbSsrKSB7CiAgICAgICAgICAgICAgICB5aWVsZCBhcnJbZnJvbV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuc2xpY2UgPSBzbGljZTsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdW1lcyBgYXRNb3N0YCBlbGVtZW50cyBmcm9tIGl0ZXJhYmxlIGFuZCByZXR1cm5zIHRoZSBjb25zdW1lZCBlbGVtZW50cywKICAgICAgICAgKiBhbmQgYW4gaXRlcmFibGUgZm9yIHRoZSByZXN0IG9mIHRoZSBlbGVtZW50cy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjb25zdW1lKGl0ZXJhYmxlLCBhdE1vc3QgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHsKICAgICAgICAgICAgY29uc3QgY29uc3VtZWQgPSBbXTsKICAgICAgICAgICAgaWYgKGF0TW9zdCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtjb25zdW1lZCwgaXRlcmFibGVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0TW9zdDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKG5leHQuZG9uZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbY29uc3VtZWQsIEl0ZXJhYmxlLmVtcHR5KCldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3VtZWQucHVzaChuZXh0LnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gW2NvbnN1bWVkLCB7IFtTeW1ib2wuaXRlcmF0b3JdKCkgeyByZXR1cm4gaXRlcmF0b3I7IH0gfV07CiAgICAgICAgfQogICAgICAgIEl0ZXJhYmxlLmNvbnN1bWUgPSBjb25zdW1lOwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlcmFibGVzIGFyZSB0aGUgc2FtZSBsZW5ndGggYW5kIGFsbCBpdGVtcyBhcmUKICAgICAgICAgKiBlcXVhbCB1c2luZyB0aGUgY29tcGFyYXRvciBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBlcXVhbHMoYSwgYiwgY29tcGFyYXRvciA9IChhdCwgYnQpID0+IGF0ID09PSBidCkgewogICAgICAgICAgICBjb25zdCBhaSA9IGFbU3ltYm9sLml0ZXJhdG9yXSgpOwogICAgICAgICAgICBjb25zdCBiaSA9IGJbU3ltYm9sLml0ZXJhdG9yXSgpOwogICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgY29uc3QgYW4gPSBhaS5uZXh0KCk7CiAgICAgICAgICAgICAgICBjb25zdCBibiA9IGJpLm5leHQoKTsKICAgICAgICAgICAgICAgIGlmIChhbi5kb25lICE9PSBibi5kb25lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYW4uZG9uZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIWNvbXBhcmF0b3IoYW4udmFsdWUsIGJuLnZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBJdGVyYWJsZS5lcXVhbHMgPSBlcXVhbHM7CiAgICB9KShJdGVyYWJsZSB8fCAoSXRlcmFibGUgPSB7fSkpOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICAgICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9CiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQogICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7CiAgICAgICAgfSk7CiAgICB9OwogICAgZnVuY3Rpb24gdHJhY2tEaXNwb3NhYmxlKHgpIHsKICAgICAgICByZXR1cm4geDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFBhcmVudE9mRGlzcG9zYWJsZShjaGlsZCwgcGFyZW50KSB7CiAgICB9CiAgICBjbGFzcyBNdWx0aURpc3Bvc2VFcnJvciBleHRlbmRzIEVycm9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihlcnJvcnMpIHsKICAgICAgICAgICAgc3VwZXIoYEVuY291bnRlcmVkIGVycm9ycyB3aGlsZSBkaXNwb3Npbmcgb2Ygc3RvcmUuIEVycm9yczogWyR7ZXJyb3JzLmpvaW4oJywgJyl9XWApOwogICAgICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9yczsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBkaXNwb3NlKGFyZykgewogICAgICAgIGlmIChJdGVyYWJsZS5pcyhhcmcpKSB7CiAgICAgICAgICAgIGxldCBlcnJvcnMgPSBbXTsKICAgICAgICAgICAgZm9yIChjb25zdCBkIG9mIGFyZykgewogICAgICAgICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBkLmRpc3Bvc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcnNbMF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3JzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBNdWx0aURpc3Bvc2VFcnJvcihlcnJvcnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZykgPyBbXSA6IGFyZzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJnKSB7CiAgICAgICAgICAgIGFyZy5kaXNwb3NlKCk7CiAgICAgICAgICAgIHJldHVybiBhcmc7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY29tYmluZWREaXNwb3NhYmxlKC4uLmRpc3Bvc2FibGVzKSB7CiAgICAgICAgY29uc3QgcGFyZW50ID0gdG9EaXNwb3NhYmxlKCgpID0+IGRpc3Bvc2UoZGlzcG9zYWJsZXMpKTsKICAgICAgICByZXR1cm4gcGFyZW50OwogICAgfQogICAgZnVuY3Rpb24gdG9EaXNwb3NhYmxlKGZuKSB7CiAgICAgICAgY29uc3Qgc2VsZiA9IHRyYWNrRGlzcG9zYWJsZSh7CiAgICAgICAgICAgIGRpc3Bvc2U6IG9uY2UoKCkgPT4gewogICAgICAgICAgICAgICAgZm4oKTsKICAgICAgICAgICAgfSkKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gc2VsZjsKICAgIH0KICAgIGNsYXNzIERpc3Bvc2FibGVTdG9yZSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX3RvRGlzcG9zZSA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgdGhpcy5faXNEaXNwb3NlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEaXNwb3NlIG9mIGFsbCByZWdpc3RlcmVkIGRpc3Bvc2FibGVzIGFuZCBtYXJrIHRoaXMgb2JqZWN0IGFzIGRpc3Bvc2VkLgogICAgICAgICAqCiAgICAgICAgICogQW55IGZ1dHVyZSBkaXNwb3NhYmxlcyBhZGRlZCB0byB0aGlzIG9iamVjdCB3aWxsIGJlIGRpc3Bvc2VkIG9mIG9uIGBhZGRgLgogICAgICAgICAqLwogICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGlzcG9zZSBvZiBhbGwgcmVnaXN0ZXJlZCBkaXNwb3NhYmxlcyBidXQgZG8gbm90IG1hcmsgdGhpcyBvYmplY3QgYXMgZGlzcG9zZWQuCiAgICAgICAgICovCiAgICAgICAgY2xlYXIoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBkaXNwb3NlKHRoaXMuX3RvRGlzcG9zZS52YWx1ZXMoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICB0aGlzLl90b0Rpc3Bvc2UuY2xlYXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhZGQobykgewogICAgICAgICAgICBpZiAoIW8pIHsKICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvID09PSB0aGlzKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWdpc3RlciBhIGRpc3Bvc2FibGUgb24gaXRzZWxmIScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkKSB7CiAgICAgICAgICAgICAgICBpZiAoIURpc3Bvc2FibGVTdG9yZS5ESVNBQkxFX0RJU1BPU0VEX1dBUk5JTkcpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4obmV3IEVycm9yKCdUcnlpbmcgdG8gYWRkIGEgZGlzcG9zYWJsZSB0byBhIERpc3Bvc2FibGVTdG9yZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb2YuIFRoZSBhZGRlZCBvYmplY3Qgd2lsbCBiZSBsZWFrZWQhJykuc3RhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fdG9EaXNwb3NlLmFkZChvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9CiAgICB9CiAgICBEaXNwb3NhYmxlU3RvcmUuRElTQUJMRV9ESVNQT1NFRF9XQVJOSU5HID0gZmFsc2U7CiAgICBjbGFzcyBEaXNwb3NhYmxlIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5fc3RvcmUgPSBuZXcgRGlzcG9zYWJsZVN0b3JlKCk7CiAgICAgICAgICAgIHNldFBhcmVudE9mRGlzcG9zYWJsZSh0aGlzLl9zdG9yZSk7CiAgICAgICAgfQogICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgIHRoaXMuX3N0b3JlLmRpc3Bvc2UoKTsKICAgICAgICB9CiAgICAgICAgX3JlZ2lzdGVyKG8pIHsKICAgICAgICAgICAgaWYgKG8gPT09IHRoaXMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlLmFkZChvKTsKICAgICAgICB9CiAgICB9CiAgICBEaXNwb3NhYmxlLk5vbmUgPSBPYmplY3QuZnJlZXplKHsgZGlzcG9zZSgpIHsgfSB9KTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNsYXNzIE5vZGUgewogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKICAgICAgICAgICAgdGhpcy5uZXh0ID0gTm9kZS5VbmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMucHJldiA9IE5vZGUuVW5kZWZpbmVkOwogICAgICAgIH0KICAgIH0KICAgIE5vZGUuVW5kZWZpbmVkID0gbmV3IE5vZGUodW5kZWZpbmVkKTsKICAgIGNsYXNzIExpbmtlZExpc3QgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLl9maXJzdCA9IE5vZGUuVW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLl9sYXN0ID0gTm9kZS5VbmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMuX3NpemUgPSAwOwogICAgICAgIH0KICAgICAgICBnZXQgc2l6ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7CiAgICAgICAgfQogICAgICAgIGlzRW1wdHkoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maXJzdCA9PT0gTm9kZS5VbmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGNsZWFyKCkgewogICAgICAgICAgICBsZXQgbm9kZSA9IHRoaXMuX2ZpcnN0OwogICAgICAgICAgICB3aGlsZSAobm9kZSAhPT0gTm9kZS5VbmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBub2RlLm5leHQ7CiAgICAgICAgICAgICAgICBub2RlLnByZXYgPSBOb2RlLlVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIG5vZGUubmV4dCA9IE5vZGUuVW5kZWZpbmVkOwogICAgICAgICAgICAgICAgbm9kZSA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZmlyc3QgPSBOb2RlLlVuZGVmaW5lZDsKICAgICAgICAgICAgdGhpcy5fbGFzdCA9IE5vZGUuVW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLl9zaXplID0gMDsKICAgICAgICB9CiAgICAgICAgdW5zaGlmdChlbGVtZW50KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnQoZWxlbWVudCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBwdXNoKGVsZW1lbnQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydChlbGVtZW50LCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgX2luc2VydChlbGVtZW50LCBhdFRoZUVuZCkgewogICAgICAgICAgICBjb25zdCBuZXdOb2RlID0gbmV3IE5vZGUoZWxlbWVudCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9maXJzdCA9PT0gTm9kZS5VbmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZpcnN0ID0gbmV3Tm9kZTsKICAgICAgICAgICAgICAgIHRoaXMuX2xhc3QgPSBuZXdOb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGF0VGhlRW5kKSB7CiAgICAgICAgICAgICAgICAvLyBwdXNoCiAgICAgICAgICAgICAgICBjb25zdCBvbGRMYXN0ID0gdGhpcy5fbGFzdDsKICAgICAgICAgICAgICAgIHRoaXMuX2xhc3QgPSBuZXdOb2RlOwogICAgICAgICAgICAgICAgbmV3Tm9kZS5wcmV2ID0gb2xkTGFzdDsKICAgICAgICAgICAgICAgIG9sZExhc3QubmV4dCA9IG5ld05vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyB1bnNoaWZ0CiAgICAgICAgICAgICAgICBjb25zdCBvbGRGaXJzdCA9IHRoaXMuX2ZpcnN0OwogICAgICAgICAgICAgICAgdGhpcy5fZmlyc3QgPSBuZXdOb2RlOwogICAgICAgICAgICAgICAgbmV3Tm9kZS5uZXh0ID0gb2xkRmlyc3Q7CiAgICAgICAgICAgICAgICBvbGRGaXJzdC5wcmV2ID0gbmV3Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zaXplICs9IDE7CiAgICAgICAgICAgIGxldCBkaWRSZW1vdmUgPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICAgICAgICAgIGlmICghZGlkUmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgZGlkUmVtb3ZlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmUobmV3Tm9kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHNoaWZ0KCkgewogICAgICAgICAgICBpZiAodGhpcy5fZmlyc3QgPT09IE5vZGUuVW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgcmVzID0gdGhpcy5fZmlyc3QuZWxlbWVudDsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZSh0aGlzLl9maXJzdCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvcCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2xhc3QgPT09IE5vZGUuVW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgcmVzID0gdGhpcy5fbGFzdC5lbGVtZW50OwogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlKHRoaXMuX2xhc3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfcmVtb3ZlKG5vZGUpIHsKICAgICAgICAgICAgaWYgKG5vZGUucHJldiAhPT0gTm9kZS5VbmRlZmluZWQgJiYgbm9kZS5uZXh0ICE9PSBOb2RlLlVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgLy8gbWlkZGxlCiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3IgPSBub2RlLnByZXY7CiAgICAgICAgICAgICAgICBhbmNob3IubmV4dCA9IG5vZGUubmV4dDsKICAgICAgICAgICAgICAgIG5vZGUubmV4dC5wcmV2ID0gYW5jaG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUucHJldiA9PT0gTm9kZS5VbmRlZmluZWQgJiYgbm9kZS5uZXh0ID09PSBOb2RlLlVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgLy8gb25seSBub2RlCiAgICAgICAgICAgICAgICB0aGlzLl9maXJzdCA9IE5vZGUuVW5kZWZpbmVkOwogICAgICAgICAgICAgICAgdGhpcy5fbGFzdCA9IE5vZGUuVW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUubmV4dCA9PT0gTm9kZS5VbmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIC8vIGxhc3QKICAgICAgICAgICAgICAgIHRoaXMuX2xhc3QgPSB0aGlzLl9sYXN0LnByZXY7CiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0Lm5leHQgPSBOb2RlLlVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChub2RlLnByZXYgPT09IE5vZGUuVW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAvLyBmaXJzdAogICAgICAgICAgICAgICAgdGhpcy5fZmlyc3QgPSB0aGlzLl9maXJzdC5uZXh0OwogICAgICAgICAgICAgICAgdGhpcy5fZmlyc3QucHJldiA9IE5vZGUuVW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgdGhpcy5fc2l6ZSAtPSAxOwogICAgICAgIH0KICAgICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgICAgIGxldCBub2RlID0gdGhpcy5fZmlyc3Q7CiAgICAgICAgICAgIHdoaWxlIChub2RlICE9PSBOb2RlLlVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgeWllbGQgbm9kZS5lbGVtZW50OwogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHZhciBfYTsKICAgIGNvbnN0IExBTkdVQUdFX0RFRkFVTFQgPSAnZW4nOwogICAgbGV0IF9pc1dpbmRvd3MgPSBmYWxzZTsKICAgIGxldCBfaXNNYWNpbnRvc2ggPSBmYWxzZTsKICAgIGxldCBfaXNMaW51eCA9IGZhbHNlOwogICAgbGV0IF9sb2NhbGUgPSB1bmRlZmluZWQ7CiAgICBsZXQgX2xhbmd1YWdlID0gTEFOR1VBR0VfREVGQVVMVDsKICAgIGxldCBfdHJhbnNsYXRpb25zQ29uZmlnRmlsZSA9IHVuZGVmaW5lZDsKICAgIGxldCBfdXNlckFnZW50ID0gdW5kZWZpbmVkOwogICAgY29uc3QgZ2xvYmFscyA9ICh0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgPyBzZWxmIDogdHlwZW9mIGdsb2JhbCA9PT0gJ29iamVjdCcgPyBnbG9iYWwgOiB7fSk7CiAgICBsZXQgbm9kZVByb2Nlc3MgPSB1bmRlZmluZWQ7CiAgICBpZiAodHlwZW9mIGdsb2JhbHMudnNjb2RlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ2xvYmFscy52c2NvZGUucHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAvLyBOYXRpdmUgZW52aXJvbm1lbnQgKHNhbmRib3hlZCkKICAgICAgICBub2RlUHJvY2VzcyA9IGdsb2JhbHMudnNjb2RlLnByb2Nlc3M7CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAvLyBOYXRpdmUgZW52aXJvbm1lbnQgKG5vbi1zYW5kYm94ZWQpCiAgICAgICAgbm9kZVByb2Nlc3MgPSBwcm9jZXNzOwogICAgfQogICAgY29uc3QgaXNFbGVjdHJvblByb2Nlc3MgPSB0eXBlb2YgKChfYSA9IG5vZGVQcm9jZXNzID09PSBudWxsIHx8IG5vZGVQcm9jZXNzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlUHJvY2Vzcy52ZXJzaW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVsZWN0cm9uKSA9PT0gJ3N0cmluZyc7CiAgICBjb25zdCBpc0VsZWN0cm9uUmVuZGVyZXIgPSBpc0VsZWN0cm9uUHJvY2VzcyAmJiAobm9kZVByb2Nlc3MgPT09IG51bGwgfHwgbm9kZVByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vZGVQcm9jZXNzLnR5cGUpID09PSAncmVuZGVyZXInOwogICAgLy8gV2ViIGVudmlyb25tZW50CiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiYgIWlzRWxlY3Ryb25SZW5kZXJlcikgewogICAgICAgIF91c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgICAgIF9pc1dpbmRvd3MgPSBfdXNlckFnZW50LmluZGV4T2YoJ1dpbmRvd3MnKSA+PSAwOwogICAgICAgIF9pc01hY2ludG9zaCA9IF91c2VyQWdlbnQuaW5kZXhPZignTWFjaW50b3NoJykgPj0gMDsKICAgICAgICAoX3VzZXJBZ2VudC5pbmRleE9mKCdNYWNpbnRvc2gnKSA+PSAwIHx8IF91c2VyQWdlbnQuaW5kZXhPZignaVBhZCcpID49IDAgfHwgX3VzZXJBZ2VudC5pbmRleE9mKCdpUGhvbmUnKSA+PSAwKSAmJiAhIW5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwOwogICAgICAgIF9pc0xpbnV4ID0gX3VzZXJBZ2VudC5pbmRleE9mKCdMaW51eCcpID49IDA7CiAgICAgICAgX2xvY2FsZSA9IG5hdmlnYXRvci5sYW5ndWFnZTsKICAgICAgICBfbGFuZ3VhZ2UgPSBfbG9jYWxlOwogICAgfQogICAgLy8gTmF0aXZlIGVudmlyb25tZW50CiAgICBlbHNlIGlmICh0eXBlb2Ygbm9kZVByb2Nlc3MgPT09ICdvYmplY3QnKSB7CiAgICAgICAgX2lzV2luZG93cyA9IChub2RlUHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyk7CiAgICAgICAgX2lzTWFjaW50b3NoID0gKG5vZGVQcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJyk7CiAgICAgICAgX2lzTGludXggPSAobm9kZVByb2Nlc3MucGxhdGZvcm0gPT09ICdsaW51eCcpOwogICAgICAgIF9pc0xpbnV4ICYmICEhbm9kZVByb2Nlc3MuZW52WydTTkFQJ10gJiYgISFub2RlUHJvY2Vzcy5lbnZbJ1NOQVBfUkVWSVNJT04nXTsKICAgICAgICBfbG9jYWxlID0gTEFOR1VBR0VfREVGQVVMVDsKICAgICAgICBfbGFuZ3VhZ2UgPSBMQU5HVUFHRV9ERUZBVUxUOwogICAgICAgIGNvbnN0IHJhd05sc0NvbmZpZyA9IG5vZGVQcm9jZXNzLmVudlsnVlNDT0RFX05MU19DT05GSUcnXTsKICAgICAgICBpZiAocmF3TmxzQ29uZmlnKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBubHNDb25maWcgPSBKU09OLnBhcnNlKHJhd05sc0NvbmZpZyk7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IG5sc0NvbmZpZy5hdmFpbGFibGVMYW5ndWFnZXNbJyonXTsKICAgICAgICAgICAgICAgIF9sb2NhbGUgPSBubHNDb25maWcubG9jYWxlOwogICAgICAgICAgICAgICAgLy8gVlNDb2RlJ3MgZGVmYXVsdCBsYW5ndWFnZSBpcyAnZW4nCiAgICAgICAgICAgICAgICBfbGFuZ3VhZ2UgPSByZXNvbHZlZCA/IHJlc29sdmVkIDogTEFOR1VBR0VfREVGQVVMVDsKICAgICAgICAgICAgICAgIF90cmFuc2xhdGlvbnNDb25maWdGaWxlID0gbmxzQ29uZmlnLl90cmFuc2xhdGlvbnNDb25maWdGaWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvLyBVbmtub3duIGVudmlyb25tZW50CiAgICBlbHNlIHsKICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gcmVzb2x2ZSBwbGF0Zm9ybS4nKTsKICAgIH0KICAgIGNvbnN0IGlzV2luZG93cyA9IF9pc1dpbmRvd3M7CiAgICBjb25zdCBpc01hY2ludG9zaCA9IF9pc01hY2ludG9zaDsKICAgIC8qKgogICAgICogVGhlIGxhbmd1YWdlIHVzZWQgZm9yIHRoZSB1c2VyIGludGVyZmFjZS4gVGhlIGZvcm1hdCBvZgogICAgICogdGhlIHN0cmluZyBpcyBhbGwgbG93ZXIgY2FzZSAoZS5nLiB6aC10dyBmb3IgVHJhZGl0aW9uYWwKICAgICAqIENoaW5lc2UpCiAgICAgKi8KICAgIGNvbnN0IGxhbmd1YWdlID0gX2xhbmd1YWdlOwogICAgLyoqCiAgICAgKiBUaGUgT1MgbG9jYWxlIG9yIHRoZSBsb2NhbGUgc3BlY2lmaWVkIGJ5IC0tbG9jYWxlLiBUaGUgZm9ybWF0IG9mCiAgICAgKiB0aGUgc3RyaW5nIGlzIGFsbCBsb3dlciBjYXNlIChlLmcuIHpoLXR3IGZvciBUcmFkaXRpb25hbAogICAgICogQ2hpbmVzZSkuIFRoZSBVSSBpcyBub3QgbmVjZXNzYXJpbHkgc2hvd24gaW4gdGhlIHByb3ZpZGVkIGxvY2FsZS4KICAgICAqLwogICAgY29uc3QgbG9jYWxlID0gX2xvY2FsZTsKICAgIC8qKgogICAgICogU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjOn46dGV4dD10aGFuJTIwNCUyQyUyMHRoZW4tLHNldCUyMHRpbWVvdXQlMjB0byUyMDQsLS4KICAgICAqCiAgICAgKiBXb3JrcyBzaW1pbGFybHkgdG8gYHNldFRpbWVvdXQoMClgIGJ1dCBkb2Vzbid0IHN1ZmZlciBmcm9tIHRoZSA0bXMgYXJ0aWZpY2lhbCBkZWxheQogICAgICogdGhhdCBicm93c2VycyBzZXQgd2hlbiB0aGUgbmVzdGluZyBsZXZlbCBpcyA+IDUuCiAgICAgKi8KICAgIGNvbnN0IHNldFRpbWVvdXQwID0gKCgpID0+IHsKICAgICAgICBpZiAodHlwZW9mIGdsb2JhbHMucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbicgJiYgIWdsb2JhbHMuaW1wb3J0U2NyaXB0cykgewogICAgICAgICAgICBsZXQgcGVuZGluZyA9IFtdOwogICAgICAgICAgICBnbG9iYWxzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKGUuZGF0YSAmJiBlLmRhdGEudnNjb2RlU2NoZWR1bGVBc3luY1dvcmspIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcGVuZGluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBwZW5kaW5nW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmlkID09PSBlLmRhdGEudnNjb2RlU2NoZWR1bGVBc3luY1dvcmspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlLmNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBsZXQgbGFzdElkID0gMDsKICAgICAgICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gewogICAgICAgICAgICAgICAgY29uc3QgbXlJZCA9ICsrbGFzdElkOwogICAgICAgICAgICAgICAgcGVuZGluZy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBpZDogbXlJZCwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2sKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZ2xvYmFscy5wb3N0TWVzc2FnZSh7IHZzY29kZVNjaGVkdWxlQXN5bmNXb3JrOiBteUlkIH0sICcqJyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiAoY2FsbGJhY2spID0+IHNldFRpbWVvdXQoY2FsbGJhY2spOwogICAgfSkoKTsKICAgICgoZnVuY3Rpb24gZGVmaW5lU2V0SW1tZWRpYXRlKCkgewogICAgICAgIGlmIChnbG9iYWxzLnNldEltbWVkaWF0ZSkgewogICAgICAgICAgICByZXR1cm4gZ2xvYmFscy5zZXRJbW1lZGlhdGUuYmluZChnbG9iYWxzKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxzLnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nICYmICFnbG9iYWxzLmltcG9ydFNjcmlwdHMpIHsKICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQwOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIChub2RlUHJvY2VzcyA9PT0gbnVsbCB8fCBub2RlUHJvY2VzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZVByb2Nlc3MubmV4dFRpY2spID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHJldHVybiBub2RlUHJvY2Vzcy5uZXh0VGljay5iaW5kKG5vZGVQcm9jZXNzKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgX3Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICByZXR1cm4gKGNhbGxiYWNrKSA9PiBfcHJvbWlzZS50aGVuKGNhbGxiYWNrKTsKICAgIH0pKSgpOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY29uc3QgaGFzUGVyZm9ybWFuY2VOb3cgPSAoZ2xvYmFscy5wZXJmb3JtYW5jZSAmJiB0eXBlb2YgZ2xvYmFscy5wZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbicpOwogICAgY2xhc3MgU3RvcFdhdGNoIHsKICAgICAgICBjb25zdHJ1Y3RvcihoaWdoUmVzb2x1dGlvbikgewogICAgICAgICAgICB0aGlzLl9oaWdoUmVzb2x1dGlvbiA9IGhhc1BlcmZvcm1hbmNlTm93ICYmIGhpZ2hSZXNvbHV0aW9uOwogICAgICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSB0aGlzLl9ub3coKTsKICAgICAgICAgICAgdGhpcy5fc3RvcFRpbWUgPSAtMTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGNyZWF0ZShoaWdoUmVzb2x1dGlvbiA9IHRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9wV2F0Y2goaGlnaFJlc29sdXRpb24pOwogICAgICAgIH0KICAgICAgICBzdG9wKCkgewogICAgICAgICAgICB0aGlzLl9zdG9wVGltZSA9IHRoaXMuX25vdygpOwogICAgICAgIH0KICAgICAgICBlbGFwc2VkKCkgewogICAgICAgICAgICBpZiAodGhpcy5fc3RvcFRpbWUgIT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RvcFRpbWUgLSB0aGlzLl9zdGFydFRpbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vdygpIC0gdGhpcy5fc3RhcnRUaW1lOwogICAgICAgIH0KICAgICAgICBfbm93KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGlnaFJlc29sdXRpb24gPyBnbG9iYWxzLnBlcmZvcm1hbmNlLm5vdygpIDogRGF0ZS5ub3coKTsKICAgICAgICB9CiAgICB9CgogICAgdmFyIEV2ZW50OwogICAgKGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIEV2ZW50Lk5vbmUgPSAoKSA9PiBEaXNwb3NhYmxlLk5vbmU7CiAgICAgICAgLyoqCiAgICAgICAgICogR2l2ZW4gYW4gZXZlbnQsIHJldHVybnMgYW5vdGhlciBldmVudCB3aGljaCBvbmx5IGZpcmVzIG9uY2UuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gb25jZShldmVudCkgewogICAgICAgICAgICByZXR1cm4gKGxpc3RlbmVyLCB0aGlzQXJncyA9IG51bGwsIGRpc3Bvc2FibGVzKSA9PiB7CiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRoaXMsIGluIGNhc2UgdGhlIGV2ZW50IGZpcmVzIGR1cmluZyB0aGUgbGlzdGVuZXIgY2FsbAogICAgICAgICAgICAgICAgbGV0IGRpZEZpcmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBldmVudChlID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGlkRmlyZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlkRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5jYWxsKHRoaXNBcmdzLCBlKTsKICAgICAgICAgICAgICAgIH0sIG51bGwsIGRpc3Bvc2FibGVzKTsKICAgICAgICAgICAgICAgIGlmIChkaWRGaXJlKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRpc3Bvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIEV2ZW50Lm9uY2UgPSBvbmNlOwogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIERPIE5PVCB1c2UsIHRoaXMgbGVha3MgbWVtb3J5CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gbWFwKGV2ZW50LCBtYXApIHsKICAgICAgICAgICAgcmV0dXJuIHNuYXBzaG90KChsaXN0ZW5lciwgdGhpc0FyZ3MgPSBudWxsLCBkaXNwb3NhYmxlcykgPT4gZXZlbnQoaSA9PiBsaXN0ZW5lci5jYWxsKHRoaXNBcmdzLCBtYXAoaSkpLCBudWxsLCBkaXNwb3NhYmxlcykpOwogICAgICAgIH0KICAgICAgICBFdmVudC5tYXAgPSBtYXA7CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlcHJlY2F0ZWQgRE8gTk9UIHVzZSwgdGhpcyBsZWFrcyBtZW1vcnkKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBmb3JFYWNoKGV2ZW50LCBlYWNoKSB7CiAgICAgICAgICAgIHJldHVybiBzbmFwc2hvdCgobGlzdGVuZXIsIHRoaXNBcmdzID0gbnVsbCwgZGlzcG9zYWJsZXMpID0+IGV2ZW50KGkgPT4geyBlYWNoKGkpOyBsaXN0ZW5lci5jYWxsKHRoaXNBcmdzLCBpKTsgfSwgbnVsbCwgZGlzcG9zYWJsZXMpKTsKICAgICAgICB9CiAgICAgICAgRXZlbnQuZm9yRWFjaCA9IGZvckVhY2g7CiAgICAgICAgZnVuY3Rpb24gZmlsdGVyKGV2ZW50LCBmaWx0ZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHNuYXBzaG90KChsaXN0ZW5lciwgdGhpc0FyZ3MgPSBudWxsLCBkaXNwb3NhYmxlcykgPT4gZXZlbnQoZSA9PiBmaWx0ZXIoZSkgJiYgbGlzdGVuZXIuY2FsbCh0aGlzQXJncywgZSksIG51bGwsIGRpc3Bvc2FibGVzKSk7CiAgICAgICAgfQogICAgICAgIEV2ZW50LmZpbHRlciA9IGZpbHRlcjsKICAgICAgICAvKioKICAgICAgICAgKiBHaXZlbiBhbiBldmVudCwgcmV0dXJucyB0aGUgc2FtZSBldmVudCBidXQgdHlwZWQgYXMgYEV2ZW50PHZvaWQ+YC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzaWduYWwoZXZlbnQpIHsKICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgICAgIH0KICAgICAgICBFdmVudC5zaWduYWwgPSBzaWduYWw7CiAgICAgICAgZnVuY3Rpb24gYW55KC4uLmV2ZW50cykgewogICAgICAgICAgICByZXR1cm4gKGxpc3RlbmVyLCB0aGlzQXJncyA9IG51bGwsIGRpc3Bvc2FibGVzKSA9PiBjb21iaW5lZERpc3Bvc2FibGUoLi4uZXZlbnRzLm1hcChldmVudCA9PiBldmVudChlID0+IGxpc3RlbmVyLmNhbGwodGhpc0FyZ3MsIGUpLCBudWxsLCBkaXNwb3NhYmxlcykpKTsKICAgICAgICB9CiAgICAgICAgRXZlbnQuYW55ID0gYW55OwogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIERPIE5PVCB1c2UsIHRoaXMgbGVha3MgbWVtb3J5CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gcmVkdWNlKGV2ZW50LCBtZXJnZSwgaW5pdGlhbCkgewogICAgICAgICAgICBsZXQgb3V0cHV0ID0gaW5pdGlhbDsKICAgICAgICAgICAgcmV0dXJuIG1hcChldmVudCwgZSA9PiB7CiAgICAgICAgICAgICAgICBvdXRwdXQgPSBtZXJnZShvdXRwdXQsIGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIEV2ZW50LnJlZHVjZSA9IHJlZHVjZTsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVwcmVjYXRlZCBETyBOT1QgdXNlLCB0aGlzIGxlYWtzIG1lbW9yeQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNuYXBzaG90KGV2ZW50KSB7CiAgICAgICAgICAgIGxldCBsaXN0ZW5lcjsKICAgICAgICAgICAgY29uc3QgZW1pdHRlciA9IG5ldyBFbWl0dGVyKHsKICAgICAgICAgICAgICAgIG9uRmlyc3RMaXN0ZW5lckFkZCgpIHsKICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IGV2ZW50KGVtaXR0ZXIuZmlyZSwgZW1pdHRlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgb25MYXN0TGlzdGVuZXJSZW1vdmUoKSB7CiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGVtaXR0ZXIuZXZlbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIERPIE5PVCB1c2UsIHRoaXMgbGVha3MgbWVtb3J5CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZGVib3VuY2UoZXZlbnQsIG1lcmdlLCBkZWxheSA9IDEwMCwgbGVhZGluZyA9IGZhbHNlLCBsZWFrV2FybmluZ1RocmVzaG9sZCkgewogICAgICAgICAgICBsZXQgc3Vic2NyaXB0aW9uOwogICAgICAgICAgICBsZXQgb3V0cHV0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICBsZXQgaGFuZGxlID0gdW5kZWZpbmVkOwogICAgICAgICAgICBsZXQgbnVtRGVib3VuY2VkQ2FsbHMgPSAwOwogICAgICAgICAgICBjb25zdCBlbWl0dGVyID0gbmV3IEVtaXR0ZXIoewogICAgICAgICAgICAgICAgbGVha1dhcm5pbmdUaHJlc2hvbGQsCiAgICAgICAgICAgICAgICBvbkZpcnN0TGlzdGVuZXJBZGQoKSB7CiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gZXZlbnQoY3VyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVtRGVib3VuY2VkQ2FsbHMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gbWVyZ2Uob3V0cHV0LCBjdXIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVhZGluZyAmJiAhaGFuZGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVyLmZpcmUob3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfb3V0cHV0ID0gb3V0cHV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsZWFkaW5nIHx8IG51bURlYm91bmNlZENhbGxzID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuZmlyZShfb3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bURlYm91bmNlZENhbGxzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZGVsYXkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG9uTGFzdExpc3RlbmVyUmVtb3ZlKCkgewogICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gZW1pdHRlci5ldmVudDsKICAgICAgICB9CiAgICAgICAgRXZlbnQuZGVib3VuY2UgPSBkZWJvdW5jZTsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVwcmVjYXRlZCBETyBOT1QgdXNlLCB0aGlzIGxlYWtzIG1lbW9yeQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGxhdGNoKGV2ZW50LCBlcXVhbHMgPSAoYSwgYikgPT4gYSA9PT0gYikgewogICAgICAgICAgICBsZXQgZmlyc3RDYWxsID0gdHJ1ZTsKICAgICAgICAgICAgbGV0IGNhY2hlOwogICAgICAgICAgICByZXR1cm4gZmlsdGVyKGV2ZW50LCB2YWx1ZSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRFbWl0ID0gZmlyc3RDYWxsIHx8ICFlcXVhbHModmFsdWUsIGNhY2hlKTsKICAgICAgICAgICAgICAgIGZpcnN0Q2FsbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY2FjaGUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIHJldHVybiBzaG91bGRFbWl0OwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgRXZlbnQubGF0Y2ggPSBsYXRjaDsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVwcmVjYXRlZCBETyBOT1QgdXNlLCB0aGlzIGxlYWtzIG1lbW9yeQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNwbGl0KGV2ZW50LCBpc1QpIHsKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgIEV2ZW50LmZpbHRlcihldmVudCwgaXNUKSwKICAgICAgICAgICAgICAgIEV2ZW50LmZpbHRlcihldmVudCwgZSA9PiAhaXNUKGUpKSwKICAgICAgICAgICAgXTsKICAgICAgICB9CiAgICAgICAgRXZlbnQuc3BsaXQgPSBzcGxpdDsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVwcmVjYXRlZCBETyBOT1QgdXNlLCB0aGlzIGxlYWtzIG1lbW9yeQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJ1ZmZlcihldmVudCwgZmx1c2hBZnRlclRpbWVvdXQgPSBmYWxzZSwgX2J1ZmZlciA9IFtdKSB7CiAgICAgICAgICAgIGxldCBidWZmZXIgPSBfYnVmZmVyLnNsaWNlKCk7CiAgICAgICAgICAgIGxldCBsaXN0ZW5lciA9IGV2ZW50KGUgPT4gewogICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW1pdHRlci5maXJlKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29uc3QgZmx1c2ggPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmZvckVhY2goZSA9PiBlbWl0dGVyLmZpcmUoZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnVmZmVyID0gbnVsbDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY29uc3QgZW1pdHRlciA9IG5ldyBFbWl0dGVyKHsKICAgICAgICAgICAgICAgIG9uRmlyc3RMaXN0ZW5lckFkZCgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gZXZlbnQoZSA9PiBlbWl0dGVyLmZpcmUoZSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBvbkZpcnN0TGlzdGVuZXJEaWRBZGQoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmx1c2hBZnRlclRpbWVvdXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZmx1c2gpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBvbkxhc3RMaXN0ZW5lclJlbW92ZSgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gZW1pdHRlci5ldmVudDsKICAgICAgICB9CiAgICAgICAgRXZlbnQuYnVmZmVyID0gYnVmZmVyOwogICAgICAgIGNsYXNzIENoYWluYWJsZUV2ZW50IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoZXZlbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXAoZm4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhaW5hYmxlRXZlbnQobWFwKHRoaXMuZXZlbnQsIGZuKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yRWFjaChmbikgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFpbmFibGVFdmVudChmb3JFYWNoKHRoaXMuZXZlbnQsIGZuKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmlsdGVyKGZuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoYWluYWJsZUV2ZW50KGZpbHRlcih0aGlzLmV2ZW50LCBmbikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZHVjZShtZXJnZSwgaW5pdGlhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFpbmFibGVFdmVudChyZWR1Y2UodGhpcy5ldmVudCwgbWVyZ2UsIGluaXRpYWwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXRjaCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhaW5hYmxlRXZlbnQobGF0Y2godGhpcy5ldmVudCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlYm91bmNlKG1lcmdlLCBkZWxheSA9IDEwMCwgbGVhZGluZyA9IGZhbHNlLCBsZWFrV2FybmluZ1RocmVzaG9sZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFpbmFibGVFdmVudChkZWJvdW5jZSh0aGlzLmV2ZW50LCBtZXJnZSwgZGVsYXksIGxlYWRpbmcsIGxlYWtXYXJuaW5nVGhyZXNob2xkKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb24obGlzdGVuZXIsIHRoaXNBcmdzLCBkaXNwb3NhYmxlcykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQobGlzdGVuZXIsIHRoaXNBcmdzLCBkaXNwb3NhYmxlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb25jZShsaXN0ZW5lciwgdGhpc0FyZ3MsIGRpc3Bvc2FibGVzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb25jZSh0aGlzLmV2ZW50KShsaXN0ZW5lciwgdGhpc0FyZ3MsIGRpc3Bvc2FibGVzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAZGVwcmVjYXRlZCBETyBOT1QgdXNlLCB0aGlzIGxlYWtzIG1lbW9yeQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNoYWluKGV2ZW50KSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhaW5hYmxlRXZlbnQoZXZlbnQpOwogICAgICAgIH0KICAgICAgICBFdmVudC5jaGFpbiA9IGNoYWluOwogICAgICAgIGZ1bmN0aW9uIGZyb21Ob2RlRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGV2ZW50TmFtZSwgbWFwID0gaWQgPT4gaWQpIHsKICAgICAgICAgICAgY29uc3QgZm4gPSAoLi4uYXJncykgPT4gcmVzdWx0LmZpcmUobWFwKC4uLmFyZ3MpKTsKICAgICAgICAgICAgY29uc3Qgb25GaXJzdExpc3RlbmVyQWRkID0gKCkgPT4gZW1pdHRlci5vbihldmVudE5hbWUsIGZuKTsKICAgICAgICAgICAgY29uc3Qgb25MYXN0TGlzdGVuZXJSZW1vdmUgPSAoKSA9PiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgZm4pOwogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgRW1pdHRlcih7IG9uRmlyc3RMaXN0ZW5lckFkZCwgb25MYXN0TGlzdGVuZXJSZW1vdmUgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZXZlbnQ7CiAgICAgICAgfQogICAgICAgIEV2ZW50LmZyb21Ob2RlRXZlbnRFbWl0dGVyID0gZnJvbU5vZGVFdmVudEVtaXR0ZXI7CiAgICAgICAgZnVuY3Rpb24gZnJvbURPTUV2ZW50RW1pdHRlcihlbWl0dGVyLCBldmVudE5hbWUsIG1hcCA9IGlkID0+IGlkKSB7CiAgICAgICAgICAgIGNvbnN0IGZuID0gKC4uLmFyZ3MpID0+IHJlc3VsdC5maXJlKG1hcCguLi5hcmdzKSk7CiAgICAgICAgICAgIGNvbnN0IG9uRmlyc3RMaXN0ZW5lckFkZCA9ICgpID0+IGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZuKTsKICAgICAgICAgICAgY29uc3Qgb25MYXN0TGlzdGVuZXJSZW1vdmUgPSAoKSA9PiBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmbik7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBFbWl0dGVyKHsgb25GaXJzdExpc3RlbmVyQWRkLCBvbkxhc3RMaXN0ZW5lclJlbW92ZSB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5ldmVudDsKICAgICAgICB9CiAgICAgICAgRXZlbnQuZnJvbURPTUV2ZW50RW1pdHRlciA9IGZyb21ET01FdmVudEVtaXR0ZXI7CiAgICAgICAgZnVuY3Rpb24gdG9Qcm9taXNlKGV2ZW50KSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IG9uY2UoZXZlbnQpKHJlc29sdmUpKTsKICAgICAgICB9CiAgICAgICAgRXZlbnQudG9Qcm9taXNlID0gdG9Qcm9taXNlOwogICAgfSkoRXZlbnQgfHwgKEV2ZW50ID0ge30pKTsKICAgIGNsYXNzIEV2ZW50UHJvZmlsaW5nIHsKICAgICAgICBjb25zdHJ1Y3RvcihuYW1lKSB7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyQ291bnQgPSAwOwogICAgICAgICAgICB0aGlzLl9pbnZvY2F0aW9uQ291bnQgPSAwOwogICAgICAgICAgICB0aGlzLl9lbGFwc2VkT3ZlcmFsbCA9IDA7CiAgICAgICAgICAgIHRoaXMuX25hbWUgPSBgJHtuYW1lfV8ke0V2ZW50UHJvZmlsaW5nLl9pZFBvb2wrK31gOwogICAgICAgIH0KICAgICAgICBzdGFydChsaXN0ZW5lckNvdW50KSB7CiAgICAgICAgICAgIHRoaXMuX3N0b3BXYXRjaCA9IG5ldyBTdG9wV2F0Y2godHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50OwogICAgICAgIH0KICAgICAgICBzdG9wKCkgewogICAgICAgICAgICBpZiAodGhpcy5fc3RvcFdhdGNoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gdGhpcy5fc3RvcFdhdGNoLmVsYXBzZWQoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2VsYXBzZWRPdmVyYWxsICs9IGVsYXBzZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnZvY2F0aW9uQ291bnQgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgZGlkIEZJUkUgJHt0aGlzLl9uYW1lfTogZWxhcHNlZF9tczogJHtlbGFwc2VkLnRvRml4ZWQoNSl9LCBsaXN0ZW5lcjogJHt0aGlzLl9saXN0ZW5lckNvdW50fSAoZWxhcHNlZF9vdmVyYWxsOiAke3RoaXMuX2VsYXBzZWRPdmVyYWxsLnRvRml4ZWQoMil9LCBpbnZvY2F0aW9uczogJHt0aGlzLl9pbnZvY2F0aW9uQ291bnR9KWApOwogICAgICAgICAgICAgICAgdGhpcy5fc3RvcFdhdGNoID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgRXZlbnRQcm9maWxpbmcuX2lkUG9vbCA9IDA7CiAgICAvKioKICAgICAqIFRoZSBFbWl0dGVyIGNhbiBiZSB1c2VkIHRvIGV4cG9zZSBhbiBFdmVudCB0byB0aGUgcHVibGljCiAgICAgKiB0byBmaXJlIGl0IGZyb20gdGhlIGluc2lkZXMuCiAgICAgKiBTYW1wbGU6CiAgICAgICAgY2xhc3MgRG9jdW1lbnQgewoKICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfb25EaWRDaGFuZ2UgPSBuZXcgRW1pdHRlcjwodmFsdWU6c3RyaW5nKT0+YW55PigpOwoKICAgICAgICAgICAgcHVibGljIG9uRGlkQ2hhbmdlID0gdGhpcy5fb25EaWRDaGFuZ2UuZXZlbnQ7CgogICAgICAgICAgICAvLyBnZXR0ZXItc3R5bGUKICAgICAgICAgICAgLy8gZ2V0IG9uRGlkQ2hhbmdlKCk6IEV2ZW50PCh2YWx1ZTpzdHJpbmcpPT5hbnk+IHsKICAgICAgICAgICAgLy8gCXJldHVybiB0aGlzLl9vbkRpZENoYW5nZS5ldmVudDsKICAgICAgICAgICAgLy8gfQoKICAgICAgICAgICAgcHJpdmF0ZSBfZG9JdCgpIHsKICAgICAgICAgICAgICAgIC8vLi4uCiAgICAgICAgICAgICAgICB0aGlzLl9vbkRpZENoYW5nZS5maXJlKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAqLwogICAgY2xhc3MgRW1pdHRlciB7CiAgICAgICAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICB0aGlzLl9sZWFrYWdlTW9uID0gdW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLl9wZXJmTW9uID0gKChfYSA9IHRoaXMuX29wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5fcHJvZk5hbWUpID8gbmV3IEV2ZW50UHJvZmlsaW5nKHRoaXMuX29wdGlvbnMuX3Byb2ZOYW1lKSA6IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIHRoZSBwdWJsaWMgdG8gYWxsb3cgdG8gc3Vic2NyaWJlCiAgICAgICAgICogdG8gZXZlbnRzIGZyb20gdGhpcyBFbWl0dGVyCiAgICAgICAgICovCiAgICAgICAgZ2V0IGV2ZW50KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2V2ZW50KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudCA9IChsaXN0ZW5lciwgdGhpc0FyZ3MsIGRpc3Bvc2FibGVzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9hOwogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IG5ldyBMaW5rZWRMaXN0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0TGlzdGVuZXIgPSB0aGlzLl9saXN0ZW5lcnMuaXNFbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdExpc3RlbmVyICYmIHRoaXMuX29wdGlvbnMgJiYgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZSA9IHRoaXMuX2xpc3RlbmVycy5wdXNoKCF0aGlzQXJncyA/IGxpc3RlbmVyIDogW2xpc3RlbmVyLCB0aGlzQXJnc10pOwogICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdExpc3RlbmVyICYmIHRoaXMuX29wdGlvbnMgJiYgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJEaWRBZGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJEaWRBZGQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MaXN0ZW5lckRpZEFkZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLm9uTGlzdGVuZXJEaWRBZGQodGhpcywgbGlzdGVuZXIsIHRoaXNBcmdzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYW5kIHJlY29yZCB0aGlzIGVtaXR0ZXIgZm9yIHBvdGVudGlhbCBsZWFrYWdlCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlTW9uaXRvciA9IChfYSA9IHRoaXMuX2xlYWthZ2VNb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGVjayh0aGlzLl9saXN0ZW5lcnMuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdG9EaXNwb3NhYmxlKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZU1vbml0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU1vbml0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2Rpc3Bvc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNMaXN0ZW5lcnMgPSAodGhpcy5fbGlzdGVuZXJzICYmICF0aGlzLl9saXN0ZW5lcnMuaXNFbXB0eSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0xpc3RlbmVycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLm9uTGFzdExpc3RlbmVyUmVtb3ZlKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGlmIChkaXNwb3NhYmxlcyBpbnN0YW5jZW9mIERpc3Bvc2FibGVTdG9yZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5hZGQocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkaXNwb3NhYmxlcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zYWJsZXMucHVzaChyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRvIGJlIGtlcHQgcHJpdmF0ZSB0byBmaXJlIGFuIGV2ZW50IHRvCiAgICAgICAgICogc3Vic2NyaWJlcnMKICAgICAgICAgKi8KICAgICAgICBmaXJlKGV2ZW50KSB7CiAgICAgICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgIC8vIHB1dCBhbGwgW2xpc3RlbmVyLGV2ZW50XS1wYWlycyBpbnRvIGRlbGl2ZXJ5IHF1ZXVlCiAgICAgICAgICAgICAgICAvLyB0aGVuIGVtaXQgYWxsIGV2ZW50LiBhbiBpbm5lci9uZXN0ZWQgZXZlbnQgbWlnaHQgYmUKICAgICAgICAgICAgICAgIC8vIHRoZSBkcml2ZXIgb2YgdGhpcwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9kZWxpdmVyeVF1ZXVlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlRdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiB0aGlzLl9saXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVF1ZXVlLnB1c2goW2xpc3RlbmVyLCBldmVudF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gc3RhcnQvc3RvcCBwZXJmb3JtYW5jZSBpbnNpZ2h0IGNvbGxlY3Rpb24KICAgICAgICAgICAgICAgIChfYSA9IHRoaXMuX3BlcmZNb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGFydCh0aGlzLl9kZWxpdmVyeVF1ZXVlLnNpemUpOwogICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2RlbGl2ZXJ5UXVldWUuc2l6ZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBbbGlzdGVuZXIsIGV2ZW50XSA9IHRoaXMuX2RlbGl2ZXJ5UXVldWUuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHVuZGVmaW5lZCwgZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJbMF0uY2FsbChsaXN0ZW5lclsxXSwgZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uVW5leHBlY3RlZEVycm9yKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIChfYiA9IHRoaXMuX3BlcmZNb24pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZGlzcG9zZSgpIHsKICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXNwb3NlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgKF9hID0gdGhpcy5fbGlzdGVuZXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xlYXIoKTsKICAgICAgICAgICAgICAgIChfYiA9IHRoaXMuX2RlbGl2ZXJ5UXVldWUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jbGVhcigpOwogICAgICAgICAgICAgICAgKF9kID0gKF9jID0gdGhpcy5fb3B0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLm9uTGFzdExpc3RlbmVyUmVtb3ZlKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY2FsbChfYyk7CiAgICAgICAgICAgICAgICAoX2UgPSB0aGlzLl9sZWFrYWdlTW9uKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UuZGlzcG9zZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyIGlzIGEgSmF2YVNjcmlwdCBBcnJheSBvciBub3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEFsbFByb3BlcnR5TmFtZXMob2JqKSB7CiAgICAgICAgbGV0IHJlcyA9IFtdOwogICAgICAgIGxldCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopOwogICAgICAgIHdoaWxlIChPYmplY3QucHJvdG90eXBlICE9PSBwcm90bykgewogICAgICAgICAgICByZXMgPSByZXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKSk7CiAgICAgICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEFsbE1ldGhvZE5hbWVzKG9iaikgewogICAgICAgIGNvbnN0IG1ldGhvZHMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZ2V0QWxsUHJvcGVydHlOYW1lcyhvYmopKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqW3Byb3BdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICBtZXRob2RzLnB1c2gocHJvcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1ldGhvZHM7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVQcm94eU9iamVjdCQxKG1ldGhvZE5hbWVzLCBpbnZva2UpIHsKICAgICAgICBjb25zdCBjcmVhdGVQcm94eU1ldGhvZCA9IChtZXRob2QpID0+IHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApOwogICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZShtZXRob2QsIGFyZ3MpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgbGV0IHJlc3VsdCA9IHt9OwogICAgICAgIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBtZXRob2ROYW1lcykgewogICAgICAgICAgICByZXN1bHRbbWV0aG9kTmFtZV0gPSBjcmVhdGVQcm94eU1ldGhvZChtZXRob2ROYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIGFzc2VydE5ldmVyKHZhbHVlLCBtZXNzYWdlID0gJ1VucmVhY2hhYmxlJykgewogICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIC8qKgogICAgICogRXNjYXBlcyByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVycyBpbiBhIGdpdmVuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVSZWdFeHBDaGFyYWN0ZXJzKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXFx7XH1cKlwrXD9cfFxeXCRcLlxbXF1cKFwpXS9nLCAnXFwkJicpOwogICAgfQogICAgZnVuY3Rpb24gc3BsaXRMaW5lcyhzdHIpIHsKICAgICAgICByZXR1cm4gc3RyLnNwbGl0KC9cclxufFxyfFxuLyk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgZmlyc3QgaW5kZXggb2YgdGhlIHN0cmluZyB0aGF0IGlzIG5vdCB3aGl0ZXNwYWNlLgogICAgICogSWYgc3RyaW5nIGlzIGVtcHR5IG9yIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMsIHJldHVybnMgLTEKICAgICAqLwogICAgZnVuY3Rpb24gZmlyc3ROb25XaGl0ZXNwYWNlSW5kZXgoc3RyKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBjb25zdCBjaENvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKGNoQ29kZSAhPT0gMzIgLyogU3BhY2UgKi8gJiYgY2hDb2RlICE9PSA5IC8qIFRhYiAqLykgewogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGxhc3QgaW5kZXggb2YgdGhlIHN0cmluZyB0aGF0IGlzIG5vdCB3aGl0ZXNwYWNlLgogICAgICogSWYgc3RyaW5nIGlzIGVtcHR5IG9yIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMsIHJldHVybnMgLTEKICAgICAqLwogICAgZnVuY3Rpb24gbGFzdE5vbldoaXRlc3BhY2VJbmRleChzdHIsIHN0YXJ0SW5kZXggPSBzdHIubGVuZ3RoIC0gMSkgewogICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpID49IDA7IGktLSkgewogICAgICAgICAgICBjb25zdCBjaENvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKGNoQ29kZSAhPT0gMzIgLyogU3BhY2UgKi8gJiYgY2hDb2RlICE9PSA5IC8qIFRhYiAqLykgewogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZnVuY3Rpb24gY29tcGFyZVN1YnN0cmluZyhhLCBiLCBhU3RhcnQgPSAwLCBhRW5kID0gYS5sZW5ndGgsIGJTdGFydCA9IDAsIGJFbmQgPSBiLmxlbmd0aCkgewogICAgICAgIGZvciAoOyBhU3RhcnQgPCBhRW5kICYmIGJTdGFydCA8IGJFbmQ7IGFTdGFydCsrLCBiU3RhcnQrKykgewogICAgICAgICAgICBsZXQgY29kZUEgPSBhLmNoYXJDb2RlQXQoYVN0YXJ0KTsKICAgICAgICAgICAgbGV0IGNvZGVCID0gYi5jaGFyQ29kZUF0KGJTdGFydCk7CiAgICAgICAgICAgIGlmIChjb2RlQSA8IGNvZGVCKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY29kZUEgPiBjb2RlQikgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYUxlbiA9IGFFbmQgLSBhU3RhcnQ7CiAgICAgICAgY29uc3QgYkxlbiA9IGJFbmQgLSBiU3RhcnQ7CiAgICAgICAgaWYgKGFMZW4gPCBiTGVuKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYUxlbiA+IGJMZW4pIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgfQogICAgZnVuY3Rpb24gY29tcGFyZVN1YnN0cmluZ0lnbm9yZUNhc2UoYSwgYiwgYVN0YXJ0ID0gMCwgYUVuZCA9IGEubGVuZ3RoLCBiU3RhcnQgPSAwLCBiRW5kID0gYi5sZW5ndGgpIHsKICAgICAgICBmb3IgKDsgYVN0YXJ0IDwgYUVuZCAmJiBiU3RhcnQgPCBiRW5kOyBhU3RhcnQrKywgYlN0YXJ0KyspIHsKICAgICAgICAgICAgbGV0IGNvZGVBID0gYS5jaGFyQ29kZUF0KGFTdGFydCk7CiAgICAgICAgICAgIGxldCBjb2RlQiA9IGIuY2hhckNvZGVBdChiU3RhcnQpOwogICAgICAgICAgICBpZiAoY29kZUEgPT09IGNvZGVCKSB7CiAgICAgICAgICAgICAgICAvLyBlcXVhbAogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNvZGVBID49IDEyOCB8fCBjb2RlQiA+PSAxMjgpIHsKICAgICAgICAgICAgICAgIC8vIG5vdCBBU0NJSSBsZXR0ZXJzIC0+IGZhbGxiYWNrIHRvIGxvd2VyLWNhc2luZyBzdHJpbmdzCiAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZVN1YnN0cmluZyhhLnRvTG93ZXJDYXNlKCksIGIudG9Mb3dlckNhc2UoKSwgYVN0YXJ0LCBhRW5kLCBiU3RhcnQsIGJFbmQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1hcHBlciBsb3dlci1jYXNlIGFzY2lpIGxldHRlciBvbnRvIHVwcGVyLWNhc2UgdmFyaW5hdHMKICAgICAgICAgICAgLy8gWzk3LTEyMl0gKGxvd2VyIGFzY2lpKSAtLT4gWzY1LTkwXSAodXBwZXIgYXNjaWkpCiAgICAgICAgICAgIGlmIChpc0xvd2VyQXNjaWlMZXR0ZXIoY29kZUEpKSB7CiAgICAgICAgICAgICAgICBjb2RlQSAtPSAzMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNMb3dlckFzY2lpTGV0dGVyKGNvZGVCKSkgewogICAgICAgICAgICAgICAgY29kZUIgLT0gMzI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gY29tcGFyZSBib3RoIGNvZGUgcG9pbnRzCiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBjb2RlQSAtIGNvZGVCOwogICAgICAgICAgICBpZiAoZGlmZiA9PT0gMCkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRpZmY7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFMZW4gPSBhRW5kIC0gYVN0YXJ0OwogICAgICAgIGNvbnN0IGJMZW4gPSBiRW5kIC0gYlN0YXJ0OwogICAgICAgIGlmIChhTGVuIDwgYkxlbikgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFMZW4gPiBiTGVuKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTG93ZXJBc2NpaUxldHRlcihjb2RlKSB7CiAgICAgICAgcmV0dXJuIGNvZGUgPj0gOTcgLyogYSAqLyAmJiBjb2RlIDw9IDEyMiAvKiB6ICovOwogICAgfQogICAgZnVuY3Rpb24gaXNVcHBlckFzY2lpTGV0dGVyKGNvZGUpIHsKICAgICAgICByZXR1cm4gY29kZSA+PSA2NSAvKiBBICovICYmIGNvZGUgPD0gOTAgLyogWiAqLzsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXJ0c1dpdGhJZ25vcmVDYXNlKHN0ciwgY2FuZGlkYXRlKSB7CiAgICAgICAgY29uc3QgY2FuZGlkYXRlTGVuZ3RoID0gY2FuZGlkYXRlLmxlbmd0aDsKICAgICAgICBpZiAoY2FuZGlkYXRlLmxlbmd0aCA+IHN0ci5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29tcGFyZVN1YnN0cmluZ0lnbm9yZUNhc2Uoc3RyLCBjYW5kaWRhdGUsIDAsIGNhbmRpZGF0ZUxlbmd0aCkgPT09IDA7CiAgICB9CiAgICAvKioKICAgICAqIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N1cnJvZ2F0ZV9wYWlyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzSGlnaFN1cnJvZ2F0ZShjaGFyQ29kZSkgewogICAgICAgIHJldHVybiAoMHhEODAwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4REJGRik7CiAgICB9CiAgICAvKioKICAgICAqIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N1cnJvZ2F0ZV9wYWlyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzTG93U3Vycm9nYXRlKGNoYXJDb2RlKSB7CiAgICAgICAgcmV0dXJuICgweERDMDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHhERkZGKTsKICAgIH0KICAgIC8qKgogICAgICogU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3Vycm9nYXRlX3BhaXIKICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZUNvZGVQb2ludChoaWdoU3Vycm9nYXRlLCBsb3dTdXJyb2dhdGUpIHsKICAgICAgICByZXR1cm4gKChoaWdoU3Vycm9nYXRlIC0gMHhEODAwKSA8PCAxMCkgKyAobG93U3Vycm9nYXRlIC0gMHhEQzAwKSArIDB4MTAwMDA7CiAgICB9CiAgICAvKioKICAgICAqIGdldCB0aGUgY29kZSBwb2ludCB0aGF0IGJlZ2lucyBhdCBvZmZzZXQgYG9mZnNldGAKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TmV4dENvZGVQb2ludChzdHIsIGxlbiwgb2Zmc2V0KSB7CiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChvZmZzZXQpOwogICAgICAgIGlmIChpc0hpZ2hTdXJyb2dhdGUoY2hhckNvZGUpICYmIG9mZnNldCArIDEgPCBsZW4pIHsKICAgICAgICAgICAgY29uc3QgbmV4dENoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSk7CiAgICAgICAgICAgIGlmIChpc0xvd1N1cnJvZ2F0ZShuZXh0Q2hhckNvZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29tcHV0ZUNvZGVQb2ludChjaGFyQ29kZSwgbmV4dENoYXJDb2RlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2hhckNvZGU7CiAgICB9CiAgICBjbGFzcyBBbWJpZ3VvdXNDaGFyYWN0ZXJzIHsKICAgICAgICBzdGF0aWMgZ2V0RGF0YSgpIHsKICAgICAgICAgICAgLy8gU3RvcmVkIGFzIGtleTEsIHZhbHVlMSwga2V5MiwgdmFsdWUyLCAuLi4KICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoJ3tcIl9jb21tb25cIjpbODIzMiwzMiw4MjMzLDMyLDU3NjAsMzIsODE5MiwzMiw4MTkzLDMyLDgxOTQsMzIsODE5NSwzMiw4MTk2LDMyLDgxOTcsMzIsODE5OCwzMiw4MjAwLDMyLDgyMDEsMzIsODIwMiwzMiw4Mjg3LDMyLDgxOTksMzIsODIzOSwzMiwyMDQyLDk1LDY1MTAxLDk1LDY1MTAyLDk1LDY1MTAzLDk1LDgyMDgsNDUsODIwOSw0NSw4MjEwLDQ1LDY1MTEyLDQ1LDE3NDgsNDUsODI1OSw0NSw3MjcsNDUsODcyMiw0NSwxMDEzNCw0NSwxMTQ1MCw0NSwxNTQ5LDQ0LDE2NDMsNDQsODIxOCw0NCwxODQsNDQsNDIyMzMsNDQsODk0LDU5LDIzMDcsNTgsMjY5MSw1OCwxNDE3LDU4LDE3OTUsNTgsMTc5Niw1OCw1ODY4LDU4LDY1MDcyLDU4LDYxNDcsNTgsNjE1Myw1OCw4MjgyLDU4LDE0NzUsNTgsNzYwLDU4LDQyODg5LDU4LDg3NTgsNTgsNzIwLDU4LDQyMjM3LDU4LDQ1MSwzMywxMTYwMSwzMyw2NjAsNjMsNTc3LDYzLDI0MjksNjMsNTAzOCw2Myw0MjczMSw2MywxMTkxNDksNDYsODIyOCw0NiwxNzkzLDQ2LDE3OTQsNDYsNDI1MTAsNDYsNjgxNzYsNDYsMTYzMiw0NiwxNzc2LDQ2LDQyMjMyLDQ2LDEzNzMsOTYsNjUyODcsOTYsODIxOSw5Niw4MjQyLDk2LDEzNzAsOTYsMTUyMyw5Niw4MTc1LDk2LDY1MzQ0LDk2LDkwMCw5Niw4MTg5LDk2LDgxMjUsOTYsODEyNyw5Niw4MTkwLDk2LDY5Nyw5Niw4ODQsOTYsNzEyLDk2LDcxNCw5Niw3MTUsOTYsNzU2LDk2LDY5OSw5Niw3MDEsOTYsNzAwLDk2LDcwMiw5Niw0Mjg5Miw5NiwxNDk3LDk2LDIwMzYsOTYsMjAzNyw5Niw1MTk0LDk2LDU4MzYsOTYsOTQwMzMsOTYsOTQwMzQsOTYsNjUzMzksNDAsMTAwODgsNDAsMTAwOTgsNDAsMTIzMDgsNDAsNjQ4MzAsNDAsNjUzNDEsNDEsMTAwODksNDEsMTAwOTksNDEsMTIzMDksNDEsNjQ4MzEsNDEsMTAxMDAsMTIzLDExOTA2MCwxMjMsMTAxMDEsMTI1LDgyNzAsNDIsMTY0NSw0Miw4NzI3LDQyLDY2MzM1LDQyLDU5NDEsNDcsODI1Nyw0Nyw4NzI1LDQ3LDgyNjAsNDcsOTU4NSw0NywxMDE4Nyw0NywxMDc0NCw0NywxMTkzNTQsNDcsMTI3NTUsNDcsMTIzMzksNDcsMTE0NjIsNDcsMjAwMzEsNDcsMTIwMzUsNDcsNjUzNDAsOTIsNjUxMjgsOTIsODcyNiw5MiwxMDE4OSw5MiwxMDc0MSw5MiwxMDc0NSw5MiwxMTkzMTEsOTIsMTE5MzU1LDkyLDEyNzU2LDkyLDIwMDIyLDkyLDEyMDM0LDkyLDQyODcyLDM4LDcwOCw5NCw3MTAsOTQsNTg2OSw0MywxMDEzMyw0Myw2NjIwMyw0Myw4MjQ5LDYwLDEwMDk0LDYwLDcwNiw2MCwxMTkzNTAsNjAsNTE3Niw2MCw1ODEwLDYwLDUxMjAsNjEsMTE4NDAsNjEsMTI0NDgsNjEsNDIyMzksNjEsODI1MCw2MiwxMDA5NSw2Miw3MDcsNjIsMTE5MzUxLDYyLDUxNzEsNjIsOTQwMTUsNjIsODI3NSwxMjYsNzMyLDEyNiw4MTI4LDEyNiw4NzY0LDEyNiwxMjA3ODQsNTAsMTIwNzk0LDUwLDEyMDgwNCw1MCwxMjA4MTQsNTAsMTIwODI0LDUwLDEzMDAzNCw1MCw0Mjg0Miw1MCw0MjMsNTAsMTAwMCw1MCw0MjU2NCw1MCw1MzExLDUwLDQyNzM1LDUwLDExOTMwMiw1MSwxMjA3ODUsNTEsMTIwNzk1LDUxLDEyMDgwNSw1MSwxMjA4MTUsNTEsMTIwODI1LDUxLDEzMDAzNSw1MSw0MjkyMyw1MSw1NDAsNTEsNDM5LDUxLDQyODU4LDUxLDExNDY4LDUxLDEyNDgsNTEsOTQwMTEsNTEsNzE4ODIsNTEsMTIwNzg2LDUyLDEyMDc5Niw1MiwxMjA4MDYsNTIsMTIwODE2LDUyLDEyMDgyNiw1MiwxMzAwMzYsNTIsNTA3MCw1Miw3MTg1NSw1MiwxMjA3ODcsNTMsMTIwNzk3LDUzLDEyMDgwNyw1MywxMjA4MTcsNTMsMTIwODI3LDUzLDEzMDAzNyw1Myw0NDQsNTMsNzE4NjcsNTMsMTIwNzg4LDU0LDEyMDc5OCw1NCwxMjA4MDgsNTQsMTIwODE4LDU0LDEyMDgyOCw1NCwxMzAwMzgsNTQsMTE0NzQsNTQsNTEwMiw1NCw3MTg5Myw1NCwxMTkzMTQsNTUsMTIwNzg5LDU1LDEyMDc5OSw1NSwxMjA4MDksNTUsMTIwODE5LDU1LDEyMDgyOSw1NSwxMzAwMzksNTUsNjY3NzAsNTUsNzE4NzgsNTUsMjgxOSw1NiwyNTM4LDU2LDI2NjYsNTYsMTI1MTMxLDU2LDEyMDc5MCw1NiwxMjA4MDAsNTYsMTIwODEwLDU2LDEyMDgyMCw1NiwxMjA4MzAsNTYsMTMwMDQwLDU2LDU0Nyw1Niw1NDYsNTYsNjYzMzAsNTYsMjY2Myw1NywyOTIwLDU3LDI1NDEsNTcsMzQzNyw1NywxMjA3OTEsNTcsMTIwODAxLDU3LDEyMDgxMSw1NywxMjA4MjEsNTcsMTIwODMxLDU3LDEzMDA0MSw1Nyw0Mjg2Miw1NywxMTQ2Niw1Nyw3MTg4NCw1Nyw3MTg1Miw1Nyw3MTg5NCw1Nyw5MDgyLDk3LDY1MzQ1LDk3LDExOTgzNCw5NywxMTk4ODYsOTcsMTE5OTM4LDk3LDExOTk5MCw5NywxMjAwNDIsOTcsMTIwMDk0LDk3LDEyMDE0Niw5NywxMjAxOTgsOTcsMTIwMjUwLDk3LDEyMDMwMiw5NywxMjAzNTQsOTcsMTIwNDA2LDk3LDEyMDQ1OCw5Nyw1OTMsOTcsOTQ1LDk3LDEyMDUxNCw5NywxMjA1NzIsOTcsMTIwNjMwLDk3LDEyMDY4OCw5NywxMjA3NDYsOTcsNjUzMTMsNjUsMTE5ODA4LDY1LDExOTg2MCw2NSwxMTk5MTIsNjUsMTE5OTY0LDY1LDEyMDAxNiw2NSwxMjAwNjgsNjUsMTIwMTIwLDY1LDEyMDE3Miw2NSwxMjAyMjQsNjUsMTIwMjc2LDY1LDEyMDMyOCw2NSwxMjAzODAsNjUsMTIwNDMyLDY1LDkxMyw2NSwxMjA0ODgsNjUsMTIwNTQ2LDY1LDEyMDYwNCw2NSwxMjA2NjIsNjUsMTIwNzIwLDY1LDUwMzQsNjUsNTU3Myw2NSw0MjIyMiw2NSw5NDAxNiw2NSw2NjIwOCw2NSwxMTk4MzUsOTgsMTE5ODg3LDk4LDExOTkzOSw5OCwxMTk5OTEsOTgsMTIwMDQzLDk4LDEyMDA5NSw5OCwxMjAxNDcsOTgsMTIwMTk5LDk4LDEyMDI1MSw5OCwxMjAzMDMsOTgsMTIwMzU1LDk4LDEyMDQwNyw5OCwxMjA0NTksOTgsMzg4LDk4LDUwNzEsOTgsNTIzNCw5OCw1NTUxLDk4LDY1MzE0LDY2LDg0OTIsNjYsMTE5ODA5LDY2LDExOTg2MSw2NiwxMTk5MTMsNjYsMTIwMDE3LDY2LDEyMDA2OSw2NiwxMjAxMjEsNjYsMTIwMTczLDY2LDEyMDIyNSw2NiwxMjAyNzcsNjYsMTIwMzI5LDY2LDEyMDM4MSw2NiwxMjA0MzMsNjYsNDI5MzIsNjYsOTE0LDY2LDEyMDQ4OSw2NiwxMjA1NDcsNjYsMTIwNjA1LDY2LDEyMDY2Myw2NiwxMjA3MjEsNjYsNTEwOCw2Niw1NjIzLDY2LDQyMTkyLDY2LDY2MTc4LDY2LDY2MjA5LDY2LDY2MzA1LDY2LDY1MzQ3LDk5LDg1NzMsOTksMTE5ODM2LDk5LDExOTg4OCw5OSwxMTk5NDAsOTksMTE5OTkyLDk5LDEyMDA0NCw5OSwxMjAwOTYsOTksMTIwMTQ4LDk5LDEyMDIwMCw5OSwxMjAyNTIsOTksMTIwMzA0LDk5LDEyMDM1Niw5OSwxMjA0MDgsOTksMTIwNDYwLDk5LDc0MjgsOTksMTAxMCw5OSwxMTQyOSw5OSw0Mzk1MSw5OSw2NjYyMSw5OSwxMjg4NDQsNjcsNzE5MjIsNjcsNzE5MTMsNjcsNjUzMTUsNjcsODU1Nyw2Nyw4NDUwLDY3LDg0OTMsNjcsMTE5ODEwLDY3LDExOTg2Miw2NywxMTk5MTQsNjcsMTE5OTY2LDY3LDEyMDAxOCw2NywxMjAxNzQsNjcsMTIwMjI2LDY3LDEyMDI3OCw2NywxMjAzMzAsNjcsMTIwMzgyLDY3LDEyMDQzNCw2NywxMDE3LDY3LDExNDI4LDY3LDUwODcsNjcsNDIyMDIsNjcsNjYyMTAsNjcsNjYzMDYsNjcsNjY1ODEsNjcsNjY4NDQsNjcsODU3NCwxMDAsODUxOCwxMDAsMTE5ODM3LDEwMCwxMTk4ODksMTAwLDExOTk0MSwxMDAsMTE5OTkzLDEwMCwxMjAwNDUsMTAwLDEyMDA5NywxMDAsMTIwMTQ5LDEwMCwxMjAyMDEsMTAwLDEyMDI1MywxMDAsMTIwMzA1LDEwMCwxMjAzNTcsMTAwLDEyMDQwOSwxMDAsMTIwNDYxLDEwMCwxMjgxLDEwMCw1MDk1LDEwMCw1MjMxLDEwMCw0MjE5NCwxMDAsODU1OCw2OCw4NTE3LDY4LDExOTgxMSw2OCwxMTk4NjMsNjgsMTE5OTE1LDY4LDExOTk2Nyw2OCwxMjAwMTksNjgsMTIwMDcxLDY4LDEyMDEyMyw2OCwxMjAxNzUsNjgsMTIwMjI3LDY4LDEyMDI3OSw2OCwxMjAzMzEsNjgsMTIwMzgzLDY4LDEyMDQzNSw2OCw1MDI0LDY4LDU1OTgsNjgsNTYxMCw2OCw0MjE5NSw2OCw4NDk0LDEwMSw2NTM0OSwxMDEsODQ5NSwxMDEsODUxOSwxMDEsMTE5ODM4LDEwMSwxMTk4OTAsMTAxLDExOTk0MiwxMDEsMTIwMDQ2LDEwMSwxMjAwOTgsMTAxLDEyMDE1MCwxMDEsMTIwMjAyLDEwMSwxMjAyNTQsMTAxLDEyMDMwNiwxMDEsMTIwMzU4LDEwMSwxMjA0MTAsMTAxLDEyMDQ2MiwxMDEsNDM4MjYsMTAxLDEyMTMsMTAxLDg5NTksNjksNjUzMTcsNjksODQ5Niw2OSwxMTk4MTIsNjksMTE5ODY0LDY5LDExOTkxNiw2OSwxMjAwMjAsNjksMTIwMDcyLDY5LDEyMDEyNCw2OSwxMjAxNzYsNjksMTIwMjI4LDY5LDEyMDI4MCw2OSwxMjAzMzIsNjksMTIwMzg0LDY5LDEyMDQzNiw2OSw5MTcsNjksMTIwNDkyLDY5LDEyMDU1MCw2OSwxMjA2MDgsNjksMTIwNjY2LDY5LDEyMDcyNCw2OSwxMTU3Nyw2OSw1MDM2LDY5LDQyMjI0LDY5LDcxODQ2LDY5LDcxODU0LDY5LDY2MTgyLDY5LDExOTgzOSwxMDIsMTE5ODkxLDEwMiwxMTk5NDMsMTAyLDExOTk5NSwxMDIsMTIwMDQ3LDEwMiwxMjAwOTksMTAyLDEyMDE1MSwxMDIsMTIwMjAzLDEwMiwxMjAyNTUsMTAyLDEyMDMwNywxMDIsMTIwMzU5LDEwMiwxMjA0MTEsMTAyLDEyMDQ2MywxMDIsNDM4MjksMTAyLDQyOTA1LDEwMiwzODMsMTAyLDc4MzcsMTAyLDE0MTIsMTAyLDExOTMxNSw3MCw4NDk3LDcwLDExOTgxMyw3MCwxMTk4NjUsNzAsMTE5OTE3LDcwLDEyMDAyMSw3MCwxMjAwNzMsNzAsMTIwMTI1LDcwLDEyMDE3Nyw3MCwxMjAyMjksNzAsMTIwMjgxLDcwLDEyMDMzMyw3MCwxMjAzODUsNzAsMTIwNDM3LDcwLDQyOTA0LDcwLDk4OCw3MCwxMjA3NzgsNzAsNTU1Niw3MCw0MjIwNSw3MCw3MTg3NCw3MCw3MTg0Miw3MCw2NjE4Myw3MCw2NjIxMyw3MCw2Njg1Myw3MCw2NTM1MSwxMDMsODQ1OCwxMDMsMTE5ODQwLDEwMywxMTk4OTIsMTAzLDExOTk0NCwxMDMsMTIwMDQ4LDEwMywxMjAxMDAsMTAzLDEyMDE1MiwxMDMsMTIwMjA0LDEwMywxMjAyNTYsMTAzLDEyMDMwOCwxMDMsMTIwMzYwLDEwMywxMjA0MTIsMTAzLDEyMDQ2NCwxMDMsNjA5LDEwMyw3NTU1LDEwMywzOTcsMTAzLDE0MDksMTAzLDExOTgxNCw3MSwxMTk4NjYsNzEsMTE5OTE4LDcxLDExOTk3MCw3MSwxMjAwMjIsNzEsMTIwMDc0LDcxLDEyMDEyNiw3MSwxMjAxNzgsNzEsMTIwMjMwLDcxLDEyMDI4Miw3MSwxMjAzMzQsNzEsMTIwMzg2LDcxLDEyMDQzOCw3MSwxMjkyLDcxLDUwNTYsNzEsNTEwNyw3MSw0MjE5OCw3MSw2NTM1MiwxMDQsODQ2MiwxMDQsMTE5ODQxLDEwNCwxMTk5NDUsMTA0LDExOTk5NywxMDQsMTIwMDQ5LDEwNCwxMjAxMDEsMTA0LDEyMDE1MywxMDQsMTIwMjA1LDEwNCwxMjAyNTcsMTA0LDEyMDMwOSwxMDQsMTIwMzYxLDEwNCwxMjA0MTMsMTA0LDEyMDQ2NSwxMDQsMTIxMSwxMDQsMTM5MiwxMDQsNTA1OCwxMDQsNjUzMjAsNzIsODQ1OSw3Miw4NDYwLDcyLDg0NjEsNzIsMTE5ODE1LDcyLDExOTg2Nyw3MiwxMTk5MTksNzIsMTIwMDIzLDcyLDEyMDE3OSw3MiwxMjAyMzEsNzIsMTIwMjgzLDcyLDEyMDMzNSw3MiwxMjAzODcsNzIsMTIwNDM5LDcyLDkxOSw3MiwxMjA0OTQsNzIsMTIwNTUyLDcyLDEyMDYxMCw3MiwxMjA2NjgsNzIsMTIwNzI2LDcyLDExNDA2LDcyLDUwNTEsNzIsNTUwMCw3Miw0MjIxNSw3Miw2NjI1NSw3Miw3MzEsMTA1LDkwNzUsMTA1LDY1MzUzLDEwNSw4NTYwLDEwNSw4NTA1LDEwNSw4NTIwLDEwNSwxMTk4NDIsMTA1LDExOTg5NCwxMDUsMTE5OTQ2LDEwNSwxMTk5OTgsMTA1LDEyMDA1MCwxMDUsMTIwMTAyLDEwNSwxMjAxNTQsMTA1LDEyMDIwNiwxMDUsMTIwMjU4LDEwNSwxMjAzMTAsMTA1LDEyMDM2MiwxMDUsMTIwNDE0LDEwNSwxMjA0NjYsMTA1LDEyMDQ4NCwxMDUsNjE4LDEwNSw2MTcsMTA1LDk1MywxMDUsODEyNiwxMDUsODkwLDEwNSwxMjA1MjIsMTA1LDEyMDU4MCwxMDUsMTIwNjM4LDEwNSwxMjA2OTYsMTA1LDEyMDc1NCwxMDUsMTExMCwxMDUsNDI1NjcsMTA1LDEyMzEsMTA1LDQzODkzLDEwNSw1MDI5LDEwNSw3MTg3NSwxMDUsNjUzNTQsMTA2LDg1MjEsMTA2LDExOTg0MywxMDYsMTE5ODk1LDEwNiwxMTk5NDcsMTA2LDExOTk5OSwxMDYsMTIwMDUxLDEwNiwxMjAxMDMsMTA2LDEyMDE1NSwxMDYsMTIwMjA3LDEwNiwxMjAyNTksMTA2LDEyMDMxMSwxMDYsMTIwMzYzLDEwNiwxMjA0MTUsMTA2LDEyMDQ2NywxMDYsMTAxMSwxMDYsMTExMiwxMDYsNjUzMjIsNzQsMTE5ODE3LDc0LDExOTg2OSw3NCwxMTk5MjEsNzQsMTE5OTczLDc0LDEyMDAyNSw3NCwxMjAwNzcsNzQsMTIwMTI5LDc0LDEyMDE4MSw3NCwxMjAyMzMsNzQsMTIwMjg1LDc0LDEyMDMzNyw3NCwxMjAzODksNzQsMTIwNDQxLDc0LDQyOTMwLDc0LDg5NSw3NCwxMDMyLDc0LDUwMzUsNzQsNTI2MSw3NCw0MjIwMSw3NCwxMTk4NDQsMTA3LDExOTg5NiwxMDcsMTE5OTQ4LDEwNywxMjAwMDAsMTA3LDEyMDA1MiwxMDcsMTIwMTA0LDEwNywxMjAxNTYsMTA3LDEyMDIwOCwxMDcsMTIwMjYwLDEwNywxMjAzMTIsMTA3LDEyMDM2NCwxMDcsMTIwNDE2LDEwNywxMjA0NjgsMTA3LDg0OTAsNzUsNjUzMjMsNzUsMTE5ODE4LDc1LDExOTg3MCw3NSwxMTk5MjIsNzUsMTE5OTc0LDc1LDEyMDAyNiw3NSwxMjAwNzgsNzUsMTIwMTMwLDc1LDEyMDE4Miw3NSwxMjAyMzQsNzUsMTIwMjg2LDc1LDEyMDMzOCw3NSwxMjAzOTAsNzUsMTIwNDQyLDc1LDkyMiw3NSwxMjA0OTcsNzUsMTIwNTU1LDc1LDEyMDYxMyw3NSwxMjA2NzEsNzUsMTIwNzI5LDc1LDExNDEyLDc1LDUwOTQsNzUsNTg0NSw3NSw0MjE5OSw3NSw2Njg0MCw3NSwxNDcyLDEyNCw4NzM5LDEyNCw5MjEzLDEyNCw2NTUxMiwxMjQsMTYzMywxMjQsMTc3NywxMjQsNjYzMzYsMTI0LDEyNTEyNywxMjQsMTIwNzgzLDEyNCwxMjA3OTMsMTI0LDEyMDgwMywxMjQsMTIwODEzLDEyNCwxMjA4MjMsMTI0LDEzMDAzMywxMjQsNjUzMjEsMTI0LDg1NDQsMTI0LDg0NjQsMTI0LDg0NjUsMTI0LDExOTgxNiwxMjQsMTE5ODY4LDEyNCwxMTk5MjAsMTI0LDEyMDAyNCwxMjQsMTIwMTI4LDEyNCwxMjAxODAsMTI0LDEyMDIzMiwxMjQsMTIwMjg0LDEyNCwxMjAzMzYsMTI0LDEyMDM4OCwxMjQsMTIwNDQwLDEyNCw0MDYsMTI0LDY1MzU2LDEyNCw4NTcyLDEyNCw4NDY3LDEyNCwxMTk4NDUsMTI0LDExOTg5NywxMjQsMTE5OTQ5LDEyNCwxMjAwMDEsMTI0LDEyMDA1MywxMjQsMTIwMTA1LDEyNCwxMjAxNTcsMTI0LDEyMDIwOSwxMjQsMTIwMjYxLDEyNCwxMjAzMTMsMTI0LDEyMDM2NSwxMjQsMTIwNDE3LDEyNCwxMjA0NjksMTI0LDQ0OCwxMjQsMTIwNDk2LDEyNCwxMjA1NTQsMTI0LDEyMDYxMiwxMjQsMTIwNjcwLDEyNCwxMjA3MjgsMTI0LDExNDEwLDEyNCwxMDMwLDEyNCwxMjE2LDEyNCwxNDkzLDEyNCwxNTAzLDEyNCwxNTc1LDEyNCwxMjY0NjQsMTI0LDEyNjU5MiwxMjQsNjUxNjYsMTI0LDY1MTY1LDEyNCwxOTk0LDEyNCwxMTU5OSwxMjQsNTgyNSwxMjQsNDIyMjYsMTI0LDkzOTkyLDEyNCw2NjE4NiwxMjQsNjYzMTMsMTI0LDExOTMzOCw3Niw4NTU2LDc2LDg0NjYsNzYsMTE5ODE5LDc2LDExOTg3MSw3NiwxMTk5MjMsNzYsMTIwMDI3LDc2LDEyMDA3OSw3NiwxMjAxMzEsNzYsMTIwMTgzLDc2LDEyMDIzNSw3NiwxMjAyODcsNzYsMTIwMzM5LDc2LDEyMDM5MSw3NiwxMjA0NDMsNzYsMTE0NzIsNzYsNTA4Niw3Niw1MjkwLDc2LDQyMjA5LDc2LDkzOTc0LDc2LDcxODQzLDc2LDcxODU4LDc2LDY2NTg3LDc2LDY2ODU0LDc2LDY1MzI1LDc3LDg1NTksNzcsODQ5OSw3NywxMTk4MjAsNzcsMTE5ODcyLDc3LDExOTkyNCw3NywxMjAwMjgsNzcsMTIwMDgwLDc3LDEyMDEzMiw3NywxMjAxODQsNzcsMTIwMjM2LDc3LDEyMDI4OCw3NywxMjAzNDAsNzcsMTIwMzkyLDc3LDEyMDQ0NCw3Nyw5MjQsNzcsMTIwNDk5LDc3LDEyMDU1Nyw3NywxMjA2MTUsNzcsMTIwNjczLDc3LDEyMDczMSw3NywxMDE4LDc3LDExNDE2LDc3LDUwNDcsNzcsNTYxNiw3Nyw1ODQ2LDc3LDQyMjA3LDc3LDY2MjI0LDc3LDY2MzIxLDc3LDExOTg0NywxMTAsMTE5ODk5LDExMCwxMTk5NTEsMTEwLDEyMDAwMywxMTAsMTIwMDU1LDExMCwxMjAxMDcsMTEwLDEyMDE1OSwxMTAsMTIwMjExLDExMCwxMjAyNjMsMTEwLDEyMDMxNSwxMTAsMTIwMzY3LDExMCwxMjA0MTksMTEwLDEyMDQ3MSwxMTAsMTQwMCwxMTAsMTQwNCwxMTAsNjUzMjYsNzgsODQ2OSw3OCwxMTk4MjEsNzgsMTE5ODczLDc4LDExOTkyNSw3OCwxMTk5NzcsNzgsMTIwMDI5LDc4LDEyMDA4MSw3OCwxMjAxODUsNzgsMTIwMjM3LDc4LDEyMDI4OSw3OCwxMjAzNDEsNzgsMTIwMzkzLDc4LDEyMDQ0NSw3OCw5MjUsNzgsMTIwNTAwLDc4LDEyMDU1OCw3OCwxMjA2MTYsNzgsMTIwNjc0LDc4LDEyMDczMiw3OCwxMTQxOCw3OCw0MjIwOCw3OCw2NjgzNSw3OCwzMDc0LDExMSwzMjAyLDExMSwzMzMwLDExMSwzNDU4LDExMSwyNDA2LDExMSwyNjYyLDExMSwyNzkwLDExMSwzMDQ2LDExMSwzMTc0LDExMSwzMzAyLDExMSwzNDMwLDExMSwzNjY0LDExMSwzNzkyLDExMSw0MTYwLDExMSwxNjM3LDExMSwxNzgxLDExMSw2NTM1OSwxMTEsODUwMCwxMTEsMTE5ODQ4LDExMSwxMTk5MDAsMTExLDExOTk1MiwxMTEsMTIwMDU2LDExMSwxMjAxMDgsMTExLDEyMDE2MCwxMTEsMTIwMjEyLDExMSwxMjAyNjQsMTExLDEyMDMxNiwxMTEsMTIwMzY4LDExMSwxMjA0MjAsMTExLDEyMDQ3MiwxMTEsNzQzOSwxMTEsNzQ0MSwxMTEsNDM4MzcsMTExLDk1OSwxMTEsMTIwNTI4LDExMSwxMjA1ODYsMTExLDEyMDY0NCwxMTEsMTIwNzAyLDExMSwxMjA3NjAsMTExLDk2MywxMTEsMTIwNTMyLDExMSwxMjA1OTAsMTExLDEyMDY0OCwxMTEsMTIwNzA2LDExMSwxMjA3NjQsMTExLDExNDIzLDExMSw0MzUxLDExMSwxNDEzLDExMSwxNTA1LDExMSwxNjA3LDExMSwxMjY1MDAsMTExLDEyNjU2NCwxMTEsMTI2NTk2LDExMSw2NTI1OSwxMTEsNjUyNjAsMTExLDY1MjU4LDExMSw2NTI1NywxMTEsMTcyNiwxMTEsNjQ0MjgsMTExLDY0NDI5LDExMSw2NDQyNywxMTEsNjQ0MjYsMTExLDE3MjksMTExLDY0NDI0LDExMSw2NDQyNSwxMTEsNjQ0MjMsMTExLDY0NDIyLDExMSwxNzQ5LDExMSwzMzYwLDExMSw0MTI1LDExMSw2Njc5NCwxMTEsNzE4ODAsMTExLDcxODk1LDExMSw2NjYwNCwxMTEsMTk4NCw3OSwyNTM0LDc5LDI5MTgsNzksMTIyOTUsNzksNzA4NjQsNzksNzE5MDQsNzksMTIwNzgyLDc5LDEyMDc5Miw3OSwxMjA4MDIsNzksMTIwODEyLDc5LDEyMDgyMiw3OSwxMzAwMzIsNzksNjUzMjcsNzksMTE5ODIyLDc5LDExOTg3NCw3OSwxMTk5MjYsNzksMTE5OTc4LDc5LDEyMDAzMCw3OSwxMjAwODIsNzksMTIwMTM0LDc5LDEyMDE4Niw3OSwxMjAyMzgsNzksMTIwMjkwLDc5LDEyMDM0Miw3OSwxMjAzOTQsNzksMTIwNDQ2LDc5LDkyNyw3OSwxMjA1MDIsNzksMTIwNTYwLDc5LDEyMDYxOCw3OSwxMjA2NzYsNzksMTIwNzM0LDc5LDExNDIyLDc5LDEzNjUsNzksMTE2MDQsNzksNDgxNiw3OSwyODQ4LDc5LDY2NzU0LDc5LDQyMjI3LDc5LDcxODYxLDc5LDY2MTk0LDc5LDY2MjE5LDc5LDY2NTY0LDc5LDY2ODM4LDc5LDkwNzYsMTEyLDY1MzYwLDExMiwxMTk4NDksMTEyLDExOTkwMSwxMTIsMTE5OTUzLDExMiwxMjAwMDUsMTEyLDEyMDA1NywxMTIsMTIwMTA5LDExMiwxMjAxNjEsMTEyLDEyMDIxMywxMTIsMTIwMjY1LDExMiwxMjAzMTcsMTEyLDEyMDM2OSwxMTIsMTIwNDIxLDExMiwxMjA0NzMsMTEyLDk2MSwxMTIsMTIwNTMwLDExMiwxMjA1NDQsMTEyLDEyMDU4OCwxMTIsMTIwNjAyLDExMiwxMjA2NDYsMTEyLDEyMDY2MCwxMTIsMTIwNzA0LDExMiwxMjA3MTgsMTEyLDEyMDc2MiwxMTIsMTIwNzc2LDExMiwxMTQyNywxMTIsNjUzMjgsODAsODQ3Myw4MCwxMTk4MjMsODAsMTE5ODc1LDgwLDExOTkyNyw4MCwxMTk5NzksODAsMTIwMDMxLDgwLDEyMDA4Myw4MCwxMjAxODcsODAsMTIwMjM5LDgwLDEyMDI5MSw4MCwxMjAzNDMsODAsMTIwMzk1LDgwLDEyMDQ0Nyw4MCw5MjksODAsMTIwNTA0LDgwLDEyMDU2Miw4MCwxMjA2MjAsODAsMTIwNjc4LDgwLDEyMDczNiw4MCwxMTQyNiw4MCw1MDkwLDgwLDUyMjksODAsNDIxOTMsODAsNjYxOTcsODAsMTE5ODUwLDExMywxMTk5MDIsMTEzLDExOTk1NCwxMTMsMTIwMDA2LDExMywxMjAwNTgsMTEzLDEyMDExMCwxMTMsMTIwMTYyLDExMywxMjAyMTQsMTEzLDEyMDI2NiwxMTMsMTIwMzE4LDExMywxMjAzNzAsMTEzLDEyMDQyMiwxMTMsMTIwNDc0LDExMywxMzA3LDExMywxMzc5LDExMywxMzgyLDExMyw4NDc0LDgxLDExOTgyNCw4MSwxMTk4NzYsODEsMTE5OTI4LDgxLDExOTk4MCw4MSwxMjAwMzIsODEsMTIwMDg0LDgxLDEyMDE4OCw4MSwxMjAyNDAsODEsMTIwMjkyLDgxLDEyMDM0NCw4MSwxMjAzOTYsODEsMTIwNDQ4LDgxLDExNjA1LDgxLDExOTg1MSwxMTQsMTE5OTAzLDExNCwxMTk5NTUsMTE0LDEyMDAwNywxMTQsMTIwMDU5LDExNCwxMjAxMTEsMTE0LDEyMDE2MywxMTQsMTIwMjE1LDExNCwxMjAyNjcsMTE0LDEyMDMxOSwxMTQsMTIwMzcxLDExNCwxMjA0MjMsMTE0LDEyMDQ3NSwxMTQsNDM4NDcsMTE0LDQzODQ4LDExNCw3NDYyLDExNCwxMTM5NywxMTQsNDM5MDUsMTE0LDExOTMxOCw4Miw4NDc1LDgyLDg0NzYsODIsODQ3Nyw4MiwxMTk4MjUsODIsMTE5ODc3LDgyLDExOTkyOSw4MiwxMjAwMzMsODIsMTIwMTg5LDgyLDEyMDI0MSw4MiwxMjAyOTMsODIsMTIwMzQ1LDgyLDEyMDM5Nyw4MiwxMjA0NDksODIsNDIyLDgyLDUwMjUsODIsNTA3NCw4Miw2Njc0MCw4Miw1NTExLDgyLDQyMjExLDgyLDk0MDA1LDgyLDY1MzYzLDExNSwxMTk4NTIsMTE1LDExOTkwNCwxMTUsMTE5OTU2LDExNSwxMjAwMDgsMTE1LDEyMDA2MCwxMTUsMTIwMTEyLDExNSwxMjAxNjQsMTE1LDEyMDIxNiwxMTUsMTIwMjY4LDExNSwxMjAzMjAsMTE1LDEyMDM3MiwxMTUsMTIwNDI0LDExNSwxMjA0NzYsMTE1LDQyODAxLDExNSw0NDUsMTE1LDExMDksMTE1LDQzOTQ2LDExNSw3MTg3MywxMTUsNjY2MzIsMTE1LDY1MzMxLDgzLDExOTgyNiw4MywxMTk4NzgsODMsMTE5OTMwLDgzLDExOTk4Miw4MywxMjAwMzQsODMsMTIwMDg2LDgzLDEyMDEzOCw4MywxMjAxOTAsODMsMTIwMjQyLDgzLDEyMDI5NCw4MywxMjAzNDYsODMsMTIwMzk4LDgzLDEyMDQ1MCw4MywxMDI5LDgzLDEzNTksODMsNTA3Nyw4Myw1MDgyLDgzLDQyMjEwLDgzLDk0MDEwLDgzLDY2MTk4LDgzLDY2NTkyLDgzLDExOTg1MywxMTYsMTE5OTA1LDExNiwxMTk5NTcsMTE2LDEyMDAwOSwxMTYsMTIwMDYxLDExNiwxMjAxMTMsMTE2LDEyMDE2NSwxMTYsMTIwMjE3LDExNiwxMjAyNjksMTE2LDEyMDMyMSwxMTYsMTIwMzczLDExNiwxMjA0MjUsMTE2LDEyMDQ3NywxMTYsODg2OCw4NCwxMDIwMSw4NCwxMjg4NzIsODQsNjUzMzIsODQsMTE5ODI3LDg0LDExOTg3OSw4NCwxMTk5MzEsODQsMTE5OTgzLDg0LDEyMDAzNSw4NCwxMjAwODcsODQsMTIwMTM5LDg0LDEyMDE5MSw4NCwxMjAyNDMsODQsMTIwMjk1LDg0LDEyMDM0Nyw4NCwxMjAzOTksODQsMTIwNDUxLDg0LDkzMiw4NCwxMjA1MDcsODQsMTIwNTY1LDg0LDEyMDYyMyw4NCwxMjA2ODEsODQsMTIwNzM5LDg0LDExNDMwLDg0LDUwMjYsODQsNDIxOTYsODQsOTM5NjIsODQsNzE4NjgsODQsNjYxOTksODQsNjYyMjUsODQsNjYzMjUsODQsMTE5ODU0LDExNywxMTk5MDYsMTE3LDExOTk1OCwxMTcsMTIwMDEwLDExNywxMjAwNjIsMTE3LDEyMDExNCwxMTcsMTIwMTY2LDExNywxMjAyMTgsMTE3LDEyMDI3MCwxMTcsMTIwMzIyLDExNywxMjAzNzQsMTE3LDEyMDQyNiwxMTcsMTIwNDc4LDExNyw0MjkxMSwxMTcsNzQ1MiwxMTcsNDM4NTQsMTE3LDQzODU4LDExNyw2NTEsMTE3LDk2NSwxMTcsMTIwNTM0LDExNywxMjA1OTIsMTE3LDEyMDY1MCwxMTcsMTIwNzA4LDExNywxMjA3NjYsMTE3LDE0MDUsMTE3LDY2ODA2LDExNyw3MTg5NiwxMTcsODc0Niw4NSw4ODk5LDg1LDExOTgyOCw4NSwxMTk4ODAsODUsMTE5OTMyLDg1LDExOTk4NCw4NSwxMjAwMzYsODUsMTIwMDg4LDg1LDEyMDE0MCw4NSwxMjAxOTIsODUsMTIwMjQ0LDg1LDEyMDI5Niw4NSwxMjAzNDgsODUsMTIwNDAwLDg1LDEyMDQ1Miw4NSwxMzU3LDg1LDQ2MDgsODUsNjY3NjYsODUsNTE5Niw4NSw0MjIyOCw4NSw5NDAxOCw4NSw3MTg2NCw4NSw4NzQ0LDExOCw4ODk3LDExOCw2NTM2NiwxMTgsODU2NCwxMTgsMTE5ODU1LDExOCwxMTk5MDcsMTE4LDExOTk1OSwxMTgsMTIwMDExLDExOCwxMjAwNjMsMTE4LDEyMDExNSwxMTgsMTIwMTY3LDExOCwxMjAyMTksMTE4LDEyMDI3MSwxMTgsMTIwMzIzLDExOCwxMjAzNzUsMTE4LDEyMDQyNywxMTgsMTIwNDc5LDExOCw3NDU2LDExOCw5NTcsMTE4LDEyMDUyNiwxMTgsMTIwNTg0LDExOCwxMjA2NDIsMTE4LDEyMDcwMCwxMTgsMTIwNzU4LDExOCwxMTQxLDExOCwxNDk2LDExOCw3MTQzMCwxMTgsNDM5NDUsMTE4LDcxODcyLDExOCwxMTkzMDksODYsMTYzOSw4NiwxNzgzLDg2LDg1NDgsODYsMTE5ODI5LDg2LDExOTg4MSw4NiwxMTk5MzMsODYsMTE5OTg1LDg2LDEyMDAzNyw4NiwxMjAwODksODYsMTIwMTQxLDg2LDEyMDE5Myw4NiwxMjAyNDUsODYsMTIwMjk3LDg2LDEyMDM0OSw4NiwxMjA0MDEsODYsMTIwNDUzLDg2LDExNDAsODYsMTE1NzYsODYsNTA4MSw4Niw1MTY3LDg2LDQyNzE5LDg2LDQyMjE0LDg2LDkzOTYwLDg2LDcxODQwLDg2LDY2ODQ1LDg2LDYyMywxMTksMTE5ODU2LDExOSwxMTk5MDgsMTE5LDExOTk2MCwxMTksMTIwMDEyLDExOSwxMjAwNjQsMTE5LDEyMDExNiwxMTksMTIwMTY4LDExOSwxMjAyMjAsMTE5LDEyMDI3MiwxMTksMTIwMzI0LDExOSwxMjAzNzYsMTE5LDEyMDQyOCwxMTksMTIwNDgwLDExOSw3NDU3LDExOSwxMTIxLDExOSwxMzA5LDExOSwxMzc3LDExOSw3MTQzNCwxMTksNzE0MzgsMTE5LDcxNDM5LDExOSw0MzkwNywxMTksNzE5MTksODcsNzE5MTAsODcsMTE5ODMwLDg3LDExOTg4Miw4NywxMTk5MzQsODcsMTE5OTg2LDg3LDEyMDAzOCw4NywxMjAwOTAsODcsMTIwMTQyLDg3LDEyMDE5NCw4NywxMjAyNDYsODcsMTIwMjk4LDg3LDEyMDM1MCw4NywxMjA0MDIsODcsMTIwNDU0LDg3LDEzMDgsODcsNTA0Myw4Nyw1MDc2LDg3LDQyMjE4LDg3LDU3NDIsMTIwLDEwNTM5LDEyMCwxMDU0MCwxMjAsMTA3OTksMTIwLDY1MzY4LDEyMCw4NTY5LDEyMCwxMTk4NTcsMTIwLDExOTkwOSwxMjAsMTE5OTYxLDEyMCwxMjAwMTMsMTIwLDEyMDA2NSwxMjAsMTIwMTE3LDEyMCwxMjAxNjksMTIwLDEyMDIyMSwxMjAsMTIwMjczLDEyMCwxMjAzMjUsMTIwLDEyMDM3NywxMjAsMTIwNDI5LDEyMCwxMjA0ODEsMTIwLDU0NDEsMTIwLDU1MDEsMTIwLDU3NDEsODgsOTU4Nyw4OCw2NjMzOCw4OCw3MTkxNiw4OCw2NTMzNiw4OCw4NTUzLDg4LDExOTgzMSw4OCwxMTk4ODMsODgsMTE5OTM1LDg4LDExOTk4Nyw4OCwxMjAwMzksODgsMTIwMDkxLDg4LDEyMDE0Myw4OCwxMjAxOTUsODgsMTIwMjQ3LDg4LDEyMDI5OSw4OCwxMjAzNTEsODgsMTIwNDAzLDg4LDEyMDQ1NSw4OCw0MjkzMSw4OCw5MzUsODgsMTIwNTEwLDg4LDEyMDU2OCw4OCwxMjA2MjYsODgsMTIwNjg0LDg4LDEyMDc0Miw4OCwxMTQzNiw4OCwxMTYxMyw4OCw1ODE1LDg4LDQyMjE5LDg4LDY2MTkyLDg4LDY2MjI4LDg4LDY2MzI3LDg4LDY2ODU1LDg4LDYxMSwxMjEsNzU2NCwxMjEsNjUzNjksMTIxLDExOTg1OCwxMjEsMTE5OTEwLDEyMSwxMTk5NjIsMTIxLDEyMDAxNCwxMjEsMTIwMDY2LDEyMSwxMjAxMTgsMTIxLDEyMDE3MCwxMjEsMTIwMjIyLDEyMSwxMjAyNzQsMTIxLDEyMDMyNiwxMjEsMTIwMzc4LDEyMSwxMjA0MzAsMTIxLDEyMDQ4MiwxMjEsNjU1LDEyMSw3OTM1LDEyMSw0Mzg2NiwxMjEsOTQ3LDEyMSw4NTA5LDEyMSwxMjA1MTYsMTIxLDEyMDU3NCwxMjEsMTIwNjMyLDEyMSwxMjA2OTAsMTIxLDEyMDc0OCwxMjEsMTE5OSwxMjEsNDMyNywxMjEsNzE5MDAsMTIxLDY1MzM3LDg5LDExOTgzMiw4OSwxMTk4ODQsODksMTE5OTM2LDg5LDExOTk4OCw4OSwxMjAwNDAsODksMTIwMDkyLDg5LDEyMDE0NCw4OSwxMjAxOTYsODksMTIwMjQ4LDg5LDEyMDMwMCw4OSwxMjAzNTIsODksMTIwNDA0LDg5LDEyMDQ1Niw4OSw5MzMsODksOTc4LDg5LDEyMDUwOCw4OSwxMjA1NjYsODksMTIwNjI0LDg5LDEyMDY4Miw4OSwxMjA3NDAsODksMTE0MzIsODksMTE5OCw4OSw1MDMzLDg5LDUwNTMsODksNDIyMjAsODksOTQwMTksODksNzE4NDQsODksNjYyMjYsODksMTE5ODU5LDEyMiwxMTk5MTEsMTIyLDExOTk2MywxMjIsMTIwMDE1LDEyMiwxMjAwNjcsMTIyLDEyMDExOSwxMjIsMTIwMTcxLDEyMiwxMjAyMjMsMTIyLDEyMDI3NSwxMjIsMTIwMzI3LDEyMiwxMjAzNzksMTIyLDEyMDQzMSwxMjIsMTIwNDgzLDEyMiw3NDU4LDEyMiw0MzkyMywxMjIsNzE4NzYsMTIyLDY2MjkzLDkwLDcxOTA5LDkwLDY1MzM4LDkwLDg0ODQsOTAsODQ4OCw5MCwxMTk4MzMsOTAsMTE5ODg1LDkwLDExOTkzNyw5MCwxMTk5ODksOTAsMTIwMDQxLDkwLDEyMDE5Nyw5MCwxMjAyNDksOTAsMTIwMzAxLDkwLDEyMDM1Myw5MCwxMjA0MDUsOTAsMTIwNDU3LDkwLDkxOCw5MCwxMjA0OTMsOTAsMTIwNTUxLDkwLDEyMDYwOSw5MCwxMjA2NjcsOTAsMTIwNzI1LDkwLDUwNTksOTAsNDIyMDQsOTAsNzE4NDksOTBdLFwiX2RlZmF1bHRcIjpbMTYwLDMyLDgyMTEsNDUsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJjc1wiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJkZVwiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJlc1wiOls4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLFwiZnJcIjpbNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjQ1LDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJpdFwiOlsxNjAsMzIsODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJqYVwiOls4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLFwia29cIjpbODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLFwicGxcIjpbNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJwdC1CUlwiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSxcInFwcy1wbG9jXCI6WzE2MCwzMiw4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLFwicnVcIjpbNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDMwNSwxMDUsOTIxLDEyNCwxMDA5LDExMiwyMTUsMTIwXSxcInRyXCI6WzE2MCwzMiw4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLFwiemgtaGFuc1wiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLFwiemgtaGFudFwiOls4MjExLDQ1LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldfScpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZ2V0Q29uZnVzYWJsZXNGb3JDdXJyZW50TG9jYWxlKCkgewogICAgICAgICAgICBpZiAoIUFtYmlndW91c0NoYXJhY3RlcnMubWFwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gQW1iaWd1b3VzQ2hhcmFjdGVycy5nZXREYXRhKCk7CiAgICAgICAgICAgICAgICBsZXQgbG9jYWxlJDEgPSBsb2NhbGU7CiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZSQxIHx8ICEobG9jYWxlJDEgaW4gZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICBsb2NhbGUkMSA9IGxhbmd1YWdlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFsb2NhbGUkMSB8fCAhKGxvY2FsZSQxIGluIGRhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxlJDEgPSAnX2RlZmF1bHQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYXJyYXlUb01hcChhcnIpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChhcnJbaV0sIGFycltpICsgMV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3Qgc2V0ID0gYXJyYXlUb01hcChkYXRhWydfY29tbW9uJ10pOwogICAgICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbENvbmZ1c2FibGVzID0gYXJyYXlUb01hcChkYXRhW2xvY2FsZSQxXSk7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtjb2RlUG9pbnQsIG9yaWdpbmFsQ29kZVBvaW50XSBvZiBhZGRpdGlvbmFsQ29uZnVzYWJsZXMpIHsKICAgICAgICAgICAgICAgICAgICBzZXQuc2V0KGNvZGVQb2ludCwgb3JpZ2luYWxDb2RlUG9pbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQW1iaWd1b3VzQ2hhcmFjdGVycy5tYXAgPSBzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEFtYmlndW91c0NoYXJhY3RlcnMubWFwOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgaXNBbWJpZ3VvdXMoY29kZVBvaW50KSB7CiAgICAgICAgICAgIHJldHVybiBBbWJpZ3VvdXNDaGFyYWN0ZXJzLmdldENvbmZ1c2FibGVzRm9yQ3VycmVudExvY2FsZSgpLmhhcyhjb2RlUG9pbnQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBub24gYmFzaWMgQVNDSUkgY29kZSBwb2ludCB0aGF0IHRoZSBnaXZlbiBjb2RlIHBvaW50IGNhbiBiZSBjb25mdXNlZCwKICAgICAgICAgKiBvciB1bmRlZmluZWQgaWYgc3VjaCBjb2RlIHBvaW50IGRvZXMgbm90ZSBleGlzdC4KICAgICAgICAqLwogICAgICAgIHN0YXRpYyBnZXRQcmltYXJ5Q29uZnVzYWJsZShjb2RlUG9pbnQpIHsKICAgICAgICAgICAgcmV0dXJuIEFtYmlndW91c0NoYXJhY3RlcnMuZ2V0Q29uZnVzYWJsZXNGb3JDdXJyZW50TG9jYWxlKCkuZ2V0KGNvZGVQb2ludCk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBnZXRQcmltYXJ5Q29uZnVzYWJsZUNvZGVQb2ludHMoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2V0KEFtYmlndW91c0NoYXJhY3RlcnMuZ2V0Q29uZnVzYWJsZXNGb3JDdXJyZW50TG9jYWxlKCkua2V5cygpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBJbnZpc2libGVDaGFyYWN0ZXJzIHsKICAgICAgICBzdGF0aWMgZ2V0UmF3RGF0YSgpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoJ1s5LDEwLDExLDEyLDEzLDMyLDEyNywxNjAsMTczLDg0NywxNTY0LDQ0NDcsNDQ0OCw2MDY4LDYwNjksNjE1NSw2MTU2LDYxNTcsNjE1OCw3MzU1LDczNTYsODE5Miw4MTkzLDgxOTQsODE5NSw4MTk2LDgxOTcsODE5OCw4MTk5LDgyMDAsODIwMSw4MjAyLDgyMDMsODIwNCw4MjA1LDgyMDYsODIwNyw4MjM0LDgyMzUsODIzNiw4MjM3LDgyMzgsODIzOSw4Mjg3LDgyODgsODI4OSw4MjkwLDgyOTEsODI5Miw4MjkzLDgyOTQsODI5NSw4Mjk2LDgyOTcsODI5OCw4Mjk5LDgzMDAsODMwMSw4MzAyLDgzMDMsMTAyNDAsMTIyODgsMTI2NDQsNjUwMjQsNjUwMjUsNjUwMjYsNjUwMjcsNjUwMjgsNjUwMjksNjUwMzAsNjUwMzEsNjUwMzIsNjUwMzMsNjUwMzQsNjUwMzUsNjUwMzYsNjUwMzcsNjUwMzgsNjUwMzksNjUyNzksNjU0NDAsNjU1MjAsNjU1MjEsNjU1MjIsNjU1MjMsNjU1MjQsNjU1MjUsNjU1MjYsNjU1MjcsNjU1MjgsNjU1MzIsNzg4NDQsMTE5MTU1LDExOTE1NiwxMTkxNTcsMTE5MTU4LDExOTE1OSwxMTkxNjAsMTE5MTYxLDExOTE2Miw5MTc1MDQsOTE3NTA1LDkxNzUwNiw5MTc1MDcsOTE3NTA4LDkxNzUwOSw5MTc1MTAsOTE3NTExLDkxNzUxMiw5MTc1MTMsOTE3NTE0LDkxNzUxNSw5MTc1MTYsOTE3NTE3LDkxNzUxOCw5MTc1MTksOTE3NTIwLDkxNzUyMSw5MTc1MjIsOTE3NTIzLDkxNzUyNCw5MTc1MjUsOTE3NTI2LDkxNzUyNyw5MTc1MjgsOTE3NTI5LDkxNzUzMCw5MTc1MzEsOTE3NTMyLDkxNzUzMyw5MTc1MzQsOTE3NTM1LDkxNzUzNiw5MTc1MzcsOTE3NTM4LDkxNzUzOSw5MTc1NDAsOTE3NTQxLDkxNzU0Miw5MTc1NDMsOTE3NTQ0LDkxNzU0NSw5MTc1NDYsOTE3NTQ3LDkxNzU0OCw5MTc1NDksOTE3NTUwLDkxNzU1MSw5MTc1NTIsOTE3NTUzLDkxNzU1NCw5MTc1NTUsOTE3NTU2LDkxNzU1Nyw5MTc1NTgsOTE3NTU5LDkxNzU2MCw5MTc1NjEsOTE3NTYyLDkxNzU2Myw5MTc1NjQsOTE3NTY1LDkxNzU2Niw5MTc1NjcsOTE3NTY4LDkxNzU2OSw5MTc1NzAsOTE3NTcxLDkxNzU3Miw5MTc1NzMsOTE3NTc0LDkxNzU3NSw5MTc1NzYsOTE3NTc3LDkxNzU3OCw5MTc1NzksOTE3NTgwLDkxNzU4MSw5MTc1ODIsOTE3NTgzLDkxNzU4NCw5MTc1ODUsOTE3NTg2LDkxNzU4Nyw5MTc1ODgsOTE3NTg5LDkxNzU5MCw5MTc1OTEsOTE3NTkyLDkxNzU5Myw5MTc1OTQsOTE3NTk1LDkxNzU5Niw5MTc1OTcsOTE3NTk4LDkxNzU5OSw5MTc2MDAsOTE3NjAxLDkxNzYwMiw5MTc2MDMsOTE3NjA0LDkxNzYwNSw5MTc2MDYsOTE3NjA3LDkxNzYwOCw5MTc2MDksOTE3NjEwLDkxNzYxMSw5MTc2MTIsOTE3NjEzLDkxNzYxNCw5MTc2MTUsOTE3NjE2LDkxNzYxNyw5MTc2MTgsOTE3NjE5LDkxNzYyMCw5MTc2MjEsOTE3NjIyLDkxNzYyMyw5MTc2MjQsOTE3NjI1LDkxNzYyNiw5MTc2MjcsOTE3NjI4LDkxNzYyOSw5MTc2MzAsOTE3NjMxLDkxNzc2MCw5MTc3NjEsOTE3NzYyLDkxNzc2Myw5MTc3NjQsOTE3NzY1LDkxNzc2Niw5MTc3NjcsOTE3NzY4LDkxNzc2OSw5MTc3NzAsOTE3NzcxLDkxNzc3Miw5MTc3NzMsOTE3Nzc0LDkxNzc3NSw5MTc3NzYsOTE3Nzc3LDkxNzc3OCw5MTc3NzksOTE3NzgwLDkxNzc4MSw5MTc3ODIsOTE3NzgzLDkxNzc4NCw5MTc3ODUsOTE3Nzg2LDkxNzc4Nyw5MTc3ODgsOTE3Nzg5LDkxNzc5MCw5MTc3OTEsOTE3NzkyLDkxNzc5Myw5MTc3OTQsOTE3Nzk1LDkxNzc5Niw5MTc3OTcsOTE3Nzk4LDkxNzc5OSw5MTc4MDAsOTE3ODAxLDkxNzgwMiw5MTc4MDMsOTE3ODA0LDkxNzgwNSw5MTc4MDYsOTE3ODA3LDkxNzgwOCw5MTc4MDksOTE3ODEwLDkxNzgxMSw5MTc4MTIsOTE3ODEzLDkxNzgxNCw5MTc4MTUsOTE3ODE2LDkxNzgxNyw5MTc4MTgsOTE3ODE5LDkxNzgyMCw5MTc4MjEsOTE3ODIyLDkxNzgyMyw5MTc4MjQsOTE3ODI1LDkxNzgyNiw5MTc4MjcsOTE3ODI4LDkxNzgyOSw5MTc4MzAsOTE3ODMxLDkxNzgzMiw5MTc4MzMsOTE3ODM0LDkxNzgzNSw5MTc4MzYsOTE3ODM3LDkxNzgzOCw5MTc4MzksOTE3ODQwLDkxNzg0MSw5MTc4NDIsOTE3ODQzLDkxNzg0NCw5MTc4NDUsOTE3ODQ2LDkxNzg0Nyw5MTc4NDgsOTE3ODQ5LDkxNzg1MCw5MTc4NTEsOTE3ODUyLDkxNzg1Myw5MTc4NTQsOTE3ODU1LDkxNzg1Niw5MTc4NTcsOTE3ODU4LDkxNzg1OSw5MTc4NjAsOTE3ODYxLDkxNzg2Miw5MTc4NjMsOTE3ODY0LDkxNzg2NSw5MTc4NjYsOTE3ODY3LDkxNzg2OCw5MTc4NjksOTE3ODcwLDkxNzg3MSw5MTc4NzIsOTE3ODczLDkxNzg3NCw5MTc4NzUsOTE3ODc2LDkxNzg3Nyw5MTc4NzgsOTE3ODc5LDkxNzg4MCw5MTc4ODEsOTE3ODgyLDkxNzg4Myw5MTc4ODQsOTE3ODg1LDkxNzg4Niw5MTc4ODcsOTE3ODg4LDkxNzg4OSw5MTc4OTAsOTE3ODkxLDkxNzg5Miw5MTc4OTMsOTE3ODk0LDkxNzg5NSw5MTc4OTYsOTE3ODk3LDkxNzg5OCw5MTc4OTksOTE3OTAwLDkxNzkwMSw5MTc5MDIsOTE3OTAzLDkxNzkwNCw5MTc5MDUsOTE3OTA2LDkxNzkwNyw5MTc5MDgsOTE3OTA5LDkxNzkxMCw5MTc5MTEsOTE3OTEyLDkxNzkxMyw5MTc5MTQsOTE3OTE1LDkxNzkxNiw5MTc5MTcsOTE3OTE4LDkxNzkxOSw5MTc5MjAsOTE3OTIxLDkxNzkyMiw5MTc5MjMsOTE3OTI0LDkxNzkyNSw5MTc5MjYsOTE3OTI3LDkxNzkyOCw5MTc5MjksOTE3OTMwLDkxNzkzMSw5MTc5MzIsOTE3OTMzLDkxNzkzNCw5MTc5MzUsOTE3OTM2LDkxNzkzNyw5MTc5MzgsOTE3OTM5LDkxNzk0MCw5MTc5NDEsOTE3OTQyLDkxNzk0Myw5MTc5NDQsOTE3OTQ1LDkxNzk0Niw5MTc5NDcsOTE3OTQ4LDkxNzk0OSw5MTc5NTAsOTE3OTUxLDkxNzk1Miw5MTc5NTMsOTE3OTU0LDkxNzk1NSw5MTc5NTYsOTE3OTU3LDkxNzk1OCw5MTc5NTksOTE3OTYwLDkxNzk2MSw5MTc5NjIsOTE3OTYzLDkxNzk2NCw5MTc5NjUsOTE3OTY2LDkxNzk2Nyw5MTc5NjgsOTE3OTY5LDkxNzk3MCw5MTc5NzEsOTE3OTcyLDkxNzk3Myw5MTc5NzQsOTE3OTc1LDkxNzk3Niw5MTc5NzcsOTE3OTc4LDkxNzk3OSw5MTc5ODAsOTE3OTgxLDkxNzk4Miw5MTc5ODMsOTE3OTg0LDkxNzk4NSw5MTc5ODYsOTE3OTg3LDkxNzk4OCw5MTc5ODksOTE3OTkwLDkxNzk5MSw5MTc5OTIsOTE3OTkzLDkxNzk5NCw5MTc5OTUsOTE3OTk2LDkxNzk5Nyw5MTc5OTgsOTE3OTk5XScpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZ2V0RGF0YSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhID0gbmV3IFNldChJbnZpc2libGVDaGFyYWN0ZXJzLmdldFJhd0RhdGEoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBpc0ludmlzaWJsZUNoYXJhY3Rlcihjb2RlUG9pbnQpIHsKICAgICAgICAgICAgcmV0dXJuIEludmlzaWJsZUNoYXJhY3RlcnMuZ2V0RGF0YSgpLmhhcyhjb2RlUG9pbnQpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZ2V0IGNvZGVQb2ludHMoKSB7CiAgICAgICAgICAgIHJldHVybiBJbnZpc2libGVDaGFyYWN0ZXJzLmdldERhdGEoKTsKICAgICAgICB9CiAgICB9CiAgICBJbnZpc2libGVDaGFyYWN0ZXJzLl9kYXRhID0gdW5kZWZpbmVkOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY29uc3QgSU5JVElBTElaRSA9ICckaW5pdGlhbGl6ZSc7CiAgICBjbGFzcyBSZXF1ZXN0TWVzc2FnZSB7CiAgICAgICAgY29uc3RydWN0b3IodnNXb3JrZXIsIHJlcSwgbWV0aG9kLCBhcmdzKSB7CiAgICAgICAgICAgIHRoaXMudnNXb3JrZXIgPSB2c1dvcmtlcjsKICAgICAgICAgICAgdGhpcy5yZXEgPSByZXE7CiAgICAgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOwogICAgICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOwogICAgICAgICAgICB0aGlzLnR5cGUgPSAwIC8qIFJlcXVlc3QgKi87CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgUmVwbHlNZXNzYWdlIHsKICAgICAgICBjb25zdHJ1Y3Rvcih2c1dvcmtlciwgc2VxLCByZXMsIGVycikgewogICAgICAgICAgICB0aGlzLnZzV29ya2VyID0gdnNXb3JrZXI7CiAgICAgICAgICAgIHRoaXMuc2VxID0gc2VxOwogICAgICAgICAgICB0aGlzLnJlcyA9IHJlczsKICAgICAgICAgICAgdGhpcy5lcnIgPSBlcnI7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IDEgLyogUmVwbHkgKi87CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgU3Vic2NyaWJlRXZlbnRNZXNzYWdlIHsKICAgICAgICBjb25zdHJ1Y3Rvcih2c1dvcmtlciwgcmVxLCBldmVudE5hbWUsIGFyZykgewogICAgICAgICAgICB0aGlzLnZzV29ya2VyID0gdnNXb3JrZXI7CiAgICAgICAgICAgIHRoaXMucmVxID0gcmVxOwogICAgICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTsKICAgICAgICAgICAgdGhpcy5hcmcgPSBhcmc7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IDIgLyogU3Vic2NyaWJlRXZlbnQgKi87CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgRXZlbnRNZXNzYWdlIHsKICAgICAgICBjb25zdHJ1Y3Rvcih2c1dvcmtlciwgcmVxLCBldmVudCkgewogICAgICAgICAgICB0aGlzLnZzV29ya2VyID0gdnNXb3JrZXI7CiAgICAgICAgICAgIHRoaXMucmVxID0gcmVxOwogICAgICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IDMgLyogRXZlbnQgKi87CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgVW5zdWJzY3JpYmVFdmVudE1lc3NhZ2UgewogICAgICAgIGNvbnN0cnVjdG9yKHZzV29ya2VyLCByZXEpIHsKICAgICAgICAgICAgdGhpcy52c1dvcmtlciA9IHZzV29ya2VyOwogICAgICAgICAgICB0aGlzLnJlcSA9IHJlcTsKICAgICAgICAgICAgdGhpcy50eXBlID0gNCAvKiBVbnN1YnNjcmliZUV2ZW50ICovOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFNpbXBsZVdvcmtlclByb3RvY29sIHsKICAgICAgICBjb25zdHJ1Y3RvcihoYW5kbGVyKSB7CiAgICAgICAgICAgIHRoaXMuX3dvcmtlcklkID0gLTE7CiAgICAgICAgICAgIHRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyOwogICAgICAgICAgICB0aGlzLl9sYXN0U2VudFJlcSA9IDA7CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZXBsaWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0VtaXR0ZXJzID0gbmV3IE1hcCgpOwogICAgICAgICAgICB0aGlzLl9wZW5kaW5nRXZlbnRzID0gbmV3IE1hcCgpOwogICAgICAgIH0KICAgICAgICBzZXRXb3JrZXJJZCh3b3JrZXJJZCkgewogICAgICAgICAgICB0aGlzLl93b3JrZXJJZCA9IHdvcmtlcklkOwogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShtZXRob2QsIGFyZ3MpIHsKICAgICAgICAgICAgY29uc3QgcmVxID0gU3RyaW5nKCsrdGhpcy5fbGFzdFNlbnRSZXEpOwogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlcGxpZXNbcmVxXSA9IHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiByZXNvbHZlLAogICAgICAgICAgICAgICAgICAgIHJlamVjdDogcmVqZWN0CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy5fc2VuZChuZXcgUmVxdWVzdE1lc3NhZ2UodGhpcy5fd29ya2VySWQsIHJlcSwgbWV0aG9kLCBhcmdzKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBsaXN0ZW4oZXZlbnROYW1lLCBhcmcpIHsKICAgICAgICAgICAgbGV0IHJlcSA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IGVtaXR0ZXIgPSBuZXcgRW1pdHRlcih7CiAgICAgICAgICAgICAgICBvbkZpcnN0TGlzdGVuZXJBZGQ6ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXEgPSBTdHJpbmcoKyt0aGlzLl9sYXN0U2VudFJlcSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0VtaXR0ZXJzLnNldChyZXEsIGVtaXR0ZXIpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbmQobmV3IFN1YnNjcmliZUV2ZW50TWVzc2FnZSh0aGlzLl93b3JrZXJJZCwgcmVxLCBldmVudE5hbWUsIGFyZykpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG9uTGFzdExpc3RlbmVyUmVtb3ZlOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0VtaXR0ZXJzLmRlbGV0ZShyZXEpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbmQobmV3IFVuc3Vic2NyaWJlRXZlbnRNZXNzYWdlKHRoaXMuX3dvcmtlcklkLCByZXEpKTsKICAgICAgICAgICAgICAgICAgICByZXEgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGVtaXR0ZXIuZXZlbnQ7CiAgICAgICAgfQogICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkgewogICAgICAgICAgICBpZiAoIW1lc3NhZ2UgfHwgIW1lc3NhZ2UudnNXb3JrZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fd29ya2VySWQgIT09IC0xICYmIG1lc3NhZ2UudnNXb3JrZXIgIT09IHRoaXMuX3dvcmtlcklkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faGFuZGxlTWVzc2FnZShtZXNzYWdlKTsKICAgICAgICB9CiAgICAgICAgX2hhbmRsZU1lc3NhZ2UobXNnKSB7CiAgICAgICAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBSZXBseSAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlUmVwbHlNZXNzYWdlKG1zZyk7CiAgICAgICAgICAgICAgICBjYXNlIDAgLyogUmVxdWVzdCAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlUmVxdWVzdE1lc3NhZ2UobXNnKTsKICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBTdWJzY3JpYmVFdmVudCAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlU3Vic2NyaWJlRXZlbnRNZXNzYWdlKG1zZyk7CiAgICAgICAgICAgICAgICBjYXNlIDMgLyogRXZlbnQgKi86CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUV2ZW50TWVzc2FnZShtc2cpOwogICAgICAgICAgICAgICAgY2FzZSA0IC8qIFVuc3Vic2NyaWJlRXZlbnQgKi86CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZVVuc3Vic2NyaWJlRXZlbnRNZXNzYWdlKG1zZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2hhbmRsZVJlcGx5TWVzc2FnZShyZXBseU1lc3NhZ2UpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wZW5kaW5nUmVwbGllc1tyZXBseU1lc3NhZ2Uuc2VxXSkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdHb3QgcmVwbHkgdG8gdW5rbm93biBzZXEnKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgcmVwbHkgPSB0aGlzLl9wZW5kaW5nUmVwbGllc1tyZXBseU1lc3NhZ2Uuc2VxXTsKICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdSZXBsaWVzW3JlcGx5TWVzc2FnZS5zZXFdOwogICAgICAgICAgICBpZiAocmVwbHlNZXNzYWdlLmVycikgewogICAgICAgICAgICAgICAgbGV0IGVyciA9IHJlcGx5TWVzc2FnZS5lcnI7CiAgICAgICAgICAgICAgICBpZiAocmVwbHlNZXNzYWdlLmVyci4kaXNFcnJvcikgewogICAgICAgICAgICAgICAgICAgIGVyciA9IG5ldyBFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIGVyci5uYW1lID0gcmVwbHlNZXNzYWdlLmVyci5uYW1lOwogICAgICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlID0gcmVwbHlNZXNzYWdlLmVyci5tZXNzYWdlOwogICAgICAgICAgICAgICAgICAgIGVyci5zdGFjayA9IHJlcGx5TWVzc2FnZS5lcnIuc3RhY2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXBseS5yZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXBseS5yZXNvbHZlKHJlcGx5TWVzc2FnZS5yZXMpOwogICAgICAgIH0KICAgICAgICBfaGFuZGxlUmVxdWVzdE1lc3NhZ2UocmVxdWVzdE1lc3NhZ2UpIHsKICAgICAgICAgICAgbGV0IHJlcSA9IHJlcXVlc3RNZXNzYWdlLnJlcTsKICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2hhbmRsZXIuaGFuZGxlTWVzc2FnZShyZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHJlcXVlc3RNZXNzYWdlLmFyZ3MpOwogICAgICAgICAgICByZXN1bHQudGhlbigocikgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fc2VuZChuZXcgUmVwbHlNZXNzYWdlKHRoaXMuX3dvcmtlcklkLCByZXEsIHIsIHVuZGVmaW5lZCkpOwogICAgICAgICAgICB9LCAoZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAvLyBMb2FkaW5nIGVycm9ycyBoYXZlIGEgZGV0YWlsIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIHRoZSBhY3R1YWwgZXJyb3IKICAgICAgICAgICAgICAgICAgICBlLmRldGFpbCA9IHRyYW5zZm9ybUVycm9yRm9yU2VyaWFsaXphdGlvbihlLmRldGFpbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9zZW5kKG5ldyBSZXBseU1lc3NhZ2UodGhpcy5fd29ya2VySWQsIHJlcSwgdW5kZWZpbmVkLCB0cmFuc2Zvcm1FcnJvckZvclNlcmlhbGl6YXRpb24oZSkpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9oYW5kbGVTdWJzY3JpYmVFdmVudE1lc3NhZ2UobXNnKSB7CiAgICAgICAgICAgIGNvbnN0IHJlcSA9IG1zZy5yZXE7CiAgICAgICAgICAgIGNvbnN0IGRpc3Bvc2FibGUgPSB0aGlzLl9oYW5kbGVyLmhhbmRsZUV2ZW50KG1zZy5ldmVudE5hbWUsIG1zZy5hcmcpKChldmVudCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fc2VuZChuZXcgRXZlbnRNZXNzYWdlKHRoaXMuX3dvcmtlcklkLCByZXEsIGV2ZW50KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9wZW5kaW5nRXZlbnRzLnNldChyZXEsIGRpc3Bvc2FibGUpOwogICAgICAgIH0KICAgICAgICBfaGFuZGxlRXZlbnRNZXNzYWdlKG1zZykgewogICAgICAgICAgICBpZiAoIXRoaXMuX3BlbmRpbmdFbWl0dGVycy5oYXMobXNnLnJlcSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignR290IGV2ZW50IGZvciB1bmtub3duIHJlcScpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdFbWl0dGVycy5nZXQobXNnLnJlcSkuZmlyZShtc2cuZXZlbnQpOwogICAgICAgIH0KICAgICAgICBfaGFuZGxlVW5zdWJzY3JpYmVFdmVudE1lc3NhZ2UobXNnKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fcGVuZGluZ0V2ZW50cy5oYXMobXNnLnJlcSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignR290IHVuc3Vic2NyaWJlIGZvciB1bmtub3duIHJlcScpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudHMuZ2V0KG1zZy5yZXEpLmRpc3Bvc2UoKTsKICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50cy5kZWxldGUobXNnLnJlcSk7CiAgICAgICAgfQogICAgICAgIF9zZW5kKG1zZykgewogICAgICAgICAgICBsZXQgdHJhbnNmZXIgPSBbXTsKICAgICAgICAgICAgaWYgKG1zZy50eXBlID09PSAwIC8qIFJlcXVlc3QgKi8pIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXNnLmFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmFyZ3NbaV0gaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlci5wdXNoKG1zZy5hcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobXNnLnR5cGUgPT09IDEgLyogUmVwbHkgKi8pIHsKICAgICAgICAgICAgICAgIGlmIChtc2cucmVzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlci5wdXNoKG1zZy5yZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2hhbmRsZXIuc2VuZE1lc3NhZ2UobXNnLCB0cmFuc2Zlcik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcHJvcGVydHlJc0V2ZW50KG5hbWUpIHsKICAgICAgICAvLyBBc3N1bWUgYSBwcm9wZXJ0eSBpcyBhbiBldmVudCBpZiBpdCBoYXMgYSBmb3JtIG9mICJvblNvbWV0aGluZyIKICAgICAgICByZXR1cm4gbmFtZVswXSA9PT0gJ28nICYmIG5hbWVbMV0gPT09ICduJyAmJiBpc1VwcGVyQXNjaWlMZXR0ZXIobmFtZS5jaGFyQ29kZUF0KDIpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHByb3BlcnR5SXNEeW5hbWljRXZlbnQobmFtZSkgewogICAgICAgIC8vIEFzc3VtZSBhIHByb3BlcnR5IGlzIGEgZHluYW1pYyBldmVudCAoYSBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGV2ZW50KSBpZiBpdCBoYXMgYSBmb3JtIG9mICJvbkR5bmFtaWNTb21ldGhpbmciCiAgICAgICAgcmV0dXJuIC9eb25EeW5hbWljLy50ZXN0KG5hbWUpICYmIGlzVXBwZXJBc2NpaUxldHRlcihuYW1lLmNoYXJDb2RlQXQoOSkpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlUHJveHlPYmplY3QobWV0aG9kTmFtZXMsIGludm9rZSwgcHJveHlMaXN0ZW4pIHsKICAgICAgICBjb25zdCBjcmVhdGVQcm94eU1ldGhvZCA9IChtZXRob2QpID0+IHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApOwogICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZShtZXRob2QsIGFyZ3MpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgY29uc3QgY3JlYXRlUHJveHlEeW5hbWljRXZlbnQgPSAoZXZlbnROYW1lKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHlMaXN0ZW4oZXZlbnROYW1lLCBhcmcpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgbGV0IHJlc3VsdCA9IHt9OwogICAgICAgIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBtZXRob2ROYW1lcykgewogICAgICAgICAgICBpZiAocHJvcGVydHlJc0R5bmFtaWNFdmVudChtZXRob2ROYW1lKSkgewogICAgICAgICAgICAgICAgcmVzdWx0W21ldGhvZE5hbWVdID0gY3JlYXRlUHJveHlEeW5hbWljRXZlbnQobWV0aG9kTmFtZSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHJvcGVydHlJc0V2ZW50KG1ldGhvZE5hbWUpKSB7CiAgICAgICAgICAgICAgICByZXN1bHRbbWV0aG9kTmFtZV0gPSBwcm94eUxpc3RlbihtZXRob2ROYW1lLCB1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0W21ldGhvZE5hbWVdID0gY3JlYXRlUHJveHlNZXRob2QobWV0aG9kTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIFdvcmtlciBzaWRlCiAgICAgKi8KICAgIGNsYXNzIFNpbXBsZVdvcmtlclNlcnZlciB7CiAgICAgICAgY29uc3RydWN0b3IocG9zdE1lc3NhZ2UsIHJlcXVlc3RIYW5kbGVyRmFjdG9yeSkgewogICAgICAgICAgICB0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3RvcnkgPSByZXF1ZXN0SGFuZGxlckZhY3Rvcnk7CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RIYW5kbGVyID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2wgPSBuZXcgU2ltcGxlV29ya2VyUHJvdG9jb2woewogICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2U6IChtc2csIHRyYW5zZmVyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UobXNnLCB0cmFuc2Zlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgaGFuZGxlTWVzc2FnZTogKG1ldGhvZCwgYXJncykgPT4gdGhpcy5faGFuZGxlTWVzc2FnZShtZXRob2QsIGFyZ3MpLAogICAgICAgICAgICAgICAgaGFuZGxlRXZlbnQ6IChldmVudE5hbWUsIGFyZykgPT4gdGhpcy5faGFuZGxlRXZlbnQoZXZlbnROYW1lLCBhcmcpCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBvbm1lc3NhZ2UobXNnKSB7CiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sLmhhbmRsZU1lc3NhZ2UobXNnKTsKICAgICAgICB9CiAgICAgICAgX2hhbmRsZU1lc3NhZ2UobWV0aG9kLCBhcmdzKSB7CiAgICAgICAgICAgIGlmIChtZXRob2QgPT09IElOSVRJQUxJWkUpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemUoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLl9yZXF1ZXN0SGFuZGxlciB8fCB0eXBlb2YgdGhpcy5fcmVxdWVzdEhhbmRsZXJbbWV0aG9kXSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTWlzc2luZyByZXF1ZXN0SGFuZGxlciBvciBtZXRob2Q6ICcgKyBtZXRob2QpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9yZXF1ZXN0SGFuZGxlclttZXRob2RdLmFwcGx5KHRoaXMuX3JlcXVlc3RIYW5kbGVyLCBhcmdzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfaGFuZGxlRXZlbnQoZXZlbnROYW1lLCBhcmcpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9yZXF1ZXN0SGFuZGxlcikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHJlcXVlc3RIYW5kbGVyYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHByb3BlcnR5SXNEeW5hbWljRXZlbnQoZXZlbnROYW1lKSkgewogICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLl9yZXF1ZXN0SGFuZGxlcltldmVudE5hbWVdLmNhbGwodGhpcy5fcmVxdWVzdEhhbmRsZXIsIGFyZyk7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50ICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGR5bmFtaWMgZXZlbnQgJHtldmVudE5hbWV9IG9uIHJlcXVlc3QgaGFuZGxlci5gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBldmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHJvcGVydHlJc0V2ZW50KGV2ZW50TmFtZSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5fcmVxdWVzdEhhbmRsZXJbZXZlbnROYW1lXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZXZlbnQgJHtldmVudE5hbWV9IG9uIHJlcXVlc3QgaGFuZGxlci5gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBldmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hbGZvcm1lZCBldmVudCBuYW1lICR7ZXZlbnROYW1lfWApOwogICAgICAgIH0KICAgICAgICBpbml0aWFsaXplKHdvcmtlcklkLCBsb2FkZXJDb25maWcsIG1vZHVsZUlkLCBob3N0TWV0aG9kcykgewogICAgICAgICAgICB0aGlzLl9wcm90b2NvbC5zZXRXb3JrZXJJZCh3b3JrZXJJZCk7CiAgICAgICAgICAgIGNvbnN0IHByb3h5TWV0aG9kUmVxdWVzdCA9IChtZXRob2QsIGFyZ3MpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm90b2NvbC5zZW5kTWVzc2FnZShtZXRob2QsIGFyZ3MpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCBwcm94eUxpc3RlbiA9IChldmVudE5hbWUsIGFyZykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sLmxpc3RlbihldmVudE5hbWUsIGFyZyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IGhvc3RQcm94eSA9IGNyZWF0ZVByb3h5T2JqZWN0KGhvc3RNZXRob2RzLCBwcm94eU1ldGhvZFJlcXVlc3QsIHByb3h5TGlzdGVuKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeSkgewogICAgICAgICAgICAgICAgLy8gc3RhdGljIHJlcXVlc3QgaGFuZGxlcgogICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdEhhbmRsZXIgPSB0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3RvcnkoaG9zdFByb3h5KTsKICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZ2V0QWxsTWV0aG9kTmFtZXModGhpcy5fcmVxdWVzdEhhbmRsZXIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobG9hZGVyQ29uZmlnKSB7CiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgJ2Jhc2VVcmwnLCBoYW5kbGluZyBpdCBpcyBiZXlvbmQgc2NvcGUgZm9yIG5vdwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsb2FkZXJDb25maWcuYmFzZVVybCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9hZGVyQ29uZmlnWydiYXNlVXJsJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxvYWRlckNvbmZpZy5wYXRocyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxvYWRlckNvbmZpZy5wYXRocy52cyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxvYWRlckNvbmZpZy5wYXRoc1sndnMnXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxvYWRlckNvbmZpZy50cnVzdGVkVHlwZXNQb2xpY3kgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHVzZSwgaXQgaGFzIGJlZW4gZGVzdHJveWVkIGR1cmluZyBzZXJpYWxpemUKICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9hZGVyQ29uZmlnWyd0cnVzdGVkVHlwZXNQb2xpY3knXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgaW4gYSB3ZWIgd29ya2VyLCBlbmFibGUgY2F0Y2hpbmcgZXJyb3JzCiAgICAgICAgICAgICAgICBsb2FkZXJDb25maWcuY2F0Y2hFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICBnbG9iYWxzLnJlcXVpcmUuY29uZmlnKGxvYWRlckNvbmZpZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgZ2xvYmFsIHJlcXVpcmUgdG8gYmUgc3VyZSB0byBnZXQgdGhlIGdsb2JhbCBjb25maWcKICAgICAgICAgICAgICAgIC8vIEVTTS1jb21tZW50LWJlZ2luCiAgICAgICAgICAgICAgICAvLyAJCQljb25zdCByZXEgPSAoZ2xvYmFscy5yZXF1aXJlIHx8IHJlcXVpcmUpOwogICAgICAgICAgICAgICAgLy8gRVNNLWNvbW1lbnQtZW5kCiAgICAgICAgICAgICAgICAvLyBFU00tdW5jb21tZW50LWJlZ2luCiAgICAgICAgICAgICAgICBjb25zdCByZXEgPSBnbG9iYWxzLnJlcXVpcmU7CiAgICAgICAgICAgICAgICAvLyBFU00tdW5jb21tZW50LWVuZAogICAgICAgICAgICAgICAgcmVxKFttb2R1bGVJZF0sIChtb2R1bGUpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0SGFuZGxlciA9IG1vZHVsZS5jcmVhdGUoaG9zdFByb3h5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3JlcXVlc3RIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYE5vIFJlcXVlc3RIYW5kbGVyIWApKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGdldEFsbE1ldGhvZE5hbWVzKHRoaXMuX3JlcXVlc3RIYW5kbGVyKSk7CiAgICAgICAgICAgICAgICB9LCByZWplY3QpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAvKioKICAgICAqIFJlcHJlc2VudHMgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHNlcXVlbmNlcy4KICAgICAqLwogICAgY2xhc3MgRGlmZkNoYW5nZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBEaWZmQ2hhbmdlIHdpdGggdGhlIGdpdmVuIHNlcXVlbmNlIGluZm9ybWF0aW9uCiAgICAgICAgICogYW5kIGNvbnRlbnQuCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Iob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxMZW5ndGgsIG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkTGVuZ3RoKSB7CiAgICAgICAgICAgIC8vRGVidWcuQXNzZXJ0KG9yaWdpbmFsTGVuZ3RoID4gMCB8fCBtb2RpZmllZExlbmd0aCA+IDAsICJvcmlnaW5hbExlbmd0aCBhbmQgbW9kaWZpZWRMZW5ndGggY2Fubm90IGJvdGggYmUgPD0gMCIpOwogICAgICAgICAgICB0aGlzLm9yaWdpbmFsU3RhcnQgPSBvcmlnaW5hbFN0YXJ0OwogICAgICAgICAgICB0aGlzLm9yaWdpbmFsTGVuZ3RoID0gb3JpZ2luYWxMZW5ndGg7CiAgICAgICAgICAgIHRoaXMubW9kaWZpZWRTdGFydCA9IG1vZGlmaWVkU3RhcnQ7CiAgICAgICAgICAgIHRoaXMubW9kaWZpZWRMZW5ndGggPSBtb2RpZmllZExlbmd0aDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGVuZCBwb2ludCAoZXhjbHVzaXZlKSBvZiB0aGUgY2hhbmdlIGluIHRoZSBvcmlnaW5hbCBzZXF1ZW5jZS4KICAgICAgICAgKi8KICAgICAgICBnZXRPcmlnaW5hbEVuZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxTdGFydCArIHRoaXMub3JpZ2luYWxMZW5ndGg7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBlbmQgcG9pbnQgKGV4Y2x1c2l2ZSkgb2YgdGhlIGNoYW5nZSBpbiB0aGUgbW9kaWZpZWQgc2VxdWVuY2UuCiAgICAgICAgICovCiAgICAgICAgZ2V0TW9kaWZpZWRFbmQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vZGlmaWVkU3RhcnQgKyB0aGlzLm1vZGlmaWVkTGVuZ3RoOwogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGZ1bmN0aW9uIG51bWJlckhhc2godmFsLCBpbml0aWFsSGFzaFZhbCkgewogICAgICAgIHJldHVybiAoKChpbml0aWFsSGFzaFZhbCA8PCA1KSAtIGluaXRpYWxIYXNoVmFsKSArIHZhbCkgfCAwOyAvLyBoYXNoVmFsICogMzEgKyBjaCwga2VlcCBhcyBpbnQzMgogICAgfQogICAgZnVuY3Rpb24gc3RyaW5nSGFzaChzLCBoYXNoVmFsKSB7CiAgICAgICAgaGFzaFZhbCA9IG51bWJlckhhc2goMTQ5NDE3LCBoYXNoVmFsKTsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICBoYXNoVmFsID0gbnVtYmVySGFzaChzLmNoYXJDb2RlQXQoaSksIGhhc2hWYWwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaGFzaFZhbDsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNsYXNzIFN0cmluZ0RpZmZTZXF1ZW5jZSB7CiAgICAgICAgY29uc3RydWN0b3Ioc291cmNlKSB7CiAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgICAgIH0KICAgICAgICBnZXRFbGVtZW50cygpIHsKICAgICAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5zb3VyY2U7CiAgICAgICAgICAgIGNvbnN0IGNoYXJhY3RlcnMgPSBuZXcgSW50MzJBcnJheShzb3VyY2UubGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNvdXJjZS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgY2hhcmFjdGVyc1tpXSA9IHNvdXJjZS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjaGFyYWN0ZXJzOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0cmluZ0RpZmYob3JpZ2luYWwsIG1vZGlmaWVkLCBwcmV0dHkpIHsKICAgICAgICByZXR1cm4gbmV3IExjc0RpZmYobmV3IFN0cmluZ0RpZmZTZXF1ZW5jZShvcmlnaW5hbCksIG5ldyBTdHJpbmdEaWZmU2VxdWVuY2UobW9kaWZpZWQpKS5Db21wdXRlRGlmZihwcmV0dHkpLmNoYW5nZXM7CiAgICB9CiAgICAvLwogICAgLy8gVGhlIGNvZGUgYmVsb3cgaGFzIGJlZW4gcG9ydGVkIGZyb20gYSBDIyBpbXBsZW1lbnRhdGlvbiBpbiBWUwogICAgLy8KICAgIGNsYXNzIERlYnVnIHsKICAgICAgICBzdGF0aWMgQXNzZXJ0KGNvbmRpdGlvbiwgbWVzc2FnZSkgewogICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgTXlBcnJheSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29waWVzIGEgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhbiBBcnJheSBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCBhbmQgcGFzdGVzCiAgICAgICAgICogdGhlbSB0byBhbm90aGVyIEFycmF5IHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gaW5kZXguIFRoZSBsZW5ndGggYW5kIHRoZSBpbmRleGVzCiAgICAgICAgICogYXJlIHNwZWNpZmllZCBhcyA2NC1iaXQgaW50ZWdlcnMuCiAgICAgICAgICogc291cmNlQXJyYXk6CiAgICAgICAgICoJCVRoZSBBcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHRvIGNvcHkuCiAgICAgICAgICogc291cmNlSW5kZXg6CiAgICAgICAgICoJCUEgNjQtYml0IGludGVnZXIgdGhhdCByZXByZXNlbnRzIHRoZSBpbmRleCBpbiB0aGUgc291cmNlQXJyYXkgYXQgd2hpY2ggY29weWluZyBiZWdpbnMuCiAgICAgICAgICogZGVzdGluYXRpb25BcnJheToKICAgICAgICAgKgkJVGhlIEFycmF5IHRoYXQgcmVjZWl2ZXMgdGhlIGRhdGEuCiAgICAgICAgICogZGVzdGluYXRpb25JbmRleDoKICAgICAgICAgKgkJQSA2NC1iaXQgaW50ZWdlciB0aGF0IHJlcHJlc2VudHMgdGhlIGluZGV4IGluIHRoZSBkZXN0aW5hdGlvbkFycmF5IGF0IHdoaWNoIHN0b3JpbmcgYmVnaW5zLgogICAgICAgICAqIGxlbmd0aDoKICAgICAgICAgKgkJQSA2NC1iaXQgaW50ZWdlciB0aGF0IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBjb3B5LgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBDb3B5KHNvdXJjZUFycmF5LCBzb3VyY2VJbmRleCwgZGVzdGluYXRpb25BcnJheSwgZGVzdGluYXRpb25JbmRleCwgbGVuZ3RoKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQXJyYXlbZGVzdGluYXRpb25JbmRleCArIGldID0gc291cmNlQXJyYXlbc291cmNlSW5kZXggKyBpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdGF0aWMgQ29weTIoc291cmNlQXJyYXksIHNvdXJjZUluZGV4LCBkZXN0aW5hdGlvbkFycmF5LCBkZXN0aW5hdGlvbkluZGV4LCBsZW5ndGgpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgZGVzdGluYXRpb25BcnJheVtkZXN0aW5hdGlvbkluZGV4ICsgaV0gPSBzb3VyY2VBcnJheVtzb3VyY2VJbmRleCArIGldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBIHV0aWxpdHkgY2xhc3Mgd2hpY2ggaGVscHMgdG8gY3JlYXRlIHRoZSBzZXQgb2YgRGlmZkNoYW5nZXMgZnJvbQogICAgICogYSBkaWZmZXJlbmNlIG9wZXJhdGlvbi4gVGhpcyBjbGFzcyBhY2NlcHRzIG9yaWdpbmFsIERpZmZFbGVtZW50cyBhbmQKICAgICAqIG1vZGlmaWVkIERpZmZFbGVtZW50cyB0aGF0IGFyZSBpbnZvbHZlZCBpbiBhIHBhcnRpY3VsYXIgY2hhbmdlLiBUaGUKICAgICAqIE1hcmtOZXh0Q2hhbmdlKCkgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gbWFyayB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuCiAgICAgKiBkaXN0aW5jdCBjaGFuZ2VzLiBBdCB0aGUgZW5kLCB0aGUgQ2hhbmdlcyBwcm9wZXJ0eSBjYW4gYmUgY2FsbGVkIHRvIHJldHJpZXZlCiAgICAgKiB0aGUgY29uc3RydWN0ZWQgY2hhbmdlcy4KICAgICAqLwogICAgY2xhc3MgRGlmZkNoYW5nZUhlbHBlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBEaWZmQ2hhbmdlSGVscGVyIGZvciB0aGUgZ2l2ZW4gRGlmZlNlcXVlbmNlcy4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5tX2NoYW5nZXMgPSBbXTsKICAgICAgICAgICAgdGhpcy5tX29yaWdpbmFsU3RhcnQgPSAxMDczNzQxODI0IC8qIE1BWF9TQUZFX1NNQUxMX0lOVEVHRVIgKi87CiAgICAgICAgICAgIHRoaXMubV9tb2RpZmllZFN0YXJ0ID0gMTA3Mzc0MTgyNCAvKiBNQVhfU0FGRV9TTUFMTF9JTlRFR0VSICovOwogICAgICAgICAgICB0aGlzLm1fb3JpZ2luYWxDb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMubV9tb2RpZmllZENvdW50ID0gMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBjaGFuZ2UgaW4gdGhlIHNldCBvZiBkaWZmZXJlbmNlcy4KICAgICAgICAgKi8KICAgICAgICBNYXJrTmV4dENoYW5nZSgpIHsKICAgICAgICAgICAgLy8gT25seSBhZGQgdG8gdGhlIGxpc3QgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGFkZAogICAgICAgICAgICBpZiAodGhpcy5tX29yaWdpbmFsQ291bnQgPiAwIHx8IHRoaXMubV9tb2RpZmllZENvdW50ID4gMCkgewogICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBuZXcgY2hhbmdlIHRvIG91ciBsaXN0CiAgICAgICAgICAgICAgICB0aGlzLm1fY2hhbmdlcy5wdXNoKG5ldyBEaWZmQ2hhbmdlKHRoaXMubV9vcmlnaW5hbFN0YXJ0LCB0aGlzLm1fb3JpZ2luYWxDb3VudCwgdGhpcy5tX21vZGlmaWVkU3RhcnQsIHRoaXMubV9tb2RpZmllZENvdW50KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVzZXQgZm9yIHRoZSBuZXh0IGNoYW5nZQogICAgICAgICAgICB0aGlzLm1fb3JpZ2luYWxDb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMubV9tb2RpZmllZENvdW50ID0gMDsKICAgICAgICAgICAgdGhpcy5tX29yaWdpbmFsU3RhcnQgPSAxMDczNzQxODI0IC8qIE1BWF9TQUZFX1NNQUxMX0lOVEVHRVIgKi87CiAgICAgICAgICAgIHRoaXMubV9tb2RpZmllZFN0YXJ0ID0gMTA3Mzc0MTgyNCAvKiBNQVhfU0FGRV9TTUFMTF9JTlRFR0VSICovOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBvcmlnaW5hbCBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiB0byB0aGUgZWxlbWVudHMKICAgICAgICAgKiBhZmZlY3RlZCBieSB0aGUgY3VycmVudCBjaGFuZ2UuIFRoZSBtb2RpZmllZCBpbmRleCBnaXZlcyBjb250ZXh0CiAgICAgICAgICogdG8gdGhlIGNoYW5nZSBwb3NpdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIG9yaWdpbmFsIHNlcXVlbmNlLgogICAgICAgICAqIEBwYXJhbSBvcmlnaW5hbEluZGV4IFRoZSBpbmRleCBvZiB0aGUgb3JpZ2luYWwgZWxlbWVudCB0byBhZGQuCiAgICAgICAgICogQHBhcmFtIG1vZGlmaWVkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBtb2RpZmllZCBlbGVtZW50IHRoYXQgcHJvdmlkZXMgY29ycmVzcG9uZGluZyBwb3NpdGlvbiBpbiB0aGUgbW9kaWZpZWQgc2VxdWVuY2UuCiAgICAgICAgICovCiAgICAgICAgQWRkT3JpZ2luYWxFbGVtZW50KG9yaWdpbmFsSW5kZXgsIG1vZGlmaWVkSW5kZXgpIHsKICAgICAgICAgICAgLy8gVGhlICd0cnVlJyBzdGFydCBpbmRleCBpcyB0aGUgc21hbGxlc3Qgb2YgdGhlIG9uZXMgd2UndmUgc2VlbgogICAgICAgICAgICB0aGlzLm1fb3JpZ2luYWxTdGFydCA9IE1hdGgubWluKHRoaXMubV9vcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEluZGV4KTsKICAgICAgICAgICAgdGhpcy5tX21vZGlmaWVkU3RhcnQgPSBNYXRoLm1pbih0aGlzLm1fbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRJbmRleCk7CiAgICAgICAgICAgIHRoaXMubV9vcmlnaW5hbENvdW50Kys7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgdGhlIG1vZGlmaWVkIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIHRvIHRoZSBlbGVtZW50cwogICAgICAgICAqIGFmZmVjdGVkIGJ5IHRoZSBjdXJyZW50IGNoYW5nZS4gVGhlIG9yaWdpbmFsIGluZGV4IGdpdmVzIGNvbnRleHQKICAgICAgICAgKiB0byB0aGUgY2hhbmdlIHBvc2l0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgbW9kaWZpZWQgc2VxdWVuY2UuCiAgICAgICAgICogQHBhcmFtIG9yaWdpbmFsSW5kZXggVGhlIGluZGV4IG9mIHRoZSBvcmlnaW5hbCBlbGVtZW50IHRoYXQgcHJvdmlkZXMgY29ycmVzcG9uZGluZyBwb3NpdGlvbiBpbiB0aGUgb3JpZ2luYWwgc2VxdWVuY2UuCiAgICAgICAgICogQHBhcmFtIG1vZGlmaWVkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBtb2RpZmllZCBlbGVtZW50IHRvIGFkZC4KICAgICAgICAgKi8KICAgICAgICBBZGRNb2RpZmllZEVsZW1lbnQob3JpZ2luYWxJbmRleCwgbW9kaWZpZWRJbmRleCkgewogICAgICAgICAgICAvLyBUaGUgJ3RydWUnIHN0YXJ0IGluZGV4IGlzIHRoZSBzbWFsbGVzdCBvZiB0aGUgb25lcyB3ZSd2ZSBzZWVuCiAgICAgICAgICAgIHRoaXMubV9vcmlnaW5hbFN0YXJ0ID0gTWF0aC5taW4odGhpcy5tX29yaWdpbmFsU3RhcnQsIG9yaWdpbmFsSW5kZXgpOwogICAgICAgICAgICB0aGlzLm1fbW9kaWZpZWRTdGFydCA9IE1hdGgubWluKHRoaXMubV9tb2RpZmllZFN0YXJ0LCBtb2RpZmllZEluZGV4KTsKICAgICAgICAgICAgdGhpcy5tX21vZGlmaWVkQ291bnQrKzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFsbCBvZiB0aGUgY2hhbmdlcyBtYXJrZWQgYnkgdGhlIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldENoYW5nZXMoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm1fb3JpZ2luYWxDb3VudCA+IDAgfHwgdGhpcy5tX21vZGlmaWVkQ291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAvLyBGaW5pc2ggdXAgb24gd2hhdGV2ZXIgaXMgbGVmdAogICAgICAgICAgICAgICAgdGhpcy5NYXJrTmV4dENoYW5nZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLm1fY2hhbmdlczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFsbCBvZiB0aGUgY2hhbmdlcyBtYXJrZWQgYnkgdGhlIGNsYXNzIGluIHRoZSByZXZlcnNlIG9yZGVyCiAgICAgICAgICovCiAgICAgICAgZ2V0UmV2ZXJzZUNoYW5nZXMoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm1fb3JpZ2luYWxDb3VudCA+IDAgfHwgdGhpcy5tX21vZGlmaWVkQ291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAvLyBGaW5pc2ggdXAgb24gd2hhdGV2ZXIgaXMgbGVmdAogICAgICAgICAgICAgICAgdGhpcy5NYXJrTmV4dENoYW5nZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubV9jaGFuZ2VzLnJldmVyc2UoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubV9jaGFuZ2VzOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGRpZmZlcmVuY2UgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbgogICAgICogIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgdmFyaWF0aW9ucyIgYnkgRXVnZW5lIFcuIE15ZXJzCiAgICAgKi8KICAgIGNsYXNzIExjc0RpZmYgewogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgdGhlIERpZmZGaW5kZXIKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihvcmlnaW5hbFNlcXVlbmNlLCBtb2RpZmllZFNlcXVlbmNlLCBjb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUgPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlID0gY29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlOwogICAgICAgICAgICB0aGlzLl9vcmlnaW5hbFNlcXVlbmNlID0gb3JpZ2luYWxTZXF1ZW5jZTsKICAgICAgICAgICAgdGhpcy5fbW9kaWZpZWRTZXF1ZW5jZSA9IG1vZGlmaWVkU2VxdWVuY2U7CiAgICAgICAgICAgIGNvbnN0IFtvcmlnaW5hbFN0cmluZ0VsZW1lbnRzLCBvcmlnaW5hbEVsZW1lbnRzT3JIYXNoLCBvcmlnaW5hbEhhc1N0cmluZ3NdID0gTGNzRGlmZi5fZ2V0RWxlbWVudHMob3JpZ2luYWxTZXF1ZW5jZSk7CiAgICAgICAgICAgIGNvbnN0IFttb2RpZmllZFN0cmluZ0VsZW1lbnRzLCBtb2RpZmllZEVsZW1lbnRzT3JIYXNoLCBtb2RpZmllZEhhc1N0cmluZ3NdID0gTGNzRGlmZi5fZ2V0RWxlbWVudHMobW9kaWZpZWRTZXF1ZW5jZSk7CiAgICAgICAgICAgIHRoaXMuX2hhc1N0cmluZ3MgPSAob3JpZ2luYWxIYXNTdHJpbmdzICYmIG1vZGlmaWVkSGFzU3RyaW5ncyk7CiAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHMgPSBvcmlnaW5hbFN0cmluZ0VsZW1lbnRzOwogICAgICAgICAgICB0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoID0gb3JpZ2luYWxFbGVtZW50c09ySGFzaDsKICAgICAgICAgICAgdGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50cyA9IG1vZGlmaWVkU3RyaW5nRWxlbWVudHM7CiAgICAgICAgICAgIHRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2ggPSBtb2RpZmllZEVsZW1lbnRzT3JIYXNoOwogICAgICAgICAgICB0aGlzLm1fZm9yd2FyZEhpc3RvcnkgPSBbXTsKICAgICAgICAgICAgdGhpcy5tX3JldmVyc2VIaXN0b3J5ID0gW107CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBfaXNTdHJpbmdBcnJheShhcnIpIHsKICAgICAgICAgICAgcmV0dXJuIChhcnIubGVuZ3RoID4gMCAmJiB0eXBlb2YgYXJyWzBdID09PSAnc3RyaW5nJyk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBfZ2V0RWxlbWVudHMoc2VxdWVuY2UpIHsKICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBzZXF1ZW5jZS5nZXRFbGVtZW50cygpOwogICAgICAgICAgICBpZiAoTGNzRGlmZi5faXNTdHJpbmdBcnJheShlbGVtZW50cykpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlcyA9IG5ldyBJbnQzMkFycmF5KGVsZW1lbnRzLmxlbmd0aCk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBoYXNoZXNbaV0gPSBzdHJpbmdIYXNoKGVsZW1lbnRzW2ldLCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBbZWxlbWVudHMsIGhhc2hlcywgdHJ1ZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVsZW1lbnRzIGluc3RhbmNlb2YgSW50MzJBcnJheSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtbXSwgZWxlbWVudHMsIGZhbHNlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gW1tdLCBuZXcgSW50MzJBcnJheShlbGVtZW50cyksIGZhbHNlXTsKICAgICAgICB9CiAgICAgICAgRWxlbWVudHNBcmVFcXVhbChvcmlnaW5hbEluZGV4LCBuZXdJbmRleCkgewogICAgICAgICAgICBpZiAodGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaFtvcmlnaW5hbEluZGV4XSAhPT0gdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFtuZXdJbmRleF0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2hhc1N0cmluZ3MgPyB0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW29yaWdpbmFsSW5kZXhdID09PSB0aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW25ld0luZGV4XSA6IHRydWUpOwogICAgICAgIH0KICAgICAgICBFbGVtZW50c0FyZVN0cmljdEVxdWFsKG9yaWdpbmFsSW5kZXgsIG5ld0luZGV4KSB7CiAgICAgICAgICAgIGlmICghdGhpcy5FbGVtZW50c0FyZUVxdWFsKG9yaWdpbmFsSW5kZXgsIG5ld0luZGV4KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRWxlbWVudCA9IExjc0RpZmYuX2dldFN0cmljdEVsZW1lbnQodGhpcy5fb3JpZ2luYWxTZXF1ZW5jZSwgb3JpZ2luYWxJbmRleCk7CiAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkRWxlbWVudCA9IExjc0RpZmYuX2dldFN0cmljdEVsZW1lbnQodGhpcy5fbW9kaWZpZWRTZXF1ZW5jZSwgbmV3SW5kZXgpOwogICAgICAgICAgICByZXR1cm4gKG9yaWdpbmFsRWxlbWVudCA9PT0gbW9kaWZpZWRFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIF9nZXRTdHJpY3RFbGVtZW50KHNlcXVlbmNlLCBpbmRleCkgewogICAgICAgICAgICBpZiAodHlwZW9mIHNlcXVlbmNlLmdldFN0cmljdEVsZW1lbnQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZS5nZXRTdHJpY3RFbGVtZW50KGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgT3JpZ2luYWxFbGVtZW50c0FyZUVxdWFsKGluZGV4MSwgaW5kZXgyKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoW2luZGV4MV0gIT09IHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbaW5kZXgyXSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAodGhpcy5faGFzU3RyaW5ncyA/IHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbaW5kZXgxXSA9PT0gdGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1tpbmRleDJdIDogdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIE1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbChpbmRleDEsIGluZGV4MikgewogICAgICAgICAgICBpZiAodGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFtpbmRleDFdICE9PSB0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoW2luZGV4Ml0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2hhc1N0cmluZ3MgPyB0aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW2luZGV4MV0gPT09IHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbaW5kZXgyXSA6IHRydWUpOwogICAgICAgIH0KICAgICAgICBDb21wdXRlRGlmZihwcmV0dHkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX0NvbXB1dGVEaWZmKDAsIHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2gubGVuZ3RoIC0gMSwgMCwgdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGggLSAxLCBwcmV0dHkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgb3JpZ2luYWwgYW5kIG1vZGlmaWVkIGlucHV0CiAgICAgICAgICogc2VxdWVuY2VzIG9uIHRoZSBib3VuZGVkIHJhbmdlLgogICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gaW5wdXQgc2VxdWVuY2VzLgogICAgICAgICAqLwogICAgICAgIF9Db21wdXRlRGlmZihvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQsIHByZXR0eSkgewogICAgICAgICAgICBjb25zdCBxdWl0RWFybHlBcnIgPSBbZmFsc2VdOwogICAgICAgICAgICBsZXQgY2hhbmdlcyA9IHRoaXMuQ29tcHV0ZURpZmZSZWN1cnNpdmUob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxFbmQsIG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkRW5kLCBxdWl0RWFybHlBcnIpOwogICAgICAgICAgICBpZiAocHJldHR5KSB7CiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGNsZWFuIHVwIHRoZSBjb21wdXRlZCBkaWZmIHRvIGJlIG1vcmUgaW50dWl0aXZlCiAgICAgICAgICAgICAgICAvLyBidXQgaXQgdHVybnMgb3V0IHRoaXMgY2Fubm90IGJlIGRvbmUgY29ycmVjdGx5IHVudGlsIHRoZSBlbnRpcmUgc2V0CiAgICAgICAgICAgICAgICAvLyBvZiBkaWZmcyBoYXZlIGJlZW4gY29tcHV0ZWQKICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB0aGlzLlByZXR0aWZ5Q2hhbmdlcyhjaGFuZ2VzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBxdWl0RWFybHlBcnJbMF0sCiAgICAgICAgICAgICAgICBjaGFuZ2VzOiBjaGFuZ2VzCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFByaXZhdGUgaGVscGVyIG1ldGhvZCB3aGljaCBjb21wdXRlcyB0aGUgZGlmZmVyZW5jZXMgb24gdGhlIGJvdW5kZWQgcmFuZ2UKICAgICAgICAgKiByZWN1cnNpdmVseS4KICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIGlucHV0IHNlcXVlbmNlcy4KICAgICAgICAgKi8KICAgICAgICBDb21wdXRlRGlmZlJlY3Vyc2l2ZShvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQsIHF1aXRFYXJseUFycikgewogICAgICAgICAgICBxdWl0RWFybHlBcnJbMF0gPSBmYWxzZTsKICAgICAgICAgICAgLy8gRmluZCB0aGUgc3RhcnQgb2YgdGhlIGRpZmZlcmVuY2VzCiAgICAgICAgICAgIHdoaWxlIChvcmlnaW5hbFN0YXJ0IDw9IG9yaWdpbmFsRW5kICYmIG1vZGlmaWVkU3RhcnQgPD0gbW9kaWZpZWRFbmQgJiYgdGhpcy5FbGVtZW50c0FyZUVxdWFsKG9yaWdpbmFsU3RhcnQsIG1vZGlmaWVkU3RhcnQpKSB7CiAgICAgICAgICAgICAgICBvcmlnaW5hbFN0YXJ0Kys7CiAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmluZCB0aGUgZW5kIG9mIHRoZSBkaWZmZXJlbmNlcwogICAgICAgICAgICB3aGlsZSAob3JpZ2luYWxFbmQgPj0gb3JpZ2luYWxTdGFydCAmJiBtb2RpZmllZEVuZCA+PSBtb2RpZmllZFN0YXJ0ICYmIHRoaXMuRWxlbWVudHNBcmVFcXVhbChvcmlnaW5hbEVuZCwgbW9kaWZpZWRFbmQpKSB7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZC0tOwogICAgICAgICAgICAgICAgbW9kaWZpZWRFbmQtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJbiB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIGVpdGhlciBoYXZlIGFsbCBpbnNlcnRpb25zIG9yIGFsbCBkZWxldGlvbnMgb3IgdGhlIHNlcXVlbmNlcyBhcmUgaWRlbnRpY2FsCiAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0YXJ0ID4gb3JpZ2luYWxFbmQgfHwgbW9kaWZpZWRTdGFydCA+IG1vZGlmaWVkRW5kKSB7CiAgICAgICAgICAgICAgICBsZXQgY2hhbmdlczsKICAgICAgICAgICAgICAgIGlmIChtb2RpZmllZFN0YXJ0IDw9IG1vZGlmaWVkRW5kKSB7CiAgICAgICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KG9yaWdpbmFsU3RhcnQgPT09IG9yaWdpbmFsRW5kICsgMSwgJ29yaWdpbmFsU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBvcmlnaW5hbEVuZCcpOwogICAgICAgICAgICAgICAgICAgIC8vIEFsbCBpbnNlcnRpb25zCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpZmZDaGFuZ2Uob3JpZ2luYWxTdGFydCwgMCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQgLSBtb2RpZmllZFN0YXJ0ICsgMSkKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3JpZ2luYWxTdGFydCA8PSBvcmlnaW5hbEVuZCkgewogICAgICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChtb2RpZmllZFN0YXJ0ID09PSBtb2RpZmllZEVuZCArIDEsICdtb2RpZmllZFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gbW9kaWZpZWRFbmQnKTsKICAgICAgICAgICAgICAgICAgICAvLyBBbGwgZGVsZXRpb25zCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpZmZDaGFuZ2Uob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxFbmQgLSBvcmlnaW5hbFN0YXJ0ICsgMSwgbW9kaWZpZWRTdGFydCwgMCkKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KG9yaWdpbmFsU3RhcnQgPT09IG9yaWdpbmFsRW5kICsgMSwgJ29yaWdpbmFsU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBvcmlnaW5hbEVuZCcpOwogICAgICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChtb2RpZmllZFN0YXJ0ID09PSBtb2RpZmllZEVuZCArIDEsICdtb2RpZmllZFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gbW9kaWZpZWRFbmQnKTsKICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGljYWwgc2VxdWVuY2VzIC0gTm8gZGlmZmVyZW5jZXMKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzID0gW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGlzIHByb2JsZW0gY2FuIGJlIHNvbHZlZCB1c2luZyB0aGUgRGl2aWRlLUFuZC1Db25xdWVyIHRlY2huaXF1ZS4KICAgICAgICAgICAgY29uc3QgbWlkT3JpZ2luYWxBcnIgPSBbMF07CiAgICAgICAgICAgIGNvbnN0IG1pZE1vZGlmaWVkQXJyID0gWzBdOwogICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLkNvbXB1dGVSZWN1cnNpb25Qb2ludChvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQsIG1pZE9yaWdpbmFsQXJyLCBtaWRNb2RpZmllZEFyciwgcXVpdEVhcmx5QXJyKTsKICAgICAgICAgICAgY29uc3QgbWlkT3JpZ2luYWwgPSBtaWRPcmlnaW5hbEFyclswXTsKICAgICAgICAgICAgY29uc3QgbWlkTW9kaWZpZWQgPSBtaWRNb2RpZmllZEFyclswXTsKICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gUmVzdWx0IGlzIG5vdC1udWxsIHdoZW4gdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgdG8gY29tcHV0ZSB0aGUgY2hhbmdlcyB3aGlsZQogICAgICAgICAgICAgICAgLy8gc2VhcmNoaW5nIGZvciB0aGUgcmVjdXJzaW9uIHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCFxdWl0RWFybHlBcnJbMF0pIHsKICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBicmVhayB0aGUgcHJvYmxlbSBkb3duIHJlY3Vyc2l2ZWx5IGJ5IGZpbmRpbmcgdGhlIGNoYW5nZXMgaW4gdGhlCiAgICAgICAgICAgICAgICAvLyBGaXJzdCBIYWxmOiAgIChvcmlnaW5hbFN0YXJ0LCBtb2RpZmllZFN0YXJ0KSB0byAobWlkT3JpZ2luYWwsIG1pZE1vZGlmaWVkKQogICAgICAgICAgICAgICAgLy8gU2Vjb25kIEhhbGY6ICAobWlkT3JpZ2luYWwgKyAxLCBtaW5Nb2RpZmllZCArIDEpIHRvIChvcmlnaW5hbEVuZCwgbW9kaWZpZWRFbmQpCiAgICAgICAgICAgICAgICAvLyBOT1RFOiBDb21wdXRlRGlmZigpIGlzIGluY2x1c2l2ZSwgdGhlcmVmb3JlIHRoZSBzZWNvbmQgcmFuZ2Ugc3RhcnRzIG9uIHRoZSBuZXh0IHBvaW50CiAgICAgICAgICAgICAgICBjb25zdCBsZWZ0Q2hhbmdlcyA9IHRoaXMuQ29tcHV0ZURpZmZSZWN1cnNpdmUob3JpZ2luYWxTdGFydCwgbWlkT3JpZ2luYWwsIG1vZGlmaWVkU3RhcnQsIG1pZE1vZGlmaWVkLCBxdWl0RWFybHlBcnIpOwogICAgICAgICAgICAgICAgbGV0IHJpZ2h0Q2hhbmdlcyA9IFtdOwogICAgICAgICAgICAgICAgaWYgKCFxdWl0RWFybHlBcnJbMF0pIHsKICAgICAgICAgICAgICAgICAgICByaWdodENoYW5nZXMgPSB0aGlzLkNvbXB1dGVEaWZmUmVjdXJzaXZlKG1pZE9yaWdpbmFsICsgMSwgb3JpZ2luYWxFbmQsIG1pZE1vZGlmaWVkICsgMSwgbW9kaWZpZWRFbmQsIHF1aXRFYXJseUFycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBkaWRuJ3QgaGF2ZSB0aW1lIHRvIGZpbmlzaCB0aGUgZmlyc3QgaGFsZiwgc28gd2UgZG9uJ3QgaGF2ZSB0aW1lIHRvIGNvbXB1dGUgdGhpcyBoYWxmLgogICAgICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIHRoZSBlbnRpcmUgcmVzdCBvZiB0aGUgc2VxdWVuY2UgZGlmZmVyZW50LgogICAgICAgICAgICAgICAgICAgIHJpZ2h0Q2hhbmdlcyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpZmZDaGFuZ2UobWlkT3JpZ2luYWwgKyAxLCBvcmlnaW5hbEVuZCAtIChtaWRPcmlnaW5hbCArIDEpICsgMSwgbWlkTW9kaWZpZWQgKyAxLCBtb2RpZmllZEVuZCAtIChtaWRNb2RpZmllZCArIDEpICsgMSkKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ29uY2F0ZW5hdGVDaGFuZ2VzKGxlZnRDaGFuZ2VzLCByaWdodENoYW5nZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHdlIGhpdCBoZXJlLCB3ZSBxdWl0IGVhcmx5LCBhbmQgc28gY2FuJ3QgcmV0dXJuIGFueXRoaW5nIG1lYW5pbmdmdWwKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgIG5ldyBEaWZmQ2hhbmdlKG9yaWdpbmFsU3RhcnQsIG9yaWdpbmFsRW5kIC0gb3JpZ2luYWxTdGFydCArIDEsIG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkRW5kIC0gbW9kaWZpZWRTdGFydCArIDEpCiAgICAgICAgICAgIF07CiAgICAgICAgfQogICAgICAgIFdBTEtUUkFDRShkaWFnb25hbEZvcndhcmRCYXNlLCBkaWFnb25hbEZvcndhcmRTdGFydCwgZGlhZ29uYWxGb3J3YXJkRW5kLCBkaWFnb25hbEZvcndhcmRPZmZzZXQsIGRpYWdvbmFsUmV2ZXJzZUJhc2UsIGRpYWdvbmFsUmV2ZXJzZVN0YXJ0LCBkaWFnb25hbFJldmVyc2VFbmQsIGRpYWdvbmFsUmV2ZXJzZU9mZnNldCwgZm9yd2FyZFBvaW50cywgcmV2ZXJzZVBvaW50cywgb3JpZ2luYWxJbmRleCwgb3JpZ2luYWxFbmQsIG1pZE9yaWdpbmFsQXJyLCBtb2RpZmllZEluZGV4LCBtb2RpZmllZEVuZCwgbWlkTW9kaWZpZWRBcnIsIGRlbHRhSXNFdmVuLCBxdWl0RWFybHlBcnIpIHsKICAgICAgICAgICAgbGV0IGZvcndhcmRDaGFuZ2VzID0gbnVsbDsKICAgICAgICAgICAgbGV0IHJldmVyc2VDaGFuZ2VzID0gbnVsbDsKICAgICAgICAgICAgLy8gRmlyc3QsIHdhbGsgYmFja3dhcmQgdGhyb3VnaCB0aGUgZm9yd2FyZCBkaWFnb25hbHMgaGlzdG9yeQogICAgICAgICAgICBsZXQgY2hhbmdlSGVscGVyID0gbmV3IERpZmZDaGFuZ2VIZWxwZXIoKTsKICAgICAgICAgICAgbGV0IGRpYWdvbmFsTWluID0gZGlhZ29uYWxGb3J3YXJkU3RhcnQ7CiAgICAgICAgICAgIGxldCBkaWFnb25hbE1heCA9IGRpYWdvbmFsRm9yd2FyZEVuZDsKICAgICAgICAgICAgbGV0IGRpYWdvbmFsUmVsYXRpdmUgPSAobWlkT3JpZ2luYWxBcnJbMF0gLSBtaWRNb2RpZmllZEFyclswXSkgLSBkaWFnb25hbEZvcndhcmRPZmZzZXQ7CiAgICAgICAgICAgIGxldCBsYXN0T3JpZ2luYWxJbmRleCA9IC0xMDczNzQxODI0IC8qIE1JTl9TQUZFX1NNQUxMX0lOVEVHRVIgKi87CiAgICAgICAgICAgIGxldCBoaXN0b3J5SW5kZXggPSB0aGlzLm1fZm9yd2FyZEhpc3RvcnkubGVuZ3RoIC0gMTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBkaWFnb25hbCBpbmRleCBmcm9tIHRoZSByZWxhdGl2ZSBkaWFnb25hbCBudW1iZXIKICAgICAgICAgICAgICAgIGNvbnN0IGRpYWdvbmFsID0gZGlhZ29uYWxSZWxhdGl2ZSArIGRpYWdvbmFsRm9yd2FyZEJhc2U7CiAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IHdoZXJlIHdlIGNhbWUgZnJvbQogICAgICAgICAgICAgICAgaWYgKGRpYWdvbmFsID09PSBkaWFnb25hbE1pbiB8fCAoZGlhZ29uYWwgPCBkaWFnb25hbE1heCAmJiBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsIC0gMV0gPCBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsICsgMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVmVydGljYWwgbGluZSAodGhlIGVsZW1lbnQgaXMgYW4gaW5zZXJ0KQogICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSW5kZXggPSBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsICsgMV07CiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRJbmRleCA9IG9yaWdpbmFsSW5kZXggLSBkaWFnb25hbFJlbGF0aXZlIC0gZGlhZ29uYWxGb3J3YXJkT2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEluZGV4IDwgbGFzdE9yaWdpbmFsSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlSGVscGVyLk1hcmtOZXh0Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxhc3RPcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxJbmRleDsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VIZWxwZXIuQWRkTW9kaWZpZWRFbGVtZW50KG9yaWdpbmFsSW5kZXggKyAxLCBtb2RpZmllZEluZGV4KTsKICAgICAgICAgICAgICAgICAgICBkaWFnb25hbFJlbGF0aXZlID0gKGRpYWdvbmFsICsgMSkgLSBkaWFnb25hbEZvcndhcmRCYXNlOyAvL1NldHVwIGZvciB0aGUgbmV4dCBpdGVyYXRpb24KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEhvcml6b250YWwgbGluZSAodGhlIGVsZW1lbnQgaXMgYSBkZWxldGlvbikKICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gZm9yd2FyZFBvaW50c1tkaWFnb25hbCAtIDFdICsgMTsKICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEluZGV4ID0gb3JpZ2luYWxJbmRleCAtIGRpYWdvbmFsUmVsYXRpdmUgLSBkaWFnb25hbEZvcndhcmRPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSW5kZXggPCBsYXN0T3JpZ2luYWxJbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VIZWxwZXIuTWFya05leHRDaGFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGFzdE9yaWdpbmFsSW5kZXggPSBvcmlnaW5hbEluZGV4IC0gMTsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VIZWxwZXIuQWRkT3JpZ2luYWxFbGVtZW50KG9yaWdpbmFsSW5kZXgsIG1vZGlmaWVkSW5kZXggKyAxKTsKICAgICAgICAgICAgICAgICAgICBkaWFnb25hbFJlbGF0aXZlID0gKGRpYWdvbmFsIC0gMSkgLSBkaWFnb25hbEZvcndhcmRCYXNlOyAvL1NldHVwIGZvciB0aGUgbmV4dCBpdGVyYXRpb24KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChoaXN0b3J5SW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGZvcndhcmRQb2ludHMgPSB0aGlzLm1fZm9yd2FyZEhpc3RvcnlbaGlzdG9yeUluZGV4XTsKICAgICAgICAgICAgICAgICAgICBkaWFnb25hbEZvcndhcmRCYXNlID0gZm9yd2FyZFBvaW50c1swXTsgLy9XZSBzdG9yZWQgdGhpcyBpbiB0aGUgZmlyc3Qgc3BvdAogICAgICAgICAgICAgICAgICAgIGRpYWdvbmFsTWluID0gMTsKICAgICAgICAgICAgICAgICAgICBkaWFnb25hbE1heCA9IGZvcndhcmRQb2ludHMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoLS1oaXN0b3J5SW5kZXggPj0gLTEpOwogICAgICAgICAgICAvLyBJcm9uaWNhbGx5LCB3ZSBnZXQgdGhlIGZvcndhcmQgY2hhbmdlcyBhcyB0aGUgcmV2ZXJzZSBvZiB0aGUKICAgICAgICAgICAgLy8gb3JkZXIgd2UgYWRkZWQgdGhlbSBzaW5jZSB3ZSB0ZWNobmljYWxseSBhZGRlZCB0aGVtIGJhY2t3YXJkcwogICAgICAgICAgICBmb3J3YXJkQ2hhbmdlcyA9IGNoYW5nZUhlbHBlci5nZXRSZXZlcnNlQ2hhbmdlcygpOwogICAgICAgICAgICBpZiAocXVpdEVhcmx5QXJyWzBdKSB7CiAgICAgICAgICAgICAgICAvLyBUT0RPOiBDYWxjdWxhdGUgYSBwYXJ0aWFsIGZyb20gdGhlIHJldmVyc2UgZGlhZ29uYWxzLgogICAgICAgICAgICAgICAgLy8gICAgICAgRm9yIG5vdywganVzdCBhc3N1bWUgZXZlcnl0aGluZyBhZnRlciB0aGUgbWlkT3JpZ2luYWwvbWlkTW9kaWZpZWQgcG9pbnQgaXMgYSBkaWZmCiAgICAgICAgICAgICAgICBsZXQgb3JpZ2luYWxTdGFydFBvaW50ID0gbWlkT3JpZ2luYWxBcnJbMF0gKyAxOwogICAgICAgICAgICAgICAgbGV0IG1vZGlmaWVkU3RhcnRQb2ludCA9IG1pZE1vZGlmaWVkQXJyWzBdICsgMTsKICAgICAgICAgICAgICAgIGlmIChmb3J3YXJkQ2hhbmdlcyAhPT0gbnVsbCAmJiBmb3J3YXJkQ2hhbmdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdEZvcndhcmRDaGFuZ2UgPSBmb3J3YXJkQ2hhbmdlc1tmb3J3YXJkQ2hhbmdlcy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFN0YXJ0UG9pbnQgPSBNYXRoLm1heChvcmlnaW5hbFN0YXJ0UG9pbnQsIGxhc3RGb3J3YXJkQ2hhbmdlLmdldE9yaWdpbmFsRW5kKCkpOwogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkU3RhcnRQb2ludCA9IE1hdGgubWF4KG1vZGlmaWVkU3RhcnRQb2ludCwgbGFzdEZvcndhcmRDaGFuZ2UuZ2V0TW9kaWZpZWRFbmQoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXZlcnNlQ2hhbmdlcyA9IFsKICAgICAgICAgICAgICAgICAgICBuZXcgRGlmZkNoYW5nZShvcmlnaW5hbFN0YXJ0UG9pbnQsIG9yaWdpbmFsRW5kIC0gb3JpZ2luYWxTdGFydFBvaW50ICsgMSwgbW9kaWZpZWRTdGFydFBvaW50LCBtb2RpZmllZEVuZCAtIG1vZGlmaWVkU3RhcnRQb2ludCArIDEpCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gTm93IHdhbGsgYmFja3dhcmQgdGhyb3VnaCB0aGUgcmV2ZXJzZSBkaWFnb25hbHMgaGlzdG9yeQogICAgICAgICAgICAgICAgY2hhbmdlSGVscGVyID0gbmV3IERpZmZDaGFuZ2VIZWxwZXIoKTsKICAgICAgICAgICAgICAgIGRpYWdvbmFsTWluID0gZGlhZ29uYWxSZXZlcnNlU3RhcnQ7CiAgICAgICAgICAgICAgICBkaWFnb25hbE1heCA9IGRpYWdvbmFsUmV2ZXJzZUVuZDsKICAgICAgICAgICAgICAgIGRpYWdvbmFsUmVsYXRpdmUgPSAobWlkT3JpZ2luYWxBcnJbMF0gLSBtaWRNb2RpZmllZEFyclswXSkgLSBkaWFnb25hbFJldmVyc2VPZmZzZXQ7CiAgICAgICAgICAgICAgICBsYXN0T3JpZ2luYWxJbmRleCA9IDEwNzM3NDE4MjQgLyogTUFYX1NBRkVfU01BTExfSU5URUdFUiAqLzsKICAgICAgICAgICAgICAgIGhpc3RvcnlJbmRleCA9IChkZWx0YUlzRXZlbikgPyB0aGlzLm1fcmV2ZXJzZUhpc3RvcnkubGVuZ3RoIC0gMSA6IHRoaXMubV9yZXZlcnNlSGlzdG9yeS5sZW5ndGggLSAyOwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZGlhZ29uYWwgaW5kZXggZnJvbSB0aGUgcmVsYXRpdmUgZGlhZ29uYWwgbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlhZ29uYWwgPSBkaWFnb25hbFJlbGF0aXZlICsgZGlhZ29uYWxSZXZlcnNlQmFzZTsKICAgICAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IHdoZXJlIHdlIGNhbWUgZnJvbQogICAgICAgICAgICAgICAgICAgIGlmIChkaWFnb25hbCA9PT0gZGlhZ29uYWxNaW4gfHwgKGRpYWdvbmFsIDwgZGlhZ29uYWxNYXggJiYgcmV2ZXJzZVBvaW50c1tkaWFnb25hbCAtIDFdID49IHJldmVyc2VQb2ludHNbZGlhZ29uYWwgKyAxXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9yaXpvbnRhbCBsaW5lICh0aGUgZWxlbWVudCBpcyBhIGRlbGV0aW9uKSkKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleCA9IHJldmVyc2VQb2ludHNbZGlhZ29uYWwgKyAxXSAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkSW5kZXggPSBvcmlnaW5hbEluZGV4IC0gZGlhZ29uYWxSZWxhdGl2ZSAtIGRpYWdvbmFsUmV2ZXJzZU9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSW5kZXggPiBsYXN0T3JpZ2luYWxJbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlSGVscGVyLk1hcmtOZXh0Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE9yaWdpbmFsSW5kZXggPSBvcmlnaW5hbEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlSGVscGVyLkFkZE9yaWdpbmFsRWxlbWVudChvcmlnaW5hbEluZGV4ICsgMSwgbW9kaWZpZWRJbmRleCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBkaWFnb25hbFJlbGF0aXZlID0gKGRpYWdvbmFsICsgMSkgLSBkaWFnb25hbFJldmVyc2VCYXNlOyAvL1NldHVwIGZvciB0aGUgbmV4dCBpdGVyYXRpb24KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnRpY2FsIGxpbmUgKHRoZSBlbGVtZW50IGlzIGFuIGluc2VydGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleCA9IHJldmVyc2VQb2ludHNbZGlhZ29uYWwgLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRJbmRleCA9IG9yaWdpbmFsSW5kZXggLSBkaWFnb25hbFJlbGF0aXZlIC0gZGlhZ29uYWxSZXZlcnNlT2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJbmRleCA+IGxhc3RPcmlnaW5hbEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VIZWxwZXIuTWFya05leHRDaGFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBsYXN0T3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUhlbHBlci5BZGRNb2RpZmllZEVsZW1lbnQob3JpZ2luYWxJbmRleCArIDEsIG1vZGlmaWVkSW5kZXggKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ29uYWxSZWxhdGl2ZSA9IChkaWFnb25hbCAtIDEpIC0gZGlhZ29uYWxSZXZlcnNlQmFzZTsgLy9TZXR1cCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChoaXN0b3J5SW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlUG9pbnRzID0gdGhpcy5tX3JldmVyc2VIaXN0b3J5W2hpc3RvcnlJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdvbmFsUmV2ZXJzZUJhc2UgPSByZXZlcnNlUG9pbnRzWzBdOyAvL1dlIHN0b3JlZCB0aGlzIGluIHRoZSBmaXJzdCBzcG90CiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdvbmFsTWluID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ29uYWxNYXggPSByZXZlcnNlUG9pbnRzLmxlbmd0aCAtIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1oaXN0b3J5SW5kZXggPj0gLTEpOwogICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSByZXZlcnNlIGhpc3Rvcnkgd2lsbCBmaW5kIGRpZmZzIHRoYXQKICAgICAgICAgICAgICAgIC8vIGFyZSBjb3JyZWN0LCBidXQgbm90IGludHVpdGl2ZSwgc28gd2UgbmVlZCBzaGlmdCB0aGVtLgogICAgICAgICAgICAgICAgcmV2ZXJzZUNoYW5nZXMgPSBjaGFuZ2VIZWxwZXIuZ2V0Q2hhbmdlcygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbmNhdGVuYXRlQ2hhbmdlcyhmb3J3YXJkQ2hhbmdlcywgcmV2ZXJzZUNoYW5nZXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHaXZlbiB0aGUgcmFuZ2UgdG8gY29tcHV0ZSB0aGUgZGlmZiBvbiwgdGhpcyBtZXRob2QgZmluZHMgdGhlIHBvaW50OgogICAgICAgICAqIChtaWRPcmlnaW5hbCwgbWlkTW9kaWZpZWQpCiAgICAgICAgICogdGhhdCBleGlzdHMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgTENTIG9mIHRoZSB0d28gc2VxdWVuY2VzIGFuZAogICAgICAgICAqIGlzIHRoZSBwb2ludCBhdCB3aGljaCB0aGUgTENTIHByb2JsZW0gbWF5IGJlIGJyb2tlbiBkb3duIHJlY3Vyc2l2ZWx5LgogICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgdHJ5IHRvIGtlZXAgdGhlIExDUyB0cmFjZSBpbiBtZW1vcnkuIElmIHRoZSBMQ1MgcmVjdXJzaW9uCiAgICAgICAgICogcG9pbnQgaXMgY2FsY3VsYXRlZCBhbmQgdGhlIGZ1bGwgdHJhY2UgaXMgYXZhaWxhYmxlIGluIG1lbW9yeSwgdGhlbiB0aGlzIG1ldGhvZAogICAgICAgICAqIHdpbGwgcmV0dXJuIHRoZSBjaGFuZ2UgbGlzdC4KICAgICAgICAgKiBAcGFyYW0gb3JpZ2luYWxTdGFydCBUaGUgc3RhcnQgYm91bmQgb2YgdGhlIG9yaWdpbmFsIHNlcXVlbmNlIHJhbmdlCiAgICAgICAgICogQHBhcmFtIG9yaWdpbmFsRW5kIFRoZSBlbmQgYm91bmQgb2YgdGhlIG9yaWdpbmFsIHNlcXVlbmNlIHJhbmdlCiAgICAgICAgICogQHBhcmFtIG1vZGlmaWVkU3RhcnQgVGhlIHN0YXJ0IGJvdW5kIG9mIHRoZSBtb2RpZmllZCBzZXF1ZW5jZSByYW5nZQogICAgICAgICAqIEBwYXJhbSBtb2RpZmllZEVuZCBUaGUgZW5kIGJvdW5kIG9mIHRoZSBtb2RpZmllZCBzZXF1ZW5jZSByYW5nZQogICAgICAgICAqIEBwYXJhbSBtaWRPcmlnaW5hbCBUaGUgbWlkZGxlIHBvaW50IG9mIHRoZSBvcmlnaW5hbCBzZXF1ZW5jZSByYW5nZQogICAgICAgICAqIEBwYXJhbSBtaWRNb2RpZmllZCBUaGUgbWlkZGxlIHBvaW50IG9mIHRoZSBtb2RpZmllZCBzZXF1ZW5jZSByYW5nZQogICAgICAgICAqIEByZXR1cm5zIFRoZSBkaWZmIGNoYW5nZXMsIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG51bGwKICAgICAgICAgKi8KICAgICAgICBDb21wdXRlUmVjdXJzaW9uUG9pbnQob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxFbmQsIG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkRW5kLCBtaWRPcmlnaW5hbEFyciwgbWlkTW9kaWZpZWRBcnIsIHF1aXRFYXJseUFycikgewogICAgICAgICAgICBsZXQgb3JpZ2luYWxJbmRleCA9IDAsIG1vZGlmaWVkSW5kZXggPSAwOwogICAgICAgICAgICBsZXQgZGlhZ29uYWxGb3J3YXJkU3RhcnQgPSAwLCBkaWFnb25hbEZvcndhcmRFbmQgPSAwOwogICAgICAgICAgICBsZXQgZGlhZ29uYWxSZXZlcnNlU3RhcnQgPSAwLCBkaWFnb25hbFJldmVyc2VFbmQgPSAwOwogICAgICAgICAgICAvLyBUbyB0cmF2ZXJzZSB0aGUgZWRpdCBncmFwaCBhbmQgcHJvZHVjZSB0aGUgcHJvcGVyIExDUywgb3VyIGFjdHVhbAogICAgICAgICAgICAvLyBzdGFydCBwb3NpdGlvbiBpcyBqdXN0IG91dHNpZGUgdGhlIGdpdmVuIGJvdW5kYXJ5CiAgICAgICAgICAgIG9yaWdpbmFsU3RhcnQtLTsKICAgICAgICAgICAgbW9kaWZpZWRTdGFydC0tOwogICAgICAgICAgICAvLyBXZSBzZXQgdGhlc2UgdXAgdG8gbWFrZSB0aGUgY29tcGlsZXIgaGFwcHksIGJ1dCB0aGV5IHdpbGwKICAgICAgICAgICAgLy8gYmUgcmVwbGFjZWQgYmVmb3JlIHdlIHJldHVybiB3aXRoIHRoZSBhY3R1YWwgcmVjdXJzaW9uIHBvaW50CiAgICAgICAgICAgIG1pZE9yaWdpbmFsQXJyWzBdID0gMDsKICAgICAgICAgICAgbWlkTW9kaWZpZWRBcnJbMF0gPSAwOwogICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGhpc3RvcnkKICAgICAgICAgICAgdGhpcy5tX2ZvcndhcmRIaXN0b3J5ID0gW107CiAgICAgICAgICAgIHRoaXMubV9yZXZlcnNlSGlzdG9yeSA9IFtdOwogICAgICAgICAgICAvLyBFYWNoIGNlbGwgaW4gdGhlIHR3byBhcnJheXMgY29ycmVzcG9uZHMgdG8gYSBkaWFnb25hbCBpbiB0aGUgZWRpdCBncmFwaC4KICAgICAgICAgICAgLy8gVGhlIGludGVnZXIgdmFsdWUgaW4gdGhlIGNlbGwgcmVwcmVzZW50cyB0aGUgb3JpZ2luYWxJbmRleCBvZiB0aGUgZnVydGhlc3QKICAgICAgICAgICAgLy8gcmVhY2hpbmcgcG9pbnQgZm91bmQgc28gZmFyIHRoYXQgZW5kcyBpbiB0aGF0IGRpYWdvbmFsLgogICAgICAgICAgICAvLyBUaGUgbW9kaWZpZWRJbmRleCBjYW4gYmUgY29tcHV0ZWQgbWF0aGVtYXRpY2FsbHkgZnJvbSB0aGUgb3JpZ2luYWxJbmRleCBhbmQgdGhlIGRpYWdvbmFsIG51bWJlci4KICAgICAgICAgICAgY29uc3QgbWF4RGlmZmVyZW5jZXMgPSAob3JpZ2luYWxFbmQgLSBvcmlnaW5hbFN0YXJ0KSArIChtb2RpZmllZEVuZCAtIG1vZGlmaWVkU3RhcnQpOwogICAgICAgICAgICBjb25zdCBudW1EaWFnb25hbHMgPSBtYXhEaWZmZXJlbmNlcyArIDE7CiAgICAgICAgICAgIGNvbnN0IGZvcndhcmRQb2ludHMgPSBuZXcgSW50MzJBcnJheShudW1EaWFnb25hbHMpOwogICAgICAgICAgICBjb25zdCByZXZlcnNlUG9pbnRzID0gbmV3IEludDMyQXJyYXkobnVtRGlhZ29uYWxzKTsKICAgICAgICAgICAgLy8gZGlhZ29uYWxGb3J3YXJkQmFzZTogSW5kZXggaW50byBmb3J3YXJkUG9pbnRzIG9mIHRoZSBkaWFnb25hbCB3aGljaCBwYXNzZXMgdGhyb3VnaCAob3JpZ2luYWxTdGFydCwgbW9kaWZpZWRTdGFydCkKICAgICAgICAgICAgLy8gZGlhZ29uYWxSZXZlcnNlQmFzZTogSW5kZXggaW50byByZXZlcnNlUG9pbnRzIG9mIHRoZSBkaWFnb25hbCB3aGljaCBwYXNzZXMgdGhyb3VnaCAob3JpZ2luYWxFbmQsIG1vZGlmaWVkRW5kKQogICAgICAgICAgICBjb25zdCBkaWFnb25hbEZvcndhcmRCYXNlID0gKG1vZGlmaWVkRW5kIC0gbW9kaWZpZWRTdGFydCk7CiAgICAgICAgICAgIGNvbnN0IGRpYWdvbmFsUmV2ZXJzZUJhc2UgPSAob3JpZ2luYWxFbmQgLSBvcmlnaW5hbFN0YXJ0KTsKICAgICAgICAgICAgLy8gZGlhZ29uYWxGb3J3YXJkT2Zmc2V0OiBHZW9tZXRyaWMgb2Zmc2V0IHdoaWNoIGFsbG93cyBtb2RpZmllZEluZGV4IHRvIGJlIGNvbXB1dGVkIGZyb20gb3JpZ2luYWxJbmRleCBhbmQgdGhlCiAgICAgICAgICAgIC8vICAgIGRpYWdvbmFsIG51bWJlciAocmVsYXRpdmUgdG8gZGlhZ29uYWxGb3J3YXJkQmFzZSkKICAgICAgICAgICAgLy8gZGlhZ29uYWxSZXZlcnNlT2Zmc2V0OiBHZW9tZXRyaWMgb2Zmc2V0IHdoaWNoIGFsbG93cyBtb2RpZmllZEluZGV4IHRvIGJlIGNvbXB1dGVkIGZyb20gb3JpZ2luYWxJbmRleCBhbmQgdGhlCiAgICAgICAgICAgIC8vICAgIGRpYWdvbmFsIG51bWJlciAocmVsYXRpdmUgdG8gZGlhZ29uYWxSZXZlcnNlQmFzZSkKICAgICAgICAgICAgY29uc3QgZGlhZ29uYWxGb3J3YXJkT2Zmc2V0ID0gKG9yaWdpbmFsU3RhcnQgLSBtb2RpZmllZFN0YXJ0KTsKICAgICAgICAgICAgY29uc3QgZGlhZ29uYWxSZXZlcnNlT2Zmc2V0ID0gKG9yaWdpbmFsRW5kIC0gbW9kaWZpZWRFbmQpOwogICAgICAgICAgICAvLyBkZWx0YTogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZW5kIGRpYWdvbmFsIGFuZCB0aGUgc3RhcnQgZGlhZ29uYWwuIFRoaXMgaXMgdXNlZCB0byByZWxhdGUgZGlhZ29uYWwgbnVtYmVycwogICAgICAgICAgICAvLyAgIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBkaWFnb25hbCB3aXRoIGRpYWdvbmFsIG51bWJlcnMgcmVsYXRpdmUgdG8gdGhlIGVuZCBkaWFnb25hbC4KICAgICAgICAgICAgLy8gVGhlIEV2ZW4vT2Rkbi1uZXNzIG9mIHRoaXMgZGVsdGEgaXMgaW1wb3J0YW50IGZvciBkZXRlcm1pbmluZyB3aGVuIHdlIHNob3VsZCBjaGVjayBmb3Igb3ZlcmxhcAogICAgICAgICAgICBjb25zdCBkZWx0YSA9IGRpYWdvbmFsUmV2ZXJzZUJhc2UgLSBkaWFnb25hbEZvcndhcmRCYXNlOwogICAgICAgICAgICBjb25zdCBkZWx0YUlzRXZlbiA9IChkZWx0YSAlIDIgPT09IDApOwogICAgICAgICAgICAvLyBIZXJlIHdlIHNldCB1cCB0aGUgc3RhcnQgYW5kIGVuZCBwb2ludHMgYXMgdGhlIGZ1cnRoZXN0IHBvaW50cyBmb3VuZCBzbyBmYXIKICAgICAgICAgICAgLy8gaW4gYm90aCB0aGUgZm9yd2FyZCBhbmQgcmV2ZXJzZSBkaXJlY3Rpb25zLCByZXNwZWN0aXZlbHkKICAgICAgICAgICAgZm9yd2FyZFBvaW50c1tkaWFnb25hbEZvcndhcmRCYXNlXSA9IG9yaWdpbmFsU3RhcnQ7CiAgICAgICAgICAgIHJldmVyc2VQb2ludHNbZGlhZ29uYWxSZXZlcnNlQmFzZV0gPSBvcmlnaW5hbEVuZDsKICAgICAgICAgICAgLy8gUmVtZW1iZXIgaWYgd2UgcXVpdCBlYXJseSwgYW5kIHRodXMgbmVlZCB0byBkbyBhIGJlc3QtZWZmb3J0IHJlc3VsdCBpbnN0ZWFkIG9mIGEgcmVhbCByZXN1bHQuCiAgICAgICAgICAgIHF1aXRFYXJseUFyclswXSA9IGZhbHNlOwogICAgICAgICAgICAvLyBBIGNvdXBsZSBvZiBwb2ludHM6CiAgICAgICAgICAgIC8vIC0tV2l0aCB0aGlzIG1ldGhvZCwgd2UgaXRlcmF0ZSBvbiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBzZXF1ZW5jZXMuCiAgICAgICAgICAgIC8vICAgVGhlIG1vcmUgZGlmZmVyZW5jZXMgdGhlcmUgYWN0dWFsbHkgYXJlLCB0aGUgbG9uZ2VyIHRoaXMgd2lsbCB0YWtlLgogICAgICAgICAgICAvLyAtLUFsc28sIGFzIHRoZSBudW1iZXIgb2YgZGlmZmVyZW5jZXMgaW5jcmVhc2VzLCB3ZSBoYXZlIHRvIHNlYXJjaCBvbiBkaWFnb25hbHMgZnVydGhlcgogICAgICAgICAgICAvLyAgIGF3YXkgZnJvbSB0aGUgcmVmZXJlbmNlIGRpYWdvbmFsICh3aGljaCBpcyBkaWFnb25hbEZvcndhcmRCYXNlIGZvciBmb3J3YXJkLCBkaWFnb25hbFJldmVyc2VCYXNlIGZvciByZXZlcnNlKS4KICAgICAgICAgICAgLy8gLS1XZSBleHRlbmQgb24gZXZlbiBkaWFnb25hbHMgKHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2UgZGlhZ29uYWwpIG9ubHkgd2hlbiBudW1EaWZmZXJlbmNlcwogICAgICAgICAgICAvLyAgIGlzIGV2ZW4gYW5kIG9kZCBkaWFnb25hbHMgb25seSB3aGVuIG51bURpZmZlcmVuY2VzIGlzIG9kZC4KICAgICAgICAgICAgZm9yIChsZXQgbnVtRGlmZmVyZW5jZXMgPSAxOyBudW1EaWZmZXJlbmNlcyA8PSAobWF4RGlmZmVyZW5jZXMgLyAyKSArIDE7IG51bURpZmZlcmVuY2VzKyspIHsKICAgICAgICAgICAgICAgIGxldCBmdXJ0aGVzdE9yaWdpbmFsSW5kZXggPSAwOwogICAgICAgICAgICAgICAgbGV0IGZ1cnRoZXN0TW9kaWZpZWRJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAvLyBSdW4gdGhlIGFsZ29yaXRobSBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24KICAgICAgICAgICAgICAgIGRpYWdvbmFsRm9yd2FyZFN0YXJ0ID0gdGhpcy5DbGlwRGlhZ29uYWxCb3VuZChkaWFnb25hbEZvcndhcmRCYXNlIC0gbnVtRGlmZmVyZW5jZXMsIG51bURpZmZlcmVuY2VzLCBkaWFnb25hbEZvcndhcmRCYXNlLCBudW1EaWFnb25hbHMpOwogICAgICAgICAgICAgICAgZGlhZ29uYWxGb3J3YXJkRW5kID0gdGhpcy5DbGlwRGlhZ29uYWxCb3VuZChkaWFnb25hbEZvcndhcmRCYXNlICsgbnVtRGlmZmVyZW5jZXMsIG51bURpZmZlcmVuY2VzLCBkaWFnb25hbEZvcndhcmRCYXNlLCBudW1EaWFnb25hbHMpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgZGlhZ29uYWwgPSBkaWFnb25hbEZvcndhcmRTdGFydDsgZGlhZ29uYWwgPD0gZGlhZ29uYWxGb3J3YXJkRW5kOyBkaWFnb25hbCArPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU1RFUCAxOiBXZSBleHRlbmQgdGhlIGZ1cnRoZXN0IHJlYWNoaW5nIHBvaW50IGluIHRoZSBwcmVzZW50IGRpYWdvbmFsCiAgICAgICAgICAgICAgICAgICAgLy8gYnkgbG9va2luZyBhdCB0aGUgZGlhZ29uYWxzIGFib3ZlIGFuZCBiZWxvdyBhbmQgcGlja2luZyB0aGUgb25lIHdob3NlIHBvaW50CiAgICAgICAgICAgICAgICAgICAgLy8gaXMgZnVydGhlciBhd2F5IGZyb20gdGhlIHN0YXJ0IHBvaW50IChvcmlnaW5hbFN0YXJ0LCBtb2RpZmllZFN0YXJ0KQogICAgICAgICAgICAgICAgICAgIGlmIChkaWFnb25hbCA9PT0gZGlhZ29uYWxGb3J3YXJkU3RhcnQgfHwgKGRpYWdvbmFsIDwgZGlhZ29uYWxGb3J3YXJkRW5kICYmIGZvcndhcmRQb2ludHNbZGlhZ29uYWwgLSAxXSA8IGZvcndhcmRQb2ludHNbZGlhZ29uYWwgKyAxXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleCA9IGZvcndhcmRQb2ludHNbZGlhZ29uYWwgKyAxXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSW5kZXggPSBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsIC0gMV0gKyAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEluZGV4ID0gb3JpZ2luYWxJbmRleCAtIChkaWFnb25hbCAtIGRpYWdvbmFsRm9yd2FyZEJhc2UpIC0gZGlhZ29uYWxGb3J3YXJkT2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgb3JpZ2luYWxJbmRleCBzbyB3ZSBjYW4gdGVzdCBmb3IgZmFsc2Ugb3ZlcmxhcCBpbiBzdGVwIDMKICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wT3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgLy8gU1RFUCAyOiBXZSBjYW4gY29udGludWUgdG8gZXh0ZW5kIHRoZSBmdXJ0aGVzdCByZWFjaGluZyBwb2ludCBpbiB0aGUgcHJlc2VudCBkaWFnb25hbAogICAgICAgICAgICAgICAgICAgIC8vIHNvIGxvbmcgYXMgdGhlIGVsZW1lbnRzIGFyZSBlcXVhbC4KICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3JpZ2luYWxJbmRleCA8IG9yaWdpbmFsRW5kICYmIG1vZGlmaWVkSW5kZXggPCBtb2RpZmllZEVuZCAmJiB0aGlzLkVsZW1lbnRzQXJlRXF1YWwob3JpZ2luYWxJbmRleCArIDEsIG1vZGlmaWVkSW5kZXggKyAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yd2FyZFBvaW50c1tkaWFnb25hbF0gPSBvcmlnaW5hbEluZGV4OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEluZGV4ICsgbW9kaWZpZWRJbmRleCA+IGZ1cnRoZXN0T3JpZ2luYWxJbmRleCArIGZ1cnRoZXN0TW9kaWZpZWRJbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdXJ0aGVzdE9yaWdpbmFsSW5kZXggPSBvcmlnaW5hbEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICBmdXJ0aGVzdE1vZGlmaWVkSW5kZXggPSBtb2RpZmllZEluZGV4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBTVEVQIDM6IElmIGRlbHRhIGlzIG9kZCAob3ZlcmxhcCBmaXJzdCBoYXBwZW5zIG9uIGZvcndhcmQgd2hlbiBkZWx0YSBpcyBvZGQpCiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGRpYWdvbmFsIGlzIGluIHRoZSByYW5nZSBvZiByZXZlcnNlIGRpYWdvbmFscyBjb21wdXRlZCBmb3IgbnVtRGlmZmVyZW5jZXMtMQogICAgICAgICAgICAgICAgICAgIC8vICh0aGUgcHJldmlvdXMgaXRlcmF0aW9uOyB3ZSBoYXZlbid0IGNvbXB1dGVkIHJldmVyc2UgZGlhZ29uYWxzIGZvciBudW1EaWZmZXJlbmNlcyB5ZXQpCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBjaGVjayBmb3Igb3ZlcmxhcC4KICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbHRhSXNFdmVuICYmIE1hdGguYWJzKGRpYWdvbmFsIC0gZGlhZ29uYWxSZXZlcnNlQmFzZSkgPD0gKG51bURpZmZlcmVuY2VzIC0gMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSW5kZXggPj0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZE9yaWdpbmFsQXJyWzBdID0gb3JpZ2luYWxJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZE1vZGlmaWVkQXJyWzBdID0gbW9kaWZpZWRJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wT3JpZ2luYWxJbmRleCA8PSByZXZlcnNlUG9pbnRzW2RpYWdvbmFsXSAmJiAxNDQ3IC8qIE1heERpZmZlcmVuY2VzSGlzdG9yeSAqLyA+IDAgJiYgbnVtRGlmZmVyZW5jZXMgPD0gKDE0NDcgLyogTWF4RGlmZmVyZW5jZXNIaXN0b3J5ICovICsgMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCSU5HTyEgV2Ugb3ZlcmxhcHBlZCwgYW5kIHdlIGhhdmUgdGhlIGZ1bGwgdHJhY2UgaW4gbWVtb3J5IQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLldBTEtUUkFDRShkaWFnb25hbEZvcndhcmRCYXNlLCBkaWFnb25hbEZvcndhcmRTdGFydCwgZGlhZ29uYWxGb3J3YXJkRW5kLCBkaWFnb25hbEZvcndhcmRPZmZzZXQsIGRpYWdvbmFsUmV2ZXJzZUJhc2UsIGRpYWdvbmFsUmV2ZXJzZVN0YXJ0LCBkaWFnb25hbFJldmVyc2VFbmQsIGRpYWdvbmFsUmV2ZXJzZU9mZnNldCwgZm9yd2FyZFBvaW50cywgcmV2ZXJzZVBvaW50cywgb3JpZ2luYWxJbmRleCwgb3JpZ2luYWxFbmQsIG1pZE9yaWdpbmFsQXJyLCBtb2RpZmllZEluZGV4LCBtb2RpZmllZEVuZCwgbWlkTW9kaWZpZWRBcnIsIGRlbHRhSXNFdmVuLCBxdWl0RWFybHlBcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWl0aGVyIGZhbHNlIG92ZXJsYXAsIG9yIHdlIGRpZG4ndCBoYXZlIGVub3VnaCBtZW1vcnkgZm9yIHRoZSBmdWxsIHRyYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCByZXR1cm4gdGhlIHJlY3Vyc2lvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBiZSBxdWl0dGluZyBlYXJseSwgYmVmb3JlIG1vdmluZyBvbiB0byB0aGUgbmV4dCBpdGVyYXRpb24uCiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaExlbmd0aE9mTG9uZ2VzdCA9ICgoZnVydGhlc3RPcmlnaW5hbEluZGV4IC0gb3JpZ2luYWxTdGFydCkgKyAoZnVydGhlc3RNb2RpZmllZEluZGV4IC0gbW9kaWZpZWRTdGFydCkgLSBudW1EaWZmZXJlbmNlcykgLyAyOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlICE9PSBudWxsICYmICF0aGlzLkNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZShmdXJ0aGVzdE9yaWdpbmFsSW5kZXgsIG1hdGNoTGVuZ3RoT2ZMb25nZXN0KSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IGZpbmlzaCwgc28gc2tpcCBhaGVhZCB0byBnZW5lcmF0aW5nIGEgcmVzdWx0IGZyb20gd2hhdCB3ZSBoYXZlLgogICAgICAgICAgICAgICAgICAgIHF1aXRFYXJseUFyclswXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBmdXJ0aGVzdCBkaXN0YW5jZSB3ZSBnb3QgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLgogICAgICAgICAgICAgICAgICAgIG1pZE9yaWdpbmFsQXJyWzBdID0gZnVydGhlc3RPcmlnaW5hbEluZGV4OwogICAgICAgICAgICAgICAgICAgIG1pZE1vZGlmaWVkQXJyWzBdID0gZnVydGhlc3RNb2RpZmllZEluZGV4OwogICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaExlbmd0aE9mTG9uZ2VzdCA+IDAgJiYgMTQ0NyAvKiBNYXhEaWZmZXJlbmNlc0hpc3RvcnkgKi8gPiAwICYmIG51bURpZmZlcmVuY2VzIDw9ICgxNDQ3IC8qIE1heERpZmZlcmVuY2VzSGlzdG9yeSAqLyArIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVub3VnaCBvZiB0aGUgaGlzdG9yeSBpcyBpbiBtZW1vcnkgdG8gd2FsayBpdCBiYWNrd2FyZHMKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV0FMS1RSQUNFKGRpYWdvbmFsRm9yd2FyZEJhc2UsIGRpYWdvbmFsRm9yd2FyZFN0YXJ0LCBkaWFnb25hbEZvcndhcmRFbmQsIGRpYWdvbmFsRm9yd2FyZE9mZnNldCwgZGlhZ29uYWxSZXZlcnNlQmFzZSwgZGlhZ29uYWxSZXZlcnNlU3RhcnQsIGRpYWdvbmFsUmV2ZXJzZUVuZCwgZGlhZ29uYWxSZXZlcnNlT2Zmc2V0LCBmb3J3YXJkUG9pbnRzLCByZXZlcnNlUG9pbnRzLCBvcmlnaW5hbEluZGV4LCBvcmlnaW5hbEVuZCwgbWlkT3JpZ2luYWxBcnIsIG1vZGlmaWVkSW5kZXgsIG1vZGlmaWVkRW5kLCBtaWRNb2RpZmllZEFyciwgZGVsdGFJc0V2ZW4sIHF1aXRFYXJseUFycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkaWRuJ3QgYWN0dWFsbHkgcmVtZW1iZXIgZW5vdWdoIG9mIHRoZSBoaXN0b3J5LgogICAgICAgICAgICAgICAgICAgICAgICAvL1NpbmNlIHdlIGFyZSBxdWl0dGluZyB0aGUgZGlmZiBlYXJseSwgd2UgbmVlZCB0byBzaGlmdCBiYWNrIHRoZSBvcmlnaW5hbFN0YXJ0IGFuZCBtb2RpZmllZCBzdGFydAogICAgICAgICAgICAgICAgICAgICAgICAvL2JhY2sgaW50byB0aGUgYm91bmRhcnkgbGltaXRzIHNpbmNlIHdlIGRlY3JlbWVudGVkIHRoZWlyIHZhbHVlIGFib3ZlIGJleW9uZCB0aGUgYm91bmRhcnkgbGltaXQuCiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydCsrOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpZmZDaGFuZ2Uob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxFbmQgLSBvcmlnaW5hbFN0YXJ0ICsgMSwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQgLSBtb2RpZmllZFN0YXJ0ICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBSdW4gdGhlIGFsZ29yaXRobSBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24KICAgICAgICAgICAgICAgIGRpYWdvbmFsUmV2ZXJzZVN0YXJ0ID0gdGhpcy5DbGlwRGlhZ29uYWxCb3VuZChkaWFnb25hbFJldmVyc2VCYXNlIC0gbnVtRGlmZmVyZW5jZXMsIG51bURpZmZlcmVuY2VzLCBkaWFnb25hbFJldmVyc2VCYXNlLCBudW1EaWFnb25hbHMpOwogICAgICAgICAgICAgICAgZGlhZ29uYWxSZXZlcnNlRW5kID0gdGhpcy5DbGlwRGlhZ29uYWxCb3VuZChkaWFnb25hbFJldmVyc2VCYXNlICsgbnVtRGlmZmVyZW5jZXMsIG51bURpZmZlcmVuY2VzLCBkaWFnb25hbFJldmVyc2VCYXNlLCBudW1EaWFnb25hbHMpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgZGlhZ29uYWwgPSBkaWFnb25hbFJldmVyc2VTdGFydDsgZGlhZ29uYWwgPD0gZGlhZ29uYWxSZXZlcnNlRW5kOyBkaWFnb25hbCArPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU1RFUCAxOiBXZSBleHRlbmQgdGhlIGZ1cnRoZXN0IHJlYWNoaW5nIHBvaW50IGluIHRoZSBwcmVzZW50IGRpYWdvbmFsCiAgICAgICAgICAgICAgICAgICAgLy8gYnkgbG9va2luZyBhdCB0aGUgZGlhZ29uYWxzIGFib3ZlIGFuZCBiZWxvdyBhbmQgcGlja2luZyB0aGUgb25lIHdob3NlIHBvaW50CiAgICAgICAgICAgICAgICAgICAgLy8gaXMgZnVydGhlciBhd2F5IGZyb20gdGhlIHN0YXJ0IHBvaW50IChvcmlnaW5hbEVuZCwgbW9kaWZpZWRFbmQpCiAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWdvbmFsID09PSBkaWFnb25hbFJldmVyc2VTdGFydCB8fCAoZGlhZ29uYWwgPCBkaWFnb25hbFJldmVyc2VFbmQgJiYgcmV2ZXJzZVBvaW50c1tkaWFnb25hbCAtIDFdID49IHJldmVyc2VQb2ludHNbZGlhZ29uYWwgKyAxXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleCA9IHJldmVyc2VQb2ludHNbZGlhZ29uYWwgKyAxXSAtIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbCAtIDFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEluZGV4ID0gb3JpZ2luYWxJbmRleCAtIChkaWFnb25hbCAtIGRpYWdvbmFsUmV2ZXJzZUJhc2UpIC0gZGlhZ29uYWxSZXZlcnNlT2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgb3JpZ2luYWxJbmRleCBzbyB3ZSBjYW4gdGVzdCBmb3IgZmFsc2Ugb3ZlcmxhcAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBPcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxJbmRleDsKICAgICAgICAgICAgICAgICAgICAvLyBTVEVQIDI6IFdlIGNhbiBjb250aW51ZSB0byBleHRlbmQgdGhlIGZ1cnRoZXN0IHJlYWNoaW5nIHBvaW50IGluIHRoZSBwcmVzZW50IGRpYWdvbmFsCiAgICAgICAgICAgICAgICAgICAgLy8gYXMgbG9uZyBhcyB0aGUgZWxlbWVudHMgYXJlIGVxdWFsLgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChvcmlnaW5hbEluZGV4ID4gb3JpZ2luYWxTdGFydCAmJiBtb2RpZmllZEluZGV4ID4gbW9kaWZpZWRTdGFydCAmJiB0aGlzLkVsZW1lbnRzQXJlRXF1YWwob3JpZ2luYWxJbmRleCwgbW9kaWZpZWRJbmRleCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleC0tOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEluZGV4LS07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldmVyc2VQb2ludHNbZGlhZ29uYWxdID0gb3JpZ2luYWxJbmRleDsKICAgICAgICAgICAgICAgICAgICAvLyBTVEVQIDQ6IElmIGRlbHRhIGlzIGV2ZW4gKG92ZXJsYXAgZmlyc3QgaGFwcGVucyBvbiByZXZlcnNlIHdoZW4gZGVsdGEgaXMgZXZlbikKICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZGlhZ29uYWwgaXMgaW4gdGhlIHJhbmdlIG9mIGZvcndhcmQgZGlhZ29uYWxzIGNvbXB1dGVkIGZvciBudW1EaWZmZXJlbmNlcwogICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gY2hlY2sgZm9yIG92ZXJsYXAuCiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhSXNFdmVuICYmIE1hdGguYWJzKGRpYWdvbmFsIC0gZGlhZ29uYWxGb3J3YXJkQmFzZSkgPD0gbnVtRGlmZmVyZW5jZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSW5kZXggPD0gZm9yd2FyZFBvaW50c1tkaWFnb25hbF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZE9yaWdpbmFsQXJyWzBdID0gb3JpZ2luYWxJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZE1vZGlmaWVkQXJyWzBdID0gbW9kaWZpZWRJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wT3JpZ2luYWxJbmRleCA+PSBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsXSAmJiAxNDQ3IC8qIE1heERpZmZlcmVuY2VzSGlzdG9yeSAqLyA+IDAgJiYgbnVtRGlmZmVyZW5jZXMgPD0gKDE0NDcgLyogTWF4RGlmZmVyZW5jZXNIaXN0b3J5ICovICsgMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCSU5HTyEgV2Ugb3ZlcmxhcHBlZCwgYW5kIHdlIGhhdmUgdGhlIGZ1bGwgdHJhY2UgaW4gbWVtb3J5IQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLldBTEtUUkFDRShkaWFnb25hbEZvcndhcmRCYXNlLCBkaWFnb25hbEZvcndhcmRTdGFydCwgZGlhZ29uYWxGb3J3YXJkRW5kLCBkaWFnb25hbEZvcndhcmRPZmZzZXQsIGRpYWdvbmFsUmV2ZXJzZUJhc2UsIGRpYWdvbmFsUmV2ZXJzZVN0YXJ0LCBkaWFnb25hbFJldmVyc2VFbmQsIGRpYWdvbmFsUmV2ZXJzZU9mZnNldCwgZm9yd2FyZFBvaW50cywgcmV2ZXJzZVBvaW50cywgb3JpZ2luYWxJbmRleCwgb3JpZ2luYWxFbmQsIG1pZE9yaWdpbmFsQXJyLCBtb2RpZmllZEluZGV4LCBtb2RpZmllZEVuZCwgbWlkTW9kaWZpZWRBcnIsIGRlbHRhSXNFdmVuLCBxdWl0RWFybHlBcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWl0aGVyIGZhbHNlIG92ZXJsYXAsIG9yIHdlIGRpZG4ndCBoYXZlIGVub3VnaCBtZW1vcnkgZm9yIHRoZSBmdWxsIHRyYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCByZXR1cm4gdGhlIHJlY3Vyc2lvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gU2F2ZSBjdXJyZW50IHZlY3RvcnMgdG8gaGlzdG9yeSBiZWZvcmUgdGhlIG5leHQgaXRlcmF0aW9uCiAgICAgICAgICAgICAgICBpZiAobnVtRGlmZmVyZW5jZXMgPD0gMTQ0NyAvKiBNYXhEaWZmZXJlbmNlc0hpc3RvcnkgKi8pIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgYWxsb2NhdGluZyBzcGFjZSBmb3Igb25lIGV4dHJhIGludCwgd2hpY2ggd2UgZmlsbCB3aXRoCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluZGV4IG9mIHRoZSBkaWFnb25hbCBiYXNlIGluZGV4CiAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAgPSBuZXcgSW50MzJBcnJheShkaWFnb25hbEZvcndhcmRFbmQgLSBkaWFnb25hbEZvcndhcmRTdGFydCArIDIpOwogICAgICAgICAgICAgICAgICAgIHRlbXBbMF0gPSBkaWFnb25hbEZvcndhcmRCYXNlIC0gZGlhZ29uYWxGb3J3YXJkU3RhcnQgKyAxOwogICAgICAgICAgICAgICAgICAgIE15QXJyYXkuQ29weTIoZm9yd2FyZFBvaW50cywgZGlhZ29uYWxGb3J3YXJkU3RhcnQsIHRlbXAsIDEsIGRpYWdvbmFsRm9yd2FyZEVuZCAtIGRpYWdvbmFsRm9yd2FyZFN0YXJ0ICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5tX2ZvcndhcmRIaXN0b3J5LnB1c2godGVtcCk7CiAgICAgICAgICAgICAgICAgICAgdGVtcCA9IG5ldyBJbnQzMkFycmF5KGRpYWdvbmFsUmV2ZXJzZUVuZCAtIGRpYWdvbmFsUmV2ZXJzZVN0YXJ0ICsgMik7CiAgICAgICAgICAgICAgICAgICAgdGVtcFswXSA9IGRpYWdvbmFsUmV2ZXJzZUJhc2UgLSBkaWFnb25hbFJldmVyc2VTdGFydCArIDE7CiAgICAgICAgICAgICAgICAgICAgTXlBcnJheS5Db3B5MihyZXZlcnNlUG9pbnRzLCBkaWFnb25hbFJldmVyc2VTdGFydCwgdGVtcCwgMSwgZGlhZ29uYWxSZXZlcnNlRW5kIC0gZGlhZ29uYWxSZXZlcnNlU3RhcnQgKyAxKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLm1fcmV2ZXJzZUhpc3RvcnkucHVzaCh0ZW1wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlbiB3ZSBoYXZlIHRoZSBmdWxsIHRyYWNlIGluIGhpc3RvcnkuIFdlIGp1c3QgaGF2ZSB0byBjb252ZXJ0IGl0IHRvIGEgY2hhbmdlIGxpc3QKICAgICAgICAgICAgLy8gTk9URTogVGhpcyBwYXJ0IGlzIGEgYml0IG1lc3N5CiAgICAgICAgICAgIHJldHVybiB0aGlzLldBTEtUUkFDRShkaWFnb25hbEZvcndhcmRCYXNlLCBkaWFnb25hbEZvcndhcmRTdGFydCwgZGlhZ29uYWxGb3J3YXJkRW5kLCBkaWFnb25hbEZvcndhcmRPZmZzZXQsIGRpYWdvbmFsUmV2ZXJzZUJhc2UsIGRpYWdvbmFsUmV2ZXJzZVN0YXJ0LCBkaWFnb25hbFJldmVyc2VFbmQsIGRpYWdvbmFsUmV2ZXJzZU9mZnNldCwgZm9yd2FyZFBvaW50cywgcmV2ZXJzZVBvaW50cywgb3JpZ2luYWxJbmRleCwgb3JpZ2luYWxFbmQsIG1pZE9yaWdpbmFsQXJyLCBtb2RpZmllZEluZGV4LCBtb2RpZmllZEVuZCwgbWlkTW9kaWZpZWRBcnIsIGRlbHRhSXNFdmVuLCBxdWl0RWFybHlBcnIpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTaGlmdHMgdGhlIGdpdmVuIGNoYW5nZXMgdG8gcHJvdmlkZSBhIG1vcmUgaW50dWl0aXZlIGRpZmYuCiAgICAgICAgICogV2hpbGUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYSBkaWZmIG1hdGNoZXMgdGhlIGZpcnN0IGVsZW1lbnQgYWZ0ZXIgdGhlIGRpZmYsCiAgICAgICAgICogd2Ugc2hpZnQgdGhlIGRpZmYgZG93bi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjaGFuZ2VzIFRoZSBsaXN0IG9mIGNoYW5nZXMgdG8gc2hpZnQKICAgICAgICAgKiBAcmV0dXJucyBUaGUgc2hpZnRlZCBjaGFuZ2VzCiAgICAgICAgICovCiAgICAgICAgUHJldHRpZnlDaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgLy8gU2hpZnQgYWxsIHRoZSBjaGFuZ2VzIGRvd24gZmlyc3QKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2UgPSBjaGFuZ2VzW2ldOwogICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTdG9wID0gKGkgPCBjaGFuZ2VzLmxlbmd0aCAtIDEpID8gY2hhbmdlc1tpICsgMV0ub3JpZ2luYWxTdGFydCA6IHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2gubGVuZ3RoOwogICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRTdG9wID0gKGkgPCBjaGFuZ2VzLmxlbmd0aCAtIDEpID8gY2hhbmdlc1tpICsgMV0ubW9kaWZpZWRTdGFydCA6IHRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2gubGVuZ3RoOwogICAgICAgICAgICAgICAgY29uc3QgY2hlY2tPcmlnaW5hbCA9IGNoYW5nZS5vcmlnaW5hbExlbmd0aCA+IDA7CiAgICAgICAgICAgICAgICBjb25zdCBjaGVja01vZGlmaWVkID0gY2hhbmdlLm1vZGlmaWVkTGVuZ3RoID4gMDsKICAgICAgICAgICAgICAgIHdoaWxlIChjaGFuZ2Uub3JpZ2luYWxTdGFydCArIGNoYW5nZS5vcmlnaW5hbExlbmd0aCA8IG9yaWdpbmFsU3RvcAogICAgICAgICAgICAgICAgICAgICYmIGNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgY2hhbmdlLm1vZGlmaWVkTGVuZ3RoIDwgbW9kaWZpZWRTdG9wCiAgICAgICAgICAgICAgICAgICAgJiYgKCFjaGVja09yaWdpbmFsIHx8IHRoaXMuT3JpZ2luYWxFbGVtZW50c0FyZUVxdWFsKGNoYW5nZS5vcmlnaW5hbFN0YXJ0LCBjaGFuZ2Uub3JpZ2luYWxTdGFydCArIGNoYW5nZS5vcmlnaW5hbExlbmd0aCkpCiAgICAgICAgICAgICAgICAgICAgJiYgKCFjaGVja01vZGlmaWVkIHx8IHRoaXMuTW9kaWZpZWRFbGVtZW50c0FyZUVxdWFsKGNoYW5nZS5tb2RpZmllZFN0YXJ0LCBjaGFuZ2UubW9kaWZpZWRTdGFydCArIGNoYW5nZS5tb2RpZmllZExlbmd0aCkpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRTdHJpY3RFcXVhbCA9IHRoaXMuRWxlbWVudHNBcmVTdHJpY3RFcXVhbChjaGFuZ2Uub3JpZ2luYWxTdGFydCwgY2hhbmdlLm1vZGlmaWVkU3RhcnQpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZFN0cmljdEVxdWFsID0gdGhpcy5FbGVtZW50c0FyZVN0cmljdEVxdWFsKGNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgY2hhbmdlLm9yaWdpbmFsTGVuZ3RoLCBjaGFuZ2UubW9kaWZpZWRTdGFydCArIGNoYW5nZS5tb2RpZmllZExlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZFN0cmljdEVxdWFsICYmICFzdGFydFN0cmljdEVxdWFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmluZyB0aGUgY2hhbmdlIGRvd24gd291bGQgY3JlYXRlIGFuIGVxdWFsIGNoYW5nZSwgYnV0IHRoZSBlbGVtZW50cyBhcmUgbm90IHN0cmljdCBlcXVhbAogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2hhbmdlLm9yaWdpbmFsU3RhcnQrKzsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2UubW9kaWZpZWRTdGFydCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IG1lcmdlZENoYW5nZUFyciA9IFtudWxsXTsKICAgICAgICAgICAgICAgIGlmIChpIDwgY2hhbmdlcy5sZW5ndGggLSAxICYmIHRoaXMuQ2hhbmdlc092ZXJsYXAoY2hhbmdlc1tpXSwgY2hhbmdlc1tpICsgMV0sIG1lcmdlZENoYW5nZUFycikpIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzW2ldID0gbWVyZ2VkQ2hhbmdlQXJyWzBdOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuc3BsaWNlKGkgKyAxLCAxKTsKICAgICAgICAgICAgICAgICAgICBpLS07CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU2hpZnQgY2hhbmdlcyBiYWNrIHVwIHVudGlsIHdlIGhpdCBlbXB0eSBvciB3aGl0ZXNwYWNlLW9ubHkgbGluZXMKICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNoYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZSA9IGNoYW5nZXNbaV07CiAgICAgICAgICAgICAgICBsZXQgb3JpZ2luYWxTdG9wID0gMDsKICAgICAgICAgICAgICAgIGxldCBtb2RpZmllZFN0b3AgPSAwOwogICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldkNoYW5nZSA9IGNoYW5nZXNbaSAtIDFdOwogICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RvcCA9IHByZXZDaGFuZ2Uub3JpZ2luYWxTdGFydCArIHByZXZDaGFuZ2Uub3JpZ2luYWxMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdG9wID0gcHJldkNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgcHJldkNoYW5nZS5tb2RpZmllZExlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrT3JpZ2luYWwgPSBjaGFuZ2Uub3JpZ2luYWxMZW5ndGggPiAwOwogICAgICAgICAgICAgICAgY29uc3QgY2hlY2tNb2RpZmllZCA9IGNoYW5nZS5tb2RpZmllZExlbmd0aCA+IDA7CiAgICAgICAgICAgICAgICBsZXQgYmVzdERlbHRhID0gMDsKICAgICAgICAgICAgICAgIGxldCBiZXN0U2NvcmUgPSB0aGlzLl9ib3VuZGFyeVNjb3JlKGNoYW5nZS5vcmlnaW5hbFN0YXJ0LCBjaGFuZ2Uub3JpZ2luYWxMZW5ndGgsIGNoYW5nZS5tb2RpZmllZFN0YXJ0LCBjaGFuZ2UubW9kaWZpZWRMZW5ndGgpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgZGVsdGEgPSAxOzsgZGVsdGErKykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU3RhcnQgPSBjaGFuZ2Uub3JpZ2luYWxTdGFydCAtIGRlbHRhOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3RhcnQgPSBjaGFuZ2UubW9kaWZpZWRTdGFydCAtIGRlbHRhOwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0YXJ0IDwgb3JpZ2luYWxTdG9wIHx8IG1vZGlmaWVkU3RhcnQgPCBtb2RpZmllZFN0b3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjaGVja09yaWdpbmFsICYmICF0aGlzLk9yaWdpbmFsRWxlbWVudHNBcmVFcXVhbChvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbFN0YXJ0ICsgY2hhbmdlLm9yaWdpbmFsTGVuZ3RoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrTW9kaWZpZWQgJiYgIXRoaXMuTW9kaWZpZWRFbGVtZW50c0FyZUVxdWFsKG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkU3RhcnQgKyBjaGFuZ2UubW9kaWZpZWRMZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3VjaGluZ1ByZXZpb3VzQ2hhbmdlID0gKG9yaWdpbmFsU3RhcnQgPT09IG9yaWdpbmFsU3RvcCAmJiBtb2RpZmllZFN0YXJ0ID09PSBtb2RpZmllZFN0b3ApOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3JlID0gKCh0b3VjaGluZ1ByZXZpb3VzQ2hhbmdlID8gNSA6IDApCiAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5fYm91bmRhcnlTY29yZShvcmlnaW5hbFN0YXJ0LCBjaGFuZ2Uub3JpZ2luYWxMZW5ndGgsIG1vZGlmaWVkU3RhcnQsIGNoYW5nZS5tb2RpZmllZExlbmd0aCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChzY29yZSA+IGJlc3RTY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKICAgICAgICAgICAgICAgICAgICAgICAgYmVzdERlbHRhID0gZGVsdGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2hhbmdlLm9yaWdpbmFsU3RhcnQgLT0gYmVzdERlbHRhOwogICAgICAgICAgICAgICAgY2hhbmdlLm1vZGlmaWVkU3RhcnQgLT0gYmVzdERlbHRhOwogICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkQ2hhbmdlQXJyID0gW251bGxdOwogICAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIHRoaXMuQ2hhbmdlc092ZXJsYXAoY2hhbmdlc1tpIC0gMV0sIGNoYW5nZXNbaV0sIG1lcmdlZENoYW5nZUFycikpIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzW2kgLSAxXSA9IG1lcmdlZENoYW5nZUFyclswXTsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlcmUgY291bGQgYmUgbXVsdGlwbGUgbG9uZ2VzdCBjb21tb24gc3Vic3RyaW5ncy4KICAgICAgICAgICAgLy8gR2l2ZSBwcmVmZXJlbmNlIHRvIHRoZSBvbmVzIGNvbnRhaW5pbmcgbG9uZ2VyIGxpbmVzCiAgICAgICAgICAgIGlmICh0aGlzLl9oYXNTdHJpbmdzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMSwgbGVuID0gY2hhbmdlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFDaGFuZ2UgPSBjaGFuZ2VzW2kgLSAxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBiQ2hhbmdlID0gY2hhbmdlc1tpXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkTGVuZ3RoID0gYkNoYW5nZS5vcmlnaW5hbFN0YXJ0IC0gYUNoYW5nZS5vcmlnaW5hbFN0YXJ0IC0gYUNoYW5nZS5vcmlnaW5hbExlbmd0aDsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3JpZ2luYWxTdGFydCA9IGFDaGFuZ2Uub3JpZ2luYWxTdGFydDsKICAgICAgICAgICAgICAgICAgICBjb25zdCBiT3JpZ2luYWxFbmQgPSBiQ2hhbmdlLm9yaWdpbmFsU3RhcnQgKyBiQ2hhbmdlLm9yaWdpbmFsTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFiT3JpZ2luYWxMZW5ndGggPSBiT3JpZ2luYWxFbmQgLSBhT3JpZ2luYWxTdGFydDsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhTW9kaWZpZWRTdGFydCA9IGFDaGFuZ2UubW9kaWZpZWRTdGFydDsKICAgICAgICAgICAgICAgICAgICBjb25zdCBiTW9kaWZpZWRFbmQgPSBiQ2hhbmdlLm1vZGlmaWVkU3RhcnQgKyBiQ2hhbmdlLm1vZGlmaWVkTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFiTW9kaWZpZWRMZW5ndGggPSBiTW9kaWZpZWRFbmQgLSBhTW9kaWZpZWRTdGFydDsKICAgICAgICAgICAgICAgICAgICAvLyBBdm9pZCB3YXN0aW5nIGEgbG90IG9mIHRpbWUgd2l0aCB0aGVzZSBzZWFyY2hlcwogICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkTGVuZ3RoIDwgNSAmJiBhYk9yaWdpbmFsTGVuZ3RoIDwgMjAgJiYgYWJNb2RpZmllZExlbmd0aCA8IDIwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9maW5kQmV0dGVyQ29udGlndW91c1NlcXVlbmNlKGFPcmlnaW5hbFN0YXJ0LCBhYk9yaWdpbmFsTGVuZ3RoLCBhTW9kaWZpZWRTdGFydCwgYWJNb2RpZmllZExlbmd0aCwgbWF0Y2hlZExlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luYWxNYXRjaFN0YXJ0LCBtb2RpZmllZE1hdGNoU3RhcnRdID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbE1hdGNoU3RhcnQgIT09IGFDaGFuZ2Uub3JpZ2luYWxTdGFydCArIGFDaGFuZ2Uub3JpZ2luYWxMZW5ndGggfHwgbW9kaWZpZWRNYXRjaFN0YXJ0ICE9PSBhQ2hhbmdlLm1vZGlmaWVkU3RhcnQgKyBhQ2hhbmdlLm1vZGlmaWVkTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIGFub3RoZXIgc2VxdWVuY2UgdGhhdCBoYXMgYSBiZXR0ZXIgc2NvcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2hhbmdlLm9yaWdpbmFsTGVuZ3RoID0gb3JpZ2luYWxNYXRjaFN0YXJ0IC0gYUNoYW5nZS5vcmlnaW5hbFN0YXJ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDaGFuZ2UubW9kaWZpZWRMZW5ndGggPSBtb2RpZmllZE1hdGNoU3RhcnQgLSBhQ2hhbmdlLm1vZGlmaWVkU3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoYW5nZS5vcmlnaW5hbFN0YXJ0ID0gb3JpZ2luYWxNYXRjaFN0YXJ0ICsgbWF0Y2hlZExlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hhbmdlLm1vZGlmaWVkU3RhcnQgPSBtb2RpZmllZE1hdGNoU3RhcnQgKyBtYXRjaGVkTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaGFuZ2Uub3JpZ2luYWxMZW5ndGggPSBiT3JpZ2luYWxFbmQgLSBiQ2hhbmdlLm9yaWdpbmFsU3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoYW5nZS5tb2RpZmllZExlbmd0aCA9IGJNb2RpZmllZEVuZCAtIGJDaGFuZ2UubW9kaWZpZWRTdGFydDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKICAgICAgICB9CiAgICAgICAgX2ZpbmRCZXR0ZXJDb250aWd1b3VzU2VxdWVuY2Uob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxMZW5ndGgsIG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkTGVuZ3RoLCBkZXNpcmVkTGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChvcmlnaW5hbExlbmd0aCA8IGRlc2lyZWRMZW5ndGggfHwgbW9kaWZpZWRMZW5ndGggPCBkZXNpcmVkTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBvcmlnaW5hbE1heCA9IG9yaWdpbmFsU3RhcnQgKyBvcmlnaW5hbExlbmd0aCAtIGRlc2lyZWRMZW5ndGggKyAxOwogICAgICAgICAgICBjb25zdCBtb2RpZmllZE1heCA9IG1vZGlmaWVkU3RhcnQgKyBtb2RpZmllZExlbmd0aCAtIGRlc2lyZWRMZW5ndGggKyAxOwogICAgICAgICAgICBsZXQgYmVzdFNjb3JlID0gMDsKICAgICAgICAgICAgbGV0IGJlc3RPcmlnaW5hbFN0YXJ0ID0gMDsKICAgICAgICAgICAgbGV0IGJlc3RNb2RpZmllZFN0YXJ0ID0gMDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IG9yaWdpbmFsU3RhcnQ7IGkgPCBvcmlnaW5hbE1heDsgaSsrKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gbW9kaWZpZWRTdGFydDsgaiA8IG1vZGlmaWVkTWF4OyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29yZSA9IHRoaXMuX2NvbnRpZ3VvdXNTZXF1ZW5jZVNjb3JlKGksIGosIGRlc2lyZWRMZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGlmIChzY29yZSA+IDAgJiYgc2NvcmUgPiBiZXN0U2NvcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RPcmlnaW5hbFN0YXJ0ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1vZGlmaWVkU3RhcnQgPSBqOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmVzdFNjb3JlID4gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtiZXN0T3JpZ2luYWxTdGFydCwgYmVzdE1vZGlmaWVkU3RhcnRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBfY29udGlndW91c1NlcXVlbmNlU2NvcmUob3JpZ2luYWxTdGFydCwgbW9kaWZpZWRTdGFydCwgbGVuZ3RoKSB7CiAgICAgICAgICAgIGxldCBzY29yZSA9IDA7CiAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgbGVuZ3RoOyBsKyspIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5FbGVtZW50c0FyZUVxdWFsKG9yaWdpbmFsU3RhcnQgKyBsLCBtb2RpZmllZFN0YXJ0ICsgbCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNjb3JlICs9IHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbb3JpZ2luYWxTdGFydCArIGxdLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NvcmU7CiAgICAgICAgfQogICAgICAgIF9PcmlnaW5hbElzQm91bmRhcnkoaW5kZXgpIHsKICAgICAgICAgICAgaWYgKGluZGV4IDw9IDAgfHwgaW5kZXggPj0gdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaC5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2hhc1N0cmluZ3MgJiYgL15ccyokLy50ZXN0KHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbaW5kZXhdKSk7CiAgICAgICAgfQogICAgICAgIF9PcmlnaW5hbFJlZ2lvbklzQm91bmRhcnkob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxMZW5ndGgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeShvcmlnaW5hbFN0YXJ0KSB8fCB0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkob3JpZ2luYWxTdGFydCAtIDEpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3JpZ2luYWxMZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEVuZCA9IG9yaWdpbmFsU3RhcnQgKyBvcmlnaW5hbExlbmd0aDsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkob3JpZ2luYWxFbmQgLSAxKSB8fCB0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkob3JpZ2luYWxFbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBfTW9kaWZpZWRJc0JvdW5kYXJ5KGluZGV4KSB7CiAgICAgICAgICAgIGlmIChpbmRleCA8PSAwIHx8IGluZGV4ID49IHRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2gubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9oYXNTdHJpbmdzICYmIC9eXHMqJC8udGVzdCh0aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW2luZGV4XSkpOwogICAgICAgIH0KICAgICAgICBfTW9kaWZpZWRSZWdpb25Jc0JvdW5kYXJ5KG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkTGVuZ3RoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkobW9kaWZpZWRTdGFydCkgfHwgdGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KG1vZGlmaWVkU3RhcnQgLSAxKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1vZGlmaWVkTGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRFbmQgPSBtb2RpZmllZFN0YXJ0ICsgbW9kaWZpZWRMZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KG1vZGlmaWVkRW5kIC0gMSkgfHwgdGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KG1vZGlmaWVkRW5kKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgX2JvdW5kYXJ5U2NvcmUob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxMZW5ndGgsIG1vZGlmaWVkU3RhcnQsIG1vZGlmaWVkTGVuZ3RoKSB7CiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU2NvcmUgPSAodGhpcy5fT3JpZ2luYWxSZWdpb25Jc0JvdW5kYXJ5KG9yaWdpbmFsU3RhcnQsIG9yaWdpbmFsTGVuZ3RoKSA/IDEgOiAwKTsKICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRTY29yZSA9ICh0aGlzLl9Nb2RpZmllZFJlZ2lvbklzQm91bmRhcnkobW9kaWZpZWRTdGFydCwgbW9kaWZpZWRMZW5ndGgpID8gMSA6IDApOwogICAgICAgICAgICByZXR1cm4gKG9yaWdpbmFsU2NvcmUgKyBtb2RpZmllZFNjb3JlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uY2F0ZW5hdGVzIHRoZSB0d28gaW5wdXQgRGlmZkNoYW5nZSBsaXN0cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nCiAgICAgICAgICogbGlzdC4KICAgICAgICAgKiBAcGFyYW0gVGhlIGxlZnQgY2hhbmdlcwogICAgICAgICAqIEBwYXJhbSBUaGUgcmlnaHQgY2hhbmdlcwogICAgICAgICAqIEByZXR1cm5zIFRoZSBjb25jYXRlbmF0ZWQgbGlzdAogICAgICAgICAqLwogICAgICAgIENvbmNhdGVuYXRlQ2hhbmdlcyhsZWZ0LCByaWdodCkgewogICAgICAgICAgICBsZXQgbWVyZ2VkQ2hhbmdlQXJyID0gW107CiAgICAgICAgICAgIGlmIChsZWZ0Lmxlbmd0aCA9PT0gMCB8fCByaWdodC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAocmlnaHQubGVuZ3RoID4gMCkgPyByaWdodCA6IGxlZnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5DaGFuZ2VzT3ZlcmxhcChsZWZ0W2xlZnQubGVuZ3RoIC0gMV0sIHJpZ2h0WzBdLCBtZXJnZWRDaGFuZ2VBcnIpKSB7CiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBicmVhayB0aGUgcHJvYmxlbSBkb3duIHJlY3Vyc2l2ZWx5LCBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlCiAgICAgICAgICAgICAgICAvLyBtaWdodCByZWN1cnNlIGluIHRoZSBtaWRkbGUgb2YgYSBjaGFuZ2UgdGhlcmVieSBzcGxpdHRpbmcgaXQgaW50bwogICAgICAgICAgICAgICAgLy8gdHdvIGNoYW5nZXMuIEhlcmUgaW4gdGhlIGNvbWJpbmluZyBzdGFnZSwgd2UgZGV0ZWN0IGFuZCBmdXNlIHRob3NlCiAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIGJhY2sgdG9nZXRoZXIKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShsZWZ0Lmxlbmd0aCArIHJpZ2h0Lmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgTXlBcnJheS5Db3B5KGxlZnQsIDAsIHJlc3VsdCwgMCwgbGVmdC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIHJlc3VsdFtsZWZ0Lmxlbmd0aCAtIDFdID0gbWVyZ2VkQ2hhbmdlQXJyWzBdOwogICAgICAgICAgICAgICAgTXlBcnJheS5Db3B5KHJpZ2h0LCAxLCByZXN1bHQsIGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobGVmdC5sZW5ndGggKyByaWdodC5sZW5ndGgpOwogICAgICAgICAgICAgICAgTXlBcnJheS5Db3B5KGxlZnQsIDAsIHJlc3VsdCwgMCwgbGVmdC5sZW5ndGgpOwogICAgICAgICAgICAgICAgTXlBcnJheS5Db3B5KHJpZ2h0LCAwLCByZXN1bHQsIGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBjaGFuZ2VzIG92ZXJsYXAgYW5kIGNhbiBiZSBtZXJnZWQgaW50byBhIHNpbmdsZQogICAgICAgICAqIGNoYW5nZQogICAgICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNoYW5nZQogICAgICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY2hhbmdlCiAgICAgICAgICogQHBhcmFtIG1lcmdlZENoYW5nZSBUaGUgbWVyZ2VkIGNoYW5nZSBpZiB0aGUgdHdvIG92ZXJsYXAsIG51bGwgb3RoZXJ3aXNlCiAgICAgICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdHdvIGNoYW5nZXMgb3ZlcmxhcAogICAgICAgICAqLwogICAgICAgIENoYW5nZXNPdmVybGFwKGxlZnQsIHJpZ2h0LCBtZXJnZWRDaGFuZ2VBcnIpIHsKICAgICAgICAgICAgRGVidWcuQXNzZXJ0KGxlZnQub3JpZ2luYWxTdGFydCA8PSByaWdodC5vcmlnaW5hbFN0YXJ0LCAnTGVmdCBjaGFuZ2UgaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byByaWdodCBjaGFuZ2UnKTsKICAgICAgICAgICAgRGVidWcuQXNzZXJ0KGxlZnQubW9kaWZpZWRTdGFydCA8PSByaWdodC5tb2RpZmllZFN0YXJ0LCAnTGVmdCBjaGFuZ2UgaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byByaWdodCBjaGFuZ2UnKTsKICAgICAgICAgICAgaWYgKGxlZnQub3JpZ2luYWxTdGFydCArIGxlZnQub3JpZ2luYWxMZW5ndGggPj0gcmlnaHQub3JpZ2luYWxTdGFydCB8fCBsZWZ0Lm1vZGlmaWVkU3RhcnQgKyBsZWZ0Lm1vZGlmaWVkTGVuZ3RoID49IHJpZ2h0Lm1vZGlmaWVkU3RhcnQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU3RhcnQgPSBsZWZ0Lm9yaWdpbmFsU3RhcnQ7CiAgICAgICAgICAgICAgICBsZXQgb3JpZ2luYWxMZW5ndGggPSBsZWZ0Lm9yaWdpbmFsTGVuZ3RoOwogICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRTdGFydCA9IGxlZnQubW9kaWZpZWRTdGFydDsKICAgICAgICAgICAgICAgIGxldCBtb2RpZmllZExlbmd0aCA9IGxlZnQubW9kaWZpZWRMZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAobGVmdC5vcmlnaW5hbFN0YXJ0ICsgbGVmdC5vcmlnaW5hbExlbmd0aCA+PSByaWdodC5vcmlnaW5hbFN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxMZW5ndGggPSByaWdodC5vcmlnaW5hbFN0YXJ0ICsgcmlnaHQub3JpZ2luYWxMZW5ndGggLSBsZWZ0Lm9yaWdpbmFsU3RhcnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobGVmdC5tb2RpZmllZFN0YXJ0ICsgbGVmdC5tb2RpZmllZExlbmd0aCA+PSByaWdodC5tb2RpZmllZFN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRMZW5ndGggPSByaWdodC5tb2RpZmllZFN0YXJ0ICsgcmlnaHQubW9kaWZpZWRMZW5ndGggLSBsZWZ0Lm1vZGlmaWVkU3RhcnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZXJnZWRDaGFuZ2VBcnJbMF0gPSBuZXcgRGlmZkNoYW5nZShvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbExlbmd0aCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRMZW5ndGgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBtZXJnZWRDaGFuZ2VBcnJbMF0gPSBudWxsOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byBjbGlwIGEgZGlhZ29uYWwgaW5kZXggdG8gdGhlIHJhbmdlIG9mIHZhbGlkCiAgICAgICAgICogZGlhZ29uYWxzLiBUaGlzIGFsc28gZGVjaWRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgZGlhZ29uYWwgaW5kZXgsCiAgICAgICAgICogaWYgaXQgZXhjZWVkcyB0aGUgYm91bmRhcnksIHNob3VsZCBiZSBjbGlwcGVkIHRvIHRoZSBib3VuZGFyeSBvciBjbGlwcGVkCiAgICAgICAgICogb25lIGluc2lkZSB0aGUgYm91bmRhcnkgZGVwZW5kaW5nIG9uIHRoZSBFdmVuL09kZCBzdGF0dXMgb2YgdGhlIGJvdW5kYXJ5CiAgICAgICAgICogYW5kIG51bURpZmZlcmVuY2VzLgogICAgICAgICAqIEBwYXJhbSBkaWFnb25hbCBUaGUgaW5kZXggb2YgdGhlIGRpYWdvbmFsIHRvIGNsaXAuCiAgICAgICAgICogQHBhcmFtIG51bURpZmZlcmVuY2VzIFRoZSBjdXJyZW50IG51bWJlciBvZiBkaWZmZXJlbmNlcyBiZWluZyBpdGVyYXRlZCB1cG9uLgogICAgICAgICAqIEBwYXJhbSBkaWFnb25hbEJhc2VJbmRleCBUaGUgYmFzZSByZWZlcmVuY2UgZGlhZ29uYWwuCiAgICAgICAgICogQHBhcmFtIG51bURpYWdvbmFscyBUaGUgdG90YWwgbnVtYmVyIG9mIGRpYWdvbmFscy4KICAgICAgICAgKiBAcmV0dXJucyBUaGUgY2xpcHBlZCBkaWFnb25hbCBpbmRleC4KICAgICAgICAgKi8KICAgICAgICBDbGlwRGlhZ29uYWxCb3VuZChkaWFnb25hbCwgbnVtRGlmZmVyZW5jZXMsIGRpYWdvbmFsQmFzZUluZGV4LCBudW1EaWFnb25hbHMpIHsKICAgICAgICAgICAgaWYgKGRpYWdvbmFsID49IDAgJiYgZGlhZ29uYWwgPCBudW1EaWFnb25hbHMpIHsKICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gY2xpcCwgaXRzIGluIHJhbmdlCiAgICAgICAgICAgICAgICByZXR1cm4gZGlhZ29uYWw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZGlhZ29uYWxzQmVsb3c6IFRoZSBudW1iZXIgb2YgZGlhZ29uYWxzIGJlbG93IHRoZSByZWZlcmVuY2UgZGlhZ29uYWwKICAgICAgICAgICAgLy8gZGlhZ29uYWxzQWJvdmU6IFRoZSBudW1iZXIgb2YgZGlhZ29uYWxzIGFib3ZlIHRoZSByZWZlcmVuY2UgZGlhZ29uYWwKICAgICAgICAgICAgY29uc3QgZGlhZ29uYWxzQmVsb3cgPSBkaWFnb25hbEJhc2VJbmRleDsKICAgICAgICAgICAgY29uc3QgZGlhZ29uYWxzQWJvdmUgPSBudW1EaWFnb25hbHMgLSBkaWFnb25hbEJhc2VJbmRleCAtIDE7CiAgICAgICAgICAgIGNvbnN0IGRpZmZFdmVuID0gKG51bURpZmZlcmVuY2VzICUgMiA9PT0gMCk7CiAgICAgICAgICAgIGlmIChkaWFnb25hbCA8IDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQm91bmRFdmVuID0gKGRpYWdvbmFsc0JlbG93ICUgMiA9PT0gMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKGRpZmZFdmVuID09PSBsb3dlckJvdW5kRXZlbikgPyAwIDogMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVwcGVyQm91bmRFdmVuID0gKGRpYWdvbmFsc0Fib3ZlICUgMiA9PT0gMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKGRpZmZFdmVuID09PSB1cHBlckJvdW5kRXZlbikgPyBudW1EaWFnb25hbHMgLSAxIDogbnVtRGlhZ29uYWxzIC0gMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGxldCBzYWZlUHJvY2VzczsKICAgIC8vIE5hdGl2ZSBzYW5kYm94IGVudmlyb25tZW50CiAgICBpZiAodHlwZW9mIGdsb2JhbHMudnNjb2RlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ2xvYmFscy52c2NvZGUucHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBjb25zdCBzYW5kYm94UHJvY2VzcyA9IGdsb2JhbHMudnNjb2RlLnByb2Nlc3M7CiAgICAgICAgc2FmZVByb2Nlc3MgPSB7CiAgICAgICAgICAgIGdldCBwbGF0Zm9ybSgpIHsgcmV0dXJuIHNhbmRib3hQcm9jZXNzLnBsYXRmb3JtOyB9LAogICAgICAgICAgICBnZXQgYXJjaCgpIHsgcmV0dXJuIHNhbmRib3hQcm9jZXNzLmFyY2g7IH0sCiAgICAgICAgICAgIGdldCBlbnYoKSB7IHJldHVybiBzYW5kYm94UHJvY2Vzcy5lbnY7IH0sCiAgICAgICAgICAgIGN3ZCgpIHsgcmV0dXJuIHNhbmRib3hQcm9jZXNzLmN3ZCgpOyB9CiAgICAgICAgfTsKICAgIH0KICAgIC8vIE5hdGl2ZSBub2RlLmpzIGVudmlyb25tZW50CiAgICBlbHNlIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBzYWZlUHJvY2VzcyA9IHsKICAgICAgICAgICAgZ2V0IHBsYXRmb3JtKCkgeyByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybTsgfSwKICAgICAgICAgICAgZ2V0IGFyY2goKSB7IHJldHVybiBwcm9jZXNzLmFyY2g7IH0sCiAgICAgICAgICAgIGdldCBlbnYoKSB7IHJldHVybiBwcm9jZXNzLmVudjsgfSwKICAgICAgICAgICAgY3dkKCkgeyByZXR1cm4gcHJvY2Vzcy5lbnZbJ1ZTQ09ERV9DV0QnXSB8fCBwcm9jZXNzLmN3ZCgpOyB9CiAgICAgICAgfTsKICAgIH0KICAgIC8vIFdlYiBlbnZpcm9ubWVudAogICAgZWxzZSB7CiAgICAgICAgc2FmZVByb2Nlc3MgPSB7CiAgICAgICAgICAgIC8vIFN1cHBvcnRlZAogICAgICAgICAgICBnZXQgcGxhdGZvcm0oKSB7IHJldHVybiBpc1dpbmRvd3MgPyAnd2luMzInIDogaXNNYWNpbnRvc2ggPyAnZGFyd2luJyA6ICdsaW51eCc7IH0sCiAgICAgICAgICAgIGdldCBhcmNoKCkgeyByZXR1cm4gdW5kZWZpbmVkOyAvKiBhcmNoIGlzIHVuZGVmaW5lZCBpbiB3ZWIgKi8gfSwKICAgICAgICAgICAgLy8gVW5zdXBwb3J0ZWQKICAgICAgICAgICAgZ2V0IGVudigpIHsgcmV0dXJuIHt9OyB9LAogICAgICAgICAgICBjd2QoKSB7IHJldHVybiAnLyc7IH0KICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBQcm92aWRlcyBzYWZlIGFjY2VzcyB0byB0aGUgYGN3ZGAgcHJvcGVydHkgaW4gbm9kZS5qcywgc2FuZGJveGVkIG9yIHdlYgogICAgICogZW52aXJvbm1lbnRzLgogICAgICoKICAgICAqIE5vdGU6IGluIHdlYiwgdGhpcyBwcm9wZXJ0eSBpcyBoYXJkY29kZWQgdG8gYmUgYC9gLgogICAgICovCiAgICBjb25zdCBjd2QgPSBzYWZlUHJvY2Vzcy5jd2Q7CiAgICAvKioKICAgICAqIFByb3ZpZGVzIHNhZmUgYWNjZXNzIHRvIHRoZSBgZW52YCBwcm9wZXJ0eSBpbiBub2RlLmpzLCBzYW5kYm94ZWQgb3Igd2ViCiAgICAgKiBlbnZpcm9ubWVudHMuCiAgICAgKgogICAgICogTm90ZTogaW4gd2ViLCB0aGlzIHByb3BlcnR5IGlzIGhhcmRjb2RlZCB0byBiZSBge31gLgogICAgICovCiAgICBjb25zdCBlbnYgPSBzYWZlUHJvY2Vzcy5lbnY7CiAgICAvKioKICAgICAqIFByb3ZpZGVzIHNhZmUgYWNjZXNzIHRvIHRoZSBgcGxhdGZvcm1gIHByb3BlcnR5IGluIG5vZGUuanMsIHNhbmRib3hlZCBvciB3ZWIKICAgICAqIGVudmlyb25tZW50cy4KICAgICAqLwogICAgY29uc3QgcGxhdGZvcm0gPSBzYWZlUHJvY2Vzcy5wbGF0Zm9ybTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNvbnN0IENIQVJfVVBQRVJDQVNFX0EgPSA2NTsgLyogQSAqLwogICAgY29uc3QgQ0hBUl9MT1dFUkNBU0VfQSA9IDk3OyAvKiBhICovCiAgICBjb25zdCBDSEFSX1VQUEVSQ0FTRV9aID0gOTA7IC8qIFogKi8KICAgIGNvbnN0IENIQVJfTE9XRVJDQVNFX1ogPSAxMjI7IC8qIHogKi8KICAgIGNvbnN0IENIQVJfRE9UID0gNDY7IC8qIC4gKi8KICAgIGNvbnN0IENIQVJfRk9SV0FSRF9TTEFTSCA9IDQ3OyAvKiAvICovCiAgICBjb25zdCBDSEFSX0JBQ0tXQVJEX1NMQVNIID0gOTI7IC8qIFwgKi8KICAgIGNvbnN0IENIQVJfQ09MT04gPSA1ODsgLyogOiAqLwogICAgY29uc3QgQ0hBUl9RVUVTVElPTl9NQVJLID0gNjM7IC8qID8gKi8KICAgIGNsYXNzIEVycm9ySW52YWxpZEFyZ1R5cGUgZXh0ZW5kcyBFcnJvciB7CiAgICAgICAgY29uc3RydWN0b3IobmFtZSwgZXhwZWN0ZWQsIGFjdHVhbCkgewogICAgICAgICAgICAvLyBkZXRlcm1pbmVyOiAnbXVzdCBiZScgb3IgJ211c3Qgbm90IGJlJwogICAgICAgICAgICBsZXQgZGV0ZXJtaW5lcjsKICAgICAgICAgICAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ3N0cmluZycgJiYgZXhwZWN0ZWQuaW5kZXhPZignbm90ICcpID09PSAwKSB7CiAgICAgICAgICAgICAgICBkZXRlcm1pbmVyID0gJ211c3Qgbm90IGJlJzsKICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWQucmVwbGFjZSgvXm5vdCAvLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkZXRlcm1pbmVyID0gJ211c3QgYmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBuYW1lLmluZGV4T2YoJy4nKSAhPT0gLTEgPyAncHJvcGVydHknIDogJ2FyZ3VtZW50JzsKICAgICAgICAgICAgbGV0IG1zZyA9IGBUaGUgIiR7bmFtZX0iICR7dHlwZX0gJHtkZXRlcm1pbmVyfSBvZiB0eXBlICR7ZXhwZWN0ZWR9YDsKICAgICAgICAgICAgbXNnICs9IGAuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgYWN0dWFsfWA7CiAgICAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgICAgICAgIHRoaXMuY29kZSA9ICdFUlJfSU5WQUxJRF9BUkdfVFlQRSc7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcodmFsdWUsIG5hbWUpIHsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3JJbnZhbGlkQXJnVHlwZShuYW1lLCAnc3RyaW5nJywgdmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGlzUGF0aFNlcGFyYXRvcihjb2RlKSB7CiAgICAgICAgcmV0dXJuIGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCB8fCBjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIOwogICAgfQogICAgZnVuY3Rpb24gaXNQb3NpeFBhdGhTZXBhcmF0b3IoY29kZSkgewogICAgICAgIHJldHVybiBjb2RlID09PSBDSEFSX0ZPUldBUkRfU0xBU0g7CiAgICB9CiAgICBmdW5jdGlvbiBpc1dpbmRvd3NEZXZpY2VSb290KGNvZGUpIHsKICAgICAgICByZXR1cm4gKGNvZGUgPj0gQ0hBUl9VUFBFUkNBU0VfQSAmJiBjb2RlIDw9IENIQVJfVVBQRVJDQVNFX1opIHx8CiAgICAgICAgICAgIChjb2RlID49IENIQVJfTE9XRVJDQVNFX0EgJiYgY29kZSA8PSBDSEFSX0xPV0VSQ0FTRV9aKTsKICAgIH0KICAgIC8vIFJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCB3aXRoIGRpcmVjdG9yeSBuYW1lcwogICAgZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nKHBhdGgsIGFsbG93QWJvdmVSb290LCBzZXBhcmF0b3IsIGlzUGF0aFNlcGFyYXRvcikgewogICAgICAgIGxldCByZXMgPSAnJzsKICAgICAgICBsZXQgbGFzdFNlZ21lbnRMZW5ndGggPSAwOwogICAgICAgIGxldCBsYXN0U2xhc2ggPSAtMTsKICAgICAgICBsZXQgZG90cyA9IDA7CiAgICAgICAgbGV0IGNvZGUgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHBhdGgubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgaWYgKGkgPCBwYXRoLmxlbmd0aCkgewogICAgICAgICAgICAgICAgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpc1BhdGhTZXBhcmF0b3IoY29kZSkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29kZSA9IENIQVJfRk9SV0FSRF9TTEFTSDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7CiAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoID09PSBpIC0gMSB8fCBkb3RzID09PSAxKSA7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkb3RzID09PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPCAyIHx8IGxhc3RTZWdtZW50TGVuZ3RoICE9PSAyIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jaGFyQ29kZUF0KHJlcy5sZW5ndGggLSAxKSAhPT0gQ0hBUl9ET1QgfHwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNoYXJDb2RlQXQocmVzLmxlbmd0aCAtIDIpICE9PSBDSEFSX0RPVCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gcmVzLmxhc3RJbmRleE9mKHNlcGFyYXRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IHJlcy5sZW5ndGggLSAxIC0gcmVzLmxhc3RJbmRleE9mKHNlcGFyYXRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2xhc2ggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXMubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChhbGxvd0Fib3ZlUm9vdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXMgKz0gcmVzLmxlbmd0aCA+IDAgPyBgJHtzZXBhcmF0b3J9Li5gIDogJy4uJzsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXMgKz0gYCR7c2VwYXJhdG9yfSR7cGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpKX1gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSBpIC0gbGFzdFNsYXNoIC0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7CiAgICAgICAgICAgICAgICBkb3RzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjb2RlID09PSBDSEFSX0RPVCAmJiBkb3RzICE9PSAtMSkgewogICAgICAgICAgICAgICAgKytkb3RzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZG90cyA9IC0xOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICB9CiAgICBmdW5jdGlvbiBfZm9ybWF0KHNlcCwgcGF0aE9iamVjdCkgewogICAgICAgIGlmIChwYXRoT2JqZWN0ID09PSBudWxsIHx8IHR5cGVvZiBwYXRoT2JqZWN0ICE9PSAnb2JqZWN0JykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3JJbnZhbGlkQXJnVHlwZSgncGF0aE9iamVjdCcsICdPYmplY3QnLCBwYXRoT2JqZWN0KTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGlyID0gcGF0aE9iamVjdC5kaXIgfHwgcGF0aE9iamVjdC5yb290OwogICAgICAgIGNvbnN0IGJhc2UgPSBwYXRoT2JqZWN0LmJhc2UgfHwKICAgICAgICAgICAgYCR7cGF0aE9iamVjdC5uYW1lIHx8ICcnfSR7cGF0aE9iamVjdC5leHQgfHwgJyd9YDsKICAgICAgICBpZiAoIWRpcikgewogICAgICAgICAgICByZXR1cm4gYmFzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRpciA9PT0gcGF0aE9iamVjdC5yb290ID8gYCR7ZGlyfSR7YmFzZX1gIDogYCR7ZGlyfSR7c2VwfSR7YmFzZX1gOwogICAgfQogICAgY29uc3Qgd2luMzIgPSB7CiAgICAgICAgLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKQogICAgICAgIHJlc29sdmUoLi4ucGF0aFNlZ21lbnRzKSB7CiAgICAgICAgICAgIGxldCByZXNvbHZlZERldmljZSA9ICcnOwogICAgICAgICAgICBsZXQgcmVzb2x2ZWRUYWlsID0gJyc7CiAgICAgICAgICAgIGxldCByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXRoU2VnbWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMTsgaS0tKSB7CiAgICAgICAgICAgICAgICBsZXQgcGF0aDsKICAgICAgICAgICAgICAgIGlmIChpID49IDApIHsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aFNlZ21lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgsICdwYXRoJyk7CiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBlbXB0eSBlbnRyaWVzCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc29sdmVkRGV2aWNlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBjd2QoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgaGFzIHRoZSBjb25jZXB0IG9mIGRyaXZlLXNwZWNpZmljIGN1cnJlbnQgd29ya2luZwogICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdG9yaWVzLiBJZiB3ZSd2ZSByZXNvbHZlZCBhIGRyaXZlIGxldHRlciBidXQgbm90IHlldCBhbgogICAgICAgICAgICAgICAgICAgIC8vIGFic29sdXRlIHBhdGgsIGdldCBjd2QgZm9yIHRoYXQgZHJpdmUsIG9yIHRoZSBwcm9jZXNzIGN3ZCBpZgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkcml2ZSBjd2QgaXMgbm90IGF2YWlsYWJsZS4gV2UncmUgc3VyZSB0aGUgZGV2aWNlIGlzIG5vdAogICAgICAgICAgICAgICAgICAgIC8vIGEgVU5DIHBhdGggYXQgdGhpcyBwb2ludHMsIGJlY2F1c2UgVU5DIHBhdGhzIGFyZSBhbHdheXMgYWJzb2x1dGUuCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGVudltgPSR7cmVzb2x2ZWREZXZpY2V9YF0gfHwgY3dkKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgYSBjd2Qgd2FzIGZvdW5kIGFuZCB0aGF0IGl0IGFjdHVhbGx5IHBvaW50cwogICAgICAgICAgICAgICAgICAgIC8vIHRvIG91ciBkcml2ZS4gSWYgbm90LCBkZWZhdWx0IHRvIHRoZSBkcml2ZSdzIHJvb3QuCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCB8fAogICAgICAgICAgICAgICAgICAgICAgICAocGF0aC5zbGljZSgwLCAyKS50b0xvd2VyQ2FzZSgpICE9PSByZXNvbHZlZERldmljZS50b0xvd2VyQ2FzZSgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmNoYXJDb2RlQXQoMikgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBgJHtyZXNvbHZlZERldmljZX1cXGA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgbGVuID0gcGF0aC5sZW5ndGg7CiAgICAgICAgICAgICAgICBsZXQgcm9vdEVuZCA9IDA7CiAgICAgICAgICAgICAgICBsZXQgZGV2aWNlID0gJyc7CiAgICAgICAgICAgICAgICBsZXQgaXNBYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdCgwKTsKICAgICAgICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCBhIHJvb3QKICAgICAgICAgICAgICAgIGlmIChsZW4gPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBwYXRoYCBjb250YWlucyBqdXN0IGEgcGF0aCBzZXBhcmF0b3IKICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVuZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkgewogICAgICAgICAgICAgICAgICAgIC8vIFBvc3NpYmxlIFVOQyByb290CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Ugc3RhcnRlZCB3aXRoIGEgc2VwYXJhdG9yLCB3ZSBrbm93IHdlIGF0IGxlYXN0IGhhdmUgYW4KICAgICAgICAgICAgICAgICAgICAvLyBhYnNvbHV0ZSBwYXRoIG9mIHNvbWUga2luZCAoVU5DIG9yIG90aGVyd2lzZSkKICAgICAgICAgICAgICAgICAgICBpc0Fic29sdXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgxKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCBkb3VibGUgcGF0aCBzZXBhcmF0b3IgYXQgYmVnaW5uaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBqOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiAhaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IGxlbiAmJiBqICE9PSBsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFBhcnQgPSBwYXRoLnNsaWNlKGxhc3QsIGopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2ggMSBvciBtb3JlIHBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IGxlbiAmJiBqICE9PSBsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuICYmICFpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09PSBsZW4gfHwgaiAhPT0gbGFzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXRjaGVkIGEgVU5DIHJvb3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gYFxcXFwke2ZpcnN0UGFydH1cXCR7cGF0aC5zbGljZShsYXN0LCBqKX1gOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290RW5kID0gajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbmQgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzV2luZG93c0RldmljZVJvb3QoY29kZSkgJiYKICAgICAgICAgICAgICAgICAgICBwYXRoLmNoYXJDb2RlQXQoMSkgPT09IENIQVJfQ09MT04pIHsKICAgICAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBkZXZpY2Ugcm9vdAogICAgICAgICAgICAgICAgICAgIGRldmljZSA9IHBhdGguc2xpY2UoMCwgMik7CiAgICAgICAgICAgICAgICAgICAgcm9vdEVuZCA9IDI7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDIgJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgyKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJlYXQgc2VwYXJhdG9yIGZvbGxvd2luZyBkcml2ZSBuYW1lIGFzIGFuIGFic29sdXRlIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICByb290RW5kID0gMzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWREZXZpY2UubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLnRvTG93ZXJDYXNlKCkgIT09IHJlc29sdmVkRGV2aWNlLnRvTG93ZXJDYXNlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcGF0aCBwb2ludHMgdG8gYW5vdGhlciBkZXZpY2Ugc28gaXQgaXMgbm90IGFwcGxpY2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZERldmljZSA9IGRldmljZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRBYnNvbHV0ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZERldmljZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVGFpbCA9IGAke3BhdGguc2xpY2Uocm9vdEVuZCl9XFwke3Jlc29sdmVkVGFpbH1gOwogICAgICAgICAgICAgICAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBpc0Fic29sdXRlOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0Fic29sdXRlICYmIHJlc29sdmVkRGV2aWNlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLAogICAgICAgICAgICAvLyBidXQgaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkKICAgICAgICAgICAgLy8gZmFpbHMpCiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdGFpbCBwYXRoCiAgICAgICAgICAgIHJlc29sdmVkVGFpbCA9IG5vcm1hbGl6ZVN0cmluZyhyZXNvbHZlZFRhaWwsICFyZXNvbHZlZEFic29sdXRlLCAnXFwnLCBpc1BhdGhTZXBhcmF0b3IpOwogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRBYnNvbHV0ZSA/CiAgICAgICAgICAgICAgICBgJHtyZXNvbHZlZERldmljZX1cXCR7cmVzb2x2ZWRUYWlsfWAgOgogICAgICAgICAgICAgICAgYCR7cmVzb2x2ZWREZXZpY2V9JHtyZXNvbHZlZFRhaWx9YCB8fCAnLic7CiAgICAgICAgfSwKICAgICAgICBub3JtYWxpemUocGF0aCkgewogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpOwogICAgICAgICAgICBjb25zdCBsZW4gPSBwYXRoLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGxlbiA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgcm9vdEVuZCA9IDA7CiAgICAgICAgICAgIGxldCBkZXZpY2U7CiAgICAgICAgICAgIGxldCBpc0Fic29sdXRlID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMCk7CiAgICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCBhIHJvb3QKICAgICAgICAgICAgaWYgKGxlbiA9PT0gMSkgewogICAgICAgICAgICAgICAgLy8gYHBhdGhgIGNvbnRhaW5zIGp1c3QgYSBzaW5nbGUgY2hhciwgZXhpdCBlYXJseSB0byBhdm9pZAogICAgICAgICAgICAgICAgLy8gdW5uZWNlc3Nhcnkgd29yawogICAgICAgICAgICAgICAgcmV0dXJuIGlzUG9zaXhQYXRoU2VwYXJhdG9yKGNvZGUpID8gJ1xcJyA6IHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkgewogICAgICAgICAgICAgICAgLy8gUG9zc2libGUgVU5DIHJvb3QKICAgICAgICAgICAgICAgIC8vIElmIHdlIHN0YXJ0ZWQgd2l0aCBhIHNlcGFyYXRvciwgd2Uga25vdyB3ZSBhdCBsZWFzdCBoYXZlIGFuIGFic29sdXRlCiAgICAgICAgICAgICAgICAvLyBwYXRoIG9mIHNvbWUga2luZCAoVU5DIG9yIG90aGVyd2lzZSkKICAgICAgICAgICAgICAgIGlzQWJzb2x1dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoMSkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCBkb3VibGUgcGF0aCBzZXBhcmF0b3IgYXQgYmVnaW5uaW5nCiAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAyOwogICAgICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gajsKICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuICYmICFpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkgewogICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChqIDwgbGVuICYmIGogIT09IGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RQYXJ0ID0gcGF0aC5zbGljZShsYXN0LCBqKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCEKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBwYXRoIHNlcGFyYXRvcnMKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IGxlbiAmJiBqICE9PSBsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgIWlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGxlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgYSBVTkMgcm9vdCBvbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIFVOQyByb290IHNpbmNlIHRoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90aGluZyBsZWZ0IHRvIHByb2Nlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxcXFwke2ZpcnN0UGFydH1cXCR7cGF0aC5zbGljZShsYXN0KX1cXGA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPT0gbGFzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgYSBVTkMgcm9vdCB3aXRoIGxlZnRvdmVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSA9IGBcXFxcJHtmaXJzdFBhcnR9XFwke3BhdGguc2xpY2UobGFzdCwgail9YDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290RW5kID0gajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJvb3RFbmQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzV2luZG93c0RldmljZVJvb3QoY29kZSkgJiYgcGF0aC5jaGFyQ29kZUF0KDEpID09PSBDSEFSX0NPTE9OKSB7CiAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBkZXZpY2Ugcm9vdAogICAgICAgICAgICAgICAgZGV2aWNlID0gcGF0aC5zbGljZSgwLCAyKTsKICAgICAgICAgICAgICAgIHJvb3RFbmQgPSAyOwogICAgICAgICAgICAgICAgaWYgKGxlbiA+IDIgJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgyKSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUcmVhdCBzZXBhcmF0b3IgZm9sbG93aW5nIGRyaXZlIG5hbWUgYXMgYW4gYWJzb2x1dGUgcGF0aAogICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRvcgogICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHJvb3RFbmQgPSAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCB0YWlsID0gcm9vdEVuZCA8IGxlbiA/CiAgICAgICAgICAgICAgICBub3JtYWxpemVTdHJpbmcocGF0aC5zbGljZShyb290RW5kKSwgIWlzQWJzb2x1dGUsICdcXCcsIGlzUGF0aFNlcGFyYXRvcikgOgogICAgICAgICAgICAgICAgJyc7CiAgICAgICAgICAgIGlmICh0YWlsLmxlbmd0aCA9PT0gMCAmJiAhaXNBYnNvbHV0ZSkgewogICAgICAgICAgICAgICAgdGFpbCA9ICcuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFpbC5sZW5ndGggPiAwICYmIGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQobGVuIC0gMSkpKSB7CiAgICAgICAgICAgICAgICB0YWlsICs9ICdcXCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRldmljZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaXNBYnNvbHV0ZSA/IGBcXCR7dGFpbH1gIDogdGFpbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaXNBYnNvbHV0ZSA/IGAke2RldmljZX1cXCR7dGFpbH1gIDogYCR7ZGV2aWNlfSR7dGFpbH1gOwogICAgICAgIH0sCiAgICAgICAgaXNBYnNvbHV0ZShwYXRoKSB7CiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgsICdwYXRoJyk7CiAgICAgICAgICAgIGNvbnN0IGxlbiA9IHBhdGgubGVuZ3RoOwogICAgICAgICAgICBpZiAobGVuID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdCgwKTsKICAgICAgICAgICAgcmV0dXJuIGlzUGF0aFNlcGFyYXRvcihjb2RlKSB8fAogICAgICAgICAgICAgICAgLy8gUG9zc2libGUgZGV2aWNlIHJvb3QKICAgICAgICAgICAgICAgIChsZW4gPiAyICYmCiAgICAgICAgICAgICAgICAgICAgaXNXaW5kb3dzRGV2aWNlUm9vdChjb2RlKSAmJgogICAgICAgICAgICAgICAgICAgIHBhdGguY2hhckNvZGVBdCgxKSA9PT0gQ0hBUl9DT0xPTiAmJgogICAgICAgICAgICAgICAgICAgIGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoMikpKTsKICAgICAgICB9LAogICAgICAgIGpvaW4oLi4ucGF0aHMpIHsKICAgICAgICAgICAgaWYgKHBhdGhzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgam9pbmVkOwogICAgICAgICAgICBsZXQgZmlyc3RQYXJ0OwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhcmcgPSBwYXRoc1tpXTsKICAgICAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKGFyZywgJ3BhdGgnKTsKICAgICAgICAgICAgICAgIGlmIChhcmcubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChqb2luZWQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICBqb2luZWQgPSBmaXJzdFBhcnQgPSBhcmc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBqb2luZWQgKz0gYFxcJHthcmd9YDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGpvaW5lZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJy4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBqb2luZWQgcGF0aCBkb2Vzbid0IHN0YXJ0IHdpdGggdHdvIHNsYXNoZXMsIGJlY2F1c2UKICAgICAgICAgICAgLy8gbm9ybWFsaXplKCkgd2lsbCBtaXN0YWtlIGl0IGZvciBhIFVOQyBwYXRoIHRoZW4uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoaXMgc3RlcCBpcyBza2lwcGVkIHdoZW4gaXQgaXMgdmVyeSBjbGVhciB0aGF0IHRoZSB1c2VyIGFjdHVhbGx5CiAgICAgICAgICAgIC8vIGludGVuZGVkIHRvIHBvaW50IGF0IGEgVU5DIHBhdGguIFRoaXMgaXMgYXNzdW1lZCB3aGVuIHRoZSBmaXJzdAogICAgICAgICAgICAvLyBub24tZW1wdHkgc3RyaW5nIGFyZ3VtZW50cyBzdGFydHMgd2l0aCBleGFjdGx5IHR3byBzbGFzaGVzIGZvbGxvd2VkIGJ5CiAgICAgICAgICAgIC8vIGF0IGxlYXN0IG9uZSBtb3JlIG5vbi1zbGFzaCBjaGFyYWN0ZXIuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBmb3Igbm9ybWFsaXplKCkgdG8gdHJlYXQgYSBwYXRoIGFzIGEgVU5DIHBhdGggaXQgbmVlZHMgdG8KICAgICAgICAgICAgLy8gaGF2ZSBhdCBsZWFzdCAyIGNvbXBvbmVudHMsIHNvIHdlIGRvbid0IGZpbHRlciBmb3IgdGhhdCBoZXJlLgogICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgY2FuIHVzZSBqb2luIHRvIGNvbnN0cnVjdCBVTkMgcGF0aHMgZnJvbQogICAgICAgICAgICAvLyBhIHNlcnZlciBuYW1lIGFuZCBhIHNoYXJlIG5hbWU7IGZvciBleGFtcGxlOgogICAgICAgICAgICAvLyAgIHBhdGguam9pbignLy9zZXJ2ZXInLCAnc2hhcmUnKSAtPiAnXFxcXHNlcnZlclxcc2hhcmVcXCcpCiAgICAgICAgICAgIGxldCBuZWVkc1JlcGxhY2UgPSB0cnVlOwogICAgICAgICAgICBsZXQgc2xhc2hDb3VudCA9IDA7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlyc3RQYXJ0ID09PSAnc3RyaW5nJyAmJiBpc1BhdGhTZXBhcmF0b3IoZmlyc3RQYXJ0LmNoYXJDb2RlQXQoMCkpKSB7CiAgICAgICAgICAgICAgICArK3NsYXNoQ291bnQ7CiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdExlbiA9IGZpcnN0UGFydC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RMZW4gPiAxICYmIGlzUGF0aFNlcGFyYXRvcihmaXJzdFBhcnQuY2hhckNvZGVBdCgxKSkpIHsKICAgICAgICAgICAgICAgICAgICArK3NsYXNoQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0TGVuID4gMikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGZpcnN0UGFydC5jaGFyQ29kZUF0KDIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKytzbGFzaENvdW50OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF0Y2hlZCBhIFVOQyBwYXRoIGluIHRoZSBmaXJzdCBwYXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkc1JlcGxhY2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmVlZHNSZXBsYWNlKSB7CiAgICAgICAgICAgICAgICAvLyBGaW5kIGFueSBtb3JlIGNvbnNlY3V0aXZlIHNsYXNoZXMgd2UgbmVlZCB0byByZXBsYWNlCiAgICAgICAgICAgICAgICB3aGlsZSAoc2xhc2hDb3VudCA8IGpvaW5lZC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICBpc1BhdGhTZXBhcmF0b3Ioam9pbmVkLmNoYXJDb2RlQXQoc2xhc2hDb3VudCkpKSB7CiAgICAgICAgICAgICAgICAgICAgc2xhc2hDb3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgc2xhc2hlcyBpZiBuZWVkZWQKICAgICAgICAgICAgICAgIGlmIChzbGFzaENvdW50ID49IDIpIHsKICAgICAgICAgICAgICAgICAgICBqb2luZWQgPSBgXFwke2pvaW5lZC5zbGljZShzbGFzaENvdW50KX1gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB3aW4zMi5ub3JtYWxpemUoam9pbmVkKTsKICAgICAgICB9LAogICAgICAgIC8vIEl0IHdpbGwgc29sdmUgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSBgZnJvbWAgdG8gYHRvYCwgZm9yIGluc3RhbmNlOgogICAgICAgIC8vICBmcm9tID0gJ0M6XFxvcmFuZGVhXFx0ZXN0XFxhYWEnCiAgICAgICAgLy8gIHRvID0gJ0M6XFxvcmFuZGVhXFxpbXBsXFxiYmInCiAgICAgICAgLy8gVGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlOiAnLi5cXC4uXFxpbXBsXFxiYmInCiAgICAgICAgcmVsYXRpdmUoZnJvbSwgdG8pIHsKICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcoZnJvbSwgJ2Zyb20nKTsKICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcodG8sICd0bycpOwogICAgICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBmcm9tT3JpZyA9IHdpbjMyLnJlc29sdmUoZnJvbSk7CiAgICAgICAgICAgIGNvbnN0IHRvT3JpZyA9IHdpbjMyLnJlc29sdmUodG8pOwogICAgICAgICAgICBpZiAoZnJvbU9yaWcgPT09IHRvT3JpZykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZyb20gPSBmcm9tT3JpZy50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICB0byA9IHRvT3JpZy50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUcmltIGFueSBsZWFkaW5nIGJhY2tzbGFzaGVzCiAgICAgICAgICAgIGxldCBmcm9tU3RhcnQgPSAwOwogICAgICAgICAgICB3aGlsZSAoZnJvbVN0YXJ0IDwgZnJvbS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIGZyb20uY2hhckNvZGVBdChmcm9tU3RhcnQpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICBmcm9tU3RhcnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUcmltIHRyYWlsaW5nIGJhY2tzbGFzaGVzIChhcHBsaWNhYmxlIHRvIFVOQyBwYXRocyBvbmx5KQogICAgICAgICAgICBsZXQgZnJvbUVuZCA9IGZyb20ubGVuZ3RoOwogICAgICAgICAgICB3aGlsZSAoZnJvbUVuZCAtIDEgPiBmcm9tU3RhcnQgJiYKICAgICAgICAgICAgICAgIGZyb20uY2hhckNvZGVBdChmcm9tRW5kIC0gMSkgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgIGZyb21FbmQtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBmcm9tTGVuID0gZnJvbUVuZCAtIGZyb21TdGFydDsKICAgICAgICAgICAgLy8gVHJpbSBhbnkgbGVhZGluZyBiYWNrc2xhc2hlcwogICAgICAgICAgICBsZXQgdG9TdGFydCA9IDA7CiAgICAgICAgICAgIHdoaWxlICh0b1N0YXJ0IDwgdG8ubGVuZ3RoICYmCiAgICAgICAgICAgICAgICB0by5jaGFyQ29kZUF0KHRvU3RhcnQpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICB0b1N0YXJ0Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVHJpbSB0cmFpbGluZyBiYWNrc2xhc2hlcyAoYXBwbGljYWJsZSB0byBVTkMgcGF0aHMgb25seSkKICAgICAgICAgICAgbGV0IHRvRW5kID0gdG8ubGVuZ3RoOwogICAgICAgICAgICB3aGlsZSAodG9FbmQgLSAxID4gdG9TdGFydCAmJgogICAgICAgICAgICAgICAgdG8uY2hhckNvZGVBdCh0b0VuZCAtIDEpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICB0b0VuZC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHRvTGVuID0gdG9FbmQgLSB0b1N0YXJ0OwogICAgICAgICAgICAvLyBDb21wYXJlIHBhdGhzIHRvIGZpbmQgdGhlIGxvbmdlc3QgY29tbW9uIHBhdGggZnJvbSByb290CiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGZyb21MZW4gPCB0b0xlbiA/IGZyb21MZW4gOiB0b0xlbjsKICAgICAgICAgICAgbGV0IGxhc3RDb21tb25TZXAgPSAtMTsKICAgICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBmcm9tQ29kZSA9IGZyb20uY2hhckNvZGVBdChmcm9tU3RhcnQgKyBpKTsKICAgICAgICAgICAgICAgIGlmIChmcm9tQ29kZSAhPT0gdG8uY2hhckNvZGVBdCh0b1N0YXJ0ICsgaSkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZyb21Db2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdENvbW1vblNlcCA9IGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBtaXNtYXRjaCBiZWZvcmUgdGhlIGZpcnN0IGNvbW1vbiBwYXRoIHNlcGFyYXRvciB3YXMgc2Vlbiwgc28KICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBvcmlnaW5hbCBgdG9gLgogICAgICAgICAgICBpZiAoaSAhPT0gbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBpZiAobGFzdENvbW1vblNlcCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9PcmlnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHRvTGVuID4gbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRvLmNoYXJDb2RlQXQodG9TdGFydCArIGkpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGBmcm9tYCBpcyB0aGUgZXhhY3QgYmFzZSBwYXRoIGZvciBgdG9gLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nQzpcXGZvb1xcYmFyJzsgdG89J0M6XFxmb29cXGJhclxcYmF6JwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9PcmlnLnNsaWNlKHRvU3RhcnQgKyBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGBmcm9tYCBpcyB0aGUgZGV2aWNlIHJvb3QuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBmcm9tPSdDOlxcJzsgdG89J0M6XFxmb28nCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b09yaWcuc2xpY2UodG9TdGFydCArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChmcm9tTGVuID4gbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20uY2hhckNvZGVBdChmcm9tU3RhcnQgKyBpKSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiBgdG9gIGlzIHRoZSBleGFjdCBiYXNlIHBhdGggZm9yIGBmcm9tYC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGZyb209J0M6XFxmb29cXGJhcic7IHRvPSdDOlxcZm9vJwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q29tbW9uU2VwID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaSA9PT0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiBgdG9gIGlzIHRoZSBkZXZpY2Ugcm9vdC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGZyb209J0M6XFxmb29cXGJhcic7IHRvPSdDOlxcJwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q29tbW9uU2VwID0gMzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobGFzdENvbW1vblNlcCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBsYXN0Q29tbW9uU2VwID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgb3V0ID0gJyc7CiAgICAgICAgICAgIC8vIEdlbmVyYXRlIHRoZSByZWxhdGl2ZSBwYXRoIGJhc2VkIG9uIHRoZSBwYXRoIGRpZmZlcmVuY2UgYmV0d2VlbiBgdG9gIGFuZAogICAgICAgICAgICAvLyBgZnJvbWAKICAgICAgICAgICAgZm9yIChpID0gZnJvbVN0YXJ0ICsgbGFzdENvbW1vblNlcCArIDE7IGkgPD0gZnJvbUVuZDsgKytpKSB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gZnJvbUVuZCB8fCBmcm9tLmNoYXJDb2RlQXQoaSkgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgICAgICBvdXQgKz0gb3V0Lmxlbmd0aCA9PT0gMCA/ICcuLicgOiAnXFwuLic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG9TdGFydCArPSBsYXN0Q29tbW9uU2VwOwogICAgICAgICAgICAvLyBMYXN0bHksIGFwcGVuZCB0aGUgcmVzdCBvZiB0aGUgZGVzdGluYXRpb24gKGB0b2ApIHBhdGggdGhhdCBjb21lcyBhZnRlcgogICAgICAgICAgICAvLyB0aGUgY29tbW9uIHBhdGggcGFydHMKICAgICAgICAgICAgaWYgKG91dC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYCR7b3V0fSR7dG9PcmlnLnNsaWNlKHRvU3RhcnQsIHRvRW5kKX1gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0b09yaWcuY2hhckNvZGVBdCh0b1N0YXJ0KSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkgewogICAgICAgICAgICAgICAgKyt0b1N0YXJ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0b09yaWcuc2xpY2UodG9TdGFydCwgdG9FbmQpOwogICAgICAgIH0sCiAgICAgICAgdG9OYW1lc3BhY2VkUGF0aChwYXRoKSB7CiAgICAgICAgICAgIC8vIE5vdGU6IHRoaXMgd2lsbCAqcHJvYmFibHkqIHRocm93IHNvbWV3aGVyZS4KICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gd2luMzIucmVzb2x2ZShwYXRoKTsKICAgICAgICAgICAgaWYgKHJlc29sdmVkUGF0aC5sZW5ndGggPD0gMikgewogICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlc29sdmVkUGF0aC5jaGFyQ29kZUF0KDApID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBVTkMgcm9vdAogICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkUGF0aC5jaGFyQ29kZUF0KDEpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHJlc29sdmVkUGF0aC5jaGFyQ29kZUF0KDIpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9PSBDSEFSX1FVRVNUSU9OX01BUksgJiYgY29kZSAhPT0gQ0hBUl9ET1QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCBub24tbG9uZyBVTkMgcm9vdCwgY29udmVydCB0aGUgcGF0aCB0byBhIGxvbmcgVU5DIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBcXFxcP1xcVU5DXFwke3Jlc29sdmVkUGF0aC5zbGljZSgyKX1gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpc1dpbmRvd3NEZXZpY2VSb290KHJlc29sdmVkUGF0aC5jaGFyQ29kZUF0KDApKSAmJgogICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoLmNoYXJDb2RlQXQoMSkgPT09IENIQVJfQ09MT04gJiYKICAgICAgICAgICAgICAgIHJlc29sdmVkUGF0aC5jaGFyQ29kZUF0KDIpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIGRldmljZSByb290LCBjb252ZXJ0IHRoZSBwYXRoIHRvIGEgbG9uZyBVTkMgcGF0aAogICAgICAgICAgICAgICAgcmV0dXJuIGBcXFxcP1xcJHtyZXNvbHZlZFBhdGh9YDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgICB9LAogICAgICAgIGRpcm5hbWUocGF0aCkgewogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpOwogICAgICAgICAgICBjb25zdCBsZW4gPSBwYXRoLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGxlbiA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgcm9vdEVuZCA9IC0xOwogICAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdCgwKTsKICAgICAgICAgICAgaWYgKGxlbiA9PT0gMSkgewogICAgICAgICAgICAgICAgLy8gYHBhdGhgIGNvbnRhaW5zIGp1c3QgYSBwYXRoIHNlcGFyYXRvciwgZXhpdCBlYXJseSB0byBhdm9pZAogICAgICAgICAgICAgICAgLy8gdW5uZWNlc3Nhcnkgd29yayBvciBhIGRvdC4KICAgICAgICAgICAgICAgIHJldHVybiBpc1BhdGhTZXBhcmF0b3IoY29kZSkgPyBwYXRoIDogJy4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCBhIHJvb3QKICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkgewogICAgICAgICAgICAgICAgLy8gUG9zc2libGUgVU5DIHJvb3QKICAgICAgICAgICAgICAgIHJvb3RFbmQgPSBvZmZzZXQgPSAxOwogICAgICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoMSkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCBkb3VibGUgcGF0aCBzZXBhcmF0b3IgYXQgYmVnaW5uaW5nCiAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAyOwogICAgICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gajsKICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuICYmICFpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkgewogICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChqIDwgbGVuICYmIGogIT09IGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCEKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBwYXRoIHNlcGFyYXRvcnMKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IGxlbiAmJiBqICE9PSBsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgIWlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGxlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgYSBVTkMgcm9vdCBvbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPT0gbGFzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgYSBVTkMgcm9vdCB3aXRoIGxlZnRvdmVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCBieSAxIHRvIGluY2x1ZGUgdGhlIHNlcGFyYXRvciBhZnRlciB0aGUgVU5DIHJvb3QgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmVhdCBpdCBhcyBhICJub3JtYWwgcm9vdCIgb24gdG9wIG9mIGEgKFVOQykgcm9vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbmQgPSBvZmZzZXQgPSBqICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFBvc3NpYmxlIGRldmljZSByb290CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNXaW5kb3dzRGV2aWNlUm9vdChjb2RlKSAmJiBwYXRoLmNoYXJDb2RlQXQoMSkgPT09IENIQVJfQ09MT04pIHsKICAgICAgICAgICAgICAgIHJvb3RFbmQgPSBsZW4gPiAyICYmIGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoMikpID8gMyA6IDI7CiAgICAgICAgICAgICAgICBvZmZzZXQgPSByb290RW5kOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBlbmQgPSAtMTsKICAgICAgICAgICAgbGV0IG1hdGNoZWRTbGFzaCA9IHRydWU7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZW4gLSAxOyBpID49IG9mZnNldDsgLS1pKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChpKSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvcgogICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICBpZiAocm9vdEVuZCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW5kID0gcm9vdEVuZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGF0aC5zbGljZSgwLCBlbmQpOwogICAgICAgIH0sCiAgICAgICAgYmFzZW5hbWUocGF0aCwgZXh0KSB7CiAgICAgICAgICAgIGlmIChleHQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcoZXh0LCAnZXh0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTsKICAgICAgICAgICAgbGV0IHN0YXJ0ID0gMDsKICAgICAgICAgICAgbGV0IGVuZCA9IC0xOwogICAgICAgICAgICBsZXQgbWF0Y2hlZFNsYXNoID0gdHJ1ZTsKICAgICAgICAgICAgbGV0IGk7CiAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIGRyaXZlIGxldHRlciBwcmVmaXggc28gYXMgbm90IHRvIG1pc3Rha2UgdGhlIGZvbGxvd2luZwogICAgICAgICAgICAvLyBwYXRoIHNlcGFyYXRvciBhcyBhbiBleHRyYSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCB0aGF0IGNhbiBiZQogICAgICAgICAgICAvLyBkaXNyZWdhcmRlZAogICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPj0gMiAmJgogICAgICAgICAgICAgICAgaXNXaW5kb3dzRGV2aWNlUm9vdChwYXRoLmNoYXJDb2RlQXQoMCkpICYmCiAgICAgICAgICAgICAgICBwYXRoLmNoYXJDb2RlQXQoMSkgPT09IENIQVJfQ09MT04pIHsKICAgICAgICAgICAgICAgIHN0YXJ0ID0gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZXh0ICE9PSB1bmRlZmluZWQgJiYgZXh0Lmxlbmd0aCA+IDAgJiYgZXh0Lmxlbmd0aCA8PSBwYXRoLmxlbmd0aCkgewogICAgICAgICAgICAgICAgaWYgKGV4dCA9PT0gcGF0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBleHRJZHggPSBleHQubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgIGxldCBmaXJzdE5vblNsYXNoRW5kID0gLTE7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7IC0taSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aAogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Tm9uU2xhc2hFbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgcmVtZW1iZXIgdGhpcyBpbmRleCBpbiBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIGl0IGlmIHRoZSBleHRlbnNpb24gZW5kcyB1cCBub3QgbWF0Y2hpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3ROb25TbGFzaEVuZCA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRJZHggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIHRoZSBleHBsaWNpdCBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSBleHQuY2hhckNvZGVBdChleHRJZHgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tZXh0SWR4ID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBleHRlbnNpb24sIHNvIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91ciBwYXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dGVuc2lvbiBkb2VzIG5vdCBtYXRjaCwgc28gb3VyIHJlc3VsdCBpcyB0aGUgZW50aXJlIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRJZHggPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBmaXJzdE5vblNsYXNoRW5kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHsKICAgICAgICAgICAgICAgICAgICBlbmQgPSBmaXJzdE5vblNsYXNoRW5kOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZW5kID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGVuZCA9IHBhdGgubGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IHN0YXJ0OyAtLWkpIHsKICAgICAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGkpKSkgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoCiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZW5kID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXIKICAgICAgICAgICAgICAgICAgICAvLyBwYXRoIGNvbXBvbmVudAogICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGVuZCA9IGkgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgICAgfSwKICAgICAgICBleHRuYW1lKHBhdGgpIHsKICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTsKICAgICAgICAgICAgbGV0IHN0YXJ0ID0gMDsKICAgICAgICAgICAgbGV0IHN0YXJ0RG90ID0gLTE7CiAgICAgICAgICAgIGxldCBzdGFydFBhcnQgPSAwOwogICAgICAgICAgICBsZXQgZW5kID0gLTE7CiAgICAgICAgICAgIGxldCBtYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgICAgICAgICAvLyBUcmFjayB0aGUgc3RhdGUgb2YgY2hhcmFjdGVycyAoaWYgYW55KSB3ZSBzZWUgYmVmb3JlIG91ciBmaXJzdCBkb3QgYW5kCiAgICAgICAgICAgIC8vIGFmdGVyIGFueSBwYXRoIHNlcGFyYXRvciB3ZSBmaW5kCiAgICAgICAgICAgIGxldCBwcmVEb3RTdGF0ZSA9IDA7CiAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIGRyaXZlIGxldHRlciBwcmVmaXggc28gYXMgbm90IHRvIG1pc3Rha2UgdGhlIGZvbGxvd2luZwogICAgICAgICAgICAvLyBwYXRoIHNlcGFyYXRvciBhcyBhbiBleHRyYSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCB0aGF0IGNhbiBiZQogICAgICAgICAgICAvLyBkaXNyZWdhcmRlZAogICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPj0gMiAmJgogICAgICAgICAgICAgICAgcGF0aC5jaGFyQ29kZUF0KDEpID09PSBDSEFSX0NPTE9OICYmCiAgICAgICAgICAgICAgICBpc1dpbmRvd3NEZXZpY2VSb290KHBhdGguY2hhckNvZGVBdCgwKSkpIHsKICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnRQYXJ0ID0gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGxldCBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IHN0YXJ0OyAtLWkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGgKICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3cKICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBhcnQgPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyCiAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gaSArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9ET1QpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG91ciBmaXJzdCBkb3QsIG1hcmsgaXQgYXMgdGhlIHN0YXJ0IG9mIG91ciBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RG90ID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJlRG90U3RhdGUgIT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJlRG90U3RhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0RG90ICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgYW5kIG5vbi1wYXRoIHNlcGFyYXRvciBiZWZvcmUgb3VyIGRvdCwgc28gd2Ugc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSBhIGdvb2QgY2hhbmNlIGF0IGhhdmluZyBhIG5vbi1lbXB0eSBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGFydERvdCA9PT0gLTEgfHwKICAgICAgICAgICAgICAgIGVuZCA9PT0gLTEgfHwKICAgICAgICAgICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZG90CiAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9PT0gMCB8fAogICAgICAgICAgICAgICAgLy8gVGhlIChyaWdodC1tb3N0KSB0cmltbWVkIHBhdGggY29tcG9uZW50IGlzIGV4YWN0bHkgJy4uJwogICAgICAgICAgICAgICAgKHByZURvdFN0YXRlID09PSAxICYmCiAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPT09IGVuZCAtIDEgJiYKICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGF0aC5zbGljZShzdGFydERvdCwgZW5kKTsKICAgICAgICB9LAogICAgICAgIGZvcm1hdDogX2Zvcm1hdC5iaW5kKG51bGwsICdcXCcpLAogICAgICAgIHBhcnNlKHBhdGgpIHsKICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTsKICAgICAgICAgICAgY29uc3QgcmV0ID0geyByb290OiAnJywgZGlyOiAnJywgYmFzZTogJycsIGV4dDogJycsIG5hbWU6ICcnIH07CiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBsZW4gPSBwYXRoLmxlbmd0aDsKICAgICAgICAgICAgbGV0IHJvb3RFbmQgPSAwOwogICAgICAgICAgICBsZXQgY29kZSA9IHBhdGguY2hhckNvZGVBdCgwKTsKICAgICAgICAgICAgaWYgKGxlbiA9PT0gMSkgewogICAgICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGBwYXRoYCBjb250YWlucyBqdXN0IGEgcGF0aCBzZXBhcmF0b3IsIGV4aXQgZWFybHkgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAvLyB1bm5lY2Vzc2FyeSB3b3JrCiAgICAgICAgICAgICAgICAgICAgcmV0LnJvb3QgPSByZXQuZGlyID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0LmJhc2UgPSByZXQubmFtZSA9IHBhdGg7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCBhIHJvb3QKICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkgewogICAgICAgICAgICAgICAgLy8gUG9zc2libGUgVU5DIHJvb3QKICAgICAgICAgICAgICAgIHJvb3RFbmQgPSAxOwogICAgICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoMSkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCBkb3VibGUgcGF0aCBzZXBhcmF0b3IgYXQgYmVnaW5uaW5nCiAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAyOwogICAgICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gajsKICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuICYmICFpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkgewogICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChqIDwgbGVuICYmIGogIT09IGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2hlZCEKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBwYXRoIHNlcGFyYXRvcnMKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IGxlbiAmJiBqICE9PSBsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgbm9uLXBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgIWlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGxlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgYSBVTkMgcm9vdCBvbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVuZCA9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqICE9PSBsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF0Y2hlZCBhIFVOQyByb290IHdpdGggbGVmdG92ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVuZCA9IGogKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzV2luZG93c0RldmljZVJvb3QoY29kZSkgJiYgcGF0aC5jaGFyQ29kZUF0KDEpID09PSBDSEFSX0NPTE9OKSB7CiAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBkZXZpY2Ugcm9vdAogICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gYHBhdGhgIGNvbnRhaW5zIGp1c3QgYSBkcml2ZSByb290LCBleGl0IGVhcmx5IHRvIGF2b2lkCiAgICAgICAgICAgICAgICAgICAgLy8gdW5uZWNlc3Nhcnkgd29yawogICAgICAgICAgICAgICAgICAgIHJldC5yb290ID0gcmV0LmRpciA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJvb3RFbmQgPSAyOwogICAgICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoMikpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBgcGF0aGAgY29udGFpbnMganVzdCBhIGRyaXZlIHJvb3QsIGV4aXQgZWFybHkgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5uZWNlc3Nhcnkgd29yawogICAgICAgICAgICAgICAgICAgICAgICByZXQucm9vdCA9IHJldC5kaXIgPSBwYXRoOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByb290RW5kID0gMzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocm9vdEVuZCA+IDApIHsKICAgICAgICAgICAgICAgIHJldC5yb290ID0gcGF0aC5zbGljZSgwLCByb290RW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgc3RhcnREb3QgPSAtMTsKICAgICAgICAgICAgbGV0IHN0YXJ0UGFydCA9IHJvb3RFbmQ7CiAgICAgICAgICAgIGxldCBlbmQgPSAtMTsKICAgICAgICAgICAgbGV0IG1hdGNoZWRTbGFzaCA9IHRydWU7CiAgICAgICAgICAgIGxldCBpID0gcGF0aC5sZW5ndGggLSAxOwogICAgICAgICAgICAvLyBUcmFjayB0aGUgc3RhdGUgb2YgY2hhcmFjdGVycyAoaWYgYW55KSB3ZSBzZWUgYmVmb3JlIG91ciBmaXJzdCBkb3QgYW5kCiAgICAgICAgICAgIC8vIGFmdGVyIGFueSBwYXRoIHNlcGFyYXRvciB3ZSBmaW5kCiAgICAgICAgICAgIGxldCBwcmVEb3RTdGF0ZSA9IDA7CiAgICAgICAgICAgIC8vIEdldCBub24tZGlyIGluZm8KICAgICAgICAgICAgZm9yICg7IGkgPj0gcm9vdEVuZDsgLS1pKSB7CiAgICAgICAgICAgICAgICBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoCiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQYXJ0ID0gaSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChlbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91cgogICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGVuZCA9IGkgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRE9UKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgZG90LCBtYXJrIGl0IGFzIHRoZSBzdGFydCBvZiBvdXIgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9IGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByZURvdFN0YXRlICE9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZURvdFN0YXRlID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFydERvdCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgYSBub24tZG90IGFuZCBub24tcGF0aCBzZXBhcmF0b3IgYmVmb3JlIG91ciBkb3QsIHNvIHdlIHNob3VsZAogICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgYSBnb29kIGNoYW5jZSBhdCBoYXZpbmcgYSBub24tZW1wdHkgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgcHJlRG90U3RhdGUgPSAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZW5kICE9PSAtMSkgewogICAgICAgICAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fAogICAgICAgICAgICAgICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZG90CiAgICAgICAgICAgICAgICAgICAgcHJlRG90U3RhdGUgPT09IDAgfHwKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgKHJpZ2h0LW1vc3QpIHRyaW1tZWQgcGF0aCBjb21wb25lbnQgaXMgZXhhY3RseSAnLi4nCiAgICAgICAgICAgICAgICAgICAgKHByZURvdFN0YXRlID09PSAxICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RG90ID09PSBlbmQgLSAxICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RG90ID09PSBzdGFydFBhcnQgKyAxKSkgewogICAgICAgICAgICAgICAgICAgIHJldC5iYXNlID0gcmV0Lm5hbWUgPSBwYXRoLnNsaWNlKHN0YXJ0UGFydCwgZW5kKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldC5uYW1lID0gcGF0aC5zbGljZShzdGFydFBhcnQsIHN0YXJ0RG90KTsKICAgICAgICAgICAgICAgICAgICByZXQuYmFzZSA9IHBhdGguc2xpY2Uoc3RhcnRQYXJ0LCBlbmQpOwogICAgICAgICAgICAgICAgICAgIHJldC5leHQgPSBwYXRoLnNsaWNlKHN0YXJ0RG90LCBlbmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHRoZSBkaXJlY3RvcnkgaXMgdGhlIHJvb3QsIHVzZSB0aGUgZW50aXJlIHJvb3QgYXMgdGhlIGBkaXJgIGluY2x1ZGluZwogICAgICAgICAgICAvLyB0aGUgdHJhaWxpbmcgc2xhc2ggaWYgYW55IChgQzpcYWJjYCAtPiBgQzpcYCkuIE90aGVyd2lzZSwgc3RyaXAgb3V0IHRoZQogICAgICAgICAgICAvLyB0cmFpbGluZyBzbGFzaCAoYEM6XGFiY1xkZWZgIC0+IGBDOlxhYmNgKS4KICAgICAgICAgICAgaWYgKHN0YXJ0UGFydCA+IDAgJiYgc3RhcnRQYXJ0ICE9PSByb290RW5kKSB7CiAgICAgICAgICAgICAgICByZXQuZGlyID0gcGF0aC5zbGljZSgwLCBzdGFydFBhcnQgLSAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldC5kaXIgPSByZXQucm9vdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgc2VwOiAnXFwnLAogICAgICAgIGRlbGltaXRlcjogJzsnLAogICAgICAgIHdpbjMyOiBudWxsLAogICAgICAgIHBvc2l4OiBudWxsCiAgICB9OwogICAgY29uc3QgcG9zaXggPSB7CiAgICAgICAgLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKQogICAgICAgIHJlc29sdmUoLi4ucGF0aFNlZ21lbnRzKSB7CiAgICAgICAgICAgIGxldCByZXNvbHZlZFBhdGggPSAnJzsKICAgICAgICAgICAgbGV0IHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBhdGhTZWdtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBpID49IDAgPyBwYXRoU2VnbWVudHNbaV0gOiBjd2QoKTsKICAgICAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgsICdwYXRoJyk7CiAgICAgICAgICAgICAgICAvLyBTa2lwIGVtcHR5IGVudHJpZXMKICAgICAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gYCR7cGF0aH0vJHtyZXNvbHZlZFBhdGh9YDsKICAgICAgICAgICAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJDb2RlQXQoMCkgPT09IENIQVJfRk9SV0FSRF9TTEFTSDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0CiAgICAgICAgICAgIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKQogICAgICAgICAgICAvLyBOb3JtYWxpemUgdGhlIHBhdGgKICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplU3RyaW5nKHJlc29sdmVkUGF0aCwgIXJlc29sdmVkQWJzb2x1dGUsICcvJywgaXNQb3NpeFBhdGhTZXBhcmF0b3IpOwogICAgICAgICAgICBpZiAocmVzb2x2ZWRBYnNvbHV0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGAvJHtyZXNvbHZlZFBhdGh9YDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoLmxlbmd0aCA+IDAgPyByZXNvbHZlZFBhdGggOiAnLic7CiAgICAgICAgfSwKICAgICAgICBub3JtYWxpemUocGF0aCkgewogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpOwogICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAnLic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaXNBYnNvbHV0ZSA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIOwogICAgICAgICAgICBjb25zdCB0cmFpbGluZ1NlcGFyYXRvciA9IHBhdGguY2hhckNvZGVBdChwYXRoLmxlbmd0aCAtIDEpID09PSBDSEFSX0ZPUldBUkRfU0xBU0g7CiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aAogICAgICAgICAgICBwYXRoID0gbm9ybWFsaXplU3RyaW5nKHBhdGgsICFpc0Fic29sdXRlLCAnLycsIGlzUG9zaXhQYXRoU2VwYXJhdG9yKTsKICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNBYnNvbHV0ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnLyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJhaWxpbmdTZXBhcmF0b3IgPyAnLi8nIDogJy4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0cmFpbGluZ1NlcGFyYXRvcikgewogICAgICAgICAgICAgICAgcGF0aCArPSAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGlzQWJzb2x1dGUgPyBgLyR7cGF0aH1gIDogcGF0aDsKICAgICAgICB9LAogICAgICAgIGlzQWJzb2x1dGUocGF0aCkgewogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpOwogICAgICAgICAgICByZXR1cm4gcGF0aC5sZW5ndGggPiAwICYmIHBhdGguY2hhckNvZGVBdCgwKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIOwogICAgICAgIH0sCiAgICAgICAgam9pbiguLi5wYXRocykgewogICAgICAgICAgICBpZiAocGF0aHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJy4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBqb2luZWQ7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IHBhdGhzW2ldOwogICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcoYXJnLCAncGF0aCcpOwogICAgICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGpvaW5lZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5lZCA9IGFyZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5lZCArPSBgLyR7YXJnfWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChqb2luZWQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcG9zaXgubm9ybWFsaXplKGpvaW5lZCk7CiAgICAgICAgfSwKICAgICAgICByZWxhdGl2ZShmcm9tLCB0bykgewogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhmcm9tLCAnZnJvbScpOwogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyh0bywgJ3RvJyk7CiAgICAgICAgICAgIGlmIChmcm9tID09PSB0bykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRyaW0gbGVhZGluZyBmb3J3YXJkIHNsYXNoZXMuCiAgICAgICAgICAgIGZyb20gPSBwb3NpeC5yZXNvbHZlKGZyb20pOwogICAgICAgICAgICB0byA9IHBvc2l4LnJlc29sdmUodG8pOwogICAgICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBmcm9tU3RhcnQgPSAxOwogICAgICAgICAgICBjb25zdCBmcm9tRW5kID0gZnJvbS5sZW5ndGg7CiAgICAgICAgICAgIGNvbnN0IGZyb21MZW4gPSBmcm9tRW5kIC0gZnJvbVN0YXJ0OwogICAgICAgICAgICBjb25zdCB0b1N0YXJ0ID0gMTsKICAgICAgICAgICAgY29uc3QgdG9MZW4gPSB0by5sZW5ndGggLSB0b1N0YXJ0OwogICAgICAgICAgICAvLyBDb21wYXJlIHBhdGhzIHRvIGZpbmQgdGhlIGxvbmdlc3QgY29tbW9uIHBhdGggZnJvbSByb290CiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IChmcm9tTGVuIDwgdG9MZW4gPyBmcm9tTGVuIDogdG9MZW4pOwogICAgICAgICAgICBsZXQgbGFzdENvbW1vblNlcCA9IC0xOwogICAgICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IGZyb21Db2RlID0gZnJvbS5jaGFyQ29kZUF0KGZyb21TdGFydCArIGkpOwogICAgICAgICAgICAgICAgaWYgKGZyb21Db2RlICE9PSB0by5jaGFyQ29kZUF0KHRvU3RhcnQgKyBpKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkgewogICAgICAgICAgICAgICAgICAgIGxhc3RDb21tb25TZXAgPSBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpID09PSBsZW5ndGgpIHsKICAgICAgICAgICAgICAgIGlmICh0b0xlbiA+IGxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0by5jaGFyQ29kZUF0KHRvU3RhcnQgKyBpKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGBmcm9tYCBpcyB0aGUgZXhhY3QgYmFzZSBwYXRoIGZvciBgdG9gLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nL2Zvby9iYXInOyB0bz0nL2Zvby9iYXIvYmF6JwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG8uc2xpY2UodG9TdGFydCArIGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZ2V0IGhlcmUgaWYgYGZyb21gIGlzIHRoZSByb290CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBmcm9tPScvJzsgdG89Jy9mb28nCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0by5zbGljZSh0b1N0YXJ0ICsgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUxlbiA+IGxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGlmIChmcm9tLmNoYXJDb2RlQXQoZnJvbVN0YXJ0ICsgaSkgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiBgdG9gIGlzIHRoZSBleGFjdCBiYXNlIHBhdGggZm9yIGBmcm9tYC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGZyb209Jy9mb28vYmFyL2Jheic7IHRvPScvZm9vL2JhcicKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENvbW1vblNlcCA9IGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZ2V0IGhlcmUgaWYgYHRvYCBpcyB0aGUgcm9vdC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGZyb209Jy9mb28vYmFyJzsgdG89Jy8nCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDb21tb25TZXAgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgb3V0ID0gJyc7CiAgICAgICAgICAgIC8vIEdlbmVyYXRlIHRoZSByZWxhdGl2ZSBwYXRoIGJhc2VkIG9uIHRoZSBwYXRoIGRpZmZlcmVuY2UgYmV0d2VlbiBgdG9gCiAgICAgICAgICAgIC8vIGFuZCBgZnJvbWAuCiAgICAgICAgICAgIGZvciAoaSA9IGZyb21TdGFydCArIGxhc3RDb21tb25TZXAgKyAxOyBpIDw9IGZyb21FbmQ7ICsraSkgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGZyb21FbmQgfHwgZnJvbS5jaGFyQ29kZUF0KGkpID09PSBDSEFSX0ZPUldBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgICAgICBvdXQgKz0gb3V0Lmxlbmd0aCA9PT0gMCA/ICcuLicgOiAnLy4uJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBMYXN0bHksIGFwcGVuZCB0aGUgcmVzdCBvZiB0aGUgZGVzdGluYXRpb24gKGB0b2ApIHBhdGggdGhhdCBjb21lcyBhZnRlcgogICAgICAgICAgICAvLyB0aGUgY29tbW9uIHBhdGggcGFydHMuCiAgICAgICAgICAgIHJldHVybiBgJHtvdXR9JHt0by5zbGljZSh0b1N0YXJ0ICsgbGFzdENvbW1vblNlcCl9YDsKICAgICAgICB9LAogICAgICAgIHRvTmFtZXNwYWNlZFBhdGgocGF0aCkgewogICAgICAgICAgICAvLyBOb24tb3Agb24gcG9zaXggc3lzdGVtcwogICAgICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgICB9LAogICAgICAgIGRpcm5hbWUocGF0aCkgewogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpOwogICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAnLic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaGFzUm9vdCA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIOwogICAgICAgICAgICBsZXQgZW5kID0gLTE7CiAgICAgICAgICAgIGxldCBtYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgICAgICAgICBmb3IgKGxldCBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDE7IC0taSkgewogICAgICAgICAgICAgICAgaWYgKHBhdGguY2hhckNvZGVBdChpKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IKICAgICAgICAgICAgICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZW5kID09PSAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGhhc1Jvb3QgPyAnLycgOiAnLic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhhc1Jvb3QgJiYgZW5kID09PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJy8vJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGF0aC5zbGljZSgwLCBlbmQpOwogICAgICAgIH0sCiAgICAgICAgYmFzZW5hbWUocGF0aCwgZXh0KSB7CiAgICAgICAgICAgIGlmIChleHQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcoZXh0LCAnZXh0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTsKICAgICAgICAgICAgbGV0IHN0YXJ0ID0gMDsKICAgICAgICAgICAgbGV0IGVuZCA9IC0xOwogICAgICAgICAgICBsZXQgbWF0Y2hlZFNsYXNoID0gdHJ1ZTsKICAgICAgICAgICAgbGV0IGk7CiAgICAgICAgICAgIGlmIChleHQgIT09IHVuZGVmaW5lZCAmJiBleHQubGVuZ3RoID4gMCAmJiBleHQubGVuZ3RoIDw9IHBhdGgubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBpZiAoZXh0ID09PSBwYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IGV4dElkeCA9IGV4dC5sZW5ndGggLSAxOwogICAgICAgICAgICAgICAgbGV0IGZpcnN0Tm9uU2xhc2hFbmQgPSAtMTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0ZPUldBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE5vblNsYXNoRW5kID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIHJlbWVtYmVyIHRoaXMgaW5kZXggaW4gY2FzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCBpdCBpZiB0aGUgZXh0ZW5zaW9uIGVuZHMgdXAgbm90IG1hdGNoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Tm9uU2xhc2hFbmQgPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0SWR4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCB0aGUgZXhwbGljaXQgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gZXh0LmNoYXJDb2RlQXQoZXh0SWR4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLWV4dElkeCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgZXh0ZW5zaW9uLCBzbyBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXIgcGF0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRlbnNpb24gZG9lcyBub3QgbWF0Y2gsIHNvIG91ciByZXN1bHQgaXMgdGhlIGVudGlyZSBwYXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0SWR4ID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZmlyc3ROb25TbGFzaEVuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gZmlyc3ROb25TbGFzaEVuZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVuZCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBlbmQgPSBwYXRoLmxlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLnNsaWNlKHN0YXJ0LCBlbmQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXRoLmNoYXJDb2RlQXQoaSkgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoCiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZW5kID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXIKICAgICAgICAgICAgICAgICAgICAvLyBwYXRoIGNvbXBvbmVudAogICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGVuZCA9IGkgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgICAgfSwKICAgICAgICBleHRuYW1lKHBhdGgpIHsKICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTsKICAgICAgICAgICAgbGV0IHN0YXJ0RG90ID0gLTE7CiAgICAgICAgICAgIGxldCBzdGFydFBhcnQgPSAwOwogICAgICAgICAgICBsZXQgZW5kID0gLTE7CiAgICAgICAgICAgIGxldCBtYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgICAgICAgICAvLyBUcmFjayB0aGUgc3RhdGUgb2YgY2hhcmFjdGVycyAoaWYgYW55KSB3ZSBzZWUgYmVmb3JlIG91ciBmaXJzdCBkb3QgYW5kCiAgICAgICAgICAgIC8vIGFmdGVyIGFueSBwYXRoIHNlcGFyYXRvciB3ZSBmaW5kCiAgICAgICAgICAgIGxldCBwcmVEb3RTdGF0ZSA9IDA7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoCiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQYXJ0ID0gaSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChlbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91cgogICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGVuZCA9IGkgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRE9UKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgZG90LCBtYXJrIGl0IGFzIHRoZSBzdGFydCBvZiBvdXIgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9IGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByZURvdFN0YXRlICE9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZURvdFN0YXRlID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFydERvdCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgYSBub24tZG90IGFuZCBub24tcGF0aCBzZXBhcmF0b3IgYmVmb3JlIG91ciBkb3QsIHNvIHdlIHNob3VsZAogICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgYSBnb29kIGNoYW5jZSBhdCBoYXZpbmcgYSBub24tZW1wdHkgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgcHJlRG90U3RhdGUgPSAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xIHx8CiAgICAgICAgICAgICAgICBlbmQgPT09IC0xIHx8CiAgICAgICAgICAgICAgICAvLyBXZSBzYXcgYSBub24tZG90IGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRvdAogICAgICAgICAgICAgICAgcHJlRG90U3RhdGUgPT09IDAgfHwKICAgICAgICAgICAgICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLicKICAgICAgICAgICAgICAgIChwcmVEb3RTdGF0ZSA9PT0gMSAmJgogICAgICAgICAgICAgICAgICAgIHN0YXJ0RG90ID09PSBlbmQgLSAxICYmCiAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPT09IHN0YXJ0UGFydCArIDEpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnREb3QsIGVuZCk7CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IF9mb3JtYXQuYmluZChudWxsLCAnLycpLAogICAgICAgIHBhcnNlKHBhdGgpIHsKICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTsKICAgICAgICAgICAgY29uc3QgcmV0ID0geyByb290OiAnJywgZGlyOiAnJywgYmFzZTogJycsIGV4dDogJycsIG5hbWU6ICcnIH07CiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpc0Fic29sdXRlID0gcGF0aC5jaGFyQ29kZUF0KDApID09PSBDSEFSX0ZPUldBUkRfU0xBU0g7CiAgICAgICAgICAgIGxldCBzdGFydDsKICAgICAgICAgICAgaWYgKGlzQWJzb2x1dGUpIHsKICAgICAgICAgICAgICAgIHJldC5yb290ID0gJy8nOwogICAgICAgICAgICAgICAgc3RhcnQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3RhcnQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBzdGFydERvdCA9IC0xOwogICAgICAgICAgICBsZXQgc3RhcnRQYXJ0ID0gMDsKICAgICAgICAgICAgbGV0IGVuZCA9IC0xOwogICAgICAgICAgICBsZXQgbWF0Y2hlZFNsYXNoID0gdHJ1ZTsKICAgICAgICAgICAgbGV0IGkgPSBwYXRoLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIC8vIFRyYWNrIHRoZSBzdGF0ZSBvZiBjaGFyYWN0ZXJzIChpZiBhbnkpIHdlIHNlZSBiZWZvcmUgb3VyIGZpcnN0IGRvdCBhbmQKICAgICAgICAgICAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmQKICAgICAgICAgICAgbGV0IHByZURvdFN0YXRlID0gMDsKICAgICAgICAgICAgLy8gR2V0IG5vbi1kaXIgaW5mbwogICAgICAgICAgICBmb3IgKDsgaSA+PSBzdGFydDsgLS1pKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoCiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQYXJ0ID0gaSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChlbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91cgogICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGVuZCA9IGkgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRE9UKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgZG90LCBtYXJrIGl0IGFzIHRoZSBzdGFydCBvZiBvdXIgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9IGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByZURvdFN0YXRlICE9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZURvdFN0YXRlID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFydERvdCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgYSBub24tZG90IGFuZCBub24tcGF0aCBzZXBhcmF0b3IgYmVmb3JlIG91ciBkb3QsIHNvIHdlIHNob3VsZAogICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgYSBnb29kIGNoYW5jZSBhdCBoYXZpbmcgYSBub24tZW1wdHkgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgcHJlRG90U3RhdGUgPSAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZW5kICE9PSAtMSkgewogICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydFBhcnQgPT09IDAgJiYgaXNBYnNvbHV0ZSA/IDEgOiBzdGFydFBhcnQ7CiAgICAgICAgICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xIHx8CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBkb3QKICAgICAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9PT0gMCB8fAogICAgICAgICAgICAgICAgICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLicKICAgICAgICAgICAgICAgICAgICAocHJlRG90U3RhdGUgPT09IDEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPT09IGVuZCAtIDEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPT09IHN0YXJ0UGFydCArIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0LmJhc2UgPSByZXQubmFtZSA9IHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXQubmFtZSA9IHBhdGguc2xpY2Uoc3RhcnQsIHN0YXJ0RG90KTsKICAgICAgICAgICAgICAgICAgICByZXQuYmFzZSA9IHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgICAgICAgICAgICAgICAgcmV0LmV4dCA9IHBhdGguc2xpY2Uoc3RhcnREb3QsIGVuZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXJ0UGFydCA+IDApIHsKICAgICAgICAgICAgICAgIHJldC5kaXIgPSBwYXRoLnNsaWNlKDAsIHN0YXJ0UGFydCAtIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzQWJzb2x1dGUpIHsKICAgICAgICAgICAgICAgIHJldC5kaXIgPSAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIHNlcDogJy8nLAogICAgICAgIGRlbGltaXRlcjogJzonLAogICAgICAgIHdpbjMyOiBudWxsLAogICAgICAgIHBvc2l4OiBudWxsCiAgICB9OwogICAgcG9zaXgud2luMzIgPSB3aW4zMi53aW4zMiA9IHdpbjMyOwogICAgcG9zaXgucG9zaXggPSB3aW4zMi5wb3NpeCA9IHBvc2l4OwogICAgKHBsYXRmb3JtID09PSAnd2luMzInID8gd2luMzIubm9ybWFsaXplIDogcG9zaXgubm9ybWFsaXplKTsKICAgIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IHdpbjMyLnJlc29sdmUgOiBwb3NpeC5yZXNvbHZlKTsKICAgIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IHdpbjMyLnJlbGF0aXZlIDogcG9zaXgucmVsYXRpdmUpOwogICAgKHBsYXRmb3JtID09PSAnd2luMzInID8gd2luMzIuZGlybmFtZSA6IHBvc2l4LmRpcm5hbWUpOwogICAgKHBsYXRmb3JtID09PSAnd2luMzInID8gd2luMzIuYmFzZW5hbWUgOiBwb3NpeC5iYXNlbmFtZSk7CiAgICAocGxhdGZvcm0gPT09ICd3aW4zMicgPyB3aW4zMi5leHRuYW1lIDogcG9zaXguZXh0bmFtZSk7CiAgICAocGxhdGZvcm0gPT09ICd3aW4zMicgPyB3aW4zMi5zZXAgOiBwb3NpeC5zZXApOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY29uc3QgX3NjaGVtZVBhdHRlcm4gPSAvXlx3W1x3XGQrLi1dKiQvOwogICAgY29uc3QgX3NpbmdsZVNsYXNoU3RhcnQgPSAvXlwvLzsKICAgIGNvbnN0IF9kb3VibGVTbGFzaFN0YXJ0ID0gL15cL1wvLzsKICAgIGZ1bmN0aW9uIF92YWxpZGF0ZVVyaShyZXQsIF9zdHJpY3QpIHsKICAgICAgICAvLyBzY2hlbWUsIG11c3QgYmUgc2V0CiAgICAgICAgaWYgKCFyZXQuc2NoZW1lICYmIF9zdHJpY3QpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbVXJpRXJyb3JdOiBTY2hlbWUgaXMgbWlzc2luZzoge3NjaGVtZTogIiIsIGF1dGhvcml0eTogIiR7cmV0LmF1dGhvcml0eX0iLCBwYXRoOiAiJHtyZXQucGF0aH0iLCBxdWVyeTogIiR7cmV0LnF1ZXJ5fSIsIGZyYWdtZW50OiAiJHtyZXQuZnJhZ21lbnR9In1gKTsKICAgICAgICB9CiAgICAgICAgLy8gc2NoZW1lLCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuMQogICAgICAgIC8vIEFMUEhBICooIEFMUEhBIC8gRElHSVQgLyAiKyIgLyAiLSIgLyAiLiIgKQogICAgICAgIGlmIChyZXQuc2NoZW1lICYmICFfc2NoZW1lUGF0dGVybi50ZXN0KHJldC5zY2hlbWUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW1VyaUVycm9yXTogU2NoZW1lIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycy4nKTsKICAgICAgICB9CiAgICAgICAgLy8gcGF0aCwgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuMwogICAgICAgIC8vIElmIGEgVVJJIGNvbnRhaW5zIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY29tcG9uZW50CiAgICAgICAgLy8gbXVzdCBlaXRoZXIgYmUgZW1wdHkgb3IgYmVnaW4gd2l0aCBhIHNsYXNoICgiLyIpIGNoYXJhY3Rlci4gIElmIGEgVVJJCiAgICAgICAgLy8gZG9lcyBub3QgY29udGFpbiBhbiBhdXRob3JpdHkgY29tcG9uZW50LCB0aGVuIHRoZSBwYXRoIGNhbm5vdCBiZWdpbgogICAgICAgIC8vIHdpdGggdHdvIHNsYXNoIGNoYXJhY3RlcnMgKCIvLyIpLgogICAgICAgIGlmIChyZXQucGF0aCkgewogICAgICAgICAgICBpZiAocmV0LmF1dGhvcml0eSkgewogICAgICAgICAgICAgICAgaWYgKCFfc2luZ2xlU2xhc2hTdGFydC50ZXN0KHJldC5wYXRoKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW1VyaUVycm9yXTogSWYgYSBVUkkgY29udGFpbnMgYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgdGhlbiB0aGUgcGF0aCBjb21wb25lbnQgbXVzdCBlaXRoZXIgYmUgZW1wdHkgb3IgYmVnaW4gd2l0aCBhIHNsYXNoICgiLyIpIGNoYXJhY3RlcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKF9kb3VibGVTbGFzaFN0YXJ0LnRlc3QocmV0LnBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY2Fubm90IGJlZ2luIHdpdGggdHdvIHNsYXNoIGNoYXJhY3RlcnMgKCIvLyIpJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvLyBmb3IgYSB3aGlsZSB3ZSBhbGxvd2VkIHVyaXMgKndpdGhvdXQqIHNjaGVtZXMgYW5kIHRoaXMgaXMgdGhlIG1pZ3JhdGlvbgogICAgLy8gZm9yIHRoZW0sIGUuZy4gYW4gdXJpIHdpdGhvdXQgc2NoZW1lIGFuZCB3aXRob3V0IHN0cmljdC1tb2RlIHdhcm5zIGFuZCBmYWxscwogICAgLy8gYmFjayB0byB0aGUgZmlsZS1zY2hlbWUuIHRoYXQgc2hvdWxkIGNhdXNlIHRoZSBsZWFzdCBjYXJuYWdlIGFuZCBzdGlsbCBiZSBhCiAgICAvLyBjbGVhciB3YXJuaW5nCiAgICBmdW5jdGlvbiBfc2NoZW1lRml4KHNjaGVtZSwgX3N0cmljdCkgewogICAgICAgIGlmICghc2NoZW1lICYmICFfc3RyaWN0KSB7CiAgICAgICAgICAgIHJldHVybiAnZmlsZSc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzY2hlbWU7CiAgICB9CiAgICAvLyBpbXBsZW1lbnRzIGEgYml0IG9mIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNQogICAgZnVuY3Rpb24gX3JlZmVyZW5jZVJlc29sdXRpb24oc2NoZW1lLCBwYXRoKSB7CiAgICAgICAgLy8gdGhlIHNsYXNoLWNoYXJhY3RlciBpcyBvdXIgJ2RlZmF1bHQgYmFzZScgYXMgd2UgZG9uJ3QKICAgICAgICAvLyBzdXBwb3J0IGNvbnN0cnVjdGluZyBVUklzIHJlbGF0aXZlIHRvIG90aGVyIFVSSXMuIFRoaXMKICAgICAgICAvLyBhbHNvIG1lYW5zIHRoYXQgd2UgYWx0ZXIgYW5kIHBvdGVudGlhbGx5IGJyZWFrIHBhdGhzLgogICAgICAgIC8vIHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTUuMS40CiAgICAgICAgc3dpdGNoIChzY2hlbWUpIHsKICAgICAgICAgICAgY2FzZSAnaHR0cHMnOgogICAgICAgICAgICBjYXNlICdodHRwJzoKICAgICAgICAgICAgY2FzZSAnZmlsZSc6CiAgICAgICAgICAgICAgICBpZiAoIXBhdGgpIHsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gX3NsYXNoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAocGF0aFswXSAhPT0gX3NsYXNoKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IF9zbGFzaCArIHBhdGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICB9CiAgICBjb25zdCBfZW1wdHkgPSAnJzsKICAgIGNvbnN0IF9zbGFzaCA9ICcvJzsKICAgIGNvbnN0IF9yZWdleHAgPSAvXigoW146Lz8jXSs/KTopPyhcL1wvKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/LzsKICAgIC8qKgogICAgICogVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYuCiAgICAgKiBUaGlzIGNsYXNzIGlzIGEgc2ltcGxlIHBhcnNlciB3aGljaCBjcmVhdGVzIHRoZSBiYXNpYyBjb21wb25lbnQgcGFydHMKICAgICAqIChodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMykgd2l0aCBtaW5pbWFsIHZhbGlkYXRpb24KICAgICAqIGFuZCBlbmNvZGluZy4KICAgICAqCiAgICAgKiBgYGB0eHQKICAgICAqICAgICAgIGZvbzovL2V4YW1wbGUuY29tOjgwNDIvb3Zlci90aGVyZT9uYW1lPWZlcnJldCNub3NlCiAgICAgKiAgICAgICBcXy8gICBcX19fX19fX19fX19fX18vXF9fX19fX19fXy8gXF9fX19fX19fXy8gXF9fLwogICAgICogICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgfAogICAgICogICAgIHNjaGVtZSAgICAgYXV0aG9yaXR5ICAgICAgIHBhdGggICAgICAgIHF1ZXJ5ICAgZnJhZ21lbnQKICAgICAqICAgICAgICB8ICAgX19fX19fX19fX19fX19fX19fX19ffF9fCiAgICAgKiAgICAgICAvIFwgLyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAqICAgICAgIHVybjpleGFtcGxlOmFuaW1hbDpmZXJyZXQ6bm9zZQogICAgICogYGBgCiAgICAgKi8KICAgIGNsYXNzIFVSSSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc2NoZW1lT3JEYXRhLCBhdXRob3JpdHksIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCwgX3N0cmljdCA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NoZW1lT3JEYXRhID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWUgPSBzY2hlbWVPckRhdGEuc2NoZW1lIHx8IF9lbXB0eTsKICAgICAgICAgICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gc2NoZW1lT3JEYXRhLmF1dGhvcml0eSB8fCBfZW1wdHk7CiAgICAgICAgICAgICAgICB0aGlzLnBhdGggPSBzY2hlbWVPckRhdGEucGF0aCB8fCBfZW1wdHk7CiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gc2NoZW1lT3JEYXRhLnF1ZXJ5IHx8IF9lbXB0eTsKICAgICAgICAgICAgICAgIHRoaXMuZnJhZ21lbnQgPSBzY2hlbWVPckRhdGEuZnJhZ21lbnQgfHwgX2VtcHR5OwogICAgICAgICAgICAgICAgLy8gbm8gdmFsaWRhdGlvbiBiZWNhdXNlIGl0J3MgdGhpcyBVUkkKICAgICAgICAgICAgICAgIC8vIHRoYXQgY3JlYXRlcyB1cmkgY29tcG9uZW50cy4KICAgICAgICAgICAgICAgIC8vIF92YWxpZGF0ZVVyaSh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1lID0gX3NjaGVtZUZpeChzY2hlbWVPckRhdGEsIF9zdHJpY3QpOwogICAgICAgICAgICAgICAgdGhpcy5hdXRob3JpdHkgPSBhdXRob3JpdHkgfHwgX2VtcHR5OwogICAgICAgICAgICAgICAgdGhpcy5wYXRoID0gX3JlZmVyZW5jZVJlc29sdXRpb24odGhpcy5zY2hlbWUsIHBhdGggfHwgX2VtcHR5KTsKICAgICAgICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeSB8fCBfZW1wdHk7CiAgICAgICAgICAgICAgICB0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQgfHwgX2VtcHR5OwogICAgICAgICAgICAgICAgX3ZhbGlkYXRlVXJpKHRoaXMsIF9zdHJpY3QpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBpc1VyaSh0aGluZykgewogICAgICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBVUkkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHlwZW9mIHRoaW5nLmF1dGhvcml0eSA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICAgICYmIHR5cGVvZiB0aGluZy5mcmFnbWVudCA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICAgICYmIHR5cGVvZiB0aGluZy5wYXRoID09PSAnc3RyaW5nJwogICAgICAgICAgICAgICAgJiYgdHlwZW9mIHRoaW5nLnF1ZXJ5ID09PSAnc3RyaW5nJwogICAgICAgICAgICAgICAgJiYgdHlwZW9mIHRoaW5nLnNjaGVtZSA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICAgICYmIHR5cGVvZiB0aGluZy5mc1BhdGggPT09ICdzdHJpbmcnCiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgdGhpbmcud2l0aCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgICAgICAgICAgJiYgdHlwZW9mIHRoaW5nLnRvU3RyaW5nID09PSAnZnVuY3Rpb24nOwogICAgICAgIH0KICAgICAgICAvLyAtLS0tIGZpbGVzeXN0ZW0gcGF0aCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgc3lzdGVtIHBhdGggb2YgdGhpcyBVUkkuCiAgICAgICAgICogV2lsbCBoYW5kbGUgVU5DIHBhdGhzLCBub3JtYWxpemVzIHdpbmRvd3MgZHJpdmUgbGV0dGVycyB0byBsb3dlci1jYXNlLCBhbmQgdXNlcyB0aGUKICAgICAgICAgKiBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvci4KICAgICAgICAgKgogICAgICAgICAqICogV2lsbCAqbm90KiB2YWxpZGF0ZSB0aGUgcGF0aCBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzIGFuZCBzZW1hbnRpY3MuCiAgICAgICAgICogKiBXaWxsICpub3QqIGxvb2sgYXQgdGhlIHNjaGVtZSBvZiB0aGlzIFVSSS4KICAgICAgICAgKiAqIFRoZSByZXN1bHQgc2hhbGwgKm5vdCogYmUgdXNlZCBmb3IgZGlzcGxheSBwdXJwb3NlcyBidXQgZm9yIGFjY2Vzc2luZyBhIGZpbGUgb24gZGlzay4KICAgICAgICAgKgogICAgICAgICAqCiAgICAgICAgICogVGhlICpkaWZmZXJlbmNlKiB0byBgVVJJI3BhdGhgIGlzIHRoZSB1c2Ugb2YgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHNlcGFyYXRvciBhbmQgdGhlIGhhbmRsaW5nCiAgICAgICAgICogb2YgVU5DIHBhdGhzLiBTZWUgdGhlIGJlbG93IHNhbXBsZSBvZiBhIGZpbGUtdXJpIHdpdGggYW4gYXV0aG9yaXR5IChVTkMgcGF0aCkuCiAgICAgICAgICoKICAgICAgICAgKiBgYGB0cwogICAgICAgICAgICBjb25zdCB1ID0gVVJJLnBhcnNlKCdmaWxlOi8vc2VydmVyL2MkL2ZvbGRlci9maWxlLnR4dCcpCiAgICAgICAgICAgIHUuYXV0aG9yaXR5ID09PSAnc2VydmVyJwogICAgICAgICAgICB1LnBhdGggPT09ICcvc2hhcmVzL2MkL2ZpbGUudHh0JwogICAgICAgICAgICB1LmZzUGF0aCA9PT0gJ1xcc2VydmVyXGMkXGZvbGRlclxmaWxlLnR4dCcKICAgICAgICBgYGAKICAgICAgICAgKgogICAgICAgICAqIFVzaW5nIGBVUkkjcGF0aGAgdG8gcmVhZCBhIGZpbGUgKHVzaW5nIGZzLWFwaXMpIHdvdWxkIG5vdCBiZSBlbm91Z2ggYmVjYXVzZSBwYXJ0cyBvZiB0aGUgcGF0aCwKICAgICAgICAgKiBuYW1lbHkgdGhlIHNlcnZlciBuYW1lLCB3b3VsZCBiZSBtaXNzaW5nLiBUaGVyZWZvcmUgYFVSSSNmc1BhdGhgIGV4aXN0cyAtIGl0J3Mgc3VnYXIgdG8gZWFzZSB3b3JraW5nCiAgICAgICAgICogd2l0aCBVUklzIHRoYXQgcmVwcmVzZW50IGZpbGVzIG9uIGRpc2sgKGBmaWxlYCBzY2hlbWUpLgogICAgICAgICAqLwogICAgICAgIGdldCBmc1BhdGgoKSB7CiAgICAgICAgICAgIC8vIGlmICh0aGlzLnNjaGVtZSAhPT0gJ2ZpbGUnKSB7CiAgICAgICAgICAgIC8vIAljb25zb2xlLndhcm4oYFtVcmlFcnJvcl0gY2FsbGluZyBmc1BhdGggd2l0aCBzY2hlbWUgJHt0aGlzLnNjaGVtZX1gKTsKICAgICAgICAgICAgLy8gfQogICAgICAgICAgICByZXR1cm4gdXJpVG9Gc1BhdGgodGhpcywgZmFsc2UpOwogICAgICAgIH0KICAgICAgICAvLyAtLS0tIG1vZGlmeSB0byBuZXcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIHdpdGgoY2hhbmdlKSB7CiAgICAgICAgICAgIGlmICghY2hhbmdlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgeyBzY2hlbWUsIGF1dGhvcml0eSwgcGF0aCwgcXVlcnksIGZyYWdtZW50IH0gPSBjaGFuZ2U7CiAgICAgICAgICAgIGlmIChzY2hlbWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgc2NoZW1lID0gdGhpcy5zY2hlbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1lID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzY2hlbWUgPSBfZW1wdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGF1dGhvcml0eSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBhdXRob3JpdHkgPSB0aGlzLmF1dGhvcml0eTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChhdXRob3JpdHkgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGF1dGhvcml0eSA9IF9lbXB0eTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBwYXRoID0gdGhpcy5wYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHBhdGggPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHBhdGggPSBfZW1wdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHF1ZXJ5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHF1ZXJ5ID0gdGhpcy5xdWVyeTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChxdWVyeSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcXVlcnkgPSBfZW1wdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZyYWdtZW50ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5mcmFnbWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChmcmFnbWVudCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBfZW1wdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNjaGVtZSA9PT0gdGhpcy5zY2hlbWUKICAgICAgICAgICAgICAgICYmIGF1dGhvcml0eSA9PT0gdGhpcy5hdXRob3JpdHkKICAgICAgICAgICAgICAgICYmIHBhdGggPT09IHRoaXMucGF0aAogICAgICAgICAgICAgICAgJiYgcXVlcnkgPT09IHRoaXMucXVlcnkKICAgICAgICAgICAgICAgICYmIGZyYWdtZW50ID09PSB0aGlzLmZyYWdtZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFVyaShzY2hlbWUsIGF1dGhvcml0eSwgcGF0aCwgcXVlcnksIGZyYWdtZW50KTsKICAgICAgICB9CiAgICAgICAgLy8gLS0tLSBwYXJzZSAmIHZhbGlkYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBuZXcgVVJJIGZyb20gYSBzdHJpbmcsIGUuZy4gYGh0dHA6Ly93d3cubXNmdC5jb20vc29tZS9wYXRoYCwKICAgICAgICAgKiBgZmlsZTovLy91c3IvaG9tZWAsIG9yIGBzY2hlbWU6d2l0aC9wYXRoYC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSBBIHN0cmluZyB3aGljaCByZXByZXNlbnRzIGFuIFVSSSAoc2VlIGBVUkkjdG9TdHJpbmdgKS4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgcGFyc2UodmFsdWUsIF9zdHJpY3QgPSBmYWxzZSkgewogICAgICAgICAgICBjb25zdCBtYXRjaCA9IF9yZWdleHAuZXhlYyh2YWx1ZSk7CiAgICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVXJpKF9lbXB0eSwgX2VtcHR5LCBfZW1wdHksIF9lbXB0eSwgX2VtcHR5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFVyaShtYXRjaFsyXSB8fCBfZW1wdHksIHBlcmNlbnREZWNvZGUobWF0Y2hbNF0gfHwgX2VtcHR5KSwgcGVyY2VudERlY29kZShtYXRjaFs1XSB8fCBfZW1wdHkpLCBwZXJjZW50RGVjb2RlKG1hdGNoWzddIHx8IF9lbXB0eSksIHBlcmNlbnREZWNvZGUobWF0Y2hbOV0gfHwgX2VtcHR5KSwgX3N0cmljdCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBuZXcgVVJJIGZyb20gYSBmaWxlIHN5c3RlbSBwYXRoLCBlLmcuIGBjOlxteVxmaWxlc2AsCiAgICAgICAgICogYC91c3IvaG9tZWAsIG9yIGBcXHNlcnZlclxzaGFyZVxzb21lXHBhdGhgLgogICAgICAgICAqCiAgICAgICAgICogVGhlICpkaWZmZXJlbmNlKiBiZXR3ZWVuIGBVUkkjcGFyc2VgIGFuZCBgVVJJI2ZpbGVgIGlzIHRoYXQgdGhlIGxhdHRlciB0cmVhdHMgdGhlIGFyZ3VtZW50CiAgICAgICAgICogYXMgcGF0aCwgbm90IGFzIHN0cmluZ2lmaWVkLXVyaS4gRS5nLiBgVVJJLmZpbGUocGF0aClgIGlzICoqbm90IHRoZSBzYW1lIGFzKioKICAgICAgICAgKiBgVVJJLnBhcnNlKCdmaWxlOi8vJyArIHBhdGgpYCBiZWNhdXNlIHRoZSBwYXRoIG1pZ2h0IGNvbnRhaW4gY2hhcmFjdGVycyB0aGF0IGFyZQogICAgICAgICAqIGludGVycHJldGVkICgjIGFuZCA/KS4gU2VlIHRoZSBmb2xsb3dpbmcgc2FtcGxlOgogICAgICAgICAqIGBgYHRzCiAgICAgICAgY29uc3QgZ29vZCA9IFVSSS5maWxlKCcvY29kaW5nL2MjL3Byb2plY3QxJyk7CiAgICAgICAgZ29vZC5zY2hlbWUgPT09ICdmaWxlJzsKICAgICAgICBnb29kLnBhdGggPT09ICcvY29kaW5nL2MjL3Byb2plY3QxJzsKICAgICAgICBnb29kLmZyYWdtZW50ID09PSAnJzsKICAgICAgICBjb25zdCBiYWQgPSBVUkkucGFyc2UoJ2ZpbGU6Ly8nICsgJy9jb2RpbmcvYyMvcHJvamVjdDEnKTsKICAgICAgICBiYWQuc2NoZW1lID09PSAnZmlsZSc7CiAgICAgICAgYmFkLnBhdGggPT09ICcvY29kaW5nL2MnOyAvLyBwYXRoIGlzIG5vdyBicm9rZW4KICAgICAgICBiYWQuZnJhZ21lbnQgPT09ICcvcHJvamVjdDEnOwogICAgICAgIGBgYAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHBhdGggQSBmaWxlIHN5c3RlbSBwYXRoIChzZWUgYFVSSSNmc1BhdGhgKQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBmaWxlKHBhdGgpIHsKICAgICAgICAgICAgbGV0IGF1dGhvcml0eSA9IF9lbXB0eTsKICAgICAgICAgICAgLy8gbm9ybWFsaXplIHRvIGZ3ZC1zbGFzaGVzIG9uIHdpbmRvd3MsCiAgICAgICAgICAgIC8vIG9uIG90aGVyIHN5c3RlbXMgYndkLXNsYXNoZXMgYXJlIHZhbGlkCiAgICAgICAgICAgIC8vIGZpbGVuYW1lIGNoYXJhY3RlciwgZWcgL2Zcb28vYmFcci50eHQKICAgICAgICAgICAgaWYgKGlzV2luZG93cykgewogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvZywgX3NsYXNoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBjaGVjayBmb3IgYXV0aG9yaXR5IGFzIHVzZWQgaW4gVU5DIHNoYXJlcwogICAgICAgICAgICAvLyBvciB1c2UgdGhlIHBhdGggYXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKHBhdGhbMF0gPT09IF9zbGFzaCAmJiBwYXRoWzFdID09PSBfc2xhc2gpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhdGguaW5kZXhPZihfc2xhc2gsIDIpOwogICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhdXRob3JpdHkgPSBwYXRoLnN1YnN0cmluZygyKTsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gX3NsYXNoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5ID0gcGF0aC5zdWJzdHJpbmcoMiwgaWR4KTsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoaWR4KSB8fCBfc2xhc2g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBVcmkoJ2ZpbGUnLCBhdXRob3JpdHksIHBhdGgsIF9lbXB0eSwgX2VtcHR5KTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZyb20oY29tcG9uZW50cykgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVXJpKGNvbXBvbmVudHMuc2NoZW1lLCBjb21wb25lbnRzLmF1dGhvcml0eSwgY29tcG9uZW50cy5wYXRoLCBjb21wb25lbnRzLnF1ZXJ5LCBjb21wb25lbnRzLmZyYWdtZW50KTsKICAgICAgICAgICAgX3ZhbGlkYXRlVXJpKHJlc3VsdCwgdHJ1ZSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEpvaW4gYSBVUkkgcGF0aCB3aXRoIHBhdGggZnJhZ21lbnRzIGFuZCBub3JtYWxpemVzIHRoZSByZXN1bHRpbmcgcGF0aC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIGlucHV0IFVSSS4KICAgICAgICAgKiBAcGFyYW0gcGF0aEZyYWdtZW50IFRoZSBwYXRoIGZyYWdtZW50IHRvIGFkZCB0byB0aGUgVVJJIHBhdGguCiAgICAgICAgICogQHJldHVybnMgVGhlIHJlc3VsdGluZyBVUkkuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGpvaW5QYXRoKHVyaSwgLi4ucGF0aEZyYWdtZW50KSB7CiAgICAgICAgICAgIGlmICghdXJpLnBhdGgpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW1VyaUVycm9yXTogY2Fubm90IGNhbGwgam9pblBhdGggb24gVVJJIHdpdGhvdXQgcGF0aGApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBuZXdQYXRoOwogICAgICAgICAgICBpZiAoaXNXaW5kb3dzICYmIHVyaS5zY2hlbWUgPT09ICdmaWxlJykgewogICAgICAgICAgICAgICAgbmV3UGF0aCA9IFVSSS5maWxlKHdpbjMyLmpvaW4odXJpVG9Gc1BhdGgodXJpLCB0cnVlKSwgLi4ucGF0aEZyYWdtZW50KSkucGF0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5ld1BhdGggPSBwb3NpeC5qb2luKHVyaS5wYXRoLCAuLi5wYXRoRnJhZ21lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB1cmkud2l0aCh7IHBhdGg6IG5ld1BhdGggfSk7CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0gcHJpbnRpbmcvZXh0ZXJuYWxpemUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBVUkkuIEl0J3MgZ3VhcmFudGVlZCB0aGF0IGNhbGxpbmcKICAgICAgICAgKiBgVVJJLnBhcnNlYCB3aXRoIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuIFVSSSB3aGljaCBpcyBlcXVhbAogICAgICAgICAqIHRvIHRoaXMgVVJJLgogICAgICAgICAqCiAgICAgICAgICogKiBUaGUgcmVzdWx0IHNoYWxsICpub3QqIGJlIHVzZWQgZm9yIGRpc3BsYXkgcHVycG9zZXMgYnV0IGZvciBleHRlcm5hbGl6YXRpb24gb3IgdHJhbnNwb3J0LgogICAgICAgICAqICogVGhlIHJlc3VsdCB3aWxsIGJlIGVuY29kZWQgdXNpbmcgdGhlIHBlcmNlbnRhZ2UgZW5jb2RpbmcgYW5kIGVuY29kaW5nIGhhcHBlbnMgbW9zdGx5CiAgICAgICAgICogaWdub3JlIHRoZSBzY2hlbWUtc3BlY2lmaWMgZW5jb2RpbmcgcnVsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2tpcEVuY29kaW5nIERvIG5vdCBlbmNvZGUgdGhlIHJlc3VsdCwgZGVmYXVsdCBpcyBgZmFsc2VgCiAgICAgICAgICovCiAgICAgICAgdG9TdHJpbmcoc2tpcEVuY29kaW5nID0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIF9hc0Zvcm1hdHRlZCh0aGlzLCBza2lwRW5jb2RpbmcpOwogICAgICAgIH0KICAgICAgICB0b0pTT04oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgcmV2aXZlKGRhdGEpIHsKICAgICAgICAgICAgaWYgKCFkYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgVVJJKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVcmkoZGF0YSk7CiAgICAgICAgICAgICAgICByZXN1bHQuX2Zvcm1hdHRlZCA9IGRhdGEuZXh0ZXJuYWw7CiAgICAgICAgICAgICAgICByZXN1bHQuX2ZzUGF0aCA9IGRhdGEuX3NlcCA9PT0gX3BhdGhTZXBNYXJrZXIgPyBkYXRhLmZzUGF0aCA6IG51bGw7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY29uc3QgX3BhdGhTZXBNYXJrZXIgPSBpc1dpbmRvd3MgPyAxIDogdW5kZWZpbmVkOwogICAgLy8gVGhpcyBjbGFzcyBleGlzdHMgc28gdGhhdCBVUkkgaXMgY29tcGF0aWJsZSB3aXRoIHZzY29kZS5VcmkgKEFQSSkuCiAgICBjbGFzcyBVcmkgZXh0ZW5kcyBVUkkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLl9mb3JtYXR0ZWQgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9mc1BhdGggPSBudWxsOwogICAgICAgIH0KICAgICAgICBnZXQgZnNQYXRoKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2ZzUGF0aCkgewogICAgICAgICAgICAgICAgdGhpcy5fZnNQYXRoID0gdXJpVG9Gc1BhdGgodGhpcywgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mc1BhdGg7CiAgICAgICAgfQogICAgICAgIHRvU3RyaW5nKHNraXBFbmNvZGluZyA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICghc2tpcEVuY29kaW5nKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2Zvcm1hdHRlZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdHRlZCA9IF9hc0Zvcm1hdHRlZCh0aGlzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgY2FjaGUgdGhhdAogICAgICAgICAgICAgICAgcmV0dXJuIF9hc0Zvcm1hdHRlZCh0aGlzLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0b0pTT04oKSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHsKICAgICAgICAgICAgICAgICRtaWQ6IDEgLyogVXJpICovCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8vIGNhY2hlZCBzdGF0ZQogICAgICAgICAgICBpZiAodGhpcy5fZnNQYXRoKSB7CiAgICAgICAgICAgICAgICByZXMuZnNQYXRoID0gdGhpcy5fZnNQYXRoOwogICAgICAgICAgICAgICAgcmVzLl9zZXAgPSBfcGF0aFNlcE1hcmtlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fZm9ybWF0dGVkKSB7CiAgICAgICAgICAgICAgICByZXMuZXh0ZXJuYWwgPSB0aGlzLl9mb3JtYXR0ZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gdXJpIGNvbXBvbmVudHMKICAgICAgICAgICAgaWYgKHRoaXMucGF0aCkgewogICAgICAgICAgICAgICAgcmVzLnBhdGggPSB0aGlzLnBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1lKSB7CiAgICAgICAgICAgICAgICByZXMuc2NoZW1lID0gdGhpcy5zY2hlbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuYXV0aG9yaXR5KSB7CiAgICAgICAgICAgICAgICByZXMuYXV0aG9yaXR5ID0gdGhpcy5hdXRob3JpdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMucXVlcnkpIHsKICAgICAgICAgICAgICAgIHJlcy5xdWVyeSA9IHRoaXMucXVlcnk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuZnJhZ21lbnQpIHsKICAgICAgICAgICAgICAgIHJlcy5mcmFnbWVudCA9IHRoaXMuZnJhZ21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9CiAgICB9CiAgICAvLyByZXNlcnZlZCBjaGFyYWN0ZXJzOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIuMgogICAgY29uc3QgZW5jb2RlVGFibGUgPSB7CiAgICAgICAgWzU4IC8qIENvbG9uICovXTogJyUzQScsCiAgICAgICAgWzQ3IC8qIFNsYXNoICovXTogJyUyRicsCiAgICAgICAgWzYzIC8qIFF1ZXN0aW9uTWFyayAqL106ICclM0YnLAogICAgICAgIFszNSAvKiBIYXNoICovXTogJyUyMycsCiAgICAgICAgWzkxIC8qIE9wZW5TcXVhcmVCcmFja2V0ICovXTogJyU1QicsCiAgICAgICAgWzkzIC8qIENsb3NlU3F1YXJlQnJhY2tldCAqL106ICclNUQnLAogICAgICAgIFs2NCAvKiBBdFNpZ24gKi9dOiAnJTQwJywKICAgICAgICBbMzMgLyogRXhjbGFtYXRpb25NYXJrICovXTogJyUyMScsCiAgICAgICAgWzM2IC8qIERvbGxhclNpZ24gKi9dOiAnJTI0JywKICAgICAgICBbMzggLyogQW1wZXJzYW5kICovXTogJyUyNicsCiAgICAgICAgWzM5IC8qIFNpbmdsZVF1b3RlICovXTogJyUyNycsCiAgICAgICAgWzQwIC8qIE9wZW5QYXJlbiAqL106ICclMjgnLAogICAgICAgIFs0MSAvKiBDbG9zZVBhcmVuICovXTogJyUyOScsCiAgICAgICAgWzQyIC8qIEFzdGVyaXNrICovXTogJyUyQScsCiAgICAgICAgWzQzIC8qIFBsdXMgKi9dOiAnJTJCJywKICAgICAgICBbNDQgLyogQ29tbWEgKi9dOiAnJTJDJywKICAgICAgICBbNTkgLyogU2VtaWNvbG9uICovXTogJyUzQicsCiAgICAgICAgWzYxIC8qIEVxdWFscyAqL106ICclM0QnLAogICAgICAgIFszMiAvKiBTcGFjZSAqL106ICclMjAnLAogICAgfTsKICAgIGZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudEZhc3QodXJpQ29tcG9uZW50LCBhbGxvd1NsYXNoKSB7CiAgICAgICAgbGV0IHJlcyA9IHVuZGVmaW5lZDsKICAgICAgICBsZXQgbmF0aXZlRW5jb2RlUG9zID0gLTE7CiAgICAgICAgZm9yIChsZXQgcG9zID0gMDsgcG9zIDwgdXJpQ29tcG9uZW50Lmxlbmd0aDsgcG9zKyspIHsKICAgICAgICAgICAgY29uc3QgY29kZSA9IHVyaUNvbXBvbmVudC5jaGFyQ29kZUF0KHBvcyk7CiAgICAgICAgICAgIC8vIHVucmVzZXJ2ZWQgY2hhcmFjdGVyczogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0yLjMKICAgICAgICAgICAgaWYgKChjb2RlID49IDk3IC8qIGEgKi8gJiYgY29kZSA8PSAxMjIgLyogeiAqLykKICAgICAgICAgICAgICAgIHx8IChjb2RlID49IDY1IC8qIEEgKi8gJiYgY29kZSA8PSA5MCAvKiBaICovKQogICAgICAgICAgICAgICAgfHwgKGNvZGUgPj0gNDggLyogRGlnaXQwICovICYmIGNvZGUgPD0gNTcgLyogRGlnaXQ5ICovKQogICAgICAgICAgICAgICAgfHwgY29kZSA9PT0gNDUgLyogRGFzaCAqLwogICAgICAgICAgICAgICAgfHwgY29kZSA9PT0gNDYgLyogUGVyaW9kICovCiAgICAgICAgICAgICAgICB8fCBjb2RlID09PSA5NSAvKiBVbmRlcmxpbmUgKi8KICAgICAgICAgICAgICAgIHx8IGNvZGUgPT09IDEyNiAvKiBUaWxkZSAqLwogICAgICAgICAgICAgICAgfHwgKGFsbG93U2xhc2ggJiYgY29kZSA9PT0gNDcgLyogU2xhc2ggKi8pKSB7CiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBhcmUgZGVsYXlpbmcgbmF0aXZlIGVuY29kZQogICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUVuY29kZVBvcyAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICByZXMgKz0gZW5jb2RlVVJJQ29tcG9uZW50KHVyaUNvbXBvbmVudC5zdWJzdHJpbmcobmF0aXZlRW5jb2RlUG9zLCBwb3MpKTsKICAgICAgICAgICAgICAgICAgICBuYXRpdmVFbmNvZGVQb3MgPSAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIHdyaXRlIGludG8gYSBuZXcgc3RyaW5nIChieSBkZWZhdWx0IHdlIHRyeSB0byByZXR1cm4gdGhlIHBhcmFtKQogICAgICAgICAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzICs9IHVyaUNvbXBvbmVudC5jaGFyQXQocG9zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGVuY29kaW5nIG5lZWRlZCwgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBzdHJpbmcKICAgICAgICAgICAgICAgIGlmIChyZXMgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIHJlcyA9IHVyaUNvbXBvbmVudC5zdWJzdHIoMCwgcG9zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdpdGggZGVmYXVsdCB0YWJsZSBmaXJzdAogICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZCA9IGVuY29kZVRhYmxlW2NvZGVdOwogICAgICAgICAgICAgICAgaWYgKGVzY2FwZWQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGFyZSBkZWxheWluZyBuYXRpdmUgZW5jb2RlCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUVuY29kZVBvcyAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IGVuY29kZVVSSUNvbXBvbmVudCh1cmlDb21wb25lbnQuc3Vic3RyaW5nKG5hdGl2ZUVuY29kZVBvcywgcG9zKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUVuY29kZVBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmQgZXNjYXBlZCB2YXJpYW50IHRvIHJlc3VsdAogICAgICAgICAgICAgICAgICAgIHJlcyArPSBlc2NhcGVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobmF0aXZlRW5jb2RlUG9zID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBuYXRpdmUgZW5jb2RlIG9ubHkgd2hlbiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICBuYXRpdmVFbmNvZGVQb3MgPSBwb3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG5hdGl2ZUVuY29kZVBvcyAhPT0gLTEpIHsKICAgICAgICAgICAgcmVzICs9IGVuY29kZVVSSUNvbXBvbmVudCh1cmlDb21wb25lbnQuc3Vic3RyaW5nKG5hdGl2ZUVuY29kZVBvcykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgPyByZXMgOiB1cmlDb21wb25lbnQ7CiAgICB9CiAgICBmdW5jdGlvbiBlbmNvZGVVUklDb21wb25lbnRNaW5pbWFsKHBhdGgpIHsKICAgICAgICBsZXQgcmVzID0gdW5kZWZpbmVkOwogICAgICAgIGZvciAobGV0IHBvcyA9IDA7IHBvcyA8IHBhdGgubGVuZ3RoOyBwb3MrKykgewogICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KHBvcyk7CiAgICAgICAgICAgIGlmIChjb2RlID09PSAzNSAvKiBIYXNoICovIHx8IGNvZGUgPT09IDYzIC8qIFF1ZXN0aW9uTWFyayAqLykgewogICAgICAgICAgICAgICAgaWYgKHJlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzID0gcGF0aC5zdWJzdHIoMCwgcG9zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcyArPSBlbmNvZGVUYWJsZVtjb2RlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyZXMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIHJlcyArPSBwYXRoW3Bvc107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcyAhPT0gdW5kZWZpbmVkID8gcmVzIDogcGF0aDsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZSBgZnNQYXRoYCBmb3IgdGhlIGdpdmVuIHVyaQogICAgICovCiAgICBmdW5jdGlvbiB1cmlUb0ZzUGF0aCh1cmksIGtlZXBEcml2ZUxldHRlckNhc2luZykgewogICAgICAgIGxldCB2YWx1ZTsKICAgICAgICBpZiAodXJpLmF1dGhvcml0eSAmJiB1cmkucGF0aC5sZW5ndGggPiAxICYmIHVyaS5zY2hlbWUgPT09ICdmaWxlJykgewogICAgICAgICAgICAvLyB1bmMgcGF0aDogZmlsZTovL3NoYXJlcy9jJC9mYXIvYm9vCiAgICAgICAgICAgIHZhbHVlID0gYC8vJHt1cmkuYXV0aG9yaXR5fSR7dXJpLnBhdGh9YDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodXJpLnBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyogU2xhc2ggKi8KICAgICAgICAgICAgJiYgKHVyaS5wYXRoLmNoYXJDb2RlQXQoMSkgPj0gNjUgLyogQSAqLyAmJiB1cmkucGF0aC5jaGFyQ29kZUF0KDEpIDw9IDkwIC8qIFogKi8gfHwgdXJpLnBhdGguY2hhckNvZGVBdCgxKSA+PSA5NyAvKiBhICovICYmIHVyaS5wYXRoLmNoYXJDb2RlQXQoMSkgPD0gMTIyIC8qIHogKi8pCiAgICAgICAgICAgICYmIHVyaS5wYXRoLmNoYXJDb2RlQXQoMikgPT09IDU4IC8qIENvbG9uICovKSB7CiAgICAgICAgICAgIGlmICgha2VlcERyaXZlTGV0dGVyQ2FzaW5nKSB7CiAgICAgICAgICAgICAgICAvLyB3aW5kb3dzIGRyaXZlIGxldHRlcjogZmlsZTovLy9jOi9mYXIvYm9vCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHVyaS5wYXRoWzFdLnRvTG93ZXJDYXNlKCkgKyB1cmkucGF0aC5zdWJzdHIoMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHVyaS5wYXRoLnN1YnN0cigxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gb3RoZXIgcGF0aAogICAgICAgICAgICB2YWx1ZSA9IHVyaS5wYXRoOwogICAgICAgIH0KICAgICAgICBpZiAoaXNXaW5kb3dzKSB7CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXC8vZywgJ1xcJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlIHRoZSBleHRlcm5hbCB2ZXJzaW9uIG9mIGEgdXJpCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9hc0Zvcm1hdHRlZCh1cmksIHNraXBFbmNvZGluZykgewogICAgICAgIGNvbnN0IGVuY29kZXIgPSAhc2tpcEVuY29kaW5nCiAgICAgICAgICAgID8gZW5jb2RlVVJJQ29tcG9uZW50RmFzdAogICAgICAgICAgICA6IGVuY29kZVVSSUNvbXBvbmVudE1pbmltYWw7CiAgICAgICAgbGV0IHJlcyA9ICcnOwogICAgICAgIGxldCB7IHNjaGVtZSwgYXV0aG9yaXR5LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQgfSA9IHVyaTsKICAgICAgICBpZiAoc2NoZW1lKSB7CiAgICAgICAgICAgIHJlcyArPSBzY2hlbWU7CiAgICAgICAgICAgIHJlcyArPSAnOic7CiAgICAgICAgfQogICAgICAgIGlmIChhdXRob3JpdHkgfHwgc2NoZW1lID09PSAnZmlsZScpIHsKICAgICAgICAgICAgcmVzICs9IF9zbGFzaDsKICAgICAgICAgICAgcmVzICs9IF9zbGFzaDsKICAgICAgICB9CiAgICAgICAgaWYgKGF1dGhvcml0eSkgewogICAgICAgICAgICBsZXQgaWR4ID0gYXV0aG9yaXR5LmluZGV4T2YoJ0AnKTsKICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIC8vIDx1c2VyPkA8YXV0aD4KICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJpbmZvID0gYXV0aG9yaXR5LnN1YnN0cigwLCBpZHgpOwogICAgICAgICAgICAgICAgYXV0aG9yaXR5ID0gYXV0aG9yaXR5LnN1YnN0cihpZHggKyAxKTsKICAgICAgICAgICAgICAgIGlkeCA9IHVzZXJpbmZvLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzICs9IGVuY29kZXIodXNlcmluZm8sIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIDx1c2VyPjo8cGFzcz5APGF1dGg+CiAgICAgICAgICAgICAgICAgICAgcmVzICs9IGVuY29kZXIodXNlcmluZm8uc3Vic3RyKDAsIGlkeCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICByZXMgKz0gJzonOwogICAgICAgICAgICAgICAgICAgIHJlcyArPSBlbmNvZGVyKHVzZXJpbmZvLnN1YnN0cihpZHggKyAxKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzICs9ICdAJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBhdXRob3JpdHkgPSBhdXRob3JpdHkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWR4ID0gYXV0aG9yaXR5LmluZGV4T2YoJzonKTsKICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIHJlcyArPSBlbmNvZGVyKGF1dGhvcml0eSwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gPGF1dGg+Ojxwb3J0PgogICAgICAgICAgICAgICAgcmVzICs9IGVuY29kZXIoYXV0aG9yaXR5LnN1YnN0cigwLCBpZHgpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICByZXMgKz0gYXV0aG9yaXR5LnN1YnN0cihpZHgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChwYXRoKSB7CiAgICAgICAgICAgIC8vIGxvd2VyLWNhc2Ugd2luZG93cyBkcml2ZSBsZXR0ZXJzIGluIC9DOi9mZmYgb3IgQzovZmZmCiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA+PSAzICYmIHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyogU2xhc2ggKi8gJiYgcGF0aC5jaGFyQ29kZUF0KDIpID09PSA1OCAvKiBDb2xvbiAqLykgewogICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdCgxKTsKICAgICAgICAgICAgICAgIGlmIChjb2RlID49IDY1IC8qIEEgKi8gJiYgY29kZSA8PSA5MCAvKiBaICovKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGAvJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUgKyAzMil9OiR7cGF0aC5zdWJzdHIoMyl9YDsgLy8gIi9jOiIubGVuZ3RoID09PSAzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocGF0aC5sZW5ndGggPj0gMiAmJiBwYXRoLmNoYXJDb2RlQXQoMSkgPT09IDU4IC8qIENvbG9uICovKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KDApOwogICAgICAgICAgICAgICAgaWYgKGNvZGUgPj0gNjUgLyogQSAqLyAmJiBjb2RlIDw9IDkwIC8qIFogKi8pIHsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZShjb2RlICsgMzIpfToke3BhdGguc3Vic3RyKDIpfWA7IC8vICIvYzoiLmxlbmd0aCA9PT0gMwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGVuY29kZSB0aGUgcmVzdCBvZiB0aGUgcGF0aAogICAgICAgICAgICByZXMgKz0gZW5jb2RlcihwYXRoLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHF1ZXJ5KSB7CiAgICAgICAgICAgIHJlcyArPSAnPyc7CiAgICAgICAgICAgIHJlcyArPSBlbmNvZGVyKHF1ZXJ5LCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIGlmIChmcmFnbWVudCkgewogICAgICAgICAgICByZXMgKz0gJyMnOwogICAgICAgICAgICByZXMgKz0gIXNraXBFbmNvZGluZyA/IGVuY29kZVVSSUNvbXBvbmVudEZhc3QoZnJhZ21lbnQsIGZhbHNlKSA6IGZyYWdtZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgfQogICAgLy8gLS0tIGRlY29kZQogICAgZnVuY3Rpb24gZGVjb2RlVVJJQ29tcG9uZW50R3JhY2VmdWwoc3RyKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoX2EpIHsKICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGggPiAzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnN1YnN0cigwLCAzKSArIGRlY29kZVVSSUNvbXBvbmVudEdyYWNlZnVsKHN0ci5zdWJzdHIoMykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IF9yRW5jb2RlZEFzSGV4ID0gLyglWzAtOUEtWmEtel1bMC05QS1aYS16XSkrL2c7CiAgICBmdW5jdGlvbiBwZXJjZW50RGVjb2RlKHN0cikgewogICAgICAgIGlmICghc3RyLm1hdGNoKF9yRW5jb2RlZEFzSGV4KSkgewogICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoX3JFbmNvZGVkQXNIZXgsIChtYXRjaCkgPT4gZGVjb2RlVVJJQ29tcG9uZW50R3JhY2VmdWwobWF0Y2gpKTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIC8qKgogICAgICogQSBwb3NpdGlvbiBpbiB0aGUgZWRpdG9yLgogICAgICovCiAgICBjbGFzcyBQb3NpdGlvbiB7CiAgICAgICAgY29uc3RydWN0b3IobGluZU51bWJlciwgY29sdW1uKSB7CiAgICAgICAgICAgIHRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7CiAgICAgICAgICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBuZXcgcG9zaXRpb24gZnJvbSB0aGlzIHBvc2l0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5ld0xpbmVOdW1iZXIgbmV3IGxpbmUgbnVtYmVyCiAgICAgICAgICogQHBhcmFtIG5ld0NvbHVtbiBuZXcgY29sdW1uCiAgICAgICAgICovCiAgICAgICAgd2l0aChuZXdMaW5lTnVtYmVyID0gdGhpcy5saW5lTnVtYmVyLCBuZXdDb2x1bW4gPSB0aGlzLmNvbHVtbikgewogICAgICAgICAgICBpZiAobmV3TGluZU51bWJlciA9PT0gdGhpcy5saW5lTnVtYmVyICYmIG5ld0NvbHVtbiA9PT0gdGhpcy5jb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbihuZXdMaW5lTnVtYmVyLCBuZXdDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERlcml2ZSBhIG5ldyBwb3NpdGlvbiBmcm9tIHRoaXMgcG9zaXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGVsdGFMaW5lTnVtYmVyIGxpbmUgbnVtYmVyIGRlbHRhCiAgICAgICAgICogQHBhcmFtIGRlbHRhQ29sdW1uIGNvbHVtbiBkZWx0YQogICAgICAgICAqLwogICAgICAgIGRlbHRhKGRlbHRhTGluZU51bWJlciA9IDAsIGRlbHRhQ29sdW1uID0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53aXRoKHRoaXMubGluZU51bWJlciArIGRlbHRhTGluZU51bWJlciwgdGhpcy5jb2x1bW4gKyBkZWx0YUNvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgdGhpcyBwb3NpdGlvbiBlcXVhbHMgb3RoZXIgcG9zaXRpb24KICAgICAgICAgKi8KICAgICAgICBlcXVhbHMob3RoZXIpIHsKICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmVxdWFscyh0aGlzLCBvdGhlcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgcG9zaXRpb24gYGFgIGVxdWFscyBwb3NpdGlvbiBgYmAKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZXF1YWxzKGEsIGIpIHsKICAgICAgICAgICAgaWYgKCFhICYmICFiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKCEhYSAmJgogICAgICAgICAgICAgICAgISFiICYmCiAgICAgICAgICAgICAgICBhLmxpbmVOdW1iZXIgPT09IGIubGluZU51bWJlciAmJgogICAgICAgICAgICAgICAgYS5jb2x1bW4gPT09IGIuY29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiB0aGlzIHBvc2l0aW9uIGlzIGJlZm9yZSBvdGhlciBwb3NpdGlvbi4KICAgICAgICAgKiBJZiB0aGUgdHdvIHBvc2l0aW9ucyBhcmUgZXF1YWwsIHRoZSByZXN1bHQgd2lsbCBiZSBmYWxzZS4KICAgICAgICAgKi8KICAgICAgICBpc0JlZm9yZShvdGhlcikgewogICAgICAgICAgICByZXR1cm4gUG9zaXRpb24uaXNCZWZvcmUodGhpcywgb3RoZXIpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIHBvc2l0aW9uIGBhYCBpcyBiZWZvcmUgcG9zaXRpb24gYGJgLgogICAgICAgICAqIElmIHRoZSB0d28gcG9zaXRpb25zIGFyZSBlcXVhbCwgdGhlIHJlc3VsdCB3aWxsIGJlIGZhbHNlLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBpc0JlZm9yZShhLCBiKSB7CiAgICAgICAgICAgIGlmIChhLmxpbmVOdW1iZXIgPCBiLmxpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiLmxpbmVOdW1iZXIgPCBhLmxpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYS5jb2x1bW4gPCBiLmNvbHVtbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiB0aGlzIHBvc2l0aW9uIGlzIGJlZm9yZSBvdGhlciBwb3NpdGlvbi4KICAgICAgICAgKiBJZiB0aGUgdHdvIHBvc2l0aW9ucyBhcmUgZXF1YWwsIHRoZSByZXN1bHQgd2lsbCBiZSB0cnVlLgogICAgICAgICAqLwogICAgICAgIGlzQmVmb3JlT3JFcXVhbChvdGhlcikgewogICAgICAgICAgICByZXR1cm4gUG9zaXRpb24uaXNCZWZvcmVPckVxdWFsKHRoaXMsIG90aGVyKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiBwb3NpdGlvbiBgYWAgaXMgYmVmb3JlIHBvc2l0aW9uIGBiYC4KICAgICAgICAgKiBJZiB0aGUgdHdvIHBvc2l0aW9ucyBhcmUgZXF1YWwsIHRoZSByZXN1bHQgd2lsbCBiZSB0cnVlLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBpc0JlZm9yZU9yRXF1YWwoYSwgYikgewogICAgICAgICAgICBpZiAoYS5saW5lTnVtYmVyIDwgYi5saW5lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYi5saW5lTnVtYmVyIDwgYS5saW5lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGEuY29sdW1uIDw9IGIuY29sdW1uOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgcG9zaXRpb25zLCB1c2VmdWwgZm9yIHNvcnRpbmcKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY29tcGFyZShhLCBiKSB7CiAgICAgICAgICAgIGxldCBhTGluZU51bWJlciA9IGEubGluZU51bWJlciB8IDA7CiAgICAgICAgICAgIGxldCBiTGluZU51bWJlciA9IGIubGluZU51bWJlciB8IDA7CiAgICAgICAgICAgIGlmIChhTGluZU51bWJlciA9PT0gYkxpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIGxldCBhQ29sdW1uID0gYS5jb2x1bW4gfCAwOwogICAgICAgICAgICAgICAgbGV0IGJDb2x1bW4gPSBiLmNvbHVtbiB8IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gYUNvbHVtbiAtIGJDb2x1bW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFMaW5lTnVtYmVyIC0gYkxpbmVOdW1iZXI7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsb25lIHRoaXMgcG9zaXRpb24uCiAgICAgICAgICovCiAgICAgICAgY2xvbmUoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24odGhpcy5saW5lTnVtYmVyLCB0aGlzLmNvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnQgdG8gYSBodW1hbi1yZWFkYWJsZSByZXByZXNlbnRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICB0b1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuICcoJyArIHRoaXMubGluZU51bWJlciArICcsJyArIHRoaXMuY29sdW1uICsgJyknOwogICAgICAgIH0KICAgICAgICAvLyAtLS0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBgUG9zaXRpb25gIGZyb20gYW4gYElQb3NpdGlvbmAuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGxpZnQocG9zKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24ocG9zLmxpbmVOdW1iZXIsIHBvcy5jb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIGBvYmpgIGlzIGFuIGBJUG9zaXRpb25gLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBpc0lQb3NpdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIChvYmoKICAgICAgICAgICAgICAgICYmICh0eXBlb2Ygb2JqLmxpbmVOdW1iZXIgPT09ICdudW1iZXInKQogICAgICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmouY29sdW1uID09PSAnbnVtYmVyJykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIC8qKgogICAgICogQSByYW5nZSBpbiB0aGUgZWRpdG9yLiAoc3RhcnRMaW5lTnVtYmVyLHN0YXJ0Q29sdW1uKSBpcyA8PSAoZW5kTGluZU51bWJlcixlbmRDb2x1bW4pCiAgICAgKi8KICAgIGNsYXNzIFJhbmdlIHsKICAgICAgICBjb25zdHJ1Y3RvcihzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyLCBlbmRDb2x1bW4pIHsKICAgICAgICAgICAgaWYgKChzdGFydExpbmVOdW1iZXIgPiBlbmRMaW5lTnVtYmVyKSB8fCAoc3RhcnRMaW5lTnVtYmVyID09PSBlbmRMaW5lTnVtYmVyICYmIHN0YXJ0Q29sdW1uID4gZW5kQ29sdW1uKSkgewogICAgICAgICAgICAgICAgdGhpcy5zdGFydExpbmVOdW1iZXIgPSBlbmRMaW5lTnVtYmVyOwogICAgICAgICAgICAgICAgdGhpcy5zdGFydENvbHVtbiA9IGVuZENvbHVtbjsKICAgICAgICAgICAgICAgIHRoaXMuZW5kTGluZU51bWJlciA9IHN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgICAgIHRoaXMuZW5kQ29sdW1uID0gc3RhcnRDb2x1bW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0TGluZU51bWJlciA9IHN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRDb2x1bW4gPSBzdGFydENvbHVtbjsKICAgICAgICAgICAgICAgIHRoaXMuZW5kTGluZU51bWJlciA9IGVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICB0aGlzLmVuZENvbHVtbiA9IGVuZENvbHVtbjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIHRoaXMgcmFuZ2UgaXMgZW1wdHkuCiAgICAgICAgICovCiAgICAgICAgaXNFbXB0eSgpIHsKICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmlzRW1wdHkodGhpcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgYHJhbmdlYCBpcyBlbXB0eS4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgaXNFbXB0eShyYW5nZSkgewogICAgICAgICAgICByZXR1cm4gKHJhbmdlLnN0YXJ0TGluZU51bWJlciA9PT0gcmFuZ2UuZW5kTGluZU51bWJlciAmJiByYW5nZS5zdGFydENvbHVtbiA9PT0gcmFuZ2UuZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiBwb3NpdGlvbiBpcyBpbiB0aGlzIHJhbmdlLiBJZiB0aGUgcG9zaXRpb24gaXMgYXQgdGhlIGVkZ2VzLCB3aWxsIHJldHVybiB0cnVlLgogICAgICAgICAqLwogICAgICAgIGNvbnRhaW5zUG9zaXRpb24ocG9zaXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmNvbnRhaW5zUG9zaXRpb24odGhpcywgcG9zaXRpb24pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIGBwb3NpdGlvbmAgaXMgaW4gYHJhbmdlYC4gSWYgdGhlIHBvc2l0aW9uIGlzIGF0IHRoZSBlZGdlcywgd2lsbCByZXR1cm4gdHJ1ZS4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY29udGFpbnNQb3NpdGlvbihyYW5nZSwgcG9zaXRpb24pIHsKICAgICAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmVOdW1iZXIgPCByYW5nZS5zdGFydExpbmVOdW1iZXIgfHwgcG9zaXRpb24ubGluZU51bWJlciA+IHJhbmdlLmVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocG9zaXRpb24ubGluZU51bWJlciA9PT0gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyICYmIHBvc2l0aW9uLmNvbHVtbiA8IHJhbmdlLnN0YXJ0Q29sdW1uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmVOdW1iZXIgPT09IHJhbmdlLmVuZExpbmVOdW1iZXIgJiYgcG9zaXRpb24uY29sdW1uID4gcmFuZ2UuZW5kQ29sdW1uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgYHBvc2l0aW9uYCBpcyBpbiBgcmFuZ2VgLiBJZiB0aGUgcG9zaXRpb24gaXMgYXQgdGhlIGVkZ2VzLCB3aWxsIHJldHVybiBmYWxzZS4KICAgICAgICAgKiBAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgc3RyaWN0Q29udGFpbnNQb3NpdGlvbihyYW5nZSwgcG9zaXRpb24pIHsKICAgICAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmVOdW1iZXIgPCByYW5nZS5zdGFydExpbmVOdW1iZXIgfHwgcG9zaXRpb24ubGluZU51bWJlciA+IHJhbmdlLmVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocG9zaXRpb24ubGluZU51bWJlciA9PT0gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyICYmIHBvc2l0aW9uLmNvbHVtbiA8PSByYW5nZS5zdGFydENvbHVtbikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwb3NpdGlvbi5saW5lTnVtYmVyID09PSByYW5nZS5lbmRMaW5lTnVtYmVyICYmIHBvc2l0aW9uLmNvbHVtbiA+PSByYW5nZS5lbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiByYW5nZSBpcyBpbiB0aGlzIHJhbmdlLiBJZiB0aGUgcmFuZ2UgaXMgZXF1YWwgdG8gdGhpcyByYW5nZSwgd2lsbCByZXR1cm4gdHJ1ZS4KICAgICAgICAgKi8KICAgICAgICBjb250YWluc1JhbmdlKHJhbmdlKSB7CiAgICAgICAgICAgIHJldHVybiBSYW5nZS5jb250YWluc1JhbmdlKHRoaXMsIHJhbmdlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiBgb3RoZXJSYW5nZWAgaXMgaW4gYHJhbmdlYC4gSWYgdGhlIHJhbmdlcyBhcmUgZXF1YWwsIHdpbGwgcmV0dXJuIHRydWUuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGNvbnRhaW5zUmFuZ2UocmFuZ2UsIG90aGVyUmFuZ2UpIHsKICAgICAgICAgICAgaWYgKG90aGVyUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIDwgcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIHx8IG90aGVyUmFuZ2UuZW5kTGluZU51bWJlciA8IHJhbmdlLnN0YXJ0TGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvdGhlclJhbmdlLnN0YXJ0TGluZU51bWJlciA+IHJhbmdlLmVuZExpbmVOdW1iZXIgfHwgb3RoZXJSYW5nZS5lbmRMaW5lTnVtYmVyID4gcmFuZ2UuZW5kTGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvdGhlclJhbmdlLnN0YXJ0TGluZU51bWJlciA9PT0gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyICYmIG90aGVyUmFuZ2Uuc3RhcnRDb2x1bW4gPCByYW5nZS5zdGFydENvbHVtbikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvdGhlclJhbmdlLmVuZExpbmVOdW1iZXIgPT09IHJhbmdlLmVuZExpbmVOdW1iZXIgJiYgb3RoZXJSYW5nZS5lbmRDb2x1bW4gPiByYW5nZS5lbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiBgcmFuZ2VgIGlzIHN0cmljdGx5IGluIHRoaXMgcmFuZ2UuIGByYW5nZWAgbXVzdCBzdGFydCBhZnRlciBhbmQgZW5kIGJlZm9yZSB0aGlzIHJhbmdlIGZvciB0aGUgcmVzdWx0IHRvIGJlIHRydWUuCiAgICAgICAgICovCiAgICAgICAgc3RyaWN0Q29udGFpbnNSYW5nZShyYW5nZSkgewogICAgICAgICAgICByZXR1cm4gUmFuZ2Uuc3RyaWN0Q29udGFpbnNSYW5nZSh0aGlzLCByYW5nZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgYG90aGVyUmFuZ2VgIGlzIHN0cmljdGx5IGluIGByYW5nZWAgKG11c3Qgc3RhcnQgYWZ0ZXIsIGFuZCBlbmQgYmVmb3JlKS4gSWYgdGhlIHJhbmdlcyBhcmUgZXF1YWwsIHdpbGwgcmV0dXJuIGZhbHNlLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBzdHJpY3RDb250YWluc1JhbmdlKHJhbmdlLCBvdGhlclJhbmdlKSB7CiAgICAgICAgICAgIGlmIChvdGhlclJhbmdlLnN0YXJ0TGluZU51bWJlciA8IHJhbmdlLnN0YXJ0TGluZU51bWJlciB8fCBvdGhlclJhbmdlLmVuZExpbmVOdW1iZXIgPCByYW5nZS5zdGFydExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3RoZXJSYW5nZS5zdGFydExpbmVOdW1iZXIgPiByYW5nZS5lbmRMaW5lTnVtYmVyIHx8IG90aGVyUmFuZ2UuZW5kTGluZU51bWJlciA+IHJhbmdlLmVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3RoZXJSYW5nZS5zdGFydExpbmVOdW1iZXIgPT09IHJhbmdlLnN0YXJ0TGluZU51bWJlciAmJiBvdGhlclJhbmdlLnN0YXJ0Q29sdW1uIDw9IHJhbmdlLnN0YXJ0Q29sdW1uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG90aGVyUmFuZ2UuZW5kTGluZU51bWJlciA9PT0gcmFuZ2UuZW5kTGluZU51bWJlciAmJiBvdGhlclJhbmdlLmVuZENvbHVtbiA+PSByYW5nZS5lbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSByZXVuaW9uIG9mIHRoZSB0d28gcmFuZ2VzLgogICAgICAgICAqIFRoZSBzbWFsbGVzdCBwb3NpdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhlIHN0YXJ0IHBvaW50LCBhbmQgdGhlIGxhcmdlc3Qgb25lIGFzIHRoZSBlbmQgcG9pbnQuCiAgICAgICAgICovCiAgICAgICAgcGx1c1JhbmdlKHJhbmdlKSB7CiAgICAgICAgICAgIHJldHVybiBSYW5nZS5wbHVzUmFuZ2UodGhpcywgcmFuZ2UpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBIHJldW5pb24gb2YgdGhlIHR3byByYW5nZXMuCiAgICAgICAgICogVGhlIHNtYWxsZXN0IHBvc2l0aW9uIHdpbGwgYmUgdXNlZCBhcyB0aGUgc3RhcnQgcG9pbnQsIGFuZCB0aGUgbGFyZ2VzdCBvbmUgYXMgdGhlIGVuZCBwb2ludC4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgcGx1c1JhbmdlKGEsIGIpIHsKICAgICAgICAgICAgbGV0IHN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgbGV0IHN0YXJ0Q29sdW1uOwogICAgICAgICAgICBsZXQgZW5kTGluZU51bWJlcjsKICAgICAgICAgICAgbGV0IGVuZENvbHVtbjsKICAgICAgICAgICAgaWYgKGIuc3RhcnRMaW5lTnVtYmVyIDwgYS5zdGFydExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlciA9IGIuc3RhcnRMaW5lTnVtYmVyOwogICAgICAgICAgICAgICAgc3RhcnRDb2x1bW4gPSBiLnN0YXJ0Q29sdW1uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGIuc3RhcnRMaW5lTnVtYmVyID09PSBhLnN0YXJ0TGluZU51bWJlcikgewogICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyID0gYi5zdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICBzdGFydENvbHVtbiA9IE1hdGgubWluKGIuc3RhcnRDb2x1bW4sIGEuc3RhcnRDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyID0gYS5zdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICBzdGFydENvbHVtbiA9IGEuc3RhcnRDb2x1bW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGIuZW5kTGluZU51bWJlciA+IGEuZW5kTGluZU51bWJlcikgewogICAgICAgICAgICAgICAgZW5kTGluZU51bWJlciA9IGIuZW5kTGluZU51bWJlcjsKICAgICAgICAgICAgICAgIGVuZENvbHVtbiA9IGIuZW5kQ29sdW1uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGIuZW5kTGluZU51bWJlciA9PT0gYS5lbmRMaW5lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyID0gYi5lbmRMaW5lTnVtYmVyOwogICAgICAgICAgICAgICAgZW5kQ29sdW1uID0gTWF0aC5tYXgoYi5lbmRDb2x1bW4sIGEuZW5kQ29sdW1uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVuZExpbmVOdW1iZXIgPSBhLmVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICBlbmRDb2x1bW4gPSBhLmVuZENvbHVtbjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0TGluZU51bWJlciwgc3RhcnRDb2x1bW4sIGVuZExpbmVOdW1iZXIsIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEEgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gcmFuZ2VzLgogICAgICAgICAqLwogICAgICAgIGludGVyc2VjdFJhbmdlcyhyYW5nZSkgewogICAgICAgICAgICByZXR1cm4gUmFuZ2UuaW50ZXJzZWN0UmFuZ2VzKHRoaXMsIHJhbmdlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byByYW5nZXMuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGludGVyc2VjdFJhbmdlcyhhLCBiKSB7CiAgICAgICAgICAgIGxldCByZXN1bHRTdGFydExpbmVOdW1iZXIgPSBhLnN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgbGV0IHJlc3VsdFN0YXJ0Q29sdW1uID0gYS5zdGFydENvbHVtbjsKICAgICAgICAgICAgbGV0IHJlc3VsdEVuZExpbmVOdW1iZXIgPSBhLmVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCByZXN1bHRFbmRDb2x1bW4gPSBhLmVuZENvbHVtbjsKICAgICAgICAgICAgbGV0IG90aGVyU3RhcnRMaW5lTnVtYmVyID0gYi5zdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCBvdGhlclN0YXJ0Q29sdW1uID0gYi5zdGFydENvbHVtbjsKICAgICAgICAgICAgbGV0IG90aGVyRW5kTGluZU51bWJlciA9IGIuZW5kTGluZU51bWJlcjsKICAgICAgICAgICAgbGV0IG90aGVyRW5kQ29sdW1uID0gYi5lbmRDb2x1bW47CiAgICAgICAgICAgIGlmIChyZXN1bHRTdGFydExpbmVOdW1iZXIgPCBvdGhlclN0YXJ0TGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmVzdWx0U3RhcnRMaW5lTnVtYmVyID0gb3RoZXJTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICByZXN1bHRTdGFydENvbHVtbiA9IG90aGVyU3RhcnRDb2x1bW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0U3RhcnRMaW5lTnVtYmVyID09PSBvdGhlclN0YXJ0TGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmVzdWx0U3RhcnRDb2x1bW4gPSBNYXRoLm1heChyZXN1bHRTdGFydENvbHVtbiwgb3RoZXJTdGFydENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlc3VsdEVuZExpbmVOdW1iZXIgPiBvdGhlckVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJlc3VsdEVuZExpbmVOdW1iZXIgPSBvdGhlckVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICByZXN1bHRFbmRDb2x1bW4gPSBvdGhlckVuZENvbHVtbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChyZXN1bHRFbmRMaW5lTnVtYmVyID09PSBvdGhlckVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJlc3VsdEVuZENvbHVtbiA9IE1hdGgubWluKHJlc3VsdEVuZENvbHVtbiwgb3RoZXJFbmRDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENoZWNrIGlmIHNlbGVjdGlvbiBpcyBub3cgZW1wdHkKICAgICAgICAgICAgaWYgKHJlc3VsdFN0YXJ0TGluZU51bWJlciA+IHJlc3VsdEVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZXN1bHRTdGFydExpbmVOdW1iZXIgPT09IHJlc3VsdEVuZExpbmVOdW1iZXIgJiYgcmVzdWx0U3RhcnRDb2x1bW4gPiByZXN1bHRFbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UocmVzdWx0U3RhcnRMaW5lTnVtYmVyLCByZXN1bHRTdGFydENvbHVtbiwgcmVzdWx0RW5kTGluZU51bWJlciwgcmVzdWx0RW5kQ29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiB0aGlzIHJhbmdlIGVxdWFscyBvdGhlci4KICAgICAgICAgKi8KICAgICAgICBlcXVhbHNSYW5nZShvdGhlcikgewogICAgICAgICAgICByZXR1cm4gUmFuZ2UuZXF1YWxzUmFuZ2UodGhpcywgb3RoZXIpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIHJhbmdlIGBhYCBlcXVhbHMgYGJgLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBlcXVhbHNSYW5nZShhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiAoISFhICYmCiAgICAgICAgICAgICAgICAhIWIgJiYKICAgICAgICAgICAgICAgIGEuc3RhcnRMaW5lTnVtYmVyID09PSBiLnN0YXJ0TGluZU51bWJlciAmJgogICAgICAgICAgICAgICAgYS5zdGFydENvbHVtbiA9PT0gYi5zdGFydENvbHVtbiAmJgogICAgICAgICAgICAgICAgYS5lbmRMaW5lTnVtYmVyID09PSBiLmVuZExpbmVOdW1iZXIgJiYKICAgICAgICAgICAgICAgIGEuZW5kQ29sdW1uID09PSBiLmVuZENvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiB0aGUgZW5kIHBvc2l0aW9uICh3aGljaCB3aWxsIGJlIGFmdGVyIG9yIGVxdWFsIHRvIHRoZSBzdGFydCBwb3NpdGlvbikKICAgICAgICAgKi8KICAgICAgICBnZXRFbmRQb3NpdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmdldEVuZFBvc2l0aW9uKHRoaXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiAod2hpY2ggd2lsbCBiZSBhZnRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQgcG9zaXRpb24pCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGdldEVuZFBvc2l0aW9uKHJhbmdlKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24ocmFuZ2UuZW5kTGluZU51bWJlciwgcmFuZ2UuZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiAod2hpY2ggd2lsbCBiZSBiZWZvcmUgb3IgZXF1YWwgdG8gdGhlIGVuZCBwb3NpdGlvbikKICAgICAgICAgKi8KICAgICAgICBnZXRTdGFydFBvc2l0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gUmFuZ2UuZ2V0U3RhcnRQb3NpdGlvbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiAod2hpY2ggd2lsbCBiZSBiZWZvcmUgb3IgZXF1YWwgdG8gdGhlIGVuZCBwb3NpdGlvbikKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZ2V0U3RhcnRQb3NpdGlvbihyYW5nZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2Uuc3RhcnRDb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUcmFuc2Zvcm0gdG8gYSB1c2VyIHByZXNlbnRhYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICB0b1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuICdbJyArIHRoaXMuc3RhcnRMaW5lTnVtYmVyICsgJywnICsgdGhpcy5zdGFydENvbHVtbiArICcgLT4gJyArIHRoaXMuZW5kTGluZU51bWJlciArICcsJyArIHRoaXMuZW5kQ29sdW1uICsgJ10nOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBuZXcgcmFuZ2UgdXNpbmcgdGhpcyByYW5nZSdzIHN0YXJ0IHBvc2l0aW9uLCBhbmQgdXNpbmcgZW5kTGluZU51bWJlciBhbmQgZW5kQ29sdW1uIGFzIHRoZSBlbmQgcG9zaXRpb24uCiAgICAgICAgICovCiAgICAgICAgc2V0RW5kUG9zaXRpb24oZW5kTGluZU51bWJlciwgZW5kQ29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy5zdGFydExpbmVOdW1iZXIsIHRoaXMuc3RhcnRDb2x1bW4sIGVuZExpbmVOdW1iZXIsIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZSBhIG5ldyByYW5nZSB1c2luZyB0aGlzIHJhbmdlJ3MgZW5kIHBvc2l0aW9uLCBhbmQgdXNpbmcgc3RhcnRMaW5lTnVtYmVyIGFuZCBzdGFydENvbHVtbiBhcyB0aGUgc3RhcnQgcG9zaXRpb24uCiAgICAgICAgICovCiAgICAgICAgc2V0U3RhcnRQb3NpdGlvbihzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRMaW5lTnVtYmVyLCBzdGFydENvbHVtbiwgdGhpcy5lbmRMaW5lTnVtYmVyLCB0aGlzLmVuZENvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbXB0eSByYW5nZSB1c2luZyB0aGlzIHJhbmdlJ3Mgc3RhcnQgcG9zaXRpb24uCiAgICAgICAgICovCiAgICAgICAgY29sbGFwc2VUb1N0YXJ0KCkgewogICAgICAgICAgICByZXR1cm4gUmFuZ2UuY29sbGFwc2VUb1N0YXJ0KHRoaXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW1wdHkgcmFuZ2UgdXNpbmcgdGhpcyByYW5nZSdzIHN0YXJ0IHBvc2l0aW9uLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjb2xsYXBzZVRvU3RhcnQocmFuZ2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZS5zdGFydExpbmVOdW1iZXIsIHJhbmdlLnN0YXJ0Q29sdW1uLCByYW5nZS5zdGFydExpbmVOdW1iZXIsIHJhbmdlLnN0YXJ0Q29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLy8gLS0tCiAgICAgICAgc3RhdGljIGZyb21Qb3NpdGlvbnMoc3RhcnQsIGVuZCA9IHN0YXJ0KSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnQubGluZU51bWJlciwgc3RhcnQuY29sdW1uLCBlbmQubGluZU51bWJlciwgZW5kLmNvbHVtbik7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBsaWZ0KHJhbmdlKSB7CiAgICAgICAgICAgIGlmICghcmFuZ2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLCByYW5nZS5zdGFydENvbHVtbiwgcmFuZ2UuZW5kTGluZU51bWJlciwgcmFuZ2UuZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiBgb2JqYCBpcyBhbiBgSVJhbmdlYC4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgaXNJUmFuZ2Uob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAob2JqCiAgICAgICAgICAgICAgICAmJiAodHlwZW9mIG9iai5zdGFydExpbmVOdW1iZXIgPT09ICdudW1iZXInKQogICAgICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmouc3RhcnRDb2x1bW4gPT09ICdudW1iZXInKQogICAgICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmouZW5kTGluZU51bWJlciA9PT0gJ251bWJlcicpCiAgICAgICAgICAgICAgICAmJiAodHlwZW9mIG9iai5lbmRDb2x1bW4gPT09ICdudW1iZXInKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgdGhlIHR3byByYW5nZXMgYXJlIHRvdWNoaW5nIGluIGFueSB3YXkuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGFyZUludGVyc2VjdGluZ09yVG91Y2hpbmcoYSwgYikgewogICAgICAgICAgICAvLyBDaGVjayBpZiBgYWAgaXMgYmVmb3JlIGBiYAogICAgICAgICAgICBpZiAoYS5lbmRMaW5lTnVtYmVyIDwgYi5zdGFydExpbmVOdW1iZXIgfHwgKGEuZW5kTGluZU51bWJlciA9PT0gYi5zdGFydExpbmVOdW1iZXIgJiYgYS5lbmRDb2x1bW4gPCBiLnN0YXJ0Q29sdW1uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENoZWNrIGlmIGBiYCBpcyBiZWZvcmUgYGFgCiAgICAgICAgICAgIGlmIChiLmVuZExpbmVOdW1iZXIgPCBhLnN0YXJ0TGluZU51bWJlciB8fCAoYi5lbmRMaW5lTnVtYmVyID09PSBhLnN0YXJ0TGluZU51bWJlciAmJiBiLmVuZENvbHVtbiA8IGEuc3RhcnRDb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlc2UgcmFuZ2VzIG11c3QgaW50ZXJzZWN0CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIHRoZSB0d28gcmFuZ2VzIGFyZSBpbnRlcnNlY3RpbmcuIElmIHRoZSByYW5nZXMgYXJlIHRvdWNoaW5nIGl0IHJldHVybnMgdHJ1ZS4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgYXJlSW50ZXJzZWN0aW5nKGEsIGIpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYGFgIGlzIGJlZm9yZSBgYmAKICAgICAgICAgICAgaWYgKGEuZW5kTGluZU51bWJlciA8IGIuc3RhcnRMaW5lTnVtYmVyIHx8IChhLmVuZExpbmVOdW1iZXIgPT09IGIuc3RhcnRMaW5lTnVtYmVyICYmIGEuZW5kQ29sdW1uIDw9IGIuc3RhcnRDb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYGJgIGlzIGJlZm9yZSBgYWAKICAgICAgICAgICAgaWYgKGIuZW5kTGluZU51bWJlciA8IGEuc3RhcnRMaW5lTnVtYmVyIHx8IChiLmVuZExpbmVOdW1iZXIgPT09IGEuc3RhcnRMaW5lTnVtYmVyICYmIGIuZW5kQ29sdW1uIDw9IGEuc3RhcnRDb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlc2UgcmFuZ2VzIG11c3QgaW50ZXJzZWN0CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgcmFuZ2VzLCB1c2VmdWwgZm9yIHNvcnRpbmcgcmFuZ2VzCiAgICAgICAgICogSXQgd2lsbCBmaXJzdCBjb21wYXJlIHJhbmdlcyBvbiB0aGUgc3RhcnRQb3NpdGlvbiBhbmQgdGhlbiBvbiB0aGUgZW5kUG9zaXRpb24KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY29tcGFyZVJhbmdlc1VzaW5nU3RhcnRzKGEsIGIpIHsKICAgICAgICAgICAgaWYgKGEgJiYgYikgewogICAgICAgICAgICAgICAgY29uc3QgYVN0YXJ0TGluZU51bWJlciA9IGEuc3RhcnRMaW5lTnVtYmVyIHwgMDsKICAgICAgICAgICAgICAgIGNvbnN0IGJTdGFydExpbmVOdW1iZXIgPSBiLnN0YXJ0TGluZU51bWJlciB8IDA7CiAgICAgICAgICAgICAgICBpZiAoYVN0YXJ0TGluZU51bWJlciA9PT0gYlN0YXJ0TGluZU51bWJlcikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTdGFydENvbHVtbiA9IGEuc3RhcnRDb2x1bW4gfCAwOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGJTdGFydENvbHVtbiA9IGIuc3RhcnRDb2x1bW4gfCAwOwogICAgICAgICAgICAgICAgICAgIGlmIChhU3RhcnRDb2x1bW4gPT09IGJTdGFydENvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhRW5kTGluZU51bWJlciA9IGEuZW5kTGluZU51bWJlciB8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJFbmRMaW5lTnVtYmVyID0gYi5lbmRMaW5lTnVtYmVyIHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFFbmRMaW5lTnVtYmVyID09PSBiRW5kTGluZU51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYUVuZENvbHVtbiA9IGEuZW5kQ29sdW1uIHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJFbmRDb2x1bW4gPSBiLmVuZENvbHVtbiB8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYUVuZENvbHVtbiAtIGJFbmRDb2x1bW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFFbmRMaW5lTnVtYmVyIC0gYkVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhU3RhcnRDb2x1bW4gLSBiU3RhcnRDb2x1bW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gYVN0YXJ0TGluZU51bWJlciAtIGJTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgYUV4aXN0cyA9IChhID8gMSA6IDApOwogICAgICAgICAgICBjb25zdCBiRXhpc3RzID0gKGIgPyAxIDogMCk7CiAgICAgICAgICAgIHJldHVybiBhRXhpc3RzIC0gYkV4aXN0czsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHJhbmdlcywgdXNlZnVsIGZvciBzb3J0aW5nIHJhbmdlcwogICAgICAgICAqIEl0IHdpbGwgZmlyc3QgY29tcGFyZSByYW5nZXMgb24gdGhlIGVuZFBvc2l0aW9uIGFuZCB0aGVuIG9uIHRoZSBzdGFydFBvc2l0aW9uCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGNvbXBhcmVSYW5nZXNVc2luZ0VuZHMoYSwgYikgewogICAgICAgICAgICBpZiAoYS5lbmRMaW5lTnVtYmVyID09PSBiLmVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIGlmIChhLmVuZENvbHVtbiA9PT0gYi5lbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYS5zdGFydExpbmVOdW1iZXIgPT09IGIuc3RhcnRMaW5lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLnN0YXJ0Q29sdW1uIC0gYi5zdGFydENvbHVtbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuc3RhcnRMaW5lTnVtYmVyIC0gYi5zdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gYS5lbmRDb2x1bW4gLSBiLmVuZENvbHVtbjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYS5lbmRMaW5lTnVtYmVyIC0gYi5lbmRMaW5lTnVtYmVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIHRoZSByYW5nZSBzcGFucyBtdWx0aXBsZSBsaW5lcy4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgc3BhbnNNdWx0aXBsZUxpbmVzKHJhbmdlKSB7CiAgICAgICAgICAgIHJldHVybiByYW5nZS5lbmRMaW5lTnVtYmVyID4gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyOwogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNvbnN0IE1JTklNVU1fTUFUQ0hJTkdfQ0hBUkFDVEVSX0xFTkdUSCA9IDM7CiAgICBmdW5jdGlvbiBjb21wdXRlRGlmZihvcmlnaW5hbFNlcXVlbmNlLCBtb2RpZmllZFNlcXVlbmNlLCBjb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUsIHByZXR0eSkgewogICAgICAgIGNvbnN0IGRpZmZBbGdvID0gbmV3IExjc0RpZmYob3JpZ2luYWxTZXF1ZW5jZSwgbW9kaWZpZWRTZXF1ZW5jZSwgY29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlKTsKICAgICAgICByZXR1cm4gZGlmZkFsZ28uQ29tcHV0ZURpZmYocHJldHR5KTsKICAgIH0KICAgIGNsYXNzIExpbmVTZXF1ZW5jZSB7CiAgICAgICAgY29uc3RydWN0b3IobGluZXMpIHsKICAgICAgICAgICAgY29uc3Qgc3RhcnRDb2x1bW5zID0gW107CiAgICAgICAgICAgIGNvbnN0IGVuZENvbHVtbnMgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGxpbmVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBzdGFydENvbHVtbnNbaV0gPSBnZXRGaXJzdE5vbkJsYW5rQ29sdW1uKGxpbmVzW2ldLCAxKTsKICAgICAgICAgICAgICAgIGVuZENvbHVtbnNbaV0gPSBnZXRMYXN0Tm9uQmxhbmtDb2x1bW4obGluZXNbaV0sIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubGluZXMgPSBsaW5lczsKICAgICAgICAgICAgdGhpcy5fc3RhcnRDb2x1bW5zID0gc3RhcnRDb2x1bW5zOwogICAgICAgICAgICB0aGlzLl9lbmRDb2x1bW5zID0gZW5kQ29sdW1uczsKICAgICAgICB9CiAgICAgICAgZ2V0RWxlbWVudHMoKSB7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gW107CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50c1tpXSA9IHRoaXMubGluZXNbaV0uc3Vic3RyaW5nKHRoaXMuX3N0YXJ0Q29sdW1uc1tpXSAtIDEsIHRoaXMuX2VuZENvbHVtbnNbaV0gLSAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZWxlbWVudHM7CiAgICAgICAgfQogICAgICAgIGdldFN0cmljdEVsZW1lbnQoaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubGluZXNbaW5kZXhdOwogICAgICAgIH0KICAgICAgICBnZXRTdGFydExpbmVOdW1iZXIoaSkgewogICAgICAgICAgICByZXR1cm4gaSArIDE7CiAgICAgICAgfQogICAgICAgIGdldEVuZExpbmVOdW1iZXIoaSkgewogICAgICAgICAgICByZXR1cm4gaSArIDE7CiAgICAgICAgfQogICAgICAgIGNyZWF0ZUNoYXJTZXF1ZW5jZShzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgICAgICAgICAgY29uc3QgY2hhckNvZGVzID0gW107CiAgICAgICAgICAgIGNvbnN0IGxpbmVOdW1iZXJzID0gW107CiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTsKICAgICAgICAgICAgbGV0IGxlbiA9IDA7CiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPD0gZW5kSW5kZXg7IGluZGV4KyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gdGhpcy5saW5lc1tpbmRleF07CiAgICAgICAgICAgICAgICBjb25zdCBzdGFydENvbHVtbiA9IChzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSA/IHRoaXMuX3N0YXJ0Q29sdW1uc1tpbmRleF0gOiAxKTsKICAgICAgICAgICAgICAgIGNvbnN0IGVuZENvbHVtbiA9IChzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSA/IHRoaXMuX2VuZENvbHVtbnNbaW5kZXhdIDogbGluZUNvbnRlbnQubGVuZ3RoICsgMSk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2wgPSBzdGFydENvbHVtbjsgY29sIDwgZW5kQ29sdW1uOyBjb2wrKykgewogICAgICAgICAgICAgICAgICAgIGNoYXJDb2Rlc1tsZW5dID0gbGluZUNvbnRlbnQuY2hhckNvZGVBdChjb2wgLSAxKTsKICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyc1tsZW5dID0gaW5kZXggKyAxOwogICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbbGVuXSA9IGNvbDsKICAgICAgICAgICAgICAgICAgICBsZW4rKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IENoYXJTZXF1ZW5jZShjaGFyQ29kZXMsIGxpbmVOdW1iZXJzLCBjb2x1bW5zKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBDaGFyU2VxdWVuY2UgewogICAgICAgIGNvbnN0cnVjdG9yKGNoYXJDb2RlcywgbGluZU51bWJlcnMsIGNvbHVtbnMpIHsKICAgICAgICAgICAgdGhpcy5fY2hhckNvZGVzID0gY2hhckNvZGVzOwogICAgICAgICAgICB0aGlzLl9saW5lTnVtYmVycyA9IGxpbmVOdW1iZXJzOwogICAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gY29sdW1uczsKICAgICAgICB9CiAgICAgICAgZ2V0RWxlbWVudHMoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGFyQ29kZXM7CiAgICAgICAgfQogICAgICAgIGdldFN0YXJ0TGluZU51bWJlcihpKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5lTnVtYmVyc1tpXTsKICAgICAgICB9CiAgICAgICAgZ2V0U3RhcnRDb2x1bW4oaSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uc1tpXTsKICAgICAgICB9CiAgICAgICAgZ2V0RW5kTGluZU51bWJlcihpKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5lTnVtYmVyc1tpXTsKICAgICAgICB9CiAgICAgICAgZ2V0RW5kQ29sdW1uKGkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnNbaV0gKyAxOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIENoYXJDaGFuZ2UgewogICAgICAgIGNvbnN0cnVjdG9yKG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyLCBvcmlnaW5hbFN0YXJ0Q29sdW1uLCBvcmlnaW5hbEVuZExpbmVOdW1iZXIsIG9yaWdpbmFsRW5kQ29sdW1uLCBtb2RpZmllZFN0YXJ0TGluZU51bWJlciwgbW9kaWZpZWRTdGFydENvbHVtbiwgbW9kaWZpZWRFbmRMaW5lTnVtYmVyLCBtb2RpZmllZEVuZENvbHVtbikgewogICAgICAgICAgICB0aGlzLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gb3JpZ2luYWxTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxTdGFydENvbHVtbiA9IG9yaWdpbmFsU3RhcnRDb2x1bW47CiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxFbmRMaW5lTnVtYmVyID0gb3JpZ2luYWxFbmRMaW5lTnVtYmVyOwogICAgICAgICAgICB0aGlzLm9yaWdpbmFsRW5kQ29sdW1uID0gb3JpZ2luYWxFbmRDb2x1bW47CiAgICAgICAgICAgIHRoaXMubW9kaWZpZWRTdGFydExpbmVOdW1iZXIgPSBtb2RpZmllZFN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgdGhpcy5tb2RpZmllZFN0YXJ0Q29sdW1uID0gbW9kaWZpZWRTdGFydENvbHVtbjsKICAgICAgICAgICAgdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXIgPSBtb2RpZmllZEVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgIHRoaXMubW9kaWZpZWRFbmRDb2x1bW4gPSBtb2RpZmllZEVuZENvbHVtbjsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGNyZWF0ZUZyb21EaWZmQ2hhbmdlKGRpZmZDaGFuZ2UsIG9yaWdpbmFsQ2hhclNlcXVlbmNlLCBtb2RpZmllZENoYXJTZXF1ZW5jZSkgewogICAgICAgICAgICBsZXQgb3JpZ2luYWxTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCBvcmlnaW5hbFN0YXJ0Q29sdW1uOwogICAgICAgICAgICBsZXQgb3JpZ2luYWxFbmRMaW5lTnVtYmVyOwogICAgICAgICAgICBsZXQgb3JpZ2luYWxFbmRDb2x1bW47CiAgICAgICAgICAgIGxldCBtb2RpZmllZFN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgbGV0IG1vZGlmaWVkU3RhcnRDb2x1bW47CiAgICAgICAgICAgIGxldCBtb2RpZmllZEVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCBtb2RpZmllZEVuZENvbHVtbjsKICAgICAgICAgICAgaWYgKGRpZmZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gMDsKICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRDb2x1bW4gPSAwOwogICAgICAgICAgICAgICAgb3JpZ2luYWxFbmRMaW5lTnVtYmVyID0gMDsKICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kQ29sdW1uID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gb3JpZ2luYWxDaGFyU2VxdWVuY2UuZ2V0U3RhcnRMaW5lTnVtYmVyKGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbFN0YXJ0Q29sdW1uID0gb3JpZ2luYWxDaGFyU2VxdWVuY2UuZ2V0U3RhcnRDb2x1bW4oZGlmZkNoYW5nZS5vcmlnaW5hbFN0YXJ0KTsKICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kTGluZU51bWJlciA9IG9yaWdpbmFsQ2hhclNlcXVlbmNlLmdldEVuZExpbmVOdW1iZXIoZGlmZkNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgZGlmZkNoYW5nZS5vcmlnaW5hbExlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgb3JpZ2luYWxFbmRDb2x1bW4gPSBvcmlnaW5hbENoYXJTZXF1ZW5jZS5nZXRFbmRDb2x1bW4oZGlmZkNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgZGlmZkNoYW5nZS5vcmlnaW5hbExlbmd0aCAtIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkaWZmQ2hhbmdlLm1vZGlmaWVkTGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0TGluZU51bWJlciA9IDA7CiAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0Q29sdW1uID0gMDsKICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kTGluZU51bWJlciA9IDA7CiAgICAgICAgICAgICAgICBtb2RpZmllZEVuZENvbHVtbiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0TGluZU51bWJlciA9IG1vZGlmaWVkQ2hhclNlcXVlbmNlLmdldFN0YXJ0TGluZU51bWJlcihkaWZmQ2hhbmdlLm1vZGlmaWVkU3RhcnQpOwogICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydENvbHVtbiA9IG1vZGlmaWVkQ2hhclNlcXVlbmNlLmdldFN0YXJ0Q29sdW1uKGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCk7CiAgICAgICAgICAgICAgICBtb2RpZmllZEVuZExpbmVOdW1iZXIgPSBtb2RpZmllZENoYXJTZXF1ZW5jZS5nZXRFbmRMaW5lTnVtYmVyKGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCArIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kQ29sdW1uID0gbW9kaWZpZWRDaGFyU2VxdWVuY2UuZ2V0RW5kQ29sdW1uKGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCArIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggLSAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IENoYXJDaGFuZ2Uob3JpZ2luYWxTdGFydExpbmVOdW1iZXIsIG9yaWdpbmFsU3RhcnRDb2x1bW4sIG9yaWdpbmFsRW5kTGluZU51bWJlciwgb3JpZ2luYWxFbmRDb2x1bW4sIG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLCBtb2RpZmllZFN0YXJ0Q29sdW1uLCBtb2RpZmllZEVuZExpbmVOdW1iZXIsIG1vZGlmaWVkRW5kQ29sdW1uKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBwb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzKHJhd0NoYW5nZXMpIHsKICAgICAgICBpZiAocmF3Q2hhbmdlcy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICByZXR1cm4gcmF3Q2hhbmdlczsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gW3Jhd0NoYW5nZXNbMF1dOwogICAgICAgIGxldCBwcmV2Q2hhbmdlID0gcmVzdWx0WzBdOwogICAgICAgIGZvciAobGV0IGkgPSAxLCBsZW4gPSByYXdDaGFuZ2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGN1cnJDaGFuZ2UgPSByYXdDaGFuZ2VzW2ldOwogICAgICAgICAgICBjb25zdCBvcmlnaW5hbE1hdGNoaW5nTGVuZ3RoID0gY3VyckNoYW5nZS5vcmlnaW5hbFN0YXJ0IC0gKHByZXZDaGFuZ2Uub3JpZ2luYWxTdGFydCArIHByZXZDaGFuZ2Uub3JpZ2luYWxMZW5ndGgpOwogICAgICAgICAgICBjb25zdCBtb2RpZmllZE1hdGNoaW5nTGVuZ3RoID0gY3VyckNoYW5nZS5tb2RpZmllZFN0YXJ0IC0gKHByZXZDaGFuZ2UubW9kaWZpZWRTdGFydCArIHByZXZDaGFuZ2UubW9kaWZpZWRMZW5ndGgpOwogICAgICAgICAgICAvLyBCb3RoIG9mIHRoZSBhYm92ZSBzaG91bGQgYmUgZXF1YWwsIGJ1dCB0aGUgY29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlIG1heSBwcmV2ZW50IHRoaXMgZnJvbSBiZWluZyB0cnVlCiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nTGVuZ3RoID0gTWF0aC5taW4ob3JpZ2luYWxNYXRjaGluZ0xlbmd0aCwgbW9kaWZpZWRNYXRjaGluZ0xlbmd0aCk7CiAgICAgICAgICAgIGlmIChtYXRjaGluZ0xlbmd0aCA8IE1JTklNVU1fTUFUQ0hJTkdfQ0hBUkFDVEVSX0xFTkdUSCkgewogICAgICAgICAgICAgICAgLy8gTWVyZ2UgdGhlIGN1cnJlbnQgY2hhbmdlIGludG8gdGhlIHByZXZpb3VzIG9uZQogICAgICAgICAgICAgICAgcHJldkNoYW5nZS5vcmlnaW5hbExlbmd0aCA9IChjdXJyQ2hhbmdlLm9yaWdpbmFsU3RhcnQgKyBjdXJyQ2hhbmdlLm9yaWdpbmFsTGVuZ3RoKSAtIHByZXZDaGFuZ2Uub3JpZ2luYWxTdGFydDsKICAgICAgICAgICAgICAgIHByZXZDaGFuZ2UubW9kaWZpZWRMZW5ndGggPSAoY3VyckNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgY3VyckNoYW5nZS5tb2RpZmllZExlbmd0aCkgLSBwcmV2Q2hhbmdlLm1vZGlmaWVkU3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgY2hhbmdlCiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjdXJyQ2hhbmdlKTsKICAgICAgICAgICAgICAgIHByZXZDaGFuZ2UgPSBjdXJyQ2hhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBjbGFzcyBMaW5lQ2hhbmdlIHsKICAgICAgICBjb25zdHJ1Y3RvcihvcmlnaW5hbFN0YXJ0TGluZU51bWJlciwgb3JpZ2luYWxFbmRMaW5lTnVtYmVyLCBtb2RpZmllZFN0YXJ0TGluZU51bWJlciwgbW9kaWZpZWRFbmRMaW5lTnVtYmVyLCBjaGFyQ2hhbmdlcykgewogICAgICAgICAgICB0aGlzLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gb3JpZ2luYWxTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxFbmRMaW5lTnVtYmVyID0gb3JpZ2luYWxFbmRMaW5lTnVtYmVyOwogICAgICAgICAgICB0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyID0gbW9kaWZpZWRTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIHRoaXMubW9kaWZpZWRFbmRMaW5lTnVtYmVyID0gbW9kaWZpZWRFbmRMaW5lTnVtYmVyOwogICAgICAgICAgICB0aGlzLmNoYXJDaGFuZ2VzID0gY2hhckNoYW5nZXM7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBjcmVhdGVGcm9tRGlmZlJlc3VsdChzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSwgZGlmZkNoYW5nZSwgb3JpZ2luYWxMaW5lU2VxdWVuY2UsIG1vZGlmaWVkTGluZVNlcXVlbmNlLCBjb250aW51ZUNoYXJEaWZmLCBzaG91bGRDb21wdXRlQ2hhckNoYW5nZXMsIHNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpIHsKICAgICAgICAgICAgbGV0IG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOwogICAgICAgICAgICBsZXQgb3JpZ2luYWxFbmRMaW5lTnVtYmVyOwogICAgICAgICAgICBsZXQgbW9kaWZpZWRTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCBtb2RpZmllZEVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCBjaGFyQ2hhbmdlcyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKGRpZmZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gb3JpZ2luYWxMaW5lU2VxdWVuY2UuZ2V0U3RhcnRMaW5lTnVtYmVyKGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCkgLSAxOwogICAgICAgICAgICAgICAgb3JpZ2luYWxFbmRMaW5lTnVtYmVyID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gb3JpZ2luYWxMaW5lU2VxdWVuY2UuZ2V0U3RhcnRMaW5lTnVtYmVyKGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZExpbmVOdW1iZXIgPSBvcmlnaW5hbExpbmVTZXF1ZW5jZS5nZXRFbmRMaW5lTnVtYmVyKGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCArIGRpZmZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggLSAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGlmZkNoYW5nZS5tb2RpZmllZExlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydExpbmVOdW1iZXIgPSBtb2RpZmllZExpbmVTZXF1ZW5jZS5nZXRTdGFydExpbmVOdW1iZXIoZGlmZkNoYW5nZS5tb2RpZmllZFN0YXJ0KSAtIDE7CiAgICAgICAgICAgICAgICBtb2RpZmllZEVuZExpbmVOdW1iZXIgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydExpbmVOdW1iZXIgPSBtb2RpZmllZExpbmVTZXF1ZW5jZS5nZXRTdGFydExpbmVOdW1iZXIoZGlmZkNoYW5nZS5tb2RpZmllZFN0YXJ0KTsKICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kTGluZU51bWJlciA9IG1vZGlmaWVkTGluZVNlcXVlbmNlLmdldEVuZExpbmVOdW1iZXIoZGlmZkNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgZGlmZkNoYW5nZS5tb2RpZmllZExlbmd0aCAtIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzaG91bGRDb21wdXRlQ2hhckNoYW5nZXMgJiYgZGlmZkNoYW5nZS5vcmlnaW5hbExlbmd0aCA+IDAgJiYgZGlmZkNoYW5nZS5vcmlnaW5hbExlbmd0aCA8IDIwICYmIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggPiAwICYmIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggPCAyMCAmJiBjb250aW51ZUNoYXJEaWZmKCkpIHsKICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgY2hhcmFjdGVyIGNoYW5nZXMgZm9yIGRpZmYgY2h1bmtzIG9mIGF0IG1vc3QgMjAgbGluZXMuLi4KICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQ2hhclNlcXVlbmNlID0gb3JpZ2luYWxMaW5lU2VxdWVuY2UuY3JlYXRlQ2hhclNlcXVlbmNlKHNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLCBkaWZmQ2hhbmdlLm9yaWdpbmFsU3RhcnQsIGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCArIGRpZmZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkQ2hhclNlcXVlbmNlID0gbW9kaWZpZWRMaW5lU2VxdWVuY2UuY3JlYXRlQ2hhclNlcXVlbmNlKHNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLCBkaWZmQ2hhbmdlLm1vZGlmaWVkU3RhcnQsIGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCArIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIGxldCByYXdDaGFuZ2VzID0gY29tcHV0ZURpZmYob3JpZ2luYWxDaGFyU2VxdWVuY2UsIG1vZGlmaWVkQ2hhclNlcXVlbmNlLCBjb250aW51ZUNoYXJEaWZmLCB0cnVlKS5jaGFuZ2VzOwogICAgICAgICAgICAgICAgaWYgKHNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpIHsKICAgICAgICAgICAgICAgICAgICByYXdDaGFuZ2VzID0gcG9zdFByb2Nlc3NDaGFyQ2hhbmdlcyhyYXdDaGFuZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNoYXJDaGFuZ2VzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcmF3Q2hhbmdlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNoYXJDaGFuZ2VzLnB1c2goQ2hhckNoYW5nZS5jcmVhdGVGcm9tRGlmZkNoYW5nZShyYXdDaGFuZ2VzW2ldLCBvcmlnaW5hbENoYXJTZXF1ZW5jZSwgbW9kaWZpZWRDaGFyU2VxdWVuY2UpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IExpbmVDaGFuZ2Uob3JpZ2luYWxTdGFydExpbmVOdW1iZXIsIG9yaWdpbmFsRW5kTGluZU51bWJlciwgbW9kaWZpZWRTdGFydExpbmVOdW1iZXIsIG1vZGlmaWVkRW5kTGluZU51bWJlciwgY2hhckNoYW5nZXMpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIERpZmZDb21wdXRlciB7CiAgICAgICAgY29uc3RydWN0b3Iob3JpZ2luYWxMaW5lcywgbW9kaWZpZWRMaW5lcywgb3B0cykgewogICAgICAgICAgICB0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyA9IG9wdHMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzOwogICAgICAgICAgICB0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMgPSBvcHRzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXM7CiAgICAgICAgICAgIHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UgPSBvcHRzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlOwogICAgICAgICAgICB0aGlzLnNob3VsZE1ha2VQcmV0dHlEaWZmID0gb3B0cy5zaG91bGRNYWtlUHJldHR5RGlmZjsKICAgICAgICAgICAgdGhpcy5vcmlnaW5hbExpbmVzID0gb3JpZ2luYWxMaW5lczsKICAgICAgICAgICAgdGhpcy5tb2RpZmllZExpbmVzID0gbW9kaWZpZWRMaW5lczsKICAgICAgICAgICAgdGhpcy5vcmlnaW5hbCA9IG5ldyBMaW5lU2VxdWVuY2Uob3JpZ2luYWxMaW5lcyk7CiAgICAgICAgICAgIHRoaXMubW9kaWZpZWQgPSBuZXcgTGluZVNlcXVlbmNlKG1vZGlmaWVkTGluZXMpOwogICAgICAgICAgICB0aGlzLmNvbnRpbnVlTGluZURpZmYgPSBjcmVhdGVDb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUob3B0cy5tYXhDb21wdXRhdGlvblRpbWUpOwogICAgICAgICAgICB0aGlzLmNvbnRpbnVlQ2hhckRpZmYgPSBjcmVhdGVDb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUob3B0cy5tYXhDb21wdXRhdGlvblRpbWUgPT09IDAgPyAwIDogTWF0aC5taW4ob3B0cy5tYXhDb21wdXRhdGlvblRpbWUsIDUwMDApKTsgLy8gbmV2ZXIgcnVuIGFmdGVyIDVzIGZvciBjaGFyYWN0ZXIgY2hhbmdlcy4uLgogICAgICAgIH0KICAgICAgICBjb21wdXRlRGlmZigpIHsKICAgICAgICAgICAgaWYgKHRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoID09PSAxICYmIHRoaXMub3JpZ2luYWwubGluZXNbMF0ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBlbXB0eSBvcmlnaW5hbCA9PiBmYXN0IHBhdGgKICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGlmaWVkLmxpbmVzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLm1vZGlmaWVkLmxpbmVzWzBdLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHF1aXRFYXJseTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXM6IFtdCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdGFydExpbmVOdW1iZXI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZExpbmVOdW1iZXI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0TGluZU51bWJlcjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kTGluZU51bWJlcjogdGhpcy5tb2RpZmllZC5saW5lcy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyQ2hhbmdlczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFbmRDb2x1bW46IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kTGluZU51bWJlcjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydENvbHVtbjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kQ29sdW1uOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZExpbmVOdW1iZXI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRDb2x1bW46IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZWQubGluZXMubGVuZ3RoID09PSAxICYmIHRoaXMubW9kaWZpZWQubGluZXNbMF0ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBlbXB0eSBtb2RpZmllZCA9PiBmYXN0IHBhdGgKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdGFydExpbmVOdW1iZXI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZExpbmVOdW1iZXI6IHRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEVuZExpbmVOdW1iZXI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyQ2hhbmdlczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFbmRDb2x1bW46IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kTGluZU51bWJlcjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydENvbHVtbjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kQ29sdW1uOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZExpbmVOdW1iZXI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRDb2x1bW46IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZGlmZlJlc3VsdCA9IGNvbXB1dGVEaWZmKHRoaXMub3JpZ2luYWwsIHRoaXMubW9kaWZpZWQsIHRoaXMuY29udGludWVMaW5lRGlmZiwgdGhpcy5zaG91bGRNYWtlUHJldHR5RGlmZik7CiAgICAgICAgICAgIGNvbnN0IHJhd0NoYW5nZXMgPSBkaWZmUmVzdWx0LmNoYW5nZXM7CiAgICAgICAgICAgIGNvbnN0IHF1aXRFYXJseSA9IGRpZmZSZXN1bHQucXVpdEVhcmx5OwogICAgICAgICAgICAvLyBUaGUgZGlmZiBpcyBhbHdheXMgY29tcHV0ZWQgd2l0aCBpZ25vcmluZyB0cmltIHdoaXRlc3BhY2UKICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHdlIGdldCB0aGUgcHJldHRpZXN0IGRpZmYKICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVDaGFuZ2VzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcmF3Q2hhbmdlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGxpbmVDaGFuZ2VzLnB1c2goTGluZUNoYW5nZS5jcmVhdGVGcm9tRGlmZlJlc3VsdCh0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLCByYXdDaGFuZ2VzW2ldLCB0aGlzLm9yaWdpbmFsLCB0aGlzLm1vZGlmaWVkLCB0aGlzLmNvbnRpbnVlQ2hhckRpZmYsIHRoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLCB0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBxdWl0RWFybHksCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlczogbGluZUNoYW5nZXMKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTmVlZCB0byBwb3N0LXByb2Nlc3MgYW5kIGludHJvZHVjZSBjaGFuZ2VzIHdoZXJlIHRoZSB0cmltIHdoaXRlc3BhY2UgaXMgZGlmZmVyZW50CiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBhcmUgbG9vcGluZyBzdGFydGluZyBhdCAtMSB0byBhbHNvIGNvdmVyIHRoZSBsaW5lcyBiZWZvcmUgdGhlIGZpcnN0IGNoYW5nZQogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICAgICAgbGV0IG9yaWdpbmFsTGluZUluZGV4ID0gMDsKICAgICAgICAgICAgbGV0IG1vZGlmaWVkTGluZUluZGV4ID0gMDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IC0xIC8qICEhISEgKi8sIGxlbiA9IHJhd0NoYW5nZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDaGFuZ2UgPSAoaSArIDEgPCBsZW4gPyByYXdDaGFuZ2VzW2kgKyAxXSA6IG51bGwpOwogICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTdG9wID0gKG5leHRDaGFuZ2UgPyBuZXh0Q2hhbmdlLm9yaWdpbmFsU3RhcnQgOiB0aGlzLm9yaWdpbmFsTGluZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3RvcCA9IChuZXh0Q2hhbmdlID8gbmV4dENoYW5nZS5tb2RpZmllZFN0YXJ0IDogdGhpcy5tb2RpZmllZExpbmVzLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB3aGlsZSAob3JpZ2luYWxMaW5lSW5kZXggPCBvcmlnaW5hbFN0b3AgJiYgbW9kaWZpZWRMaW5lSW5kZXggPCBtb2RpZmllZFN0b3ApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbExpbmUgPSB0aGlzLm9yaWdpbmFsTGluZXNbb3JpZ2luYWxMaW5lSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkTGluZSA9IHRoaXMubW9kaWZpZWRMaW5lc1ttb2RpZmllZExpbmVJbmRleF07CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsTGluZSAhPT0gbW9kaWZpZWRMaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGxpbmVzIGRpZmZlciBvbmx5IGluIHRyaW0gd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbFN0YXJ0Q29sdW1uID0gZ2V0Rmlyc3ROb25CbGFua0NvbHVtbihvcmlnaW5hbExpbmUsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGlmaWVkU3RhcnRDb2x1bW4gPSBnZXRGaXJzdE5vbkJsYW5rQ29sdW1uKG1vZGlmaWVkTGluZSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3JpZ2luYWxTdGFydENvbHVtbiA+IDEgJiYgbW9kaWZpZWRTdGFydENvbHVtbiA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbENoYXIgPSBvcmlnaW5hbExpbmUuY2hhckNvZGVBdChvcmlnaW5hbFN0YXJ0Q29sdW1uIC0gMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRDaGFyID0gbW9kaWZpZWRMaW5lLmNoYXJDb2RlQXQobW9kaWZpZWRTdGFydENvbHVtbiAtIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbENoYXIgIT09IG1vZGlmaWVkQ2hhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdGFydENvbHVtbi0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkU3RhcnRDb2x1bW4tLTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0YXJ0Q29sdW1uID4gMSB8fCBtb2RpZmllZFN0YXJ0Q29sdW1uID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3B1c2hUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UocmVzdWx0LCBvcmlnaW5hbExpbmVJbmRleCArIDEsIDEsIG9yaWdpbmFsU3RhcnRDb2x1bW4sIG1vZGlmaWVkTGluZUluZGV4ICsgMSwgMSwgbW9kaWZpZWRTdGFydENvbHVtbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9yaWdpbmFsRW5kQ29sdW1uID0gZ2V0TGFzdE5vbkJsYW5rQ29sdW1uKG9yaWdpbmFsTGluZSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW9kaWZpZWRFbmRDb2x1bW4gPSBnZXRMYXN0Tm9uQmxhbmtDb2x1bW4obW9kaWZpZWRMaW5lLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTWF4Q29sdW1uID0gb3JpZ2luYWxMaW5lLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZE1heENvbHVtbiA9IG1vZGlmaWVkTGluZS5sZW5ndGggKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9yaWdpbmFsRW5kQ29sdW1uIDwgb3JpZ2luYWxNYXhDb2x1bW4gJiYgbW9kaWZpZWRFbmRDb2x1bW4gPCBtb2RpZmllZE1heENvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQ2hhciA9IG9yaWdpbmFsTGluZS5jaGFyQ29kZUF0KG9yaWdpbmFsRW5kQ29sdW1uIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRDaGFyID0gb3JpZ2luYWxMaW5lLmNoYXJDb2RlQXQobW9kaWZpZWRFbmRDb2x1bW4gLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxDaGFyICE9PSBtb2RpZmllZENoYXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kQ29sdW1uKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFbmRDb2x1bW4rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEVuZENvbHVtbiA8IG9yaWdpbmFsTWF4Q29sdW1uIHx8IG1vZGlmaWVkRW5kQ29sdW1uIDwgbW9kaWZpZWRNYXhDb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wdXNoVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHJlc3VsdCwgb3JpZ2luYWxMaW5lSW5kZXggKyAxLCBvcmlnaW5hbEVuZENvbHVtbiwgb3JpZ2luYWxNYXhDb2x1bW4sIG1vZGlmaWVkTGluZUluZGV4ICsgMSwgbW9kaWZpZWRFbmRDb2x1bW4sIG1vZGlmaWVkTWF4Q29sdW1uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbExpbmVJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkTGluZUluZGV4Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobmV4dENoYW5nZSkgewogICAgICAgICAgICAgICAgICAgIC8vIEVtaXQgdGhlIGFjdHVhbCBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChMaW5lQ2hhbmdlLmNyZWF0ZUZyb21EaWZmUmVzdWx0KHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UsIG5leHRDaGFuZ2UsIHRoaXMub3JpZ2luYWwsIHRoaXMubW9kaWZpZWQsIHRoaXMuY29udGludWVDaGFyRGlmZiwgdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMsIHRoaXMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcykpOwogICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTGluZUluZGV4ICs9IG5leHRDaGFuZ2Uub3JpZ2luYWxMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRMaW5lSW5kZXggKz0gbmV4dENoYW5nZS5tb2RpZmllZExlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBxdWl0RWFybHksCiAgICAgICAgICAgICAgICBjaGFuZ2VzOiByZXN1bHQKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgX3B1c2hUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UocmVzdWx0LCBvcmlnaW5hbExpbmVOdW1iZXIsIG9yaWdpbmFsU3RhcnRDb2x1bW4sIG9yaWdpbmFsRW5kQ29sdW1uLCBtb2RpZmllZExpbmVOdW1iZXIsIG1vZGlmaWVkU3RhcnRDb2x1bW4sIG1vZGlmaWVkRW5kQ29sdW1uKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9tZXJnZVRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShyZXN1bHQsIG9yaWdpbmFsTGluZU51bWJlciwgb3JpZ2luYWxTdGFydENvbHVtbiwgb3JpZ2luYWxFbmRDb2x1bW4sIG1vZGlmaWVkTGluZU51bWJlciwgbW9kaWZpZWRTdGFydENvbHVtbiwgbW9kaWZpZWRFbmRDb2x1bW4pKSB7CiAgICAgICAgICAgICAgICAvLyBNZXJnZWQgaW50byBwcmV2aW91cwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBjaGFyQ2hhbmdlcyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICBjaGFyQ2hhbmdlcyA9IFtuZXcgQ2hhckNoYW5nZShvcmlnaW5hbExpbmVOdW1iZXIsIG9yaWdpbmFsU3RhcnRDb2x1bW4sIG9yaWdpbmFsTGluZU51bWJlciwgb3JpZ2luYWxFbmRDb2x1bW4sIG1vZGlmaWVkTGluZU51bWJlciwgbW9kaWZpZWRTdGFydENvbHVtbiwgbW9kaWZpZWRMaW5lTnVtYmVyLCBtb2RpZmllZEVuZENvbHVtbildOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBMaW5lQ2hhbmdlKG9yaWdpbmFsTGluZU51bWJlciwgb3JpZ2luYWxMaW5lTnVtYmVyLCBtb2RpZmllZExpbmVOdW1iZXIsIG1vZGlmaWVkTGluZU51bWJlciwgY2hhckNoYW5nZXMpKTsKICAgICAgICB9CiAgICAgICAgX21lcmdlVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHJlc3VsdCwgb3JpZ2luYWxMaW5lTnVtYmVyLCBvcmlnaW5hbFN0YXJ0Q29sdW1uLCBvcmlnaW5hbEVuZENvbHVtbiwgbW9kaWZpZWRMaW5lTnVtYmVyLCBtb2RpZmllZFN0YXJ0Q29sdW1uLCBtb2RpZmllZEVuZENvbHVtbikgewogICAgICAgICAgICBjb25zdCBsZW4gPSByZXN1bHQubGVuZ3RoOwogICAgICAgICAgICBpZiAobGVuID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcHJldkNoYW5nZSA9IHJlc3VsdFtsZW4gLSAxXTsKICAgICAgICAgICAgaWYgKHByZXZDaGFuZ2Uub3JpZ2luYWxFbmRMaW5lTnVtYmVyID09PSAwIHx8IHByZXZDaGFuZ2UubW9kaWZpZWRFbmRMaW5lTnVtYmVyID09PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBEb24ndCBtZXJnZSB3aXRoIGluc2VydHMvZGVsZXRlcwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcmV2Q2hhbmdlLm9yaWdpbmFsRW5kTGluZU51bWJlciArIDEgPT09IG9yaWdpbmFsTGluZU51bWJlciAmJiBwcmV2Q2hhbmdlLm1vZGlmaWVkRW5kTGluZU51bWJlciArIDEgPT09IG1vZGlmaWVkTGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcHJldkNoYW5nZS5vcmlnaW5hbEVuZExpbmVOdW1iZXIgPSBvcmlnaW5hbExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICBwcmV2Q2hhbmdlLm1vZGlmaWVkRW5kTGluZU51bWJlciA9IG1vZGlmaWVkTGluZU51bWJlcjsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyAmJiBwcmV2Q2hhbmdlLmNoYXJDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldkNoYW5nZS5jaGFyQ2hhbmdlcy5wdXNoKG5ldyBDaGFyQ2hhbmdlKG9yaWdpbmFsTGluZU51bWJlciwgb3JpZ2luYWxTdGFydENvbHVtbiwgb3JpZ2luYWxMaW5lTnVtYmVyLCBvcmlnaW5hbEVuZENvbHVtbiwgbW9kaWZpZWRMaW5lTnVtYmVyLCBtb2RpZmllZFN0YXJ0Q29sdW1uLCBtb2RpZmllZExpbmVOdW1iZXIsIG1vZGlmaWVkRW5kQ29sdW1uKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0Rmlyc3ROb25CbGFua0NvbHVtbih0eHQsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIGNvbnN0IHIgPSBmaXJzdE5vbldoaXRlc3BhY2VJbmRleCh0eHQpOwogICAgICAgIGlmIChyID09PSAtMSkgewogICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gciArIDE7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRMYXN0Tm9uQmxhbmtDb2x1bW4odHh0LCBkZWZhdWx0VmFsdWUpIHsKICAgICAgICBjb25zdCByID0gbGFzdE5vbldoaXRlc3BhY2VJbmRleCh0eHQpOwogICAgICAgIGlmIChyID09PSAtMSkgewogICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gciArIDI7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVDb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUobWF4aW11bVJ1bnRpbWUpIHsKICAgICAgICBpZiAobWF4aW11bVJ1bnRpbWUgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuICgpID0+IHRydWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBtYXhpbXVtUnVudGltZTsKICAgICAgICB9OwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgZnVuY3Rpb24gdG9VaW50OCh2KSB7CiAgICAgICAgaWYgKHYgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAodiA+IDI1NSAvKiBNQVhfVUlOVF84ICovKSB7CiAgICAgICAgICAgIHJldHVybiAyNTUgLyogTUFYX1VJTlRfOCAqLzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHYgfCAwOwogICAgfQogICAgZnVuY3Rpb24gdG9VaW50MzIodikgewogICAgICAgIGlmICh2IDwgMCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHYgPiA0Mjk0OTY3Mjk1IC8qIE1BWF9VSU5UXzMyICovKSB7CiAgICAgICAgICAgIHJldHVybiA0Mjk0OTY3Mjk1IC8qIE1BWF9VSU5UXzMyICovOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdiB8IDA7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjbGFzcyBQcmVmaXhTdW1Db21wdXRlciB7CiAgICAgICAgY29uc3RydWN0b3IodmFsdWVzKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOwogICAgICAgICAgICB0aGlzLnByZWZpeFN1bSA9IG5ldyBVaW50MzJBcnJheSh2YWx1ZXMubGVuZ3RoKTsKICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4ID0gbmV3IEludDMyQXJyYXkoMSk7CiAgICAgICAgICAgIHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSA9IC0xOwogICAgICAgIH0KICAgICAgICBpbnNlcnRWYWx1ZXMoaW5zZXJ0SW5kZXgsIGluc2VydFZhbHVlcykgewogICAgICAgICAgICBpbnNlcnRJbmRleCA9IHRvVWludDMyKGluc2VydEluZGV4KTsKICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWVzID0gdGhpcy52YWx1ZXM7CiAgICAgICAgICAgIGNvbnN0IG9sZFByZWZpeFN1bSA9IHRoaXMucHJlZml4U3VtOwogICAgICAgICAgICBjb25zdCBpbnNlcnRWYWx1ZXNMZW4gPSBpbnNlcnRWYWx1ZXMubGVuZ3RoOwogICAgICAgICAgICBpZiAoaW5zZXJ0VmFsdWVzTGVuID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBuZXcgVWludDMyQXJyYXkob2xkVmFsdWVzLmxlbmd0aCArIGluc2VydFZhbHVlc0xlbik7CiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChvbGRWYWx1ZXMuc3ViYXJyYXkoMCwgaW5zZXJ0SW5kZXgpLCAwKTsKICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9sZFZhbHVlcy5zdWJhcnJheShpbnNlcnRJbmRleCksIGluc2VydEluZGV4ICsgaW5zZXJ0VmFsdWVzTGVuKTsKICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KGluc2VydFZhbHVlcywgaW5zZXJ0SW5kZXgpOwogICAgICAgICAgICBpZiAoaW5zZXJ0SW5kZXggLSAxIDwgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0gPSBpbnNlcnRJbmRleCAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW0gPSBuZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKTsKICAgICAgICAgICAgaWYgKHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSA+PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLnByZWZpeFN1bS5zZXQob2xkUHJlZml4U3VtLnN1YmFycmF5KDAsIHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSArIDEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgc2V0VmFsdWUoaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgIGluZGV4ID0gdG9VaW50MzIoaW5kZXgpOwogICAgICAgICAgICB2YWx1ZSA9IHRvVWludDMyKHZhbHVlKTsKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVzW2luZGV4XSA9PT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgaWYgKGluZGV4IC0gMSA8IHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSkgewogICAgICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdID0gaW5kZXggLSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZW1vdmVWYWx1ZXMoc3RhcnRJbmRleCwgY291bnQpIHsKICAgICAgICAgICAgc3RhcnRJbmRleCA9IHRvVWludDMyKHN0YXJ0SW5kZXgpOwogICAgICAgICAgICBjb3VudCA9IHRvVWludDMyKGNvdW50KTsKICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWVzID0gdGhpcy52YWx1ZXM7CiAgICAgICAgICAgIGNvbnN0IG9sZFByZWZpeFN1bSA9IHRoaXMucHJlZml4U3VtOwogICAgICAgICAgICBpZiAoc3RhcnRJbmRleCA+PSBvbGRWYWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG1heENvdW50ID0gb2xkVmFsdWVzLmxlbmd0aCAtIHN0YXJ0SW5kZXg7CiAgICAgICAgICAgIGlmIChjb3VudCA+PSBtYXhDb3VudCkgewogICAgICAgICAgICAgICAgY291bnQgPSBtYXhDb3VudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnZhbHVlcyA9IG5ldyBVaW50MzJBcnJheShvbGRWYWx1ZXMubGVuZ3RoIC0gY291bnQpOwogICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQob2xkVmFsdWVzLnN1YmFycmF5KDAsIHN0YXJ0SW5kZXgpLCAwKTsKICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9sZFZhbHVlcy5zdWJhcnJheShzdGFydEluZGV4ICsgY291bnQpLCBzdGFydEluZGV4KTsKICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW0gPSBuZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKTsKICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggLSAxIDwgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0gPSBzdGFydEluZGV4IC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdID49IDApIHsKICAgICAgICAgICAgICAgIHRoaXMucHJlZml4U3VtLnNldChvbGRQcmVmaXhTdW0uc3ViYXJyYXkoMCwgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdICsgMSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBnZXRUb3RhbFN1bSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByZWZpeFN1bSh0aGlzLnZhbHVlcy5sZW5ndGggLSAxKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSBmaXJzdCBgaW5kZXggKyAxYCBtYW55IGl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIGBTVU0oMCA8PSBqIDw9IGluZGV4LCB2YWx1ZXNbal0pYC4KICAgICAgICAgKi8KICAgICAgICBnZXRQcmVmaXhTdW0oaW5kZXgpIHsKICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5kZXggPSB0b1VpbnQzMihpbmRleCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRQcmVmaXhTdW0oaW5kZXgpOwogICAgICAgIH0KICAgICAgICBfZ2V0UHJlZml4U3VtKGluZGV4KSB7CiAgICAgICAgICAgIGlmIChpbmRleCA8PSB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0pIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZWZpeFN1bVtpbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0gKyAxOwogICAgICAgICAgICBpZiAoc3RhcnRJbmRleCA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW1bMF0gPSB0aGlzLnZhbHVlc1swXTsKICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXgrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy52YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMudmFsdWVzLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gaW5kZXg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW1baV0gPSB0aGlzLnByZWZpeFN1bVtpIC0gMV0gKyB0aGlzLnZhbHVlc1tpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0gPSBNYXRoLm1heCh0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0sIGluZGV4KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4U3VtW2luZGV4XTsKICAgICAgICB9CiAgICAgICAgZ2V0SW5kZXhPZihzdW0pIHsKICAgICAgICAgICAgc3VtID0gTWF0aC5mbG9vcihzdW0pOwogICAgICAgICAgICAvLyBDb21wdXRlIGFsbCBzdW1zICh0byBnZXQgYSBmdWxseSB2YWxpZCBwcmVmaXhTdW0pCiAgICAgICAgICAgIHRoaXMuZ2V0VG90YWxTdW0oKTsKICAgICAgICAgICAgbGV0IGxvdyA9IDA7CiAgICAgICAgICAgIGxldCBoaWdoID0gdGhpcy52YWx1ZXMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgbGV0IG1pZCA9IDA7CiAgICAgICAgICAgIGxldCBtaWRTdG9wID0gMDsKICAgICAgICAgICAgbGV0IG1pZFN0YXJ0ID0gMDsKICAgICAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgICAgICAgICAgICBtaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpIC8gMikgfCAwOwogICAgICAgICAgICAgICAgbWlkU3RvcCA9IHRoaXMucHJlZml4U3VtW21pZF07CiAgICAgICAgICAgICAgICBtaWRTdGFydCA9IG1pZFN0b3AgLSB0aGlzLnZhbHVlc1ttaWRdOwogICAgICAgICAgICAgICAgaWYgKHN1bSA8IG1pZFN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdW0gPj0gbWlkU3RvcCkgewogICAgICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFByZWZpeFN1bUluZGV4T2ZSZXN1bHQobWlkLCBzdW0gLSBtaWRTdGFydCk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgUHJlZml4U3VtSW5kZXhPZlJlc3VsdCB7CiAgICAgICAgY29uc3RydWN0b3IoaW5kZXgsIHJlbWFpbmRlcikgewogICAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgIHRoaXMucmVtYWluZGVyID0gcmVtYWluZGVyOwogICAgICAgICAgICB0aGlzLl9wcmVmaXhTdW1JbmRleE9mUmVzdWx0QnJhbmQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgdGhpcy5yZW1haW5kZXIgPSByZW1haW5kZXI7CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY2xhc3MgTWlycm9yVGV4dE1vZGVsIHsKICAgICAgICBjb25zdHJ1Y3Rvcih1cmksIGxpbmVzLCBlb2wsIHZlcnNpb25JZCkgewogICAgICAgICAgICB0aGlzLl91cmkgPSB1cmk7CiAgICAgICAgICAgIHRoaXMuX2xpbmVzID0gbGluZXM7CiAgICAgICAgICAgIHRoaXMuX2VvbCA9IGVvbDsKICAgICAgICAgICAgdGhpcy5fdmVyc2lvbklkID0gdmVyc2lvbklkOwogICAgICAgICAgICB0aGlzLl9saW5lU3RhcnRzID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fY2FjaGVkVGV4dFZhbHVlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZGlzcG9zZSgpIHsKICAgICAgICAgICAgdGhpcy5fbGluZXMubGVuZ3RoID0gMDsKICAgICAgICB9CiAgICAgICAgZ2V0IHZlcnNpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uSWQ7CiAgICAgICAgfQogICAgICAgIGdldFRleHQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZWRUZXh0VmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFRleHRWYWx1ZSA9IHRoaXMuX2xpbmVzLmpvaW4odGhpcy5fZW9sKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkVGV4dFZhbHVlOwogICAgICAgIH0KICAgICAgICBvbkV2ZW50cyhlKSB7CiAgICAgICAgICAgIGlmIChlLmVvbCAmJiBlLmVvbCAhPT0gdGhpcy5fZW9sKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lb2wgPSBlLmVvbDsKICAgICAgICAgICAgICAgIHRoaXMuX2xpbmVTdGFydHMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFVwZGF0ZSBteSBsaW5lcwogICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gZS5jaGFuZ2VzOwogICAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hY2NlcHREZWxldGVSYW5nZShjaGFuZ2UucmFuZ2UpOwogICAgICAgICAgICAgICAgdGhpcy5fYWNjZXB0SW5zZXJ0VGV4dChuZXcgUG9zaXRpb24oY2hhbmdlLnJhbmdlLnN0YXJ0TGluZU51bWJlciwgY2hhbmdlLnJhbmdlLnN0YXJ0Q29sdW1uKSwgY2hhbmdlLnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3ZlcnNpb25JZCA9IGUudmVyc2lvbklkOwogICAgICAgICAgICB0aGlzLl9jYWNoZWRUZXh0VmFsdWUgPSBudWxsOwogICAgICAgIH0KICAgICAgICBfZW5zdXJlTGluZVN0YXJ0cygpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9saW5lU3RhcnRzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlb2xMZW5ndGggPSB0aGlzLl9lb2wubGVuZ3RoOwogICAgICAgICAgICAgICAgY29uc3QgbGluZXNMZW5ndGggPSB0aGlzLl9saW5lcy5sZW5ndGg7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5lU3RhcnRWYWx1ZXMgPSBuZXcgVWludDMyQXJyYXkobGluZXNMZW5ndGgpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgbGluZVN0YXJ0VmFsdWVzW2ldID0gdGhpcy5fbGluZXNbaV0ubGVuZ3RoICsgZW9sTGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fbGluZVN0YXJ0cyA9IG5ldyBQcmVmaXhTdW1Db21wdXRlcihsaW5lU3RhcnRWYWx1ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFsbCBjaGFuZ2VzIHRvIGEgbGluZSdzIHRleHQgZ28gdGhyb3VnaCB0aGlzIG1ldGhvZAogICAgICAgICAqLwogICAgICAgIF9zZXRMaW5lVGV4dChsaW5lSW5kZXgsIG5ld1ZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2xpbmVzW2xpbmVJbmRleF0gPSBuZXdWYWx1ZTsKICAgICAgICAgICAgaWYgKHRoaXMuX2xpbmVTdGFydHMpIHsKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcmVmaXggc3VtCiAgICAgICAgICAgICAgICB0aGlzLl9saW5lU3RhcnRzLnNldFZhbHVlKGxpbmVJbmRleCwgdGhpcy5fbGluZXNbbGluZUluZGV4XS5sZW5ndGggKyB0aGlzLl9lb2wubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfYWNjZXB0RGVsZXRlUmFuZ2UocmFuZ2UpIHsKICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0TGluZU51bWJlciA9PT0gcmFuZ2UuZW5kTGluZU51bWJlcikgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0Q29sdW1uID09PSByYW5nZS5lbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRlbGV0ZQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIERlbGV0ZSB0ZXh0IG9uIHRoZSBhZmZlY3RlZCBsaW5lCiAgICAgICAgICAgICAgICB0aGlzLl9zZXRMaW5lVGV4dChyYW5nZS5zdGFydExpbmVOdW1iZXIgLSAxLCB0aGlzLl9saW5lc1tyYW5nZS5zdGFydExpbmVOdW1iZXIgLSAxXS5zdWJzdHJpbmcoMCwgcmFuZ2Uuc3RhcnRDb2x1bW4gLSAxKQogICAgICAgICAgICAgICAgICAgICsgdGhpcy5fbGluZXNbcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKHJhbmdlLmVuZENvbHVtbiAtIDEpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUYWtlIHJlbWFpbmluZyB0ZXh0IG9uIGxhc3QgbGluZSBhbmQgYXBwZW5kIGl0IHRvIHJlbWFpbmluZyB0ZXh0IG9uIGZpcnN0IGxpbmUKICAgICAgICAgICAgdGhpcy5fc2V0TGluZVRleHQocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIC0gMSwgdGhpcy5fbGluZXNbcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKDAsIHJhbmdlLnN0YXJ0Q29sdW1uIC0gMSkKICAgICAgICAgICAgICAgICsgdGhpcy5fbGluZXNbcmFuZ2UuZW5kTGluZU51bWJlciAtIDFdLnN1YnN0cmluZyhyYW5nZS5lbmRDb2x1bW4gLSAxKSk7CiAgICAgICAgICAgIC8vIERlbGV0ZSBtaWRkbGUgbGluZXMKICAgICAgICAgICAgdGhpcy5fbGluZXMuc3BsaWNlKHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2UuZW5kTGluZU51bWJlciAtIHJhbmdlLnN0YXJ0TGluZU51bWJlcik7CiAgICAgICAgICAgIGlmICh0aGlzLl9saW5lU3RhcnRzKSB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcHJlZml4IHN1bQogICAgICAgICAgICAgICAgdGhpcy5fbGluZVN0YXJ0cy5yZW1vdmVWYWx1ZXMocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLCByYW5nZS5lbmRMaW5lTnVtYmVyIC0gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfYWNjZXB0SW5zZXJ0VGV4dChwb3NpdGlvbiwgaW5zZXJ0VGV4dCkgewogICAgICAgICAgICBpZiAoaW5zZXJ0VGV4dC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gaW5zZXJ0CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGluc2VydExpbmVzID0gc3BsaXRMaW5lcyhpbnNlcnRUZXh0KTsKICAgICAgICAgICAgaWYgKGluc2VydExpbmVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgLy8gSW5zZXJ0aW5nIHRleHQgb24gb25lIGxpbmUKICAgICAgICAgICAgICAgIHRoaXMuX3NldExpbmVUZXh0KHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCB0aGlzLl9saW5lc1twb3NpdGlvbi5saW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbiAtIDEpCiAgICAgICAgICAgICAgICAgICAgKyBpbnNlcnRMaW5lc1swXQogICAgICAgICAgICAgICAgICAgICsgdGhpcy5fbGluZXNbcG9zaXRpb24ubGluZU51bWJlciAtIDFdLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4gLSAxKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQXBwZW5kIG92ZXJmbG93aW5nIHRleHQgZnJvbSBmaXJzdCBsaW5lIHRvIHRoZSBlbmQgb2YgdGV4dCB0byBpbnNlcnQKICAgICAgICAgICAgaW5zZXJ0TGluZXNbaW5zZXJ0TGluZXMubGVuZ3RoIC0gMV0gKz0gdGhpcy5fbGluZXNbcG9zaXRpb24ubGluZU51bWJlciAtIDFdLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4gLSAxKTsKICAgICAgICAgICAgLy8gRGVsZXRlIG92ZXJmbG93aW5nIHRleHQgZnJvbSBmaXJzdCBsaW5lIGFuZCBpbnNlcnQgdGV4dCBvbiBmaXJzdCBsaW5lCiAgICAgICAgICAgIHRoaXMuX3NldExpbmVUZXh0KHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCB0aGlzLl9saW5lc1twb3NpdGlvbi5saW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbiAtIDEpCiAgICAgICAgICAgICAgICArIGluc2VydExpbmVzWzBdKTsKICAgICAgICAgICAgLy8gSW5zZXJ0IG5ldyBsaW5lcyAmIHN0b3JlIGxlbmd0aHMKICAgICAgICAgICAgbGV0IG5ld0xlbmd0aHMgPSBuZXcgVWludDMyQXJyYXkoaW5zZXJ0TGluZXMubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5zZXJ0TGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHRoaXMuX2xpbmVzLnNwbGljZShwb3NpdGlvbi5saW5lTnVtYmVyICsgaSAtIDEsIDAsIGluc2VydExpbmVzW2ldKTsKICAgICAgICAgICAgICAgIG5ld0xlbmd0aHNbaSAtIDFdID0gaW5zZXJ0TGluZXNbaV0ubGVuZ3RoICsgdGhpcy5fZW9sLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fbGluZVN0YXJ0cykgewogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHByZWZpeCBzdW0KICAgICAgICAgICAgICAgIHRoaXMuX2xpbmVTdGFydHMuaW5zZXJ0VmFsdWVzKHBvc2l0aW9uLmxpbmVOdW1iZXIsIG5ld0xlbmd0aHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY29uc3QgVVNVQUxfV09SRF9TRVBBUkFUT1JTID0gJ2B+IUAjJCVeJiooKS09K1t7XX1cXHw7OlwnIiwuPD4vPyc7CiAgICAvKioKICAgICAqIENyZWF0ZSBhIHdvcmQgZGVmaW5pdGlvbiByZWd1bGFyIGV4cHJlc3Npb24gYmFzZWQgb24gZGVmYXVsdCB3b3JkIHNlcGFyYXRvcnMuCiAgICAgKiBPcHRpb25hbGx5IHByb3ZpZGUgYWxsb3dlZCBzZXBhcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHdvcmRzLgogICAgICoKICAgICAqIFRoZSBkZWZhdWx0IHdvdWxkIGxvb2sgbGlrZSB0aGlzOgogICAgICogLygtP1xkKlwuXGRcdyopfChbXlxgXH5cIVxAXCNcJFwlXF5cJlwqXChcKVwtXD1cK1xbXHtcXVx9XFxcfFw7XDpcJ1wiXCxcLlw8XD5cL1w/XHNdKykvZwogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVXb3JkUmVnRXhwKGFsbG93SW5Xb3JkcyA9ICcnKSB7CiAgICAgICAgbGV0IHNvdXJjZSA9ICcoLT9cXGQqXFwuXFxkXFx3Kil8KFteJzsKICAgICAgICBmb3IgKGNvbnN0IHNlcCBvZiBVU1VBTF9XT1JEX1NFUEFSQVRPUlMpIHsKICAgICAgICAgICAgaWYgKGFsbG93SW5Xb3Jkcy5pbmRleE9mKHNlcCkgPj0gMCkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc291cmNlICs9ICdcXCcgKyBzZXA7CiAgICAgICAgfQogICAgICAgIHNvdXJjZSArPSAnXFxzXSspJzsKICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChzb3VyY2UsICdnJyk7CiAgICB9CiAgICAvLyBjYXRjaGVzIG51bWJlcnMgKGluY2x1ZGluZyBmbG9hdGluZyBudW1iZXJzKSBpbiB0aGUgZmlyc3QgZ3JvdXAsIGFuZCBhbHBoYW51bSBpbiB0aGUgc2Vjb25kCiAgICBjb25zdCBERUZBVUxUX1dPUkRfUkVHRVhQID0gY3JlYXRlV29yZFJlZ0V4cCgpOwogICAgZnVuY3Rpb24gZW5zdXJlVmFsaWRXb3JkRGVmaW5pdGlvbih3b3JkRGVmaW5pdGlvbikgewogICAgICAgIGxldCByZXN1bHQgPSBERUZBVUxUX1dPUkRfUkVHRVhQOwogICAgICAgIGlmICh3b3JkRGVmaW5pdGlvbiAmJiAod29yZERlZmluaXRpb24gaW5zdGFuY2VvZiBSZWdFeHApKSB7CiAgICAgICAgICAgIGlmICghd29yZERlZmluaXRpb24uZ2xvYmFsKSB7CiAgICAgICAgICAgICAgICBsZXQgZmxhZ3MgPSAnZyc7CiAgICAgICAgICAgICAgICBpZiAod29yZERlZmluaXRpb24uaWdub3JlQ2FzZSkgewogICAgICAgICAgICAgICAgICAgIGZsYWdzICs9ICdpJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh3b3JkRGVmaW5pdGlvbi5tdWx0aWxpbmUpIHsKICAgICAgICAgICAgICAgICAgICBmbGFncyArPSAnbSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAod29yZERlZmluaXRpb24udW5pY29kZSkgewogICAgICAgICAgICAgICAgICAgIGZsYWdzICs9ICd1JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZWdFeHAod29yZERlZmluaXRpb24uc291cmNlLCBmbGFncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSB3b3JkRGVmaW5pdGlvbjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXN1bHQubGFzdEluZGV4ID0gMDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgY29uc3QgX2RlZmF1bHRDb25maWcgPSB7CiAgICAgICAgbWF4TGVuOiAxMDAwLAogICAgICAgIHdpbmRvd1NpemU6IDE1LAogICAgICAgIHRpbWVCdWRnZXQ6IDE1MAogICAgfTsKICAgIGZ1bmN0aW9uIGdldFdvcmRBdFRleHQoY29sdW1uLCB3b3JkRGVmaW5pdGlvbiwgdGV4dCwgdGV4dE9mZnNldCwgY29uZmlnID0gX2RlZmF1bHRDb25maWcpIHsKICAgICAgICBpZiAodGV4dC5sZW5ndGggPiBjb25maWcubWF4TGVuKSB7CiAgICAgICAgICAgIC8vIGRvbid0IHRocm93IHN0cmluZ3MgdGhhdCBsb25nIGF0IHRoZSByZWdleHAKICAgICAgICAgICAgLy8gYnV0IHVzZSBhIHN1Yi1zdHJpbmcgaW4gd2hpY2ggYSB3b3JkIG11c3Qgb2NjdXIKICAgICAgICAgICAgbGV0IHN0YXJ0ID0gY29sdW1uIC0gY29uZmlnLm1heExlbiAvIDI7CiAgICAgICAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRleHRPZmZzZXQgKz0gc3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBjb2x1bW4gKyBjb25maWcubWF4TGVuIC8gMik7CiAgICAgICAgICAgIHJldHVybiBnZXRXb3JkQXRUZXh0KGNvbHVtbiwgd29yZERlZmluaXRpb24sIHRleHQsIHRleHRPZmZzZXQsIGNvbmZpZyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHQxID0gRGF0ZS5ub3coKTsKICAgICAgICBjb25zdCBwb3MgPSBjb2x1bW4gLSAxIC0gdGV4dE9mZnNldDsKICAgICAgICBsZXQgcHJldlJlZ2V4SW5kZXggPSAtMTsKICAgICAgICBsZXQgbWF0Y2ggPSBudWxsOwogICAgICAgIGZvciAobGV0IGkgPSAxOzsgaSsrKSB7CiAgICAgICAgICAgIC8vIGNoZWNrIHRpbWUgYnVkZ2V0CiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gdDEgPj0gY29uZmlnLnRpbWVCdWRnZXQpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBpbmRleCBhdCB3aGljaCB0aGUgcmVnZXhwIHNob3VsZCBzdGFydCBtYXRjaGluZywgYWxzbyBrbm93IHdoZXJlIGl0CiAgICAgICAgICAgIC8vIHNob3VsZCBzdG9wIHNvIHRoYXQgc3Vic2VxdWVudCBzZWFyY2ggZG9uJ3QgcmVwZWF0IHByZXZpb3VzIHNlYXJjaGVzCiAgICAgICAgICAgIGNvbnN0IHJlZ2V4SW5kZXggPSBwb3MgLSBjb25maWcud2luZG93U2l6ZSAqIGk7CiAgICAgICAgICAgIHdvcmREZWZpbml0aW9uLmxhc3RJbmRleCA9IE1hdGgubWF4KDAsIHJlZ2V4SW5kZXgpOwogICAgICAgICAgICBjb25zdCB0aGlzTWF0Y2ggPSBfZmluZFJlZ2V4TWF0Y2hFbmNsb3NpbmdQb3NpdGlvbih3b3JkRGVmaW5pdGlvbiwgdGV4dCwgcG9zLCBwcmV2UmVnZXhJbmRleCk7CiAgICAgICAgICAgIGlmICghdGhpc01hdGNoICYmIG1hdGNoKSB7CiAgICAgICAgICAgICAgICAvLyBzdG9wOiB3ZSBoYXZlIHNvbWV0aGluZwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWF0Y2ggPSB0aGlzTWF0Y2g7CiAgICAgICAgICAgIC8vIHN0b3A6IHNlYXJjaGVkIGF0IHN0YXJ0CiAgICAgICAgICAgIGlmIChyZWdleEluZGV4IDw9IDApIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByZXZSZWdleEluZGV4ID0gcmVnZXhJbmRleDsKICAgICAgICB9CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIGxldCByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICB3b3JkOiBtYXRjaFswXSwKICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiB0ZXh0T2Zmc2V0ICsgMSArIG1hdGNoLmluZGV4LAogICAgICAgICAgICAgICAgZW5kQ29sdW1uOiB0ZXh0T2Zmc2V0ICsgMSArIG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHdvcmREZWZpbml0aW9uLmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gX2ZpbmRSZWdleE1hdGNoRW5jbG9zaW5nUG9zaXRpb24od29yZERlZmluaXRpb24sIHRleHQsIHBvcywgc3RvcFBvcykgewogICAgICAgIGxldCBtYXRjaDsKICAgICAgICB3aGlsZSAobWF0Y2ggPSB3b3JkRGVmaW5pdGlvbi5leGVjKHRleHQpKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoSW5kZXggPSBtYXRjaC5pbmRleCB8fCAwOwogICAgICAgICAgICBpZiAobWF0Y2hJbmRleCA8PSBwb3MgJiYgd29yZERlZmluaXRpb24ubGFzdEluZGV4ID49IHBvcykgewogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHN0b3BQb3MgPiAwICYmIG1hdGNoSW5kZXggPiBzdG9wUG9zKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIC8qKgogICAgICogQSBmYXN0IGNoYXJhY3RlciBjbGFzc2lmaWVyIHRoYXQgdXNlcyBhIGNvbXBhY3QgYXJyYXkgZm9yIEFTQ0lJIHZhbHVlcy4KICAgICAqLwogICAgY2xhc3MgQ2hhcmFjdGVyQ2xhc3NpZmllciB7CiAgICAgICAgY29uc3RydWN0b3IoX2RlZmF1bHRWYWx1ZSkgewogICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gdG9VaW50OChfZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwogICAgICAgICAgICB0aGlzLl9hc2NpaU1hcCA9IENoYXJhY3RlckNsYXNzaWZpZXIuX2NyZWF0ZUFzY2lpTWFwKGRlZmF1bHRWYWx1ZSk7CiAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIF9jcmVhdGVBc2NpaU1hcChkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgICAgbGV0IGFzY2lpTWFwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgICAgICAgICAgYXNjaWlNYXBbaV0gPSBkZWZhdWx0VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFzY2lpTWFwOwogICAgICAgIH0KICAgICAgICBzZXQoY2hhckNvZGUsIF92YWx1ZSkgewogICAgICAgICAgICBsZXQgdmFsdWUgPSB0b1VpbnQ4KF92YWx1ZSk7CiAgICAgICAgICAgIGlmIChjaGFyQ29kZSA+PSAwICYmIGNoYXJDb2RlIDwgMjU2KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hc2NpaU1hcFtjaGFyQ29kZV0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoY2hhckNvZGUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBnZXQoY2hhckNvZGUpIHsKICAgICAgICAgICAgaWYgKGNoYXJDb2RlID49IDAgJiYgY2hhckNvZGUgPCAyNTYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hc2NpaU1hcFtjaGFyQ29kZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuX21hcC5nZXQoY2hhckNvZGUpIHx8IHRoaXMuX2RlZmF1bHRWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjbGFzcyBVaW50OE1hdHJpeCB7CiAgICAgICAgY29uc3RydWN0b3Iocm93cywgY29scywgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShyb3dzICogY29scyk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByb3dzICogY29sczsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBkYXRhW2ldID0gZGVmYXVsdFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhOwogICAgICAgICAgICB0aGlzLnJvd3MgPSByb3dzOwogICAgICAgICAgICB0aGlzLmNvbHMgPSBjb2xzOwogICAgICAgIH0KICAgICAgICBnZXQocm93LCBjb2wpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFbcm93ICogdGhpcy5jb2xzICsgY29sXTsKICAgICAgICB9CiAgICAgICAgc2V0KHJvdywgY29sLCB2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9kYXRhW3JvdyAqIHRoaXMuY29scyArIGNvbF0gPSB2YWx1ZTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBTdGF0ZU1hY2hpbmUgewogICAgICAgIGNvbnN0cnVjdG9yKGVkZ2VzKSB7CiAgICAgICAgICAgIGxldCBtYXhDaGFyQ29kZSA9IDA7CiAgICAgICAgICAgIGxldCBtYXhTdGF0ZSA9IDAgLyogSW52YWxpZCAqLzsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGVkZ2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBsZXQgW2Zyb20sIGNoQ29kZSwgdG9dID0gZWRnZXNbaV07CiAgICAgICAgICAgICAgICBpZiAoY2hDb2RlID4gbWF4Q2hhckNvZGUpIHsKICAgICAgICAgICAgICAgICAgICBtYXhDaGFyQ29kZSA9IGNoQ29kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChmcm9tID4gbWF4U3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICBtYXhTdGF0ZSA9IGZyb207CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodG8gPiBtYXhTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIG1heFN0YXRlID0gdG87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWF4Q2hhckNvZGUrKzsKICAgICAgICAgICAgbWF4U3RhdGUrKzsKICAgICAgICAgICAgbGV0IHN0YXRlcyA9IG5ldyBVaW50OE1hdHJpeChtYXhTdGF0ZSwgbWF4Q2hhckNvZGUsIDAgLyogSW52YWxpZCAqLyk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBlZGdlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgbGV0IFtmcm9tLCBjaENvZGUsIHRvXSA9IGVkZ2VzW2ldOwogICAgICAgICAgICAgICAgc3RhdGVzLnNldChmcm9tLCBjaENvZGUsIHRvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdGF0ZXMgPSBzdGF0ZXM7CiAgICAgICAgICAgIHRoaXMuX21heENoYXJDb2RlID0gbWF4Q2hhckNvZGU7CiAgICAgICAgfQogICAgICAgIG5leHRTdGF0ZShjdXJyZW50U3RhdGUsIGNoQ29kZSkgewogICAgICAgICAgICBpZiAoY2hDb2RlIDwgMCB8fCBjaENvZGUgPj0gdGhpcy5fbWF4Q2hhckNvZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIEludmFsaWQgKi87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5nZXQoY3VycmVudFN0YXRlLCBjaENvZGUpOwogICAgICAgIH0KICAgIH0KICAgIC8vIFN0YXRlIG1hY2hpbmUgZm9yIGh0dHA6Ly8gb3IgaHR0cHM6Ly8gb3IgZmlsZTovLwogICAgbGV0IF9zdGF0ZU1hY2hpbmUgPSBudWxsOwogICAgZnVuY3Rpb24gZ2V0U3RhdGVNYWNoaW5lKCkgewogICAgICAgIGlmIChfc3RhdGVNYWNoaW5lID09PSBudWxsKSB7CiAgICAgICAgICAgIF9zdGF0ZU1hY2hpbmUgPSBuZXcgU3RhdGVNYWNoaW5lKFsKICAgICAgICAgICAgICAgIFsxIC8qIFN0YXJ0ICovLCAxMDQgLyogaCAqLywgMiAvKiBIICovXSwKICAgICAgICAgICAgICAgIFsxIC8qIFN0YXJ0ICovLCA3MiAvKiBIICovLCAyIC8qIEggKi9dLAogICAgICAgICAgICAgICAgWzEgLyogU3RhcnQgKi8sIDEwMiAvKiBmICovLCA2IC8qIEYgKi9dLAogICAgICAgICAgICAgICAgWzEgLyogU3RhcnQgKi8sIDcwIC8qIEYgKi8sIDYgLyogRiAqL10sCiAgICAgICAgICAgICAgICBbMiAvKiBIICovLCAxMTYgLyogdCAqLywgMyAvKiBIVCAqL10sCiAgICAgICAgICAgICAgICBbMiAvKiBIICovLCA4NCAvKiBUICovLCAzIC8qIEhUICovXSwKICAgICAgICAgICAgICAgIFszIC8qIEhUICovLCAxMTYgLyogdCAqLywgNCAvKiBIVFQgKi9dLAogICAgICAgICAgICAgICAgWzMgLyogSFQgKi8sIDg0IC8qIFQgKi8sIDQgLyogSFRUICovXSwKICAgICAgICAgICAgICAgIFs0IC8qIEhUVCAqLywgMTEyIC8qIHAgKi8sIDUgLyogSFRUUCAqL10sCiAgICAgICAgICAgICAgICBbNCAvKiBIVFQgKi8sIDgwIC8qIFAgKi8sIDUgLyogSFRUUCAqL10sCiAgICAgICAgICAgICAgICBbNSAvKiBIVFRQICovLCAxMTUgLyogcyAqLywgOSAvKiBCZWZvcmVDb2xvbiAqL10sCiAgICAgICAgICAgICAgICBbNSAvKiBIVFRQICovLCA4MyAvKiBTICovLCA5IC8qIEJlZm9yZUNvbG9uICovXSwKICAgICAgICAgICAgICAgIFs1IC8qIEhUVFAgKi8sIDU4IC8qIENvbG9uICovLCAxMCAvKiBBZnRlckNvbG9uICovXSwKICAgICAgICAgICAgICAgIFs2IC8qIEYgKi8sIDEwNSAvKiBpICovLCA3IC8qIEZJICovXSwKICAgICAgICAgICAgICAgIFs2IC8qIEYgKi8sIDczIC8qIEkgKi8sIDcgLyogRkkgKi9dLAogICAgICAgICAgICAgICAgWzcgLyogRkkgKi8sIDEwOCAvKiBsICovLCA4IC8qIEZJTCAqL10sCiAgICAgICAgICAgICAgICBbNyAvKiBGSSAqLywgNzYgLyogTCAqLywgOCAvKiBGSUwgKi9dLAogICAgICAgICAgICAgICAgWzggLyogRklMICovLCAxMDEgLyogZSAqLywgOSAvKiBCZWZvcmVDb2xvbiAqL10sCiAgICAgICAgICAgICAgICBbOCAvKiBGSUwgKi8sIDY5IC8qIEUgKi8sIDkgLyogQmVmb3JlQ29sb24gKi9dLAogICAgICAgICAgICAgICAgWzkgLyogQmVmb3JlQ29sb24gKi8sIDU4IC8qIENvbG9uICovLCAxMCAvKiBBZnRlckNvbG9uICovXSwKICAgICAgICAgICAgICAgIFsxMCAvKiBBZnRlckNvbG9uICovLCA0NyAvKiBTbGFzaCAqLywgMTEgLyogQWxtb3N0VGhlcmUgKi9dLAogICAgICAgICAgICAgICAgWzExIC8qIEFsbW9zdFRoZXJlICovLCA0NyAvKiBTbGFzaCAqLywgMTIgLyogRW5kICovXSwKICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfc3RhdGVNYWNoaW5lOwogICAgfQogICAgbGV0IF9jbGFzc2lmaWVyID0gbnVsbDsKICAgIGZ1bmN0aW9uIGdldENsYXNzaWZpZXIoKSB7CiAgICAgICAgaWYgKF9jbGFzc2lmaWVyID09PSBudWxsKSB7CiAgICAgICAgICAgIF9jbGFzc2lmaWVyID0gbmV3IENoYXJhY3RlckNsYXNzaWZpZXIoMCAvKiBOb25lICovKTsKICAgICAgICAgICAgLy8gYWxsb3ctYW55LXVuaWNvZGUtbmV4dC1saW5lCiAgICAgICAgICAgIGNvbnN0IEZPUkNFX1RFUk1JTkFUSU9OX0NIQVJBQ1RFUlMgPSAnIFx0PD5cJ1wi44CB44CC772h772k77yM77yO77ya77yb4oCY44CI44CM44CO44CU77yI77y7772b772i772j772d77y977yJ44CV44CP44CN44CJ4oCZ772A772e4oCmJzsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBGT1JDRV9URVJNSU5BVElPTl9DSEFSQUNURVJTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBfY2xhc3NpZmllci5zZXQoRk9SQ0VfVEVSTUlOQVRJT05fQ0hBUkFDVEVSUy5jaGFyQ29kZUF0KGkpLCAxIC8qIEZvcmNlVGVybWluYXRpb24gKi8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IENBTk5PVF9FTkRfV0lUSF9DSEFSQUNURVJTID0gJy4sOyc7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ0FOTk9UX0VORF9XSVRIX0NIQVJBQ1RFUlMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIF9jbGFzc2lmaWVyLnNldChDQU5OT1RfRU5EX1dJVEhfQ0hBUkFDVEVSUy5jaGFyQ29kZUF0KGkpLCAyIC8qIENhbm5vdEVuZEluICovKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX2NsYXNzaWZpZXI7CiAgICB9CiAgICBjbGFzcyBMaW5rQ29tcHV0ZXIgewogICAgICAgIHN0YXRpYyBfY3JlYXRlTGluayhjbGFzc2lmaWVyLCBsaW5lLCBsaW5lTnVtYmVyLCBsaW5rQmVnaW5JbmRleCwgbGlua0VuZEluZGV4KSB7CiAgICAgICAgICAgIC8vIERvIG5vdCBhbGxvdyB0byBlbmQgbGluayBpbiBjZXJ0YWluIGNoYXJhY3RlcnMuLi4KICAgICAgICAgICAgbGV0IGxhc3RJbmNsdWRlZENoYXJJbmRleCA9IGxpbmtFbmRJbmRleCAtIDE7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoQ29kZSA9IGxpbmUuY2hhckNvZGVBdChsYXN0SW5jbHVkZWRDaGFySW5kZXgpOwogICAgICAgICAgICAgICAgY29uc3QgY2hDbGFzcyA9IGNsYXNzaWZpZXIuZ2V0KGNoQ29kZSk7CiAgICAgICAgICAgICAgICBpZiAoY2hDbGFzcyAhPT0gMiAvKiBDYW5ub3RFbmRJbiAqLykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGFzdEluY2x1ZGVkQ2hhckluZGV4LS07CiAgICAgICAgICAgIH0gd2hpbGUgKGxhc3RJbmNsdWRlZENoYXJJbmRleCA+IGxpbmtCZWdpbkluZGV4KTsKICAgICAgICAgICAgLy8gSGFuZGxlIGxpbmtzIGVuY2xvc2VkIGluIHBhcmVucywgc3F1YXJlIGJyYWNrZXRzIGFuZCBjdXJseXMuCiAgICAgICAgICAgIGlmIChsaW5rQmVnaW5JbmRleCA+IDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlQmVmb3JlTGluayA9IGxpbmUuY2hhckNvZGVBdChsaW5rQmVnaW5JbmRleCAtIDEpOwogICAgICAgICAgICAgICAgY29uc3QgbGFzdENoYXJDb2RlSW5MaW5rID0gbGluZS5jaGFyQ29kZUF0KGxhc3RJbmNsdWRlZENoYXJJbmRleCk7CiAgICAgICAgICAgICAgICBpZiAoKGNoYXJDb2RlQmVmb3JlTGluayA9PT0gNDAgLyogT3BlblBhcmVuICovICYmIGxhc3RDaGFyQ29kZUluTGluayA9PT0gNDEgLyogQ2xvc2VQYXJlbiAqLykKICAgICAgICAgICAgICAgICAgICB8fCAoY2hhckNvZGVCZWZvcmVMaW5rID09PSA5MSAvKiBPcGVuU3F1YXJlQnJhY2tldCAqLyAmJiBsYXN0Q2hhckNvZGVJbkxpbmsgPT09IDkzIC8qIENsb3NlU3F1YXJlQnJhY2tldCAqLykKICAgICAgICAgICAgICAgICAgICB8fCAoY2hhckNvZGVCZWZvcmVMaW5rID09PSAxMjMgLyogT3BlbkN1cmx5QnJhY2UgKi8gJiYgbGFzdENoYXJDb2RlSW5MaW5rID09PSAxMjUgLyogQ2xvc2VDdXJseUJyYWNlICovKSkgewogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBlbmQgaW4gKSBpZiAoIGlzIGJlZm9yZSB0aGUgbGluayBzdGFydAogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBlbmQgaW4gXSBpZiBbIGlzIGJlZm9yZSB0aGUgbGluayBzdGFydAogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBlbmQgaW4gfSBpZiB7IGlzIGJlZm9yZSB0aGUgbGluayBzdGFydAogICAgICAgICAgICAgICAgICAgIGxhc3RJbmNsdWRlZENoYXJJbmRleC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICByYW5nZTogewogICAgICAgICAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogbGluZU51bWJlciwKICAgICAgICAgICAgICAgICAgICBzdGFydENvbHVtbjogbGlua0JlZ2luSW5kZXggKyAxLAogICAgICAgICAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6IGxpbmVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgZW5kQ29sdW1uOiBsYXN0SW5jbHVkZWRDaGFySW5kZXggKyAyCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdXJsOiBsaW5lLnN1YnN0cmluZyhsaW5rQmVnaW5JbmRleCwgbGFzdEluY2x1ZGVkQ2hhckluZGV4ICsgMSkKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGNvbXB1dGVMaW5rcyhtb2RlbCwgc3RhdGVNYWNoaW5lID0gZ2V0U3RhdGVNYWNoaW5lKCkpIHsKICAgICAgICAgICAgY29uc3QgY2xhc3NpZmllciA9IGdldENsYXNzaWZpZXIoKTsKICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFtdOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMSwgbGluZUNvdW50ID0gbW9kZWwuZ2V0TGluZUNvdW50KCk7IGkgPD0gbGluZUNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBtb2RlbC5nZXRMaW5lQ29udGVudChpKTsKICAgICAgICAgICAgICAgIGNvbnN0IGxlbiA9IGxpbmUubGVuZ3RoOwogICAgICAgICAgICAgICAgbGV0IGogPSAwOwogICAgICAgICAgICAgICAgbGV0IGxpbmtCZWdpbkluZGV4ID0gMDsKICAgICAgICAgICAgICAgIGxldCBsaW5rQmVnaW5DaENvZGUgPSAwOwogICAgICAgICAgICAgICAgbGV0IHN0YXRlID0gMSAvKiBTdGFydCAqLzsKICAgICAgICAgICAgICAgIGxldCBoYXNPcGVuUGFyZW5zID0gZmFsc2U7CiAgICAgICAgICAgICAgICBsZXQgaGFzT3BlblNxdWFyZUJyYWNrZXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGxldCBpblNxdWFyZUJyYWNrZXRzID0gZmFsc2U7CiAgICAgICAgICAgICAgICBsZXQgaGFzT3BlbkN1cmx5QnJhY2tldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4pIHsKICAgICAgICAgICAgICAgICAgICBsZXQgcmVzZXRTdGF0ZU1hY2hpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaENvZGUgPSBsaW5lLmNoYXJDb2RlQXQoaik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSAxMyAvKiBBY2NlcHQgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoQ2xhc3M7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2hDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwIC8qIE9wZW5QYXJlbiAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPcGVuUGFyZW5zID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gMCAvKiBOb25lICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MSAvKiBDbG9zZVBhcmVuICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAoaGFzT3BlblBhcmVucyA/IDAgLyogTm9uZSAqLyA6IDEgLyogRm9yY2VUZXJtaW5hdGlvbiAqLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDkxIC8qIE9wZW5TcXVhcmVCcmFja2V0ICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3F1YXJlQnJhY2tldHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09wZW5TcXVhcmVCcmFja2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gMCAvKiBOb25lICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5MyAvKiBDbG9zZVNxdWFyZUJyYWNrZXQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TcXVhcmVCcmFja2V0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAoaGFzT3BlblNxdWFyZUJyYWNrZXQgPyAwIC8qIE5vbmUgKi8gOiAxIC8qIEZvcmNlVGVybWluYXRpb24gKi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjMgLyogT3BlbkN1cmx5QnJhY2UgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3BlbkN1cmx5QnJhY2tldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IDAgLyogTm9uZSAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI1IC8qIENsb3NlQ3VybHlCcmFjZSAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gKGhhc09wZW5DdXJseUJyYWNrZXQgPyAwIC8qIE5vbmUgKi8gOiAxIC8qIEZvcmNlVGVybWluYXRpb24gKi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyB0aHJlZSBydWxlcyBtYWtlIGl0IHRoYXQgJyBvciAiIG9yIGAgYXJlIGFsbG93ZWQgaW5zaWRlIGxpbmtzIGlmIHRoZSBsaW5rIGJlZ2FuIHdpdGggYSBkaWZmZXJlbnQgb25lICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM5IC8qIFNpbmdsZVF1b3RlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAobGlua0JlZ2luQ2hDb2RlID09PSAzNCAvKiBEb3VibGVRdW90ZSAqLyB8fCBsaW5rQmVnaW5DaENvZGUgPT09IDk2IC8qIEJhY2tUaWNrICovKSA/IDAgLyogTm9uZSAqLyA6IDEgLyogRm9yY2VUZXJtaW5hdGlvbiAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQgLyogRG91YmxlUXVvdGUgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IChsaW5rQmVnaW5DaENvZGUgPT09IDM5IC8qIFNpbmdsZVF1b3RlICovIHx8IGxpbmtCZWdpbkNoQ29kZSA9PT0gOTYgLyogQmFja1RpY2sgKi8pID8gMCAvKiBOb25lICovIDogMSAvKiBGb3JjZVRlcm1pbmF0aW9uICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5NiAvKiBCYWNrVGljayAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gKGxpbmtCZWdpbkNoQ29kZSA9PT0gMzkgLyogU2luZ2xlUXVvdGUgKi8gfHwgbGlua0JlZ2luQ2hDb2RlID09PSAzNCAvKiBEb3VibGVRdW90ZSAqLykgPyAwIC8qIE5vbmUgKi8gOiAxIC8qIEZvcmNlVGVybWluYXRpb24gKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQyIC8qIEFzdGVyaXNrICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGAqYCB0ZXJtaW5hdGVzIGEgbGluayBpZiB0aGUgbGluayBiZWdhbiB3aXRoIGAqYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAobGlua0JlZ2luQ2hDb2RlID09PSA0MiAvKiBBc3RlcmlzayAqLykgPyAxIC8qIEZvcmNlVGVybWluYXRpb24gKi8gOiAwIC8qIE5vbmUgKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNCAvKiBQaXBlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB8YCB0ZXJtaW5hdGVzIGEgbGluayBpZiB0aGUgbGluayBiZWdhbiB3aXRoIGB8YAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAobGlua0JlZ2luQ2hDb2RlID09PSAxMjQgLyogUGlwZSAqLykgPyAxIC8qIEZvcmNlVGVybWluYXRpb24gKi8gOiAwIC8qIE5vbmUgKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyIC8qIFNwYWNlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGAgYCBhbGxvdyBzcGFjZSBpbiBiZXR3ZWVuIFsgYW5kIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gKGluU3F1YXJlQnJhY2tldHMgPyAwIC8qIE5vbmUgKi8gOiAxIC8qIEZvcmNlVGVybWluYXRpb24gKi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gY2xhc3NpZmllci5nZXQoY2hDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBjaGFyYWN0ZXIgdGVybWluYXRlcyBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaENsYXNzID09PSAxIC8qIEZvcmNlVGVybWluYXRpb24gKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKExpbmtDb21wdXRlci5fY3JlYXRlTGluayhjbGFzc2lmaWVyLCBsaW5lLCBpLCBsaW5rQmVnaW5JbmRleCwgaikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRTdGF0ZU1hY2hpbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09PSAxMiAvKiBFbmQgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoQ2xhc3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaENvZGUgPT09IDkxIC8qIE9wZW5TcXVhcmVCcmFja2V0ICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgdGhlIGF1dGhvcml0eSBwYXJ0IHRvIGNvbnRhaW4gaXB2NiBhZGRyZXNzZXMgd2hpY2ggY29udGFpbiBbIGFuZCBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPcGVuU3F1YXJlQnJhY2tldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gMCAvKiBOb25lICovOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IGNsYXNzaWZpZXIuZ2V0KGNoQ29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY2hhcmFjdGVyIHRlcm1pbmF0ZXMgbGluawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hDbGFzcyA9PT0gMSAvKiBGb3JjZVRlcm1pbmF0aW9uICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldFN0YXRlTWFjaGluZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDEzIC8qIEFjY2VwdCAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZU1hY2hpbmUubmV4dFN0YXRlKHN0YXRlLCBjaENvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IDAgLyogSW52YWxpZCAqLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRTdGF0ZU1hY2hpbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyZXNldFN0YXRlTWFjaGluZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDEgLyogU3RhcnQgKi87CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09wZW5QYXJlbnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3BlblNxdWFyZUJyYWNrZXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3BlbkN1cmx5QnJhY2tldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvcmQgd2hlcmUgdGhlIGxpbmsgc3RhcnRlZAogICAgICAgICAgICAgICAgICAgICAgICBsaW5rQmVnaW5JbmRleCA9IGogKyAxOwogICAgICAgICAgICAgICAgICAgICAgICBsaW5rQmVnaW5DaENvZGUgPSBjaENvZGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMTMgLyogQWNjZXB0ICovKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goTGlua0NvbXB1dGVyLl9jcmVhdGVMaW5rKGNsYXNzaWZpZXIsIGxpbmUsIGksIGxpbmtCZWdpbkluZGV4LCBsZW4pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgbGlua3MgY29udGFpbnMgaW4gdGhlIHByb3ZpZGVkCiAgICAgKiBkb2N1bWVudC4gKk5vdGUqIHRoYXQgdGhpcyBvcGVyYXRpb24gaXMgY29tcHV0YXRpb25hbAogICAgICogZXhwZW5zaXZlIGFuZCBzaG91bGQgbm90IHJ1biBpbiB0aGUgVUkgdGhyZWFkLgogICAgICovCiAgICBmdW5jdGlvbiBjb21wdXRlTGlua3MobW9kZWwpIHsKICAgICAgICBpZiAoIW1vZGVsIHx8IHR5cGVvZiBtb2RlbC5nZXRMaW5lQ291bnQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIG1vZGVsLmdldExpbmVDb250ZW50ICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIC8vIFVua25vd24gY2FsbGVyIQogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQogICAgICAgIHJldHVybiBMaW5rQ29tcHV0ZXIuY29tcHV0ZUxpbmtzKG1vZGVsKTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNsYXNzIEJhc2ljSW5wbGFjZVJlcGxhY2UgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLl9kZWZhdWx0VmFsdWVTZXQgPSBbCiAgICAgICAgICAgICAgICBbJ3RydWUnLCAnZmFsc2UnXSwKICAgICAgICAgICAgICAgIFsnVHJ1ZScsICdGYWxzZSddLAogICAgICAgICAgICAgICAgWydQcml2YXRlJywgJ1B1YmxpYycsICdGcmllbmQnLCAnUmVhZE9ubHknLCAnUGFydGlhbCcsICdQcm90ZWN0ZWQnLCAnV3JpdGVPbmx5J10sCiAgICAgICAgICAgICAgICBbJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZSddLAogICAgICAgICAgICBdOwogICAgICAgIH0KICAgICAgICBuYXZpZ2F0ZVZhbHVlU2V0KHJhbmdlMSwgdGV4dDEsIHJhbmdlMiwgdGV4dDIsIHVwKSB7CiAgICAgICAgICAgIGlmIChyYW5nZTEgJiYgdGV4dDEpIHsKICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmRvTmF2aWdhdGVWYWx1ZVNldCh0ZXh0MSwgdXApOwogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlOiByYW5nZTEsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyYW5nZTIgJiYgdGV4dDIpIHsKICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmRvTmF2aWdhdGVWYWx1ZVNldCh0ZXh0MiwgdXApOwogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlOiByYW5nZTIsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBkb05hdmlnYXRlVmFsdWVTZXQodGV4dCwgdXApIHsKICAgICAgICAgICAgbGV0IG51bWJlclJlc3VsdCA9IHRoaXMubnVtYmVyUmVwbGFjZSh0ZXh0LCB1cCk7CiAgICAgICAgICAgIGlmIChudW1iZXJSZXN1bHQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJSZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dFJlcGxhY2UodGV4dCwgdXApOwogICAgICAgIH0KICAgICAgICBudW1iZXJSZXBsYWNlKHZhbHVlLCB1cCkgewogICAgICAgICAgICBsZXQgcHJlY2lzaW9uID0gTWF0aC5wb3coMTAsIHZhbHVlLmxlbmd0aCAtICh2YWx1ZS5sYXN0SW5kZXhPZignLicpICsgMSkpOwogICAgICAgICAgICBsZXQgbjEgPSBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICBsZXQgbjIgPSBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgICAgICAgaWYgKCFpc05hTihuMSkgJiYgIWlzTmFOKG4yKSAmJiBuMSA9PT0gbjIpIHsKICAgICAgICAgICAgICAgIGlmIChuMSA9PT0gMCAmJiAhdXApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gZG9uJ3QgZG8gbmVnYXRpdmUKICAgICAgICAgICAgICAgICAgICAvLwkJCX0gZWxzZSBpZihuMSA9PT0gOSAmJiB1cCkgewogICAgICAgICAgICAgICAgICAgIC8vCQkJCXJldHVybiBudWxsOyAvLyBkb24ndCBpbnNlcnQgMTAgaW50byBhIG51bWJlcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbjEgPSBNYXRoLmZsb29yKG4xICogcHJlY2lzaW9uKTsKICAgICAgICAgICAgICAgICAgICBuMSArPSB1cCA/IHByZWNpc2lvbiA6IC1wcmVjaXNpb247CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhuMSAvIHByZWNpc2lvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHRleHRSZXBsYWNlKHZhbHVlLCB1cCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVNldHNSZXBsYWNlKHRoaXMuX2RlZmF1bHRWYWx1ZVNldCwgdmFsdWUsIHVwKTsKICAgICAgICB9CiAgICAgICAgdmFsdWVTZXRzUmVwbGFjZSh2YWx1ZVNldHMsIHZhbHVlLCB1cCkgewogICAgICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHZhbHVlU2V0cy5sZW5ndGg7IHJlc3VsdCA9PT0gbnVsbCAmJiBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMudmFsdWVTZXRSZXBsYWNlKHZhbHVlU2V0c1tpXSwgdmFsdWUsIHVwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YWx1ZVNldFJlcGxhY2UodmFsdWVTZXQsIHZhbHVlLCB1cCkgewogICAgICAgICAgICBsZXQgaWR4ID0gdmFsdWVTZXQuaW5kZXhPZih2YWx1ZSk7CiAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgICAgICAgaWR4ICs9IHVwID8gKzEgOiAtMTsKICAgICAgICAgICAgICAgIGlmIChpZHggPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWR4ID0gdmFsdWVTZXQubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlkeCAlPSB2YWx1ZVNldC5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVTZXRbaWR4XTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICBCYXNpY0lucGxhY2VSZXBsYWNlLklOU1RBTkNFID0gbmV3IEJhc2ljSW5wbGFjZVJlcGxhY2UoKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNvbnN0IHNob3J0Y3V0RXZlbnQgPSBPYmplY3QuZnJlZXplKGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkgewogICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2suYmluZChjb250ZXh0KSwgMCk7CiAgICAgICAgcmV0dXJuIHsgZGlzcG9zZSgpIHsgY2xlYXJUaW1lb3V0KGhhbmRsZSk7IH0gfTsKICAgIH0pOwogICAgdmFyIENhbmNlbGxhdGlvblRva2VuOwogICAgKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25Ub2tlbikgewogICAgICAgIGZ1bmN0aW9uIGlzQ2FuY2VsbGF0aW9uVG9rZW4odGhpbmcpIHsKICAgICAgICAgICAgaWYgKHRoaW5nID09PSBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lIHx8IHRoaW5nID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGluZyB8fCB0eXBlb2YgdGhpbmcgIT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGluZy5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCA9PT0gJ2Jvb2xlYW4nCiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgdGhpbmcub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQgPT09ICdmdW5jdGlvbic7CiAgICAgICAgfQogICAgICAgIENhbmNlbGxhdGlvblRva2VuLmlzQ2FuY2VsbGF0aW9uVG9rZW4gPSBpc0NhbmNlbGxhdGlvblRva2VuOwogICAgICAgIENhbmNlbGxhdGlvblRva2VuLk5vbmUgPSBPYmplY3QuZnJlZXplKHsKICAgICAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGZhbHNlLAogICAgICAgICAgICBvbkNhbmNlbGxhdGlvblJlcXVlc3RlZDogRXZlbnQuTm9uZQogICAgICAgIH0pOwogICAgICAgIENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZCA9IE9iamVjdC5mcmVlemUoewogICAgICAgICAgICBpc0NhbmNlbGxhdGlvblJlcXVlc3RlZDogdHJ1ZSwKICAgICAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHNob3J0Y3V0RXZlbnQKICAgICAgICB9KTsKICAgIH0pKENhbmNlbGxhdGlvblRva2VuIHx8IChDYW5jZWxsYXRpb25Ub2tlbiA9IHt9KSk7CiAgICBjbGFzcyBNdXRhYmxlVG9rZW4gewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9lbWl0dGVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgY2FuY2VsKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2lzQ2FuY2VsbGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZW1pdHRlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZmlyZSh1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdldCBpc0NhbmNlbGxhdGlvblJlcXVlc3RlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzQ2FuY2VsbGVkOwogICAgICAgIH0KICAgICAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc0NhbmNlbGxlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNob3J0Y3V0RXZlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLl9lbWl0dGVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZW1pdHRlci5ldmVudDsKICAgICAgICB9CiAgICAgICAgZGlzcG9zZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7CiAgICAgICAgY29uc3RydWN0b3IocGFyZW50KSB7CiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gdW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLl9wYXJlbnRMaXN0ZW5lciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdGhpcy5fcGFyZW50TGlzdGVuZXIgPSBwYXJlbnQgJiYgcGFyZW50Lm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKHRoaXMuY2FuY2VsLCB0aGlzKTsKICAgICAgICB9CiAgICAgICAgZ2V0IHRva2VuKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7CiAgICAgICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlbgogICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkCiAgICAgICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47CiAgICAgICAgfQogICAgICAgIGNhbmNlbCgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl90b2tlbikgewogICAgICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0CiAgICAgICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVucwogICAgICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuCiAgICAgICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikgewogICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgY2FuY2VsCiAgICAgICAgICAgICAgICB0aGlzLl90b2tlbi5jYW5jZWwoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkaXNwb3NlKGNhbmNlbCA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmIChjYW5jZWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnRMaXN0ZW5lci5kaXNwb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLl90b2tlbikgewogICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRvIGluaXRpYWxpemUgd2l0aCBhbiBlbXB0eSB0b2tlbiBpZiB3ZSBoYWQgbm9uZQogICAgICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3Rva2VuIGluc3RhbmNlb2YgTXV0YWJsZVRva2VuKSB7CiAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSBkaXNwb3NlCiAgICAgICAgICAgICAgICB0aGlzLl90b2tlbi5kaXNwb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjbGFzcyBLZXlDb2RlU3RyTWFwIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5fa2V5Q29kZVRvU3RyID0gW107CiAgICAgICAgICAgIHRoaXMuX3N0clRvS2V5Q29kZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIGRlZmluZShrZXlDb2RlLCBzdHIpIHsKICAgICAgICAgICAgdGhpcy5fa2V5Q29kZVRvU3RyW2tleUNvZGVdID0gc3RyOwogICAgICAgICAgICB0aGlzLl9zdHJUb0tleUNvZGVbc3RyLnRvTG93ZXJDYXNlKCldID0ga2V5Q29kZTsKICAgICAgICB9CiAgICAgICAga2V5Q29kZVRvU3RyKGtleUNvZGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2tleUNvZGVUb1N0cltrZXlDb2RlXTsKICAgICAgICB9CiAgICAgICAgc3RyVG9LZXlDb2RlKHN0cikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyVG9LZXlDb2RlW3N0ci50b0xvd2VyQ2FzZSgpXSB8fCAwIC8qIFVua25vd24gKi87CiAgICAgICAgfQogICAgfQogICAgY29uc3QgdWlNYXAgPSBuZXcgS2V5Q29kZVN0ck1hcCgpOwogICAgY29uc3QgdXNlclNldHRpbmdzVVNNYXAgPSBuZXcgS2V5Q29kZVN0ck1hcCgpOwogICAgY29uc3QgdXNlclNldHRpbmdzR2VuZXJhbE1hcCA9IG5ldyBLZXlDb2RlU3RyTWFwKCk7CiAgICBjb25zdCBFVkVOVF9LRVlfQ09ERV9NQVAgPSBuZXcgQXJyYXkoMjMwKTsKICAgIGNvbnN0IE5BVElWRV9XSU5ET1dTX0tFWV9DT0RFX1RPX0tFWV9DT0RFID0ge307CiAgICBjb25zdCBzY2FuQ29kZUludFRvU3RyID0gW107CiAgICBjb25zdCBzY2FuQ29kZVN0clRvSW50ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IHNjYW5Db2RlTG93ZXJDYXNlU3RyVG9JbnQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgLyoqCiAgICAgKiAtMSBpZiBhIFNjYW5Db2RlID0+IEtleUNvZGUgbWFwcGluZyBkZXBlbmRzIG9uIGtiIGxheW91dC4KICAgICAqLwogICAgY29uc3QgSU1NVVRBQkxFX0NPREVfVE9fS0VZX0NPREUgPSBbXTsKICAgIC8qKgogICAgICogLTEgaWYgYSBLZXlDb2RlID0+IFNjYW5Db2RlIG1hcHBpbmcgZGVwZW5kcyBvbiBrYiBsYXlvdXQuCiAgICAgKi8KICAgIGNvbnN0IElNTVVUQUJMRV9LRVlfQ09ERV9UT19DT0RFID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAxOTMgLyogTUFYX1ZBTFVFICovOyBpKyspIHsKICAgICAgICBJTU1VVEFCTEVfQ09ERV9UT19LRVlfQ09ERVtpXSA9IC0xIC8qIERlcGVuZHNPbktiTGF5b3V0ICovOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTI2IC8qIE1BWF9WQUxVRSAqLzsgaSsrKSB7CiAgICAgICAgSU1NVVRBQkxFX0tFWV9DT0RFX1RPX0NPREVbaV0gPSAtMSAvKiBEZXBlbmRzT25LYkxheW91dCAqLzsKICAgIH0KICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gU2VlIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2RkMzc1NzMxKHY9dnMuODUpLmFzcHgKICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9ub2RlLW5hdGl2ZS1rZXltYXAvYmxvYi9tYXN0ZXIvZGVwcy9jaHJvbWl1bS9rZXlib2FyZF9jb2Rlc193aW4uaAogICAgICAgIGNvbnN0IGVtcHR5ID0gJyc7CiAgICAgICAgY29uc3QgbWFwcGluZ3MgPSBbCiAgICAgICAgICAgIC8vIGtleUNvZGVPcmQsIGltbXV0YWJsZSwgc2NhbkNvZGUsIHNjYW5Db2RlU3RyLCBrZXlDb2RlLCBrZXlDb2RlU3RyLCBldmVudEtleUNvZGUsIHZrZXksIHVzVXNlclNldHRpbmdzTGFiZWwsIGdlbmVyYWxVc2VyU2V0dGluZ3NMYWJlbAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCAnTm9uZScsIDAgLyogVW5rbm93biAqLywgJ3Vua25vd24nLCAwLCAnVktfVU5LTk9XTicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxIC8qIEh5cGVyICovLCAnSHlwZXInLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDIgLyogU3VwZXIgKi8sICdTdXBlcicsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMyAvKiBGbiAqLywgJ0ZuJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCA0IC8qIEZuTG9jayAqLywgJ0ZuTG9jaycsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgNSAvKiBTdXNwZW5kICovLCAnU3VzcGVuZCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgNiAvKiBSZXN1bWUgKi8sICdSZXN1bWUnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDcgLyogVHVyYm8gKi8sICdUdXJibycsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgOCAvKiBTbGVlcCAqLywgJ1NsZWVwJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX1NMRUVQJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDkgLyogV2FrZVVwICovLCAnV2FrZVVwJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszMSwgMCwgMTAgLyogS2V5QSAqLywgJ0tleUEnLCAzMSAvKiBLZXlBICovLCAnQScsIDY1LCAnVktfQScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszMiwgMCwgMTEgLyogS2V5QiAqLywgJ0tleUInLCAzMiAvKiBLZXlCICovLCAnQicsIDY2LCAnVktfQicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszMywgMCwgMTIgLyogS2V5QyAqLywgJ0tleUMnLCAzMyAvKiBLZXlDICovLCAnQycsIDY3LCAnVktfQycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszNCwgMCwgMTMgLyogS2V5RCAqLywgJ0tleUQnLCAzNCAvKiBLZXlEICovLCAnRCcsIDY4LCAnVktfRCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszNSwgMCwgMTQgLyogS2V5RSAqLywgJ0tleUUnLCAzNSAvKiBLZXlFICovLCAnRScsIDY5LCAnVktfRScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszNiwgMCwgMTUgLyogS2V5RiAqLywgJ0tleUYnLCAzNiAvKiBLZXlGICovLCAnRicsIDcwLCAnVktfRicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszNywgMCwgMTYgLyogS2V5RyAqLywgJ0tleUcnLCAzNyAvKiBLZXlHICovLCAnRycsIDcxLCAnVktfRycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszOCwgMCwgMTcgLyogS2V5SCAqLywgJ0tleUgnLCAzOCAvKiBLZXlIICovLCAnSCcsIDcyLCAnVktfSCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszOSwgMCwgMTggLyogS2V5SSAqLywgJ0tleUknLCAzOSAvKiBLZXlJICovLCAnSScsIDczLCAnVktfSScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0MCwgMCwgMTkgLyogS2V5SiAqLywgJ0tleUonLCA0MCAvKiBLZXlKICovLCAnSicsIDc0LCAnVktfSicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0MSwgMCwgMjAgLyogS2V5SyAqLywgJ0tleUsnLCA0MSAvKiBLZXlLICovLCAnSycsIDc1LCAnVktfSycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0MiwgMCwgMjEgLyogS2V5TCAqLywgJ0tleUwnLCA0MiAvKiBLZXlMICovLCAnTCcsIDc2LCAnVktfTCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0MywgMCwgMjIgLyogS2V5TSAqLywgJ0tleU0nLCA0MyAvKiBLZXlNICovLCAnTScsIDc3LCAnVktfTScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0NCwgMCwgMjMgLyogS2V5TiAqLywgJ0tleU4nLCA0NCAvKiBLZXlOICovLCAnTicsIDc4LCAnVktfTicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0NSwgMCwgMjQgLyogS2V5TyAqLywgJ0tleU8nLCA0NSAvKiBLZXlPICovLCAnTycsIDc5LCAnVktfTycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0NiwgMCwgMjUgLyogS2V5UCAqLywgJ0tleVAnLCA0NiAvKiBLZXlQICovLCAnUCcsIDgwLCAnVktfUCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0NywgMCwgMjYgLyogS2V5USAqLywgJ0tleVEnLCA0NyAvKiBLZXlRICovLCAnUScsIDgxLCAnVktfUScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0OCwgMCwgMjcgLyogS2V5UiAqLywgJ0tleVInLCA0OCAvKiBLZXlSICovLCAnUicsIDgyLCAnVktfUicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0OSwgMCwgMjggLyogS2V5UyAqLywgJ0tleVMnLCA0OSAvKiBLZXlTICovLCAnUycsIDgzLCAnVktfUycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1MCwgMCwgMjkgLyogS2V5VCAqLywgJ0tleVQnLCA1MCAvKiBLZXlUICovLCAnVCcsIDg0LCAnVktfVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1MSwgMCwgMzAgLyogS2V5VSAqLywgJ0tleVUnLCA1MSAvKiBLZXlVICovLCAnVScsIDg1LCAnVktfVScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1MiwgMCwgMzEgLyogS2V5ViAqLywgJ0tleVYnLCA1MiAvKiBLZXlWICovLCAnVicsIDg2LCAnVktfVicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1MywgMCwgMzIgLyogS2V5VyAqLywgJ0tleVcnLCA1MyAvKiBLZXlXICovLCAnVycsIDg3LCAnVktfVycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1NCwgMCwgMzMgLyogS2V5WCAqLywgJ0tleVgnLCA1NCAvKiBLZXlYICovLCAnWCcsIDg4LCAnVktfWCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1NSwgMCwgMzQgLyogS2V5WSAqLywgJ0tleVknLCA1NSAvKiBLZXlZICovLCAnWScsIDg5LCAnVktfWScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1NiwgMCwgMzUgLyogS2V5WiAqLywgJ0tleVonLCA1NiAvKiBLZXlaICovLCAnWicsIDkwLCAnVktfWicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsyMiwgMCwgMzYgLyogRGlnaXQxICovLCAnRGlnaXQxJywgMjIgLyogRGlnaXQxICovLCAnMScsIDQ5LCAnVktfMScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsyMywgMCwgMzcgLyogRGlnaXQyICovLCAnRGlnaXQyJywgMjMgLyogRGlnaXQyICovLCAnMicsIDUwLCAnVktfMicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsyNCwgMCwgMzggLyogRGlnaXQzICovLCAnRGlnaXQzJywgMjQgLyogRGlnaXQzICovLCAnMycsIDUxLCAnVktfMycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsyNSwgMCwgMzkgLyogRGlnaXQ0ICovLCAnRGlnaXQ0JywgMjUgLyogRGlnaXQ0ICovLCAnNCcsIDUyLCAnVktfNCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsyNiwgMCwgNDAgLyogRGlnaXQ1ICovLCAnRGlnaXQ1JywgMjYgLyogRGlnaXQ1ICovLCAnNScsIDUzLCAnVktfNScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsyNywgMCwgNDEgLyogRGlnaXQ2ICovLCAnRGlnaXQ2JywgMjcgLyogRGlnaXQ2ICovLCAnNicsIDU0LCAnVktfNicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsyOCwgMCwgNDIgLyogRGlnaXQ3ICovLCAnRGlnaXQ3JywgMjggLyogRGlnaXQ3ICovLCAnNycsIDU1LCAnVktfNycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsyOSwgMCwgNDMgLyogRGlnaXQ4ICovLCAnRGlnaXQ4JywgMjkgLyogRGlnaXQ4ICovLCAnOCcsIDU2LCAnVktfOCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszMCwgMCwgNDQgLyogRGlnaXQ5ICovLCAnRGlnaXQ5JywgMzAgLyogRGlnaXQ5ICovLCAnOScsIDU3LCAnVktfOScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsyMSwgMCwgNDUgLyogRGlnaXQwICovLCAnRGlnaXQwJywgMjEgLyogRGlnaXQwICovLCAnMCcsIDQ4LCAnVktfMCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszLCAxLCA0NiAvKiBFbnRlciAqLywgJ0VudGVyJywgMyAvKiBFbnRlciAqLywgJ0VudGVyJywgMTMsICdWS19SRVRVUk4nLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbOSwgMSwgNDcgLyogRXNjYXBlICovLCAnRXNjYXBlJywgOSAvKiBFc2NhcGUgKi8sICdFc2NhcGUnLCAyNywgJ1ZLX0VTQ0FQRScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxLCAxLCA0OCAvKiBCYWNrc3BhY2UgKi8sICdCYWNrc3BhY2UnLCAxIC8qIEJhY2tzcGFjZSAqLywgJ0JhY2tzcGFjZScsIDgsICdWS19CQUNLJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzIsIDEsIDQ5IC8qIFRhYiAqLywgJ1RhYicsIDIgLyogVGFiICovLCAnVGFiJywgOSwgJ1ZLX1RBQicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMCwgMSwgNTAgLyogU3BhY2UgKi8sICdTcGFjZScsIDEwIC8qIFNwYWNlICovLCAnU3BhY2UnLCAzMiwgJ1ZLX1NQQUNFJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzgzLCAwLCA1MSAvKiBNaW51cyAqLywgJ01pbnVzJywgODMgLyogTWludXMgKi8sICctJywgMTg5LCAnVktfT0VNX01JTlVTJywgJy0nLCAnT0VNX01JTlVTJ10sCiAgICAgICAgICAgIFs4MSwgMCwgNTIgLyogRXF1YWwgKi8sICdFcXVhbCcsIDgxIC8qIEVxdWFsICovLCAnPScsIDE4NywgJ1ZLX09FTV9QTFVTJywgJz0nLCAnT0VNX1BMVVMnXSwKICAgICAgICAgICAgWzg3LCAwLCA1MyAvKiBCcmFja2V0TGVmdCAqLywgJ0JyYWNrZXRMZWZ0JywgODcgLyogQnJhY2tldExlZnQgKi8sICdbJywgMjE5LCAnVktfT0VNXzQnLCAnWycsICdPRU1fNCddLAogICAgICAgICAgICBbODksIDAsIDU0IC8qIEJyYWNrZXRSaWdodCAqLywgJ0JyYWNrZXRSaWdodCcsIDg5IC8qIEJyYWNrZXRSaWdodCAqLywgJ10nLCAyMjEsICdWS19PRU1fNicsICddJywgJ09FTV82J10sCiAgICAgICAgICAgIFs4OCwgMCwgNTUgLyogQmFja3NsYXNoICovLCAnQmFja3NsYXNoJywgODggLyogQmFja3NsYXNoICovLCAnXFwnLCAyMjAsICdWS19PRU1fNScsICdcXCcsICdPRU1fNSddLAogICAgICAgICAgICBbMCwgMCwgNTYgLyogSW50bEhhc2ggKi8sICdJbnRsSGFzaCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbODAsIDAsIDU3IC8qIFNlbWljb2xvbiAqLywgJ1NlbWljb2xvbicsIDgwIC8qIFNlbWljb2xvbiAqLywgJzsnLCAxODYsICdWS19PRU1fMScsICc7JywgJ09FTV8xJ10sCiAgICAgICAgICAgIFs5MCwgMCwgNTggLyogUXVvdGUgKi8sICdRdW90ZScsIDkwIC8qIFF1b3RlICovLCAnXCcnLCAyMjIsICdWS19PRU1fNycsICdcJycsICdPRU1fNyddLAogICAgICAgICAgICBbODYsIDAsIDU5IC8qIEJhY2txdW90ZSAqLywgJ0JhY2txdW90ZScsIDg2IC8qIEJhY2txdW90ZSAqLywgJ2AnLCAxOTIsICdWS19PRU1fMycsICdgJywgJ09FTV8zJ10sCiAgICAgICAgICAgIFs4MiwgMCwgNjAgLyogQ29tbWEgKi8sICdDb21tYScsIDgyIC8qIENvbW1hICovLCAnLCcsIDE4OCwgJ1ZLX09FTV9DT01NQScsICcsJywgJ09FTV9DT01NQSddLAogICAgICAgICAgICBbODQsIDAsIDYxIC8qIFBlcmlvZCAqLywgJ1BlcmlvZCcsIDg0IC8qIFBlcmlvZCAqLywgJy4nLCAxOTAsICdWS19PRU1fUEVSSU9EJywgJy4nLCAnT0VNX1BFUklPRCddLAogICAgICAgICAgICBbODUsIDAsIDYyIC8qIFNsYXNoICovLCAnU2xhc2gnLCA4NSAvKiBTbGFzaCAqLywgJy8nLCAxOTEsICdWS19PRU1fMicsICcvJywgJ09FTV8yJ10sCiAgICAgICAgICAgIFs4LCAxLCA2MyAvKiBDYXBzTG9jayAqLywgJ0NhcHNMb2NrJywgOCAvKiBDYXBzTG9jayAqLywgJ0NhcHNMb2NrJywgMjAsICdWS19DQVBJVEFMJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzU5LCAxLCA2NCAvKiBGMSAqLywgJ0YxJywgNTkgLyogRjEgKi8sICdGMScsIDExMiwgJ1ZLX0YxJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzYwLCAxLCA2NSAvKiBGMiAqLywgJ0YyJywgNjAgLyogRjIgKi8sICdGMicsIDExMywgJ1ZLX0YyJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzYxLCAxLCA2NiAvKiBGMyAqLywgJ0YzJywgNjEgLyogRjMgKi8sICdGMycsIDExNCwgJ1ZLX0YzJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzYyLCAxLCA2NyAvKiBGNCAqLywgJ0Y0JywgNjIgLyogRjQgKi8sICdGNCcsIDExNSwgJ1ZLX0Y0JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzYzLCAxLCA2OCAvKiBGNSAqLywgJ0Y1JywgNjMgLyogRjUgKi8sICdGNScsIDExNiwgJ1ZLX0Y1JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzY0LCAxLCA2OSAvKiBGNiAqLywgJ0Y2JywgNjQgLyogRjYgKi8sICdGNicsIDExNywgJ1ZLX0Y2JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzY1LCAxLCA3MCAvKiBGNyAqLywgJ0Y3JywgNjUgLyogRjcgKi8sICdGNycsIDExOCwgJ1ZLX0Y3JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzY2LCAxLCA3MSAvKiBGOCAqLywgJ0Y4JywgNjYgLyogRjggKi8sICdGOCcsIDExOSwgJ1ZLX0Y4JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzY3LCAxLCA3MiAvKiBGOSAqLywgJ0Y5JywgNjcgLyogRjkgKi8sICdGOScsIDEyMCwgJ1ZLX0Y5JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzY4LCAxLCA3MyAvKiBGMTAgKi8sICdGMTAnLCA2OCAvKiBGMTAgKi8sICdGMTAnLCAxMjEsICdWS19GMTAnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNjksIDEsIDc0IC8qIEYxMSAqLywgJ0YxMScsIDY5IC8qIEYxMSAqLywgJ0YxMScsIDEyMiwgJ1ZLX0YxMScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs3MCwgMSwgNzUgLyogRjEyICovLCAnRjEyJywgNzAgLyogRjEyICovLCAnRjEyJywgMTIzLCAnVktfRjEyJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDc2IC8qIFByaW50U2NyZWVuICovLCAnUHJpbnRTY3JlZW4nLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzc5LCAxLCA3NyAvKiBTY3JvbGxMb2NrICovLCAnU2Nyb2xsTG9jaycsIDc5IC8qIFNjcm9sbExvY2sgKi8sICdTY3JvbGxMb2NrJywgMTQ1LCAnVktfU0NST0xMJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzcsIDEsIDc4IC8qIFBhdXNlICovLCAnUGF1c2UnLCA3IC8qIFBhdXNlQnJlYWsgKi8sICdQYXVzZUJyZWFrJywgMTksICdWS19QQVVTRScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxOSwgMSwgNzkgLyogSW5zZXJ0ICovLCAnSW5zZXJ0JywgMTkgLyogSW5zZXJ0ICovLCAnSW5zZXJ0JywgNDUsICdWS19JTlNFUlQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTQsIDEsIDgwIC8qIEhvbWUgKi8sICdIb21lJywgMTQgLyogSG9tZSAqLywgJ0hvbWUnLCAzNiwgJ1ZLX0hPTUUnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTEsIDEsIDgxIC8qIFBhZ2VVcCAqLywgJ1BhZ2VVcCcsIDExIC8qIFBhZ2VVcCAqLywgJ1BhZ2VVcCcsIDMzLCAnVktfUFJJT1InLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMjAsIDEsIDgyIC8qIERlbGV0ZSAqLywgJ0RlbGV0ZScsIDIwIC8qIERlbGV0ZSAqLywgJ0RlbGV0ZScsIDQ2LCAnVktfREVMRVRFJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzEzLCAxLCA4MyAvKiBFbmQgKi8sICdFbmQnLCAxMyAvKiBFbmQgKi8sICdFbmQnLCAzNSwgJ1ZLX0VORCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMiwgMSwgODQgLyogUGFnZURvd24gKi8sICdQYWdlRG93bicsIDEyIC8qIFBhZ2VEb3duICovLCAnUGFnZURvd24nLCAzNCwgJ1ZLX05FWFQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTcsIDEsIDg1IC8qIEFycm93UmlnaHQgKi8sICdBcnJvd1JpZ2h0JywgMTcgLyogUmlnaHRBcnJvdyAqLywgJ1JpZ2h0QXJyb3cnLCAzOSwgJ1ZLX1JJR0hUJywgJ1JpZ2h0JywgZW1wdHldLAogICAgICAgICAgICBbMTUsIDEsIDg2IC8qIEFycm93TGVmdCAqLywgJ0Fycm93TGVmdCcsIDE1IC8qIExlZnRBcnJvdyAqLywgJ0xlZnRBcnJvdycsIDM3LCAnVktfTEVGVCcsICdMZWZ0JywgZW1wdHldLAogICAgICAgICAgICBbMTgsIDEsIDg3IC8qIEFycm93RG93biAqLywgJ0Fycm93RG93bicsIDE4IC8qIERvd25BcnJvdyAqLywgJ0Rvd25BcnJvdycsIDQwLCAnVktfRE9XTicsICdEb3duJywgZW1wdHldLAogICAgICAgICAgICBbMTYsIDEsIDg4IC8qIEFycm93VXAgKi8sICdBcnJvd1VwJywgMTYgLyogVXBBcnJvdyAqLywgJ1VwQXJyb3cnLCAzOCwgJ1ZLX1VQJywgJ1VwJywgZW1wdHldLAogICAgICAgICAgICBbNzgsIDEsIDg5IC8qIE51bUxvY2sgKi8sICdOdW1Mb2NrJywgNzggLyogTnVtTG9jayAqLywgJ051bUxvY2snLCAxNDQsICdWS19OVU1MT0NLJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzEwOCwgMSwgOTAgLyogTnVtcGFkRGl2aWRlICovLCAnTnVtcGFkRGl2aWRlJywgMTA4IC8qIE51bXBhZERpdmlkZSAqLywgJ051bVBhZF9EaXZpZGUnLCAxMTEsICdWS19ESVZJREUnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTAzLCAxLCA5MSAvKiBOdW1wYWRNdWx0aXBseSAqLywgJ051bXBhZE11bHRpcGx5JywgMTAzIC8qIE51bXBhZE11bHRpcGx5ICovLCAnTnVtUGFkX011bHRpcGx5JywgMTA2LCAnVktfTVVMVElQTFknLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTA2LCAxLCA5MiAvKiBOdW1wYWRTdWJ0cmFjdCAqLywgJ051bXBhZFN1YnRyYWN0JywgMTA2IC8qIE51bXBhZFN1YnRyYWN0ICovLCAnTnVtUGFkX1N1YnRyYWN0JywgMTA5LCAnVktfU1VCVFJBQ1QnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTA0LCAxLCA5MyAvKiBOdW1wYWRBZGQgKi8sICdOdW1wYWRBZGQnLCAxMDQgLyogTnVtcGFkQWRkICovLCAnTnVtUGFkX0FkZCcsIDEwNywgJ1ZLX0FERCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFszLCAxLCA5NCAvKiBOdW1wYWRFbnRlciAqLywgJ051bXBhZEVudGVyJywgMyAvKiBFbnRlciAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbOTQsIDEsIDk1IC8qIE51bXBhZDEgKi8sICdOdW1wYWQxJywgOTQgLyogTnVtcGFkMSAqLywgJ051bVBhZDEnLCA5NywgJ1ZLX05VTVBBRDEnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbOTUsIDEsIDk2IC8qIE51bXBhZDIgKi8sICdOdW1wYWQyJywgOTUgLyogTnVtcGFkMiAqLywgJ051bVBhZDInLCA5OCwgJ1ZLX05VTVBBRDInLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbOTYsIDEsIDk3IC8qIE51bXBhZDMgKi8sICdOdW1wYWQzJywgOTYgLyogTnVtcGFkMyAqLywgJ051bVBhZDMnLCA5OSwgJ1ZLX05VTVBBRDMnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbOTcsIDEsIDk4IC8qIE51bXBhZDQgKi8sICdOdW1wYWQ0JywgOTcgLyogTnVtcGFkNCAqLywgJ051bVBhZDQnLCAxMDAsICdWS19OVU1QQUQ0JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzk4LCAxLCA5OSAvKiBOdW1wYWQ1ICovLCAnTnVtcGFkNScsIDk4IC8qIE51bXBhZDUgKi8sICdOdW1QYWQ1JywgMTAxLCAnVktfTlVNUEFENScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs5OSwgMSwgMTAwIC8qIE51bXBhZDYgKi8sICdOdW1wYWQ2JywgOTkgLyogTnVtcGFkNiAqLywgJ051bVBhZDYnLCAxMDIsICdWS19OVU1QQUQ2JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzEwMCwgMSwgMTAxIC8qIE51bXBhZDcgKi8sICdOdW1wYWQ3JywgMTAwIC8qIE51bXBhZDcgKi8sICdOdW1QYWQ3JywgMTAzLCAnVktfTlVNUEFENycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMDEsIDEsIDEwMiAvKiBOdW1wYWQ4ICovLCAnTnVtcGFkOCcsIDEwMSAvKiBOdW1wYWQ4ICovLCAnTnVtUGFkOCcsIDEwNCwgJ1ZLX05VTVBBRDgnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTAyLCAxLCAxMDMgLyogTnVtcGFkOSAqLywgJ051bXBhZDknLCAxMDIgLyogTnVtcGFkOSAqLywgJ051bVBhZDknLCAxMDUsICdWS19OVU1QQUQ5JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzkzLCAxLCAxMDQgLyogTnVtcGFkMCAqLywgJ051bXBhZDAnLCA5MyAvKiBOdW1wYWQwICovLCAnTnVtUGFkMCcsIDk2LCAnVktfTlVNUEFEMCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMDcsIDEsIDEwNSAvKiBOdW1wYWREZWNpbWFsICovLCAnTnVtcGFkRGVjaW1hbCcsIDEwNyAvKiBOdW1wYWREZWNpbWFsICovLCAnTnVtUGFkX0RlY2ltYWwnLCAxMTAsICdWS19ERUNJTUFMJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzkyLCAwLCAxMDYgLyogSW50bEJhY2tzbGFzaCAqLywgJ0ludGxCYWNrc2xhc2gnLCA5MiAvKiBJbnRsQmFja3NsYXNoICovLCAnT0VNXzEwMicsIDIyNiwgJ1ZLX09FTV8xMDInLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNTgsIDEsIDEwNyAvKiBDb250ZXh0TWVudSAqLywgJ0NvbnRleHRNZW51JywgNTggLyogQ29udGV4dE1lbnUgKi8sICdDb250ZXh0TWVudScsIDkzLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEwOCAvKiBQb3dlciAqLywgJ1Bvd2VyJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMDkgLyogTnVtcGFkRXF1YWwgKi8sICdOdW1wYWRFcXVhbCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNzEsIDEsIDExMCAvKiBGMTMgKi8sICdGMTMnLCA3MSAvKiBGMTMgKi8sICdGMTMnLCAxMjQsICdWS19GMTMnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNzIsIDEsIDExMSAvKiBGMTQgKi8sICdGMTQnLCA3MiAvKiBGMTQgKi8sICdGMTQnLCAxMjUsICdWS19GMTQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNzMsIDEsIDExMiAvKiBGMTUgKi8sICdGMTUnLCA3MyAvKiBGMTUgKi8sICdGMTUnLCAxMjYsICdWS19GMTUnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNzQsIDEsIDExMyAvKiBGMTYgKi8sICdGMTYnLCA3NCAvKiBGMTYgKi8sICdGMTYnLCAxMjcsICdWS19GMTYnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNzUsIDEsIDExNCAvKiBGMTcgKi8sICdGMTcnLCA3NSAvKiBGMTcgKi8sICdGMTcnLCAxMjgsICdWS19GMTcnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNzYsIDEsIDExNSAvKiBGMTggKi8sICdGMTgnLCA3NiAvKiBGMTggKi8sICdGMTgnLCAxMjksICdWS19GMTgnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNzcsIDEsIDExNiAvKiBGMTkgKi8sICdGMTknLCA3NyAvKiBGMTkgKi8sICdGMTknLCAxMzAsICdWS19GMTknLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTE3IC8qIEYyMCAqLywgJ0YyMCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19GMjAnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTE4IC8qIEYyMSAqLywgJ0YyMScsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19GMjEnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTE5IC8qIEYyMiAqLywgJ0YyMicsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19GMjInLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTIwIC8qIEYyMyAqLywgJ0YyMycsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19GMjMnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTIxIC8qIEYyNCAqLywgJ0YyNCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19GMjQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTIyIC8qIE9wZW4gKi8sICdPcGVuJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMjMgLyogSGVscCAqLywgJ0hlbHAnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEyNCAvKiBTZWxlY3QgKi8sICdTZWxlY3QnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEyNSAvKiBBZ2FpbiAqLywgJ0FnYWluJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMjYgLyogVW5kbyAqLywgJ1VuZG8nLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEyNyAvKiBDdXQgKi8sICdDdXQnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEyOCAvKiBDb3B5ICovLCAnQ29weScsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTI5IC8qIFBhc3RlICovLCAnUGFzdGUnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEzMCAvKiBGaW5kICovLCAnRmluZCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTMxIC8qIEF1ZGlvVm9sdW1lTXV0ZSAqLywgJ0F1ZGlvVm9sdW1lTXV0ZScsIDExMiAvKiBBdWRpb1ZvbHVtZU11dGUgKi8sICdBdWRpb1ZvbHVtZU11dGUnLCAxNzMsICdWS19WT0xVTUVfTVVURScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMzIgLyogQXVkaW9Wb2x1bWVVcCAqLywgJ0F1ZGlvVm9sdW1lVXAnLCAxMTMgLyogQXVkaW9Wb2x1bWVVcCAqLywgJ0F1ZGlvVm9sdW1lVXAnLCAxNzUsICdWS19WT0xVTUVfVVAnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTMzIC8qIEF1ZGlvVm9sdW1lRG93biAqLywgJ0F1ZGlvVm9sdW1lRG93bicsIDExNCAvKiBBdWRpb1ZvbHVtZURvd24gKi8sICdBdWRpb1ZvbHVtZURvd24nLCAxNzQsICdWS19WT0xVTUVfRE9XTicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMDUsIDEsIDEzNCAvKiBOdW1wYWRDb21tYSAqLywgJ051bXBhZENvbW1hJywgMTA1IC8qIE5VTVBBRF9TRVBBUkFUT1IgKi8sICdOdW1QYWRfU2VwYXJhdG9yJywgMTA4LCAnVktfU0VQQVJBVE9SJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzExMCwgMCwgMTM1IC8qIEludGxSbyAqLywgJ0ludGxSbycsIDExMCAvKiBBQk5UX0MxICovLCAnQUJOVF9DMScsIDE5MywgJ1ZLX0FCTlRfQzEnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTM2IC8qIEthbmFNb2RlICovLCAnS2FuYU1vZGUnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDAsIDEzNyAvKiBJbnRsWWVuICovLCAnSW50bFllbicsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTM4IC8qIENvbnZlcnQgKi8sICdDb252ZXJ0JywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMzkgLyogTm9uQ29udmVydCAqLywgJ05vbkNvbnZlcnQnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE0MCAvKiBMYW5nMSAqLywgJ0xhbmcxJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNDEgLyogTGFuZzIgKi8sICdMYW5nMicsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTQyIC8qIExhbmczICovLCAnTGFuZzMnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE0MyAvKiBMYW5nNCAqLywgJ0xhbmc0JywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNDQgLyogTGFuZzUgKi8sICdMYW5nNScsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTQ1IC8qIEFib3J0ICovLCAnQWJvcnQnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE0NiAvKiBQcm9wcyAqLywgJ1Byb3BzJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNDcgLyogTnVtcGFkUGFyZW5MZWZ0ICovLCAnTnVtcGFkUGFyZW5MZWZ0JywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNDggLyogTnVtcGFkUGFyZW5SaWdodCAqLywgJ051bXBhZFBhcmVuUmlnaHQnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE0OSAvKiBOdW1wYWRCYWNrc3BhY2UgKi8sICdOdW1wYWRCYWNrc3BhY2UnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE1MCAvKiBOdW1wYWRNZW1vcnlTdG9yZSAqLywgJ051bXBhZE1lbW9yeVN0b3JlJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNTEgLyogTnVtcGFkTWVtb3J5UmVjYWxsICovLCAnTnVtcGFkTWVtb3J5UmVjYWxsJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNTIgLyogTnVtcGFkTWVtb3J5Q2xlYXIgKi8sICdOdW1wYWRNZW1vcnlDbGVhcicsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTUzIC8qIE51bXBhZE1lbW9yeUFkZCAqLywgJ051bXBhZE1lbW9yeUFkZCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTU0IC8qIE51bXBhZE1lbW9yeVN1YnRyYWN0ICovLCAnTnVtcGFkTWVtb3J5U3VidHJhY3QnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE1NSAvKiBOdW1wYWRDbGVhciAqLywgJ051bXBhZENsZWFyJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNTYgLyogTnVtcGFkQ2xlYXJFbnRyeSAqLywgJ051bXBhZENsZWFyRW50cnknLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzUsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDUgLyogQ3RybCAqLywgJ0N0cmwnLCAxNywgJ1ZLX0NPTlRST0wnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgNCAvKiBTaGlmdCAqLywgJ1NoaWZ0JywgMTYsICdWS19TSElGVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs2LCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCA2IC8qIEFsdCAqLywgJ0FsdCcsIDE4LCAnVktfTUVOVScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1NywgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgNTcgLyogTWV0YSAqLywgJ01ldGEnLCAwLCAnVktfQ09NTUFORCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1LCAxLCAxNTcgLyogQ29udHJvbExlZnQgKi8sICdDb250cm9sTGVmdCcsIDUgLyogQ3RybCAqLywgZW1wdHksIDAsICdWS19MQ09OVFJPTCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0LCAxLCAxNTggLyogU2hpZnRMZWZ0ICovLCAnU2hpZnRMZWZ0JywgNCAvKiBTaGlmdCAqLywgZW1wdHksIDAsICdWS19MU0hJRlQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNiwgMSwgMTU5IC8qIEFsdExlZnQgKi8sICdBbHRMZWZ0JywgNiAvKiBBbHQgKi8sIGVtcHR5LCAwLCAnVktfTE1FTlUnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNTcsIDEsIDE2MCAvKiBNZXRhTGVmdCAqLywgJ01ldGFMZWZ0JywgNTcgLyogTWV0YSAqLywgZW1wdHksIDAsICdWS19MV0lOJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzUsIDEsIDE2MSAvKiBDb250cm9sUmlnaHQgKi8sICdDb250cm9sUmlnaHQnLCA1IC8qIEN0cmwgKi8sIGVtcHR5LCAwLCAnVktfUkNPTlRST0wnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNCwgMSwgMTYyIC8qIFNoaWZ0UmlnaHQgKi8sICdTaGlmdFJpZ2h0JywgNCAvKiBTaGlmdCAqLywgZW1wdHksIDAsICdWS19SU0hJRlQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNiwgMSwgMTYzIC8qIEFsdFJpZ2h0ICovLCAnQWx0UmlnaHQnLCA2IC8qIEFsdCAqLywgZW1wdHksIDAsICdWS19STUVOVScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1NywgMSwgMTY0IC8qIE1ldGFSaWdodCAqLywgJ01ldGFSaWdodCcsIDU3IC8qIE1ldGEgKi8sIGVtcHR5LCAwLCAnVktfUldJTicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNjUgLyogQnJpZ2h0bmVzc1VwICovLCAnQnJpZ2h0bmVzc1VwJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNjYgLyogQnJpZ2h0bmVzc0Rvd24gKi8sICdCcmlnaHRuZXNzRG93bicsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTY3IC8qIE1lZGlhUGxheSAqLywgJ01lZGlhUGxheScsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTY4IC8qIE1lZGlhUmVjb3JkICovLCAnTWVkaWFSZWNvcmQnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE2OSAvKiBNZWRpYUZhc3RGb3J3YXJkICovLCAnTWVkaWFGYXN0Rm9yd2FyZCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTcwIC8qIE1lZGlhUmV3aW5kICovLCAnTWVkaWFSZXdpbmQnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzExNCwgMSwgMTcxIC8qIE1lZGlhVHJhY2tOZXh0ICovLCAnTWVkaWFUcmFja05leHQnLCAxMTkgLyogTWVkaWFUcmFja05leHQgKi8sICdNZWRpYVRyYWNrTmV4dCcsIDE3NiwgJ1ZLX01FRElBX05FWFRfVFJBQ0snLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTE1LCAxLCAxNzIgLyogTWVkaWFUcmFja1ByZXZpb3VzICovLCAnTWVkaWFUcmFja1ByZXZpb3VzJywgMTIwIC8qIE1lZGlhVHJhY2tQcmV2aW91cyAqLywgJ01lZGlhVHJhY2tQcmV2aW91cycsIDE3NywgJ1ZLX01FRElBX1BSRVZfVFJBQ0snLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTE2LCAxLCAxNzMgLyogTWVkaWFTdG9wICovLCAnTWVkaWFTdG9wJywgMTIxIC8qIE1lZGlhU3RvcCAqLywgJ01lZGlhU3RvcCcsIDE3OCwgJ1ZLX01FRElBX1NUT1AnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTc0IC8qIEVqZWN0ICovLCAnRWplY3QnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzExNywgMSwgMTc1IC8qIE1lZGlhUGxheVBhdXNlICovLCAnTWVkaWFQbGF5UGF1c2UnLCAxMjIgLyogTWVkaWFQbGF5UGF1c2UgKi8sICdNZWRpYVBsYXlQYXVzZScsIDE3OSwgJ1ZLX01FRElBX1BMQVlfUEFVU0UnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTc2IC8qIE1lZGlhU2VsZWN0ICovLCAnTWVkaWFTZWxlY3QnLCAxMjMgLyogTGF1bmNoTWVkaWFQbGF5ZXIgKi8sICdMYXVuY2hNZWRpYVBsYXllcicsIDE4MSwgJ1ZLX01FRElBX0xBVU5DSF9NRURJQV9TRUxFQ1QnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTc3IC8qIExhdW5jaE1haWwgKi8sICdMYXVuY2hNYWlsJywgMTI0IC8qIExhdW5jaE1haWwgKi8sICdMYXVuY2hNYWlsJywgMTgwLCAnVktfTUVESUFfTEFVTkNIX01BSUwnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTc4IC8qIExhdW5jaEFwcDIgKi8sICdMYXVuY2hBcHAyJywgMTI1IC8qIExhdW5jaEFwcDIgKi8sICdMYXVuY2hBcHAyJywgMTgzLCAnVktfTUVESUFfTEFVTkNIX0FQUDInLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTc5IC8qIExhdW5jaEFwcDEgKi8sICdMYXVuY2hBcHAxJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX01FRElBX0xBVU5DSF9BUFAxJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE4MCAvKiBTZWxlY3RUYXNrICovLCAnU2VsZWN0VGFzaycsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTgxIC8qIExhdW5jaFNjcmVlblNhdmVyICovLCAnTGF1bmNoU2NyZWVuU2F2ZXInLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE4MiAvKiBCcm93c2VyU2VhcmNoICovLCAnQnJvd3NlclNlYXJjaCcsIDExNSAvKiBCcm93c2VyU2VhcmNoICovLCAnQnJvd3NlclNlYXJjaCcsIDE3MCwgJ1ZLX0JST1dTRVJfU0VBUkNIJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE4MyAvKiBCcm93c2VySG9tZSAqLywgJ0Jyb3dzZXJIb21lJywgMTE2IC8qIEJyb3dzZXJIb21lICovLCAnQnJvd3NlckhvbWUnLCAxNzIsICdWS19CUk9XU0VSX0hPTUUnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTEyLCAxLCAxODQgLyogQnJvd3NlckJhY2sgKi8sICdCcm93c2VyQmFjaycsIDExNyAvKiBCcm93c2VyQmFjayAqLywgJ0Jyb3dzZXJCYWNrJywgMTY2LCAnVktfQlJPV1NFUl9CQUNLJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzExMywgMSwgMTg1IC8qIEJyb3dzZXJGb3J3YXJkICovLCAnQnJvd3NlckZvcndhcmQnLCAxMTggLyogQnJvd3NlckZvcndhcmQgKi8sICdCcm93c2VyRm9yd2FyZCcsIDE2NywgJ1ZLX0JST1dTRVJfRk9SV0FSRCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxODYgLyogQnJvd3NlclN0b3AgKi8sICdCcm93c2VyU3RvcCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19CUk9XU0VSX1NUT1AnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTg3IC8qIEJyb3dzZXJSZWZyZXNoICovLCAnQnJvd3NlclJlZnJlc2gnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfQlJPV1NFUl9SRUZSRVNIJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE4OCAvKiBCcm93c2VyRmF2b3JpdGVzICovLCAnQnJvd3NlckZhdm9yaXRlcycsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19CUk9XU0VSX0ZBVk9SSVRFUycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxODkgLyogWm9vbVRvZ2dsZSAqLywgJ1pvb21Ub2dnbGUnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE5MCAvKiBNYWlsUmVwbHkgKi8sICdNYWlsUmVwbHknLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE5MSAvKiBNYWlsRm9yd2FyZCAqLywgJ01haWxGb3J3YXJkJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxOTIgLyogTWFpbFNlbmQgKi8sICdNYWlsU2VuZCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9saXN0cy53My5vcmcvQXJjaGl2ZXMvUHVibGljL3d3dy1kb20vMjAxMEp1bFNlcC9hdHQtMDE4Mi9rZXlDb2RlLXNwZWMuaHRtbAogICAgICAgICAgICAvLyBJZiBhbiBJbnB1dCBNZXRob2QgRWRpdG9yIGlzIHByb2Nlc3Npbmcga2V5IGlucHV0IGFuZCB0aGUgZXZlbnQgaXMga2V5ZG93biwgcmV0dXJuIDIyOS4KICAgICAgICAgICAgWzEwOSwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMTA5IC8qIEtFWV9JTl9DT01QT1NJVElPTiAqLywgJ0tleUluQ29tcG9zaXRpb24nLCAyMjksIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTExLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAxMTEgLyogQUJOVF9DMiAqLywgJ0FCTlRfQzInLCAxOTQsICdWS19BQk5UX0MyJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzkxLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCA5MSAvKiBPRU1fOCAqLywgJ09FTV84JywgMjIzLCAnVktfT0VNXzgnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0NMRUFSJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19LQU5BJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19IQU5HVUwnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0pVTkpBJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19GSU5BTCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfSEFOSkEnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0tBTkpJJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19DT05WRVJUJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19OT05DT05WRVJUJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19BQ0NFUFQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX01PREVDSEFOR0UnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX1NFTEVDVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfUFJJTlQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0VYRUNVVEUnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX1NOQVBTSE9UJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19IRUxQJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19BUFBTJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19QUk9DRVNTS0VZJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19QQUNLRVQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0RCRV9TQkNTQ0hBUicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfREJFX0RCQ1NDSEFSJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19BVFROJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19DUlNFTCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfRVhTRUwnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0VSRU9GJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19QTEFZJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19aT09NJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19OT05BTUUnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX1BBMScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfT0VNX0NMRUFSJywgZW1wdHksIGVtcHR5XSwKICAgICAgICBdOwogICAgICAgIGxldCBzZWVuS2V5Q29kZSA9IFtdOwogICAgICAgIGxldCBzZWVuU2NhbkNvZGUgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgbWFwcGluZ3MpIHsKICAgICAgICAgICAgY29uc3QgW19rZXlDb2RlT3JkLCBpbW11dGFibGUsIHNjYW5Db2RlLCBzY2FuQ29kZVN0ciwga2V5Q29kZSwga2V5Q29kZVN0ciwgZXZlbnRLZXlDb2RlLCB2a2V5LCB1c1VzZXJTZXR0aW5nc0xhYmVsLCBnZW5lcmFsVXNlclNldHRpbmdzTGFiZWxdID0gbWFwcGluZzsKICAgICAgICAgICAgaWYgKCFzZWVuU2NhbkNvZGVbc2NhbkNvZGVdKSB7CiAgICAgICAgICAgICAgICBzZWVuU2NhbkNvZGVbc2NhbkNvZGVdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHNjYW5Db2RlSW50VG9TdHJbc2NhbkNvZGVdID0gc2NhbkNvZGVTdHI7CiAgICAgICAgICAgICAgICBzY2FuQ29kZVN0clRvSW50W3NjYW5Db2RlU3RyXSA9IHNjYW5Db2RlOwogICAgICAgICAgICAgICAgc2NhbkNvZGVMb3dlckNhc2VTdHJUb0ludFtzY2FuQ29kZVN0ci50b0xvd2VyQ2FzZSgpXSA9IHNjYW5Db2RlOwogICAgICAgICAgICAgICAgaWYgKGltbXV0YWJsZSkgewogICAgICAgICAgICAgICAgICAgIElNTVVUQUJMRV9DT0RFX1RPX0tFWV9DT0RFW3NjYW5Db2RlXSA9IGtleUNvZGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKChrZXlDb2RlICE9PSAwIC8qIFVua25vd24gKi8pCiAgICAgICAgICAgICAgICAgICAgICAgICYmIChrZXlDb2RlICE9PSAzIC8qIEVudGVyICovKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoa2V5Q29kZSAhPT0gNSAvKiBDdHJsICovKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoa2V5Q29kZSAhPT0gNCAvKiBTaGlmdCAqLykKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGtleUNvZGUgIT09IDYgLyogQWx0ICovKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoa2V5Q29kZSAhPT0gNTcgLyogTWV0YSAqLykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgSU1NVVRBQkxFX0tFWV9DT0RFX1RPX0NPREVba2V5Q29kZV0gPSBzY2FuQ29kZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWVuS2V5Q29kZVtrZXlDb2RlXSkgewogICAgICAgICAgICAgICAgc2VlbktleUNvZGVba2V5Q29kZV0gPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKCFrZXlDb2RlU3RyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgcmVwcmVzZW50YXRpb24gbWlzc2luZyBmb3Iga2V5IGNvZGUgJHtrZXlDb2RlfSBhcm91bmQgc2NhbiBjb2RlICR7c2NhbkNvZGVTdHJ9YCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1aU1hcC5kZWZpbmUoa2V5Q29kZSwga2V5Q29kZVN0cik7CiAgICAgICAgICAgICAgICB1c2VyU2V0dGluZ3NVU01hcC5kZWZpbmUoa2V5Q29kZSwgdXNVc2VyU2V0dGluZ3NMYWJlbCB8fCBrZXlDb2RlU3RyKTsKICAgICAgICAgICAgICAgIHVzZXJTZXR0aW5nc0dlbmVyYWxNYXAuZGVmaW5lKGtleUNvZGUsIGdlbmVyYWxVc2VyU2V0dGluZ3NMYWJlbCB8fCB1c1VzZXJTZXR0aW5nc0xhYmVsIHx8IGtleUNvZGVTdHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChldmVudEtleUNvZGUpIHsKICAgICAgICAgICAgICAgIEVWRU5UX0tFWV9DT0RFX01BUFtldmVudEtleUNvZGVdID0ga2V5Q29kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmtleSkgewogICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV1NfS0VZX0NPREVfVE9fS0VZX0NPREVbdmtleV0gPSBrZXlDb2RlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIE1hbnVhbGx5IGFkZGVkIGR1ZSB0byB0aGUgZXhjbHVzaW9uIGFib3ZlIChkdWUgdG8gZHVwbGljYXRpb24gd2l0aCBOdW1wYWRFbnRlcikKICAgICAgICBJTU1VVEFCTEVfS0VZX0NPREVfVE9fQ09ERVszIC8qIEVudGVyICovXSA9IDQ2IC8qIEVudGVyICovOwogICAgfSkoKTsKICAgIHZhciBLZXlDb2RlVXRpbHM7CiAgICAoZnVuY3Rpb24gKEtleUNvZGVVdGlscykgewogICAgICAgIGZ1bmN0aW9uIHRvU3RyaW5nKGtleUNvZGUpIHsKICAgICAgICAgICAgcmV0dXJuIHVpTWFwLmtleUNvZGVUb1N0cihrZXlDb2RlKTsKICAgICAgICB9CiAgICAgICAgS2V5Q29kZVV0aWxzLnRvU3RyaW5nID0gdG9TdHJpbmc7CiAgICAgICAgZnVuY3Rpb24gZnJvbVN0cmluZyhrZXkpIHsKICAgICAgICAgICAgcmV0dXJuIHVpTWFwLnN0clRvS2V5Q29kZShrZXkpOwogICAgICAgIH0KICAgICAgICBLZXlDb2RlVXRpbHMuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7CiAgICAgICAgZnVuY3Rpb24gdG9Vc2VyU2V0dGluZ3NVUyhrZXlDb2RlKSB7CiAgICAgICAgICAgIHJldHVybiB1c2VyU2V0dGluZ3NVU01hcC5rZXlDb2RlVG9TdHIoa2V5Q29kZSk7CiAgICAgICAgfQogICAgICAgIEtleUNvZGVVdGlscy50b1VzZXJTZXR0aW5nc1VTID0gdG9Vc2VyU2V0dGluZ3NVUzsKICAgICAgICBmdW5jdGlvbiB0b1VzZXJTZXR0aW5nc0dlbmVyYWwoa2V5Q29kZSkgewogICAgICAgICAgICByZXR1cm4gdXNlclNldHRpbmdzR2VuZXJhbE1hcC5rZXlDb2RlVG9TdHIoa2V5Q29kZSk7CiAgICAgICAgfQogICAgICAgIEtleUNvZGVVdGlscy50b1VzZXJTZXR0aW5nc0dlbmVyYWwgPSB0b1VzZXJTZXR0aW5nc0dlbmVyYWw7CiAgICAgICAgZnVuY3Rpb24gZnJvbVVzZXJTZXR0aW5ncyhrZXkpIHsKICAgICAgICAgICAgcmV0dXJuIHVzZXJTZXR0aW5nc1VTTWFwLnN0clRvS2V5Q29kZShrZXkpIHx8IHVzZXJTZXR0aW5nc0dlbmVyYWxNYXAuc3RyVG9LZXlDb2RlKGtleSk7CiAgICAgICAgfQogICAgICAgIEtleUNvZGVVdGlscy5mcm9tVXNlclNldHRpbmdzID0gZnJvbVVzZXJTZXR0aW5nczsKICAgICAgICBmdW5jdGlvbiB0b0VsZWN0cm9uQWNjZWxlcmF0b3Ioa2V5Q29kZSkgewogICAgICAgICAgICBpZiAoa2V5Q29kZSA+PSA5MyAvKiBOdW1wYWQwICovICYmIGtleUNvZGUgPD0gMTA4IC8qIE51bXBhZERpdmlkZSAqLykgewogICAgICAgICAgICAgICAgLy8gW0VsZWN0cm9uIEFjY2VsZXJhdG9yc10gRWxlY3Ryb24gaXMgYWJsZSB0byBwYXJzZSBudW1wYWQga2V5cywgYnV0IHVuZm9ydHVuYXRlbHkgaXQKICAgICAgICAgICAgICAgIC8vIHJlbmRlcnMgdGhlbSBqdXN0IGFzIHJlZ3VsYXIga2V5cyBpbiBtZW51cy4gRm9yIGV4YW1wbGUsIG51bTAgaXMgcmVuZGVyZWQgYXMgIjAiLAogICAgICAgICAgICAgICAgLy8gbnVtZGl2IGlzIHJlbmRlcmVkIGFzICIvIiwgbnVtc3ViIGlzIHJlbmRlcmVkIGFzICItIi4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBsZWFkIHRvIGluY3JlZGlibGUgY29uZnVzaW9uLCBhcyBpdCBtYWtlcyBudW1wYWQgYmFzZWQga2V5YmluZGluZ3MgaW5kaXN0aW5ndWlzaGFibGUKICAgICAgICAgICAgICAgIC8vIGZyb20ga2V5YmluZGluZ3MgYmFzZWQgb24gcmVndWxhciBrZXlzLgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIFdlIHRoZXJlZm9yZSBuZWVkIHRvIGZhbGwgYmFjayB0byBjdXN0b20gcmVuZGVyaW5nIGZvciBudW1wYWQga2V5cy4KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewogICAgICAgICAgICAgICAgY2FzZSAxNiAvKiBVcEFycm93ICovOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnVXAnOwogICAgICAgICAgICAgICAgY2FzZSAxOCAvKiBEb3duQXJyb3cgKi86CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdEb3duJzsKICAgICAgICAgICAgICAgIGNhc2UgMTUgLyogTGVmdEFycm93ICovOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnTGVmdCc7CiAgICAgICAgICAgICAgICBjYXNlIDE3IC8qIFJpZ2h0QXJyb3cgKi86CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdSaWdodCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHVpTWFwLmtleUNvZGVUb1N0cihrZXlDb2RlKTsKICAgICAgICB9CiAgICAgICAgS2V5Q29kZVV0aWxzLnRvRWxlY3Ryb25BY2NlbGVyYXRvciA9IHRvRWxlY3Ryb25BY2NlbGVyYXRvcjsKICAgIH0pKEtleUNvZGVVdGlscyB8fCAoS2V5Q29kZVV0aWxzID0ge30pKTsKICAgIGZ1bmN0aW9uIEtleUNob3JkKGZpcnN0UGFydCwgc2Vjb25kUGFydCkgewogICAgICAgIGNvbnN0IGNob3JkUGFydCA9ICgoc2Vjb25kUGFydCAmIDB4MDAwMEZGRkYpIDw8IDE2KSA+Pj4gMDsKICAgICAgICByZXR1cm4gKGZpcnN0UGFydCB8IGNob3JkUGFydCkgPj4+IDA7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAvKioKICAgICAqIEEgc2VsZWN0aW9uIGluIHRoZSBlZGl0b3IuCiAgICAgKiBUaGUgc2VsZWN0aW9uIGlzIGEgcmFuZ2UgdGhhdCBoYXMgYW4gb3JpZW50YXRpb24uCiAgICAgKi8KICAgIGNsYXNzIFNlbGVjdGlvbiBleHRlbmRzIFJhbmdlIHsKICAgICAgICBjb25zdHJ1Y3RvcihzZWxlY3Rpb25TdGFydExpbmVOdW1iZXIsIHNlbGVjdGlvblN0YXJ0Q29sdW1uLCBwb3NpdGlvbkxpbmVOdW1iZXIsIHBvc2l0aW9uQ29sdW1uKSB7CiAgICAgICAgICAgIHN1cGVyKHNlbGVjdGlvblN0YXJ0TGluZU51bWJlciwgc2VsZWN0aW9uU3RhcnRDb2x1bW4sIHBvc2l0aW9uTGluZU51bWJlciwgcG9zaXRpb25Db2x1bW4pOwogICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciA9IHNlbGVjdGlvblN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbiA9IHNlbGVjdGlvblN0YXJ0Q29sdW1uOwogICAgICAgICAgICB0aGlzLnBvc2l0aW9uTGluZU51bWJlciA9IHBvc2l0aW9uTGluZU51bWJlcjsKICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkNvbHVtbiA9IHBvc2l0aW9uQ29sdW1uOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUcmFuc2Zvcm0gdG8gYSBodW1hbi1yZWFkYWJsZSByZXByZXNlbnRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICB0b1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuICdbJyArIHRoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyICsgJywnICsgdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbiArICcgLT4gJyArIHRoaXMucG9zaXRpb25MaW5lTnVtYmVyICsgJywnICsgdGhpcy5wb3NpdGlvbkNvbHVtbiArICddJzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiBlcXVhbHMgb3RoZXIgc2VsZWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGVxdWFsc1NlbGVjdGlvbihvdGhlcikgewogICAgICAgICAgICByZXR1cm4gKFNlbGVjdGlvbi5zZWxlY3Rpb25zRXF1YWwodGhpcywgb3RoZXIpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiB0aGUgdHdvIHNlbGVjdGlvbnMgYXJlIGVxdWFsLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBzZWxlY3Rpb25zRXF1YWwoYSwgYikgewogICAgICAgICAgICByZXR1cm4gKGEuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyID09PSBiLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciAmJgogICAgICAgICAgICAgICAgYS5zZWxlY3Rpb25TdGFydENvbHVtbiA9PT0gYi5zZWxlY3Rpb25TdGFydENvbHVtbiAmJgogICAgICAgICAgICAgICAgYS5wb3NpdGlvbkxpbmVOdW1iZXIgPT09IGIucG9zaXRpb25MaW5lTnVtYmVyICYmCiAgICAgICAgICAgICAgICBhLnBvc2l0aW9uQ29sdW1uID09PSBiLnBvc2l0aW9uQ29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IGRpcmVjdGlvbnMgKExUUiBvciBSVEwpLgogICAgICAgICAqLwogICAgICAgIGdldERpcmVjdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyID09PSB0aGlzLnN0YXJ0TGluZU51bWJlciAmJiB0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uID09PSB0aGlzLnN0YXJ0Q29sdW1uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBMVFIgKi87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIDEgLyogUlRMICovOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBuZXcgc2VsZWN0aW9uIHdpdGggYSBkaWZmZXJlbnQgYHBvc2l0aW9uTGluZU51bWJlcmAgYW5kIGBwb3NpdGlvbkNvbHVtbmAuCiAgICAgICAgICovCiAgICAgICAgc2V0RW5kUG9zaXRpb24oZW5kTGluZU51bWJlciwgZW5kQ29sdW1uKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmdldERpcmVjdGlvbigpID09PSAwIC8qIExUUiAqLykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5zdGFydExpbmVOdW1iZXIsIHRoaXMuc3RhcnRDb2x1bW4sIGVuZExpbmVOdW1iZXIsIGVuZENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oZW5kTGluZU51bWJlciwgZW5kQ29sdW1uLCB0aGlzLnN0YXJ0TGluZU51bWJlciwgdGhpcy5zdGFydENvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCB0aGUgcG9zaXRpb24gYXQgYHBvc2l0aW9uTGluZU51bWJlcmAgYW5kIGBwb3NpdGlvbkNvbHVtbmAuCiAgICAgICAgICovCiAgICAgICAgZ2V0UG9zaXRpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24odGhpcy5wb3NpdGlvbkxpbmVOdW1iZXIsIHRoaXMucG9zaXRpb25Db2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VsZWN0aW9uLgogICAgICAgICovCiAgICAgICAgZ2V0U2VsZWN0aW9uU3RhcnQoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24odGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIsIHRoaXMuc2VsZWN0aW9uU3RhcnRDb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBuZXcgc2VsZWN0aW9uIHdpdGggYSBkaWZmZXJlbnQgYHNlbGVjdGlvblN0YXJ0TGluZU51bWJlcmAgYW5kIGBzZWxlY3Rpb25TdGFydENvbHVtbmAuCiAgICAgICAgICovCiAgICAgICAgc2V0U3RhcnRQb3NpdGlvbihzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmdldERpcmVjdGlvbigpID09PSAwIC8qIExUUiAqLykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3RhcnRMaW5lTnVtYmVyLCBzdGFydENvbHVtbiwgdGhpcy5lbmRMaW5lTnVtYmVyLCB0aGlzLmVuZENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5lbmRMaW5lTnVtYmVyLCB0aGlzLmVuZENvbHVtbiwgc3RhcnRMaW5lTnVtYmVyLCBzdGFydENvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBgU2VsZWN0aW9uYCBmcm9tIG9uZSBvciB0d28gcG9zaXRpb25zCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGZyb21Qb3NpdGlvbnMoc3RhcnQsIGVuZCA9IHN0YXJ0KSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHN0YXJ0LmxpbmVOdW1iZXIsIHN0YXJ0LmNvbHVtbiwgZW5kLmxpbmVOdW1iZXIsIGVuZC5jb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgYFNlbGVjdGlvbmAgZnJvbSBhIHJhbmdlLCBnaXZlbiBhIGRpcmVjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZnJvbVJhbmdlKHJhbmdlLCBkaXJlY3Rpb24pIHsKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gMCAvKiBMVFIgKi8pIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2Uuc3RhcnRDb2x1bW4sIHJhbmdlLmVuZExpbmVOdW1iZXIsIHJhbmdlLmVuZENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihyYW5nZS5lbmRMaW5lTnVtYmVyLCByYW5nZS5lbmRDb2x1bW4sIHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2Uuc3RhcnRDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZSBhIGBTZWxlY3Rpb25gIGZyb20gYW4gYElTZWxlY3Rpb25gLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBsaWZ0U2VsZWN0aW9uKHNlbCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihzZWwuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyLCBzZWwuc2VsZWN0aW9uU3RhcnRDb2x1bW4sIHNlbC5wb3NpdGlvbkxpbmVOdW1iZXIsIHNlbC5wb3NpdGlvbkNvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIGBhYCBlcXVhbHMgYGJgLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBzZWxlY3Rpb25zQXJyRXF1YWwoYSwgYikgewogICAgICAgICAgICBpZiAoYSAmJiAhYiB8fCAhYSAmJiBiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFhICYmICFiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGEubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb25zRXF1YWwoYVtpXSwgYltpXSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgYG9iamAgaXMgYW4gYElTZWxlY3Rpb25gLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBpc0lTZWxlY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAob2JqCiAgICAgICAgICAgICAgICAmJiAodHlwZW9mIG9iai5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIgPT09ICdudW1iZXInKQogICAgICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmouc2VsZWN0aW9uU3RhcnRDb2x1bW4gPT09ICdudW1iZXInKQogICAgICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmoucG9zaXRpb25MaW5lTnVtYmVyID09PSAnbnVtYmVyJykKICAgICAgICAgICAgICAgICYmICh0eXBlb2Ygb2JqLnBvc2l0aW9uQ29sdW1uID09PSAnbnVtYmVyJykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgd2l0aCBhIGRpcmVjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY3JlYXRlV2l0aERpcmVjdGlvbihzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyLCBlbmRDb2x1bW4sIGRpcmVjdGlvbikgewogICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAwIC8qIExUUiAqLykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3RhcnRMaW5lTnVtYmVyLCBzdGFydENvbHVtbiwgZW5kTGluZU51bWJlciwgZW5kQ29sdW1uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihlbmRMaW5lTnVtYmVyLCBlbmRDb2x1bW4sIHN0YXJ0TGluZU51bWJlciwgc3RhcnRDb2x1bW4pOwogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNsYXNzIFRva2VuIHsKICAgICAgICBjb25zdHJ1Y3RvcihvZmZzZXQsIHR5cGUsIGxhbmd1YWdlKSB7CiAgICAgICAgICAgIHRoaXMuX3Rva2VuQnJhbmQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7CiAgICAgICAgfQogICAgICAgIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gJygnICsgdGhpcy5vZmZzZXQgKyAnLCAnICsgdGhpcy50eXBlICsgJyknOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFRva2VuaXphdGlvblJlc3VsdCB7CiAgICAgICAgY29uc3RydWN0b3IodG9rZW5zLCBlbmRTdGF0ZSkgewogICAgICAgICAgICB0aGlzLl90b2tlbml6YXRpb25SZXN1bHRCcmFuZCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7CiAgICAgICAgICAgIHRoaXMuZW5kU3RhdGUgPSBlbmRTdGF0ZTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBUb2tlbml6YXRpb25SZXN1bHQyIHsKICAgICAgICBjb25zdHJ1Y3Rvcih0b2tlbnMsIGVuZFN0YXRlKSB7CiAgICAgICAgICAgIHRoaXMuX3Rva2VuaXphdGlvblJlc3VsdDJCcmFuZCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7CiAgICAgICAgICAgIHRoaXMuZW5kU3RhdGUgPSBlbmRTdGF0ZTsKICAgICAgICB9CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAvLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUuIERPIE5PVCBFRElUIERJUkVDVExZLgogICAgdmFyIEFjY2Vzc2liaWxpdHlTdXBwb3J0OwogICAgKGZ1bmN0aW9uIChBY2Nlc3NpYmlsaXR5U3VwcG9ydCkgewogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgc2hvdWxkIGJlIHRoZSBicm93c2VyIGNhc2Ugd2hlcmUgaXQgaXMgbm90IGtub3duIGlmIGEgc2NyZWVuIHJlYWRlciBpcyBhdHRhY2hlZCBvciBuby4KICAgICAgICAgKi8KICAgICAgICBBY2Nlc3NpYmlsaXR5U3VwcG9ydFtBY2Nlc3NpYmlsaXR5U3VwcG9ydFsiVW5rbm93biJdID0gMF0gPSAiVW5rbm93biI7CiAgICAgICAgQWNjZXNzaWJpbGl0eVN1cHBvcnRbQWNjZXNzaWJpbGl0eVN1cHBvcnRbIkRpc2FibGVkIl0gPSAxXSA9ICJEaXNhYmxlZCI7CiAgICAgICAgQWNjZXNzaWJpbGl0eVN1cHBvcnRbQWNjZXNzaWJpbGl0eVN1cHBvcnRbIkVuYWJsZWQiXSA9IDJdID0gIkVuYWJsZWQiOwogICAgfSkoQWNjZXNzaWJpbGl0eVN1cHBvcnQgfHwgKEFjY2Vzc2liaWxpdHlTdXBwb3J0ID0ge30pKTsKICAgIC8qKgogICAgICogQ29sb3Igc2NoZW1lIHVzZWQgYnkgdGhlIE9TIGFuZCBieSBjb2xvciB0aGVtZXMuCiAgICAgKi8KICAgIHZhciBDb2xvclNjaGVtZTsKICAgIChmdW5jdGlvbiAoQ29sb3JTY2hlbWUpIHsKICAgICAgICBDb2xvclNjaGVtZVsiREFSSyJdID0gImRhcmsiOwogICAgICAgIENvbG9yU2NoZW1lWyJMSUdIVCJdID0gImxpZ2h0IjsKICAgICAgICBDb2xvclNjaGVtZVsiSElHSF9DT05UUkFTVCJdID0gImhjIjsKICAgIH0pKENvbG9yU2NoZW1lIHx8IChDb2xvclNjaGVtZSA9IHt9KSk7CiAgICB2YXIgQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZTsKICAgIChmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEFkanVzdCB3aGl0ZXNwYWNlL2luZGVudGF0aW9uIG9mIG11bHRpbGluZSBpbnNlcnQgdGV4dHMgdG8KICAgICAgICAgKiBtYXRjaCB0aGUgY3VycmVudCBsaW5lIGluZGVudGF0aW9uLgogICAgICAgICAqLwogICAgICAgIENvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGVbQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZVsiS2VlcFdoaXRlc3BhY2UiXSA9IDFdID0gIktlZXBXaGl0ZXNwYWNlIjsKICAgICAgICAvKioKICAgICAgICAgKiBgaW5zZXJ0VGV4dGAgaXMgYSBzbmlwcGV0LgogICAgICAgICAqLwogICAgICAgIENvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGVbQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZVsiSW5zZXJ0QXNTbmlwcGV0Il0gPSA0XSA9ICJJbnNlcnRBc1NuaXBwZXQiOwogICAgfSkoQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZSB8fCAoQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZSA9IHt9KSk7CiAgICB2YXIgQ29tcGxldGlvbkl0ZW1LaW5kOwogICAgKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUtpbmQpIHsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJNZXRob2QiXSA9IDBdID0gIk1ldGhvZCI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiRnVuY3Rpb24iXSA9IDFdID0gIkZ1bmN0aW9uIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJDb25zdHJ1Y3RvciJdID0gMl0gPSAiQ29uc3RydWN0b3IiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIkZpZWxkIl0gPSAzXSA9ICJGaWVsZCI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiVmFyaWFibGUiXSA9IDRdID0gIlZhcmlhYmxlIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJDbGFzcyJdID0gNV0gPSAiQ2xhc3MiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIlN0cnVjdCJdID0gNl0gPSAiU3RydWN0IjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJJbnRlcmZhY2UiXSA9IDddID0gIkludGVyZmFjZSI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiTW9kdWxlIl0gPSA4XSA9ICJNb2R1bGUiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIlByb3BlcnR5Il0gPSA5XSA9ICJQcm9wZXJ0eSI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiRXZlbnQiXSA9IDEwXSA9ICJFdmVudCI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiT3BlcmF0b3IiXSA9IDExXSA9ICJPcGVyYXRvciI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiVW5pdCJdID0gMTJdID0gIlVuaXQiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIlZhbHVlIl0gPSAxM10gPSAiVmFsdWUiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIkNvbnN0YW50Il0gPSAxNF0gPSAiQ29uc3RhbnQiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIkVudW0iXSA9IDE1XSA9ICJFbnVtIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJFbnVtTWVtYmVyIl0gPSAxNl0gPSAiRW51bU1lbWJlciI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiS2V5d29yZCJdID0gMTddID0gIktleXdvcmQiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIlRleHQiXSA9IDE4XSA9ICJUZXh0IjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJDb2xvciJdID0gMTldID0gIkNvbG9yIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJGaWxlIl0gPSAyMF0gPSAiRmlsZSI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiUmVmZXJlbmNlIl0gPSAyMV0gPSAiUmVmZXJlbmNlIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJDdXN0b21jb2xvciJdID0gMjJdID0gIkN1c3RvbWNvbG9yIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJGb2xkZXIiXSA9IDIzXSA9ICJGb2xkZXIiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIlR5cGVQYXJhbWV0ZXIiXSA9IDI0XSA9ICJUeXBlUGFyYW1ldGVyIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJVc2VyIl0gPSAyNV0gPSAiVXNlciI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiSXNzdWUiXSA9IDI2XSA9ICJJc3N1ZSI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiU25pcHBldCJdID0gMjddID0gIlNuaXBwZXQiOwogICAgfSkoQ29tcGxldGlvbkl0ZW1LaW5kIHx8IChDb21wbGV0aW9uSXRlbUtpbmQgPSB7fSkpOwogICAgdmFyIENvbXBsZXRpb25JdGVtVGFnOwogICAgKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbVRhZykgewogICAgICAgIENvbXBsZXRpb25JdGVtVGFnW0NvbXBsZXRpb25JdGVtVGFnWyJEZXByZWNhdGVkIl0gPSAxXSA9ICJEZXByZWNhdGVkIjsKICAgIH0pKENvbXBsZXRpb25JdGVtVGFnIHx8IChDb21wbGV0aW9uSXRlbVRhZyA9IHt9KSk7CiAgICAvKioKICAgICAqIEhvdyBhIHN1Z2dlc3QgcHJvdmlkZXIgd2FzIHRyaWdnZXJlZC4KICAgICAqLwogICAgdmFyIENvbXBsZXRpb25UcmlnZ2VyS2luZDsKICAgIChmdW5jdGlvbiAoQ29tcGxldGlvblRyaWdnZXJLaW5kKSB7CiAgICAgICAgQ29tcGxldGlvblRyaWdnZXJLaW5kW0NvbXBsZXRpb25UcmlnZ2VyS2luZFsiSW52b2tlIl0gPSAwXSA9ICJJbnZva2UiOwogICAgICAgIENvbXBsZXRpb25UcmlnZ2VyS2luZFtDb21wbGV0aW9uVHJpZ2dlcktpbmRbIlRyaWdnZXJDaGFyYWN0ZXIiXSA9IDFdID0gIlRyaWdnZXJDaGFyYWN0ZXIiOwogICAgICAgIENvbXBsZXRpb25UcmlnZ2VyS2luZFtDb21wbGV0aW9uVHJpZ2dlcktpbmRbIlRyaWdnZXJGb3JJbmNvbXBsZXRlQ29tcGxldGlvbnMiXSA9IDJdID0gIlRyaWdnZXJGb3JJbmNvbXBsZXRlQ29tcGxldGlvbnMiOwogICAgfSkoQ29tcGxldGlvblRyaWdnZXJLaW5kIHx8IChDb21wbGV0aW9uVHJpZ2dlcktpbmQgPSB7fSkpOwogICAgdmFyIENvbmZpZ3VyYXRpb25TY29wZTsKICAgIChmdW5jdGlvbiAoQ29uZmlndXJhdGlvblNjb3BlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQXBwbGljYXRpb24gc3BlY2lmaWMgY29uZmlndXJhdGlvbiwgd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgb25seSBpbiBsb2NhbCB1c2VyIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIENvbmZpZ3VyYXRpb25TY29wZVtDb25maWd1cmF0aW9uU2NvcGVbIkFQUExJQ0FUSU9OIl0gPSAxXSA9ICJBUFBMSUNBVElPTiI7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFjaGluZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uLCB3aGljaCBjYW4gYmUgY29uZmlndXJlZCBvbmx5IGluIGxvY2FsIGFuZCByZW1vdGUgdXNlciBzZXR0aW5ncy4KICAgICAgICAgKi8KICAgICAgICBDb25maWd1cmF0aW9uU2NvcGVbQ29uZmlndXJhdGlvblNjb3BlWyJNQUNISU5FIl0gPSAyXSA9ICJNQUNISU5FIjsKICAgICAgICAvKioKICAgICAgICAgKiBXaW5kb3cgc3BlY2lmaWMgY29uZmlndXJhdGlvbiwgd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgaW4gdGhlIHVzZXIgb3Igd29ya3NwYWNlIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIENvbmZpZ3VyYXRpb25TY29wZVtDb25maWd1cmF0aW9uU2NvcGVbIldJTkRPVyJdID0gM10gPSAiV0lORE9XIjsKICAgICAgICAvKioKICAgICAgICAgKiBSZXNvdXJjZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uLCB3aGljaCBjYW4gYmUgY29uZmlndXJlZCBpbiB0aGUgdXNlciwgd29ya3NwYWNlIG9yIGZvbGRlciBzZXR0aW5ncy4KICAgICAgICAgKi8KICAgICAgICBDb25maWd1cmF0aW9uU2NvcGVbQ29uZmlndXJhdGlvblNjb3BlWyJSRVNPVVJDRSJdID0gNF0gPSAiUkVTT1VSQ0UiOwogICAgICAgIC8qKgogICAgICAgICAqIFJlc291cmNlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gdGhhdCBjYW4gYmUgY29uZmlndXJlZCBpbiBsYW5ndWFnZSBzcGVjaWZpYyBzZXR0aW5ncwogICAgICAgICAqLwogICAgICAgIENvbmZpZ3VyYXRpb25TY29wZVtDb25maWd1cmF0aW9uU2NvcGVbIkxBTkdVQUdFX09WRVJSSURBQkxFIl0gPSA1XSA9ICJMQU5HVUFHRV9PVkVSUklEQUJMRSI7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFjaGluZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGFsc28gYmUgY29uZmlndXJlZCBpbiB3b3Jrc3BhY2Ugb3IgZm9sZGVyIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIENvbmZpZ3VyYXRpb25TY29wZVtDb25maWd1cmF0aW9uU2NvcGVbIk1BQ0hJTkVfT1ZFUlJJREFCTEUiXSA9IDZdID0gIk1BQ0hJTkVfT1ZFUlJJREFCTEUiOwogICAgfSkoQ29uZmlndXJhdGlvblNjb3BlIHx8IChDb25maWd1cmF0aW9uU2NvcGUgPSB7fSkpOwogICAgdmFyIENvbmZpZ3VyYXRpb25UYXJnZXQ7CiAgICAoZnVuY3Rpb24gKENvbmZpZ3VyYXRpb25UYXJnZXQpIHsKICAgICAgICBDb25maWd1cmF0aW9uVGFyZ2V0W0NvbmZpZ3VyYXRpb25UYXJnZXRbIlVTRVIiXSA9IDFdID0gIlVTRVIiOwogICAgICAgIENvbmZpZ3VyYXRpb25UYXJnZXRbQ29uZmlndXJhdGlvblRhcmdldFsiVVNFUl9MT0NBTCJdID0gMl0gPSAiVVNFUl9MT0NBTCI7CiAgICAgICAgQ29uZmlndXJhdGlvblRhcmdldFtDb25maWd1cmF0aW9uVGFyZ2V0WyJVU0VSX1JFTU9URSJdID0gM10gPSAiVVNFUl9SRU1PVEUiOwogICAgICAgIENvbmZpZ3VyYXRpb25UYXJnZXRbQ29uZmlndXJhdGlvblRhcmdldFsiV09SS1NQQUNFIl0gPSA0XSA9ICJXT1JLU1BBQ0UiOwogICAgICAgIENvbmZpZ3VyYXRpb25UYXJnZXRbQ29uZmlndXJhdGlvblRhcmdldFsiV09SS1NQQUNFX0ZPTERFUiJdID0gNV0gPSAiV09SS1NQQUNFX0ZPTERFUiI7CiAgICAgICAgQ29uZmlndXJhdGlvblRhcmdldFtDb25maWd1cmF0aW9uVGFyZ2V0WyJERUZBVUxUIl0gPSA2XSA9ICJERUZBVUxUIjsKICAgICAgICBDb25maWd1cmF0aW9uVGFyZ2V0W0NvbmZpZ3VyYXRpb25UYXJnZXRbIk1FTU9SWSJdID0gN10gPSAiTUVNT1JZIjsKICAgIH0pKENvbmZpZ3VyYXRpb25UYXJnZXQgfHwgKENvbmZpZ3VyYXRpb25UYXJnZXQgPSB7fSkpOwogICAgLyoqCiAgICAgKiBBIHBvc2l0aW9uaW5nIHByZWZlcmVuY2UgZm9yIHJlbmRlcmluZyBjb250ZW50IHdpZGdldHMuCiAgICAgKi8KICAgIHZhciBDb250ZW50V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlOwogICAgKGZ1bmN0aW9uIChDb250ZW50V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogUGxhY2UgdGhlIGNvbnRlbnQgd2lkZ2V0IGV4YWN0bHkgYXQgYSBwb3NpdGlvbgogICAgICAgICAqLwogICAgICAgIENvbnRlbnRXaWRnZXRQb3NpdGlvblByZWZlcmVuY2VbQ29udGVudFdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVsiRVhBQ1QiXSA9IDBdID0gIkVYQUNUIjsKICAgICAgICAvKioKICAgICAgICAgKiBQbGFjZSB0aGUgY29udGVudCB3aWRnZXQgYWJvdmUgYSBwb3NpdGlvbgogICAgICAgICAqLwogICAgICAgIENvbnRlbnRXaWRnZXRQb3NpdGlvblByZWZlcmVuY2VbQ29udGVudFdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVsiQUJPVkUiXSA9IDFdID0gIkFCT1ZFIjsKICAgICAgICAvKioKICAgICAgICAgKiBQbGFjZSB0aGUgY29udGVudCB3aWRnZXQgYmVsb3cgYSBwb3NpdGlvbgogICAgICAgICAqLwogICAgICAgIENvbnRlbnRXaWRnZXRQb3NpdGlvblByZWZlcmVuY2VbQ29udGVudFdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVsiQkVMT1ciXSA9IDJdID0gIkJFTE9XIjsKICAgIH0pKENvbnRlbnRXaWRnZXRQb3NpdGlvblByZWZlcmVuY2UgfHwgKENvbnRlbnRXaWRnZXRQb3NpdGlvblByZWZlcmVuY2UgPSB7fSkpOwogICAgdmFyIENvbnRleHRLZXlFeHByVHlwZTsKICAgIChmdW5jdGlvbiAoQ29udGV4dEtleUV4cHJUeXBlKSB7CiAgICAgICAgQ29udGV4dEtleUV4cHJUeXBlW0NvbnRleHRLZXlFeHByVHlwZVsiRmFsc2UiXSA9IDBdID0gIkZhbHNlIjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJUcnVlIl0gPSAxXSA9ICJUcnVlIjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJEZWZpbmVkIl0gPSAyXSA9ICJEZWZpbmVkIjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJOb3QiXSA9IDNdID0gIk5vdCI7CiAgICAgICAgQ29udGV4dEtleUV4cHJUeXBlW0NvbnRleHRLZXlFeHByVHlwZVsiRXF1YWxzIl0gPSA0XSA9ICJFcXVhbHMiOwogICAgICAgIENvbnRleHRLZXlFeHByVHlwZVtDb250ZXh0S2V5RXhwclR5cGVbIk5vdEVxdWFscyJdID0gNV0gPSAiTm90RXF1YWxzIjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJBbmQiXSA9IDZdID0gIkFuZCI7CiAgICAgICAgQ29udGV4dEtleUV4cHJUeXBlW0NvbnRleHRLZXlFeHByVHlwZVsiUmVnZXgiXSA9IDddID0gIlJlZ2V4IjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJOb3RSZWdleCJdID0gOF0gPSAiTm90UmVnZXgiOwogICAgICAgIENvbnRleHRLZXlFeHByVHlwZVtDb250ZXh0S2V5RXhwclR5cGVbIk9yIl0gPSA5XSA9ICJPciI7CiAgICAgICAgQ29udGV4dEtleUV4cHJUeXBlW0NvbnRleHRLZXlFeHByVHlwZVsiSW4iXSA9IDEwXSA9ICJJbiI7CiAgICAgICAgQ29udGV4dEtleUV4cHJUeXBlW0NvbnRleHRLZXlFeHByVHlwZVsiTm90SW4iXSA9IDExXSA9ICJOb3RJbiI7CiAgICAgICAgQ29udGV4dEtleUV4cHJUeXBlW0NvbnRleHRLZXlFeHByVHlwZVsiR3JlYXRlciJdID0gMTJdID0gIkdyZWF0ZXIiOwogICAgICAgIENvbnRleHRLZXlFeHByVHlwZVtDb250ZXh0S2V5RXhwclR5cGVbIkdyZWF0ZXJFcXVhbHMiXSA9IDEzXSA9ICJHcmVhdGVyRXF1YWxzIjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJTbWFsbGVyIl0gPSAxNF0gPSAiU21hbGxlciI7CiAgICAgICAgQ29udGV4dEtleUV4cHJUeXBlW0NvbnRleHRLZXlFeHByVHlwZVsiU21hbGxlckVxdWFscyJdID0gMTVdID0gIlNtYWxsZXJFcXVhbHMiOwogICAgfSkoQ29udGV4dEtleUV4cHJUeXBlIHx8IChDb250ZXh0S2V5RXhwclR5cGUgPSB7fSkpOwogICAgLyoqCiAgICAgKiBEZXNjcmliZXMgdGhlIHJlYXNvbiB0aGUgY3Vyc29yIGhhcyBjaGFuZ2VkIGl0cyBwb3NpdGlvbi4KICAgICAqLwogICAgdmFyIEN1cnNvckNoYW5nZVJlYXNvbjsKICAgIChmdW5jdGlvbiAoQ3Vyc29yQ2hhbmdlUmVhc29uKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogVW5rbm93biBvciBub3Qgc2V0LgogICAgICAgICAqLwogICAgICAgIEN1cnNvckNoYW5nZVJlYXNvbltDdXJzb3JDaGFuZ2VSZWFzb25bIk5vdFNldCJdID0gMF0gPSAiTm90U2V0IjsKICAgICAgICAvKioKICAgICAgICAgKiBBIGBtb2RlbC5zZXRWYWx1ZSgpYCB3YXMgY2FsbGVkLgogICAgICAgICAqLwogICAgICAgIEN1cnNvckNoYW5nZVJlYXNvbltDdXJzb3JDaGFuZ2VSZWFzb25bIkNvbnRlbnRGbHVzaCJdID0gMV0gPSAiQ29udGVudEZsdXNoIjsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYG1vZGVsYCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgb2YgdGhpcyBjdXJzb3IgYW5kIHRoZSBjdXJzb3IgcmVjb3ZlcnMgaXRzIHBvc2l0aW9uIGZyb20gYXNzb2NpYXRlZCBtYXJrZXJzLgogICAgICAgICAqLwogICAgICAgIEN1cnNvckNoYW5nZVJlYXNvbltDdXJzb3JDaGFuZ2VSZWFzb25bIlJlY292ZXJGcm9tTWFya2VycyJdID0gMl0gPSAiUmVjb3ZlckZyb21NYXJrZXJzIjsKICAgICAgICAvKioKICAgICAgICAgKiBUaGVyZSB3YXMgYW4gZXhwbGljaXQgdXNlciBnZXN0dXJlLgogICAgICAgICAqLwogICAgICAgIEN1cnNvckNoYW5nZVJlYXNvbltDdXJzb3JDaGFuZ2VSZWFzb25bIkV4cGxpY2l0Il0gPSAzXSA9ICJFeHBsaWNpdCI7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlcmUgd2FzIGEgUGFzdGUuCiAgICAgICAgICovCiAgICAgICAgQ3Vyc29yQ2hhbmdlUmVhc29uW0N1cnNvckNoYW5nZVJlYXNvblsiUGFzdGUiXSA9IDRdID0gIlBhc3RlIjsKICAgICAgICAvKioKICAgICAgICAgKiBUaGVyZSB3YXMgYW4gVW5kby4KICAgICAgICAgKi8KICAgICAgICBDdXJzb3JDaGFuZ2VSZWFzb25bQ3Vyc29yQ2hhbmdlUmVhc29uWyJVbmRvIl0gPSA1XSA9ICJVbmRvIjsKICAgICAgICAvKioKICAgICAgICAgKiBUaGVyZSB3YXMgYSBSZWRvLgogICAgICAgICAqLwogICAgICAgIEN1cnNvckNoYW5nZVJlYXNvbltDdXJzb3JDaGFuZ2VSZWFzb25bIlJlZG8iXSA9IDZdID0gIlJlZG8iOwogICAgfSkoQ3Vyc29yQ2hhbmdlUmVhc29uIHx8IChDdXJzb3JDaGFuZ2VSZWFzb24gPSB7fSkpOwogICAgLyoqCiAgICAgKiBUaGUgZGVmYXVsdCBlbmQgb2YgbGluZSB0byB1c2Ugd2hlbiBpbnN0YW50aWF0aW5nIG1vZGVscy4KICAgICAqLwogICAgdmFyIERlZmF1bHRFbmRPZkxpbmU7CiAgICAoZnVuY3Rpb24gKERlZmF1bHRFbmRPZkxpbmUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBVc2UgbGluZSBmZWVkIChcbikgYXMgdGhlIGVuZCBvZiBsaW5lIGNoYXJhY3Rlci4KICAgICAgICAgKi8KICAgICAgICBEZWZhdWx0RW5kT2ZMaW5lW0RlZmF1bHRFbmRPZkxpbmVbIkxGIl0gPSAxXSA9ICJMRiI7CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlIGNhcnJpYWdlIHJldHVybiBhbmQgbGluZSBmZWVkIChcclxuKSBhcyB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVyLgogICAgICAgICAqLwogICAgICAgIERlZmF1bHRFbmRPZkxpbmVbRGVmYXVsdEVuZE9mTGluZVsiQ1JMRiJdID0gMl0gPSAiQ1JMRiI7CiAgICB9KShEZWZhdWx0RW5kT2ZMaW5lIHx8IChEZWZhdWx0RW5kT2ZMaW5lID0ge30pKTsKICAgIC8qKgogICAgICogQSBkb2N1bWVudCBoaWdobGlnaHQga2luZC4KICAgICAqLwogICAgdmFyIERvY3VtZW50SGlnaGxpZ2h0S2luZDsKICAgIChmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHRLaW5kKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQSB0ZXh0dWFsIG9jY3VycmVuY2UuCiAgICAgICAgICovCiAgICAgICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kW0RvY3VtZW50SGlnaGxpZ2h0S2luZFsiVGV4dCJdID0gMF0gPSAiVGV4dCI7CiAgICAgICAgLyoqCiAgICAgICAgICogUmVhZC1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2UgcmVhZGluZyBhIHZhcmlhYmxlLgogICAgICAgICAqLwogICAgICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZFtEb2N1bWVudEhpZ2hsaWdodEtpbmRbIlJlYWQiXSA9IDFdID0gIlJlYWQiOwogICAgICAgIC8qKgogICAgICAgICAqIFdyaXRlLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSB3cml0aW5nIHRvIGEgdmFyaWFibGUuCiAgICAgICAgICovCiAgICAgICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kW0RvY3VtZW50SGlnaGxpZ2h0S2luZFsiV3JpdGUiXSA9IDJdID0gIldyaXRlIjsKICAgIH0pKERvY3VtZW50SGlnaGxpZ2h0S2luZCB8fCAoRG9jdW1lbnRIaWdobGlnaHRLaW5kID0ge30pKTsKICAgIHZhciBFZGl0UHJlc2VudGF0aW9uVHlwZXM7CiAgICAoZnVuY3Rpb24gKEVkaXRQcmVzZW50YXRpb25UeXBlcykgewogICAgICAgIEVkaXRQcmVzZW50YXRpb25UeXBlc1siTXVsdGlsaW5lIl0gPSAibXVsdGlsaW5lVGV4dCI7CiAgICAgICAgRWRpdFByZXNlbnRhdGlvblR5cGVzWyJTaW5nbGVsaW5lIl0gPSAic2luZ2xlbGluZVRleHQiOwogICAgfSkoRWRpdFByZXNlbnRhdGlvblR5cGVzIHx8IChFZGl0UHJlc2VudGF0aW9uVHlwZXMgPSB7fSkpOwogICAgLyoqCiAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGF1dG8gaW5kZW50YXRpb24gaW4gdGhlIGVkaXRvcgogICAgICovCiAgICB2YXIgRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5OwogICAgKGZ1bmN0aW9uIChFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3kpIHsKICAgICAgICBFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3lbRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5WyJOb25lIl0gPSAwXSA9ICJOb25lIjsKICAgICAgICBFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3lbRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5WyJLZWVwIl0gPSAxXSA9ICJLZWVwIjsKICAgICAgICBFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3lbRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5WyJCcmFja2V0cyJdID0gMl0gPSAiQnJhY2tldHMiOwogICAgICAgIEVkaXRvckF1dG9JbmRlbnRTdHJhdGVneVtFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3lbIkFkdmFuY2VkIl0gPSAzXSA9ICJBZHZhbmNlZCI7CiAgICAgICAgRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5W0VkaXRvckF1dG9JbmRlbnRTdHJhdGVneVsiRnVsbCJdID0gNF0gPSAiRnVsbCI7CiAgICB9KShFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3kgfHwgKEVkaXRvckF1dG9JbmRlbnRTdHJhdGVneSA9IHt9KSk7CiAgICB2YXIgRWRpdG9yT3B0aW9uOwogICAgKGZ1bmN0aW9uIChFZGl0b3JPcHRpb24pIHsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJhY2NlcHRTdWdnZXN0aW9uT25Db21taXRDaGFyYWN0ZXIiXSA9IDBdID0gImFjY2VwdFN1Z2dlc3Rpb25PbkNvbW1pdENoYXJhY3RlciI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXIiXSA9IDFdID0gImFjY2VwdFN1Z2dlc3Rpb25PbkVudGVyIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJhY2Nlc3NpYmlsaXR5U3VwcG9ydCJdID0gMl0gPSAiYWNjZXNzaWJpbGl0eVN1cHBvcnQiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImFjY2Vzc2liaWxpdHlQYWdlU2l6ZSJdID0gM10gPSAiYWNjZXNzaWJpbGl0eVBhZ2VTaXplIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJhcmlhTGFiZWwiXSA9IDRdID0gImFyaWFMYWJlbCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiYXV0b0Nsb3NpbmdCcmFja2V0cyJdID0gNV0gPSAiYXV0b0Nsb3NpbmdCcmFja2V0cyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiYXV0b0Nsb3NpbmdEZWxldGUiXSA9IDZdID0gImF1dG9DbG9zaW5nRGVsZXRlIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJhdXRvQ2xvc2luZ092ZXJ0eXBlIl0gPSA3XSA9ICJhdXRvQ2xvc2luZ092ZXJ0eXBlIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJhdXRvQ2xvc2luZ1F1b3RlcyJdID0gOF0gPSAiYXV0b0Nsb3NpbmdRdW90ZXMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImF1dG9JbmRlbnQiXSA9IDldID0gImF1dG9JbmRlbnQiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImF1dG9tYXRpY0xheW91dCJdID0gMTBdID0gImF1dG9tYXRpY0xheW91dCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiYXV0b1N1cnJvdW5kIl0gPSAxMV0gPSAiYXV0b1N1cnJvdW5kIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJicmFja2V0UGFpckNvbG9yaXphdGlvbiJdID0gMTJdID0gImJyYWNrZXRQYWlyQ29sb3JpemF0aW9uIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJndWlkZXMiXSA9IDEzXSA9ICJndWlkZXMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImNvZGVMZW5zIl0gPSAxNF0gPSAiY29kZUxlbnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImNvZGVMZW5zRm9udEZhbWlseSJdID0gMTVdID0gImNvZGVMZW5zRm9udEZhbWlseSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiY29kZUxlbnNGb250U2l6ZSJdID0gMTZdID0gImNvZGVMZW5zRm9udFNpemUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImNvbG9yRGVjb3JhdG9ycyJdID0gMTddID0gImNvbG9yRGVjb3JhdG9ycyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiY29sdW1uU2VsZWN0aW9uIl0gPSAxOF0gPSAiY29sdW1uU2VsZWN0aW9uIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJjb21tZW50cyJdID0gMTldID0gImNvbW1lbnRzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJjb250ZXh0bWVudSJdID0gMjBdID0gImNvbnRleHRtZW51IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJjb3B5V2l0aFN5bnRheEhpZ2hsaWdodGluZyJdID0gMjFdID0gImNvcHlXaXRoU3ludGF4SGlnaGxpZ2h0aW5nIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJjdXJzb3JCbGlua2luZyJdID0gMjJdID0gImN1cnNvckJsaW5raW5nIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJjdXJzb3JTbW9vdGhDYXJldEFuaW1hdGlvbiJdID0gMjNdID0gImN1cnNvclNtb290aENhcmV0QW5pbWF0aW9uIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJjdXJzb3JTdHlsZSJdID0gMjRdID0gImN1cnNvclN0eWxlIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJjdXJzb3JTdXJyb3VuZGluZ0xpbmVzIl0gPSAyNV0gPSAiY3Vyc29yU3Vycm91bmRpbmdMaW5lcyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiY3Vyc29yU3Vycm91bmRpbmdMaW5lc1N0eWxlIl0gPSAyNl0gPSAiY3Vyc29yU3Vycm91bmRpbmdMaW5lc1N0eWxlIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJjdXJzb3JXaWR0aCJdID0gMjddID0gImN1cnNvcldpZHRoIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJkaXNhYmxlTGF5ZXJIaW50aW5nIl0gPSAyOF0gPSAiZGlzYWJsZUxheWVySGludGluZyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZGlzYWJsZU1vbm9zcGFjZU9wdGltaXphdGlvbnMiXSA9IDI5XSA9ICJkaXNhYmxlTW9ub3NwYWNlT3B0aW1pemF0aW9ucyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZG9tUmVhZE9ubHkiXSA9IDMwXSA9ICJkb21SZWFkT25seSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZHJhZ0FuZERyb3AiXSA9IDMxXSA9ICJkcmFnQW5kRHJvcCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZW1wdHlTZWxlY3Rpb25DbGlwYm9hcmQiXSA9IDMyXSA9ICJlbXB0eVNlbGVjdGlvbkNsaXBib2FyZCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZXh0cmFFZGl0b3JDbGFzc05hbWUiXSA9IDMzXSA9ICJleHRyYUVkaXRvckNsYXNzTmFtZSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZmFzdFNjcm9sbFNlbnNpdGl2aXR5Il0gPSAzNF0gPSAiZmFzdFNjcm9sbFNlbnNpdGl2aXR5IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJmaW5kIl0gPSAzNV0gPSAiZmluZCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZml4ZWRPdmVyZmxvd1dpZGdldHMiXSA9IDM2XSA9ICJmaXhlZE92ZXJmbG93V2lkZ2V0cyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZm9sZGluZyJdID0gMzddID0gImZvbGRpbmciOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImZvbGRpbmdTdHJhdGVneSJdID0gMzhdID0gImZvbGRpbmdTdHJhdGVneSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZm9sZGluZ0hpZ2hsaWdodCJdID0gMzldID0gImZvbGRpbmdIaWdobGlnaHQiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImZvbGRpbmdJbXBvcnRzQnlEZWZhdWx0Il0gPSA0MF0gPSAiZm9sZGluZ0ltcG9ydHNCeURlZmF1bHQiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInVuZm9sZE9uQ2xpY2tBZnRlckVuZE9mTGluZSJdID0gNDFdID0gInVuZm9sZE9uQ2xpY2tBZnRlckVuZE9mTGluZSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZm9udEZhbWlseSJdID0gNDJdID0gImZvbnRGYW1pbHkiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImZvbnRJbmZvIl0gPSA0M10gPSAiZm9udEluZm8iOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImZvbnRMaWdhdHVyZXMiXSA9IDQ0XSA9ICJmb250TGlnYXR1cmVzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJmb250U2l6ZSJdID0gNDVdID0gImZvbnRTaXplIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJmb250V2VpZ2h0Il0gPSA0Nl0gPSAiZm9udFdlaWdodCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZm9ybWF0T25QYXN0ZSJdID0gNDddID0gImZvcm1hdE9uUGFzdGUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImZvcm1hdE9uVHlwZSJdID0gNDhdID0gImZvcm1hdE9uVHlwZSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZ2x5cGhNYXJnaW4iXSA9IDQ5XSA9ICJnbHlwaE1hcmdpbiI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZ290b0xvY2F0aW9uIl0gPSA1MF0gPSAiZ290b0xvY2F0aW9uIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJoaWRlQ3Vyc29ySW5PdmVydmlld1J1bGVyIl0gPSA1MV0gPSAiaGlkZUN1cnNvckluT3ZlcnZpZXdSdWxlciI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiaG92ZXIiXSA9IDUyXSA9ICJob3ZlciI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiaW5EaWZmRWRpdG9yIl0gPSA1M10gPSAiaW5EaWZmRWRpdG9yIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJpbmxpbmVTdWdnZXN0Il0gPSA1NF0gPSAiaW5saW5lU3VnZ2VzdCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibGV0dGVyU3BhY2luZyJdID0gNTVdID0gImxldHRlclNwYWNpbmciOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImxpZ2h0YnVsYiJdID0gNTZdID0gImxpZ2h0YnVsYiI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibGluZURlY29yYXRpb25zV2lkdGgiXSA9IDU3XSA9ICJsaW5lRGVjb3JhdGlvbnNXaWR0aCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibGluZUhlaWdodCJdID0gNThdID0gImxpbmVIZWlnaHQiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImxpbmVOdW1iZXJzIl0gPSA1OV0gPSAibGluZU51bWJlcnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImxpbmVOdW1iZXJzTWluQ2hhcnMiXSA9IDYwXSA9ICJsaW5lTnVtYmVyc01pbkNoYXJzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJsaW5rZWRFZGl0aW5nIl0gPSA2MV0gPSAibGlua2VkRWRpdGluZyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibGlua3MiXSA9IDYyXSA9ICJsaW5rcyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibWF0Y2hCcmFja2V0cyJdID0gNjNdID0gIm1hdGNoQnJhY2tldHMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIm1pbmltYXAiXSA9IDY0XSA9ICJtaW5pbWFwIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJtb3VzZVN0eWxlIl0gPSA2NV0gPSAibW91c2VTdHlsZSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibW91c2VXaGVlbFNjcm9sbFNlbnNpdGl2aXR5Il0gPSA2Nl0gPSAibW91c2VXaGVlbFNjcm9sbFNlbnNpdGl2aXR5IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJtb3VzZVdoZWVsWm9vbSJdID0gNjddID0gIm1vdXNlV2hlZWxab29tIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJtdWx0aUN1cnNvck1lcmdlT3ZlcmxhcHBpbmciXSA9IDY4XSA9ICJtdWx0aUN1cnNvck1lcmdlT3ZlcmxhcHBpbmciOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIm11bHRpQ3Vyc29yTW9kaWZpZXIiXSA9IDY5XSA9ICJtdWx0aUN1cnNvck1vZGlmaWVyIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJtdWx0aUN1cnNvclBhc3RlIl0gPSA3MF0gPSAibXVsdGlDdXJzb3JQYXN0ZSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsib2NjdXJyZW5jZXNIaWdobGlnaHQiXSA9IDcxXSA9ICJvY2N1cnJlbmNlc0hpZ2hsaWdodCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsib3ZlcnZpZXdSdWxlckJvcmRlciJdID0gNzJdID0gIm92ZXJ2aWV3UnVsZXJCb3JkZXIiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIm92ZXJ2aWV3UnVsZXJMYW5lcyJdID0gNzNdID0gIm92ZXJ2aWV3UnVsZXJMYW5lcyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsicGFkZGluZyJdID0gNzRdID0gInBhZGRpbmciOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInBhcmFtZXRlckhpbnRzIl0gPSA3NV0gPSAicGFyYW1ldGVySGludHMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInBlZWtXaWRnZXREZWZhdWx0Rm9jdXMiXSA9IDc2XSA9ICJwZWVrV2lkZ2V0RGVmYXVsdEZvY3VzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJkZWZpbml0aW9uTGlua09wZW5zSW5QZWVrIl0gPSA3N10gPSAiZGVmaW5pdGlvbkxpbmtPcGVuc0luUGVlayI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsicXVpY2tTdWdnZXN0aW9ucyJdID0gNzhdID0gInF1aWNrU3VnZ2VzdGlvbnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInF1aWNrU3VnZ2VzdGlvbnNEZWxheSJdID0gNzldID0gInF1aWNrU3VnZ2VzdGlvbnNEZWxheSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsicmVhZE9ubHkiXSA9IDgwXSA9ICJyZWFkT25seSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsicmVuYW1lT25UeXBlIl0gPSA4MV0gPSAicmVuYW1lT25UeXBlIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJyZW5kZXJDb250cm9sQ2hhcmFjdGVycyJdID0gODJdID0gInJlbmRlckNvbnRyb2xDaGFyYWN0ZXJzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJyZW5kZXJGaW5hbE5ld2xpbmUiXSA9IDgzXSA9ICJyZW5kZXJGaW5hbE5ld2xpbmUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInJlbmRlckxpbmVIaWdobGlnaHQiXSA9IDg0XSA9ICJyZW5kZXJMaW5lSGlnaGxpZ2h0IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJyZW5kZXJMaW5lSGlnaGxpZ2h0T25seVdoZW5Gb2N1cyJdID0gODVdID0gInJlbmRlckxpbmVIaWdobGlnaHRPbmx5V2hlbkZvY3VzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJyZW5kZXJWYWxpZGF0aW9uRGVjb3JhdGlvbnMiXSA9IDg2XSA9ICJyZW5kZXJWYWxpZGF0aW9uRGVjb3JhdGlvbnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInJlbmRlcldoaXRlc3BhY2UiXSA9IDg3XSA9ICJyZW5kZXJXaGl0ZXNwYWNlIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJyZXZlYWxIb3Jpem9udGFsUmlnaHRQYWRkaW5nIl0gPSA4OF0gPSAicmV2ZWFsSG9yaXpvbnRhbFJpZ2h0UGFkZGluZyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsicm91bmRlZFNlbGVjdGlvbiJdID0gODldID0gInJvdW5kZWRTZWxlY3Rpb24iOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInJ1bGVycyJdID0gOTBdID0gInJ1bGVycyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic2Nyb2xsYmFyIl0gPSA5MV0gPSAic2Nyb2xsYmFyIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzY3JvbGxCZXlvbmRMYXN0Q29sdW1uIl0gPSA5Ml0gPSAic2Nyb2xsQmV5b25kTGFzdENvbHVtbiI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic2Nyb2xsQmV5b25kTGFzdExpbmUiXSA9IDkzXSA9ICJzY3JvbGxCZXlvbmRMYXN0TGluZSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic2Nyb2xsUHJlZG9taW5hbnRBeGlzIl0gPSA5NF0gPSAic2Nyb2xsUHJlZG9taW5hbnRBeGlzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzZWxlY3Rpb25DbGlwYm9hcmQiXSA9IDk1XSA9ICJzZWxlY3Rpb25DbGlwYm9hcmQiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInNlbGVjdGlvbkhpZ2hsaWdodCJdID0gOTZdID0gInNlbGVjdGlvbkhpZ2hsaWdodCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic2VsZWN0T25MaW5lTnVtYmVycyJdID0gOTddID0gInNlbGVjdE9uTGluZU51bWJlcnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInNob3dGb2xkaW5nQ29udHJvbHMiXSA9IDk4XSA9ICJzaG93Rm9sZGluZ0NvbnRyb2xzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzaG93VW51c2VkIl0gPSA5OV0gPSAic2hvd1VudXNlZCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic25pcHBldFN1Z2dlc3Rpb25zIl0gPSAxMDBdID0gInNuaXBwZXRTdWdnZXN0aW9ucyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic21hcnRTZWxlY3QiXSA9IDEwMV0gPSAic21hcnRTZWxlY3QiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInNtb290aFNjcm9sbGluZyJdID0gMTAyXSA9ICJzbW9vdGhTY3JvbGxpbmciOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInN0aWNreVRhYlN0b3BzIl0gPSAxMDNdID0gInN0aWNreVRhYlN0b3BzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzdG9wUmVuZGVyaW5nTGluZUFmdGVyIl0gPSAxMDRdID0gInN0b3BSZW5kZXJpbmdMaW5lQWZ0ZXIiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInN1Z2dlc3QiXSA9IDEwNV0gPSAic3VnZ2VzdCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic3VnZ2VzdEZvbnRTaXplIl0gPSAxMDZdID0gInN1Z2dlc3RGb250U2l6ZSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic3VnZ2VzdExpbmVIZWlnaHQiXSA9IDEwN10gPSAic3VnZ2VzdExpbmVIZWlnaHQiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInN1Z2dlc3RPblRyaWdnZXJDaGFyYWN0ZXJzIl0gPSAxMDhdID0gInN1Z2dlc3RPblRyaWdnZXJDaGFyYWN0ZXJzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzdWdnZXN0U2VsZWN0aW9uIl0gPSAxMDldID0gInN1Z2dlc3RTZWxlY3Rpb24iOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInRhYkNvbXBsZXRpb24iXSA9IDExMF0gPSAidGFiQ29tcGxldGlvbiI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsidGFiSW5kZXgiXSA9IDExMV0gPSAidGFiSW5kZXgiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInVuaWNvZGVIaWdobGlnaHRpbmciXSA9IDExMl0gPSAidW5pY29kZUhpZ2hsaWdodGluZyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsidW51c3VhbExpbmVUZXJtaW5hdG9ycyJdID0gMTEzXSA9ICJ1bnVzdWFsTGluZVRlcm1pbmF0b3JzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJ1c2VTaGFkb3dET00iXSA9IDExNF0gPSAidXNlU2hhZG93RE9NIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJ1c2VUYWJTdG9wcyJdID0gMTE1XSA9ICJ1c2VUYWJTdG9wcyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsid29yZFNlcGFyYXRvcnMiXSA9IDExNl0gPSAid29yZFNlcGFyYXRvcnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIndvcmRXcmFwIl0gPSAxMTddID0gIndvcmRXcmFwIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJ3b3JkV3JhcEJyZWFrQWZ0ZXJDaGFyYWN0ZXJzIl0gPSAxMThdID0gIndvcmRXcmFwQnJlYWtBZnRlckNoYXJhY3RlcnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIndvcmRXcmFwQnJlYWtCZWZvcmVDaGFyYWN0ZXJzIl0gPSAxMTldID0gIndvcmRXcmFwQnJlYWtCZWZvcmVDaGFyYWN0ZXJzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJ3b3JkV3JhcENvbHVtbiJdID0gMTIwXSA9ICJ3b3JkV3JhcENvbHVtbiI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsid29yZFdyYXBPdmVycmlkZTEiXSA9IDEyMV0gPSAid29yZFdyYXBPdmVycmlkZTEiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIndvcmRXcmFwT3ZlcnJpZGUyIl0gPSAxMjJdID0gIndvcmRXcmFwT3ZlcnJpZGUyIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJ3cmFwcGluZ0luZGVudCJdID0gMTIzXSA9ICJ3cmFwcGluZ0luZGVudCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsid3JhcHBpbmdTdHJhdGVneSJdID0gMTI0XSA9ICJ3cmFwcGluZ1N0cmF0ZWd5IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzaG93RGVwcmVjYXRlZCJdID0gMTI1XSA9ICJzaG93RGVwcmVjYXRlZCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiaW5sYXlIaW50cyJdID0gMTI2XSA9ICJpbmxheUhpbnRzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJlZGl0b3JDbGFzc05hbWUiXSA9IDEyN10gPSAiZWRpdG9yQ2xhc3NOYW1lIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJwaXhlbFJhdGlvIl0gPSAxMjhdID0gInBpeGVsUmF0aW8iOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInRhYkZvY3VzTW9kZSJdID0gMTI5XSA9ICJ0YWJGb2N1c01vZGUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImxheW91dEluZm8iXSA9IDEzMF0gPSAibGF5b3V0SW5mbyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsid3JhcHBpbmdJbmZvIl0gPSAxMzFdID0gIndyYXBwaW5nSW5mbyI7CiAgICB9KShFZGl0b3JPcHRpb24gfHwgKEVkaXRvck9wdGlvbiA9IHt9KSk7CiAgICAvKioKICAgICAqIEVuZCBvZiBsaW5lIGNoYXJhY3RlciBwcmVmZXJlbmNlLgogICAgICovCiAgICB2YXIgRW5kT2ZMaW5lUHJlZmVyZW5jZTsKICAgIChmdW5jdGlvbiAoRW5kT2ZMaW5lUHJlZmVyZW5jZSkgewogICAgICAgIC8qKgogICAgICAgICAqIFVzZSB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVyIGlkZW50aWZpZWQgaW4gdGhlIHRleHQgYnVmZmVyLgogICAgICAgICAqLwogICAgICAgIEVuZE9mTGluZVByZWZlcmVuY2VbRW5kT2ZMaW5lUHJlZmVyZW5jZVsiVGV4dERlZmluZWQiXSA9IDBdID0gIlRleHREZWZpbmVkIjsKICAgICAgICAvKioKICAgICAgICAgKiBVc2UgbGluZSBmZWVkIChcbikgYXMgdGhlIGVuZCBvZiBsaW5lIGNoYXJhY3Rlci4KICAgICAgICAgKi8KICAgICAgICBFbmRPZkxpbmVQcmVmZXJlbmNlW0VuZE9mTGluZVByZWZlcmVuY2VbIkxGIl0gPSAxXSA9ICJMRiI7CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlIGNhcnJpYWdlIHJldHVybiBhbmQgbGluZSBmZWVkIChcclxuKSBhcyB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVyLgogICAgICAgICAqLwogICAgICAgIEVuZE9mTGluZVByZWZlcmVuY2VbRW5kT2ZMaW5lUHJlZmVyZW5jZVsiQ1JMRiJdID0gMl0gPSAiQ1JMRiI7CiAgICB9KShFbmRPZkxpbmVQcmVmZXJlbmNlIHx8IChFbmRPZkxpbmVQcmVmZXJlbmNlID0ge30pKTsKICAgIC8qKgogICAgICogRW5kIG9mIGxpbmUgY2hhcmFjdGVyIHByZWZlcmVuY2UuCiAgICAgKi8KICAgIHZhciBFbmRPZkxpbmVTZXF1ZW5jZTsKICAgIChmdW5jdGlvbiAoRW5kT2ZMaW5lU2VxdWVuY2UpIHsKICAgICAgICAvKioKICAgICAgICAgKiBVc2UgbGluZSBmZWVkIChcbikgYXMgdGhlIGVuZCBvZiBsaW5lIGNoYXJhY3Rlci4KICAgICAgICAgKi8KICAgICAgICBFbmRPZkxpbmVTZXF1ZW5jZVtFbmRPZkxpbmVTZXF1ZW5jZVsiTEYiXSA9IDBdID0gIkxGIjsKICAgICAgICAvKioKICAgICAgICAgKiBVc2UgY2FycmlhZ2UgcmV0dXJuIGFuZCBsaW5lIGZlZWQgKFxyXG4pIGFzIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIuCiAgICAgICAgICovCiAgICAgICAgRW5kT2ZMaW5lU2VxdWVuY2VbRW5kT2ZMaW5lU2VxdWVuY2VbIkNSTEYiXSA9IDFdID0gIkNSTEYiOwogICAgfSkoRW5kT2ZMaW5lU2VxdWVuY2UgfHwgKEVuZE9mTGluZVNlcXVlbmNlID0ge30pKTsKICAgIHZhciBFeHRlbnNpb25UeXBlOwogICAgKGZ1bmN0aW9uIChFeHRlbnNpb25UeXBlKSB7CiAgICAgICAgRXh0ZW5zaW9uVHlwZVtFeHRlbnNpb25UeXBlWyJTeXN0ZW0iXSA9IDBdID0gIlN5c3RlbSI7CiAgICAgICAgRXh0ZW5zaW9uVHlwZVtFeHRlbnNpb25UeXBlWyJVc2VyIl0gPSAxXSA9ICJVc2VyIjsKICAgIH0pKEV4dGVuc2lvblR5cGUgfHwgKEV4dGVuc2lvblR5cGUgPSB7fSkpOwogICAgLyoqCiAgICAgKiBEZXNjcmliZXMgd2hhdCB0byBkbyB3aXRoIHRoZSBpbmRlbnRhdGlvbiB3aGVuIHByZXNzaW5nIEVudGVyLgogICAgICovCiAgICB2YXIgSW5kZW50QWN0aW9uOwogICAgKGZ1bmN0aW9uIChJbmRlbnRBY3Rpb24pIHsKICAgICAgICAvKioKICAgICAgICAgKiBJbnNlcnQgbmV3IGxpbmUgYW5kIGNvcHkgdGhlIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBJbmRlbnRBY3Rpb25bSW5kZW50QWN0aW9uWyJOb25lIl0gPSAwXSA9ICJOb25lIjsKICAgICAgICAvKioKICAgICAgICAgKiBJbnNlcnQgbmV3IGxpbmUgYW5kIGluZGVudCBvbmNlIChyZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgbGluZSdzIGluZGVudGF0aW9uKS4KICAgICAgICAgKi8KICAgICAgICBJbmRlbnRBY3Rpb25bSW5kZW50QWN0aW9uWyJJbmRlbnQiXSA9IDFdID0gIkluZGVudCI7CiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0IHR3byBuZXcgbGluZXM6CiAgICAgICAgICogIC0gdGhlIGZpcnN0IG9uZSBpbmRlbnRlZCB3aGljaCB3aWxsIGhvbGQgdGhlIGN1cnNvcgogICAgICAgICAqICAtIHRoZSBzZWNvbmQgb25lIGF0IHRoZSBzYW1lIGluZGVudGF0aW9uIGxldmVsCiAgICAgICAgICovCiAgICAgICAgSW5kZW50QWN0aW9uW0luZGVudEFjdGlvblsiSW5kZW50T3V0ZGVudCJdID0gMl0gPSAiSW5kZW50T3V0ZGVudCI7CiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0IG5ldyBsaW5lIGFuZCBvdXRkZW50IG9uY2UgKHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb24pLgogICAgICAgICAqLwogICAgICAgIEluZGVudEFjdGlvbltJbmRlbnRBY3Rpb25bIk91dGRlbnQiXSA9IDNdID0gIk91dGRlbnQiOwogICAgfSkoSW5kZW50QWN0aW9uIHx8IChJbmRlbnRBY3Rpb24gPSB7fSkpOwogICAgdmFyIElubGF5SGludEtpbmQ7CiAgICAoZnVuY3Rpb24gKElubGF5SGludEtpbmQpIHsKICAgICAgICBJbmxheUhpbnRLaW5kW0lubGF5SGludEtpbmRbIk90aGVyIl0gPSAwXSA9ICJPdGhlciI7CiAgICAgICAgSW5sYXlIaW50S2luZFtJbmxheUhpbnRLaW5kWyJUeXBlIl0gPSAxXSA9ICJUeXBlIjsKICAgICAgICBJbmxheUhpbnRLaW5kW0lubGF5SGludEtpbmRbIlBhcmFtZXRlciJdID0gMl0gPSAiUGFyYW1ldGVyIjsKICAgIH0pKElubGF5SGludEtpbmQgfHwgKElubGF5SGludEtpbmQgPSB7fSkpOwogICAgLyoqCiAgICAgKiBIb3cgYW4ge0BsaW5rIElubGluZUNvbXBsZXRpb25zUHJvdmlkZXIgaW5saW5lIGNvbXBsZXRpb24gcHJvdmlkZXJ9IHdhcyB0cmlnZ2VyZWQuCiAgICAgKi8KICAgIHZhciBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQ7CiAgICAoZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCkgewogICAgICAgIC8qKgogICAgICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IHdoaWxlIGVkaXRpbmcuCiAgICAgICAgICogSXQgaXMgc3VmZmljaWVudCB0byByZXR1cm4gYSBzaW5nbGUgY29tcGxldGlvbiBpdGVtIGluIHRoaXMgY2FzZS4KICAgICAgICAgKi8KICAgICAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmRbSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kWyJBdXRvbWF0aWMiXSA9IDBdID0gIkF1dG9tYXRpYyI7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGV4cGxpY2l0bHkgYnkgYSB1c2VyIGdlc3R1cmUuCiAgICAgICAgICogUmV0dXJuIG11bHRpcGxlIGNvbXBsZXRpb24gaXRlbXMgdG8gZW5hYmxlIGN5Y2xpbmcgdGhyb3VnaCB0aGVtLgogICAgICAgICAqLwogICAgICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZFtJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmRbIkV4cGxpY2l0Il0gPSAxXSA9ICJFeHBsaWNpdCI7CiAgICB9KShJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgfHwgKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCA9IHt9KSk7CiAgICAvKioKICAgICAqIFZpcnR1YWwgS2V5IENvZGVzLCB0aGUgdmFsdWUgZG9lcyBub3QgaG9sZCBhbnkgaW5oZXJlbnQgbWVhbmluZy4KICAgICAqIEluc3BpcmVkIHNvbWV3aGF0IGZyb20gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvZGQzNzU3MzEodj12cy44NSkuYXNweAogICAgICogQnV0IHRoZXNlIGFyZSAibW9yZSBnZW5lcmFsIiwgYXMgdGhleSBzaG91bGQgd29yayBhY3Jvc3MgYnJvd3NlcnMgJiBPU2BzLgogICAgICovCiAgICB2YXIgS2V5Q29kZTsKICAgIChmdW5jdGlvbiAoS2V5Q29kZSkgewogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRGVwZW5kc09uS2JMYXlvdXQiXSA9IC0xXSA9ICJEZXBlbmRzT25LYkxheW91dCI7CiAgICAgICAgLyoqCiAgICAgICAgICogUGxhY2VkIGZpcnN0IHRvIGNvdmVyIHRoZSAwIHZhbHVlIG9mIHRoZSBlbnVtLgogICAgICAgICAqLwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiVW5rbm93biJdID0gMF0gPSAiVW5rbm93biI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJCYWNrc3BhY2UiXSA9IDFdID0gIkJhY2tzcGFjZSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJUYWIiXSA9IDJdID0gIlRhYiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJFbnRlciJdID0gM10gPSAiRW50ZXIiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiU2hpZnQiXSA9IDRdID0gIlNoaWZ0IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkN0cmwiXSA9IDVdID0gIkN0cmwiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQWx0Il0gPSA2XSA9ICJBbHQiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiUGF1c2VCcmVhayJdID0gN10gPSAiUGF1c2VCcmVhayI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJDYXBzTG9jayJdID0gOF0gPSAiQ2Fwc0xvY2siOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRXNjYXBlIl0gPSA5XSA9ICJFc2NhcGUiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiU3BhY2UiXSA9IDEwXSA9ICJTcGFjZSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJQYWdlVXAiXSA9IDExXSA9ICJQYWdlVXAiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiUGFnZURvd24iXSA9IDEyXSA9ICJQYWdlRG93biI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJFbmQiXSA9IDEzXSA9ICJFbmQiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiSG9tZSJdID0gMTRdID0gIkhvbWUiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiTGVmdEFycm93Il0gPSAxNV0gPSAiTGVmdEFycm93IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIlVwQXJyb3ciXSA9IDE2XSA9ICJVcEFycm93IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIlJpZ2h0QXJyb3ciXSA9IDE3XSA9ICJSaWdodEFycm93IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkRvd25BcnJvdyJdID0gMThdID0gIkRvd25BcnJvdyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJJbnNlcnQiXSA9IDE5XSA9ICJJbnNlcnQiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRGVsZXRlIl0gPSAyMF0gPSAiRGVsZXRlIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkRpZ2l0MCJdID0gMjFdID0gIkRpZ2l0MCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJEaWdpdDEiXSA9IDIyXSA9ICJEaWdpdDEiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRGlnaXQyIl0gPSAyM10gPSAiRGlnaXQyIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkRpZ2l0MyJdID0gMjRdID0gIkRpZ2l0MyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJEaWdpdDQiXSA9IDI1XSA9ICJEaWdpdDQiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRGlnaXQ1Il0gPSAyNl0gPSAiRGlnaXQ1IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkRpZ2l0NiJdID0gMjddID0gIkRpZ2l0NiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJEaWdpdDciXSA9IDI4XSA9ICJEaWdpdDciOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRGlnaXQ4Il0gPSAyOV0gPSAiRGlnaXQ4IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkRpZ2l0OSJdID0gMzBdID0gIkRpZ2l0OSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlBIl0gPSAzMV0gPSAiS2V5QSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlCIl0gPSAzMl0gPSAiS2V5QiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlDIl0gPSAzM10gPSAiS2V5QyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlEIl0gPSAzNF0gPSAiS2V5RCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlFIl0gPSAzNV0gPSAiS2V5RSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlGIl0gPSAzNl0gPSAiS2V5RiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlHIl0gPSAzN10gPSAiS2V5RyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlIIl0gPSAzOF0gPSAiS2V5SCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlJIl0gPSAzOV0gPSAiS2V5SSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlKIl0gPSA0MF0gPSAiS2V5SiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlLIl0gPSA0MV0gPSAiS2V5SyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlMIl0gPSA0Ml0gPSAiS2V5TCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlNIl0gPSA0M10gPSAiS2V5TSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlOIl0gPSA0NF0gPSAiS2V5TiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlPIl0gPSA0NV0gPSAiS2V5TyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlQIl0gPSA0Nl0gPSAiS2V5UCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlRIl0gPSA0N10gPSAiS2V5USI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlSIl0gPSA0OF0gPSAiS2V5UiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlTIl0gPSA0OV0gPSAiS2V5UyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlUIl0gPSA1MF0gPSAiS2V5VCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlVIl0gPSA1MV0gPSAiS2V5VSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlWIl0gPSA1Ml0gPSAiS2V5ViI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlXIl0gPSA1M10gPSAiS2V5VyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlYIl0gPSA1NF0gPSAiS2V5WCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlZIl0gPSA1NV0gPSAiS2V5WSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLZXlaIl0gPSA1Nl0gPSAiS2V5WiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJNZXRhIl0gPSA1N10gPSAiTWV0YSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJDb250ZXh0TWVudSJdID0gNThdID0gIkNvbnRleHRNZW51IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkYxIl0gPSA1OV0gPSAiRjEiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjIiXSA9IDYwXSA9ICJGMiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGMyJdID0gNjFdID0gIkYzIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkY0Il0gPSA2Ml0gPSAiRjQiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjUiXSA9IDYzXSA9ICJGNSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGNiJdID0gNjRdID0gIkY2IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkY3Il0gPSA2NV0gPSAiRjciOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjgiXSA9IDY2XSA9ICJGOCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGOSJdID0gNjddID0gIkY5IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkYxMCJdID0gNjhdID0gIkYxMCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGMTEiXSA9IDY5XSA9ICJGMTEiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjEyIl0gPSA3MF0gPSAiRjEyIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkYxMyJdID0gNzFdID0gIkYxMyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGMTQiXSA9IDcyXSA9ICJGMTQiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjE1Il0gPSA3M10gPSAiRjE1IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkYxNiJdID0gNzRdID0gIkYxNiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGMTciXSA9IDc1XSA9ICJGMTciOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjE4Il0gPSA3Nl0gPSAiRjE4IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkYxOSJdID0gNzddID0gIkYxOSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1Mb2NrIl0gPSA3OF0gPSAiTnVtTG9jayI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJTY3JvbGxMb2NrIl0gPSA3OV0gPSAiU2Nyb2xsTG9jayI7CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlZCBmb3IgbWlzY2VsbGFuZW91cyBjaGFyYWN0ZXJzOyBpdCBjYW4gdmFyeSBieSBrZXlib2FyZC4KICAgICAgICAgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJzs6JyBrZXkKICAgICAgICAgKi8KICAgICAgICBLZXlDb2RlW0tleUNvZGVbIlNlbWljb2xvbiJdID0gODBdID0gIlNlbWljb2xvbiI7CiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGFueSBjb3VudHJ5L3JlZ2lvbiwgdGhlICcrJyBrZXkKICAgICAgICAgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJz0rJyBrZXkKICAgICAgICAgKi8KICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkVxdWFsIl0gPSA4MV0gPSAiRXF1YWwiOwogICAgICAgIC8qKgogICAgICAgICAqIEZvciBhbnkgY291bnRyeS9yZWdpb24sIHRoZSAnLCcga2V5CiAgICAgICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICcsPCcga2V5CiAgICAgICAgICovCiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJDb21tYSJdID0gODJdID0gIkNvbW1hIjsKICAgICAgICAvKioKICAgICAgICAgKiBGb3IgYW55IGNvdW50cnkvcmVnaW9uLCB0aGUgJy0nIGtleQogICAgICAgICAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnLV8nIGtleQogICAgICAgICAqLwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiTWludXMiXSA9IDgzXSA9ICJNaW51cyI7CiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGFueSBjb3VudHJ5L3JlZ2lvbiwgdGhlICcuJyBrZXkKICAgICAgICAgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJy4+JyBrZXkKICAgICAgICAgKi8KICAgICAgICBLZXlDb2RlW0tleUNvZGVbIlBlcmlvZCJdID0gODRdID0gIlBlcmlvZCI7CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlZCBmb3IgbWlzY2VsbGFuZW91cyBjaGFyYWN0ZXJzOyBpdCBjYW4gdmFyeSBieSBrZXlib2FyZC4KICAgICAgICAgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJy8/JyBrZXkKICAgICAgICAgKi8KICAgICAgICBLZXlDb2RlW0tleUNvZGVbIlNsYXNoIl0gPSA4NV0gPSAiU2xhc2giOwogICAgICAgIC8qKgogICAgICAgICAqIFVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgY2hhcmFjdGVyczsgaXQgY2FuIHZhcnkgYnkga2V5Ym9hcmQuCiAgICAgICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICdgficga2V5CiAgICAgICAgICovCiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJCYWNrcXVvdGUiXSA9IDg2XSA9ICJCYWNrcXVvdGUiOwogICAgICAgIC8qKgogICAgICAgICAqIFVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgY2hhcmFjdGVyczsgaXQgY2FuIHZhcnkgYnkga2V5Ym9hcmQuCiAgICAgICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICdbeycga2V5CiAgICAgICAgICovCiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJCcmFja2V0TGVmdCJdID0gODddID0gIkJyYWNrZXRMZWZ0IjsKICAgICAgICAvKioKICAgICAgICAgKiBVc2VkIGZvciBtaXNjZWxsYW5lb3VzIGNoYXJhY3RlcnM7IGl0IGNhbiB2YXJ5IGJ5IGtleWJvYXJkLgogICAgICAgICAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnXHwnIGtleQogICAgICAgICAqLwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQmFja3NsYXNoIl0gPSA4OF0gPSAiQmFja3NsYXNoIjsKICAgICAgICAvKioKICAgICAgICAgKiBVc2VkIGZvciBtaXNjZWxsYW5lb3VzIGNoYXJhY3RlcnM7IGl0IGNhbiB2YXJ5IGJ5IGtleWJvYXJkLgogICAgICAgICAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnXX0nIGtleQogICAgICAgICAqLwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQnJhY2tldFJpZ2h0Il0gPSA4OV0gPSAiQnJhY2tldFJpZ2h0IjsKICAgICAgICAvKioKICAgICAgICAgKiBVc2VkIGZvciBtaXNjZWxsYW5lb3VzIGNoYXJhY3RlcnM7IGl0IGNhbiB2YXJ5IGJ5IGtleWJvYXJkLgogICAgICAgICAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnJyInIGtleQogICAgICAgICAqLwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiUXVvdGUiXSA9IDkwXSA9ICJRdW90ZSI7CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlZCBmb3IgbWlzY2VsbGFuZW91cyBjaGFyYWN0ZXJzOyBpdCBjYW4gdmFyeSBieSBrZXlib2FyZC4KICAgICAgICAgKi8KICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk9FTV84Il0gPSA5MV0gPSAiT0VNXzgiOwogICAgICAgIC8qKgogICAgICAgICAqIEVpdGhlciB0aGUgYW5nbGUgYnJhY2tldCBrZXkgb3IgdGhlIGJhY2tzbGFzaCBrZXkgb24gdGhlIFJUIDEwMi1rZXkga2V5Ym9hcmQuCiAgICAgICAgICovCiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJJbnRsQmFja3NsYXNoIl0gPSA5Ml0gPSAiSW50bEJhY2tzbGFzaCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWQwIl0gPSA5M10gPSAiTnVtcGFkMCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWQxIl0gPSA5NF0gPSAiTnVtcGFkMSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWQyIl0gPSA5NV0gPSAiTnVtcGFkMiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWQzIl0gPSA5Nl0gPSAiTnVtcGFkMyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWQ0Il0gPSA5N10gPSAiTnVtcGFkNCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWQ1Il0gPSA5OF0gPSAiTnVtcGFkNSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWQ2Il0gPSA5OV0gPSAiTnVtcGFkNiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWQ3Il0gPSAxMDBdID0gIk51bXBhZDciOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiTnVtcGFkOCJdID0gMTAxXSA9ICJOdW1wYWQ4IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZDkiXSA9IDEwMl0gPSAiTnVtcGFkOSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWRNdWx0aXBseSJdID0gMTAzXSA9ICJOdW1wYWRNdWx0aXBseSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWRBZGQiXSA9IDEwNF0gPSAiTnVtcGFkQWRkIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk5VTVBBRF9TRVBBUkFUT1IiXSA9IDEwNV0gPSAiTlVNUEFEX1NFUEFSQVRPUiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWRTdWJ0cmFjdCJdID0gMTA2XSA9ICJOdW1wYWRTdWJ0cmFjdCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWREZWNpbWFsIl0gPSAxMDddID0gIk51bXBhZERlY2ltYWwiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiTnVtcGFkRGl2aWRlIl0gPSAxMDhdID0gIk51bXBhZERpdmlkZSI7CiAgICAgICAgLyoqCiAgICAgICAgICogQ292ZXIgYWxsIGtleSBjb2RlcyB3aGVuIElNRSBpcyBwcm9jZXNzaW5nIGlucHV0LgogICAgICAgICAqLwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiS0VZX0lOX0NPTVBPU0lUSU9OIl0gPSAxMDldID0gIktFWV9JTl9DT01QT1NJVElPTiI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJBQk5UX0MxIl0gPSAxMTBdID0gIkFCTlRfQzEiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQUJOVF9DMiJdID0gMTExXSA9ICJBQk5UX0MyIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkF1ZGlvVm9sdW1lTXV0ZSJdID0gMTEyXSA9ICJBdWRpb1ZvbHVtZU11dGUiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQXVkaW9Wb2x1bWVVcCJdID0gMTEzXSA9ICJBdWRpb1ZvbHVtZVVwIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkF1ZGlvVm9sdW1lRG93biJdID0gMTE0XSA9ICJBdWRpb1ZvbHVtZURvd24iOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQnJvd3NlclNlYXJjaCJdID0gMTE1XSA9ICJCcm93c2VyU2VhcmNoIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkJyb3dzZXJIb21lIl0gPSAxMTZdID0gIkJyb3dzZXJIb21lIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkJyb3dzZXJCYWNrIl0gPSAxMTddID0gIkJyb3dzZXJCYWNrIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkJyb3dzZXJGb3J3YXJkIl0gPSAxMThdID0gIkJyb3dzZXJGb3J3YXJkIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk1lZGlhVHJhY2tOZXh0Il0gPSAxMTldID0gIk1lZGlhVHJhY2tOZXh0IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk1lZGlhVHJhY2tQcmV2aW91cyJdID0gMTIwXSA9ICJNZWRpYVRyYWNrUHJldmlvdXMiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiTWVkaWFTdG9wIl0gPSAxMjFdID0gIk1lZGlhU3RvcCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJNZWRpYVBsYXlQYXVzZSJdID0gMTIyXSA9ICJNZWRpYVBsYXlQYXVzZSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJMYXVuY2hNZWRpYVBsYXllciJdID0gMTIzXSA9ICJMYXVuY2hNZWRpYVBsYXllciI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJMYXVuY2hNYWlsIl0gPSAxMjRdID0gIkxhdW5jaE1haWwiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiTGF1bmNoQXBwMiJdID0gMTI1XSA9ICJMYXVuY2hBcHAyIjsKICAgICAgICAvKioKICAgICAgICAgKiBQbGFjZWQgbGFzdCB0byBjb3ZlciB0aGUgbGVuZ3RoIG9mIHRoZSBlbnVtLgogICAgICAgICAqIFBsZWFzZSBkbyBub3QgZGVwZW5kIG9uIHRoaXMgdmFsdWUhCiAgICAgICAgICovCiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJNQVhfVkFMVUUiXSA9IDEyNl0gPSAiTUFYX1ZBTFVFIjsKICAgIH0pKEtleUNvZGUgfHwgKEtleUNvZGUgPSB7fSkpOwogICAgdmFyIEtleWJpbmRpbmdTb3VyY2U7CiAgICAoZnVuY3Rpb24gKEtleWJpbmRpbmdTb3VyY2UpIHsKICAgICAgICBLZXliaW5kaW5nU291cmNlW0tleWJpbmRpbmdTb3VyY2VbIkRlZmF1bHQiXSA9IDFdID0gIkRlZmF1bHQiOwogICAgICAgIEtleWJpbmRpbmdTb3VyY2VbS2V5YmluZGluZ1NvdXJjZVsiVXNlciJdID0gMl0gPSAiVXNlciI7CiAgICB9KShLZXliaW5kaW5nU291cmNlIHx8IChLZXliaW5kaW5nU291cmNlID0ge30pKTsKICAgIHZhciBLZXliaW5kaW5nV2VpZ2h0OwogICAgKGZ1bmN0aW9uIChLZXliaW5kaW5nV2VpZ2h0KSB7CiAgICAgICAgS2V5YmluZGluZ1dlaWdodFtLZXliaW5kaW5nV2VpZ2h0WyJFZGl0b3JDb3JlIl0gPSAwXSA9ICJFZGl0b3JDb3JlIjsKICAgICAgICBLZXliaW5kaW5nV2VpZ2h0W0tleWJpbmRpbmdXZWlnaHRbIkVkaXRvckNvbnRyaWIiXSA9IDEwMF0gPSAiRWRpdG9yQ29udHJpYiI7CiAgICAgICAgS2V5YmluZGluZ1dlaWdodFtLZXliaW5kaW5nV2VpZ2h0WyJXb3JrYmVuY2hDb250cmliIl0gPSAyMDBdID0gIldvcmtiZW5jaENvbnRyaWIiOwogICAgICAgIEtleWJpbmRpbmdXZWlnaHRbS2V5YmluZGluZ1dlaWdodFsiQnVpbHRpbkV4dGVuc2lvbiJdID0gMzAwXSA9ICJCdWlsdGluRXh0ZW5zaW9uIjsKICAgICAgICBLZXliaW5kaW5nV2VpZ2h0W0tleWJpbmRpbmdXZWlnaHRbIkV4dGVybmFsRXh0ZW5zaW9uIl0gPSA0MDBdID0gIkV4dGVybmFsRXh0ZW5zaW9uIjsKICAgIH0pKEtleWJpbmRpbmdXZWlnaHQgfHwgKEtleWJpbmRpbmdXZWlnaHQgPSB7fSkpOwogICAgLyoqCiAgICAgKiBPcGVuIGVuZGVkIGVudW0gYXQgcnVudGltZQogICAgICovCiAgICB2YXIgTGFuZ3VhZ2VJZDsKICAgIChmdW5jdGlvbiAoTGFuZ3VhZ2VJZCkgewogICAgICAgIExhbmd1YWdlSWRbTGFuZ3VhZ2VJZFsiTnVsbCJdID0gMF0gPSAiTnVsbCI7CiAgICAgICAgTGFuZ3VhZ2VJZFtMYW5ndWFnZUlkWyJQbGFpblRleHQiXSA9IDFdID0gIlBsYWluVGV4dCI7CiAgICB9KShMYW5ndWFnZUlkIHx8IChMYW5ndWFnZUlkID0ge30pKTsKICAgIHZhciBMb2dMZXZlbCQxOwogICAgKGZ1bmN0aW9uIChMb2dMZXZlbCkgewogICAgICAgIExvZ0xldmVsW0xvZ0xldmVsWyJUcmFjZSJdID0gMF0gPSAiVHJhY2UiOwogICAgICAgIExvZ0xldmVsW0xvZ0xldmVsWyJEZWJ1ZyJdID0gMV0gPSAiRGVidWciOwogICAgICAgIExvZ0xldmVsW0xvZ0xldmVsWyJJbmZvIl0gPSAyXSA9ICJJbmZvIjsKICAgICAgICBMb2dMZXZlbFtMb2dMZXZlbFsiV2FybmluZyJdID0gM10gPSAiV2FybmluZyI7CiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWxbIkVycm9yIl0gPSA0XSA9ICJFcnJvciI7CiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWxbIkNyaXRpY2FsIl0gPSA1XSA9ICJDcml0aWNhbCI7CiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWxbIk9mZiJdID0gNl0gPSAiT2ZmIjsKICAgIH0pKExvZ0xldmVsJDEgfHwgKExvZ0xldmVsJDEgPSB7fSkpOwogICAgdmFyIE1hcmtkb3duU3RyaW5nVGV4dE5ld2xpbmVTdHlsZTsKICAgIChmdW5jdGlvbiAoTWFya2Rvd25TdHJpbmdUZXh0TmV3bGluZVN0eWxlKSB7CiAgICAgICAgTWFya2Rvd25TdHJpbmdUZXh0TmV3bGluZVN0eWxlW01hcmtkb3duU3RyaW5nVGV4dE5ld2xpbmVTdHlsZVsiUGFyYWdyYXBoIl0gPSAwXSA9ICJQYXJhZ3JhcGgiOwogICAgICAgIE1hcmtkb3duU3RyaW5nVGV4dE5ld2xpbmVTdHlsZVtNYXJrZG93blN0cmluZ1RleHROZXdsaW5lU3R5bGVbIkJyZWFrIl0gPSAxXSA9ICJCcmVhayI7CiAgICB9KShNYXJrZG93blN0cmluZ1RleHROZXdsaW5lU3R5bGUgfHwgKE1hcmtkb3duU3RyaW5nVGV4dE5ld2xpbmVTdHlsZSA9IHt9KSk7CiAgICB2YXIgTWFya2VyU2V2ZXJpdHk7CiAgICAoZnVuY3Rpb24gKE1hcmtlclNldmVyaXR5KSB7CiAgICAgICAgTWFya2VyU2V2ZXJpdHlbTWFya2VyU2V2ZXJpdHlbIkhpbnQiXSA9IDFdID0gIkhpbnQiOwogICAgICAgIE1hcmtlclNldmVyaXR5W01hcmtlclNldmVyaXR5WyJJbmZvIl0gPSAyXSA9ICJJbmZvIjsKICAgICAgICBNYXJrZXJTZXZlcml0eVtNYXJrZXJTZXZlcml0eVsiV2FybmluZyJdID0gNF0gPSAiV2FybmluZyI7CiAgICAgICAgTWFya2VyU2V2ZXJpdHlbTWFya2VyU2V2ZXJpdHlbIkVycm9yIl0gPSA4XSA9ICJFcnJvciI7CiAgICB9KShNYXJrZXJTZXZlcml0eSB8fCAoTWFya2VyU2V2ZXJpdHkgPSB7fSkpOwogICAgdmFyIE1hcmtlclRhZzsKICAgIChmdW5jdGlvbiAoTWFya2VyVGFnKSB7CiAgICAgICAgTWFya2VyVGFnW01hcmtlclRhZ1siVW5uZWNlc3NhcnkiXSA9IDFdID0gIlVubmVjZXNzYXJ5IjsKICAgICAgICBNYXJrZXJUYWdbTWFya2VyVGFnWyJEZXByZWNhdGVkIl0gPSAyXSA9ICJEZXByZWNhdGVkIjsKICAgIH0pKE1hcmtlclRhZyB8fCAoTWFya2VyVGFnID0ge30pKTsKICAgIC8qKgogICAgICogUG9zaXRpb24gaW4gdGhlIG1pbmltYXAgdG8gcmVuZGVyIHRoZSBkZWNvcmF0aW9uLgogICAgICovCiAgICB2YXIgTWluaW1hcFBvc2l0aW9uJDE7CiAgICAoZnVuY3Rpb24gKE1pbmltYXBQb3NpdGlvbikgewogICAgICAgIE1pbmltYXBQb3NpdGlvbltNaW5pbWFwUG9zaXRpb25bIklubGluZSJdID0gMV0gPSAiSW5saW5lIjsKICAgICAgICBNaW5pbWFwUG9zaXRpb25bTWluaW1hcFBvc2l0aW9uWyJHdXR0ZXIiXSA9IDJdID0gIkd1dHRlciI7CiAgICB9KShNaW5pbWFwUG9zaXRpb24kMSB8fCAoTWluaW1hcFBvc2l0aW9uJDEgPSB7fSkpOwogICAgLyoqCiAgICAgKiBUeXBlIG9mIGhpdCBlbGVtZW50IHdpdGggdGhlIG1vdXNlIGluIHRoZSBlZGl0b3IuCiAgICAgKi8KICAgIHZhciBNb3VzZVRhcmdldFR5cGU7CiAgICAoZnVuY3Rpb24gKE1vdXNlVGFyZ2V0VHlwZSkgewogICAgICAgIC8qKgogICAgICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiBhbiB1bmtub3duIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVsiVU5LTk9XTiJdID0gMF0gPSAiVU5LTk9XTiI7CiAgICAgICAgLyoqCiAgICAgICAgICogTW91c2UgaXMgb24gdG9wIG9mIHRoZSB0ZXh0YXJlYSB1c2VkIGZvciBpbnB1dC4KICAgICAgICAgKi8KICAgICAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlWyJURVhUQVJFQSJdID0gMV0gPSAiVEVYVEFSRUEiOwogICAgICAgIC8qKgogICAgICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiB0aGUgZ2x5cGggbWFyZ2luCiAgICAgICAgICovCiAgICAgICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVsiR1VUVEVSX0dMWVBIX01BUkdJTiJdID0gMl0gPSAiR1VUVEVSX0dMWVBIX01BUkdJTiI7CiAgICAgICAgLyoqCiAgICAgICAgICogTW91c2UgaXMgb24gdG9wIG9mIHRoZSBsaW5lIG51bWJlcnMKICAgICAgICAgKi8KICAgICAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlWyJHVVRURVJfTElORV9OVU1CRVJTIl0gPSAzXSA9ICJHVVRURVJfTElORV9OVU1CRVJTIjsKICAgICAgICAvKioKICAgICAgICAgKiBNb3VzZSBpcyBvbiB0b3Agb2YgdGhlIGxpbmUgZGVjb3JhdGlvbnMKICAgICAgICAgKi8KICAgICAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlWyJHVVRURVJfTElORV9ERUNPUkFUSU9OUyJdID0gNF0gPSAiR1VUVEVSX0xJTkVfREVDT1JBVElPTlMiOwogICAgICAgIC8qKgogICAgICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiB0aGUgd2hpdGVzcGFjZSBsZWZ0IGluIHRoZSBndXR0ZXIgYnkgYSB2aWV3IHpvbmUuCiAgICAgICAgICovCiAgICAgICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVsiR1VUVEVSX1ZJRVdfWk9ORSJdID0gNV0gPSAiR1VUVEVSX1ZJRVdfWk9ORSI7CiAgICAgICAgLyoqCiAgICAgICAgICogTW91c2UgaXMgb24gdG9wIG9mIHRleHQgaW4gdGhlIGNvbnRlbnQuCiAgICAgICAgICovCiAgICAgICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVsiQ09OVEVOVF9URVhUIl0gPSA2XSA9ICJDT05URU5UX1RFWFQiOwogICAgICAgIC8qKgogICAgICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiBlbXB0eSBzcGFjZSBpbiB0aGUgY29udGVudCAoZS5nLiBhZnRlciBsaW5lIHRleHQgb3IgYmVsb3cgbGFzdCBsaW5lKQogICAgICAgICAqLwogICAgICAgIE1vdXNlVGFyZ2V0VHlwZVtNb3VzZVRhcmdldFR5cGVbIkNPTlRFTlRfRU1QVFkiXSA9IDddID0gIkNPTlRFTlRfRU1QVFkiOwogICAgICAgIC8qKgogICAgICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiBhIHZpZXcgem9uZSBpbiB0aGUgY29udGVudC4KICAgICAgICAgKi8KICAgICAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlWyJDT05URU5UX1ZJRVdfWk9ORSJdID0gOF0gPSAiQ09OVEVOVF9WSUVXX1pPTkUiOwogICAgICAgIC8qKgogICAgICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiBhIGNvbnRlbnQgd2lkZ2V0LgogICAgICAgICAqLwogICAgICAgIE1vdXNlVGFyZ2V0VHlwZVtNb3VzZVRhcmdldFR5cGVbIkNPTlRFTlRfV0lER0VUIl0gPSA5XSA9ICJDT05URU5UX1dJREdFVCI7CiAgICAgICAgLyoqCiAgICAgICAgICogTW91c2UgaXMgb24gdG9wIG9mIHRoZSBkZWNvcmF0aW9ucyBvdmVydmlldyBydWxlci4KICAgICAgICAgKi8KICAgICAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlWyJPVkVSVklFV19SVUxFUiJdID0gMTBdID0gIk9WRVJWSUVXX1JVTEVSIjsKICAgICAgICAvKioKICAgICAgICAgKiBNb3VzZSBpcyBvbiB0b3Agb2YgYSBzY3JvbGxiYXIuCiAgICAgICAgICovCiAgICAgICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVsiU0NST0xMQkFSIl0gPSAxMV0gPSAiU0NST0xMQkFSIjsKICAgICAgICAvKioKICAgICAgICAgKiBNb3VzZSBpcyBvbiB0b3Agb2YgYW4gb3ZlcmxheSB3aWRnZXQuCiAgICAgICAgICovCiAgICAgICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVsiT1ZFUkxBWV9XSURHRVQiXSA9IDEyXSA9ICJPVkVSTEFZX1dJREdFVCI7CiAgICAgICAgLyoqCiAgICAgICAgICogTW91c2UgaXMgb3V0c2lkZSBvZiB0aGUgZWRpdG9yLgogICAgICAgICAqLwogICAgICAgIE1vdXNlVGFyZ2V0VHlwZVtNb3VzZVRhcmdldFR5cGVbIk9VVFNJREVfRURJVE9SIl0gPSAxM10gPSAiT1VUU0lERV9FRElUT1IiOwogICAgfSkoTW91c2VUYXJnZXRUeXBlIHx8IChNb3VzZVRhcmdldFR5cGUgPSB7fSkpOwogICAgdmFyIE9wZXJhdGluZ1N5c3RlbTsKICAgIChmdW5jdGlvbiAoT3BlcmF0aW5nU3lzdGVtKSB7CiAgICAgICAgT3BlcmF0aW5nU3lzdGVtW09wZXJhdGluZ1N5c3RlbVsiV2luZG93cyJdID0gMV0gPSAiV2luZG93cyI7CiAgICAgICAgT3BlcmF0aW5nU3lzdGVtW09wZXJhdGluZ1N5c3RlbVsiTWFjaW50b3NoIl0gPSAyXSA9ICJNYWNpbnRvc2giOwogICAgICAgIE9wZXJhdGluZ1N5c3RlbVtPcGVyYXRpbmdTeXN0ZW1bIkxpbnV4Il0gPSAzXSA9ICJMaW51eCI7CiAgICB9KShPcGVyYXRpbmdTeXN0ZW0gfHwgKE9wZXJhdGluZ1N5c3RlbSA9IHt9KSk7CiAgICAvKioKICAgICAqIEEgcG9zaXRpb25pbmcgcHJlZmVyZW5jZSBmb3IgcmVuZGVyaW5nIG92ZXJsYXkgd2lkZ2V0cy4KICAgICAqLwogICAgdmFyIE92ZXJsYXlXaWRnZXRQb3NpdGlvblByZWZlcmVuY2U7CiAgICAoZnVuY3Rpb24gKE92ZXJsYXlXaWRnZXRQb3NpdGlvblByZWZlcmVuY2UpIHsKICAgICAgICAvKioKICAgICAgICAgKiBQb3NpdGlvbiB0aGUgb3ZlcmxheSB3aWRnZXQgaW4gdGhlIHRvcCByaWdodCBjb3JuZXIKICAgICAgICAgKi8KICAgICAgICBPdmVybGF5V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlW092ZXJsYXlXaWRnZXRQb3NpdGlvblByZWZlcmVuY2VbIlRPUF9SSUdIVF9DT1JORVIiXSA9IDBdID0gIlRPUF9SSUdIVF9DT1JORVIiOwogICAgICAgIC8qKgogICAgICAgICAqIFBvc2l0aW9uIHRoZSBvdmVybGF5IHdpZGdldCBpbiB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lcgogICAgICAgICAqLwogICAgICAgIE92ZXJsYXlXaWRnZXRQb3NpdGlvblByZWZlcmVuY2VbT3ZlcmxheVdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVsiQk9UVE9NX1JJR0hUX0NPUk5FUiJdID0gMV0gPSAiQk9UVE9NX1JJR0hUX0NPUk5FUiI7CiAgICAgICAgLyoqCiAgICAgICAgICogUG9zaXRpb24gdGhlIG92ZXJsYXkgd2lkZ2V0IGluIHRoZSB0b3AgY2VudGVyCiAgICAgICAgICovCiAgICAgICAgT3ZlcmxheVdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVtPdmVybGF5V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlWyJUT1BfQ0VOVEVSIl0gPSAyXSA9ICJUT1BfQ0VOVEVSIjsKICAgIH0pKE92ZXJsYXlXaWRnZXRQb3NpdGlvblByZWZlcmVuY2UgfHwgKE92ZXJsYXlXaWRnZXRQb3NpdGlvblByZWZlcmVuY2UgPSB7fSkpOwogICAgLyoqCiAgICAgKiBWZXJ0aWNhbCBMYW5lIGluIHRoZSBvdmVydmlldyBydWxlciBvZiB0aGUgZWRpdG9yLgogICAgICovCiAgICB2YXIgT3ZlcnZpZXdSdWxlckxhbmUkMTsKICAgIChmdW5jdGlvbiAoT3ZlcnZpZXdSdWxlckxhbmUpIHsKICAgICAgICBPdmVydmlld1J1bGVyTGFuZVtPdmVydmlld1J1bGVyTGFuZVsiTGVmdCJdID0gMV0gPSAiTGVmdCI7CiAgICAgICAgT3ZlcnZpZXdSdWxlckxhbmVbT3ZlcnZpZXdSdWxlckxhbmVbIkNlbnRlciJdID0gMl0gPSAiQ2VudGVyIjsKICAgICAgICBPdmVydmlld1J1bGVyTGFuZVtPdmVydmlld1J1bGVyTGFuZVsiUmlnaHQiXSA9IDRdID0gIlJpZ2h0IjsKICAgICAgICBPdmVydmlld1J1bGVyTGFuZVtPdmVydmlld1J1bGVyTGFuZVsiRnVsbCJdID0gN10gPSAiRnVsbCI7CiAgICB9KShPdmVydmlld1J1bGVyTGFuZSQxIHx8IChPdmVydmlld1J1bGVyTGFuZSQxID0ge30pKTsKICAgIHZhciBQcm9ncmVzc0xvY2F0aW9uOwogICAgKGZ1bmN0aW9uIChQcm9ncmVzc0xvY2F0aW9uKSB7CiAgICAgICAgUHJvZ3Jlc3NMb2NhdGlvbltQcm9ncmVzc0xvY2F0aW9uWyJFeHBsb3JlciJdID0gMV0gPSAiRXhwbG9yZXIiOwogICAgICAgIFByb2dyZXNzTG9jYXRpb25bUHJvZ3Jlc3NMb2NhdGlvblsiU2NtIl0gPSAzXSA9ICJTY20iOwogICAgICAgIFByb2dyZXNzTG9jYXRpb25bUHJvZ3Jlc3NMb2NhdGlvblsiRXh0ZW5zaW9ucyJdID0gNV0gPSAiRXh0ZW5zaW9ucyI7CiAgICAgICAgUHJvZ3Jlc3NMb2NhdGlvbltQcm9ncmVzc0xvY2F0aW9uWyJXaW5kb3ciXSA9IDEwXSA9ICJXaW5kb3ciOwogICAgICAgIFByb2dyZXNzTG9jYXRpb25bUHJvZ3Jlc3NMb2NhdGlvblsiTm90aWZpY2F0aW9uIl0gPSAxNV0gPSAiTm90aWZpY2F0aW9uIjsKICAgICAgICBQcm9ncmVzc0xvY2F0aW9uW1Byb2dyZXNzTG9jYXRpb25bIkRpYWxvZyJdID0gMjBdID0gIkRpYWxvZyI7CiAgICB9KShQcm9ncmVzc0xvY2F0aW9uIHx8IChQcm9ncmVzc0xvY2F0aW9uID0ge30pKTsKICAgIHZhciBSZW5kZXJMaW5lTnVtYmVyc1R5cGU7CiAgICAoZnVuY3Rpb24gKFJlbmRlckxpbmVOdW1iZXJzVHlwZSkgewogICAgICAgIFJlbmRlckxpbmVOdW1iZXJzVHlwZVtSZW5kZXJMaW5lTnVtYmVyc1R5cGVbIk9mZiJdID0gMF0gPSAiT2ZmIjsKICAgICAgICBSZW5kZXJMaW5lTnVtYmVyc1R5cGVbUmVuZGVyTGluZU51bWJlcnNUeXBlWyJPbiJdID0gMV0gPSAiT24iOwogICAgICAgIFJlbmRlckxpbmVOdW1iZXJzVHlwZVtSZW5kZXJMaW5lTnVtYmVyc1R5cGVbIlJlbGF0aXZlIl0gPSAyXSA9ICJSZWxhdGl2ZSI7CiAgICAgICAgUmVuZGVyTGluZU51bWJlcnNUeXBlW1JlbmRlckxpbmVOdW1iZXJzVHlwZVsiSW50ZXJ2YWwiXSA9IDNdID0gIkludGVydmFsIjsKICAgICAgICBSZW5kZXJMaW5lTnVtYmVyc1R5cGVbUmVuZGVyTGluZU51bWJlcnNUeXBlWyJDdXN0b20iXSA9IDRdID0gIkN1c3RvbSI7CiAgICB9KShSZW5kZXJMaW5lTnVtYmVyc1R5cGUgfHwgKFJlbmRlckxpbmVOdW1iZXJzVHlwZSA9IHt9KSk7CiAgICB2YXIgUmVuZGVyTWluaW1hcDsKICAgIChmdW5jdGlvbiAoUmVuZGVyTWluaW1hcCkgewogICAgICAgIFJlbmRlck1pbmltYXBbUmVuZGVyTWluaW1hcFsiTm9uZSJdID0gMF0gPSAiTm9uZSI7CiAgICAgICAgUmVuZGVyTWluaW1hcFtSZW5kZXJNaW5pbWFwWyJUZXh0Il0gPSAxXSA9ICJUZXh0IjsKICAgICAgICBSZW5kZXJNaW5pbWFwW1JlbmRlck1pbmltYXBbIkJsb2NrcyJdID0gMl0gPSAiQmxvY2tzIjsKICAgIH0pKFJlbmRlck1pbmltYXAgfHwgKFJlbmRlck1pbmltYXAgPSB7fSkpOwogICAgLyoqCiAgICAgKiBrZXlib2FyZEV2ZW50LmNvZGUKICAgICAqLwogICAgdmFyIFNjYW5Db2RlOwogICAgKGZ1bmN0aW9uIChTY2FuQ29kZSkgewogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJEZXBlbmRzT25LYkxheW91dCJdID0gLTFdID0gIkRlcGVuZHNPbktiTGF5b3V0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTm9uZSJdID0gMF0gPSAiTm9uZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkh5cGVyIl0gPSAxXSA9ICJIeXBlciI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlN1cGVyIl0gPSAyXSA9ICJTdXBlciI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkZuIl0gPSAzXSA9ICJGbiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkZuTG9jayJdID0gNF0gPSAiRm5Mb2NrIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiU3VzcGVuZCJdID0gNV0gPSAiU3VzcGVuZCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlJlc3VtZSJdID0gNl0gPSAiUmVzdW1lIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiVHVyYm8iXSA9IDddID0gIlR1cmJvIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiU2xlZXAiXSA9IDhdID0gIlNsZWVwIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiV2FrZVVwIl0gPSA5XSA9ICJXYWtlVXAiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlBIl0gPSAxMF0gPSAiS2V5QSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleUIiXSA9IDExXSA9ICJLZXlCIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5QyJdID0gMTJdID0gIktleUMiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlEIl0gPSAxM10gPSAiS2V5RCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleUUiXSA9IDE0XSA9ICJLZXlFIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5RiJdID0gMTVdID0gIktleUYiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlHIl0gPSAxNl0gPSAiS2V5RyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleUgiXSA9IDE3XSA9ICJLZXlIIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5SSJdID0gMThdID0gIktleUkiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlKIl0gPSAxOV0gPSAiS2V5SiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleUsiXSA9IDIwXSA9ICJLZXlLIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5TCJdID0gMjFdID0gIktleUwiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlNIl0gPSAyMl0gPSAiS2V5TSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleU4iXSA9IDIzXSA9ICJLZXlOIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5TyJdID0gMjRdID0gIktleU8iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlQIl0gPSAyNV0gPSAiS2V5UCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleVEiXSA9IDI2XSA9ICJLZXlRIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5UiJdID0gMjddID0gIktleVIiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlTIl0gPSAyOF0gPSAiS2V5UyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleVQiXSA9IDI5XSA9ICJLZXlUIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5VSJdID0gMzBdID0gIktleVUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlWIl0gPSAzMV0gPSAiS2V5ViI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleVciXSA9IDMyXSA9ICJLZXlXIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5WCJdID0gMzNdID0gIktleVgiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlZIl0gPSAzNF0gPSAiS2V5WSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleVoiXSA9IDM1XSA9ICJLZXlaIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRGlnaXQxIl0gPSAzNl0gPSAiRGlnaXQxIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRGlnaXQyIl0gPSAzN10gPSAiRGlnaXQyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRGlnaXQzIl0gPSAzOF0gPSAiRGlnaXQzIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRGlnaXQ0Il0gPSAzOV0gPSAiRGlnaXQ0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRGlnaXQ1Il0gPSA0MF0gPSAiRGlnaXQ1IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRGlnaXQ2Il0gPSA0MV0gPSAiRGlnaXQ2IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRGlnaXQ3Il0gPSA0Ml0gPSAiRGlnaXQ3IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRGlnaXQ4Il0gPSA0M10gPSAiRGlnaXQ4IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRGlnaXQ5Il0gPSA0NF0gPSAiRGlnaXQ5IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRGlnaXQwIl0gPSA0NV0gPSAiRGlnaXQwIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRW50ZXIiXSA9IDQ2XSA9ICJFbnRlciI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkVzY2FwZSJdID0gNDddID0gIkVzY2FwZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkJhY2tzcGFjZSJdID0gNDhdID0gIkJhY2tzcGFjZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlRhYiJdID0gNDldID0gIlRhYiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlNwYWNlIl0gPSA1MF0gPSAiU3BhY2UiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNaW51cyJdID0gNTFdID0gIk1pbnVzIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRXF1YWwiXSA9IDUyXSA9ICJFcXVhbCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkJyYWNrZXRMZWZ0Il0gPSA1M10gPSAiQnJhY2tldExlZnQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJCcmFja2V0UmlnaHQiXSA9IDU0XSA9ICJCcmFja2V0UmlnaHQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJCYWNrc2xhc2giXSA9IDU1XSA9ICJCYWNrc2xhc2giOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJJbnRsSGFzaCJdID0gNTZdID0gIkludGxIYXNoIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiU2VtaWNvbG9uIl0gPSA1N10gPSAiU2VtaWNvbG9uIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiUXVvdGUiXSA9IDU4XSA9ICJRdW90ZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkJhY2txdW90ZSJdID0gNTldID0gIkJhY2txdW90ZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkNvbW1hIl0gPSA2MF0gPSAiQ29tbWEiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJQZXJpb2QiXSA9IDYxXSA9ICJQZXJpb2QiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJTbGFzaCJdID0gNjJdID0gIlNsYXNoIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQ2Fwc0xvY2siXSA9IDYzXSA9ICJDYXBzTG9jayI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYxIl0gPSA2NF0gPSAiRjEiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGMiJdID0gNjVdID0gIkYyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjMiXSA9IDY2XSA9ICJGMyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkY0Il0gPSA2N10gPSAiRjQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGNSJdID0gNjhdID0gIkY1IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjYiXSA9IDY5XSA9ICJGNiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkY3Il0gPSA3MF0gPSAiRjciOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGOCJdID0gNzFdID0gIkY4IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjkiXSA9IDcyXSA9ICJGOSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYxMCJdID0gNzNdID0gIkYxMCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYxMSJdID0gNzRdID0gIkYxMSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYxMiJdID0gNzVdID0gIkYxMiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlByaW50U2NyZWVuIl0gPSA3Nl0gPSAiUHJpbnRTY3JlZW4iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJTY3JvbGxMb2NrIl0gPSA3N10gPSAiU2Nyb2xsTG9jayI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlBhdXNlIl0gPSA3OF0gPSAiUGF1c2UiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJJbnNlcnQiXSA9IDc5XSA9ICJJbnNlcnQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJIb21lIl0gPSA4MF0gPSAiSG9tZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlBhZ2VVcCJdID0gODFdID0gIlBhZ2VVcCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkRlbGV0ZSJdID0gODJdID0gIkRlbGV0ZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkVuZCJdID0gODNdID0gIkVuZCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlBhZ2VEb3duIl0gPSA4NF0gPSAiUGFnZURvd24iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJBcnJvd1JpZ2h0Il0gPSA4NV0gPSAiQXJyb3dSaWdodCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkFycm93TGVmdCJdID0gODZdID0gIkFycm93TGVmdCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkFycm93RG93biJdID0gODddID0gIkFycm93RG93biI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkFycm93VXAiXSA9IDg4XSA9ICJBcnJvd1VwIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtTG9jayJdID0gODldID0gIk51bUxvY2siOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWREaXZpZGUiXSA9IDkwXSA9ICJOdW1wYWREaXZpZGUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWRNdWx0aXBseSJdID0gOTFdID0gIk51bXBhZE11bHRpcGx5IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkU3VidHJhY3QiXSA9IDkyXSA9ICJOdW1wYWRTdWJ0cmFjdCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZEFkZCJdID0gOTNdID0gIk51bXBhZEFkZCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZEVudGVyIl0gPSA5NF0gPSAiTnVtcGFkRW50ZXIiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWQxIl0gPSA5NV0gPSAiTnVtcGFkMSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZDIiXSA9IDk2XSA9ICJOdW1wYWQyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkMyJdID0gOTddID0gIk51bXBhZDMiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWQ0Il0gPSA5OF0gPSAiTnVtcGFkNCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZDUiXSA9IDk5XSA9ICJOdW1wYWQ1IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkNiJdID0gMTAwXSA9ICJOdW1wYWQ2IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkNyJdID0gMTAxXSA9ICJOdW1wYWQ3IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkOCJdID0gMTAyXSA9ICJOdW1wYWQ4IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkOSJdID0gMTAzXSA9ICJOdW1wYWQ5IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkMCJdID0gMTA0XSA9ICJOdW1wYWQwIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkRGVjaW1hbCJdID0gMTA1XSA9ICJOdW1wYWREZWNpbWFsIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiSW50bEJhY2tzbGFzaCJdID0gMTA2XSA9ICJJbnRsQmFja3NsYXNoIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQ29udGV4dE1lbnUiXSA9IDEwN10gPSAiQ29udGV4dE1lbnUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJQb3dlciJdID0gMTA4XSA9ICJQb3dlciI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZEVxdWFsIl0gPSAxMDldID0gIk51bXBhZEVxdWFsIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjEzIl0gPSAxMTBdID0gIkYxMyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYxNCJdID0gMTExXSA9ICJGMTQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGMTUiXSA9IDExMl0gPSAiRjE1IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjE2Il0gPSAxMTNdID0gIkYxNiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYxNyJdID0gMTE0XSA9ICJGMTciOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGMTgiXSA9IDExNV0gPSAiRjE4IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjE5Il0gPSAxMTZdID0gIkYxOSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYyMCJdID0gMTE3XSA9ICJGMjAiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGMjEiXSA9IDExOF0gPSAiRjIxIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjIyIl0gPSAxMTldID0gIkYyMiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYyMyJdID0gMTIwXSA9ICJGMjMiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGMjQiXSA9IDEyMV0gPSAiRjI0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiT3BlbiJdID0gMTIyXSA9ICJPcGVuIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiSGVscCJdID0gMTIzXSA9ICJIZWxwIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiU2VsZWN0Il0gPSAxMjRdID0gIlNlbGVjdCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkFnYWluIl0gPSAxMjVdID0gIkFnYWluIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiVW5kbyJdID0gMTI2XSA9ICJVbmRvIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQ3V0Il0gPSAxMjddID0gIkN1dCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkNvcHkiXSA9IDEyOF0gPSAiQ29weSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlBhc3RlIl0gPSAxMjldID0gIlBhc3RlIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRmluZCJdID0gMTMwXSA9ICJGaW5kIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQXVkaW9Wb2x1bWVNdXRlIl0gPSAxMzFdID0gIkF1ZGlvVm9sdW1lTXV0ZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkF1ZGlvVm9sdW1lVXAiXSA9IDEzMl0gPSAiQXVkaW9Wb2x1bWVVcCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkF1ZGlvVm9sdW1lRG93biJdID0gMTMzXSA9ICJBdWRpb1ZvbHVtZURvd24iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWRDb21tYSJdID0gMTM0XSA9ICJOdW1wYWRDb21tYSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkludGxSbyJdID0gMTM1XSA9ICJJbnRsUm8iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLYW5hTW9kZSJdID0gMTM2XSA9ICJLYW5hTW9kZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkludGxZZW4iXSA9IDEzN10gPSAiSW50bFllbiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkNvbnZlcnQiXSA9IDEzOF0gPSAiQ29udmVydCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk5vbkNvbnZlcnQiXSA9IDEzOV0gPSAiTm9uQ29udmVydCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkxhbmcxIl0gPSAxNDBdID0gIkxhbmcxIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTGFuZzIiXSA9IDE0MV0gPSAiTGFuZzIiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJMYW5nMyJdID0gMTQyXSA9ICJMYW5nMyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkxhbmc0Il0gPSAxNDNdID0gIkxhbmc0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTGFuZzUiXSA9IDE0NF0gPSAiTGFuZzUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJBYm9ydCJdID0gMTQ1XSA9ICJBYm9ydCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlByb3BzIl0gPSAxNDZdID0gIlByb3BzIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkUGFyZW5MZWZ0Il0gPSAxNDddID0gIk51bXBhZFBhcmVuTGVmdCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZFBhcmVuUmlnaHQiXSA9IDE0OF0gPSAiTnVtcGFkUGFyZW5SaWdodCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZEJhY2tzcGFjZSJdID0gMTQ5XSA9ICJOdW1wYWRCYWNrc3BhY2UiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWRNZW1vcnlTdG9yZSJdID0gMTUwXSA9ICJOdW1wYWRNZW1vcnlTdG9yZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZE1lbW9yeVJlY2FsbCJdID0gMTUxXSA9ICJOdW1wYWRNZW1vcnlSZWNhbGwiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWRNZW1vcnlDbGVhciJdID0gMTUyXSA9ICJOdW1wYWRNZW1vcnlDbGVhciI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZE1lbW9yeUFkZCJdID0gMTUzXSA9ICJOdW1wYWRNZW1vcnlBZGQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWRNZW1vcnlTdWJ0cmFjdCJdID0gMTU0XSA9ICJOdW1wYWRNZW1vcnlTdWJ0cmFjdCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZENsZWFyIl0gPSAxNTVdID0gIk51bXBhZENsZWFyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkQ2xlYXJFbnRyeSJdID0gMTU2XSA9ICJOdW1wYWRDbGVhckVudHJ5IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQ29udHJvbExlZnQiXSA9IDE1N10gPSAiQ29udHJvbExlZnQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJTaGlmdExlZnQiXSA9IDE1OF0gPSAiU2hpZnRMZWZ0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQWx0TGVmdCJdID0gMTU5XSA9ICJBbHRMZWZ0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTWV0YUxlZnQiXSA9IDE2MF0gPSAiTWV0YUxlZnQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJDb250cm9sUmlnaHQiXSA9IDE2MV0gPSAiQ29udHJvbFJpZ2h0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiU2hpZnRSaWdodCJdID0gMTYyXSA9ICJTaGlmdFJpZ2h0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQWx0UmlnaHQiXSA9IDE2M10gPSAiQWx0UmlnaHQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNZXRhUmlnaHQiXSA9IDE2NF0gPSAiTWV0YVJpZ2h0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQnJpZ2h0bmVzc1VwIl0gPSAxNjVdID0gIkJyaWdodG5lc3NVcCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkJyaWdodG5lc3NEb3duIl0gPSAxNjZdID0gIkJyaWdodG5lc3NEb3duIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTWVkaWFQbGF5Il0gPSAxNjddID0gIk1lZGlhUGxheSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk1lZGlhUmVjb3JkIl0gPSAxNjhdID0gIk1lZGlhUmVjb3JkIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTWVkaWFGYXN0Rm9yd2FyZCJdID0gMTY5XSA9ICJNZWRpYUZhc3RGb3J3YXJkIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTWVkaWFSZXdpbmQiXSA9IDE3MF0gPSAiTWVkaWFSZXdpbmQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNZWRpYVRyYWNrTmV4dCJdID0gMTcxXSA9ICJNZWRpYVRyYWNrTmV4dCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk1lZGlhVHJhY2tQcmV2aW91cyJdID0gMTcyXSA9ICJNZWRpYVRyYWNrUHJldmlvdXMiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNZWRpYVN0b3AiXSA9IDE3M10gPSAiTWVkaWFTdG9wIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRWplY3QiXSA9IDE3NF0gPSAiRWplY3QiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNZWRpYVBsYXlQYXVzZSJdID0gMTc1XSA9ICJNZWRpYVBsYXlQYXVzZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk1lZGlhU2VsZWN0Il0gPSAxNzZdID0gIk1lZGlhU2VsZWN0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTGF1bmNoTWFpbCJdID0gMTc3XSA9ICJMYXVuY2hNYWlsIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTGF1bmNoQXBwMiJdID0gMTc4XSA9ICJMYXVuY2hBcHAyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTGF1bmNoQXBwMSJdID0gMTc5XSA9ICJMYXVuY2hBcHAxIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiU2VsZWN0VGFzayJdID0gMTgwXSA9ICJTZWxlY3RUYXNrIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTGF1bmNoU2NyZWVuU2F2ZXIiXSA9IDE4MV0gPSAiTGF1bmNoU2NyZWVuU2F2ZXIiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJCcm93c2VyU2VhcmNoIl0gPSAxODJdID0gIkJyb3dzZXJTZWFyY2giOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJCcm93c2VySG9tZSJdID0gMTgzXSA9ICJCcm93c2VySG9tZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkJyb3dzZXJCYWNrIl0gPSAxODRdID0gIkJyb3dzZXJCYWNrIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQnJvd3NlckZvcndhcmQiXSA9IDE4NV0gPSAiQnJvd3NlckZvcndhcmQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJCcm93c2VyU3RvcCJdID0gMTg2XSA9ICJCcm93c2VyU3RvcCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkJyb3dzZXJSZWZyZXNoIl0gPSAxODddID0gIkJyb3dzZXJSZWZyZXNoIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQnJvd3NlckZhdm9yaXRlcyJdID0gMTg4XSA9ICJCcm93c2VyRmF2b3JpdGVzIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiWm9vbVRvZ2dsZSJdID0gMTg5XSA9ICJab29tVG9nZ2xlIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTWFpbFJlcGx5Il0gPSAxOTBdID0gIk1haWxSZXBseSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk1haWxGb3J3YXJkIl0gPSAxOTFdID0gIk1haWxGb3J3YXJkIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTWFpbFNlbmQiXSA9IDE5Ml0gPSAiTWFpbFNlbmQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNQVhfVkFMVUUiXSA9IDE5M10gPSAiTUFYX1ZBTFVFIjsKICAgIH0pKFNjYW5Db2RlIHx8IChTY2FuQ29kZSA9IHt9KSk7CiAgICB2YXIgU2Nyb2xsVHlwZTsKICAgIChmdW5jdGlvbiAoU2Nyb2xsVHlwZSkgewogICAgICAgIFNjcm9sbFR5cGVbU2Nyb2xsVHlwZVsiU21vb3RoIl0gPSAwXSA9ICJTbW9vdGgiOwogICAgICAgIFNjcm9sbFR5cGVbU2Nyb2xsVHlwZVsiSW1tZWRpYXRlIl0gPSAxXSA9ICJJbW1lZGlhdGUiOwogICAgfSkoU2Nyb2xsVHlwZSB8fCAoU2Nyb2xsVHlwZSA9IHt9KSk7CiAgICB2YXIgU2Nyb2xsYmFyVmlzaWJpbGl0eTsKICAgIChmdW5jdGlvbiAoU2Nyb2xsYmFyVmlzaWJpbGl0eSkgewogICAgICAgIFNjcm9sbGJhclZpc2liaWxpdHlbU2Nyb2xsYmFyVmlzaWJpbGl0eVsiQXV0byJdID0gMV0gPSAiQXV0byI7CiAgICAgICAgU2Nyb2xsYmFyVmlzaWJpbGl0eVtTY3JvbGxiYXJWaXNpYmlsaXR5WyJIaWRkZW4iXSA9IDJdID0gIkhpZGRlbiI7CiAgICAgICAgU2Nyb2xsYmFyVmlzaWJpbGl0eVtTY3JvbGxiYXJWaXNpYmlsaXR5WyJWaXNpYmxlIl0gPSAzXSA9ICJWaXNpYmxlIjsKICAgIH0pKFNjcm9sbGJhclZpc2liaWxpdHkgfHwgKFNjcm9sbGJhclZpc2liaWxpdHkgPSB7fSkpOwogICAgLyoqCiAgICAgKiBUaGUgZGlyZWN0aW9uIG9mIGEgc2VsZWN0aW9uLgogICAgICovCiAgICB2YXIgU2VsZWN0aW9uRGlyZWN0aW9uOwogICAgKGZ1bmN0aW9uIChTZWxlY3Rpb25EaXJlY3Rpb24pIHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc2VsZWN0aW9uIHN0YXJ0cyBhYm92ZSB3aGVyZSBpdCBlbmRzLgogICAgICAgICAqLwogICAgICAgIFNlbGVjdGlvbkRpcmVjdGlvbltTZWxlY3Rpb25EaXJlY3Rpb25bIkxUUiJdID0gMF0gPSAiTFRSIjsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc2VsZWN0aW9uIHN0YXJ0cyBiZWxvdyB3aGVyZSBpdCBlbmRzLgogICAgICAgICAqLwogICAgICAgIFNlbGVjdGlvbkRpcmVjdGlvbltTZWxlY3Rpb25EaXJlY3Rpb25bIlJUTCJdID0gMV0gPSAiUlRMIjsKICAgIH0pKFNlbGVjdGlvbkRpcmVjdGlvbiB8fCAoU2VsZWN0aW9uRGlyZWN0aW9uID0ge30pKTsKICAgIHZhciBTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmQ7CiAgICAoZnVuY3Rpb24gKFNpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZCkgewogICAgICAgIFNpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZFtTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmRbIkludm9rZSJdID0gMV0gPSAiSW52b2tlIjsKICAgICAgICBTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmRbU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kWyJUcmlnZ2VyQ2hhcmFjdGVyIl0gPSAyXSA9ICJUcmlnZ2VyQ2hhcmFjdGVyIjsKICAgICAgICBTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmRbU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kWyJDb250ZW50Q2hhbmdlIl0gPSAzXSA9ICJDb250ZW50Q2hhbmdlIjsKICAgIH0pKFNpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZCB8fCAoU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kID0ge30pKTsKICAgIHZhciBTbmlwcGV0U29ydE9yZGVyOwogICAgKGZ1bmN0aW9uIChTbmlwcGV0U29ydE9yZGVyKSB7CiAgICAgICAgU25pcHBldFNvcnRPcmRlcltTbmlwcGV0U29ydE9yZGVyWyJUb3AiXSA9IDBdID0gIlRvcCI7CiAgICAgICAgU25pcHBldFNvcnRPcmRlcltTbmlwcGV0U29ydE9yZGVyWyJJbmxpbmUiXSA9IDFdID0gIklubGluZSI7CiAgICAgICAgU25pcHBldFNvcnRPcmRlcltTbmlwcGV0U29ydE9yZGVyWyJCb3R0b20iXSA9IDJdID0gIkJvdHRvbSI7CiAgICB9KShTbmlwcGV0U29ydE9yZGVyIHx8IChTbmlwcGV0U29ydE9yZGVyID0ge30pKTsKICAgIHZhciBTbmlwcGV0U291cmNlOwogICAgKGZ1bmN0aW9uIChTbmlwcGV0U291cmNlKSB7CiAgICAgICAgU25pcHBldFNvdXJjZVtTbmlwcGV0U291cmNlWyJVc2VyIl0gPSAxXSA9ICJVc2VyIjsKICAgICAgICBTbmlwcGV0U291cmNlW1NuaXBwZXRTb3VyY2VbIldvcmtzcGFjZSJdID0gMl0gPSAiV29ya3NwYWNlIjsKICAgICAgICBTbmlwcGV0U291cmNlW1NuaXBwZXRTb3VyY2VbIkV4dGVuc2lvbiJdID0gM10gPSAiRXh0ZW5zaW9uIjsKICAgIH0pKFNuaXBwZXRTb3VyY2UgfHwgKFNuaXBwZXRTb3VyY2UgPSB7fSkpOwogICAgLyoqCiAgICAgKiBBIHN0YW5kYXJkIHRva2VuIHR5cGUuIFZhbHVlcyBhcmUgMl54IHN1Y2ggdGhhdCBhIGJpdCBtYXNrIGNhbiBiZSB1c2VkLgogICAgICovCiAgICB2YXIgU3RhbmRhcmRUb2tlblR5cGU7CiAgICAoZnVuY3Rpb24gKFN0YW5kYXJkVG9rZW5UeXBlKSB7CiAgICAgICAgU3RhbmRhcmRUb2tlblR5cGVbU3RhbmRhcmRUb2tlblR5cGVbIk90aGVyIl0gPSAwXSA9ICJPdGhlciI7CiAgICAgICAgU3RhbmRhcmRUb2tlblR5cGVbU3RhbmRhcmRUb2tlblR5cGVbIkNvbW1lbnQiXSA9IDFdID0gIkNvbW1lbnQiOwogICAgICAgIFN0YW5kYXJkVG9rZW5UeXBlW1N0YW5kYXJkVG9rZW5UeXBlWyJTdHJpbmciXSA9IDJdID0gIlN0cmluZyI7CiAgICAgICAgU3RhbmRhcmRUb2tlblR5cGVbU3RhbmRhcmRUb2tlblR5cGVbIlJlZ0V4Il0gPSA0XSA9ICJSZWdFeCI7CiAgICB9KShTdGFuZGFyZFRva2VuVHlwZSB8fCAoU3RhbmRhcmRUb2tlblR5cGUgPSB7fSkpOwogICAgLyoqCiAgICAgKiBBIHN5bWJvbCBraW5kLgogICAgICovCiAgICB2YXIgU3ltYm9sS2luZDsKICAgIChmdW5jdGlvbiAoU3ltYm9sS2luZCkgewogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiRmlsZSJdID0gMF0gPSAiRmlsZSI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJNb2R1bGUiXSA9IDFdID0gIk1vZHVsZSI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJOYW1lc3BhY2UiXSA9IDJdID0gIk5hbWVzcGFjZSI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJQYWNrYWdlIl0gPSAzXSA9ICJQYWNrYWdlIjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIkNsYXNzIl0gPSA0XSA9ICJDbGFzcyI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJNZXRob2QiXSA9IDVdID0gIk1ldGhvZCI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJQcm9wZXJ0eSJdID0gNl0gPSAiUHJvcGVydHkiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiRmllbGQiXSA9IDddID0gIkZpZWxkIjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIkNvbnN0cnVjdG9yIl0gPSA4XSA9ICJDb25zdHJ1Y3RvciI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJFbnVtIl0gPSA5XSA9ICJFbnVtIjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIkludGVyZmFjZSJdID0gMTBdID0gIkludGVyZmFjZSI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJGdW5jdGlvbiJdID0gMTFdID0gIkZ1bmN0aW9uIjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIlZhcmlhYmxlIl0gPSAxMl0gPSAiVmFyaWFibGUiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiQ29uc3RhbnQiXSA9IDEzXSA9ICJDb25zdGFudCI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJTdHJpbmciXSA9IDE0XSA9ICJTdHJpbmciOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiTnVtYmVyIl0gPSAxNV0gPSAiTnVtYmVyIjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIkJvb2xlYW4iXSA9IDE2XSA9ICJCb29sZWFuIjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIkFycmF5Il0gPSAxN10gPSAiQXJyYXkiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiT2JqZWN0Il0gPSAxOF0gPSAiT2JqZWN0IjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIktleSJdID0gMTldID0gIktleSI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJOdWxsIl0gPSAyMF0gPSAiTnVsbCI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJFbnVtTWVtYmVyIl0gPSAyMV0gPSAiRW51bU1lbWJlciI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJTdHJ1Y3QiXSA9IDIyXSA9ICJTdHJ1Y3QiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiRXZlbnQiXSA9IDIzXSA9ICJFdmVudCI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJPcGVyYXRvciJdID0gMjRdID0gIk9wZXJhdG9yIjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIlR5cGVQYXJhbWV0ZXIiXSA9IDI1XSA9ICJUeXBlUGFyYW1ldGVyIjsKICAgIH0pKFN5bWJvbEtpbmQgfHwgKFN5bWJvbEtpbmQgPSB7fSkpOwogICAgdmFyIFN5bWJvbFRhZzsKICAgIChmdW5jdGlvbiAoU3ltYm9sVGFnKSB7CiAgICAgICAgU3ltYm9sVGFnW1N5bWJvbFRhZ1siRGVwcmVjYXRlZCJdID0gMV0gPSAiRGVwcmVjYXRlZCI7CiAgICB9KShTeW1ib2xUYWcgfHwgKFN5bWJvbFRhZyA9IHt9KSk7CiAgICAvKioKICAgICAqIFRoZSBraW5kIG9mIGFuaW1hdGlvbiBpbiB3aGljaCB0aGUgZWRpdG9yJ3MgY3Vyc29yIHNob3VsZCBiZSByZW5kZXJlZC4KICAgICAqLwogICAgdmFyIFRleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlOwogICAgKGZ1bmN0aW9uIChUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEhpZGRlbgogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlW1RleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlWyJIaWRkZW4iXSA9IDBdID0gIkhpZGRlbiI7CiAgICAgICAgLyoqCiAgICAgICAgICogQmxpbmtpbmcKICAgICAgICAgKi8KICAgICAgICBUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVsiQmxpbmsiXSA9IDFdID0gIkJsaW5rIjsKICAgICAgICAvKioKICAgICAgICAgKiBCbGlua2luZyB3aXRoIHNtb290aCBmYWRpbmcKICAgICAgICAgKi8KICAgICAgICBUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVsiU21vb3RoIl0gPSAyXSA9ICJTbW9vdGgiOwogICAgICAgIC8qKgogICAgICAgICAqIEJsaW5raW5nIHdpdGggcHJvbG9uZ2VkIGZpbGxlZCBzdGF0ZSBhbmQgc21vb3RoIGZhZGluZwogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlW1RleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlWyJQaGFzZSJdID0gM10gPSAiUGhhc2UiOwogICAgICAgIC8qKgogICAgICAgICAqIEV4cGFuZCBjb2xsYXBzZSBhbmltYXRpb24gb24gdGhlIHkgYXhpcwogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlW1RleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlWyJFeHBhbmQiXSA9IDRdID0gIkV4cGFuZCI7CiAgICAgICAgLyoqCiAgICAgICAgICogTm8tQmxpbmtpbmcKICAgICAgICAgKi8KICAgICAgICBUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZVsiU29saWQiXSA9IDVdID0gIlNvbGlkIjsKICAgIH0pKFRleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlIHx8IChUZXh0RWRpdG9yQ3Vyc29yQmxpbmtpbmdTdHlsZSA9IHt9KSk7CiAgICAvKioKICAgICAqIFRoZSBzdHlsZSBpbiB3aGljaCB0aGUgZWRpdG9yJ3MgY3Vyc29yIHNob3VsZCBiZSByZW5kZXJlZC4KICAgICAqLwogICAgdmFyIFRleHRFZGl0b3JDdXJzb3JTdHlsZTsKICAgIChmdW5jdGlvbiAoVGV4dEVkaXRvckN1cnNvclN0eWxlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQXMgYSB2ZXJ0aWNhbCBsaW5lIChzaXR0aW5nIGJldHdlZW4gdHdvIGNoYXJhY3RlcnMpLgogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JDdXJzb3JTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbIkxpbmUiXSA9IDFdID0gIkxpbmUiOwogICAgICAgIC8qKgogICAgICAgICAqIEFzIGEgYmxvY2sgKHNpdHRpbmcgb24gdG9wIG9mIGEgY2hhcmFjdGVyKS4KICAgICAgICAgKi8KICAgICAgICBUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbVGV4dEVkaXRvckN1cnNvclN0eWxlWyJCbG9jayJdID0gMl0gPSAiQmxvY2siOwogICAgICAgIC8qKgogICAgICAgICAqIEFzIGEgaG9yaXpvbnRhbCBsaW5lIChzaXR0aW5nIHVuZGVyIGEgY2hhcmFjdGVyKS4KICAgICAgICAgKi8KICAgICAgICBUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbVGV4dEVkaXRvckN1cnNvclN0eWxlWyJVbmRlcmxpbmUiXSA9IDNdID0gIlVuZGVybGluZSI7CiAgICAgICAgLyoqCiAgICAgICAgICogQXMgYSB0aGluIHZlcnRpY2FsIGxpbmUgKHNpdHRpbmcgYmV0d2VlbiB0d28gY2hhcmFjdGVycykuCiAgICAgICAgICovCiAgICAgICAgVGV4dEVkaXRvckN1cnNvclN0eWxlW1RleHRFZGl0b3JDdXJzb3JTdHlsZVsiTGluZVRoaW4iXSA9IDRdID0gIkxpbmVUaGluIjsKICAgICAgICAvKioKICAgICAgICAgKiBBcyBhbiBvdXRsaW5lZCBibG9jayAoc2l0dGluZyBvbiB0b3Agb2YgYSBjaGFyYWN0ZXIpLgogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JDdXJzb3JTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbIkJsb2NrT3V0bGluZSJdID0gNV0gPSAiQmxvY2tPdXRsaW5lIjsKICAgICAgICAvKioKICAgICAgICAgKiBBcyBhIHRoaW4gaG9yaXpvbnRhbCBsaW5lIChzaXR0aW5nIHVuZGVyIGEgY2hhcmFjdGVyKS4KICAgICAgICAgKi8KICAgICAgICBUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbVGV4dEVkaXRvckN1cnNvclN0eWxlWyJVbmRlcmxpbmVUaGluIl0gPSA2XSA9ICJVbmRlcmxpbmVUaGluIjsKICAgIH0pKFRleHRFZGl0b3JDdXJzb3JTdHlsZSB8fCAoVGV4dEVkaXRvckN1cnNvclN0eWxlID0ge30pKTsKICAgIHZhciBUZXh0RWRpdG9yU2VsZWN0aW9uUmV2ZWFsVHlwZTsKICAgIChmdW5jdGlvbiAoVGV4dEVkaXRvclNlbGVjdGlvblJldmVhbFR5cGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBPcHRpb24gdG8gc2Nyb2xsIHZlcnRpY2FsbHkgb3IgaG9yaXpvbnRhbGx5IGFzIG5lY2Vzc2FyeSBhbmQgcmV2ZWFsIGEgcmFuZ2UgY2VudGVyZWQgdmVydGljYWxseS4KICAgICAgICAgKi8KICAgICAgICBUZXh0RWRpdG9yU2VsZWN0aW9uUmV2ZWFsVHlwZVtUZXh0RWRpdG9yU2VsZWN0aW9uUmV2ZWFsVHlwZVsiQ2VudGVyIl0gPSAwXSA9ICJDZW50ZXIiOwogICAgICAgIC8qKgogICAgICAgICAqIE9wdGlvbiB0byBzY3JvbGwgdmVydGljYWxseSBvciBob3Jpem9udGFsbHkgYXMgbmVjZXNzYXJ5IGFuZCByZXZlYWwgYSByYW5nZSBjZW50ZXJlZCB2ZXJ0aWNhbGx5IG9ubHkgaWYgaXQgbGllcyBvdXRzaWRlIHRoZSB2aWV3cG9ydC4KICAgICAgICAgKi8KICAgICAgICBUZXh0RWRpdG9yU2VsZWN0aW9uUmV2ZWFsVHlwZVtUZXh0RWRpdG9yU2VsZWN0aW9uUmV2ZWFsVHlwZVsiQ2VudGVySWZPdXRzaWRlVmlld3BvcnQiXSA9IDFdID0gIkNlbnRlcklmT3V0c2lkZVZpZXdwb3J0IjsKICAgICAgICAvKioKICAgICAgICAgKiBPcHRpb24gdG8gc2Nyb2xsIHZlcnRpY2FsbHkgb3IgaG9yaXpvbnRhbGx5IGFzIG5lY2Vzc2FyeSBhbmQgcmV2ZWFsIGEgcmFuZ2UgY2xvc2UgdG8gdGhlIHRvcCBvZiB0aGUgdmlld3BvcnQsIGJ1dCBub3QgcXVpdGUgYXQgdGhlIHRvcC4KICAgICAgICAgKi8KICAgICAgICBUZXh0RWRpdG9yU2VsZWN0aW9uUmV2ZWFsVHlwZVtUZXh0RWRpdG9yU2VsZWN0aW9uUmV2ZWFsVHlwZVsiTmVhclRvcCJdID0gMl0gPSAiTmVhclRvcCI7CiAgICAgICAgLyoqCiAgICAgICAgICogT3B0aW9uIHRvIHNjcm9sbCB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseSBhcyBuZWNlc3NhcnkgYW5kIHJldmVhbCBhIHJhbmdlIGNsb3NlIHRvIHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0LCBidXQgbm90IHF1aXRlIGF0IHRoZSB0b3AuCiAgICAgICAgICogT25seSBpZiBpdCBsaWVzIG91dHNpZGUgdGhlIHZpZXdwb3J0CiAgICAgICAgICovCiAgICAgICAgVGV4dEVkaXRvclNlbGVjdGlvblJldmVhbFR5cGVbVGV4dEVkaXRvclNlbGVjdGlvblJldmVhbFR5cGVbIk5lYXJUb3BJZk91dHNpZGVWaWV3cG9ydCJdID0gM10gPSAiTmVhclRvcElmT3V0c2lkZVZpZXdwb3J0IjsKICAgIH0pKFRleHRFZGl0b3JTZWxlY3Rpb25SZXZlYWxUeXBlIHx8IChUZXh0RWRpdG9yU2VsZWN0aW9uUmV2ZWFsVHlwZSA9IHt9KSk7CiAgICAvKioKICAgICAqIERlc2NyaWJlcyB0aGUgYmVoYXZpb3Igb2YgZGVjb3JhdGlvbnMgd2hlbiB0eXBpbmcvZWRpdGluZyBuZWFyIHRoZWlyIGVkZ2VzLgogICAgICogTm90ZTogUGxlYXNlIGRvIG5vdCBlZGl0IHRoZSB2YWx1ZXMsIGFzIHRoZXkgdmVyeSBjYXJlZnVsbHkgbWF0Y2ggYERlY29yYXRpb25SYW5nZUJlaGF2aW9yYAogICAgICovCiAgICB2YXIgVHJhY2tlZFJhbmdlU3RpY2tpbmVzczsKICAgIChmdW5jdGlvbiAoVHJhY2tlZFJhbmdlU3RpY2tpbmVzcykgewogICAgICAgIFRyYWNrZWRSYW5nZVN0aWNraW5lc3NbVHJhY2tlZFJhbmdlU3RpY2tpbmVzc1siQWx3YXlzR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcyJdID0gMF0gPSAiQWx3YXlzR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcyI7CiAgICAgICAgVHJhY2tlZFJhbmdlU3RpY2tpbmVzc1tUcmFja2VkUmFuZ2VTdGlja2luZXNzWyJOZXZlckdyb3dzV2hlblR5cGluZ0F0RWRnZXMiXSA9IDFdID0gIk5ldmVyR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcyI7CiAgICAgICAgVHJhY2tlZFJhbmdlU3RpY2tpbmVzc1tUcmFja2VkUmFuZ2VTdGlja2luZXNzWyJHcm93c09ubHlXaGVuVHlwaW5nQmVmb3JlIl0gPSAyXSA9ICJHcm93c09ubHlXaGVuVHlwaW5nQmVmb3JlIjsKICAgICAgICBUcmFja2VkUmFuZ2VTdGlja2luZXNzW1RyYWNrZWRSYW5nZVN0aWNraW5lc3NbIkdyb3dzT25seVdoZW5UeXBpbmdBZnRlciJdID0gM10gPSAiR3Jvd3NPbmx5V2hlblR5cGluZ0FmdGVyIjsKICAgIH0pKFRyYWNrZWRSYW5nZVN0aWNraW5lc3MgfHwgKFRyYWNrZWRSYW5nZVN0aWNraW5lc3MgPSB7fSkpOwogICAgLyoqCiAgICAgKiBEZXNjcmliZXMgaG93IHRvIGluZGVudCB3cmFwcGVkIGxpbmVzLgogICAgICovCiAgICB2YXIgV3JhcHBpbmdJbmRlbnQ7CiAgICAoZnVuY3Rpb24gKFdyYXBwaW5nSW5kZW50KSB7CiAgICAgICAgLyoqCiAgICAgICAgICogTm8gaW5kZW50YXRpb24gPT4gd3JhcHBlZCBsaW5lcyBiZWdpbiBhdCBjb2x1bW4gMS4KICAgICAgICAgKi8KICAgICAgICBXcmFwcGluZ0luZGVudFtXcmFwcGluZ0luZGVudFsiTm9uZSJdID0gMF0gPSAiTm9uZSI7CiAgICAgICAgLyoqCiAgICAgICAgICogU2FtZSA9PiB3cmFwcGVkIGxpbmVzIGdldCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBhcyB0aGUgcGFyZW50LgogICAgICAgICAqLwogICAgICAgIFdyYXBwaW5nSW5kZW50W1dyYXBwaW5nSW5kZW50WyJTYW1lIl0gPSAxXSA9ICJTYW1lIjsKICAgICAgICAvKioKICAgICAgICAgKiBJbmRlbnQgPT4gd3JhcHBlZCBsaW5lcyBnZXQgKzEgaW5kZW50YXRpb24gdG93YXJkIHRoZSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgV3JhcHBpbmdJbmRlbnRbV3JhcHBpbmdJbmRlbnRbIkluZGVudCJdID0gMl0gPSAiSW5kZW50IjsKICAgICAgICAvKioKICAgICAgICAgKiBEZWVwSW5kZW50ID0+IHdyYXBwZWQgbGluZXMgZ2V0ICsyIGluZGVudGF0aW9uIHRvd2FyZCB0aGUgcGFyZW50LgogICAgICAgICAqLwogICAgICAgIFdyYXBwaW5nSW5kZW50W1dyYXBwaW5nSW5kZW50WyJEZWVwSW5kZW50Il0gPSAzXSA9ICJEZWVwSW5kZW50IjsKICAgIH0pKFdyYXBwaW5nSW5kZW50IHx8IChXcmFwcGluZ0luZGVudCA9IHt9KSk7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjbGFzcyBSZWdpc3RyeSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX2ljb25zID0gbmV3IE1hcCgpOwogICAgICAgICAgICB0aGlzLl9vbkRpZFJlZ2lzdGVyID0gbmV3IEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICAgICAgYWRkKGljb24pIHsKICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9pY29ucy5nZXQoaWNvbi5pZCk7CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ljb25zLnNldChpY29uLmlkLCBpY29uKTsKICAgICAgICAgICAgICAgIHRoaXMuX29uRGlkUmVnaXN0ZXIuZmlyZShpY29uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpY29uLmRlc2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICBleGlzdGluZy5kZXNjcmlwdGlvbiA9IGljb24uZGVzY3JpcHRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBEdXBsaWNhdGUgcmVnaXN0cmF0aW9uIG9mIGNvZGljb24gJHtpY29uLmlkfWApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdldChpZCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faWNvbnMuZ2V0KGlkKTsKICAgICAgICB9CiAgICAgICAgZ2V0IGFsbCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ljb25zLnZhbHVlcygpOwogICAgICAgIH0KICAgICAgICBnZXQgb25EaWRSZWdpc3RlcigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uRGlkUmVnaXN0ZXIuZXZlbnQ7CiAgICAgICAgfQogICAgfQogICAgY29uc3QgX3JlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7CiAgICAvKioKICAgICAqIFRoZSBDb2RpY29uIGxpYnJhcnkgaXMgYSBzZXQgb2YgZGVmYXVsdCBpY29ucyB0aGF0IGFyZSBidWlsdC1pbiBpbiBWUyBDb2RlLgogICAgICoKICAgICAqIEluIHRoZSBwcm9kdWN0IChvdXRzaWRlIG9mIGJhc2UpIENvZGljb25zIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgZGVmYXVsdHMuIEluIG9yZGVyIHRvIGhhdmUgYWxsIGljb25zIGluIFZTIENvZGUKICAgICAqIHRoZW1lYWJsZSwgY29tcG9uZW50IHNob3VsZCBpc2UgZGVmaW5lIG5ldywgY29tcG9uZW50IHNwZWNpZmljIGljb25zIHVzaW5nIGBpY29uUmVnaXN0cnkucmVnaXN0ZXJJY29uYC4KICAgICAqIEluIHRoYXQgY2FsbCBhIENvZGljb24gY2FuIGJlIG5hbWVzIGFzIGRlZmF1bHQuCiAgICAgKi8KICAgIGNsYXNzIENvZGljb24gewogICAgICAgIGNvbnN0cnVjdG9yKGlkLCBkZWZpbml0aW9uLCBkZXNjcmlwdGlvbikgewogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247CiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKICAgICAgICAgICAgX3JlZ2lzdHJ5LmFkZCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgZ2V0IGNsYXNzTmFtZXMoKSB7IHJldHVybiAnY29kaWNvbiBjb2RpY29uLScgKyB0aGlzLmlkOyB9CiAgICAgICAgLy8gY2xhc3NOYW1lc0FycmF5IGlzIHVzZWZ1bCBmb3IgbWlncmF0aW5nIHRvIEVTNiBjbGFzc2xpc3QKICAgICAgICBnZXQgY2xhc3NOYW1lc0FycmF5KCkgeyByZXR1cm4gWydjb2RpY29uJywgJ2NvZGljb24tJyArIHRoaXMuaWRdOyB9CiAgICAgICAgZ2V0IGNzc1NlbGVjdG9yKCkgeyByZXR1cm4gJy5jb2RpY29uLmNvZGljb24tJyArIHRoaXMuaWQ7IH0KICAgIH0KICAgIC8vIGJ1aWx0LWluIGljb25zLCB3aXRoIGltYWdlIG5hbWUKICAgIENvZGljb24uYWRkID0gbmV3IENvZGljb24oJ2FkZCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE2MCcgfSk7CiAgICBDb2RpY29uLmxpZ2h0QnVsYiA9IG5ldyBDb2RpY29uKCdsaWdodC1idWxiJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTYxJyB9KTsKICAgIENvZGljb24ud2FybmluZyA9IG5ldyBDb2RpY29uKCd3YXJuaW5nJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTZjJyB9KTsKICAgIENvZGljb24uaW5mbyA9IG5ldyBDb2RpY29uKCdpbmZvJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTc0JyB9KTsKICAgIENvZGljb24uY2xvc2UgPSBuZXcgQ29kaWNvbignY2xvc2UnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhNzYnIH0pOwogICAgQ29kaWNvbi5zeW5jID0gbmV3IENvZGljb24oJ3N5bmMnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhNzcnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xGb2xkZXIgPSBuZXcgQ29kaWNvbignc3ltYm9sLWZvbGRlcicsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE4MycgfSk7CiAgICBDb2RpY29uLnN5bWJvbEV2ZW50ID0gbmV3IENvZGljb24oJ3N5bWJvbC1ldmVudCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE4NicgfSk7CiAgICBDb2RpY29uLmVycm9yID0gbmV3IENvZGljb24oJ2Vycm9yJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTg3JyB9KTsKICAgIENvZGljb24uc3ltYm9sVmFyaWFibGUgPSBuZXcgQ29kaWNvbignc3ltYm9sLXZhcmlhYmxlJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTg4JyB9KTsKICAgIENvZGljb24uc3ltYm9sQXJyYXkgPSBuZXcgQ29kaWNvbignc3ltYm9sLWFycmF5JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYThhJyB9KTsKICAgIENvZGljb24uc3ltYm9sTW9kdWxlID0gbmV3IENvZGljb24oJ3N5bWJvbC1tb2R1bGUnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOGInIH0pOwogICAgQ29kaWNvbi5zeW1ib2xQYWNrYWdlID0gbmV3IENvZGljb24oJ3N5bWJvbC1wYWNrYWdlJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYThiJyB9KTsKICAgIENvZGljb24uc3ltYm9sTmFtZXNwYWNlID0gbmV3IENvZGljb24oJ3N5bWJvbC1uYW1lc3BhY2UnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOGInIH0pOwogICAgQ29kaWNvbi5zeW1ib2xPYmplY3QgPSBuZXcgQ29kaWNvbignc3ltYm9sLW9iamVjdCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE4YicgfSk7CiAgICBDb2RpY29uLnN5bWJvbE1ldGhvZCA9IG5ldyBDb2RpY29uKCdzeW1ib2wtbWV0aG9kJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYThjJyB9KTsKICAgIENvZGljb24uc3ltYm9sRnVuY3Rpb24gPSBuZXcgQ29kaWNvbignc3ltYm9sLWZ1bmN0aW9uJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYThjJyB9KTsKICAgIENvZGljb24uc3ltYm9sQ29uc3RydWN0b3IgPSBuZXcgQ29kaWNvbignc3ltYm9sLWNvbnN0cnVjdG9yJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYThjJyB9KTsKICAgIENvZGljb24uc3ltYm9sQm9vbGVhbiA9IG5ldyBDb2RpY29uKCdzeW1ib2wtYm9vbGVhbicsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE4ZicgfSk7CiAgICBDb2RpY29uLnN5bWJvbE51bGwgPSBuZXcgQ29kaWNvbignc3ltYm9sLW51bGwnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOGYnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xOdW1iZXIgPSBuZXcgQ29kaWNvbignc3ltYm9sLW51bWJlcicsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE5MCcgfSk7CiAgICBDb2RpY29uLnN5bWJvbFN0cnVjdCA9IG5ldyBDb2RpY29uKCdzeW1ib2wtc3RydWN0JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTkxJyB9KTsKICAgIENvZGljb24uc3ltYm9sVHlwZVBhcmFtZXRlciA9IG5ldyBDb2RpY29uKCdzeW1ib2wtdHlwZS1wYXJhbWV0ZXInLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOTInIH0pOwogICAgQ29kaWNvbi5zeW1ib2xLZXkgPSBuZXcgQ29kaWNvbignc3ltYm9sLWtleScsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE5MycgfSk7CiAgICBDb2RpY29uLnN5bWJvbFRleHQgPSBuZXcgQ29kaWNvbignc3ltYm9sLXRleHQnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOTMnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xSZWZlcmVuY2UgPSBuZXcgQ29kaWNvbignc3ltYm9sLXJlZmVyZW5jZScsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE5NCcgfSk7CiAgICBDb2RpY29uLnN5bWJvbEVudW0gPSBuZXcgQ29kaWNvbignc3ltYm9sLWVudW0nLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOTUnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xWYWx1ZSA9IG5ldyBDb2RpY29uKCdzeW1ib2wtdmFsdWUnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOTUnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xVbml0ID0gbmV3IENvZGljb24oJ3N5bWJvbC11bml0JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTk2JyB9KTsKICAgIENvZGljb24uYXJyb3dEb3duID0gbmV3IENvZGljb24oJ2Fycm93LWRvd24nLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOWEnIH0pOwogICAgQ29kaWNvbi5hcnJvd0xlZnQgPSBuZXcgQ29kaWNvbignYXJyb3ctbGVmdCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE5YicgfSk7CiAgICBDb2RpY29uLmFycm93VXAgPSBuZXcgQ29kaWNvbignYXJyb3ctdXAnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhYTEnIH0pOwogICAgQ29kaWNvbi5jYXNlU2Vuc2l0aXZlID0gbmV3IENvZGljb24oJ2Nhc2Utc2Vuc2l0aXZlJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYWIxJyB9KTsKICAgIENvZGljb24uY2hlY2sgPSBuZXcgQ29kaWNvbignY2hlY2snLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhYjInIH0pOwogICAgQ29kaWNvbi5jaGV2cm9uRG93biA9IG5ldyBDb2RpY29uKCdjaGV2cm9uLWRvd24nLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhYjQnIH0pOwogICAgQ29kaWNvbi5jaGV2cm9uUmlnaHQgPSBuZXcgQ29kaWNvbignY2hldnJvbi1yaWdodCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWFiNicgfSk7CiAgICBDb2RpY29uLmNoZXZyb25VcCA9IG5ldyBDb2RpY29uKCdjaGV2cm9uLXVwJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYWI3JyB9KTsKICAgIENvZGljb24ubGlnaHRidWxiQXV0b2ZpeCA9IG5ldyBDb2RpY29uKCdsaWdodGJ1bGItYXV0b2ZpeCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWIxMycgfSk7CiAgICBDb2RpY29uLmxvYWRpbmcgPSBuZXcgQ29kaWNvbignbG9hZGluZycsIHsgZm9udENoYXJhY3RlcjogJ1xcZWIxOScgfSk7CiAgICBDb2RpY29uLnByZXNlcnZlQ2FzZSA9IG5ldyBDb2RpY29uKCdwcmVzZXJ2ZS1jYXNlJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjJlJyB9KTsKICAgIENvZGljb24ucmVnZXggPSBuZXcgQ29kaWNvbigncmVnZXgnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViMzgnIH0pOwogICAgQ29kaWNvbi5yZW1vdmUgPSBuZXcgQ29kaWNvbigncmVtb3ZlJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjNiJyB9KTsKICAgIENvZGljb24ucmVwbGFjZUFsbCA9IG5ldyBDb2RpY29uKCdyZXBsYWNlLWFsbCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWIzYycgfSk7CiAgICBDb2RpY29uLnJlcGxhY2UgPSBuZXcgQ29kaWNvbigncmVwbGFjZScsIHsgZm9udENoYXJhY3RlcjogJ1xcZWIzZCcgfSk7CiAgICBDb2RpY29uLnNwbGl0SG9yaXpvbnRhbCA9IG5ldyBDb2RpY29uKCdzcGxpdC1ob3Jpem9udGFsJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjU2JyB9KTsKICAgIENvZGljb24uc3BsaXRWZXJ0aWNhbCA9IG5ldyBDb2RpY29uKCdzcGxpdC12ZXJ0aWNhbCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI1NycgfSk7CiAgICBDb2RpY29uLnN5bWJvbENsYXNzID0gbmV3IENvZGljb24oJ3N5bWJvbC1jbGFzcycsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI1YicgfSk7CiAgICBDb2RpY29uLnN5bWJvbENvbG9yID0gbmV3IENvZGljb24oJ3N5bWJvbC1jb2xvcicsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI1YycgfSk7CiAgICBDb2RpY29uLnN5bWJvbENvbnN0YW50ID0gbmV3IENvZGljb24oJ3N5bWJvbC1jb25zdGFudCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI1ZCcgfSk7CiAgICBDb2RpY29uLnN5bWJvbEVudW1NZW1iZXIgPSBuZXcgQ29kaWNvbignc3ltYm9sLWVudW0tbWVtYmVyJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjVlJyB9KTsKICAgIENvZGljb24uc3ltYm9sRmllbGQgPSBuZXcgQ29kaWNvbignc3ltYm9sLWZpZWxkJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjVmJyB9KTsKICAgIENvZGljb24uc3ltYm9sRmlsZSA9IG5ldyBDb2RpY29uKCdzeW1ib2wtZmlsZScsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI2MCcgfSk7CiAgICBDb2RpY29uLnN5bWJvbEludGVyZmFjZSA9IG5ldyBDb2RpY29uKCdzeW1ib2wtaW50ZXJmYWNlJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjYxJyB9KTsKICAgIENvZGljb24uc3ltYm9sS2V5d29yZCA9IG5ldyBDb2RpY29uKCdzeW1ib2wta2V5d29yZCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI2MicgfSk7CiAgICBDb2RpY29uLnN5bWJvbE9wZXJhdG9yID0gbmV3IENvZGljb24oJ3N5bWJvbC1vcGVyYXRvcicsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI2NCcgfSk7CiAgICBDb2RpY29uLnN5bWJvbFByb3BlcnR5ID0gbmV3IENvZGljb24oJ3N5bWJvbC1wcm9wZXJ0eScsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI2NScgfSk7CiAgICBDb2RpY29uLnN5bWJvbFNuaXBwZXQgPSBuZXcgQ29kaWNvbignc3ltYm9sLXNuaXBwZXQnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViNjYnIH0pOwogICAgQ29kaWNvbi50cmlhbmdsZURvd24gPSBuZXcgQ29kaWNvbigndHJpYW5nbGUtZG93bicsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI2ZScgfSk7CiAgICBDb2RpY29uLnRyaWFuZ2xlTGVmdCA9IG5ldyBDb2RpY29uKCd0cmlhbmdsZS1sZWZ0JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjZmJyB9KTsKICAgIENvZGljb24udHJpYW5nbGVSaWdodCA9IG5ldyBDb2RpY29uKCd0cmlhbmdsZS1yaWdodCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI3MCcgfSk7CiAgICBDb2RpY29uLnRyaWFuZ2xlVXAgPSBuZXcgQ29kaWNvbigndHJpYW5nbGUtdXAnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViNzEnIH0pOwogICAgQ29kaWNvbi53aG9sZVdvcmQgPSBuZXcgQ29kaWNvbignd2hvbGUtd29yZCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI3ZScgfSk7CiAgICBDb2RpY29uLmxpc3RGaWx0ZXIgPSBuZXcgQ29kaWNvbignbGlzdC1maWx0ZXInLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViODMnIH0pOwogICAgQ29kaWNvbi5saXN0U2VsZWN0aW9uID0gbmV3IENvZGljb24oJ2xpc3Qtc2VsZWN0aW9uJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjg1JyB9KTsKICAgIENvZGljb24uc2VsZWN0aW9uID0gbmV3IENvZGljb24oJ3NlbGVjdGlvbicsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI4NScgfSk7CiAgICBDb2RpY29uLnN5bWJvbFN0cmluZyA9IG5ldyBDb2RpY29uKCdzeW1ib2wtc3RyaW5nJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjhkJyB9KTsKICAgIENvZGljb24udHJlZUl0ZW1FeHBhbmRlZCA9IG5ldyBDb2RpY29uKCd0cmVlLWl0ZW0tZXhwYW5kZWQnLCBDb2RpY29uLmNoZXZyb25Eb3duLmRlZmluaXRpb24pOyAvLyBjb2xsYXBzZWQgaXMgZG9uZSB3aXRoIHJvdGF0aW9uCiAgICBDb2RpY29uLnRyZWVGaWx0ZXJPblR5cGVPbiA9IG5ldyBDb2RpY29uKCd0cmVlLWZpbHRlci1vbi10eXBlLW9uJywgQ29kaWNvbi5saXN0RmlsdGVyLmRlZmluaXRpb24pOwogICAgQ29kaWNvbi50cmVlRmlsdGVyT25UeXBlT2ZmID0gbmV3IENvZGljb24oJ3RyZWUtZmlsdGVyLW9uLXR5cGUtb2ZmJywgQ29kaWNvbi5saXN0U2VsZWN0aW9uLmRlZmluaXRpb24pOwogICAgQ29kaWNvbi50cmVlRmlsdGVyQ2xlYXIgPSBuZXcgQ29kaWNvbigndHJlZS1maWx0ZXItY2xlYXInLCBDb2RpY29uLmNsb3NlLmRlZmluaXRpb24pOwogICAgQ29kaWNvbi50cmVlSXRlbUxvYWRpbmcgPSBuZXcgQ29kaWNvbigndHJlZS1pdGVtLWxvYWRpbmcnLCBDb2RpY29uLmxvYWRpbmcuZGVmaW5pdGlvbik7CiAgICBDb2RpY29uLm1lbnVTZWxlY3Rpb24gPSBuZXcgQ29kaWNvbignbWVudS1zZWxlY3Rpb24nLCBDb2RpY29uLmNoZWNrLmRlZmluaXRpb24pOwogICAgQ29kaWNvbi5tZW51U3VibWVudSA9IG5ldyBDb2RpY29uKCdtZW51LXN1Ym1lbnUnLCBDb2RpY29uLmNoZXZyb25SaWdodC5kZWZpbml0aW9uKTsKICAgIENvZGljb24uc2Nyb2xsYmFyQnV0dG9uTGVmdCA9IG5ldyBDb2RpY29uKCdzY3JvbGxiYXItYnV0dG9uLWxlZnQnLCBDb2RpY29uLnRyaWFuZ2xlTGVmdC5kZWZpbml0aW9uKTsKICAgIENvZGljb24uc2Nyb2xsYmFyQnV0dG9uUmlnaHQgPSBuZXcgQ29kaWNvbignc2Nyb2xsYmFyLWJ1dHRvbi1yaWdodCcsIENvZGljb24udHJpYW5nbGVSaWdodC5kZWZpbml0aW9uKTsKICAgIENvZGljb24uc2Nyb2xsYmFyQnV0dG9uVXAgPSBuZXcgQ29kaWNvbignc2Nyb2xsYmFyLWJ1dHRvbi11cCcsIENvZGljb24udHJpYW5nbGVVcC5kZWZpbml0aW9uKTsKICAgIENvZGljb24uc2Nyb2xsYmFyQnV0dG9uRG93biA9IG5ldyBDb2RpY29uKCdzY3JvbGxiYXItYnV0dG9uLWRvd24nLCBDb2RpY29uLnRyaWFuZ2xlRG93bi5kZWZpbml0aW9uKTsKICAgIENvZGljb24ucXVpY2tJbnB1dEJhY2sgPSBuZXcgQ29kaWNvbigncXVpY2staW5wdXQtYmFjaycsIENvZGljb24uYXJyb3dMZWZ0LmRlZmluaXRpb24pOwogICAgdmFyIENTU0ljb247CiAgICAoZnVuY3Rpb24gKENTU0ljb24pIHsKICAgICAgICBDU1NJY29uLmljb25OYW1lU2VnbWVudCA9ICdbQS1aYS16MC05XSsnOwogICAgICAgIENTU0ljb24uaWNvbk5hbWVFeHByZXNzaW9uID0gJ1tBLVphLXowLTktXSsnOwogICAgICAgIENTU0ljb24uaWNvbk1vZGlmaWVyRXhwcmVzc2lvbiA9ICd+W0EtWmEtel0rJzsKICAgICAgICBDU1NJY29uLmljb25OYW1lQ2hhcmFjdGVyID0gJ1tBLVphLXowLTl+LV0nOwogICAgICAgIGNvbnN0IGNzc0ljb25JZFJlZ2V4ID0gbmV3IFJlZ0V4cChgXigke0NTU0ljb24uaWNvbk5hbWVFeHByZXNzaW9ufSkoJHtDU1NJY29uLmljb25Nb2RpZmllckV4cHJlc3Npb259KT8kYCk7CiAgICAgICAgZnVuY3Rpb24gYXNDbGFzc05hbWVBcnJheShpY29uKSB7CiAgICAgICAgICAgIGlmIChpY29uIGluc3RhbmNlb2YgQ29kaWNvbikgewogICAgICAgICAgICAgICAgcmV0dXJuIFsnY29kaWNvbicsICdjb2RpY29uLScgKyBpY29uLmlkXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNzc0ljb25JZFJlZ2V4LmV4ZWMoaWNvbi5pZCk7CiAgICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhc0NsYXNzTmFtZUFycmF5KENvZGljb24uZXJyb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBbLCBpZCwgbW9kaWZpZXJdID0gbWF0Y2g7CiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbJ2NvZGljb24nLCAnY29kaWNvbi0nICsgaWRdOwogICAgICAgICAgICBpZiAobW9kaWZpZXIpIHsKICAgICAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgnY29kaWNvbi1tb2RpZmllci0nICsgbW9kaWZpZXIuc3Vic3RyKDEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lczsKICAgICAgICB9CiAgICAgICAgQ1NTSWNvbi5hc0NsYXNzTmFtZUFycmF5ID0gYXNDbGFzc05hbWVBcnJheTsKICAgICAgICBmdW5jdGlvbiBhc0NsYXNzTmFtZShpY29uKSB7CiAgICAgICAgICAgIHJldHVybiBhc0NsYXNzTmFtZUFycmF5KGljb24pLmpvaW4oJyAnKTsKICAgICAgICB9CiAgICAgICAgQ1NTSWNvbi5hc0NsYXNzTmFtZSA9IGFzQ2xhc3NOYW1lOwogICAgICAgIGZ1bmN0aW9uIGFzQ1NTU2VsZWN0b3IoaWNvbikgewogICAgICAgICAgICByZXR1cm4gJy4nICsgYXNDbGFzc05hbWVBcnJheShpY29uKS5qb2luKCcuJyk7CiAgICAgICAgfQogICAgICAgIENTU0ljb24uYXNDU1NTZWxlY3RvciA9IGFzQ1NTU2VsZWN0b3I7CiAgICB9KShDU1NJY29uIHx8IChDU1NJY29uID0ge30pKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHZhciBfYjsKICAgIGNsYXNzIExpbmtlZE1hcCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXNbX2JdID0gJ0xpbmtlZE1hcCc7CiAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdGhpcy5fc2l6ZSA9IDA7CiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gMDsKICAgICAgICB9CiAgICAgICAgY2xlYXIoKSB7CiAgICAgICAgICAgIHRoaXMuX21hcC5jbGVhcigpOwogICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLl9zaXplID0gMDsKICAgICAgICAgICAgdGhpcy5fc3RhdGUrKzsKICAgICAgICB9CiAgICAgICAgaXNFbXB0eSgpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsOwogICAgICAgIH0KICAgICAgICBnZXQgc2l6ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7CiAgICAgICAgfQogICAgICAgIGdldCBmaXJzdCgpIHsKICAgICAgICAgICAgdmFyIF9jOwogICAgICAgICAgICByZXR1cm4gKF9jID0gdGhpcy5faGVhZCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnZhbHVlOwogICAgICAgIH0KICAgICAgICBnZXQgbGFzdCgpIHsKICAgICAgICAgICAgdmFyIF9jOwogICAgICAgICAgICByZXR1cm4gKF9jID0gdGhpcy5fdGFpbCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnZhbHVlOwogICAgICAgIH0KICAgICAgICBoYXMoa2V5KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7CiAgICAgICAgfQogICAgICAgIGdldChrZXksIHRvdWNoID0gMCAvKiBOb25lICovKSB7CiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7CiAgICAgICAgICAgIGlmICghaXRlbSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodG91Y2ggIT09IDAgLyogTm9uZSAqLykgewogICAgICAgICAgICAgICAgdGhpcy50b3VjaChpdGVtLCB0b3VjaCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CiAgICAgICAgfQogICAgICAgIHNldChrZXksIHZhbHVlLCB0b3VjaCA9IDAgLyogTm9uZSAqLykgewogICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTsKICAgICAgICAgICAgaWYgKGl0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gMCAvKiBOb25lICovKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3VjaChpdGVtLCB0b3VjaCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpdGVtID0geyBrZXksIHZhbHVlLCBuZXh0OiB1bmRlZmluZWQsIHByZXZpb3VzOiB1bmRlZmluZWQgfTsKICAgICAgICAgICAgICAgIHN3aXRjaCAodG91Y2gpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDAgLyogTm9uZSAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtTGFzdChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxIC8qIEFzT2xkICovOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyIC8qIEFzTmV3ICovOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTsKICAgICAgICAgICAgICAgIHRoaXMuX3NpemUrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgZGVsZXRlKGtleSkgewogICAgICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpOwogICAgICAgIH0KICAgICAgICByZW1vdmUoa2V5KSB7CiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7CiAgICAgICAgICAgIGlmICghaXRlbSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTsKICAgICAgICAgICAgdGhpcy5fc2l6ZS0tOwogICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTsKICAgICAgICB9CiAgICAgICAgc2hpZnQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7CiAgICAgICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpOwogICAgICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7CiAgICAgICAgICAgIHRoaXMuX3NpemUtLTsKICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CiAgICAgICAgfQogICAgICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykgewogICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlOwogICAgICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7CiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50KSB7CiAgICAgICAgICAgICAgICBpZiAodGhpc0FyZykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAga2V5cygpIHsKICAgICAgICAgICAgY29uc3QgbWFwID0gdGhpczsKICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTsKICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkOwogICAgICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBuZXh0KCkgewogICAgICAgICAgICAgICAgICAgIGlmIChtYXAuX3N0YXRlICE9PSBzdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogY3VycmVudC5rZXksIGRvbmU6IGZhbHNlIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7CiAgICAgICAgfQogICAgICAgIHZhbHVlcygpIHsKICAgICAgICAgICAgY29uc3QgbWFwID0gdGhpczsKICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTsKICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkOwogICAgICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBuZXh0KCkgewogICAgICAgICAgICAgICAgICAgIGlmIChtYXAuX3N0YXRlICE9PSBzdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogY3VycmVudC52YWx1ZSwgZG9uZTogZmFsc2UgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgICAgICB9CiAgICAgICAgZW50cmllcygpIHsKICAgICAgICAgICAgY29uc3QgbWFwID0gdGhpczsKICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTsKICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkOwogICAgICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBuZXh0KCkgewogICAgICAgICAgICAgICAgICAgIGlmIChtYXAuX3N0YXRlICE9PSBzdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgICAgICB9CiAgICAgICAgWyhfYiA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTsKICAgICAgICB9CiAgICAgICAgdHJpbU9sZChuZXdTaXplKSB7CiAgICAgICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkOwogICAgICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7CiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkgewogICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7CiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogICAgICAgICAgICAgICAgY3VycmVudFNpemUtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDsKICAgICAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplOwogICAgICAgICAgICBpZiAoY3VycmVudCkgewogICAgICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdGF0ZSsrOwogICAgICAgIH0KICAgICAgICBhZGRJdGVtRmlyc3QoaXRlbSkgewogICAgICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydAogICAgICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDsKICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtOwogICAgICAgICAgICB0aGlzLl9zdGF0ZSsrOwogICAgICAgIH0KICAgICAgICBhZGRJdGVtTGFzdChpdGVtKSB7CiAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0CiAgICAgICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkgewogICAgICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDsKICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07CiAgICAgICAgICAgIHRoaXMuX3N0YXRlKys7CiAgICAgICAgfQogICAgICAgIHJlbW92ZUl0ZW0oaXRlbSkgewogICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZWQKICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBjYXNlIGFib3ZlLgogICAgICAgICAgICAgICAgaWYgKCFpdGVtLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaXRlbS5uZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW0ubmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZWQKICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBjYXNlIGFib3ZlLgogICAgICAgICAgICAgICAgaWYgKCFpdGVtLnByZXZpb3VzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGl0ZW0ucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtLnByZXZpb3VzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IGl0ZW0ubmV4dDsKICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gaXRlbS5wcmV2aW91czsKICAgICAgICAgICAgICAgIGlmICghbmV4dCB8fCAhcHJldmlvdXMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgcHJldmlvdXMubmV4dCA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLl9zdGF0ZSsrOwogICAgICAgIH0KICAgICAgICB0b3VjaChpdGVtLCB0b3VjaCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCh0b3VjaCAhPT0gMSAvKiBBc09sZCAqLyAmJiB0b3VjaCAhPT0gMiAvKiBBc05ldyAqLykpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodG91Y2ggPT09IDEgLyogQXNPbGQgKi8pIHsKICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IGl0ZW0ubmV4dDsKICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gaXRlbS5wcmV2aW91czsKICAgICAgICAgICAgICAgIC8vIFVubGluayB0aGUgaXRlbQogICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IHRoaXMuX3RhaWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyBtdXN0IGJlIGRlZmluZWQgc2luY2UgaXRlbSB3YXMgbm90IGhlYWQgYnV0IGlzIHRhaWwKICAgICAgICAgICAgICAgICAgICAvLyBTbyB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uIGl0ZW0gaW4gdGhlIG1hcAogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuCiAgICAgICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBub2RlIGF0IGhlYWQKICAgICAgICAgICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBpdGVtLm5leHQgPSB0aGlzLl9oZWFkOwogICAgICAgICAgICAgICAgdGhpcy5faGVhZC5wcmV2aW91cyA9IGl0ZW07CiAgICAgICAgICAgICAgICB0aGlzLl9oZWFkID0gaXRlbTsKICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG91Y2ggPT09IDIgLyogQXNOZXcgKi8pIHsKICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IGl0ZW0ubmV4dDsKICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gaXRlbS5wcmV2aW91czsKICAgICAgICAgICAgICAgIC8vIFVubGluayB0aGUgaXRlbS4KICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBtdXN0IGJlIGRlZmluZWQgc2luY2UgaXRlbSB3YXMgbm90IHRhaWwgYnV0IGlzIGhlYWQKICAgICAgICAgICAgICAgICAgICAvLyBTbyB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uIGl0ZW0gaW4gdGhlIG1hcAogICAgICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZCA9IG5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5leHQgYW5kIHByZXZpb3VzIGFyZSBub3QgdW5kZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5laXRoZXIgaGVhZCBub3IgdGFpbC4KICAgICAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7CiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubmV4dCA9IG5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDsKICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07CiAgICAgICAgICAgICAgICB0aGlzLl90YWlsID0gaXRlbTsKICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdG9KU09OKCkgewogICAgICAgICAgICBjb25zdCBkYXRhID0gW107CiAgICAgICAgICAgIHRoaXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4gewogICAgICAgICAgICAgICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9CiAgICAgICAgZnJvbUpTT04oZGF0YSkgewogICAgICAgICAgICB0aGlzLmNsZWFyKCk7CiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAgewogICAgICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDsKICAgICAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpOwogICAgICAgIH0KICAgICAgICBnZXQgbGltaXQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW1pdDsKICAgICAgICB9CiAgICAgICAgc2V0IGxpbWl0KGxpbWl0KSB7CiAgICAgICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7CiAgICAgICAgICAgIHRoaXMuY2hlY2tUcmltKCk7CiAgICAgICAgfQogICAgICAgIGdldChrZXksIHRvdWNoID0gMiAvKiBBc05ldyAqLykgewogICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KGtleSwgdG91Y2gpOwogICAgICAgIH0KICAgICAgICBwZWVrKGtleSkgewogICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KGtleSwgMCAvKiBOb25lICovKTsKICAgICAgICB9CiAgICAgICAgc2V0KGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIDIgLyogQXNOZXcgKi8pOwogICAgICAgICAgICB0aGlzLmNoZWNrVHJpbSgpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgY2hlY2tUcmltKCkgewogICAgICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHsKICAgICAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIC8vIFByZWZpeAogICAgX21hdGNoZXNQcmVmaXguYmluZCh1bmRlZmluZWQsIGZhbHNlKTsKICAgIF9tYXRjaGVzUHJlZml4LmJpbmQodW5kZWZpbmVkLCB0cnVlKTsKICAgIGZ1bmN0aW9uIF9tYXRjaGVzUHJlZml4KGlnbm9yZUNhc2UsIHdvcmQsIHdvcmRUb01hdGNoQWdhaW5zdCkgewogICAgICAgIGlmICghd29yZFRvTWF0Y2hBZ2FpbnN0IHx8IHdvcmRUb01hdGNoQWdhaW5zdC5sZW5ndGggPCB3b3JkLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgbGV0IG1hdGNoZXM7CiAgICAgICAgaWYgKGlnbm9yZUNhc2UpIHsKICAgICAgICAgICAgbWF0Y2hlcyA9IHN0YXJ0c1dpdGhJZ25vcmVDYXNlKHdvcmRUb01hdGNoQWdhaW5zdCwgd29yZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBtYXRjaGVzID0gd29yZFRvTWF0Y2hBZ2FpbnN0LmluZGV4T2Yod29yZCkgPT09IDA7CiAgICAgICAgfQogICAgICAgIGlmICghbWF0Y2hlcykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHdvcmQubGVuZ3RoID4gMCA/IFt7IHN0YXJ0OiAwLCBlbmQ6IHdvcmQubGVuZ3RoIH1dIDogW107CiAgICB9CiAgICBjb25zdCB3b3JkU2VwYXJhdG9ycyA9IG5ldyBTZXQoKTsKICAgIC8vIFRoZXNlIGFyZSBjaG9zZW4gYXMgbmF0dXJhbCB3b3JkIHNlcGFyYXRvcnMgYmFzZWQgb24gd3JpdGVuIHRleHQuCiAgICAvLyBJdCBpcyBhIHN1YnNldCBvZiB0aGUgd29yZCBzZXBhcmF0b3JzIHVzZWQgYnkgdGhlIG1vbmFjbyBlZGl0b3IuCiAgICAnKClbXXt9PD5gXCciLS87OiwuPyEnCiAgICAgICAgLnNwbGl0KCcnKQogICAgICAgIC5mb3JFYWNoKHMgPT4gd29yZFNlcGFyYXRvcnMuYWRkKHMuY2hhckNvZGVBdCgwKSkpOwogICAgbmV3IExSVUNhY2hlKDEwMDAwKTsgLy8gYm91bmRlZCB0byAxMDAwMCBlbGVtZW50cwogICAgY29uc3QgX21heExlbiA9IDEyODsKICAgIGZ1bmN0aW9uIGluaXRUYWJsZSgpIHsKICAgICAgICBjb25zdCB0YWJsZSA9IFtdOwogICAgICAgIGNvbnN0IHJvdyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IF9tYXhMZW47IGkrKykgewogICAgICAgICAgICByb3dbaV0gPSAwOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBfbWF4TGVuOyBpKyspIHsKICAgICAgICAgICAgdGFibGUucHVzaChyb3cuc2xpY2UoMCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFibGU7CiAgICB9CiAgICBmdW5jdGlvbiBpbml0QXJyKG1heExlbikgewogICAgICAgIGNvbnN0IHJvdyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG1heExlbjsgaSsrKSB7CiAgICAgICAgICAgIHJvd1tpXSA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiByb3c7CiAgICB9CiAgICBpbml0QXJyKDIgKiBfbWF4TGVuKTsgLy8gbWluIHdvcmQgcG9zaXRpb24gZm9yIGEgY2VydGFpbiBwYXR0ZXJuIHBvc2l0aW9uCiAgICBpbml0QXJyKDIgKiBfbWF4TGVuKTsgLy8gbWF4IHdvcmQgcG9zaXRpb24gZm9yIGEgY2VydGFpbiBwYXR0ZXJuIHBvc2l0aW9uCiAgICBpbml0VGFibGUoKTsgLy8gdGhlIGxlbmd0aCBvZiBhIGNvbnRpZ3VvdXMgZGlhZ29uYWwgbWF0Y2gKICAgIGluaXRUYWJsZSgpOwogICAgaW5pdFRhYmxlKCk7CiAgICB2YXIgRnV6enlTY29yZTsKICAgIChmdW5jdGlvbiAoRnV6enlTY29yZSkgewogICAgICAgIC8qKgogICAgICAgICAqIE5vIG1hdGNoZXMgYW5kIHZhbHVlIGAtMTAwYAogICAgICAgICAqLwogICAgICAgIEZ1enp5U2NvcmUuRGVmYXVsdCA9IChbLTEwMCwgMF0pOwogICAgICAgIGZ1bmN0aW9uIGlzRGVmYXVsdChzY29yZSkgewogICAgICAgICAgICByZXR1cm4gIXNjb3JlIHx8IChzY29yZS5sZW5ndGggPT09IDIgJiYgc2NvcmVbMF0gPT09IC0xMDAgJiYgc2NvcmVbMV0gPT09IDApOwogICAgICAgIH0KICAgICAgICBGdXp6eVNjb3JlLmlzRGVmYXVsdCA9IGlzRGVmYXVsdDsKICAgIH0pKEZ1enp5U2NvcmUgfHwgKEZ1enp5U2NvcmUgPSB7fSkpOwogICAgLy8jZW5kcmVnaW9uCgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjb25zdCBpY29uc1JlZ2V4ID0gbmV3IFJlZ0V4cChgXFwkXFwoJHtDU1NJY29uLmljb25OYW1lRXhwcmVzc2lvbn0oPzoke0NTU0ljb24uaWNvbk1vZGlmaWVyRXhwcmVzc2lvbn0pP1xcKWAsICdnJyk7IC8vIG5vIGNhcHR1cmluZyBncm91cHMKICAgIG5ldyBSZWdFeHAoQ1NTSWNvbi5pY29uTmFtZUNoYXJhY3Rlcik7CiAgICBjb25zdCBlc2NhcGVJY29uc1JlZ2V4ID0gbmV3IFJlZ0V4cChgKFxcXFwpPyR7aWNvbnNSZWdleC5zb3VyY2V9YCwgJ2cnKTsKICAgIGZ1bmN0aW9uIGVzY2FwZUljb25zKHRleHQpIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKGVzY2FwZUljb25zUmVnZXgsIChtYXRjaCwgZXNjYXBlZCkgPT4gZXNjYXBlZCA/IG1hdGNoIDogYFxcJHttYXRjaH1gKTsKICAgIH0KICAgIG5ldyBSZWdFeHAoYFxcXFwke2ljb25zUmVnZXguc291cmNlfWAsICdnJyk7CiAgICBuZXcgUmVnRXhwKGAoXFxzKT8oXFxcXCk/JHtpY29uc1JlZ2V4LnNvdXJjZX0oXFxzKT9gLCAnZycpOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY2xhc3MgTWFya2Rvd25TdHJpbmcgewogICAgICAgIGNvbnN0cnVjdG9yKHZhbHVlID0gJycsIGlzVHJ1c3RlZE9yT3B0aW9ucyA9IGZhbHNlKSB7CiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIHRocm93IGlsbGVnYWxBcmd1bWVudCgndmFsdWUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIGlzVHJ1c3RlZE9yT3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlzVHJ1c3RlZCA9IGlzVHJ1c3RlZE9yT3B0aW9uczsKICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydFRoZW1lSWNvbnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydEh0bWwgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuaXNUcnVzdGVkID0gKF9hID0gaXNUcnVzdGVkT3JPcHRpb25zLmlzVHJ1c3RlZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0VGhlbWVJY29ucyA9IChfYiA9IGlzVHJ1c3RlZE9yT3B0aW9ucy5zdXBwb3J0VGhlbWVJY29ucykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRIdG1sID0gKF9jID0gaXNUcnVzdGVkT3JPcHRpb25zLnN1cHBvcnRIdG1sKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhcHBlbmRUZXh0KHZhbHVlLCBuZXdsaW5lU3R5bGUgPSAwIC8qIFBhcmFncmFwaCAqLykgewogICAgICAgICAgICB0aGlzLnZhbHVlICs9IGVzY2FwZU1hcmtkb3duU3ludGF4VG9rZW5zKHRoaXMuc3VwcG9ydFRoZW1lSWNvbnMgPyBlc2NhcGVJY29ucyh2YWx1ZSkgOiB2YWx1ZSkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oWyBcdF0rKS9nLCAoX21hdGNoLCBnMSkgPT4gJyZuYnNwOycucmVwZWF0KGcxLmxlbmd0aCkpCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXD4vZ20sICdcXD4nKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xuL2csIG5ld2xpbmVTdHlsZSA9PT0gMSAvKiBCcmVhayAqLyA/ICdcXFxuJyA6ICdcblxuJyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBhcHBlbmRNYXJrZG93bih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLnZhbHVlICs9IHZhbHVlOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgYXBwZW5kQ29kZWJsb2NrKGxhbmdJZCwgY29kZSkgewogICAgICAgICAgICB0aGlzLnZhbHVlICs9ICdcbmBgYCc7CiAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gbGFuZ0lkOwogICAgICAgICAgICB0aGlzLnZhbHVlICs9ICdcbic7CiAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gY29kZTsKICAgICAgICAgICAgdGhpcy52YWx1ZSArPSAnXG5gYGBcbic7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGVzY2FwZU1hcmtkb3duU3ludGF4VG9rZW5zKHRleHQpIHsKICAgICAgICAvLyBlc2NhcGUgbWFya2Rvd24gc3ludGF4IHRva2VuczogaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjYmFja3NsYXNoCiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvW1xcYCpfe31bXF0oKSMrXC0hXS9nLCAnXFwkJicpOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgLy8gLS0tLS0tIGludGVybmFsIHV0aWwKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHZhciBfdXRpbDsKICAgIChmdW5jdGlvbiAoX3V0aWwpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICBfdXRpbC5zZXJ2aWNlSWRzID0gbmV3IE1hcCgpOwogICAgICAgIC8qKgogICAgICAgICAqIEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIF91dGlsLkRJX1RBUkdFVCA9ICckZGkkdGFyZ2V0JzsKICAgICAgICAvKioKICAgICAgICAgKiBAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICBfdXRpbC5ESV9ERVBFTkRFTkNJRVMgPSAnJGRpJGRlcGVuZGVuY2llcyc7CiAgICAgICAgLyoqCiAgICAgICAgICogQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0U2VydmljZURlcGVuZGVuY2llcyhjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiBjdG9yW191dGlsLkRJX0RFUEVOREVOQ0lFU10gfHwgW107CiAgICAgICAgfQogICAgICAgIF91dGlsLmdldFNlcnZpY2VEZXBlbmRlbmNpZXMgPSBnZXRTZXJ2aWNlRGVwZW5kZW5jaWVzOwogICAgfSkoX3V0aWwgfHwgKF91dGlsID0ge30pKTsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNyZWF0ZURlY29yYXRvcignaW5zdGFudGlhdGlvblNlcnZpY2UnKTsKICAgIGZ1bmN0aW9uIHN0b3JlU2VydmljZURlcGVuZGVuY3koaWQsIHRhcmdldCwgaW5kZXgsIG9wdGlvbmFsKSB7CiAgICAgICAgaWYgKHRhcmdldFtfdXRpbC5ESV9UQVJHRVRdID09PSB0YXJnZXQpIHsKICAgICAgICAgICAgdGFyZ2V0W191dGlsLkRJX0RFUEVOREVOQ0lFU10ucHVzaCh7IGlkLCBpbmRleCwgb3B0aW9uYWwgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0YXJnZXRbX3V0aWwuRElfREVQRU5ERU5DSUVTXSA9IFt7IGlkLCBpbmRleCwgb3B0aW9uYWwgfV07CiAgICAgICAgICAgIHRhcmdldFtfdXRpbC5ESV9UQVJHRVRdID0gdGFyZ2V0OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVGhlICpvbmx5KiB2YWxpZCB3YXkgdG8gY3JlYXRlIGEge3tTZXJ2aWNlSWRlbnRpZmllcn19LgogICAgICovCiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVEZWNvcmF0b3Ioc2VydmljZUlkKSB7CiAgICAgICAgaWYgKF91dGlsLnNlcnZpY2VJZHMuaGFzKHNlcnZpY2VJZCkpIHsKICAgICAgICAgICAgcmV0dXJuIF91dGlsLnNlcnZpY2VJZHMuZ2V0KHNlcnZpY2VJZCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlkID0gZnVuY3Rpb24gKHRhcmdldCwga2V5LCBpbmRleCkgewogICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdASVNlcnZpY2VOYW1lLWRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIHRvIGRlY29yYXRlIGEgcGFyYW1ldGVyJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShpZCwgdGFyZ2V0LCBpbmRleCwgZmFsc2UpOwogICAgICAgIH07CiAgICAgICAgaWQudG9TdHJpbmcgPSAoKSA9PiBzZXJ2aWNlSWQ7CiAgICAgICAgX3V0aWwuc2VydmljZUlkcy5zZXQoc2VydmljZUlkLCBpZCk7CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQoKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNyZWF0ZURlY29yYXRvcignbG9nU2VydmljZScpOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY3JlYXRlRGVjb3JhdG9yKCdsb2dnZXJTZXJ2aWNlJyk7CiAgICB2YXIgTG9nTGV2ZWw7CiAgICAoZnVuY3Rpb24gKExvZ0xldmVsKSB7CiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWxbIlRyYWNlIl0gPSAwXSA9ICJUcmFjZSI7CiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWxbIkRlYnVnIl0gPSAxXSA9ICJEZWJ1ZyI7CiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWxbIkluZm8iXSA9IDJdID0gIkluZm8iOwogICAgICAgIExvZ0xldmVsW0xvZ0xldmVsWyJXYXJuaW5nIl0gPSAzXSA9ICJXYXJuaW5nIjsKICAgICAgICBMb2dMZXZlbFtMb2dMZXZlbFsiRXJyb3IiXSA9IDRdID0gIkVycm9yIjsKICAgICAgICBMb2dMZXZlbFtMb2dMZXZlbFsiQ3JpdGljYWwiXSA9IDVdID0gIkNyaXRpY2FsIjsKICAgICAgICBMb2dMZXZlbFtMb2dMZXZlbFsiT2ZmIl0gPSA2XSA9ICJPZmYiOwogICAgfSkoTG9nTGV2ZWwgfHwgKExvZ0xldmVsID0ge30pKTsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IERFRkFVTFRfTE9HX0xFVkVMID0gTG9nTGV2ZWwuSW5mbzsKICAgIGNsYXNzIEFic3RyYWN0TG9nZ2VyIGV4dGVuZHMgRGlzcG9zYWJsZSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMubGV2ZWwgPSBERUZBVUxUX0xPR19MRVZFTDsKICAgICAgICAgICAgdGhpcy5fb25EaWRDaGFuZ2VMb2dMZXZlbCA9IHRoaXMuX3JlZ2lzdGVyKG5ldyBFbWl0dGVyKCkpOwogICAgICAgICAgICB0aGlzLm9uRGlkQ2hhbmdlTG9nTGV2ZWwgPSB0aGlzLl9vbkRpZENoYW5nZUxvZ0xldmVsLmV2ZW50OwogICAgICAgIH0KICAgICAgICBzZXRMZXZlbChsZXZlbCkgewogICAgICAgICAgICBpZiAodGhpcy5sZXZlbCAhPT0gbGV2ZWwpIHsKICAgICAgICAgICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICAgIHRoaXMuX29uRGlkQ2hhbmdlTG9nTGV2ZWwuZmlyZSh0aGlzLmxldmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBnZXRMZXZlbCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubGV2ZWw7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgQ29uc29sZUxvZ2dlciBleHRlbmRzIEFic3RyYWN0TG9nZ2VyIHsKICAgICAgICBjb25zdHJ1Y3Rvcihsb2dMZXZlbCA9IERFRkFVTFRfTE9HX0xFVkVMKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuc2V0TGV2ZWwobG9nTGV2ZWwpOwogICAgICAgIH0KICAgICAgICB0cmFjZShtZXNzYWdlLCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmdldExldmVsKCkgPD0gTG9nTGV2ZWwuVHJhY2UpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCclY1RSQUNFJywgJ2NvbG9yOiAjODg4JywgbWVzc2FnZSwgLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZGVidWcobWVzc2FnZSwgLi4uYXJncykgewogICAgICAgICAgICBpZiAodGhpcy5nZXRMZXZlbCgpIDw9IExvZ0xldmVsLkRlYnVnKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnJWNERUJVRycsICdiYWNrZ3JvdW5kOiAjZWVlOyBjb2xvcjogIzg4OCcsIG1lc3NhZ2UsIC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGluZm8obWVzc2FnZSwgLi4uYXJncykgewogICAgICAgICAgICBpZiAodGhpcy5nZXRMZXZlbCgpIDw9IExvZ0xldmVsLkluZm8pIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyBJTkZPJywgJ2NvbG9yOiAjMzNmJywgbWVzc2FnZSwgLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2FybihtZXNzYWdlLCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmdldExldmVsKCkgPD0gTG9nTGV2ZWwuV2FybmluZykgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyVjIFdBUk4nLCAnY29sb3I6ICM5OTMnLCBtZXNzYWdlLCAuLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlcnJvcihtZXNzYWdlLCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmdldExldmVsKCkgPD0gTG9nTGV2ZWwuRXJyb3IpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyAgRVJSJywgJ2NvbG9yOiAjZjMzJywgbWVzc2FnZSwgLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3JpdGljYWwobWVzc2FnZSwgLi4uYXJncykgewogICAgICAgICAgICBpZiAodGhpcy5nZXRMZXZlbCgpIDw9IExvZ0xldmVsLkNyaXRpY2FsKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnJWNDUklUSScsICdiYWNrZ3JvdW5kOiAjZjMzOyBjb2xvcjogd2hpdGUnLCBtZXNzYWdlLCAuLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkaXNwb3NlKCkgewogICAgICAgICAgICAvLyBub29wCiAgICAgICAgfQogICAgICAgIGZsdXNoKCkgewogICAgICAgICAgICAvLyBub29wCiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY2xhc3MgS2V5TW9kIHsKICAgICAgICBzdGF0aWMgY2hvcmQoZmlyc3RQYXJ0LCBzZWNvbmRQYXJ0KSB7CiAgICAgICAgICAgIHJldHVybiBLZXlDaG9yZChmaXJzdFBhcnQsIHNlY29uZFBhcnQpOwogICAgICAgIH0KICAgIH0KICAgIEtleU1vZC5DdHJsQ21kID0gMjA0OCAvKiBDdHJsQ21kICovOwogICAgS2V5TW9kLlNoaWZ0ID0gMTAyNCAvKiBTaGlmdCAqLzsKICAgIEtleU1vZC5BbHQgPSA1MTIgLyogQWx0ICovOwogICAgS2V5TW9kLldpbkN0cmwgPSAyNTYgLyogV2luQ3RybCAqLzsKICAgIGZ1bmN0aW9uIGNyZWF0ZU1vbmFjb0Jhc2VBUEkoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZWRpdG9yOiB1bmRlZmluZWQsCiAgICAgICAgICAgIGxhbmd1YWdlczogdW5kZWZpbmVkLAogICAgICAgICAgICBleHRyYTogdW5kZWZpbmVkLAogICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZTogQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UsCiAgICAgICAgICAgIEVtaXR0ZXI6IEVtaXR0ZXIsCiAgICAgICAgICAgIEtleUNvZGU6IEtleUNvZGUsCiAgICAgICAgICAgIEtleU1vZDogS2V5TW9kLAogICAgICAgICAgICBQb3NpdGlvbjogUG9zaXRpb24sCiAgICAgICAgICAgIFJhbmdlOiBSYW5nZSwKICAgICAgICAgICAgU2VsZWN0aW9uOiBTZWxlY3Rpb24sCiAgICAgICAgICAgIFVyaTogVVJJLAogICAgICAgICAgICBUb2tlbjogVG9rZW4sCiAgICAgICAgICAgIC8vIGNsYXNzZXMKICAgICAgICAgICAgTWFya2Rvd25TdHJpbmc6IE1hcmtkb3duU3RyaW5nLAogICAgICAgICAgICBEaXNwb3NhYmxlOiBEaXNwb3NhYmxlLAogICAgICAgICAgICBEaXNwb3NhYmxlU3RvcmU6IERpc3Bvc2FibGVTdG9yZSwKICAgICAgICAgICAgRXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXIsCiAgICAgICAgICAgIEFic3RyYWN0TG9nZ2VyOiBBYnN0cmFjdExvZ2dlciwKICAgICAgICAgICAgQ29uc29sZUxvZ2dlcjogQ29uc29sZUxvZ2dlciwKICAgICAgICAgICAgVG9rZW5pemF0aW9uUmVzdWx0OiBUb2tlbml6YXRpb25SZXN1bHQsCiAgICAgICAgICAgIFRva2VuaXphdGlvblJlc3VsdDI6IFRva2VuaXphdGlvblJlc3VsdDIsCiAgICAgICAgICAgIC8vIGVudW1zCiAgICAgICAgICAgIFNlbGVjdGlvbkRpcmVjdGlvbjogU2VsZWN0aW9uRGlyZWN0aW9uLAogICAgICAgICAgICBNYXJrZXJTZXZlcml0eTogTWFya2VyU2V2ZXJpdHksCiAgICAgICAgICAgIE1hcmtlclRhZzogTWFya2VyVGFnLAogICAgICAgICAgICBNYXJrZG93blN0cmluZ1RleHROZXdsaW5lU3R5bGU6IE1hcmtkb3duU3RyaW5nVGV4dE5ld2xpbmVTdHlsZSwKICAgICAgICAgICAgTG9nTGV2ZWw6IExvZ0xldmVsJDEsCiAgICAgICAgICAgIC8vIENvbnN0YW50cwogICAgICAgICAgICBlcnJvckhhbmRsZXIKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogVmVydGljYWwgTGFuZSBpbiB0aGUgb3ZlcnZpZXcgcnVsZXIgb2YgdGhlIGVkaXRvci4KICAgICAqLwogICAgdmFyIE92ZXJ2aWV3UnVsZXJMYW5lOwogICAgKGZ1bmN0aW9uIChPdmVydmlld1J1bGVyTGFuZSkgewogICAgICAgIE92ZXJ2aWV3UnVsZXJMYW5lW092ZXJ2aWV3UnVsZXJMYW5lWyJMZWZ0Il0gPSAxXSA9ICJMZWZ0IjsKICAgICAgICBPdmVydmlld1J1bGVyTGFuZVtPdmVydmlld1J1bGVyTGFuZVsiQ2VudGVyIl0gPSAyXSA9ICJDZW50ZXIiOwogICAgICAgIE92ZXJ2aWV3UnVsZXJMYW5lW092ZXJ2aWV3UnVsZXJMYW5lWyJSaWdodCJdID0gNF0gPSAiUmlnaHQiOwogICAgICAgIE92ZXJ2aWV3UnVsZXJMYW5lW092ZXJ2aWV3UnVsZXJMYW5lWyJGdWxsIl0gPSA3XSA9ICJGdWxsIjsKICAgIH0pKE92ZXJ2aWV3UnVsZXJMYW5lIHx8IChPdmVydmlld1J1bGVyTGFuZSA9IHt9KSk7CiAgICAvKioKICAgICAqIFBvc2l0aW9uIGluIHRoZSBtaW5pbWFwIHRvIHJlbmRlciB0aGUgZGVjb3JhdGlvbi4KICAgICAqLwogICAgdmFyIE1pbmltYXBQb3NpdGlvbjsKICAgIChmdW5jdGlvbiAoTWluaW1hcFBvc2l0aW9uKSB7CiAgICAgICAgTWluaW1hcFBvc2l0aW9uW01pbmltYXBQb3NpdGlvblsiSW5saW5lIl0gPSAxXSA9ICJJbmxpbmUiOwogICAgICAgIE1pbmltYXBQb3NpdGlvbltNaW5pbWFwUG9zaXRpb25bIkd1dHRlciJdID0gMl0gPSAiR3V0dGVyIjsKICAgIH0pKE1pbmltYXBQb3NpdGlvbiB8fCAoTWluaW1hcFBvc2l0aW9uID0ge30pKTsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHZhciBIb3Jpem9udGFsR3VpZGVzU3RhdGU7CiAgICAoZnVuY3Rpb24gKEhvcml6b250YWxHdWlkZXNTdGF0ZSkgewogICAgICAgIEhvcml6b250YWxHdWlkZXNTdGF0ZVtIb3Jpem9udGFsR3VpZGVzU3RhdGVbIkRpc2FibGVkIl0gPSAwXSA9ICJEaXNhYmxlZCI7CiAgICAgICAgSG9yaXpvbnRhbEd1aWRlc1N0YXRlW0hvcml6b250YWxHdWlkZXNTdGF0ZVsiRW5hYmxlZEZvckFjdGl2ZSJdID0gMV0gPSAiRW5hYmxlZEZvckFjdGl2ZSI7CiAgICAgICAgSG9yaXpvbnRhbEd1aWRlc1N0YXRlW0hvcml6b250YWxHdWlkZXNTdGF0ZVsiRW5hYmxlZCJdID0gMl0gPSAiRW5hYmxlZCI7CiAgICB9KShIb3Jpem9udGFsR3VpZGVzU3RhdGUgfHwgKEhvcml6b250YWxHdWlkZXNTdGF0ZSA9IHt9KSk7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBmdW5jdGlvbiBsZWZ0SXNXb3JkQm91bmRheSh3b3JkU2VwYXJhdG9ycywgdGV4dCwgdGV4dExlbmd0aCwgbWF0Y2hTdGFydEluZGV4LCBtYXRjaExlbmd0aCkgewogICAgICAgIGlmIChtYXRjaFN0YXJ0SW5kZXggPT09IDApIHsKICAgICAgICAgICAgLy8gTWF0Y2ggc3RhcnRzIGF0IHN0YXJ0IG9mIHN0cmluZwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY2hhckJlZm9yZSA9IHRleHQuY2hhckNvZGVBdChtYXRjaFN0YXJ0SW5kZXggLSAxKTsKICAgICAgICBpZiAod29yZFNlcGFyYXRvcnMuZ2V0KGNoYXJCZWZvcmUpICE9PSAwIC8qIFJlZ3VsYXIgKi8pIHsKICAgICAgICAgICAgLy8gVGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIG1hdGNoIGlzIGEgd29yZCBzZXBhcmF0b3IKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChjaGFyQmVmb3JlID09PSAxMyAvKiBDYXJyaWFnZVJldHVybiAqLyB8fCBjaGFyQmVmb3JlID09PSAxMCAvKiBMaW5lRmVlZCAqLykgewogICAgICAgICAgICAvLyBUaGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgbWF0Y2ggaXMgbGluZSBicmVhayBvciBjYXJyaWFnZSByZXR1cm4uCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAobWF0Y2hMZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2hhckluTWF0Y2ggPSB0ZXh0LmNoYXJDb2RlQXQobWF0Y2hTdGFydEluZGV4KTsKICAgICAgICAgICAgaWYgKHdvcmRTZXBhcmF0b3JzLmdldChmaXJzdENoYXJJbk1hdGNoKSAhPT0gMCAvKiBSZWd1bGFyICovKSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgY2hhcmFjdGVyIGluc2lkZSB0aGUgbWF0Y2ggaXMgYSB3b3JkIHNlcGFyYXRvcgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gcmlnaHRJc1dvcmRCb3VuZGF5KHdvcmRTZXBhcmF0b3JzLCB0ZXh0LCB0ZXh0TGVuZ3RoLCBtYXRjaFN0YXJ0SW5kZXgsIG1hdGNoTGVuZ3RoKSB7CiAgICAgICAgaWYgKG1hdGNoU3RhcnRJbmRleCArIG1hdGNoTGVuZ3RoID09PSB0ZXh0TGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIE1hdGNoIGVuZHMgYXQgZW5kIG9mIHN0cmluZwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY2hhckFmdGVyID0gdGV4dC5jaGFyQ29kZUF0KG1hdGNoU3RhcnRJbmRleCArIG1hdGNoTGVuZ3RoKTsKICAgICAgICBpZiAod29yZFNlcGFyYXRvcnMuZ2V0KGNoYXJBZnRlcikgIT09IDAgLyogUmVndWxhciAqLykgewogICAgICAgICAgICAvLyBUaGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBtYXRjaCBpcyBhIHdvcmQgc2VwYXJhdG9yCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoY2hhckFmdGVyID09PSAxMyAvKiBDYXJyaWFnZVJldHVybiAqLyB8fCBjaGFyQWZ0ZXIgPT09IDEwIC8qIExpbmVGZWVkICovKSB7CiAgICAgICAgICAgIC8vIFRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIG1hdGNoIGlzIGxpbmUgYnJlYWsgb3IgY2FycmlhZ2UgcmV0dXJuLgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG1hdGNoTGVuZ3RoID4gMCkgewogICAgICAgICAgICBjb25zdCBsYXN0Q2hhckluTWF0Y2ggPSB0ZXh0LmNoYXJDb2RlQXQobWF0Y2hTdGFydEluZGV4ICsgbWF0Y2hMZW5ndGggLSAxKTsKICAgICAgICAgICAgaWYgKHdvcmRTZXBhcmF0b3JzLmdldChsYXN0Q2hhckluTWF0Y2gpICE9PSAwIC8qIFJlZ3VsYXIgKi8pIHsKICAgICAgICAgICAgICAgIC8vIFRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgbWF0Y2ggaXMgYSB3b3JkIHNlcGFyYXRvcgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gaXNWYWxpZE1hdGNoKHdvcmRTZXBhcmF0b3JzLCB0ZXh0LCB0ZXh0TGVuZ3RoLCBtYXRjaFN0YXJ0SW5kZXgsIG1hdGNoTGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIChsZWZ0SXNXb3JkQm91bmRheSh3b3JkU2VwYXJhdG9ycywgdGV4dCwgdGV4dExlbmd0aCwgbWF0Y2hTdGFydEluZGV4LCBtYXRjaExlbmd0aCkKICAgICAgICAgICAgJiYgcmlnaHRJc1dvcmRCb3VuZGF5KHdvcmRTZXBhcmF0b3JzLCB0ZXh0LCB0ZXh0TGVuZ3RoLCBtYXRjaFN0YXJ0SW5kZXgsIG1hdGNoTGVuZ3RoKSk7CiAgICB9CiAgICBjbGFzcyBTZWFyY2hlciB7CiAgICAgICAgY29uc3RydWN0b3Iod29yZFNlcGFyYXRvcnMsIHNlYXJjaFJlZ2V4KSB7CiAgICAgICAgICAgIHRoaXMuX3dvcmRTZXBhcmF0b3JzID0gd29yZFNlcGFyYXRvcnM7CiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFJlZ2V4ID0gc2VhcmNoUmVnZXg7CiAgICAgICAgICAgIHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXggPSAtMTsKICAgICAgICAgICAgdGhpcy5fcHJldk1hdGNoTGVuZ3RoID0gMDsKICAgICAgICB9CiAgICAgICAgcmVzZXQobGFzdEluZGV4KSB7CiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCA9IGxhc3RJbmRleDsKICAgICAgICAgICAgdGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleCA9IC0xOwogICAgICAgICAgICB0aGlzLl9wcmV2TWF0Y2hMZW5ndGggPSAwOwogICAgICAgIH0KICAgICAgICBuZXh0KHRleHQpIHsKICAgICAgICAgICAgY29uc3QgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoOwogICAgICAgICAgICBsZXQgbTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXggKyB0aGlzLl9wcmV2TWF0Y2hMZW5ndGggPT09IHRleHRMZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG0gPSB0aGlzLl9zZWFyY2hSZWdleC5leGVjKHRleHQpOwogICAgICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaFN0YXJ0SW5kZXggPSBtLmluZGV4OwogICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hMZW5ndGggPSBtWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmIChtYXRjaFN0YXJ0SW5kZXggPT09IHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXggJiYgbWF0Y2hMZW5ndGggPT09IHRoaXMuX3ByZXZNYXRjaExlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaExlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIHJlc3VsdCBpcyBhbiBlbXB0eSBzdHJpbmcgYW5kIHdvbid0IGFkdmFuY2UgYHJlZ2V4Lmxhc3RJbmRleGAsIHNvIGByZWdleC5leGVjYCB3aWxsIHN0dWNrIGhlcmUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXR0ZW1wdCB0byByZWNvdmVyIGZyb20gdGhhdCBieSBhZHZhbmNpbmcgYnkgdHdvIGlmIHN1cnJvZ2F0ZSBwYWlyIGZvdW5kIGFuZCBieSBvbmUgb3RoZXJ3aXNlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXROZXh0Q29kZVBvaW50KHRleHQsIHRleHRMZW5ndGgsIHRoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCkgPiAweEZGRkYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4ICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIEV4aXQgZWFybHkgaWYgdGhlIHJlZ2V4IG1hdGNoZXMgdGhlIHNhbWUgcmFuZ2UgdHdpY2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXggPSBtYXRjaFN0YXJ0SW5kZXg7CiAgICAgICAgICAgICAgICB0aGlzLl9wcmV2TWF0Y2hMZW5ndGggPSBtYXRjaExlbmd0aDsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5fd29yZFNlcGFyYXRvcnMgfHwgaXNWYWxpZE1hdGNoKHRoaXMuX3dvcmRTZXBhcmF0b3JzLCB0ZXh0LCB0ZXh0TGVuZ3RoLCBtYXRjaFN0YXJ0SW5kZXgsIG1hdGNoTGVuZ3RoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlIChtKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY2xhc3MgVW5pY29kZVRleHRNb2RlbEhpZ2hsaWdodGVyIHsKICAgICAgICBzdGF0aWMgY29tcHV0ZVVuaWNvZGVIaWdobGlnaHRzKG1vZGVsLCBvcHRpb25zLCByYW5nZSkgewogICAgICAgICAgICBjb25zdCBzdGFydExpbmUgPSByYW5nZSA/IHJhbmdlLnN0YXJ0TGluZU51bWJlciA6IDE7CiAgICAgICAgICAgIGNvbnN0IGVuZExpbmUgPSByYW5nZSA/IHJhbmdlLmVuZExpbmVOdW1iZXIgOiBtb2RlbC5nZXRMaW5lQ291bnQoKTsKICAgICAgICAgICAgY29uc3QgY29kZVBvaW50SGlnaGxpZ2h0ZXIgPSBuZXcgQ29kZVBvaW50SGlnaGxpZ2h0ZXIob3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBjb2RlUG9pbnRIaWdobGlnaHRlci5nZXRDYW5kaWRhdGVDb2RlUG9pbnRzKCk7CiAgICAgICAgICAgIGxldCByZWdleDsKICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZXMgPT09ICdhbGxOb25CYXNpY0FzY2lpJykgewogICAgICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKCdbXlxcdFxcblxcclxceDIwLVxceDdFXScsICdnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAoYCR7YnVpbGRSZWdFeHBDaGFyQ2xhc3NFeHByKEFycmF5LmZyb20oY2FuZGlkYXRlcykpfWAsICdnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgc2VhcmNoZXIgPSBuZXcgU2VhcmNoZXIobnVsbCwgcmVnZXgpOwogICAgICAgICAgICBjb25zdCByYW5nZXMgPSBbXTsKICAgICAgICAgICAgbGV0IGhhc01vcmUgPSBmYWxzZTsKICAgICAgICAgICAgbGV0IG07CiAgICAgICAgICAgIGxldCBhbWJpZ3VvdXNDaGFyYWN0ZXJDb3VudCA9IDA7CiAgICAgICAgICAgIGxldCBpbnZpc2libGVDaGFyYWN0ZXJDb3VudCA9IDA7CiAgICAgICAgICAgIGxldCBub25CYXNpY0FzY2lpQ2hhcmFjdGVyQ291bnQgPSAwOwogICAgICAgICAgICBmb3JMb29wOiBmb3IgKGxldCBsaW5lTnVtYmVyID0gc3RhcnRMaW5lLCBsaW5lQ291bnQgPSBlbmRMaW5lOyBsaW5lTnVtYmVyIDw9IGxpbmVDb3VudDsgbGluZU51bWJlcisrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5lQ29udGVudCA9IG1vZGVsLmdldExpbmVDb250ZW50KGxpbmVOdW1iZXIpOwogICAgICAgICAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IGxpbmVDb250ZW50Lmxlbmd0aDsKICAgICAgICAgICAgICAgIC8vIFJlc2V0IHJlZ2V4IHRvIHNlYXJjaCBmcm9tIHRoZSBiZWdpbm5pbmcKICAgICAgICAgICAgICAgIHNlYXJjaGVyLnJlc2V0KDApOwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIG0gPSBzZWFyY2hlci5uZXh0KGxpbmVDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICBpZiAobSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IG0uaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IG0uaW5kZXggKyBtWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kIHJhbmdlIHRvIGVudGlyZSBjb2RlIHBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGVCZWZvcmUgPSBsaW5lQ29udGVudC5jaGFyQ29kZUF0KHN0YXJ0SW5kZXggLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0hpZ2hTdXJyb2dhdGUoY2hhckNvZGVCZWZvcmUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleC0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCArIDEgPCBsaW5lTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyQ29kZUJlZm9yZSA9IGxpbmVDb250ZW50LmNoYXJDb2RlQXQoZW5kSW5kZXggLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0hpZ2hTdXJyb2dhdGUoY2hhckNvZGVCZWZvcmUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHIgPSBsaW5lQ29udGVudC5zdWJzdHJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdobGlnaHRSZWFzb24gPSBjb2RlUG9pbnRIaWdobGlnaHRlci5zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaWdobGlnaHRSZWFzb24gIT09IDAgLyogTm9uZSAqLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlYXNvbiA9PT0gMyAvKiBBbWJpZ3VvdXMgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWJpZ3VvdXNDaGFyYWN0ZXJDb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGlnaGxpZ2h0UmVhc29uID09PSAyIC8qIEludmlzaWJsZSAqLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmlzaWJsZUNoYXJhY3RlckNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoaWdobGlnaHRSZWFzb24gPT09IDEgLyogTm9uQmFzaWNBU0NJSSAqLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbkJhc2ljQXNjaWlDaGFyYWN0ZXJDb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TmV2ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1BWF9SRVNVTFRfTEVOR1RIID0gMTAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZXMubGVuZ3RoID49IE1BWF9SRVNVTFRfTEVOR1RIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTW9yZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZm9yTG9vcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKG5ldyBSYW5nZShsaW5lTnVtYmVyLCBzdGFydEluZGV4ICsgMSwgbGluZU51bWJlciwgZW5kSW5kZXggKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IHdoaWxlIChtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcmFuZ2VzLAogICAgICAgICAgICAgICAgaGFzTW9yZSwKICAgICAgICAgICAgICAgIGFtYmlndW91c0NoYXJhY3RlckNvdW50LAogICAgICAgICAgICAgICAgaW52aXNpYmxlQ2hhcmFjdGVyQ291bnQsCiAgICAgICAgICAgICAgICBub25CYXNpY0FzY2lpQ2hhcmFjdGVyQ291bnQKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0UmVhc29uKGNoYXIsIG9wdGlvbnMpIHsKICAgICAgICAgICAgY29uc3QgY29kZVBvaW50SGlnaGxpZ2h0ZXIgPSBuZXcgQ29kZVBvaW50SGlnaGxpZ2h0ZXIob3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGNvZGVQb2ludEhpZ2hsaWdodGVyLnNob3VsZEhpZ2hsaWdodE5vbkJhc2ljQVNDSUkoY2hhcik7CiAgICAgICAgICAgIHN3aXRjaCAocmVhc29uKSB7CiAgICAgICAgICAgICAgICBjYXNlIDAgLyogTm9uZSAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBJbnZpc2libGUgKi86CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsga2luZDogMSAvKiBJbnZpc2libGUgKi8gfTsKICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBBbWJpZ3VvdXMgKi86CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJpbWFyeUNvbmZ1c2FibGUgPSBBbWJpZ3VvdXNDaGFyYWN0ZXJzLmdldFByaW1hcnlDb25mdXNhYmxlKGNoYXIuY29kZVBvaW50QXQoMCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGtpbmQ6IDAgLyogQW1iaWd1b3VzICovLCBjb25mdXNhYmxlV2l0aDogU3RyaW5nLmZyb21Db2RlUG9pbnQocHJpbWFyeUNvbmZ1c2FibGUpIH07CiAgICAgICAgICAgICAgICBjYXNlIDEgLyogTm9uQmFzaWNBU0NJSSAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBraW5kOiAyIC8qIE5vbkJhc2ljQXNjaWkgKi8gfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkUmVnRXhwQ2hhckNsYXNzRXhwcihjb2RlUG9pbnRzLCBmbGFncykgewogICAgICAgIGNvbnN0IHNyYyA9IGBbJHtlc2NhcGVSZWdFeHBDaGFyYWN0ZXJzKGNvZGVQb2ludHMubWFwKChpKSA9PiBTdHJpbmcuZnJvbUNvZGVQb2ludChpKSkuam9pbignJykpfV1gOwogICAgICAgIHJldHVybiBzcmM7CiAgICB9CiAgICBjbGFzcyBDb2RlUG9pbnRIaWdobGlnaHRlciB7CiAgICAgICAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICB0aGlzLmFsbG93ZWRDb2RlUG9pbnRzID0gbmV3IFNldChvcHRpb25zLmFsbG93ZWRDb2RlUG9pbnRzKTsKICAgICAgICB9CiAgICAgICAgZ2V0Q2FuZGlkYXRlQ29kZVBvaW50cygpIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub25CYXNpY0FTQ0lJKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2FsbE5vbkJhc2ljQXNjaWknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnZpc2libGVDaGFyYWN0ZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIEludmlzaWJsZUNoYXJhY3RlcnMuY29kZVBvaW50cykgewogICAgICAgICAgICAgICAgICAgIHNldC5hZGQoY3ApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW1iaWd1b3VzQ2hhcmFjdGVycykgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBBbWJpZ3VvdXNDaGFyYWN0ZXJzLmdldFByaW1hcnlDb25mdXNhYmxlQ29kZVBvaW50cygpKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChjcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiB0aGlzLmFsbG93ZWRDb2RlUG9pbnRzKSB7CiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGNwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2V0OwogICAgICAgIH0KICAgICAgICBzaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKGNoYXJhY3RlcikgewogICAgICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSBjaGFyYWN0ZXIuY29kZVBvaW50QXQoMCk7CiAgICAgICAgICAgIGlmICh0aGlzLmFsbG93ZWRDb2RlUG9pbnRzLmhhcyhjb2RlUG9pbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBOb25lICovOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9uQmFzaWNBU0NJSSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogTm9uQmFzaWNBU0NJSSAqLzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmludmlzaWJsZUNoYXJhY3RlcnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGlzQWxsb3dlZEludmlzaWJsZUNoYXJhY3RlciA9IGNoYXJhY3RlciA9PT0gJyAnIHx8IGNoYXJhY3RlciA9PT0gJ1xuJyB8fCBjaGFyYWN0ZXIgPT09ICdcdCc7CiAgICAgICAgICAgICAgICAvLyBUT0RPIGNoZWNrIGZvciBlbW9qaXMKICAgICAgICAgICAgICAgIGlmICghaXNBbGxvd2VkSW52aXNpYmxlQ2hhcmFjdGVyICYmIEludmlzaWJsZUNoYXJhY3RlcnMuaXNJbnZpc2libGVDaGFyYWN0ZXIoY29kZVBvaW50KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAyIC8qIEludmlzaWJsZSAqLzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFtYmlndW91c0NoYXJhY3RlcnMpIHsKICAgICAgICAgICAgICAgIGlmIChBbWJpZ3VvdXNDaGFyYWN0ZXJzLmlzQW1iaWd1b3VzKGNvZGVQb2ludCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMyAvKiBBbWJpZ3VvdXMgKi87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIDAgLyogTm9uZSAqLzsKICAgICAgICB9CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB2YXIgX19hd2FpdGVyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICAgICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9CiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQogICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7CiAgICAgICAgfSk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY2xhc3MgTWlycm9yTW9kZWwgZXh0ZW5kcyBNaXJyb3JUZXh0TW9kZWwgewogICAgICAgIGdldCB1cmkoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cmk7CiAgICAgICAgfQogICAgICAgIGdldCBlb2woKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lb2w7CiAgICAgICAgfQogICAgICAgIGdldFZhbHVlKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUZXh0KCk7CiAgICAgICAgfQogICAgICAgIGdldExpbmVzQ29udGVudCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVzLnNsaWNlKDApOwogICAgICAgIH0KICAgICAgICBnZXRMaW5lQ291bnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGdldExpbmVDb250ZW50KGxpbmVOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVzW2xpbmVOdW1iZXIgLSAxXTsKICAgICAgICB9CiAgICAgICAgZ2V0V29yZEF0UG9zaXRpb24ocG9zaXRpb24sIHdvcmREZWZpbml0aW9uKSB7CiAgICAgICAgICAgIGxldCB3b3JkQXRUZXh0ID0gZ2V0V29yZEF0VGV4dChwb3NpdGlvbi5jb2x1bW4sIGVuc3VyZVZhbGlkV29yZERlZmluaXRpb24od29yZERlZmluaXRpb24pLCB0aGlzLl9saW5lc1twb3NpdGlvbi5saW5lTnVtYmVyIC0gMV0sIDApOwogICAgICAgICAgICBpZiAod29yZEF0VGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShwb3NpdGlvbi5saW5lTnVtYmVyLCB3b3JkQXRUZXh0LnN0YXJ0Q29sdW1uLCBwb3NpdGlvbi5saW5lTnVtYmVyLCB3b3JkQXRUZXh0LmVuZENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHdvcmRzKHdvcmREZWZpbml0aW9uKSB7CiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fbGluZXM7CiAgICAgICAgICAgIGNvbnN0IHdvcmRlbml6ZSA9IHRoaXMuX3dvcmRlbml6ZS5iaW5kKHRoaXMpOwogICAgICAgICAgICBsZXQgbGluZU51bWJlciA9IDA7CiAgICAgICAgICAgIGxldCBsaW5lVGV4dCA9ICcnOwogICAgICAgICAgICBsZXQgd29yZFJhbmdlc0lkeCA9IDA7CiAgICAgICAgICAgIGxldCB3b3JkUmFuZ2VzID0gW107CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRSYW5nZXNJZHggPCB3b3JkUmFuZ2VzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBsaW5lVGV4dC5zdWJzdHJpbmcod29yZFJhbmdlc1t3b3JkUmFuZ2VzSWR4XS5zdGFydCwgd29yZFJhbmdlc1t3b3JkUmFuZ2VzSWR4XS5lbmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZFJhbmdlc0lkeCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZU51bWJlciA8IGxpbmVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVUZXh0ID0gbGluZXNbbGluZU51bWJlcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZFJhbmdlcyA9IHdvcmRlbml6ZShsaW5lVGV4dCwgd29yZERlZmluaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRSYW5nZXNJZHggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBnZXRMaW5lV29yZHMobGluZU51bWJlciwgd29yZERlZmluaXRpb24pIHsKICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLl9saW5lc1tsaW5lTnVtYmVyIC0gMV07CiAgICAgICAgICAgIGxldCByYW5nZXMgPSB0aGlzLl93b3JkZW5pemUoY29udGVudCwgd29yZERlZmluaXRpb24pOwogICAgICAgICAgICBsZXQgd29yZHMgPSBbXTsKICAgICAgICAgICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHsKICAgICAgICAgICAgICAgIHdvcmRzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHdvcmQ6IGNvbnRlbnQuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpLAogICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiByYW5nZS5zdGFydCArIDEsCiAgICAgICAgICAgICAgICAgICAgZW5kQ29sdW1uOiByYW5nZS5lbmQgKyAxCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gd29yZHM7CiAgICAgICAgfQogICAgICAgIF93b3JkZW5pemUoY29udGVudCwgd29yZERlZmluaXRpb24pIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgICAgIGxldCBtYXRjaDsKICAgICAgICAgICAgd29yZERlZmluaXRpb24ubGFzdEluZGV4ID0gMDsgLy8gcmVzZXQgbGFzdEluZGV4IGp1c3QgdG8gYmUgc3VyZQogICAgICAgICAgICB3aGlsZSAobWF0Y2ggPSB3b3JkRGVmaW5pdGlvbi5leGVjKGNvbnRlbnQpKSB7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMF0ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaXQgZGlkIG1hdGNoIHRoZSBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgc3RhcnQ6IG1hdGNoLmluZGV4LCBlbmQ6IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGdldFZhbHVlSW5SYW5nZShyYW5nZSkgewogICAgICAgICAgICByYW5nZSA9IHRoaXMuX3ZhbGlkYXRlUmFuZ2UocmFuZ2UpOwogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyID09PSByYW5nZS5lbmRMaW5lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGluZXNbcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0Q29sdW1uIC0gMSwgcmFuZ2UuZW5kQ29sdW1uIC0gMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGxpbmVFbmRpbmcgPSB0aGlzLl9lb2w7CiAgICAgICAgICAgIGxldCBzdGFydExpbmVJbmRleCA9IHJhbmdlLnN0YXJ0TGluZU51bWJlciAtIDE7CiAgICAgICAgICAgIGxldCBlbmRMaW5lSW5kZXggPSByYW5nZS5lbmRMaW5lTnVtYmVyIC0gMTsKICAgICAgICAgICAgbGV0IHJlc3VsdExpbmVzID0gW107CiAgICAgICAgICAgIHJlc3VsdExpbmVzLnB1c2godGhpcy5fbGluZXNbc3RhcnRMaW5lSW5kZXhdLnN1YnN0cmluZyhyYW5nZS5zdGFydENvbHVtbiAtIDEpKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZUluZGV4ICsgMTsgaSA8IGVuZExpbmVJbmRleDsgaSsrKSB7CiAgICAgICAgICAgICAgICByZXN1bHRMaW5lcy5wdXNoKHRoaXMuX2xpbmVzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHRMaW5lcy5wdXNoKHRoaXMuX2xpbmVzW2VuZExpbmVJbmRleF0uc3Vic3RyaW5nKDAsIHJhbmdlLmVuZENvbHVtbiAtIDEpKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExpbmVzLmpvaW4obGluZUVuZGluZyk7CiAgICAgICAgfQogICAgICAgIG9mZnNldEF0KHBvc2l0aW9uKSB7CiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fdmFsaWRhdGVQb3NpdGlvbihwb3NpdGlvbik7CiAgICAgICAgICAgIHRoaXMuX2Vuc3VyZUxpbmVTdGFydHMoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVTdGFydHMuZ2V0UHJlZml4U3VtKHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAyKSArIChwb3NpdGlvbi5jb2x1bW4gLSAxKTsKICAgICAgICB9CiAgICAgICAgcG9zaXRpb25BdChvZmZzZXQpIHsKICAgICAgICAgICAgb2Zmc2V0ID0gTWF0aC5mbG9vcihvZmZzZXQpOwogICAgICAgICAgICBvZmZzZXQgPSBNYXRoLm1heCgwLCBvZmZzZXQpOwogICAgICAgICAgICB0aGlzLl9lbnN1cmVMaW5lU3RhcnRzKCk7CiAgICAgICAgICAgIGxldCBvdXQgPSB0aGlzLl9saW5lU3RhcnRzLmdldEluZGV4T2Yob2Zmc2V0KTsKICAgICAgICAgICAgbGV0IGxpbmVMZW5ndGggPSB0aGlzLl9saW5lc1tvdXQuaW5kZXhdLmxlbmd0aDsKICAgICAgICAgICAgLy8gRW5zdXJlIHdlIHJldHVybiBhIHZhbGlkIHBvc2l0aW9uCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiAxICsgb3V0LmluZGV4LAogICAgICAgICAgICAgICAgY29sdW1uOiAxICsgTWF0aC5taW4ob3V0LnJlbWFpbmRlciwgbGluZUxlbmd0aCkKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgX3ZhbGlkYXRlUmFuZ2UocmFuZ2UpIHsKICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHsgbGluZU51bWJlcjogcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLCBjb2x1bW46IHJhbmdlLnN0YXJ0Q29sdW1uIH0pOwogICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHsgbGluZU51bWJlcjogcmFuZ2UuZW5kTGluZU51bWJlciwgY29sdW1uOiByYW5nZS5lbmRDb2x1bW4gfSk7CiAgICAgICAgICAgIGlmIChzdGFydC5saW5lTnVtYmVyICE9PSByYW5nZS5zdGFydExpbmVOdW1iZXIKICAgICAgICAgICAgICAgIHx8IHN0YXJ0LmNvbHVtbiAhPT0gcmFuZ2Uuc3RhcnRDb2x1bW4KICAgICAgICAgICAgICAgIHx8IGVuZC5saW5lTnVtYmVyICE9PSByYW5nZS5lbmRMaW5lTnVtYmVyCiAgICAgICAgICAgICAgICB8fCBlbmQuY29sdW1uICE9PSByYW5nZS5lbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBzdGFydC5saW5lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiBzdGFydC5jb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgZW5kTGluZU51bWJlcjogZW5kLmxpbmVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgZW5kQ29sdW1uOiBlbmQuY29sdW1uCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICB9CiAgICAgICAgX3ZhbGlkYXRlUG9zaXRpb24ocG9zaXRpb24pIHsKICAgICAgICAgICAgaWYgKCFQb3NpdGlvbi5pc0lQb3NpdGlvbihwb3NpdGlvbikpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIHBvc2l0aW9uJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHsgbGluZU51bWJlciwgY29sdW1uIH0gPSBwb3NpdGlvbjsKICAgICAgICAgICAgbGV0IGhhc0NoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKGxpbmVOdW1iZXIgPCAxKSB7CiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gMTsKICAgICAgICAgICAgICAgIGNvbHVtbiA9IDE7CiAgICAgICAgICAgICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChsaW5lTnVtYmVyID4gdGhpcy5fbGluZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gdGhpcy5fbGluZXMubGVuZ3RoOwogICAgICAgICAgICAgICAgY29sdW1uID0gdGhpcy5fbGluZXNbbGluZU51bWJlciAtIDFdLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxldCBtYXhDaGFyYWN0ZXIgPSB0aGlzLl9saW5lc1tsaW5lTnVtYmVyIC0gMV0ubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIGlmIChjb2x1bW4gPCAxKSB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMTsKICAgICAgICAgICAgICAgICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHVtbiA+IG1heENoYXJhY3RlcikgewogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IG1heENoYXJhY3RlcjsKICAgICAgICAgICAgICAgICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWhhc0NoYW5nZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IGxpbmVOdW1iZXIsIGNvbHVtbiB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY2xhc3MgRWRpdG9yU2ltcGxlV29ya2VyIHsKICAgICAgICBjb25zdHJ1Y3Rvcihob3N0LCBmb3JlaWduTW9kdWxlRmFjdG9yeSkgewogICAgICAgICAgICB0aGlzLl9ob3N0ID0gaG9zdDsKICAgICAgICAgICAgdGhpcy5fbW9kZWxzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgdGhpcy5fZm9yZWlnbk1vZHVsZUZhY3RvcnkgPSBmb3JlaWduTW9kdWxlRmFjdG9yeTsKICAgICAgICAgICAgdGhpcy5fZm9yZWlnbk1vZHVsZSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgIHRoaXMuX21vZGVscyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIF9nZXRNb2RlbCh1cmkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsc1t1cmldOwogICAgICAgIH0KICAgICAgICBfZ2V0TW9kZWxzKCkgewogICAgICAgICAgICBsZXQgYWxsID0gW107CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX21vZGVscykuZm9yRWFjaCgoa2V5KSA9PiBhbGwucHVzaCh0aGlzLl9tb2RlbHNba2V5XSkpOwogICAgICAgICAgICByZXR1cm4gYWxsOwogICAgICAgIH0KICAgICAgICBhY2NlcHROZXdNb2RlbChkYXRhKSB7CiAgICAgICAgICAgIHRoaXMuX21vZGVsc1tkYXRhLnVybF0gPSBuZXcgTWlycm9yTW9kZWwoVVJJLnBhcnNlKGRhdGEudXJsKSwgZGF0YS5saW5lcywgZGF0YS5FT0wsIGRhdGEudmVyc2lvbklkKTsKICAgICAgICB9CiAgICAgICAgYWNjZXB0TW9kZWxDaGFuZ2VkKHN0clVSTCwgZSkgewogICAgICAgICAgICBpZiAoIXRoaXMuX21vZGVsc1tzdHJVUkxdKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG1vZGVsID0gdGhpcy5fbW9kZWxzW3N0clVSTF07CiAgICAgICAgICAgIG1vZGVsLm9uRXZlbnRzKGUpOwogICAgICAgIH0KICAgICAgICBhY2NlcHRSZW1vdmVkTW9kZWwoc3RyVVJMKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fbW9kZWxzW3N0clVSTF0pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWxldGUgdGhpcy5fbW9kZWxzW3N0clVSTF07CiAgICAgICAgfQogICAgICAgIGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyh1cmwsIG9wdGlvbnMsIHJhbmdlKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2dldE1vZGVsKHVybCk7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2VzOiBbXSwgaGFzTW9yZTogZmFsc2UsIGFtYmlndW91c0NoYXJhY3RlckNvdW50OiAwLCBpbnZpc2libGVDaGFyYWN0ZXJDb3VudDogMCwgbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50OiAwIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gVW5pY29kZVRleHRNb2RlbEhpZ2hsaWdodGVyLmNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyhtb2RlbCwgb3B0aW9ucywgcmFuZ2UpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy8gLS0tLSBCRUdJTiBkaWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgY29tcHV0ZURpZmYob3JpZ2luYWxVcmwsIG1vZGlmaWVkVXJsLCBpZ25vcmVUcmltV2hpdGVzcGFjZSwgbWF4Q29tcHV0YXRpb25UaW1lKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMuX2dldE1vZGVsKG9yaWdpbmFsVXJsKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkID0gdGhpcy5fZ2V0TW9kZWwobW9kaWZpZWRVcmwpOwogICAgICAgICAgICAgICAgaWYgKCFvcmlnaW5hbCB8fCAhbW9kaWZpZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTGluZXMgPSBvcmlnaW5hbC5nZXRMaW5lc0NvbnRlbnQoKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkTGluZXMgPSBtb2RpZmllZC5nZXRMaW5lc0NvbnRlbnQoKTsKICAgICAgICAgICAgICAgIGNvbnN0IGRpZmZDb21wdXRlciA9IG5ldyBEaWZmQ29tcHV0ZXIob3JpZ2luYWxMaW5lcywgbW9kaWZpZWRMaW5lcywgewogICAgICAgICAgICAgICAgICAgIHNob3VsZENvbXB1dGVDaGFyQ2hhbmdlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlOiBpZ25vcmVUcmltV2hpdGVzcGFjZSwKICAgICAgICAgICAgICAgICAgICBzaG91bGRNYWtlUHJldHR5RGlmZjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBtYXhDb21wdXRhdGlvblRpbWU6IG1heENvbXB1dGF0aW9uVGltZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjb25zdCBkaWZmUmVzdWx0ID0gZGlmZkNvbXB1dGVyLmNvbXB1dGVEaWZmKCk7CiAgICAgICAgICAgICAgICBjb25zdCBpZGVudGljYWwgPSAoZGlmZlJlc3VsdC5jaGFuZ2VzLmxlbmd0aCA+IDAgPyBmYWxzZSA6IHRoaXMuX21vZGVsc0FyZUlkZW50aWNhbChvcmlnaW5hbCwgbW9kaWZpZWQpKTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBkaWZmUmVzdWx0LnF1aXRFYXJseSwKICAgICAgICAgICAgICAgICAgICBpZGVudGljYWw6IGlkZW50aWNhbCwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzOiBkaWZmUmVzdWx0LmNoYW5nZXMKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfbW9kZWxzQXJlSWRlbnRpY2FsKG9yaWdpbmFsLCBtb2RpZmllZCkgewogICAgICAgICAgICBjb25zdCBvcmlnaW5hbExpbmVDb3VudCA9IG9yaWdpbmFsLmdldExpbmVDb3VudCgpOwogICAgICAgICAgICBjb25zdCBtb2RpZmllZExpbmVDb3VudCA9IG1vZGlmaWVkLmdldExpbmVDb3VudCgpOwogICAgICAgICAgICBpZiAob3JpZ2luYWxMaW5lQ291bnQgIT09IG1vZGlmaWVkTGluZUNvdW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgbGluZSA9IDE7IGxpbmUgPD0gb3JpZ2luYWxMaW5lQ291bnQ7IGxpbmUrKykgewogICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxMaW5lID0gb3JpZ2luYWwuZ2V0TGluZUNvbnRlbnQobGluZSk7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZExpbmUgPSBtb2RpZmllZC5nZXRMaW5lQ29udGVudChsaW5lKTsKICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbExpbmUgIT09IG1vZGlmaWVkTGluZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY29tcHV0ZU1vcmVNaW5pbWFsRWRpdHMobW9kZWxVcmwsIGVkaXRzKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2dldE1vZGVsKG1vZGVsVXJsKTsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWRpdHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICAgICAgICAgIGxldCBsYXN0RW9sID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgZWRpdHMgPSBlZGl0cy5zbGljZSgwKS5zb3J0KChhLCBiKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEucmFuZ2UgJiYgYi5yYW5nZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuY29tcGFyZVJhbmdlc1VzaW5nU3RhcnRzKGEucmFuZ2UsIGIucmFuZ2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBlb2wgb25seSBjaGFuZ2VzIHNob3VsZCBnbyB0byB0aGUgZW5kCiAgICAgICAgICAgICAgICAgICAgbGV0IGFSbmcgPSBhLnJhbmdlID8gMCA6IDE7CiAgICAgICAgICAgICAgICAgICAgbGV0IGJSbmcgPSBiLnJhbmdlID8gMCA6IDE7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFSbmcgLSBiUm5nOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCB7IHJhbmdlLCB0ZXh0LCBlb2wgfSBvZiBlZGl0cykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW9sID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0RW9sID0gZW9sOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoUmFuZ2UuaXNFbXB0eShyYW5nZSkgJiYgIXRleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkgY2hhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IG1vZGVsLmdldFZhbHVlSW5SYW5nZShyYW5nZSk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXHJcbnxcbnxcci9nLCBtb2RlbC5lb2wpOwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbCA9PT0gdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBub29wCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgZGlmZiB3b24ndCB0YWtlIHRvbyBsb25nCiAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGgubWF4KHRleHQubGVuZ3RoLCBvcmlnaW5hbC5sZW5ndGgpID4gRWRpdG9yU2ltcGxlV29ya2VyLl9kaWZmTGltaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyByYW5nZSwgdGV4dCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgZGlmZiBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBlZGl0LnRleHQKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gc3RyaW5nRGlmZihvcmlnaW5hbCwgdGV4dCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRPZmZzZXQgPSBtb2RlbC5vZmZzZXRBdChSYW5nZS5saWZ0KHJhbmdlKS5nZXRTdGFydFBvc2l0aW9uKCkpOwogICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBtb2RlbC5wb3NpdGlvbkF0KGVkaXRPZmZzZXQgKyBjaGFuZ2Uub3JpZ2luYWxTdGFydCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IG1vZGVsLnBvc2l0aW9uQXQoZWRpdE9mZnNldCArIGNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgY2hhbmdlLm9yaWdpbmFsTGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RWRpdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRleHQuc3Vic3RyKGNoYW5nZS5tb2RpZmllZFN0YXJ0LCBjaGFuZ2UubW9kaWZpZWRMZW5ndGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBzdGFydC5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogc3RhcnQuY29sdW1uLCBlbmRMaW5lTnVtYmVyOiBlbmQubGluZU51bWJlciwgZW5kQ29sdW1uOiBlbmQuY29sdW1uIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLmdldFZhbHVlSW5SYW5nZShuZXdFZGl0LnJhbmdlKSAhPT0gbmV3RWRpdC50ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdFZGl0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGFzdEVvbCA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGVvbDogbGFzdEVvbCwgdGV4dDogJycsIHJhbmdlOiB7IHN0YXJ0TGluZU51bWJlcjogMCwgc3RhcnRDb2x1bW46IDAsIGVuZExpbmVOdW1iZXI6IDAsIGVuZENvbHVtbjogMCB9IH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0gRU5EIG1pbmltYWwgZWRpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgY29tcHV0ZUxpbmtzKG1vZGVsVXJsKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLl9nZXRNb2RlbChtb2RlbFVybCk7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gY29tcHV0ZUxpbmtzKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRleHR1YWxTdWdnZXN0KG1vZGVsVXJscywgbGVhZGluZ1dvcmQsIHdvcmREZWYsIHdvcmREZWZGbGFncykgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgY29uc3Qgc3cgPSBuZXcgU3RvcFdhdGNoKHRydWUpOwogICAgICAgICAgICAgICAgY29uc3Qgd29yZERlZlJlZ0V4cCA9IG5ldyBSZWdFeHAod29yZERlZiwgd29yZERlZkZsYWdzKTsKICAgICAgICAgICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICBvdXRlcjogZm9yIChsZXQgdXJsIG9mIG1vZGVsVXJscykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5fZ2V0TW9kZWwodXJsKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3b3JkIG9mIG1vZGVsLndvcmRzKHdvcmREZWZSZWdFeHApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JkID09PSBsZWFkaW5nV29yZCB8fCAhaXNOYU4oTnVtYmVyKHdvcmQpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2Vlbi5hZGQod29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWVuLnNpemUgPiBFZGl0b3JTaW1wbGVXb3JrZXIuX3N1Z2dlc3Rpb25zTGltaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHsgd29yZHM6IEFycmF5LmZyb20oc2VlbiksIGR1cmF0aW9uOiBzdy5lbGFwc2VkKCkgfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0gRU5EIHN1Z2dlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyNyZWdpb24gLS0gd29yZCByYW5nZXMgLS0KICAgICAgICBjb21wdXRlV29yZFJhbmdlcyhtb2RlbFVybCwgcmFuZ2UsIHdvcmREZWYsIHdvcmREZWZGbGFncykgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgbGV0IG1vZGVsID0gdGhpcy5fZ2V0TW9kZWwobW9kZWxVcmwpOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3Qgd29yZERlZlJlZ0V4cCA9IG5ldyBSZWdFeHAod29yZERlZiwgd29yZERlZkZsYWdzKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBsaW5lID0gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyOyBsaW5lIDwgcmFuZ2UuZW5kTGluZU51bWJlcjsgbGluZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmRzID0gbW9kZWwuZ2V0TGluZVdvcmRzKGxpbmUsIHdvcmREZWZSZWdFeHApOwogICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiB3b3JkcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKE51bWJlcih3b3JkLndvcmQpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFycmF5ID0gcmVzdWx0W3dvcmQud29yZF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbd29yZC53b3JkXSA9IGFycmF5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDb2x1bW46IHdvcmQuc3RhcnRDb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kQ29sdW1uOiB3b3JkLmVuZENvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy8jZW5kcmVnaW9uCiAgICAgICAgbmF2aWdhdGVWYWx1ZVNldChtb2RlbFVybCwgcmFuZ2UsIHVwLCB3b3JkRGVmLCB3b3JkRGVmRmxhZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgIGxldCBtb2RlbCA9IHRoaXMuX2dldE1vZGVsKG1vZGVsVXJsKTsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCB3b3JkRGVmUmVnRXhwID0gbmV3IFJlZ0V4cCh3b3JkRGVmLCB3b3JkRGVmRmxhZ3MpOwogICAgICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0Q29sdW1uID09PSByYW5nZS5lbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByYW5nZS5zdGFydExpbmVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiByYW5nZS5zdGFydENvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kTGluZU51bWJlcjogcmFuZ2UuZW5kTGluZU51bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kQ29sdW1uOiByYW5nZS5lbmRDb2x1bW4gKyAxCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBzZWxlY3Rpb25UZXh0ID0gbW9kZWwuZ2V0VmFsdWVJblJhbmdlKHJhbmdlKTsKICAgICAgICAgICAgICAgIGxldCB3b3JkUmFuZ2UgPSBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbih7IGxpbmVOdW1iZXI6IHJhbmdlLnN0YXJ0TGluZU51bWJlciwgY29sdW1uOiByYW5nZS5zdGFydENvbHVtbiB9LCB3b3JkRGVmUmVnRXhwKTsKICAgICAgICAgICAgICAgIGlmICghd29yZFJhbmdlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgd29yZCA9IG1vZGVsLmdldFZhbHVlSW5SYW5nZSh3b3JkUmFuZ2UpOwogICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEJhc2ljSW5wbGFjZVJlcGxhY2UuSU5TVEFOQ0UubmF2aWdhdGVWYWx1ZVNldChyYW5nZSwgc2VsZWN0aW9uVGV4dCwgd29yZFJhbmdlLCB3b3JkLCB1cCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy8gLS0tLSBCRUdJTiBmb3JlaWduIG1vZHVsZSBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgbG9hZEZvcmVpZ25Nb2R1bGUobW9kdWxlSWQsIGNyZWF0ZURhdGEsIGZvcmVpZ25Ib3N0TWV0aG9kcykgewogICAgICAgICAgICBjb25zdCBwcm94eU1ldGhvZFJlcXVlc3QgPSAobWV0aG9kLCBhcmdzKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faG9zdC5maHIobWV0aG9kLCBhcmdzKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY29uc3QgZm9yZWlnbkhvc3QgPSBjcmVhdGVQcm94eU9iamVjdCQxKGZvcmVpZ25Ib3N0TWV0aG9kcywgcHJveHlNZXRob2RSZXF1ZXN0KTsKICAgICAgICAgICAgbGV0IGN0eCA9IHsKICAgICAgICAgICAgICAgIGhvc3Q6IGZvcmVpZ25Ib3N0LAogICAgICAgICAgICAgICAgZ2V0TWlycm9yTW9kZWxzOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1vZGVscygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5fZm9yZWlnbk1vZHVsZUZhY3RvcnkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZvcmVpZ25Nb2R1bGUgPSB0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeShjdHgsIGNyZWF0ZURhdGEpOwogICAgICAgICAgICAgICAgLy8gc3RhdGljIGZvcmVpbmcgbW9kdWxlCiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGdldEFsbE1ldGhvZE5hbWVzKHRoaXMuX2ZvcmVpZ25Nb2R1bGUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFU00tY29tbWVudC1iZWdpbgogICAgICAgICAgICAvLyAJCXJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgLy8gCQkJcmVxdWlyZShbbW9kdWxlSWRdLCAoZm9yZWlnbk1vZHVsZTogeyBjcmVhdGU6IElGb3JlaWduTW9kdWxlRmFjdG9yeSB9KSA9PiB7CiAgICAgICAgICAgIC8vIAkJCQl0aGlzLl9mb3JlaWduTW9kdWxlID0gZm9yZWlnbk1vZHVsZS5jcmVhdGUoY3R4LCBjcmVhdGVEYXRhKTsKICAgICAgICAgICAgLy8gCiAgICAgICAgICAgIC8vIAkJCQlyZXNvbHZlKHR5cGVzLmdldEFsbE1ldGhvZE5hbWVzKHRoaXMuX2ZvcmVpZ25Nb2R1bGUpKTsKICAgICAgICAgICAgLy8gCiAgICAgICAgICAgIC8vIAkJCX0sIHJlamVjdCk7CiAgICAgICAgICAgIC8vIAkJfSk7CiAgICAgICAgICAgIC8vIEVTTS1jb21tZW50LWVuZAogICAgICAgICAgICAvLyBFU00tdW5jb21tZW50LWJlZ2luCiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdXNhZ2VgKSk7CiAgICAgICAgICAgIC8vIEVTTS11bmNvbW1lbnQtZW5kCiAgICAgICAgfQogICAgICAgIC8vIGZvcmVpZ24gbWV0aG9kIHJlcXVlc3QKICAgICAgICBmbXIobWV0aG9kLCBhcmdzKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fZm9yZWlnbk1vZHVsZSB8fCB0eXBlb2YgdGhpcy5fZm9yZWlnbk1vZHVsZVttZXRob2RdICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdNaXNzaW5nIHJlcXVlc3RIYW5kbGVyIG9yIG1ldGhvZDogJyArIG1ldGhvZCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2ZvcmVpZ25Nb2R1bGVbbWV0aG9kXS5hcHBseSh0aGlzLl9mb3JlaWduTW9kdWxlLCBhcmdzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIC0tLS0gRU5EIGRpZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIC0tLS0gQkVHSU4gbWluaW1hbCBlZGl0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVkaXRvclNpbXBsZVdvcmtlci5fZGlmZkxpbWl0ID0gMTAwMDAwOwogICAgLy8gLS0tLSBCRUdJTiBzdWdnZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFZGl0b3JTaW1wbGVXb3JrZXIuX3N1Z2dlc3Rpb25zTGltaXQgPSAxMDAwMDsKICAgIGlmICh0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIC8vIFJ1bm5pbmcgaW4gYSB3ZWIgd29ya2VyCiAgICAgICAgZ2xvYmFscy5tb25hY28gPSBjcmVhdGVNb25hY29CYXNlQVBJKCk7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBsZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgIGZ1bmN0aW9uIGluaXRpYWxpemUoZm9yZWlnbk1vZHVsZSkgewogICAgICAgIGlmIChpbml0aWFsaXplZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICBjb25zdCBzaW1wbGVXb3JrZXIgPSBuZXcgU2ltcGxlV29ya2VyU2VydmVyKChtc2cpID0+IHsKICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShtc2cpOwogICAgICAgIH0sIChob3N0KSA9PiBuZXcgRWRpdG9yU2ltcGxlV29ya2VyKGhvc3QsIGZvcmVpZ25Nb2R1bGUpKTsKICAgICAgICBzZWxmLm9ubWVzc2FnZSA9IChlKSA9PiB7CiAgICAgICAgICAgIHNpbXBsZVdvcmtlci5vbm1lc3NhZ2UoZS5kYXRhKTsKICAgICAgICB9OwogICAgfQogICAgc2VsZi5vbm1lc3NhZ2UgPSAoZSkgPT4gewogICAgICAgIC8vIElnbm9yZSBmaXJzdCBtZXNzYWdlIGluIHRoaXMgY2FzZSBhbmQgaW5pdGlhbGl6ZSBpZiBub3QgeWV0IGluaXRpYWxpemVkCiAgICAgICAgaWYgKCFpbml0aWFsaXplZCkgewogICAgICAgICAgICBpbml0aWFsaXplKG51bGwpOwogICAgICAgIH0KICAgIH07CgogICAgZXhwb3J0cy5pbml0aWFsaXplID0gaW5pdGlhbGl6ZTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIHJldHVybiBleHBvcnRzOwoKfSkoe30pOwoK', null, false);
|
|
31
|
+
var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2NsYXNzIHR7Y29uc3RydWN0b3IoKXt0aGlzLmxpc3RlbmVycz1bXSx0aGlzLnVuZXhwZWN0ZWRFcnJvckhhbmRsZXI9ZnVuY3Rpb24oZSl7c2V0VGltZW91dCgoKT0+e2lmKGUuc3RhY2spdGhyb3cgbmV3IEVycm9yKGUubWVzc2FnZSsiXG5cbiIrZS5zdGFjayk7dGhyb3cgZX0sMCl9fWFkZExpc3RlbmVyKGUpe3JldHVybiB0aGlzLmxpc3RlbmVycy5wdXNoKGUpLCgpPT57dGhpcy5fcmVtb3ZlTGlzdGVuZXIoZSl9fWVtaXQodCl7dGhpcy5saXN0ZW5lcnMuZm9yRWFjaChlPT57ZSh0KX0pfV9yZW1vdmVMaXN0ZW5lcihlKXt0aGlzLmxpc3RlbmVycy5zcGxpY2UodGhpcy5saXN0ZW5lcnMuaW5kZXhPZihlKSwxKX1zZXRVbmV4cGVjdGVkRXJyb3JIYW5kbGVyKGUpe3RoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcj1lfWdldFVuZXhwZWN0ZWRFcnJvckhhbmRsZXIoKXtyZXR1cm4gdGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyfW9uVW5leHBlY3RlZEVycm9yKGUpe3RoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcihlKSx0aGlzLmVtaXQoZSl9b25VbmV4cGVjdGVkRXh0ZXJuYWxFcnJvcihlKXt0aGlzLnVuZXhwZWN0ZWRFcnJvckhhbmRsZXIoZSl9fWNvbnN0IHI9bmV3IHQ7ZnVuY3Rpb24gaShlKXt2YXIgdDsodD1lKWluc3RhbmNlb2YgRXJyb3ImJnQubmFtZT09PXMmJnQubWVzc2FnZT09PXN8fHIub25VbmV4cGVjdGVkRXJyb3IoZSl9ZnVuY3Rpb24gbihlKXtpZihlIGluc3RhbmNlb2YgRXJyb3Ipe3ZhcntuYW1lOnQsbWVzc2FnZTpyfT1lO3JldHVybnskaXNFcnJvcjohMCxuYW1lOnQsbWVzc2FnZTpyLHN0YWNrOmUuc3RhY2t0cmFjZXx8ZS5zdGFja319cmV0dXJuIGV9Y29uc3Qgcz0iQ2FuY2VsZWQiO3ZhciBvOyFmdW5jdGlvbihzKXtzLmlzPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlW1N5bWJvbC5pdGVyYXRvcl19O2NvbnN0IHQ9T2JqZWN0LmZyZWV6ZShbXSk7cy5lbXB0eT1mdW5jdGlvbigpe3JldHVybiB0fSxzLnNpbmdsZT1mdW5jdGlvbiooZSl7eWllbGQgZX0scy5mcm9tPWZ1bmN0aW9uKGUpe3JldHVybiBlfHx0fSxzLmlzRW1wdHk9ZnVuY3Rpb24oZSl7cmV0dXJuIWV8fCEwPT09ZVtTeW1ib2wuaXRlcmF0b3JdKCkubmV4dCgpLmRvbmV9LHMuZmlyc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGVbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS52YWx1ZX0scy5zb21lPWZ1bmN0aW9uKGUsdCl7Zm9yKGNvbnN0IHIgb2YgZSlpZih0KHIpKXJldHVybiEwO3JldHVybiExfSxzLmZpbmQ9ZnVuY3Rpb24oZSx0KXtmb3IoY29uc3QgciBvZiBlKWlmKHQocikpcmV0dXJuIHJ9LHMuZmlsdGVyPWZ1bmN0aW9uKihlLHQpe2Zvcihjb25zdCByIG9mIGUpdChyKSYmKHlpZWxkIHIpfSxzLm1hcD1mdW5jdGlvbiooZSx0KXtsZXQgcj0wO2Zvcihjb25zdCBuIG9mIGUpeWllbGQgdChuLHIrKyl9LHMuY29uY2F0PWZ1bmN0aW9uKiguLi5lKXtmb3IoY29uc3QgdCBvZiBlKWZvcihjb25zdCByIG9mIHQpeWllbGQgcn0scy5jb25jYXROZXN0ZWQ9ZnVuY3Rpb24qKGUpe2Zvcihjb25zdCB0IG9mIGUpZm9yKGNvbnN0IHIgb2YgdCl5aWVsZCByfSxzLnJlZHVjZT1mdW5jdGlvbihlLHQscil7bGV0IG49cjtmb3IoY29uc3QgaSBvZiBlKW49dChuLGkpO3JldHVybiBufSxzLnNsaWNlPWZ1bmN0aW9uKihlLHQscj1lLmxlbmd0aCl7Zm9yKHQ8MCYmKHQrPWUubGVuZ3RoKSxyPDA/cis9ZS5sZW5ndGg6cj5lLmxlbmd0aCYmKHI9ZS5sZW5ndGgpO3Q8cjt0KyspeWllbGQgZVt0XX0scy5jb25zdW1lPWZ1bmN0aW9uKGUsdD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpe2NvbnN0IHI9W107aWYoMD09PXQpcmV0dXJuW3IsZV07Y29uc3Qgbj1lW1N5bWJvbC5pdGVyYXRvcl0oKTtmb3IobGV0IGU9MDtlPHQ7ZSsrKXt2YXIgaT1uLm5leHQoKTtpZihpLmRvbmUpcmV0dXJuW3Iscy5lbXB0eSgpXTtyLnB1c2goaS52YWx1ZSl9cmV0dXJuW3Ise1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIG59fV19LHMuZXF1YWxzPWZ1bmN0aW9uKGUsdCxyPShlLHQpPT5lPT09dCl7Y29uc3Qgbj1lW1N5bWJvbC5pdGVyYXRvcl0oKSxpPXRbU3ltYm9sLml0ZXJhdG9yXSgpO2Zvcig7Oyl7dmFyIHM9bi5uZXh0KCksbz1pLm5leHQoKTtpZihzLmRvbmUhPT1vLmRvbmUpcmV0dXJuITE7aWYocy5kb25lKXJldHVybiEwO2lmKCFyKHMudmFsdWUsby52YWx1ZSkpcmV0dXJuITF9fX0obz1vfHx7fSk7Y2xhc3MgYSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBFbmNvdW50ZXJlZCBlcnJvcnMgd2hpbGUgZGlzcG9zaW5nIG9mIHN0b3JlLiBFcnJvcnM6IFske2Uuam9pbigiLCAiKX1dYCksdGhpcy5lcnJvcnM9ZX19ZnVuY3Rpb24gaChlKXtpZihvLmlzKGUpKXtsZXQgdD1bXTtmb3IoY29uc3QgciBvZiBlKWlmKHIpdHJ5e3IuZGlzcG9zZSgpfWNhdGNoKGUpe3QucHVzaChlKX1pZigxPT09dC5sZW5ndGgpdGhyb3cgdFswXTtpZigxPHQubGVuZ3RoKXRocm93IG5ldyBhKHQpO3JldHVybiBBcnJheS5pc0FycmF5KGUpP1tdOmV9aWYoZSlyZXR1cm4gZS5kaXNwb3NlKCksZX1mdW5jdGlvbiBkKGUpe3JldHVybntkaXNwb3NlOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpcztsZXQgcj0hMSxuO3JldHVybiBmdW5jdGlvbigpe3JldHVybiByfHwocj0hMCxuPWUuYXBwbHkodCxhcmd1bWVudHMpKSxufX0oKCk9PntlKCl9KX19Y2xhc3MgbHtjb25zdHJ1Y3Rvcigpe3RoaXMuX3RvRGlzcG9zZT1uZXcgU2V0LHRoaXMuX2lzRGlzcG9zZWQ9ITF9ZGlzcG9zZSgpe3RoaXMuX2lzRGlzcG9zZWR8fCh0aGlzLl9pc0Rpc3Bvc2VkPSEwLHRoaXMuY2xlYXIoKSl9Y2xlYXIoKXt0cnl7aCh0aGlzLl90b0Rpc3Bvc2UudmFsdWVzKCkpfWZpbmFsbHl7dGhpcy5fdG9EaXNwb3NlLmNsZWFyKCl9fWFkZChlKXtpZighZSlyZXR1cm4gZTtpZihlPT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWdpc3RlciBhIGRpc3Bvc2FibGUgb24gaXRzZWxmISIpO3JldHVybiB0aGlzLl9pc0Rpc3Bvc2VkP2wuRElTQUJMRV9ESVNQT1NFRF9XQVJOSU5HfHxjb25zb2xlLndhcm4obmV3IEVycm9yKCJUcnlpbmcgdG8gYWRkIGEgZGlzcG9zYWJsZSB0byBhIERpc3Bvc2FibGVTdG9yZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb2YuIFRoZSBhZGRlZCBvYmplY3Qgd2lsbCBiZSBsZWFrZWQhIikuc3RhY2spOnRoaXMuX3RvRGlzcG9zZS5hZGQoZSksZX19bC5ESVNBQkxFX0RJU1BPU0VEX1dBUk5JTkc9ITE7Y2xhc3MgY3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3N0b3JlPW5ldyBsLHRoaXMuX3N0b3JlfWRpc3Bvc2UoKXt0aGlzLl9zdG9yZS5kaXNwb3NlKCl9X3JlZ2lzdGVyKGUpe2lmKGU9PT10aGlzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhIik7cmV0dXJuIHRoaXMuX3N0b3JlLmFkZChlKX19Yy5Ob25lPU9iamVjdC5mcmVlemUoe2Rpc3Bvc2UoKXt9fSk7Y2xhc3MgdXtjb25zdHJ1Y3RvcihlKXt0aGlzLmVsZW1lbnQ9ZSx0aGlzLm5leHQ9dS5VbmRlZmluZWQsdGhpcy5wcmV2PXUuVW5kZWZpbmVkfX11LlVuZGVmaW5lZD1uZXcgdSh2b2lkIDApO2NsYXNzIG17Y29uc3RydWN0b3IoKXt0aGlzLl9maXJzdD11LlVuZGVmaW5lZCx0aGlzLl9sYXN0PXUuVW5kZWZpbmVkLHRoaXMuX3NpemU9MH1nZXQgc2l6ZSgpe3JldHVybiB0aGlzLl9zaXplfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5fZmlyc3Q9PT11LlVuZGVmaW5lZH1jbGVhcigpe2xldCBlPXRoaXMuX2ZpcnN0O2Zvcig7ZSE9PXUuVW5kZWZpbmVkOyl7dmFyIHQ9ZS5uZXh0O2UucHJldj11LlVuZGVmaW5lZCxlLm5leHQ9dS5VbmRlZmluZWQsZT10fXRoaXMuX2ZpcnN0PXUuVW5kZWZpbmVkLHRoaXMuX2xhc3Q9dS5VbmRlZmluZWQsdGhpcy5fc2l6ZT0wfXVuc2hpZnQoZSl7cmV0dXJuIHRoaXMuX2luc2VydChlLCExKX1wdXNoKGUpe3JldHVybiB0aGlzLl9pbnNlcnQoZSwhMCl9X2luc2VydChlLHQpe2NvbnN0IHI9bmV3IHUoZSk7aWYodGhpcy5fZmlyc3Q9PT11LlVuZGVmaW5lZCl0aGlzLl9maXJzdD1yLHRoaXMuX2xhc3Q9cjtlbHNlIGlmKHQpe2NvbnN0IGk9dGhpcy5fbGFzdDt0aGlzLl9sYXN0PXIsci5wcmV2PWksaS5uZXh0PXJ9ZWxzZXtjb25zdCBzPXRoaXMuX2ZpcnN0O3RoaXMuX2ZpcnN0PXIsci5uZXh0PXMscy5wcmV2PXJ9dGhpcy5fc2l6ZSs9MTtsZXQgbj0hMTtyZXR1cm4oKT0+e258fChuPSEwLHRoaXMuX3JlbW92ZShyKSl9fXNoaWZ0KCl7aWYodGhpcy5fZmlyc3QhPT11LlVuZGVmaW5lZCl7dmFyIGU9dGhpcy5fZmlyc3QuZWxlbWVudDtyZXR1cm4gdGhpcy5fcmVtb3ZlKHRoaXMuX2ZpcnN0KSxlfX1wb3AoKXtpZih0aGlzLl9sYXN0IT09dS5VbmRlZmluZWQpe3ZhciBlPXRoaXMuX2xhc3QuZWxlbWVudDtyZXR1cm4gdGhpcy5fcmVtb3ZlKHRoaXMuX2xhc3QpLGV9fV9yZW1vdmUoZSl7aWYoZS5wcmV2IT09dS5VbmRlZmluZWQmJmUubmV4dCE9PXUuVW5kZWZpbmVkKXtjb25zdCB0PWUucHJldjt0Lm5leHQ9ZS5uZXh0LGUubmV4dC5wcmV2PXR9ZWxzZSBlLnByZXY9PT11LlVuZGVmaW5lZCYmZS5uZXh0PT09dS5VbmRlZmluZWQ/KHRoaXMuX2ZpcnN0PXUuVW5kZWZpbmVkLHRoaXMuX2xhc3Q9dS5VbmRlZmluZWQpOmUubmV4dD09PXUuVW5kZWZpbmVkPyh0aGlzLl9sYXN0PXRoaXMuX2xhc3QucHJldix0aGlzLl9sYXN0Lm5leHQ9dS5VbmRlZmluZWQpOmUucHJldj09PXUuVW5kZWZpbmVkJiYodGhpcy5fZmlyc3Q9dGhpcy5fZmlyc3QubmV4dCx0aGlzLl9maXJzdC5wcmV2PXUuVW5kZWZpbmVkKTstLXRoaXMuX3NpemV9KltTeW1ib2wuaXRlcmF0b3JdKCl7bGV0IGU9dGhpcy5fZmlyc3Q7Zm9yKDtlIT09dS5VbmRlZmluZWQ7KXlpZWxkIGUuZWxlbWVudCxlPWUubmV4dH19dmFyIGY9ImVuIjtsZXQgZz0hMSxfPSExLHA9ITEsQz12b2lkIDAsYj1mO2xldCB2PXZvaWQgMDtjb25zdCBMPSJvYmplY3QiPT10eXBlb2Ygc2VsZj9zZWxmOiJvYmplY3QiPT10eXBlb2YgZ2xvYmFsP2dsb2JhbDp7fTtsZXQgdz12b2lkIDA7dm9pZCAwIT09TC52c2NvZGUmJnZvaWQgMCE9PUwudnNjb2RlLnByb2Nlc3M/dz1MLnZzY29kZS5wcm9jZXNzOiJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmKHc9cHJvY2Vzcyk7dmFyIE49InN0cmluZyI9PXR5cGVvZihudWxsPT09KE49bnVsbD09PXd8fHZvaWQgMD09PXc/dm9pZCAwOncudmVyc2lvbnMpfHx2b2lkIDA9PT1OP3ZvaWQgMDpOLmVsZWN0cm9uKSYmInJlbmRlcmVyIj09PShudWxsPT09d3x8dm9pZCAwPT09dz92b2lkIDA6dy50eXBlKTtpZigib2JqZWN0IiE9dHlwZW9mIG5hdmlnYXRvcnx8TilpZigib2JqZWN0Ij09dHlwZW9mIHcpe2c9IndpbjMyIj09PXcucGxhdGZvcm0sXz0iZGFyd2luIj09PXcucGxhdGZvcm0scD0ibGludXgiPT09dy5wbGF0Zm9ybSxwJiZ3LmVudi5TTkFQJiZ3LmVudi5TTkFQX1JFVklTSU9OLEM9ZixiPWY7Tj13LmVudi5WU0NPREVfTkxTX0NPTkZJRztpZihOKXRyeXt2YXIgUz1KU09OLnBhcnNlKE4pLHk9Uy5hdmFpbGFibGVMYW5ndWFnZXNbIioiXTtDPVMubG9jYWxlLGI9eXx8ZixTLl90cmFuc2xhdGlvbnNDb25maWdGaWxlfWNhdGNoKGUpe319ZWxzZSBjb25zb2xlLmVycm9yKCJVbmFibGUgdG8gcmVzb2x2ZSBwbGF0Zm9ybS4iKTtlbHNlIHY9bmF2aWdhdG9yLnVzZXJBZ2VudCxnPTA8PXYuaW5kZXhPZigiV2luZG93cyIpLF89MDw9di5pbmRleE9mKCJNYWNpbnRvc2giKSwoMDw9di5pbmRleE9mKCJNYWNpbnRvc2giKXx8MDw9di5pbmRleE9mKCJpUGFkIil8fDA8PXYuaW5kZXhPZigiaVBob25lIikpJiZuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMmJm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyxwPTA8PXYuaW5kZXhPZigiTGludXgiKSxDPW5hdmlnYXRvci5sYW5ndWFnZSxiPUM7Y29uc3QgRT1nLEE9XyxNPWIseD1DLEs9KCgpPT57aWYoImZ1bmN0aW9uIiE9dHlwZW9mIEwucG9zdE1lc3NhZ2V8fEwuaW1wb3J0U2NyaXB0cylyZXR1cm4gZT0+c2V0VGltZW91dChlKTt7bGV0IGk9W107TC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyPT57aWYoci5kYXRhJiZyLmRhdGEudnNjb2RlU2NoZWR1bGVBc3luY1dvcmspZm9yKGxldCBlPTAsdD1pLmxlbmd0aDtlPHQ7ZSsrKXtjb25zdCBuPWlbZV07aWYobi5pZD09PXIuZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yaylyZXR1cm4gaS5zcGxpY2UoZSwxKSx2b2lkIG4uY2FsbGJhY2soKX19KTtsZXQgcj0wO3JldHVybiBlPT57dmFyIHQ9KytyO2kucHVzaCh7aWQ6dCxjYWxsYmFjazplfSksTC5wb3N0TWVzc2FnZSh7dnNjb2RlU2NoZWR1bGVBc3luY1dvcms6dH0sIioiKX19fSkoKTshZnVuY3Rpb24oKXtpZihMLnNldEltbWVkaWF0ZSlyZXR1cm4gTC5zZXRJbW1lZGlhdGUuYmluZChMKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgTC5wb3N0TWVzc2FnZSYmIUwuaW1wb3J0U2NyaXB0cylyZXR1cm4gSztpZigiZnVuY3Rpb24iPT10eXBlb2YobnVsbD09PXd8fHZvaWQgMD09PXc/dm9pZCAwOncubmV4dFRpY2spKXJldHVybiB3Lm5leHRUaWNrLmJpbmQodyk7UHJvbWlzZS5yZXNvbHZlKCl9KCk7Y29uc3QgVj1MLnBlcmZvcm1hbmNlJiYiZnVuY3Rpb24iPT10eXBlb2YgTC5wZXJmb3JtYW5jZS5ub3c7Y2xhc3MgSXtjb25zdHJ1Y3RvcihlKXt0aGlzLl9oaWdoUmVzb2x1dGlvbj1WJiZlLHRoaXMuX3N0YXJ0VGltZT10aGlzLl9ub3coKSx0aGlzLl9zdG9wVGltZT0tMX1zdGF0aWMgY3JlYXRlKGU9ITApe3JldHVybiBuZXcgSShlKX1zdG9wKCl7dGhpcy5fc3RvcFRpbWU9dGhpcy5fbm93KCl9ZWxhcHNlZCgpe3JldHVybi0xIT09dGhpcy5fc3RvcFRpbWU/dGhpcy5fc3RvcFRpbWUtdGhpcy5fc3RhcnRUaW1lOnRoaXMuX25vdygpLXRoaXMuX3N0YXJ0VGltZX1fbm93KCl7cmV0dXJuKHRoaXMuX2hpZ2hSZXNvbHV0aW9uP0wucGVyZm9ybWFuY2U6RGF0ZSkubm93KCl9fSFmdW5jdGlvbihyKXtmdW5jdGlvbiBuKHMpe3JldHVybih0LHI9bnVsbCxlKT0+e2xldCBuPSExLGk7cmV0dXJuIGk9cyhlPT57aWYoIW4pcmV0dXJuIGk/aS5kaXNwb3NlKCk6bj0hMCx0LmNhbGwocixlKX0sbnVsbCxlKSxuJiZpLmRpc3Bvc2UoKSxpfX1mdW5jdGlvbiBpKG4saSl7cmV0dXJuIGUoKHQscj1udWxsLGUpPT5uKGU9PnQuY2FsbChyLGkoZSkpLG51bGwsZSkpfWZ1bmN0aW9uIHQobixpKXtyZXR1cm4gZSgodCxyPW51bGwsZSk9Pm4oZT0+e2koZSksdC5jYWxsKHIsZSl9LG51bGwsZSkpfWZ1bmN0aW9uIHMobixpKXtyZXR1cm4gZSgodCxyPW51bGwsZSk9Pm4oZT0+aShlKSYmdC5jYWxsKHIsZSksbnVsbCxlKSl9ZnVuY3Rpb24gbyhlLHQscil7bGV0IG49cjtyZXR1cm4gaShlLGU9PihuPXQobixlKSxuKSl9ZnVuY3Rpb24gZShlKXtsZXQgdDtjb25zdCByPW5ldyBSKHtvbkZpcnN0TGlzdGVuZXJBZGQoKXt0PWUoci5maXJlLHIpfSxvbkxhc3RMaXN0ZW5lclJlbW92ZSgpe3QuZGlzcG9zZSgpfX0pO3JldHVybiByLmV2ZW50fWZ1bmN0aW9uIGEoZSx0LHI9MTAwLG49ITEsaSl7bGV0IHMsbz12b2lkIDAsYT12b2lkIDAsbD0wO2NvbnN0IHU9bmV3IFIoe2xlYWtXYXJuaW5nVGhyZXNob2xkOmksb25GaXJzdExpc3RlbmVyQWRkKCl7cz1lKGU9PntsKyssbz10KG8sZSksbiYmIWEmJih1LmZpcmUobyksbz12b2lkIDApLGNsZWFyVGltZW91dChhKSxhPXNldFRpbWVvdXQoKCk9Pnt2YXIgZT1vO289dm9pZCAwLGE9dm9pZCAwLCghbnx8MTxsKSYmdS5maXJlKGUpLGw9MH0scil9KX0sb25MYXN0TGlzdGVuZXJSZW1vdmUoKXtzLmRpc3Bvc2UoKX19KTtyZXR1cm4gdS5ldmVudH1mdW5jdGlvbiBsKGUscj0oZSx0KT0+ZT09PXQpe2xldCBuPSEwLGk7cmV0dXJuIHMoZSxlPT57dmFyIHQ9bnx8IXIoZSxpKTtyZXR1cm4gbj0hMSxpPWUsdH0pfXIuTm9uZT0oKT0+Yy5Ob25lLHIub25jZT1uLHIubWFwPWksci5mb3JFYWNoPXQsci5maWx0ZXI9cyxyLnNpZ25hbD1mdW5jdGlvbihlKXtyZXR1cm4gZX0sci5hbnk9ZnVuY3Rpb24oLi4uZSl7cmV0dXJuKHQscj1udWxsLG4pPT5mdW5jdGlvbiguLi5lKXtyZXR1cm4gZCgoKT0+aChlKSl9KC4uLmUubWFwKGU9PmUoZT0+dC5jYWxsKHIsZSksbnVsbCxuKSkpfSxyLnJlZHVjZT1vLHIuZGVib3VuY2U9YSxyLmxhdGNoPWwsci5zcGxpdD1mdW5jdGlvbihlLHQpe3JldHVybltyLmZpbHRlcihlLHQpLHIuZmlsdGVyKGUsZT0+IXQoZSkpXX0sci5idWZmZXI9ZnVuY3Rpb24oZSx0PSExLHI9W10pe2xldCBuPXIuc2xpY2UoKSxpPWUoZT0+e24/bi5wdXNoKGUpOm8uZmlyZShlKX0pO2NvbnN0IHM9KCk9PntuJiZuLmZvckVhY2goZT0+by5maXJlKGUpKSxuPW51bGx9LG89bmV3IFIoe29uRmlyc3RMaXN0ZW5lckFkZCgpe2k9aXx8ZShlPT5vLmZpcmUoZSkpfSxvbkZpcnN0TGlzdGVuZXJEaWRBZGQoKXtuJiYodD9zZXRUaW1lb3V0KHMpOnMoKSl9LG9uTGFzdExpc3RlbmVyUmVtb3ZlKCl7aSYmaS5kaXNwb3NlKCksaT1udWxsfX0pO3JldHVybiBvLmV2ZW50fTtjbGFzcyB1e2NvbnN0cnVjdG9yKGUpe3RoaXMuZXZlbnQ9ZX1tYXAoZSl7cmV0dXJuIG5ldyB1KGkodGhpcy5ldmVudCxlKSl9Zm9yRWFjaChlKXtyZXR1cm4gbmV3IHUodCh0aGlzLmV2ZW50LGUpKX1maWx0ZXIoZSl7cmV0dXJuIG5ldyB1KHModGhpcy5ldmVudCxlKSl9cmVkdWNlKGUsdCl7cmV0dXJuIG5ldyB1KG8odGhpcy5ldmVudCxlLHQpKX1sYXRjaCgpe3JldHVybiBuZXcgdShsKHRoaXMuZXZlbnQpKX1kZWJvdW5jZShlLHQ9MTAwLHI9ITEsbil7cmV0dXJuIG5ldyB1KGEodGhpcy5ldmVudCxlLHQscixuKSl9b24oZSx0LHIpe3JldHVybiB0aGlzLmV2ZW50KGUsdCxyKX1vbmNlKGUsdCxyKXtyZXR1cm4gbih0aGlzLmV2ZW50KShlLHQscil9fXIuY2hhaW49ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB1KGUpfSxyLmZyb21Ob2RlRXZlbnRFbWl0dGVyPWZ1bmN0aW9uKGUsdCxyPWU9PmUpe2NvbnN0IG49KC4uLmUpPT5pLmZpcmUociguLi5lKSksaT1uZXcgUih7b25GaXJzdExpc3RlbmVyQWRkOigpPT5lLm9uKHQsbiksb25MYXN0TGlzdGVuZXJSZW1vdmU6KCk9PmUucmVtb3ZlTGlzdGVuZXIodCxuKX0pO3JldHVybiBpLmV2ZW50fSxyLmZyb21ET01FdmVudEVtaXR0ZXI9ZnVuY3Rpb24oZSx0LHI9ZT0+ZSl7Y29uc3Qgbj0oLi4uZSk9PmkuZmlyZShyKC4uLmUpKSxpPW5ldyBSKHtvbkZpcnN0TGlzdGVuZXJBZGQ6KCk9PmUuYWRkRXZlbnRMaXN0ZW5lcih0LG4pLG9uTGFzdExpc3RlbmVyUmVtb3ZlOigpPT5lLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0pO3JldHVybiBpLmV2ZW50fSxyLnRvUHJvbWlzZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFByb21pc2UoZT0+bih0KShlKSl9fShIdD1IdHx8e30pO2NsYXNzIFB7Y29uc3RydWN0b3IoZSl7dGhpcy5fbGlzdGVuZXJDb3VudD0wLHRoaXMuX2ludm9jYXRpb25Db3VudD0wLHRoaXMuX2VsYXBzZWRPdmVyYWxsPTAsdGhpcy5fbmFtZT1lKyJfIitQLl9pZFBvb2wrK31zdGFydChlKXt0aGlzLl9zdG9wV2F0Y2g9bmV3IEkoITApLHRoaXMuX2xpc3RlbmVyQ291bnQ9ZX1zdG9wKCl7aWYodGhpcy5fc3RvcFdhdGNoKXtjb25zdCBlPXRoaXMuX3N0b3BXYXRjaC5lbGFwc2VkKCk7dGhpcy5fZWxhcHNlZE92ZXJhbGwrPWUsdGhpcy5faW52b2NhdGlvbkNvdW50Kz0xLGNvbnNvbGUuaW5mbyhgZGlkIEZJUkUgJHt0aGlzLl9uYW1lfTogZWxhcHNlZF9tczogJHtlLnRvRml4ZWQoNSl9LCBsaXN0ZW5lcjogJHt0aGlzLl9saXN0ZW5lckNvdW50fSAoZWxhcHNlZF9vdmVyYWxsOiAke3RoaXMuX2VsYXBzZWRPdmVyYWxsLnRvRml4ZWQoMil9LCBpbnZvY2F0aW9uczogJHt0aGlzLl9pbnZvY2F0aW9uQ291bnR9KWApLHRoaXMuX3N0b3BXYXRjaD12b2lkIDB9fX1QLl9pZFBvb2w9MDtjbGFzcyBSe2NvbnN0cnVjdG9yKGUpe3RoaXMuX2Rpc3Bvc2VkPSExLHRoaXMuX29wdGlvbnM9ZSx0aGlzLl9sZWFrYWdlTW9uPXZvaWQgMCx0aGlzLl9wZXJmTW9uPW51bGwhPT0oZT10aGlzLl9vcHRpb25zKSYmdm9pZCAwIT09ZSYmZS5fcHJvZk5hbWU/bmV3IFAodGhpcy5fb3B0aW9ucy5fcHJvZk5hbWUpOnZvaWQgMH1nZXQgZXZlbnQoKXtyZXR1cm4gdGhpcy5fZXZlbnR8fCh0aGlzLl9ldmVudD0oZSx0LHIpPT57dGhpcy5fbGlzdGVuZXJzfHwodGhpcy5fbGlzdGVuZXJzPW5ldyBtKTt2YXIgbj10aGlzLl9saXN0ZW5lcnMuaXNFbXB0eSgpO24mJnRoaXMuX29wdGlvbnMmJnRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkJiZ0aGlzLl9vcHRpb25zLm9uRmlyc3RMaXN0ZW5lckFkZCh0aGlzKTtjb25zdCBpPXRoaXMuX2xpc3RlbmVycy5wdXNoKHQ/W2UsdF06ZSk7biYmdGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJEaWRBZGQmJnRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyRGlkQWRkKHRoaXMpLHRoaXMuX29wdGlvbnMmJnRoaXMuX29wdGlvbnMub25MaXN0ZW5lckRpZEFkZCYmdGhpcy5fb3B0aW9ucy5vbkxpc3RlbmVyRGlkQWRkKHRoaXMsZSx0KTtjb25zdCBzPW51bGw9PT0odD10aGlzLl9sZWFrYWdlTW9uKXx8dm9pZCAwPT09dD92b2lkIDA6dC5jaGVjayh0aGlzLl9saXN0ZW5lcnMuc2l6ZSk7dD1kKCgpPT57cyYmcygpLHRoaXMuX2Rpc3Bvc2VkfHwoaSgpLHRoaXMuX29wdGlvbnMmJnRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUmJih0aGlzLl9saXN0ZW5lcnMmJiF0aGlzLl9saXN0ZW5lcnMuaXNFbXB0eSgpfHx0aGlzLl9vcHRpb25zLm9uTGFzdExpc3RlbmVyUmVtb3ZlKHRoaXMpKSl9KTtyZXR1cm4gciBpbnN0YW5jZW9mIGw/ci5hZGQodCk6QXJyYXkuaXNBcnJheShyKSYmci5wdXNoKHQpLHR9KSx0aGlzLl9ldmVudH1maXJlKGUpe3ZhciB0O2lmKHRoaXMuX2xpc3RlbmVycyl7dGhpcy5fZGVsaXZlcnlRdWV1ZXx8KHRoaXMuX2RlbGl2ZXJ5UXVldWU9bmV3IG0pO2Zvcih2YXIgciBvZiB0aGlzLl9saXN0ZW5lcnMpdGhpcy5fZGVsaXZlcnlRdWV1ZS5wdXNoKFtyLGVdKTtmb3IobnVsbCE9PSh0PXRoaXMuX3BlcmZNb24pJiZ2b2lkIDAhPT10JiZ0LnN0YXJ0KHRoaXMuX2RlbGl2ZXJ5UXVldWUuc2l6ZSk7MDx0aGlzLl9kZWxpdmVyeVF1ZXVlLnNpemU7KXtjb25zdFtuLGVdPXRoaXMuX2RlbGl2ZXJ5UXVldWUuc2hpZnQoKTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKHZvaWQgMCxlKTpuWzBdLmNhbGwoblsxXSxlKX1jYXRjaChlKXtpKGUpfX1udWxsIT09KHQ9dGhpcy5fcGVyZk1vbikmJnZvaWQgMCE9PXQmJnQuc3RvcCgpfX1kaXNwb3NlKCl7dmFyIGUsdDt0aGlzLl9kaXNwb3NlZHx8KHRoaXMuX2Rpc3Bvc2VkPSEwLG51bGwhPT0odD10aGlzLl9saXN0ZW5lcnMpJiZ2b2lkIDAhPT10JiZ0LmNsZWFyKCksbnVsbCE9PShlPXRoaXMuX2RlbGl2ZXJ5UXVldWUpJiZ2b2lkIDAhPT1lJiZlLmNsZWFyKCksbnVsbCE9PShlPW51bGw9PT0odD10aGlzLl9vcHRpb25zKXx8dm9pZCAwPT09dD92b2lkIDA6dC5vbkxhc3RMaXN0ZW5lclJlbW92ZSkmJnZvaWQgMCE9PWUmJmUuY2FsbCh0KSxudWxsIT09KHQ9dGhpcy5fbGVha2FnZU1vbikmJnZvaWQgMCE9PXQmJnQuZGlzcG9zZSgpKX19ZnVuY3Rpb24gayhlKXtjb25zdCB0PVtdO2Zvcihjb25zdCByIG9mIGZ1bmN0aW9uKGUpe2xldCB0PVtdLHI9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO2Zvcig7T2JqZWN0LnByb3RvdHlwZSE9PXI7KXQ9dC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocikpLHI9T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpO3JldHVybiB0fShlKSkiZnVuY3Rpb24iPT10eXBlb2YgZVtyXSYmdC5wdXNoKHIpO3JldHVybiB0fWZ1bmN0aW9uIEQoZSxyKXtsZXQgdD17fTtmb3IoY29uc3QgbiBvZiBlKXRbbl09KHQ9PmZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiByKHQsZSl9KShuKTtyZXR1cm4gdH1mdW5jdGlvbiBPKHIsbixpPTAscz1yLmxlbmd0aCxvPTAsYT1uLmxlbmd0aCl7Zm9yKDtpPHMmJm88YTtpKyssbysrKXtsZXQgZT1yLmNoYXJDb2RlQXQoaSksdD1uLmNoYXJDb2RlQXQobyk7aWYoZSE9PXQpe2lmKDEyODw9ZXx8MTI4PD10KXJldHVybiBmdW5jdGlvbihlLHQscj0wLG49ZS5sZW5ndGgsaT0wLHM9dC5sZW5ndGgpe2Zvcig7cjxuJiZpPHM7cisrLGkrKyl7dmFyIG89ZS5jaGFyQ29kZUF0KHIpLGE9dC5jaGFyQ29kZUF0KGkpO2lmKG88YSlyZXR1cm4tMTtpZihhPG8pcmV0dXJuIDF9dmFyIGw9bi1yLHU9cy1pO3JldHVybiBsPHU/LTE6dTxsPzE6MH0oci50b0xvd2VyQ2FzZSgpLG4udG9Mb3dlckNhc2UoKSxpLHMsbyxhKTtUKGUpJiYoZS09MzIpLFQodCkmJih0LT0zMik7dmFyIGw9ZS10O2lmKDAhPWwpcmV0dXJuIGx9fXZhciBlPXMtaSx0PWEtbztyZXR1cm4gZTx0Py0xOnQ8ZT8xOjB9ZnVuY3Rpb24gVChlKXtyZXR1cm4gOTc8PWUmJmU8PTEyMn1mdW5jdGlvbiBGKGUpe3JldHVybiA2NTw9ZSYmZTw9OTB9ZnVuY3Rpb24gVShlKXtyZXR1cm4gNTUyOTY8PWUmJmU8PTU2MzE5fWNsYXNzIEJ7c3RhdGljIGdldERhdGEoKXtyZXR1cm4gSlNPTi5wYXJzZSgneyJfY29tbW9uIjpbODIzMiwzMiw4MjMzLDMyLDU3NjAsMzIsODE5MiwzMiw4MTkzLDMyLDgxOTQsMzIsODE5NSwzMiw4MTk2LDMyLDgxOTcsMzIsODE5OCwzMiw4MjAwLDMyLDgyMDEsMzIsODIwMiwzMiw4Mjg3LDMyLDgxOTksMzIsODIzOSwzMiwyMDQyLDk1LDY1MTAxLDk1LDY1MTAyLDk1LDY1MTAzLDk1LDgyMDgsNDUsODIwOSw0NSw4MjEwLDQ1LDY1MTEyLDQ1LDE3NDgsNDUsODI1OSw0NSw3MjcsNDUsODcyMiw0NSwxMDEzNCw0NSwxMTQ1MCw0NSwxNTQ5LDQ0LDE2NDMsNDQsODIxOCw0NCwxODQsNDQsNDIyMzMsNDQsODk0LDU5LDIzMDcsNTgsMjY5MSw1OCwxNDE3LDU4LDE3OTUsNTgsMTc5Niw1OCw1ODY4LDU4LDY1MDcyLDU4LDYxNDcsNTgsNjE1Myw1OCw4MjgyLDU4LDE0NzUsNTgsNzYwLDU4LDQyODg5LDU4LDg3NTgsNTgsNzIwLDU4LDQyMjM3LDU4LDQ1MSwzMywxMTYwMSwzMyw2NjAsNjMsNTc3LDYzLDI0MjksNjMsNTAzOCw2Myw0MjczMSw2MywxMTkxNDksNDYsODIyOCw0NiwxNzkzLDQ2LDE3OTQsNDYsNDI1MTAsNDYsNjgxNzYsNDYsMTYzMiw0NiwxNzc2LDQ2LDQyMjMyLDQ2LDEzNzMsOTYsNjUyODcsOTYsODIxOSw5Niw4MjQyLDk2LDEzNzAsOTYsMTUyMyw5Niw4MTc1LDk2LDY1MzQ0LDk2LDkwMCw5Niw4MTg5LDk2LDgxMjUsOTYsODEyNyw5Niw4MTkwLDk2LDY5Nyw5Niw4ODQsOTYsNzEyLDk2LDcxNCw5Niw3MTUsOTYsNzU2LDk2LDY5OSw5Niw3MDEsOTYsNzAwLDk2LDcwMiw5Niw0Mjg5Miw5NiwxNDk3LDk2LDIwMzYsOTYsMjAzNyw5Niw1MTk0LDk2LDU4MzYsOTYsOTQwMzMsOTYsOTQwMzQsOTYsNjUzMzksNDAsMTAwODgsNDAsMTAwOTgsNDAsMTIzMDgsNDAsNjQ4MzAsNDAsNjUzNDEsNDEsMTAwODksNDEsMTAwOTksNDEsMTIzMDksNDEsNjQ4MzEsNDEsMTAxMDAsMTIzLDExOTA2MCwxMjMsMTAxMDEsMTI1LDgyNzAsNDIsMTY0NSw0Miw4NzI3LDQyLDY2MzM1LDQyLDU5NDEsNDcsODI1Nyw0Nyw4NzI1LDQ3LDgyNjAsNDcsOTU4NSw0NywxMDE4Nyw0NywxMDc0NCw0NywxMTkzNTQsNDcsMTI3NTUsNDcsMTIzMzksNDcsMTE0NjIsNDcsMjAwMzEsNDcsMTIwMzUsNDcsNjUzNDAsOTIsNjUxMjgsOTIsODcyNiw5MiwxMDE4OSw5MiwxMDc0MSw5MiwxMDc0NSw5MiwxMTkzMTEsOTIsMTE5MzU1LDkyLDEyNzU2LDkyLDIwMDIyLDkyLDEyMDM0LDkyLDQyODcyLDM4LDcwOCw5NCw3MTAsOTQsNTg2OSw0MywxMDEzMyw0Myw2NjIwMyw0Myw4MjQ5LDYwLDEwMDk0LDYwLDcwNiw2MCwxMTkzNTAsNjAsNTE3Niw2MCw1ODEwLDYwLDUxMjAsNjEsMTE4NDAsNjEsMTI0NDgsNjEsNDIyMzksNjEsODI1MCw2MiwxMDA5NSw2Miw3MDcsNjIsMTE5MzUxLDYyLDUxNzEsNjIsOTQwMTUsNjIsODI3NSwxMjYsNzMyLDEyNiw4MTI4LDEyNiw4NzY0LDEyNiwxMjA3ODQsNTAsMTIwNzk0LDUwLDEyMDgwNCw1MCwxMjA4MTQsNTAsMTIwODI0LDUwLDEzMDAzNCw1MCw0Mjg0Miw1MCw0MjMsNTAsMTAwMCw1MCw0MjU2NCw1MCw1MzExLDUwLDQyNzM1LDUwLDExOTMwMiw1MSwxMjA3ODUsNTEsMTIwNzk1LDUxLDEyMDgwNSw1MSwxMjA4MTUsNTEsMTIwODI1LDUxLDEzMDAzNSw1MSw0MjkyMyw1MSw1NDAsNTEsNDM5LDUxLDQyODU4LDUxLDExNDY4LDUxLDEyNDgsNTEsOTQwMTEsNTEsNzE4ODIsNTEsMTIwNzg2LDUyLDEyMDc5Niw1MiwxMjA4MDYsNTIsMTIwODE2LDUyLDEyMDgyNiw1MiwxMzAwMzYsNTIsNTA3MCw1Miw3MTg1NSw1MiwxMjA3ODcsNTMsMTIwNzk3LDUzLDEyMDgwNyw1MywxMjA4MTcsNTMsMTIwODI3LDUzLDEzMDAzNyw1Myw0NDQsNTMsNzE4NjcsNTMsMTIwNzg4LDU0LDEyMDc5OCw1NCwxMjA4MDgsNTQsMTIwODE4LDU0LDEyMDgyOCw1NCwxMzAwMzgsNTQsMTE0NzQsNTQsNTEwMiw1NCw3MTg5Myw1NCwxMTkzMTQsNTUsMTIwNzg5LDU1LDEyMDc5OSw1NSwxMjA4MDksNTUsMTIwODE5LDU1LDEyMDgyOSw1NSwxMzAwMzksNTUsNjY3NzAsNTUsNzE4NzgsNTUsMjgxOSw1NiwyNTM4LDU2LDI2NjYsNTYsMTI1MTMxLDU2LDEyMDc5MCw1NiwxMjA4MDAsNTYsMTIwODEwLDU2LDEyMDgyMCw1NiwxMjA4MzAsNTYsMTMwMDQwLDU2LDU0Nyw1Niw1NDYsNTYsNjYzMzAsNTYsMjY2Myw1NywyOTIwLDU3LDI1NDEsNTcsMzQzNyw1NywxMjA3OTEsNTcsMTIwODAxLDU3LDEyMDgxMSw1NywxMjA4MjEsNTcsMTIwODMxLDU3LDEzMDA0MSw1Nyw0Mjg2Miw1NywxMTQ2Niw1Nyw3MTg4NCw1Nyw3MTg1Miw1Nyw3MTg5NCw1Nyw5MDgyLDk3LDY1MzQ1LDk3LDExOTgzNCw5NywxMTk4ODYsOTcsMTE5OTM4LDk3LDExOTk5MCw5NywxMjAwNDIsOTcsMTIwMDk0LDk3LDEyMDE0Niw5NywxMjAxOTgsOTcsMTIwMjUwLDk3LDEyMDMwMiw5NywxMjAzNTQsOTcsMTIwNDA2LDk3LDEyMDQ1OCw5Nyw1OTMsOTcsOTQ1LDk3LDEyMDUxNCw5NywxMjA1NzIsOTcsMTIwNjMwLDk3LDEyMDY4OCw5NywxMjA3NDYsOTcsNjUzMTMsNjUsMTE5ODA4LDY1LDExOTg2MCw2NSwxMTk5MTIsNjUsMTE5OTY0LDY1LDEyMDAxNiw2NSwxMjAwNjgsNjUsMTIwMTIwLDY1LDEyMDE3Miw2NSwxMjAyMjQsNjUsMTIwMjc2LDY1LDEyMDMyOCw2NSwxMjAzODAsNjUsMTIwNDMyLDY1LDkxMyw2NSwxMjA0ODgsNjUsMTIwNTQ2LDY1LDEyMDYwNCw2NSwxMjA2NjIsNjUsMTIwNzIwLDY1LDUwMzQsNjUsNTU3Myw2NSw0MjIyMiw2NSw5NDAxNiw2NSw2NjIwOCw2NSwxMTk4MzUsOTgsMTE5ODg3LDk4LDExOTkzOSw5OCwxMTk5OTEsOTgsMTIwMDQzLDk4LDEyMDA5NSw5OCwxMjAxNDcsOTgsMTIwMTk5LDk4LDEyMDI1MSw5OCwxMjAzMDMsOTgsMTIwMzU1LDk4LDEyMDQwNyw5OCwxMjA0NTksOTgsMzg4LDk4LDUwNzEsOTgsNTIzNCw5OCw1NTUxLDk4LDY1MzE0LDY2LDg0OTIsNjYsMTE5ODA5LDY2LDExOTg2MSw2NiwxMTk5MTMsNjYsMTIwMDE3LDY2LDEyMDA2OSw2NiwxMjAxMjEsNjYsMTIwMTczLDY2LDEyMDIyNSw2NiwxMjAyNzcsNjYsMTIwMzI5LDY2LDEyMDM4MSw2NiwxMjA0MzMsNjYsNDI5MzIsNjYsOTE0LDY2LDEyMDQ4OSw2NiwxMjA1NDcsNjYsMTIwNjA1LDY2LDEyMDY2Myw2NiwxMjA3MjEsNjYsNTEwOCw2Niw1NjIzLDY2LDQyMTkyLDY2LDY2MTc4LDY2LDY2MjA5LDY2LDY2MzA1LDY2LDY1MzQ3LDk5LDg1NzMsOTksMTE5ODM2LDk5LDExOTg4OCw5OSwxMTk5NDAsOTksMTE5OTkyLDk5LDEyMDA0NCw5OSwxMjAwOTYsOTksMTIwMTQ4LDk5LDEyMDIwMCw5OSwxMjAyNTIsOTksMTIwMzA0LDk5LDEyMDM1Niw5OSwxMjA0MDgsOTksMTIwNDYwLDk5LDc0MjgsOTksMTAxMCw5OSwxMTQyOSw5OSw0Mzk1MSw5OSw2NjYyMSw5OSwxMjg4NDQsNjcsNzE5MjIsNjcsNzE5MTMsNjcsNjUzMTUsNjcsODU1Nyw2Nyw4NDUwLDY3LDg0OTMsNjcsMTE5ODEwLDY3LDExOTg2Miw2NywxMTk5MTQsNjcsMTE5OTY2LDY3LDEyMDAxOCw2NywxMjAxNzQsNjcsMTIwMjI2LDY3LDEyMDI3OCw2NywxMjAzMzAsNjcsMTIwMzgyLDY3LDEyMDQzNCw2NywxMDE3LDY3LDExNDI4LDY3LDUwODcsNjcsNDIyMDIsNjcsNjYyMTAsNjcsNjYzMDYsNjcsNjY1ODEsNjcsNjY4NDQsNjcsODU3NCwxMDAsODUxOCwxMDAsMTE5ODM3LDEwMCwxMTk4ODksMTAwLDExOTk0MSwxMDAsMTE5OTkzLDEwMCwxMjAwNDUsMTAwLDEyMDA5NywxMDAsMTIwMTQ5LDEwMCwxMjAyMDEsMTAwLDEyMDI1MywxMDAsMTIwMzA1LDEwMCwxMjAzNTcsMTAwLDEyMDQwOSwxMDAsMTIwNDYxLDEwMCwxMjgxLDEwMCw1MDk1LDEwMCw1MjMxLDEwMCw0MjE5NCwxMDAsODU1OCw2OCw4NTE3LDY4LDExOTgxMSw2OCwxMTk4NjMsNjgsMTE5OTE1LDY4LDExOTk2Nyw2OCwxMjAwMTksNjgsMTIwMDcxLDY4LDEyMDEyMyw2OCwxMjAxNzUsNjgsMTIwMjI3LDY4LDEyMDI3OSw2OCwxMjAzMzEsNjgsMTIwMzgzLDY4LDEyMDQzNSw2OCw1MDI0LDY4LDU1OTgsNjgsNTYxMCw2OCw0MjE5NSw2OCw4NDk0LDEwMSw2NTM0OSwxMDEsODQ5NSwxMDEsODUxOSwxMDEsMTE5ODM4LDEwMSwxMTk4OTAsMTAxLDExOTk0MiwxMDEsMTIwMDQ2LDEwMSwxMjAwOTgsMTAxLDEyMDE1MCwxMDEsMTIwMjAyLDEwMSwxMjAyNTQsMTAxLDEyMDMwNiwxMDEsMTIwMzU4LDEwMSwxMjA0MTAsMTAxLDEyMDQ2MiwxMDEsNDM4MjYsMTAxLDEyMTMsMTAxLDg5NTksNjksNjUzMTcsNjksODQ5Niw2OSwxMTk4MTIsNjksMTE5ODY0LDY5LDExOTkxNiw2OSwxMjAwMjAsNjksMTIwMDcyLDY5LDEyMDEyNCw2OSwxMjAxNzYsNjksMTIwMjI4LDY5LDEyMDI4MCw2OSwxMjAzMzIsNjksMTIwMzg0LDY5LDEyMDQzNiw2OSw5MTcsNjksMTIwNDkyLDY5LDEyMDU1MCw2OSwxMjA2MDgsNjksMTIwNjY2LDY5LDEyMDcyNCw2OSwxMTU3Nyw2OSw1MDM2LDY5LDQyMjI0LDY5LDcxODQ2LDY5LDcxODU0LDY5LDY2MTgyLDY5LDExOTgzOSwxMDIsMTE5ODkxLDEwMiwxMTk5NDMsMTAyLDExOTk5NSwxMDIsMTIwMDQ3LDEwMiwxMjAwOTksMTAyLDEyMDE1MSwxMDIsMTIwMjAzLDEwMiwxMjAyNTUsMTAyLDEyMDMwNywxMDIsMTIwMzU5LDEwMiwxMjA0MTEsMTAyLDEyMDQ2MywxMDIsNDM4MjksMTAyLDQyOTA1LDEwMiwzODMsMTAyLDc4MzcsMTAyLDE0MTIsMTAyLDExOTMxNSw3MCw4NDk3LDcwLDExOTgxMyw3MCwxMTk4NjUsNzAsMTE5OTE3LDcwLDEyMDAyMSw3MCwxMjAwNzMsNzAsMTIwMTI1LDcwLDEyMDE3Nyw3MCwxMjAyMjksNzAsMTIwMjgxLDcwLDEyMDMzMyw3MCwxMjAzODUsNzAsMTIwNDM3LDcwLDQyOTA0LDcwLDk4OCw3MCwxMjA3NzgsNzAsNTU1Niw3MCw0MjIwNSw3MCw3MTg3NCw3MCw3MTg0Miw3MCw2NjE4Myw3MCw2NjIxMyw3MCw2Njg1Myw3MCw2NTM1MSwxMDMsODQ1OCwxMDMsMTE5ODQwLDEwMywxMTk4OTIsMTAzLDExOTk0NCwxMDMsMTIwMDQ4LDEwMywxMjAxMDAsMTAzLDEyMDE1MiwxMDMsMTIwMjA0LDEwMywxMjAyNTYsMTAzLDEyMDMwOCwxMDMsMTIwMzYwLDEwMywxMjA0MTIsMTAzLDEyMDQ2NCwxMDMsNjA5LDEwMyw3NTU1LDEwMywzOTcsMTAzLDE0MDksMTAzLDExOTgxNCw3MSwxMTk4NjYsNzEsMTE5OTE4LDcxLDExOTk3MCw3MSwxMjAwMjIsNzEsMTIwMDc0LDcxLDEyMDEyNiw3MSwxMjAxNzgsNzEsMTIwMjMwLDcxLDEyMDI4Miw3MSwxMjAzMzQsNzEsMTIwMzg2LDcxLDEyMDQzOCw3MSwxMjkyLDcxLDUwNTYsNzEsNTEwNyw3MSw0MjE5OCw3MSw2NTM1MiwxMDQsODQ2MiwxMDQsMTE5ODQxLDEwNCwxMTk5NDUsMTA0LDExOTk5NywxMDQsMTIwMDQ5LDEwNCwxMjAxMDEsMTA0LDEyMDE1MywxMDQsMTIwMjA1LDEwNCwxMjAyNTcsMTA0LDEyMDMwOSwxMDQsMTIwMzYxLDEwNCwxMjA0MTMsMTA0LDEyMDQ2NSwxMDQsMTIxMSwxMDQsMTM5MiwxMDQsNTA1OCwxMDQsNjUzMjAsNzIsODQ1OSw3Miw4NDYwLDcyLDg0NjEsNzIsMTE5ODE1LDcyLDExOTg2Nyw3MiwxMTk5MTksNzIsMTIwMDIzLDcyLDEyMDE3OSw3MiwxMjAyMzEsNzIsMTIwMjgzLDcyLDEyMDMzNSw3MiwxMjAzODcsNzIsMTIwNDM5LDcyLDkxOSw3MiwxMjA0OTQsNzIsMTIwNTUyLDcyLDEyMDYxMCw3MiwxMjA2NjgsNzIsMTIwNzI2LDcyLDExNDA2LDcyLDUwNTEsNzIsNTUwMCw3Miw0MjIxNSw3Miw2NjI1NSw3Miw3MzEsMTA1LDkwNzUsMTA1LDY1MzUzLDEwNSw4NTYwLDEwNSw4NTA1LDEwNSw4NTIwLDEwNSwxMTk4NDIsMTA1LDExOTg5NCwxMDUsMTE5OTQ2LDEwNSwxMTk5OTgsMTA1LDEyMDA1MCwxMDUsMTIwMTAyLDEwNSwxMjAxNTQsMTA1LDEyMDIwNiwxMDUsMTIwMjU4LDEwNSwxMjAzMTAsMTA1LDEyMDM2MiwxMDUsMTIwNDE0LDEwNSwxMjA0NjYsMTA1LDEyMDQ4NCwxMDUsNjE4LDEwNSw2MTcsMTA1LDk1MywxMDUsODEyNiwxMDUsODkwLDEwNSwxMjA1MjIsMTA1LDEyMDU4MCwxMDUsMTIwNjM4LDEwNSwxMjA2OTYsMTA1LDEyMDc1NCwxMDUsMTExMCwxMDUsNDI1NjcsMTA1LDEyMzEsMTA1LDQzODkzLDEwNSw1MDI5LDEwNSw3MTg3NSwxMDUsNjUzNTQsMTA2LDg1MjEsMTA2LDExOTg0MywxMDYsMTE5ODk1LDEwNiwxMTk5NDcsMTA2LDExOTk5OSwxMDYsMTIwMDUxLDEwNiwxMjAxMDMsMTA2LDEyMDE1NSwxMDYsMTIwMjA3LDEwNiwxMjAyNTksMTA2LDEyMDMxMSwxMDYsMTIwMzYzLDEwNiwxMjA0MTUsMTA2LDEyMDQ2NywxMDYsMTAxMSwxMDYsMTExMiwxMDYsNjUzMjIsNzQsMTE5ODE3LDc0LDExOTg2OSw3NCwxMTk5MjEsNzQsMTE5OTczLDc0LDEyMDAyNSw3NCwxMjAwNzcsNzQsMTIwMTI5LDc0LDEyMDE4MSw3NCwxMjAyMzMsNzQsMTIwMjg1LDc0LDEyMDMzNyw3NCwxMjAzODksNzQsMTIwNDQxLDc0LDQyOTMwLDc0LDg5NSw3NCwxMDMyLDc0LDUwMzUsNzQsNTI2MSw3NCw0MjIwMSw3NCwxMTk4NDQsMTA3LDExOTg5NiwxMDcsMTE5OTQ4LDEwNywxMjAwMDAsMTA3LDEyMDA1MiwxMDcsMTIwMTA0LDEwNywxMjAxNTYsMTA3LDEyMDIwOCwxMDcsMTIwMjYwLDEwNywxMjAzMTIsMTA3LDEyMDM2NCwxMDcsMTIwNDE2LDEwNywxMjA0NjgsMTA3LDg0OTAsNzUsNjUzMjMsNzUsMTE5ODE4LDc1LDExOTg3MCw3NSwxMTk5MjIsNzUsMTE5OTc0LDc1LDEyMDAyNiw3NSwxMjAwNzgsNzUsMTIwMTMwLDc1LDEyMDE4Miw3NSwxMjAyMzQsNzUsMTIwMjg2LDc1LDEyMDMzOCw3NSwxMjAzOTAsNzUsMTIwNDQyLDc1LDkyMiw3NSwxMjA0OTcsNzUsMTIwNTU1LDc1LDEyMDYxMyw3NSwxMjA2NzEsNzUsMTIwNzI5LDc1LDExNDEyLDc1LDUwOTQsNzUsNTg0NSw3NSw0MjE5OSw3NSw2Njg0MCw3NSwxNDcyLDEyNCw4NzM5LDEyNCw5MjEzLDEyNCw2NTUxMiwxMjQsMTYzMywxMjQsMTc3NywxMjQsNjYzMzYsMTI0LDEyNTEyNywxMjQsMTIwNzgzLDEyNCwxMjA3OTMsMTI0LDEyMDgwMywxMjQsMTIwODEzLDEyNCwxMjA4MjMsMTI0LDEzMDAzMywxMjQsNjUzMjEsMTI0LDg1NDQsMTI0LDg0NjQsMTI0LDg0NjUsMTI0LDExOTgxNiwxMjQsMTE5ODY4LDEyNCwxMTk5MjAsMTI0LDEyMDAyNCwxMjQsMTIwMTI4LDEyNCwxMjAxODAsMTI0LDEyMDIzMiwxMjQsMTIwMjg0LDEyNCwxMjAzMzYsMTI0LDEyMDM4OCwxMjQsMTIwNDQwLDEyNCw0MDYsMTI0LDY1MzU2LDEyNCw4NTcyLDEyNCw4NDY3LDEyNCwxMTk4NDUsMTI0LDExOTg5NywxMjQsMTE5OTQ5LDEyNCwxMjAwMDEsMTI0LDEyMDA1MywxMjQsMTIwMTA1LDEyNCwxMjAxNTcsMTI0LDEyMDIwOSwxMjQsMTIwMjYxLDEyNCwxMjAzMTMsMTI0LDEyMDM2NSwxMjQsMTIwNDE3LDEyNCwxMjA0NjksMTI0LDQ0OCwxMjQsMTIwNDk2LDEyNCwxMjA1NTQsMTI0LDEyMDYxMiwxMjQsMTIwNjcwLDEyNCwxMjA3MjgsMTI0LDExNDEwLDEyNCwxMDMwLDEyNCwxMjE2LDEyNCwxNDkzLDEyNCwxNTAzLDEyNCwxNTc1LDEyNCwxMjY0NjQsMTI0LDEyNjU5MiwxMjQsNjUxNjYsMTI0LDY1MTY1LDEyNCwxOTk0LDEyNCwxMTU5OSwxMjQsNTgyNSwxMjQsNDIyMjYsMTI0LDkzOTkyLDEyNCw2NjE4NiwxMjQsNjYzMTMsMTI0LDExOTMzOCw3Niw4NTU2LDc2LDg0NjYsNzYsMTE5ODE5LDc2LDExOTg3MSw3NiwxMTk5MjMsNzYsMTIwMDI3LDc2LDEyMDA3OSw3NiwxMjAxMzEsNzYsMTIwMTgzLDc2LDEyMDIzNSw3NiwxMjAyODcsNzYsMTIwMzM5LDc2LDEyMDM5MSw3NiwxMjA0NDMsNzYsMTE0NzIsNzYsNTA4Niw3Niw1MjkwLDc2LDQyMjA5LDc2LDkzOTc0LDc2LDcxODQzLDc2LDcxODU4LDc2LDY2NTg3LDc2LDY2ODU0LDc2LDY1MzI1LDc3LDg1NTksNzcsODQ5OSw3NywxMTk4MjAsNzcsMTE5ODcyLDc3LDExOTkyNCw3NywxMjAwMjgsNzcsMTIwMDgwLDc3LDEyMDEzMiw3NywxMjAxODQsNzcsMTIwMjM2LDc3LDEyMDI4OCw3NywxMjAzNDAsNzcsMTIwMzkyLDc3LDEyMDQ0NCw3Nyw5MjQsNzcsMTIwNDk5LDc3LDEyMDU1Nyw3NywxMjA2MTUsNzcsMTIwNjczLDc3LDEyMDczMSw3NywxMDE4LDc3LDExNDE2LDc3LDUwNDcsNzcsNTYxNiw3Nyw1ODQ2LDc3LDQyMjA3LDc3LDY2MjI0LDc3LDY2MzIxLDc3LDExOTg0NywxMTAsMTE5ODk5LDExMCwxMTk5NTEsMTEwLDEyMDAwMywxMTAsMTIwMDU1LDExMCwxMjAxMDcsMTEwLDEyMDE1OSwxMTAsMTIwMjExLDExMCwxMjAyNjMsMTEwLDEyMDMxNSwxMTAsMTIwMzY3LDExMCwxMjA0MTksMTEwLDEyMDQ3MSwxMTAsMTQwMCwxMTAsMTQwNCwxMTAsNjUzMjYsNzgsODQ2OSw3OCwxMTk4MjEsNzgsMTE5ODczLDc4LDExOTkyNSw3OCwxMTk5NzcsNzgsMTIwMDI5LDc4LDEyMDA4MSw3OCwxMjAxODUsNzgsMTIwMjM3LDc4LDEyMDI4OSw3OCwxMjAzNDEsNzgsMTIwMzkzLDc4LDEyMDQ0NSw3OCw5MjUsNzgsMTIwNTAwLDc4LDEyMDU1OCw3OCwxMjA2MTYsNzgsMTIwNjc0LDc4LDEyMDczMiw3OCwxMTQxOCw3OCw0MjIwOCw3OCw2NjgzNSw3OCwzMDc0LDExMSwzMjAyLDExMSwzMzMwLDExMSwzNDU4LDExMSwyNDA2LDExMSwyNjYyLDExMSwyNzkwLDExMSwzMDQ2LDExMSwzMTc0LDExMSwzMzAyLDExMSwzNDMwLDExMSwzNjY0LDExMSwzNzkyLDExMSw0MTYwLDExMSwxNjM3LDExMSwxNzgxLDExMSw2NTM1OSwxMTEsODUwMCwxMTEsMTE5ODQ4LDExMSwxMTk5MDAsMTExLDExOTk1MiwxMTEsMTIwMDU2LDExMSwxMjAxMDgsMTExLDEyMDE2MCwxMTEsMTIwMjEyLDExMSwxMjAyNjQsMTExLDEyMDMxNiwxMTEsMTIwMzY4LDExMSwxMjA0MjAsMTExLDEyMDQ3MiwxMTEsNzQzOSwxMTEsNzQ0MSwxMTEsNDM4MzcsMTExLDk1OSwxMTEsMTIwNTI4LDExMSwxMjA1ODYsMTExLDEyMDY0NCwxMTEsMTIwNzAyLDExMSwxMjA3NjAsMTExLDk2MywxMTEsMTIwNTMyLDExMSwxMjA1OTAsMTExLDEyMDY0OCwxMTEsMTIwNzA2LDExMSwxMjA3NjQsMTExLDExNDIzLDExMSw0MzUxLDExMSwxNDEzLDExMSwxNTA1LDExMSwxNjA3LDExMSwxMjY1MDAsMTExLDEyNjU2NCwxMTEsMTI2NTk2LDExMSw2NTI1OSwxMTEsNjUyNjAsMTExLDY1MjU4LDExMSw2NTI1NywxMTEsMTcyNiwxMTEsNjQ0MjgsMTExLDY0NDI5LDExMSw2NDQyNywxMTEsNjQ0MjYsMTExLDE3MjksMTExLDY0NDI0LDExMSw2NDQyNSwxMTEsNjQ0MjMsMTExLDY0NDIyLDExMSwxNzQ5LDExMSwzMzYwLDExMSw0MTI1LDExMSw2Njc5NCwxMTEsNzE4ODAsMTExLDcxODk1LDExMSw2NjYwNCwxMTEsMTk4NCw3OSwyNTM0LDc5LDI5MTgsNzksMTIyOTUsNzksNzA4NjQsNzksNzE5MDQsNzksMTIwNzgyLDc5LDEyMDc5Miw3OSwxMjA4MDIsNzksMTIwODEyLDc5LDEyMDgyMiw3OSwxMzAwMzIsNzksNjUzMjcsNzksMTE5ODIyLDc5LDExOTg3NCw3OSwxMTk5MjYsNzksMTE5OTc4LDc5LDEyMDAzMCw3OSwxMjAwODIsNzksMTIwMTM0LDc5LDEyMDE4Niw3OSwxMjAyMzgsNzksMTIwMjkwLDc5LDEyMDM0Miw3OSwxMjAzOTQsNzksMTIwNDQ2LDc5LDkyNyw3OSwxMjA1MDIsNzksMTIwNTYwLDc5LDEyMDYxOCw3OSwxMjA2NzYsNzksMTIwNzM0LDc5LDExNDIyLDc5LDEzNjUsNzksMTE2MDQsNzksNDgxNiw3OSwyODQ4LDc5LDY2NzU0LDc5LDQyMjI3LDc5LDcxODYxLDc5LDY2MTk0LDc5LDY2MjE5LDc5LDY2NTY0LDc5LDY2ODM4LDc5LDkwNzYsMTEyLDY1MzYwLDExMiwxMTk4NDksMTEyLDExOTkwMSwxMTIsMTE5OTUzLDExMiwxMjAwMDUsMTEyLDEyMDA1NywxMTIsMTIwMTA5LDExMiwxMjAxNjEsMTEyLDEyMDIxMywxMTIsMTIwMjY1LDExMiwxMjAzMTcsMTEyLDEyMDM2OSwxMTIsMTIwNDIxLDExMiwxMjA0NzMsMTEyLDk2MSwxMTIsMTIwNTMwLDExMiwxMjA1NDQsMTEyLDEyMDU4OCwxMTIsMTIwNjAyLDExMiwxMjA2NDYsMTEyLDEyMDY2MCwxMTIsMTIwNzA0LDExMiwxMjA3MTgsMTEyLDEyMDc2MiwxMTIsMTIwNzc2LDExMiwxMTQyNywxMTIsNjUzMjgsODAsODQ3Myw4MCwxMTk4MjMsODAsMTE5ODc1LDgwLDExOTkyNyw4MCwxMTk5NzksODAsMTIwMDMxLDgwLDEyMDA4Myw4MCwxMjAxODcsODAsMTIwMjM5LDgwLDEyMDI5MSw4MCwxMjAzNDMsODAsMTIwMzk1LDgwLDEyMDQ0Nyw4MCw5MjksODAsMTIwNTA0LDgwLDEyMDU2Miw4MCwxMjA2MjAsODAsMTIwNjc4LDgwLDEyMDczNiw4MCwxMTQyNiw4MCw1MDkwLDgwLDUyMjksODAsNDIxOTMsODAsNjYxOTcsODAsMTE5ODUwLDExMywxMTk5MDIsMTEzLDExOTk1NCwxMTMsMTIwMDA2LDExMywxMjAwNTgsMTEzLDEyMDExMCwxMTMsMTIwMTYyLDExMywxMjAyMTQsMTEzLDEyMDI2NiwxMTMsMTIwMzE4LDExMywxMjAzNzAsMTEzLDEyMDQyMiwxMTMsMTIwNDc0LDExMywxMzA3LDExMywxMzc5LDExMywxMzgyLDExMyw4NDc0LDgxLDExOTgyNCw4MSwxMTk4NzYsODEsMTE5OTI4LDgxLDExOTk4MCw4MSwxMjAwMzIsODEsMTIwMDg0LDgxLDEyMDE4OCw4MSwxMjAyNDAsODEsMTIwMjkyLDgxLDEyMDM0NCw4MSwxMjAzOTYsODEsMTIwNDQ4LDgxLDExNjA1LDgxLDExOTg1MSwxMTQsMTE5OTAzLDExNCwxMTk5NTUsMTE0LDEyMDAwNywxMTQsMTIwMDU5LDExNCwxMjAxMTEsMTE0LDEyMDE2MywxMTQsMTIwMjE1LDExNCwxMjAyNjcsMTE0LDEyMDMxOSwxMTQsMTIwMzcxLDExNCwxMjA0MjMsMTE0LDEyMDQ3NSwxMTQsNDM4NDcsMTE0LDQzODQ4LDExNCw3NDYyLDExNCwxMTM5NywxMTQsNDM5MDUsMTE0LDExOTMxOCw4Miw4NDc1LDgyLDg0NzYsODIsODQ3Nyw4MiwxMTk4MjUsODIsMTE5ODc3LDgyLDExOTkyOSw4MiwxMjAwMzMsODIsMTIwMTg5LDgyLDEyMDI0MSw4MiwxMjAyOTMsODIsMTIwMzQ1LDgyLDEyMDM5Nyw4MiwxMjA0NDksODIsNDIyLDgyLDUwMjUsODIsNTA3NCw4Miw2Njc0MCw4Miw1NTExLDgyLDQyMjExLDgyLDk0MDA1LDgyLDY1MzYzLDExNSwxMTk4NTIsMTE1LDExOTkwNCwxMTUsMTE5OTU2LDExNSwxMjAwMDgsMTE1LDEyMDA2MCwxMTUsMTIwMTEyLDExNSwxMjAxNjQsMTE1LDEyMDIxNiwxMTUsMTIwMjY4LDExNSwxMjAzMjAsMTE1LDEyMDM3MiwxMTUsMTIwNDI0LDExNSwxMjA0NzYsMTE1LDQyODAxLDExNSw0NDUsMTE1LDExMDksMTE1LDQzOTQ2LDExNSw3MTg3MywxMTUsNjY2MzIsMTE1LDY1MzMxLDgzLDExOTgyNiw4MywxMTk4NzgsODMsMTE5OTMwLDgzLDExOTk4Miw4MywxMjAwMzQsODMsMTIwMDg2LDgzLDEyMDEzOCw4MywxMjAxOTAsODMsMTIwMjQyLDgzLDEyMDI5NCw4MywxMjAzNDYsODMsMTIwMzk4LDgzLDEyMDQ1MCw4MywxMDI5LDgzLDEzNTksODMsNTA3Nyw4Myw1MDgyLDgzLDQyMjEwLDgzLDk0MDEwLDgzLDY2MTk4LDgzLDY2NTkyLDgzLDExOTg1MywxMTYsMTE5OTA1LDExNiwxMTk5NTcsMTE2LDEyMDAwOSwxMTYsMTIwMDYxLDExNiwxMjAxMTMsMTE2LDEyMDE2NSwxMTYsMTIwMjE3LDExNiwxMjAyNjksMTE2LDEyMDMyMSwxMTYsMTIwMzczLDExNiwxMjA0MjUsMTE2LDEyMDQ3NywxMTYsODg2OCw4NCwxMDIwMSw4NCwxMjg4NzIsODQsNjUzMzIsODQsMTE5ODI3LDg0LDExOTg3OSw4NCwxMTk5MzEsODQsMTE5OTgzLDg0LDEyMDAzNSw4NCwxMjAwODcsODQsMTIwMTM5LDg0LDEyMDE5MSw4NCwxMjAyNDMsODQsMTIwMjk1LDg0LDEyMDM0Nyw4NCwxMjAzOTksODQsMTIwNDUxLDg0LDkzMiw4NCwxMjA1MDcsODQsMTIwNTY1LDg0LDEyMDYyMyw4NCwxMjA2ODEsODQsMTIwNzM5LDg0LDExNDMwLDg0LDUwMjYsODQsNDIxOTYsODQsOTM5NjIsODQsNzE4NjgsODQsNjYxOTksODQsNjYyMjUsODQsNjYzMjUsODQsMTE5ODU0LDExNywxMTk5MDYsMTE3LDExOTk1OCwxMTcsMTIwMDEwLDExNywxMjAwNjIsMTE3LDEyMDExNCwxMTcsMTIwMTY2LDExNywxMjAyMTgsMTE3LDEyMDI3MCwxMTcsMTIwMzIyLDExNywxMjAzNzQsMTE3LDEyMDQyNiwxMTcsMTIwNDc4LDExNyw0MjkxMSwxMTcsNzQ1MiwxMTcsNDM4NTQsMTE3LDQzODU4LDExNyw2NTEsMTE3LDk2NSwxMTcsMTIwNTM0LDExNywxMjA1OTIsMTE3LDEyMDY1MCwxMTcsMTIwNzA4LDExNywxMjA3NjYsMTE3LDE0MDUsMTE3LDY2ODA2LDExNyw3MTg5NiwxMTcsODc0Niw4NSw4ODk5LDg1LDExOTgyOCw4NSwxMTk4ODAsODUsMTE5OTMyLDg1LDExOTk4NCw4NSwxMjAwMzYsODUsMTIwMDg4LDg1LDEyMDE0MCw4NSwxMjAxOTIsODUsMTIwMjQ0LDg1LDEyMDI5Niw4NSwxMjAzNDgsODUsMTIwNDAwLDg1LDEyMDQ1Miw4NSwxMzU3LDg1LDQ2MDgsODUsNjY3NjYsODUsNTE5Niw4NSw0MjIyOCw4NSw5NDAxOCw4NSw3MTg2NCw4NSw4NzQ0LDExOCw4ODk3LDExOCw2NTM2NiwxMTgsODU2NCwxMTgsMTE5ODU1LDExOCwxMTk5MDcsMTE4LDExOTk1OSwxMTgsMTIwMDExLDExOCwxMjAwNjMsMTE4LDEyMDExNSwxMTgsMTIwMTY3LDExOCwxMjAyMTksMTE4LDEyMDI3MSwxMTgsMTIwMzIzLDExOCwxMjAzNzUsMTE4LDEyMDQyNywxMTgsMTIwNDc5LDExOCw3NDU2LDExOCw5NTcsMTE4LDEyMDUyNiwxMTgsMTIwNTg0LDExOCwxMjA2NDIsMTE4LDEyMDcwMCwxMTgsMTIwNzU4LDExOCwxMTQxLDExOCwxNDk2LDExOCw3MTQzMCwxMTgsNDM5NDUsMTE4LDcxODcyLDExOCwxMTkzMDksODYsMTYzOSw4NiwxNzgzLDg2LDg1NDgsODYsMTE5ODI5LDg2LDExOTg4MSw4NiwxMTk5MzMsODYsMTE5OTg1LDg2LDEyMDAzNyw4NiwxMjAwODksODYsMTIwMTQxLDg2LDEyMDE5Myw4NiwxMjAyNDUsODYsMTIwMjk3LDg2LDEyMDM0OSw4NiwxMjA0MDEsODYsMTIwNDUzLDg2LDExNDAsODYsMTE1NzYsODYsNTA4MSw4Niw1MTY3LDg2LDQyNzE5LDg2LDQyMjE0LDg2LDkzOTYwLDg2LDcxODQwLDg2LDY2ODQ1LDg2LDYyMywxMTksMTE5ODU2LDExOSwxMTk5MDgsMTE5LDExOTk2MCwxMTksMTIwMDEyLDExOSwxMjAwNjQsMTE5LDEyMDExNiwxMTksMTIwMTY4LDExOSwxMjAyMjAsMTE5LDEyMDI3MiwxMTksMTIwMzI0LDExOSwxMjAzNzYsMTE5LDEyMDQyOCwxMTksMTIwNDgwLDExOSw3NDU3LDExOSwxMTIxLDExOSwxMzA5LDExOSwxMzc3LDExOSw3MTQzNCwxMTksNzE0MzgsMTE5LDcxNDM5LDExOSw0MzkwNywxMTksNzE5MTksODcsNzE5MTAsODcsMTE5ODMwLDg3LDExOTg4Miw4NywxMTk5MzQsODcsMTE5OTg2LDg3LDEyMDAzOCw4NywxMjAwOTAsODcsMTIwMTQyLDg3LDEyMDE5NCw4NywxMjAyNDYsODcsMTIwMjk4LDg3LDEyMDM1MCw4NywxMjA0MDIsODcsMTIwNDU0LDg3LDEzMDgsODcsNTA0Myw4Nyw1MDc2LDg3LDQyMjE4LDg3LDU3NDIsMTIwLDEwNTM5LDEyMCwxMDU0MCwxMjAsMTA3OTksMTIwLDY1MzY4LDEyMCw4NTY5LDEyMCwxMTk4NTcsMTIwLDExOTkwOSwxMjAsMTE5OTYxLDEyMCwxMjAwMTMsMTIwLDEyMDA2NSwxMjAsMTIwMTE3LDEyMCwxMjAxNjksMTIwLDEyMDIyMSwxMjAsMTIwMjczLDEyMCwxMjAzMjUsMTIwLDEyMDM3NywxMjAsMTIwNDI5LDEyMCwxMjA0ODEsMTIwLDU0NDEsMTIwLDU1MDEsMTIwLDU3NDEsODgsOTU4Nyw4OCw2NjMzOCw4OCw3MTkxNiw4OCw2NTMzNiw4OCw4NTUzLDg4LDExOTgzMSw4OCwxMTk4ODMsODgsMTE5OTM1LDg4LDExOTk4Nyw4OCwxMjAwMzksODgsMTIwMDkxLDg4LDEyMDE0Myw4OCwxMjAxOTUsODgsMTIwMjQ3LDg4LDEyMDI5OSw4OCwxMjAzNTEsODgsMTIwNDAzLDg4LDEyMDQ1NSw4OCw0MjkzMSw4OCw5MzUsODgsMTIwNTEwLDg4LDEyMDU2OCw4OCwxMjA2MjYsODgsMTIwNjg0LDg4LDEyMDc0Miw4OCwxMTQzNiw4OCwxMTYxMyw4OCw1ODE1LDg4LDQyMjE5LDg4LDY2MTkyLDg4LDY2MjI4LDg4LDY2MzI3LDg4LDY2ODU1LDg4LDYxMSwxMjEsNzU2NCwxMjEsNjUzNjksMTIxLDExOTg1OCwxMjEsMTE5OTEwLDEyMSwxMTk5NjIsMTIxLDEyMDAxNCwxMjEsMTIwMDY2LDEyMSwxMjAxMTgsMTIxLDEyMDE3MCwxMjEsMTIwMjIyLDEyMSwxMjAyNzQsMTIxLDEyMDMyNiwxMjEsMTIwMzc4LDEyMSwxMjA0MzAsMTIxLDEyMDQ4MiwxMjEsNjU1LDEyMSw3OTM1LDEyMSw0Mzg2NiwxMjEsOTQ3LDEyMSw4NTA5LDEyMSwxMjA1MTYsMTIxLDEyMDU3NCwxMjEsMTIwNjMyLDEyMSwxMjA2OTAsMTIxLDEyMDc0OCwxMjEsMTE5OSwxMjEsNDMyNywxMjEsNzE5MDAsMTIxLDY1MzM3LDg5LDExOTgzMiw4OSwxMTk4ODQsODksMTE5OTM2LDg5LDExOTk4OCw4OSwxMjAwNDAsODksMTIwMDkyLDg5LDEyMDE0NCw4OSwxMjAxOTYsODksMTIwMjQ4LDg5LDEyMDMwMCw4OSwxMjAzNTIsODksMTIwNDA0LDg5LDEyMDQ1Niw4OSw5MzMsODksOTc4LDg5LDEyMDUwOCw4OSwxMjA1NjYsODksMTIwNjI0LDg5LDEyMDY4Miw4OSwxMjA3NDAsODksMTE0MzIsODksMTE5OCw4OSw1MDMzLDg5LDUwNTMsODksNDIyMjAsODksOTQwMTksODksNzE4NDQsODksNjYyMjYsODksMTE5ODU5LDEyMiwxMTk5MTEsMTIyLDExOTk2MywxMjIsMTIwMDE1LDEyMiwxMjAwNjcsMTIyLDEyMDExOSwxMjIsMTIwMTcxLDEyMiwxMjAyMjMsMTIyLDEyMDI3NSwxMjIsMTIwMzI3LDEyMiwxMjAzNzksMTIyLDEyMDQzMSwxMjIsMTIwNDgzLDEyMiw3NDU4LDEyMiw0MzkyMywxMjIsNzE4NzYsMTIyLDY2MjkzLDkwLDcxOTA5LDkwLDY1MzM4LDkwLDg0ODQsOTAsODQ4OCw5MCwxMTk4MzMsOTAsMTE5ODg1LDkwLDExOTkzNyw5MCwxMTk5ODksOTAsMTIwMDQxLDkwLDEyMDE5Nyw5MCwxMjAyNDksOTAsMTIwMzAxLDkwLDEyMDM1Myw5MCwxMjA0MDUsOTAsMTIwNDU3LDkwLDkxOCw5MCwxMjA0OTMsOTAsMTIwNTUxLDkwLDEyMDYwOSw5MCwxMjA2NjcsOTAsMTIwNzI1LDkwLDUwNTksOTAsNDIyMDQsOTAsNzE4NDksOTBdLCJfZGVmYXVsdCI6WzE2MCwzMiw4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLCJjcyI6WzY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwiZGUiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sImVzIjpbODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwiZnIiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyNDUsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwiaXQiOlsxNjAsMzIsODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sImphIjpbODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwia28iOls4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sInBsIjpbNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sInB0LUJSIjpbNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sInFwcy1wbG9jIjpbMTYwLDMyLDgyMTEsNDUsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sInJ1IjpbNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDMwNSwxMDUsOTIxLDEyNCwxMDA5LDExMiwyMTUsMTIwXSwidHIiOlsxNjAsMzIsODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwiemgtaGFucyI6WzY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sInpoLWhhbnQiOls4MjExLDQ1LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldfScpfXN0YXRpYyBnZXRDb25mdXNhYmxlc0ZvckN1cnJlbnRMb2NhbGUoKXtpZighQi5tYXApe3ZhciB0LHIsbj1CLmdldERhdGEoKTtsZXQgZT14O2Z1bmN0aW9uIGkodCl7Y29uc3Qgcj1uZXcgTWFwO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9MilyLnNldCh0W2VdLHRbZSsxXSk7cmV0dXJuIHJ9ZSYmZSBpbiBufHwoZT1NKSxlJiZlIGluIG58fChlPSJfZGVmYXVsdCIpO2NvbnN0IHM9aShuLl9jb21tb24pO2ZvcihbdCxyXW9mIGkobltlXSkpcy5zZXQodCxyKTtCLm1hcD1zfXJldHVybiBCLm1hcH1zdGF0aWMgaXNBbWJpZ3VvdXMoZSl7cmV0dXJuIEIuZ2V0Q29uZnVzYWJsZXNGb3JDdXJyZW50TG9jYWxlKCkuaGFzKGUpfXN0YXRpYyBnZXRQcmltYXJ5Q29uZnVzYWJsZShlKXtyZXR1cm4gQi5nZXRDb25mdXNhYmxlc0ZvckN1cnJlbnRMb2NhbGUoKS5nZXQoZSl9c3RhdGljIGdldFByaW1hcnlDb25mdXNhYmxlQ29kZVBvaW50cygpe3JldHVybiBuZXcgU2V0KEIuZ2V0Q29uZnVzYWJsZXNGb3JDdXJyZW50TG9jYWxlKCkua2V5cygpKX19Y2xhc3MgcXtzdGF0aWMgZ2V0UmF3RGF0YSgpe3JldHVybiBKU09OLnBhcnNlKCJbOSwxMCwxMSwxMiwxMywzMiwxMjcsMTYwLDE3Myw4NDcsMTU2NCw0NDQ3LDQ0NDgsNjA2OCw2MDY5LDYxNTUsNjE1Niw2MTU3LDYxNTgsNzM1NSw3MzU2LDgxOTIsODE5Myw4MTk0LDgxOTUsODE5Niw4MTk3LDgxOTgsODE5OSw4MjAwLDgyMDEsODIwMiw4MjAzLDgyMDQsODIwNSw4MjA2LDgyMDcsODIzNCw4MjM1LDgyMzYsODIzNyw4MjM4LDgyMzksODI4Nyw4Mjg4LDgyODksODI5MCw4MjkxLDgyOTIsODI5Myw4Mjk0LDgyOTUsODI5Niw4Mjk3LDgyOTgsODI5OSw4MzAwLDgzMDEsODMwMiw4MzAzLDEwMjQwLDEyMjg4LDEyNjQ0LDY1MDI0LDY1MDI1LDY1MDI2LDY1MDI3LDY1MDI4LDY1MDI5LDY1MDMwLDY1MDMxLDY1MDMyLDY1MDMzLDY1MDM0LDY1MDM1LDY1MDM2LDY1MDM3LDY1MDM4LDY1MDM5LDY1Mjc5LDY1NDQwLDY1NTIwLDY1NTIxLDY1NTIyLDY1NTIzLDY1NTI0LDY1NTI1LDY1NTI2LDY1NTI3LDY1NTI4LDY1NTMyLDc4ODQ0LDExOTE1NSwxMTkxNTYsMTE5MTU3LDExOTE1OCwxMTkxNTksMTE5MTYwLDExOTE2MSwxMTkxNjIsOTE3NTA0LDkxNzUwNSw5MTc1MDYsOTE3NTA3LDkxNzUwOCw5MTc1MDksOTE3NTEwLDkxNzUxMSw5MTc1MTIsOTE3NTEzLDkxNzUxNCw5MTc1MTUsOTE3NTE2LDkxNzUxNyw5MTc1MTgsOTE3NTE5LDkxNzUyMCw5MTc1MjEsOTE3NTIyLDkxNzUyMyw5MTc1MjQsOTE3NTI1LDkxNzUyNiw5MTc1MjcsOTE3NTI4LDkxNzUyOSw5MTc1MzAsOTE3NTMxLDkxNzUzMiw5MTc1MzMsOTE3NTM0LDkxNzUzNSw5MTc1MzYsOTE3NTM3LDkxNzUzOCw5MTc1MzksOTE3NTQwLDkxNzU0MSw5MTc1NDIsOTE3NTQzLDkxNzU0NCw5MTc1NDUsOTE3NTQ2LDkxNzU0Nyw5MTc1NDgsOTE3NTQ5LDkxNzU1MCw5MTc1NTEsOTE3NTUyLDkxNzU1Myw5MTc1NTQsOTE3NTU1LDkxNzU1Niw5MTc1NTcsOTE3NTU4LDkxNzU1OSw5MTc1NjAsOTE3NTYxLDkxNzU2Miw5MTc1NjMsOTE3NTY0LDkxNzU2NSw5MTc1NjYsOTE3NTY3LDkxNzU2OCw5MTc1NjksOTE3NTcwLDkxNzU3MSw5MTc1NzIsOTE3NTczLDkxNzU3NCw5MTc1NzUsOTE3NTc2LDkxNzU3Nyw5MTc1NzgsOTE3NTc5LDkxNzU4MCw5MTc1ODEsOTE3NTgyLDkxNzU4Myw5MTc1ODQsOTE3NTg1LDkxNzU4Niw5MTc1ODcsOTE3NTg4LDkxNzU4OSw5MTc1OTAsOTE3NTkxLDkxNzU5Miw5MTc1OTMsOTE3NTk0LDkxNzU5NSw5MTc1OTYsOTE3NTk3LDkxNzU5OCw5MTc1OTksOTE3NjAwLDkxNzYwMSw5MTc2MDIsOTE3NjAzLDkxNzYwNCw5MTc2MDUsOTE3NjA2LDkxNzYwNyw5MTc2MDgsOTE3NjA5LDkxNzYxMCw5MTc2MTEsOTE3NjEyLDkxNzYxMyw5MTc2MTQsOTE3NjE1LDkxNzYxNiw5MTc2MTcsOTE3NjE4LDkxNzYxOSw5MTc2MjAsOTE3NjIxLDkxNzYyMiw5MTc2MjMsOTE3NjI0LDkxNzYyNSw5MTc2MjYsOTE3NjI3LDkxNzYyOCw5MTc2MjksOTE3NjMwLDkxNzYzMSw5MTc3NjAsOTE3NzYxLDkxNzc2Miw5MTc3NjMsOTE3NzY0LDkxNzc2NSw5MTc3NjYsOTE3NzY3LDkxNzc2OCw5MTc3NjksOTE3NzcwLDkxNzc3MSw5MTc3NzIsOTE3NzczLDkxNzc3NCw5MTc3NzUsOTE3Nzc2LDkxNzc3Nyw5MTc3NzgsOTE3Nzc5LDkxNzc4MCw5MTc3ODEsOTE3NzgyLDkxNzc4Myw5MTc3ODQsOTE3Nzg1LDkxNzc4Niw5MTc3ODcsOTE3Nzg4LDkxNzc4OSw5MTc3OTAsOTE3NzkxLDkxNzc5Miw5MTc3OTMsOTE3Nzk0LDkxNzc5NSw5MTc3OTYsOTE3Nzk3LDkxNzc5OCw5MTc3OTksOTE3ODAwLDkxNzgwMSw5MTc4MDIsOTE3ODAzLDkxNzgwNCw5MTc4MDUsOTE3ODA2LDkxNzgwNyw5MTc4MDgsOTE3ODA5LDkxNzgxMCw5MTc4MTEsOTE3ODEyLDkxNzgxMyw5MTc4MTQsOTE3ODE1LDkxNzgxNiw5MTc4MTcsOTE3ODE4LDkxNzgxOSw5MTc4MjAsOTE3ODIxLDkxNzgyMiw5MTc4MjMsOTE3ODI0LDkxNzgyNSw5MTc4MjYsOTE3ODI3LDkxNzgyOCw5MTc4MjksOTE3ODMwLDkxNzgzMSw5MTc4MzIsOTE3ODMzLDkxNzgzNCw5MTc4MzUsOTE3ODM2LDkxNzgzNyw5MTc4MzgsOTE3ODM5LDkxNzg0MCw5MTc4NDEsOTE3ODQyLDkxNzg0Myw5MTc4NDQsOTE3ODQ1LDkxNzg0Niw5MTc4NDcsOTE3ODQ4LDkxNzg0OSw5MTc4NTAsOTE3ODUxLDkxNzg1Miw5MTc4NTMsOTE3ODU0LDkxNzg1NSw5MTc4NTYsOTE3ODU3LDkxNzg1OCw5MTc4NTksOTE3ODYwLDkxNzg2MSw5MTc4NjIsOTE3ODYzLDkxNzg2NCw5MTc4NjUsOTE3ODY2LDkxNzg2Nyw5MTc4NjgsOTE3ODY5LDkxNzg3MCw5MTc4NzEsOTE3ODcyLDkxNzg3Myw5MTc4NzQsOTE3ODc1LDkxNzg3Niw5MTc4NzcsOTE3ODc4LDkxNzg3OSw5MTc4ODAsOTE3ODgxLDkxNzg4Miw5MTc4ODMsOTE3ODg0LDkxNzg4NSw5MTc4ODYsOTE3ODg3LDkxNzg4OCw5MTc4ODksOTE3ODkwLDkxNzg5MSw5MTc4OTIsOTE3ODkzLDkxNzg5NCw5MTc4OTUsOTE3ODk2LDkxNzg5Nyw5MTc4OTgsOTE3ODk5LDkxNzkwMCw5MTc5MDEsOTE3OTAyLDkxNzkwMyw5MTc5MDQsOTE3OTA1LDkxNzkwNiw5MTc5MDcsOTE3OTA4LDkxNzkwOSw5MTc5MTAsOTE3OTExLDkxNzkxMiw5MTc5MTMsOTE3OTE0LDkxNzkxNSw5MTc5MTYsOTE3OTE3LDkxNzkxOCw5MTc5MTksOTE3OTIwLDkxNzkyMSw5MTc5MjIsOTE3OTIzLDkxNzkyNCw5MTc5MjUsOTE3OTI2LDkxNzkyNyw5MTc5MjgsOTE3OTI5LDkxNzkzMCw5MTc5MzEsOTE3OTMyLDkxNzkzMyw5MTc5MzQsOTE3OTM1LDkxNzkzNiw5MTc5MzcsOTE3OTM4LDkxNzkzOSw5MTc5NDAsOTE3OTQxLDkxNzk0Miw5MTc5NDMsOTE3OTQ0LDkxNzk0NSw5MTc5NDYsOTE3OTQ3LDkxNzk0OCw5MTc5NDksOTE3OTUwLDkxNzk1MSw5MTc5NTIsOTE3OTUzLDkxNzk1NCw5MTc5NTUsOTE3OTU2LDkxNzk1Nyw5MTc5NTgsOTE3OTU5LDkxNzk2MCw5MTc5NjEsOTE3OTYyLDkxNzk2Myw5MTc5NjQsOTE3OTY1LDkxNzk2Niw5MTc5NjcsOTE3OTY4LDkxNzk2OSw5MTc5NzAsOTE3OTcxLDkxNzk3Miw5MTc5NzMsOTE3OTc0LDkxNzk3NSw5MTc5NzYsOTE3OTc3LDkxNzk3OCw5MTc5NzksOTE3OTgwLDkxNzk4MSw5MTc5ODIsOTE3OTgzLDkxNzk4NCw5MTc5ODUsOTE3OTg2LDkxNzk4Nyw5MTc5ODgsOTE3OTg5LDkxNzk5MCw5MTc5OTEsOTE3OTkyLDkxNzk5Myw5MTc5OTQsOTE3OTk1LDkxNzk5Niw5MTc5OTcsOTE3OTk4LDkxNzk5OV0iKX1zdGF0aWMgZ2V0RGF0YSgpe3JldHVybiB0aGlzLl9kYXRhfHwodGhpcy5fZGF0YT1uZXcgU2V0KHEuZ2V0UmF3RGF0YSgpKSksdGhpcy5fZGF0YX1zdGF0aWMgaXNJbnZpc2libGVDaGFyYWN0ZXIoZSl7cmV0dXJuIHEuZ2V0RGF0YSgpLmhhcyhlKX1zdGF0aWMgZ2V0IGNvZGVQb2ludHMoKXtyZXR1cm4gcS5nZXREYXRhKCl9fXEuX2RhdGE9dm9pZCAwO2NsYXNzIEh7Y29uc3RydWN0b3IoZSx0LHIsbil7dGhpcy52c1dvcmtlcj1lLHRoaXMucmVxPXQsdGhpcy5tZXRob2Q9cix0aGlzLmFyZ3M9bix0aGlzLnR5cGU9MH19Y2xhc3MgV3tjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLnZzV29ya2VyPWUsdGhpcy5zZXE9dCx0aGlzLnJlcz1yLHRoaXMuZXJyPW4sdGhpcy50eXBlPTF9fWNsYXNzIHp7Y29uc3RydWN0b3IoZSx0LHIsbil7dGhpcy52c1dvcmtlcj1lLHRoaXMucmVxPXQsdGhpcy5ldmVudE5hbWU9cix0aGlzLmFyZz1uLHRoaXMudHlwZT0yfX1jbGFzcyBqe2NvbnN0cnVjdG9yKGUsdCxyKXt0aGlzLnZzV29ya2VyPWUsdGhpcy5yZXE9dCx0aGlzLmV2ZW50PXIsdGhpcy50eXBlPTN9fWNsYXNzICR7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnZzV29ya2VyPWUsdGhpcy5yZXE9dCx0aGlzLnR5cGU9NH19Y2xhc3MgR3tjb25zdHJ1Y3RvcihlKXt0aGlzLl93b3JrZXJJZD0tMSx0aGlzLl9oYW5kbGVyPWUsdGhpcy5fbGFzdFNlbnRSZXE9MCx0aGlzLl9wZW5kaW5nUmVwbGllcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX3BlbmRpbmdFbWl0dGVycz1uZXcgTWFwLHRoaXMuX3BlbmRpbmdFdmVudHM9bmV3IE1hcH1zZXRXb3JrZXJJZChlKXt0aGlzLl93b3JrZXJJZD1lfXNlbmRNZXNzYWdlKHIsbil7Y29uc3QgaT1TdHJpbmcoKyt0aGlzLl9sYXN0U2VudFJlcSk7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57dGhpcy5fcGVuZGluZ1JlcGxpZXNbaV09e3Jlc29sdmU6ZSxyZWplY3Q6dH0sdGhpcy5fc2VuZChuZXcgSCh0aGlzLl93b3JrZXJJZCxpLHIsbikpfSl9bGlzdGVuKGUsdCl7bGV0IHI9bnVsbDtjb25zdCBuPW5ldyBSKHtvbkZpcnN0TGlzdGVuZXJBZGQ6KCk9PntyPVN0cmluZygrK3RoaXMuX2xhc3RTZW50UmVxKSx0aGlzLl9wZW5kaW5nRW1pdHRlcnMuc2V0KHIsbiksdGhpcy5fc2VuZChuZXcgeih0aGlzLl93b3JrZXJJZCxyLGUsdCkpfSxvbkxhc3RMaXN0ZW5lclJlbW92ZTooKT0+e3RoaXMuX3BlbmRpbmdFbWl0dGVycy5kZWxldGUociksdGhpcy5fc2VuZChuZXcgJCh0aGlzLl93b3JrZXJJZCxyKSkscj1udWxsfX0pO3JldHVybiBuLmV2ZW50fWhhbmRsZU1lc3NhZ2UoZSl7ZSYmZS52c1dvcmtlciYmKC0xIT09dGhpcy5fd29ya2VySWQmJmUudnNXb3JrZXIhPT10aGlzLl93b3JrZXJJZHx8dGhpcy5faGFuZGxlTWVzc2FnZShlKSl9X2hhbmRsZU1lc3NhZ2UoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSAxOnJldHVybiB0aGlzLl9oYW5kbGVSZXBseU1lc3NhZ2UoZSk7Y2FzZSAwOnJldHVybiB0aGlzLl9oYW5kbGVSZXF1ZXN0TWVzc2FnZShlKTtjYXNlIDI6cmV0dXJuIHRoaXMuX2hhbmRsZVN1YnNjcmliZUV2ZW50TWVzc2FnZShlKTtjYXNlIDM6cmV0dXJuIHRoaXMuX2hhbmRsZUV2ZW50TWVzc2FnZShlKTtjYXNlIDQ6cmV0dXJuIHRoaXMuX2hhbmRsZVVuc3Vic2NyaWJlRXZlbnRNZXNzYWdlKGUpfX1faGFuZGxlUmVwbHlNZXNzYWdlKHIpe2lmKHRoaXMuX3BlbmRpbmdSZXBsaWVzW3Iuc2VxXSl7bGV0IHQ9dGhpcy5fcGVuZGluZ1JlcGxpZXNbci5zZXFdO2lmKGRlbGV0ZSB0aGlzLl9wZW5kaW5nUmVwbGllc1tyLnNlcV0sci5lcnIpe2xldCBlPXIuZXJyO3JldHVybiByLmVyci4kaXNFcnJvciYmKGU9bmV3IEVycm9yLGUubmFtZT1yLmVyci5uYW1lLGUubWVzc2FnZT1yLmVyci5tZXNzYWdlLGUuc3RhY2s9ci5lcnIuc3RhY2spLHZvaWQgdC5yZWplY3QoZSl9dC5yZXNvbHZlKHIucmVzKX1lbHNlIGNvbnNvbGUud2FybigiR290IHJlcGx5IHRvIHVua25vd24gc2VxIil9X2hhbmRsZVJlcXVlc3RNZXNzYWdlKGUpe2xldCB0PWUucmVxLHI9dGhpcy5faGFuZGxlci5oYW5kbGVNZXNzYWdlKGUubWV0aG9kLGUuYXJncyk7ci50aGVuKGU9Pnt0aGlzLl9zZW5kKG5ldyBXKHRoaXMuX3dvcmtlcklkLHQsZSx2b2lkIDApKX0sZT0+e2UuZGV0YWlsIGluc3RhbmNlb2YgRXJyb3ImJihlLmRldGFpbD1uKGUuZGV0YWlsKSksdGhpcy5fc2VuZChuZXcgVyh0aGlzLl93b3JrZXJJZCx0LHZvaWQgMCxuKGUpKSl9KX1faGFuZGxlU3Vic2NyaWJlRXZlbnRNZXNzYWdlKGUpe2NvbnN0IHQ9ZS5yZXE7ZT10aGlzLl9oYW5kbGVyLmhhbmRsZUV2ZW50KGUuZXZlbnROYW1lLGUuYXJnKShlPT57dGhpcy5fc2VuZChuZXcgaih0aGlzLl93b3JrZXJJZCx0LGUpKX0pO3RoaXMuX3BlbmRpbmdFdmVudHMuc2V0KHQsZSl9X2hhbmRsZUV2ZW50TWVzc2FnZShlKXt0aGlzLl9wZW5kaW5nRW1pdHRlcnMuaGFzKGUucmVxKT90aGlzLl9wZW5kaW5nRW1pdHRlcnMuZ2V0KGUucmVxKS5maXJlKGUuZXZlbnQpOmNvbnNvbGUud2FybigiR290IGV2ZW50IGZvciB1bmtub3duIHJlcSIpfV9oYW5kbGVVbnN1YnNjcmliZUV2ZW50TWVzc2FnZShlKXt0aGlzLl9wZW5kaW5nRXZlbnRzLmhhcyhlLnJlcSk/KHRoaXMuX3BlbmRpbmdFdmVudHMuZ2V0KGUucmVxKS5kaXNwb3NlKCksdGhpcy5fcGVuZGluZ0V2ZW50cy5kZWxldGUoZS5yZXEpKTpjb25zb2xlLndhcm4oIkdvdCB1bnN1YnNjcmliZSBmb3IgdW5rbm93biByZXEiKX1fc2VuZCh0KXtsZXQgcj1bXTtpZigwPT09dC50eXBlKWZvcihsZXQgZT0wO2U8dC5hcmdzLmxlbmd0aDtlKyspdC5hcmdzW2VdaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciYmci5wdXNoKHQuYXJnc1tlXSk7ZWxzZSAxPT09dC50eXBlJiZ0LnJlcyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiZyLnB1c2godC5yZXMpO3RoaXMuX2hhbmRsZXIuc2VuZE1lc3NhZ2UodCxyKX19ZnVuY3Rpb24gSihlKXtyZXR1cm4ibyI9PT1lWzBdJiYibiI9PT1lWzFdJiZGKGUuY2hhckNvZGVBdCgyKSl9ZnVuY3Rpb24gUShlKXtyZXR1cm4vXm9uRHluYW1pYy8udGVzdChlKSYmRihlLmNoYXJDb2RlQXQoOSkpfWZ1bmN0aW9uIFkoZSxyLG4pe2xldCB0PXt9O2Zvcihjb25zdCBpIG9mIGUpUShpKT90W2ldPSh0PT5mdW5jdGlvbihlKXtyZXR1cm4gbih0LGUpfSkoaSk6SihpKT90W2ldPW4oaSx2b2lkIDApOnRbaV09KHQ9PmZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiByKHQsZSl9KShpKTtyZXR1cm4gdH1jbGFzcyBae2NvbnN0cnVjdG9yKHIsZSl7dGhpcy5fcmVxdWVzdEhhbmRsZXJGYWN0b3J5PWUsdGhpcy5fcmVxdWVzdEhhbmRsZXI9bnVsbCx0aGlzLl9wcm90b2NvbD1uZXcgRyh7c2VuZE1lc3NhZ2U6KGUsdCk9PntyKGUsdCl9LGhhbmRsZU1lc3NhZ2U6KGUsdCk9PnRoaXMuX2hhbmRsZU1lc3NhZ2UoZSx0KSxoYW5kbGVFdmVudDooZSx0KT0+dGhpcy5faGFuZGxlRXZlbnQoZSx0KX0pfW9ubWVzc2FnZShlKXt0aGlzLl9wcm90b2NvbC5oYW5kbGVNZXNzYWdlKGUpfV9oYW5kbGVNZXNzYWdlKGUsdCl7aWYoIiRpbml0aWFsaXplIj09PWUpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZSh0WzBdLHRbMV0sdFsyXSx0WzNdKTtpZighdGhpcy5fcmVxdWVzdEhhbmRsZXJ8fCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLl9yZXF1ZXN0SGFuZGxlcltlXSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJNaXNzaW5nIHJlcXVlc3RIYW5kbGVyIG9yIG1ldGhvZDogIitlKSk7dHJ5e3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fcmVxdWVzdEhhbmRsZXJbZV0uYXBwbHkodGhpcy5fcmVxdWVzdEhhbmRsZXIsdCkpfWNhdGNoKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX19X2hhbmRsZUV2ZW50KGUsdCl7aWYoIXRoaXMuX3JlcXVlc3RIYW5kbGVyKXRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXF1ZXN0SGFuZGxlciIpO2lmKFEoZSkpe3ZhciByPXRoaXMuX3JlcXVlc3RIYW5kbGVyW2VdLmNhbGwodGhpcy5fcmVxdWVzdEhhbmRsZXIsdCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGR5bmFtaWMgZXZlbnQgJHtlfSBvbiByZXF1ZXN0IGhhbmRsZXIuYCk7cmV0dXJuIHJ9aWYoSihlKSl7cj10aGlzLl9yZXF1ZXN0SGFuZGxlcltlXTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZXZlbnQgJHtlfSBvbiByZXF1ZXN0IGhhbmRsZXIuYCk7cmV0dXJuIHJ9dGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgZXZlbnQgbmFtZSAiK2UpfWluaXRpYWxpemUoZSx0LG4scil7dGhpcy5fcHJvdG9jb2wuc2V0V29ya2VySWQoZSk7Y29uc3QgaT1ZKHIsKGUsdCk9PnRoaXMuX3Byb3RvY29sLnNlbmRNZXNzYWdlKGUsdCksKGUsdCk9PnRoaXMuX3Byb3RvY29sLmxpc3RlbihlLHQpKTtyZXR1cm4gdGhpcy5fcmVxdWVzdEhhbmRsZXJGYWN0b3J5Pyh0aGlzLl9yZXF1ZXN0SGFuZGxlcj10aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3RvcnkoaSksUHJvbWlzZS5yZXNvbHZlKGsodGhpcy5fcmVxdWVzdEhhbmRsZXIpKSk6KHQmJih2b2lkIDAhPT10LmJhc2VVcmwmJmRlbGV0ZSB0LmJhc2VVcmwsdm9pZCAwIT09dC5wYXRocyYmdm9pZCAwIT09dC5wYXRocy52cyYmZGVsZXRlIHQucGF0aHMudnMsdC50cnVzdGVkVHlwZXNQb2xpY3ksZGVsZXRlIHQudHJ1c3RlZFR5cGVzUG9saWN5LHQuY2F0Y2hFcnJvcj0hMCxMLnJlcXVpcmUuY29uZmlnKHQpKSxuZXcgUHJvbWlzZSgodCxyKT0+e2NvbnN0IGU9TC5yZXF1aXJlO2UoW25dLGU9Pnt0aGlzLl9yZXF1ZXN0SGFuZGxlcj1lLmNyZWF0ZShpKSx0aGlzLl9yZXF1ZXN0SGFuZGxlcj90KGsodGhpcy5fcmVxdWVzdEhhbmRsZXIpKTpyKG5ldyBFcnJvcigiTm8gUmVxdWVzdEhhbmRsZXIhIikpfSxyKX0pKX19Y2xhc3MgWHtjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLm9yaWdpbmFsU3RhcnQ9ZSx0aGlzLm9yaWdpbmFsTGVuZ3RoPXQsdGhpcy5tb2RpZmllZFN0YXJ0PXIsdGhpcy5tb2RpZmllZExlbmd0aD1ufWdldE9yaWdpbmFsRW5kKCl7cmV0dXJuIHRoaXMub3JpZ2luYWxTdGFydCt0aGlzLm9yaWdpbmFsTGVuZ3RofWdldE1vZGlmaWVkRW5kKCl7cmV0dXJuIHRoaXMubW9kaWZpZWRTdGFydCt0aGlzLm1vZGlmaWVkTGVuZ3RofX1mdW5jdGlvbiBlZShlLHQpe3JldHVybih0PDw1KS10K2V8MH1jbGFzcyB0ZXtjb25zdHJ1Y3RvcihlKXt0aGlzLnNvdXJjZT1lfWdldEVsZW1lbnRzKCl7Y29uc3Qgcj10aGlzLnNvdXJjZSxuPW5ldyBJbnQzMkFycmF5KHIubGVuZ3RoKTtmb3IobGV0IGU9MCx0PXIubGVuZ3RoO2U8dDtlKyspbltlXT1yLmNoYXJDb2RlQXQoZSk7cmV0dXJuIG59fWNsYXNzIHJle3N0YXRpYyBBc3NlcnQoZSx0KXtpZighZSl0aHJvdyBuZXcgRXJyb3IodCl9fWNsYXNzIG5le3N0YXRpYyBDb3B5KHQscixuLGkscyl7Zm9yKGxldCBlPTA7ZTxzO2UrKyluW2krZV09dFtyK2VdfXN0YXRpYyBDb3B5Mih0LHIsbixpLHMpe2ZvcihsZXQgZT0wO2U8cztlKyspbltpK2VdPXRbcitlXX19Y2xhc3MgaWV7Y29uc3RydWN0b3IoKXt0aGlzLm1fY2hhbmdlcz1bXSx0aGlzLm1fb3JpZ2luYWxTdGFydD0xMDczNzQxODI0LHRoaXMubV9tb2RpZmllZFN0YXJ0PTEwNzM3NDE4MjQsdGhpcy5tX29yaWdpbmFsQ291bnQ9MCx0aGlzLm1fbW9kaWZpZWRDb3VudD0wfU1hcmtOZXh0Q2hhbmdlKCl7KDA8dGhpcy5tX29yaWdpbmFsQ291bnR8fDA8dGhpcy5tX21vZGlmaWVkQ291bnQpJiZ0aGlzLm1fY2hhbmdlcy5wdXNoKG5ldyBYKHRoaXMubV9vcmlnaW5hbFN0YXJ0LHRoaXMubV9vcmlnaW5hbENvdW50LHRoaXMubV9tb2RpZmllZFN0YXJ0LHRoaXMubV9tb2RpZmllZENvdW50KSksdGhpcy5tX29yaWdpbmFsQ291bnQ9MCx0aGlzLm1fbW9kaWZpZWRDb3VudD0wLHRoaXMubV9vcmlnaW5hbFN0YXJ0PTEwNzM3NDE4MjQsdGhpcy5tX21vZGlmaWVkU3RhcnQ9MTA3Mzc0MTgyNH1BZGRPcmlnaW5hbEVsZW1lbnQoZSx0KXt0aGlzLm1fb3JpZ2luYWxTdGFydD1NYXRoLm1pbih0aGlzLm1fb3JpZ2luYWxTdGFydCxlKSx0aGlzLm1fbW9kaWZpZWRTdGFydD1NYXRoLm1pbih0aGlzLm1fbW9kaWZpZWRTdGFydCx0KSx0aGlzLm1fb3JpZ2luYWxDb3VudCsrfUFkZE1vZGlmaWVkRWxlbWVudChlLHQpe3RoaXMubV9vcmlnaW5hbFN0YXJ0PU1hdGgubWluKHRoaXMubV9vcmlnaW5hbFN0YXJ0LGUpLHRoaXMubV9tb2RpZmllZFN0YXJ0PU1hdGgubWluKHRoaXMubV9tb2RpZmllZFN0YXJ0LHQpLHRoaXMubV9tb2RpZmllZENvdW50Kyt9Z2V0Q2hhbmdlcygpe3JldHVybigwPHRoaXMubV9vcmlnaW5hbENvdW50fHwwPHRoaXMubV9tb2RpZmllZENvdW50KSYmdGhpcy5NYXJrTmV4dENoYW5nZSgpLHRoaXMubV9jaGFuZ2VzfWdldFJldmVyc2VDaGFuZ2VzKCl7cmV0dXJuKDA8dGhpcy5tX29yaWdpbmFsQ291bnR8fDA8dGhpcy5tX21vZGlmaWVkQ291bnQpJiZ0aGlzLk1hcmtOZXh0Q2hhbmdlKCksdGhpcy5tX2NoYW5nZXMucmV2ZXJzZSgpLHRoaXMubV9jaGFuZ2VzfX1jbGFzcyBzZXtjb25zdHJ1Y3RvcihlLHQscj1udWxsKXt0aGlzLkNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZT1yLHRoaXMuX29yaWdpbmFsU2VxdWVuY2U9ZSx0aGlzLl9tb2RpZmllZFNlcXVlbmNlPXQ7dmFyW24saSxzXT1zZS5fZ2V0RWxlbWVudHMoZSksW3IsZSx0XT1zZS5fZ2V0RWxlbWVudHModCk7dGhpcy5faGFzU3RyaW5ncz1zJiZ0LHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHM9bix0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoPWksdGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50cz1yLHRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2g9ZSx0aGlzLm1fZm9yd2FyZEhpc3Rvcnk9W10sdGhpcy5tX3JldmVyc2VIaXN0b3J5PVtdfXN0YXRpYyBfaXNTdHJpbmdBcnJheShlKXtyZXR1cm4gMDxlLmxlbmd0aCYmInN0cmluZyI9PXR5cGVvZiBlWzBdfXN0YXRpYyBfZ2V0RWxlbWVudHMoZSl7dmFyIHI9ZS5nZXRFbGVtZW50cygpO2lmKHNlLl9pc1N0cmluZ0FycmF5KHIpKXtjb25zdCBuPW5ldyBJbnQzMkFycmF5KHIubGVuZ3RoKTtmb3IobGV0IGU9MCx0PXIubGVuZ3RoO2U8dDtlKyspbltlXT1mdW5jdGlvbihyLG4pe249ZWUoMTQ5NDE3LG4pO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrKyluPWVlKHIuY2hhckNvZGVBdChlKSxuKTtyZXR1cm4gbn0ocltlXSwwKTtyZXR1cm5bcixuLCEwXX1yZXR1cm4gciBpbnN0YW5jZW9mIEludDMyQXJyYXk/W1tdLHIsITFdOltbXSxuZXcgSW50MzJBcnJheShyKSwhMV19RWxlbWVudHNBcmVFcXVhbChlLHQpe3JldHVybiB0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoW2VdPT09dGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFt0XSYmKCF0aGlzLl9oYXNTdHJpbmdzfHx0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW2VdPT09dGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50c1t0XSl9RWxlbWVudHNBcmVTdHJpY3RFcXVhbChlLHQpe3JldHVybiEhdGhpcy5FbGVtZW50c0FyZUVxdWFsKGUsdCkmJnNlLl9nZXRTdHJpY3RFbGVtZW50KHRoaXMuX29yaWdpbmFsU2VxdWVuY2UsZSk9PT1zZS5fZ2V0U3RyaWN0RWxlbWVudCh0aGlzLl9tb2RpZmllZFNlcXVlbmNlLHQpfXN0YXRpYyBfZ2V0U3RyaWN0RWxlbWVudChlLHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldFN0cmljdEVsZW1lbnQ/ZS5nZXRTdHJpY3RFbGVtZW50KHQpOm51bGx9T3JpZ2luYWxFbGVtZW50c0FyZUVxdWFsKGUsdCl7cmV0dXJuIHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbZV09PT10aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoW3RdJiYoIXRoaXMuX2hhc1N0cmluZ3N8fHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbZV09PT10aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW3RdKX1Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwoZSx0KXtyZXR1cm4gdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFtlXT09PXRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2hbdF0mJighdGhpcy5faGFzU3RyaW5nc3x8dGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50c1tlXT09PXRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbdF0pfUNvbXB1dGVEaWZmKGUpe3JldHVybiB0aGlzLl9Db21wdXRlRGlmZigwLHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2gubGVuZ3RoLTEsMCx0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoLmxlbmd0aC0xLGUpfV9Db21wdXRlRGlmZihlLHQscixuLGkpe3ZhciBzPVshMV07bGV0IG89dGhpcy5Db21wdXRlRGlmZlJlY3Vyc2l2ZShlLHQscixuLHMpO3JldHVybiBpJiYobz10aGlzLlByZXR0aWZ5Q2hhbmdlcyhvKSkse3F1aXRFYXJseTpzWzBdLGNoYW5nZXM6b319Q29tcHV0ZURpZmZSZWN1cnNpdmUodCxyLG4saSxzKXtmb3Ioc1swXT0hMTt0PD1yJiZuPD1pJiZ0aGlzLkVsZW1lbnRzQXJlRXF1YWwodCxuKTspdCsrLG4rKztmb3IoO3Q8PXImJm48PWkmJnRoaXMuRWxlbWVudHNBcmVFcXVhbChyLGkpOylyLS0saS0tO2lmKHI8dHx8aTxuKXtsZXQgZTtyZXR1cm4gZT1uPD1pPyhyZS5Bc3NlcnQodD09PXIrMSwib3JpZ2luYWxTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG9yaWdpbmFsRW5kIiksW25ldyBYKHQsMCxuLGktbisxKV0pOnQ8PXI/KHJlLkFzc2VydChuPT09aSsxLCJtb2RpZmllZFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gbW9kaWZpZWRFbmQiKSxbbmV3IFgodCxyLXQrMSxuLDApXSk6KHJlLkFzc2VydCh0PT09cisxLCJvcmlnaW5hbFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gb3JpZ2luYWxFbmQiKSxyZS5Bc3NlcnQobj09PWkrMSwibW9kaWZpZWRTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG1vZGlmaWVkRW5kIiksW10pLGV9dmFyIG89WzBdLGE9WzBdLGw9dGhpcy5Db21wdXRlUmVjdXJzaW9uUG9pbnQodCxyLG4saSxvLGEscyksbz1vWzBdLGE9YVswXTtpZihudWxsIT09bClyZXR1cm4gbDtpZihzWzBdKXJldHVybltuZXcgWCh0LHItdCsxLG4saS1uKzEpXTt7bD10aGlzLkNvbXB1dGVEaWZmUmVjdXJzaXZlKHQsbyxuLGEscyk7bGV0IGU9W107cmV0dXJuIGU9c1swXT9bbmV3IFgobysxLHItKG8rMSkrMSxhKzEsaS0oYSsxKSsxKV06dGhpcy5Db21wdXRlRGlmZlJlY3Vyc2l2ZShvKzEscixhKzEsaSxzKSx0aGlzLkNvbmNhdGVuYXRlQ2hhbmdlcyhsLGUpfX1XQUxLVFJBQ0UoZSx0LHIsbixpLHMsbyxhLGwsdSxoLGQsYyxtLGYsZyxfLHApe2xldCBDPW51bGwsYj1uZXcgaWUsdj10LEw9cix3PWNbMF0tZ1swXS1uLE49LTEwNzM3NDE4MjQsUz10aGlzLm1fZm9yd2FyZEhpc3RvcnkubGVuZ3RoLTE7ZG97dmFyIHk9dytlO3c9eT09PXZ8fHk8TCYmbFt5LTFdPGxbeSsxXT8obT0oaD1sW3krMV0pLXctbixoPE4mJmIuTWFya05leHRDaGFuZ2UoKSxOPWgsYi5BZGRNb2RpZmllZEVsZW1lbnQoaCsxLG0pLHkrMS1lKToobT0oaD1sW3ktMV0rMSktdy1uLGg8TiYmYi5NYXJrTmV4dENoYW5nZSgpLE49aC0xLGIuQWRkT3JpZ2luYWxFbGVtZW50KGgsbSsxKSx5LTEtZSksMDw9UyYmKGU9KGw9dGhpcy5tX2ZvcndhcmRIaXN0b3J5W1NdKVswXSx2PTEsTD1sLmxlbmd0aC0xKX13aGlsZSgtMTw9LS1TKTtpZihyPWIuZ2V0UmV2ZXJzZUNoYW5nZXMoKSxwWzBdKXtsZXQgZT1jWzBdKzEsdD1nWzBdKzE7aWYobnVsbCE9PXImJjA8ci5sZW5ndGgpe2NvbnN0IEE9cltyLmxlbmd0aC0xXTtlPU1hdGgubWF4KGUsQS5nZXRPcmlnaW5hbEVuZCgpKSx0PU1hdGgubWF4KHQsQS5nZXRNb2RpZmllZEVuZCgpKX1DPVtuZXcgWChlLGQtZSsxLHQsZi10KzEpXX1lbHNle2I9bmV3IGllLHY9cyxMPW8sdz1jWzBdLWdbMF0tYSxOPTEwNzM3NDE4MjQsUz1fP3RoaXMubV9yZXZlcnNlSGlzdG9yeS5sZW5ndGgtMTp0aGlzLm1fcmV2ZXJzZUhpc3RvcnkubGVuZ3RoLTI7ZG97dmFyIEU9dytpO3c9RT09PXZ8fEU8TCYmdVtFLTFdPj11W0UrMV0/KG09KGg9dVtFKzFdLTEpLXctYSxoPk4mJmIuTWFya05leHRDaGFuZ2UoKSxOPWgrMSxiLkFkZE9yaWdpbmFsRWxlbWVudChoKzEsbSsxKSxFKzEtaSk6KG09KGg9dVtFLTFdKS13LWEsaD5OJiZiLk1hcmtOZXh0Q2hhbmdlKCksTj1oLGIuQWRkTW9kaWZpZWRFbGVtZW50KGgrMSxtKzEpLEUtMS1pKSwwPD1TJiYoaT0odT10aGlzLm1fcmV2ZXJzZUhpc3RvcnlbU10pWzBdLHY9MSxMPXUubGVuZ3RoLTEpfXdoaWxlKC0xPD0tLVMpO0M9Yi5nZXRDaGFuZ2VzKCl9cmV0dXJuIHRoaXMuQ29uY2F0ZW5hdGVDaGFuZ2VzKHIsQyl9Q29tcHV0ZVJlY3Vyc2lvblBvaW50KGkscyxvLGEsbCx1LGgpe2xldCBkPTAsYz0wLG09MCxmPTAsZz0wLF89MDtpLS0sby0tLHVbbFswXT0wXT0wLHRoaXMubV9mb3J3YXJkSGlzdG9yeT1bXSx0aGlzLm1fcmV2ZXJzZUhpc3Rvcnk9W107dmFyIGU9cy1pKyhhLW8pLHA9MStlO2NvbnN0IEM9bmV3IEludDMyQXJyYXkocCksYj1uZXcgSW50MzJBcnJheShwKTt2YXIgdj1hLW8sTD1zLWksdz1pLW8sTj1zLWEsUz0oTC12KSUyPT0wO0Nbdl09aSxiW0xdPXMsaFswXT0hMTtmb3IobGV0IG49MTtuPD1lLzIrMTtuKyspe2xldCB0PTAscj0wO209dGhpcy5DbGlwRGlhZ29uYWxCb3VuZCh2LW4sbix2LHApLGY9dGhpcy5DbGlwRGlhZ29uYWxCb3VuZCh2K24sbix2LHApO2ZvcihsZXQgZT1tO2U8PWY7ZSs9Mil7ZD1lPT09bXx8ZTxmJiZDW2UtMV08Q1tlKzFdP0NbZSsxXTpDW2UtMV0rMSxjPWQtKGUtdiktdztmb3IodmFyIHk9ZDtkPHMmJmM8YSYmdGhpcy5FbGVtZW50c0FyZUVxdWFsKGQrMSxjKzEpOylkKyssYysrO2lmKENbZV09ZCxkK2M+dCtyJiYodD1kLHI9YyksIVMmJk1hdGguYWJzKGUtTCk8PW4tMSYmZD49YltlXSlyZXR1cm4gbFswXT1kLHVbMF09Yyx5PD1iW2VdJiZuPD0xNDQ4P3RoaXMuV0FMS1RSQUNFKHYsbSxmLHcsTCxnLF8sTixDLGIsZCxzLGwsYyxhLHUsUyxoKTpudWxsfXZhciBFPSh0LWkrKHItbyktbikvMjtpZihudWxsIT09dGhpcy5Db250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUmJiF0aGlzLkNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZSh0LEUpKXJldHVybiBoWzBdPSEwLGxbMF09dCx1WzBdPXIsMDxFJiZuPD0xNDQ4P3RoaXMuV0FMS1RSQUNFKHYsbSxmLHcsTCxnLF8sTixDLGIsZCxzLGwsYyxhLHUsUyxoKTooaSsrLG8rKyxbbmV3IFgoaSxzLWkrMSxvLGEtbysxKV0pO2c9dGhpcy5DbGlwRGlhZ29uYWxCb3VuZChMLW4sbixMLHApLF89dGhpcy5DbGlwRGlhZ29uYWxCb3VuZChMK24sbixMLHApO2ZvcihsZXQgZT1nO2U8PV87ZSs9Mil7ZD1lPT09Z3x8ZTxfJiZiW2UtMV0+PWJbZSsxXT9iW2UrMV0tMTpiW2UtMV0sYz1kLShlLUwpLU47Zm9yKHZhciBBPWQ7ZD5pJiZjPm8mJnRoaXMuRWxlbWVudHNBcmVFcXVhbChkLGMpOylkLS0sYy0tO2lmKGJbZV09ZCxTJiZNYXRoLmFicyhlLXYpPD1uJiZkPD1DW2VdKXJldHVybiBsWzBdPWQsdVswXT1jLEE+PUNbZV0mJm48PTE0NDg/dGhpcy5XQUxLVFJBQ0UodixtLGYsdyxMLGcsXyxOLEMsYixkLHMsbCxjLGEsdSxTLGgpOm51bGx9aWYobjw9MTQ0Nyl7bGV0IGU9bmV3IEludDMyQXJyYXkoZi1tKzIpO2VbMF09di1tKzEsbmUuQ29weTIoQyxtLGUsMSxmLW0rMSksdGhpcy5tX2ZvcndhcmRIaXN0b3J5LnB1c2goZSksZT1uZXcgSW50MzJBcnJheShfLWcrMiksZVswXT1MLWcrMSxuZS5Db3B5MihiLGcsZSwxLF8tZysxKSx0aGlzLm1fcmV2ZXJzZUhpc3RvcnkucHVzaChlKX19cmV0dXJuIHRoaXMuV0FMS1RSQUNFKHYsbSxmLHcsTCxnLF8sTixDLGIsZCxzLGwsYyxhLHUsUyxoKX1QcmV0dGlmeUNoYW5nZXMocyl7Zm9yKGxldCBlPTA7ZTxzLmxlbmd0aDtlKyspe2NvbnN0IHY9c1tlXTtmb3IodmFyIHQ9ZTxzLmxlbmd0aC0xP3NbZSsxXS5vcmlnaW5hbFN0YXJ0OnRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2gubGVuZ3RoLHI9ZTxzLmxlbmd0aC0xP3NbZSsxXS5tb2RpZmllZFN0YXJ0OnRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2gubGVuZ3RoLG49MDx2Lm9yaWdpbmFsTGVuZ3RoLGk9MDx2Lm1vZGlmaWVkTGVuZ3RoO3Yub3JpZ2luYWxTdGFydCt2Lm9yaWdpbmFsTGVuZ3RoPHQmJnYubW9kaWZpZWRTdGFydCt2Lm1vZGlmaWVkTGVuZ3RoPHImJighbnx8dGhpcy5PcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwodi5vcmlnaW5hbFN0YXJ0LHYub3JpZ2luYWxTdGFydCt2Lm9yaWdpbmFsTGVuZ3RoKSkmJighaXx8dGhpcy5Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwodi5tb2RpZmllZFN0YXJ0LHYubW9kaWZpZWRTdGFydCt2Lm1vZGlmaWVkTGVuZ3RoKSk7KXt2YXIgbz10aGlzLkVsZW1lbnRzQXJlU3RyaWN0RXF1YWwodi5vcmlnaW5hbFN0YXJ0LHYubW9kaWZpZWRTdGFydCk7aWYodGhpcy5FbGVtZW50c0FyZVN0cmljdEVxdWFsKHYub3JpZ2luYWxTdGFydCt2Lm9yaWdpbmFsTGVuZ3RoLHYubW9kaWZpZWRTdGFydCt2Lm1vZGlmaWVkTGVuZ3RoKSYmIW8pYnJlYWs7di5vcmlnaW5hbFN0YXJ0Kyssdi5tb2RpZmllZFN0YXJ0Kyt9dmFyIGE9W251bGxdO2U8cy5sZW5ndGgtMSYmdGhpcy5DaGFuZ2VzT3ZlcmxhcChzW2VdLHNbZSsxXSxhKSYmKHNbZV09YVswXSxzLnNwbGljZShlKzEsMSksZS0tKX1mb3IobGV0IGU9cy5sZW5ndGgtMTswPD1lO2UtLSl7Y29uc3QgTD1zW2VdO2xldCB0PTAscj0wOzA8ZSYmKGM9c1tlLTFdLHQ9Yy5vcmlnaW5hbFN0YXJ0K2Mub3JpZ2luYWxMZW5ndGgscj1jLm1vZGlmaWVkU3RhcnQrYy5tb2RpZmllZExlbmd0aCk7dmFyIGw9MDxMLm9yaWdpbmFsTGVuZ3RoLHU9MDxMLm1vZGlmaWVkTGVuZ3RoO2xldCBuPTAsaT10aGlzLl9ib3VuZGFyeVNjb3JlKEwub3JpZ2luYWxTdGFydCxMLm9yaWdpbmFsTGVuZ3RoLEwubW9kaWZpZWRTdGFydCxMLm1vZGlmaWVkTGVuZ3RoKTtmb3IobGV0IGU9MTs7ZSsrKXt2YXIgaD1MLm9yaWdpbmFsU3RhcnQtZSxkPUwubW9kaWZpZWRTdGFydC1lO2lmKGg8dHx8ZDxyKWJyZWFrO2lmKGwmJiF0aGlzLk9yaWdpbmFsRWxlbWVudHNBcmVFcXVhbChoLGgrTC5vcmlnaW5hbExlbmd0aCkpYnJlYWs7aWYodSYmIXRoaXMuTW9kaWZpZWRFbGVtZW50c0FyZUVxdWFsKGQsZCtMLm1vZGlmaWVkTGVuZ3RoKSlicmVhaztkPShoPT09dCYmZD09PXI/NTowKSt0aGlzLl9ib3VuZGFyeVNjb3JlKGgsTC5vcmlnaW5hbExlbmd0aCxkLEwubW9kaWZpZWRMZW5ndGgpO2Q+aSYmKGk9ZCxuPWUpfUwub3JpZ2luYWxTdGFydC09bixMLm1vZGlmaWVkU3RhcnQtPW47dmFyIGM9W251bGxdOzA8ZSYmdGhpcy5DaGFuZ2VzT3ZlcmxhcChzW2UtMV0sc1tlXSxjKSYmKHNbZS0xXT1jWzBdLHMuc3BsaWNlKGUsMSksZSsrKX1pZih0aGlzLl9oYXNTdHJpbmdzKWZvcihsZXQgZT0xLHQ9cy5sZW5ndGg7ZTx0O2UrKyl7Y29uc3Qgdz1zW2UtMV0sTj1zW2VdO3ZhciBtPU4ub3JpZ2luYWxTdGFydC13Lm9yaWdpbmFsU3RhcnQtdy5vcmlnaW5hbExlbmd0aCxmPXcub3JpZ2luYWxTdGFydCxnPU4ub3JpZ2luYWxTdGFydCtOLm9yaWdpbmFsTGVuZ3RoLF89Zy1mLHA9dy5tb2RpZmllZFN0YXJ0LEM9Ti5tb2RpZmllZFN0YXJ0K04ubW9kaWZpZWRMZW5ndGgsYj1DLXA7bTw1JiZfPDIwJiZiPDIwJiYoKHA9dGhpcy5fZmluZEJldHRlckNvbnRpZ3VvdXNTZXF1ZW5jZShmLF8scCxiLG0pKSYmKFtiLHBdPXAsYj09PXcub3JpZ2luYWxTdGFydCt3Lm9yaWdpbmFsTGVuZ3RoJiZwPT09dy5tb2RpZmllZFN0YXJ0K3cubW9kaWZpZWRMZW5ndGh8fCh3Lm9yaWdpbmFsTGVuZ3RoPWItdy5vcmlnaW5hbFN0YXJ0LHcubW9kaWZpZWRMZW5ndGg9cC13Lm1vZGlmaWVkU3RhcnQsTi5vcmlnaW5hbFN0YXJ0PWIrbSxOLm1vZGlmaWVkU3RhcnQ9cCttLE4ub3JpZ2luYWxMZW5ndGg9Zy1OLm9yaWdpbmFsU3RhcnQsTi5tb2RpZmllZExlbmd0aD1DLU4ubW9kaWZpZWRTdGFydCkpKX1yZXR1cm4gc31fZmluZEJldHRlckNvbnRpZ3VvdXNTZXF1ZW5jZShlLHQscixuLGkpe2lmKHQ8aXx8bjxpKXJldHVybiBudWxsO3ZhciBzPWUrdC1pKzEsbz1yK24taSsxO2xldCBhPTAsbD0wLHU9MDtmb3IobGV0IHQ9ZTt0PHM7dCsrKWZvcihsZXQgZT1yO2U8bztlKyspe3ZhciBoPXRoaXMuX2NvbnRpZ3VvdXNTZXF1ZW5jZVNjb3JlKHQsZSxpKTswPGgmJmg+YSYmKGE9aCxsPXQsdT1lKX1yZXR1cm4gMDxhP1tsLHVdOm51bGx9X2NvbnRpZ3VvdXNTZXF1ZW5jZVNjb3JlKHQscixuKXtsZXQgaT0wO2ZvcihsZXQgZT0wO2U8bjtlKyspe2lmKCF0aGlzLkVsZW1lbnRzQXJlRXF1YWwodCtlLHIrZSkpcmV0dXJuIDA7aSs9dGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1t0K2VdLmxlbmd0aH1yZXR1cm4gaX1fT3JpZ2luYWxJc0JvdW5kYXJ5KGUpe3JldHVybiBlPD0wfHxlPj10aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoLmxlbmd0aC0xfHx0aGlzLl9oYXNTdHJpbmdzJiYvXlxzKiQvLnRlc3QodGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1tlXSl9X09yaWdpbmFsUmVnaW9uSXNCb3VuZGFyeShlLHQpe2lmKHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeShlKXx8dGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KGUtMSkpcmV0dXJuITA7aWYoMDx0KXt0PWUrdDtpZih0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkodC0xKXx8dGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KHQpKXJldHVybiEwfXJldHVybiExfV9Nb2RpZmllZElzQm91bmRhcnkoZSl7cmV0dXJuIGU8PTB8fGU+PXRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2gubGVuZ3RoLTF8fHRoaXMuX2hhc1N0cmluZ3MmJi9eXHMqJC8udGVzdCh0aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW2VdKX1fTW9kaWZpZWRSZWdpb25Jc0JvdW5kYXJ5KGUsdCl7aWYodGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KGUpfHx0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkoZS0xKSlyZXR1cm4hMDtpZigwPHQpe3Q9ZSt0O2lmKHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeSh0LTEpfHx0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkodCkpcmV0dXJuITB9cmV0dXJuITF9X2JvdW5kYXJ5U2NvcmUoZSx0LHIsbil7cmV0dXJuKHRoaXMuX09yaWdpbmFsUmVnaW9uSXNCb3VuZGFyeShlLHQpPzE6MCkrKHRoaXMuX01vZGlmaWVkUmVnaW9uSXNCb3VuZGFyeShyLG4pPzE6MCl9Q29uY2F0ZW5hdGVDaGFuZ2VzKGUsdCl7dmFyIHI9W107aWYoMD09PWUubGVuZ3RofHwwPT09dC5sZW5ndGgpcmV0dXJuIDA8dC5sZW5ndGg/dDplO2lmKHRoaXMuQ2hhbmdlc092ZXJsYXAoZVtlLmxlbmd0aC0xXSx0WzBdLHIpKXtjb25zdCBuPW5ldyBBcnJheShlLmxlbmd0aCt0Lmxlbmd0aC0xKTtyZXR1cm4gbmUuQ29weShlLDAsbiwwLGUubGVuZ3RoLTEpLG5bZS5sZW5ndGgtMV09clswXSxuZS5Db3B5KHQsMSxuLGUubGVuZ3RoLHQubGVuZ3RoLTEpLG59cj1uZXcgQXJyYXkoZS5sZW5ndGgrdC5sZW5ndGgpO3JldHVybiBuZS5Db3B5KGUsMCxyLDAsZS5sZW5ndGgpLG5lLkNvcHkodCwwLHIsZS5sZW5ndGgsdC5sZW5ndGgpLHJ9Q2hhbmdlc092ZXJsYXAocixuLGkpe2lmKHJlLkFzc2VydChyLm9yaWdpbmFsU3RhcnQ8PW4ub3JpZ2luYWxTdGFydCwiTGVmdCBjaGFuZ2UgaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byByaWdodCBjaGFuZ2UiKSxyZS5Bc3NlcnQoci5tb2RpZmllZFN0YXJ0PD1uLm1vZGlmaWVkU3RhcnQsIkxlZnQgY2hhbmdlIGlzIG5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcmlnaHQgY2hhbmdlIiksci5vcmlnaW5hbFN0YXJ0K3Iub3JpZ2luYWxMZW5ndGg+PW4ub3JpZ2luYWxTdGFydHx8ci5tb2RpZmllZFN0YXJ0K3IubW9kaWZpZWRMZW5ndGg+PW4ubW9kaWZpZWRTdGFydCl7dmFyIHM9ci5vcmlnaW5hbFN0YXJ0O2xldCBlPXIub3JpZ2luYWxMZW5ndGg7dmFyIG89ci5tb2RpZmllZFN0YXJ0O2xldCB0PXIubW9kaWZpZWRMZW5ndGg7cmV0dXJuIHIub3JpZ2luYWxTdGFydCtyLm9yaWdpbmFsTGVuZ3RoPj1uLm9yaWdpbmFsU3RhcnQmJihlPW4ub3JpZ2luYWxTdGFydCtuLm9yaWdpbmFsTGVuZ3RoLXIub3JpZ2luYWxTdGFydCksci5tb2RpZmllZFN0YXJ0K3IubW9kaWZpZWRMZW5ndGg+PW4ubW9kaWZpZWRTdGFydCYmKHQ9bi5tb2RpZmllZFN0YXJ0K24ubW9kaWZpZWRMZW5ndGgtci5tb2RpZmllZFN0YXJ0KSxpWzBdPW5ldyBYKHMsZSxvLHQpLCEwfXJldHVybiBpWzBdPW51bGwsITF9Q2xpcERpYWdvbmFsQm91bmQoZSx0LHIsbil7aWYoMDw9ZSYmZTxuKXJldHVybiBlO3Q9dCUyPT0wO3JldHVybiBlPDA/dD09KHIlMj09MCk/MDoxOnQ9PSgobi1yLTEpJTI9PTApP24tMTpuLTJ9fWxldCBvZTtpZih2b2lkIDAhPT1MLnZzY29kZSYmdm9pZCAwIT09TC52c2NvZGUucHJvY2Vzcyl7Y29uc3QgbzE9TC52c2NvZGUucHJvY2VzcztvZT17Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIG8xLnBsYXRmb3JtfSxnZXQgYXJjaCgpe3JldHVybiBvMS5hcmNofSxnZXQgZW52KCl7cmV0dXJuIG8xLmVudn0sY3dkKCl7cmV0dXJuIG8xLmN3ZCgpfX19ZWxzZSBvZT0idW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3M/e2dldCBwbGF0Zm9ybSgpe3JldHVybiBwcm9jZXNzLnBsYXRmb3JtfSxnZXQgYXJjaCgpe3JldHVybiBwcm9jZXNzLmFyY2h9LGdldCBlbnYoKXtyZXR1cm4gcHJvY2Vzcy5lbnZ9LGN3ZCgpe3JldHVybiBwcm9jZXNzLmVudi5WU0NPREVfQ1dEfHxwcm9jZXNzLmN3ZCgpfX06e2dldCBwbGF0Zm9ybSgpe3JldHVybiBFPyJ3aW4zMiI6QT8iZGFyd2luIjoibGludXgifSxnZXQgYXJjaCgpe30sZ2V0IGVudigpe3JldHVybnt9fSxjd2QoKXtyZXR1cm4iLyJ9fTtjb25zdCBhZT1vZS5jd2QsbGU9b2UuZW52O3ZhciB1ZSxoZSxkZSxjZSxtZSxmZSxnZSxfZSxwZSxDZSxTPW9lLnBsYXRmb3JtO2NsYXNzIGJlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LHIpe2xldCBuOyJzdHJpbmciPT10eXBlb2YgdCYmMD09PXQuaW5kZXhPZigibm90ICIpPyhuPSJtdXN0IG5vdCBiZSIsdD10LnJlcGxhY2UoL15ub3QgLywiIikpOm49Im11c3QgYmUiO3ZhciBpPS0xIT09ZS5pbmRleE9mKCIuIik/InByb3BlcnR5IjoiYXJndW1lbnQiLHQ9YFRoZSAiJHtlfSIgJHtpfSAke259IG9mIHR5cGUgYCt0O3N1cGVyKHQrPSIuIFJlY2VpdmVkIHR5cGUgIit0eXBlb2YgciksdGhpcy5jb2RlPSJFUlJfSU5WQUxJRF9BUkdfVFlQRSJ9fWZ1bmN0aW9uIHZlKGUsdCl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBiZSh0LCJzdHJpbmciLGUpfWZ1bmN0aW9uIExlKGUpe3JldHVybiA0Nz09PWV8fDkyPT09ZX1mdW5jdGlvbiB3ZShlKXtyZXR1cm4gNDc9PT1lfWZ1bmN0aW9uIE5lKGUpe3JldHVybiA2NTw9ZSYmZTw9OTB8fDk3PD1lJiZlPD0xMjJ9ZnVuY3Rpb24gU2UodCxyLG4saSl7bGV0IHM9IiIsbz0wLGE9LTEsbD0wLHU9MDtmb3IobGV0IGU9MDtlPD10Lmxlbmd0aDsrK2Upe2lmKGU8dC5sZW5ndGgpdT10LmNoYXJDb2RlQXQoZSk7ZWxzZXtpZihpKHUpKWJyZWFrO3U9NDd9aWYoaSh1KSl7aWYoYSE9PWUtMSYmMSE9PWwpaWYoMj09PWwpe2lmKHMubGVuZ3RoPDJ8fDIhPT1vfHw0NiE9PXMuY2hhckNvZGVBdChzLmxlbmd0aC0xKXx8NDYhPT1zLmNoYXJDb2RlQXQocy5sZW5ndGgtMikpe2lmKDI8cy5sZW5ndGgpe3ZhciBoPXMubGFzdEluZGV4T2Yobik7bz0tMT09PWg/KHM9IiIsMCk6KHM9cy5zbGljZSgwLGgpLHMubGVuZ3RoLTEtcy5sYXN0SW5kZXhPZihuKSksYT1lLGw9MDtjb250aW51ZX1pZigwIT09cy5sZW5ndGgpe3M9IiIsbz0wLGE9ZSxsPTA7Y29udGludWV9fXImJihzKz0wPHMubGVuZ3RoP24rIi4uIjoiLi4iLG89Mil9ZWxzZSAwPHMubGVuZ3RoP3MrPSIiK24rdC5zbGljZShhKzEsZSk6cz10LnNsaWNlKGErMSxlKSxvPWUtYS0xO2E9ZSxsPTB9ZWxzZSA0Nj09PXUmJi0xIT09bD8rK2w6bD0tMX1yZXR1cm4gc31mdW5jdGlvbiB5ZShlLHQpe2lmKG51bGw9PT10fHwib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IGJlKCJwYXRoT2JqZWN0IiwiT2JqZWN0Iix0KTt2YXIgcj10LmRpcnx8dC5yb290LG49dC5iYXNlfHwiIisodC5uYW1lfHwiIikrKHQuZXh0fHwiIik7cmV0dXJuIHI/cj09PXQucm9vdD8iIityK246IiIrcitlK246bn1jb25zdCBFZT17cmVzb2x2ZSguLi5zKXtsZXQgbz0iIixhPSIiLGw9ITE7Zm9yKGxldCB0PXMubGVuZ3RoLTE7LTE8PXQ7dC0tKXtsZXQgcjtpZigwPD10KXtpZihyPXNbdF0sdmUociwicGF0aCIpLDA9PT1yLmxlbmd0aCljb250aW51ZX1lbHNlIDA9PT1vLmxlbmd0aD9yPWFlKCk6KHI9bGVbIj0iK29dfHxhZSgpLCh2b2lkIDA9PT1yfHxyLnNsaWNlKDAsMikudG9Mb3dlckNhc2UoKSE9PW8udG9Mb3dlckNhc2UoKSYmOTI9PT1yLmNoYXJDb2RlQXQoMikpJiYocj1vKyJcXCIpKTt2YXIgdT1yLmxlbmd0aDtsZXQgbj0wLGk9IiIsZT0hMTt2YXIgaD1yLmNoYXJDb2RlQXQoMCk7aWYoMT09PXUpTGUoaCkmJihuPTEsZT0hMCk7ZWxzZSBpZihMZShoKSlpZihlPSEwLExlKHIuY2hhckNvZGVBdCgxKSkpe2xldCBlPTIsdD1lO2Zvcig7ZTx1JiYhTGUoci5jaGFyQ29kZUF0KGUpKTspZSsrO2lmKGU8dSYmZSE9PXQpe3ZhciBkPXIuc2xpY2UodCxlKTtmb3IodD1lO2U8dSYmTGUoci5jaGFyQ29kZUF0KGUpKTspZSsrO2lmKGU8dSYmZSE9PXQpe2Zvcih0PWU7ZTx1JiYhTGUoci5jaGFyQ29kZUF0KGUpKTspZSsrO2UhPT11JiZlPT09dHx8KGk9YFxcXFwke2R9XFxgK3Iuc2xpY2UodCxlKSxuPWUpfX19ZWxzZSBuPTE7ZWxzZSBOZShoKSYmNTg9PT1yLmNoYXJDb2RlQXQoMSkmJihpPXIuc2xpY2UoMCwyKSwobj0yKTx1JiZMZShyLmNoYXJDb2RlQXQoMikpJiYoZT0hMCxuPTMpKTtpZigwPGkubGVuZ3RoKWlmKDA8by5sZW5ndGgpe2lmKGkudG9Mb3dlckNhc2UoKSE9PW8udG9Mb3dlckNhc2UoKSljb250aW51ZX1lbHNlIG89aTtpZihsKXtpZigwPG8ubGVuZ3RoKWJyZWFrfWVsc2UgaWYoYT1yLnNsaWNlKG4pKyJcXCIrYSxsPWUsZSYmMDxvLmxlbmd0aClicmVha31yZXR1cm4gYT1TZShhLCFsLCJcXCIsTGUpLGw/bysiXFwiK2E6IiIrbythfHwiLiJ9LG5vcm1hbGl6ZShyKXt2ZShyLCJwYXRoIik7dmFyIG49ci5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIi4iO2xldCBpPTAscyxlPSExO3ZhciB0PXIuY2hhckNvZGVBdCgwKTtpZigxPT09bilyZXR1cm4gd2UodCk/IlxcIjpyO2lmKExlKHQpKWlmKGU9ITAsTGUoci5jaGFyQ29kZUF0KDEpKSl7bGV0IGU9Mix0PWU7Zm9yKDtlPG4mJiFMZShyLmNoYXJDb2RlQXQoZSkpOyllKys7aWYoZTxuJiZlIT09dCl7dmFyIG89ci5zbGljZSh0LGUpO2Zvcih0PWU7ZTxuJiZMZShyLmNoYXJDb2RlQXQoZSkpOyllKys7aWYoZTxuJiZlIT09dCl7Zm9yKHQ9ZTtlPG4mJiFMZShyLmNoYXJDb2RlQXQoZSkpOyllKys7aWYoZT09PW4pcmV0dXJuYFxcXFwke299XFwke3Iuc2xpY2UodCl9XFxgO2UhPT10JiYocz1gXFxcXCR7b31cXGArci5zbGljZSh0LGUpLGk9ZSl9fX1lbHNlIGk9MTtlbHNlIE5lKHQpJiY1OD09PXIuY2hhckNvZGVBdCgxKSYmKHM9ci5zbGljZSgwLDIpLChpPTIpPG4mJkxlKHIuY2hhckNvZGVBdCgyKSkmJihlPSEwLGk9MykpO2xldCBhPWk8bj9TZShyLnNsaWNlKGkpLCFlLCJcXCIsTGUpOiIiO3JldHVybiAwIT09YS5sZW5ndGh8fGV8fChhPSIuIiksMDxhLmxlbmd0aCYmTGUoci5jaGFyQ29kZUF0KG4tMSkpJiYoYSs9IlxcIiksdm9pZCAwPT09cz9lPyJcXCIrYTphOmU/cysiXFwiK2E6IiIrcythfSxpc0Fic29sdXRlKGUpe3ZlKGUsInBhdGgiKTt2YXIgdD1lLmxlbmd0aDtpZigwPT09dClyZXR1cm4hMTt2YXIgcj1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIExlKHIpfHwyPHQmJk5lKHIpJiY1OD09PWUuY2hhckNvZGVBdCgxKSYmTGUoZS5jaGFyQ29kZUF0KDIpKX0sam9pbiguLi50KXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIi4iO2xldCByLG47Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDsrK2Upe3ZhciBpPXRbZV07dmUoaSwicGF0aCIpLDA8aS5sZW5ndGgmJih2b2lkIDA9PT1yP3I9bj1pOnIrPSJcXCIraSl9aWYodm9pZCAwPT09cilyZXR1cm4iLiI7bGV0IGU9ITAscz0wO3ZhciBvO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmTGUobi5jaGFyQ29kZUF0KDApKSYmKCsrcywxPChvPW4ubGVuZ3RoKSYmTGUobi5jaGFyQ29kZUF0KDEpKSYmKCsrcywyPG8mJihMZShuLmNoYXJDb2RlQXQoMikpPysrczplPSExKSkpLGUpe2Zvcig7czxyLmxlbmd0aCYmTGUoci5jaGFyQ29kZUF0KHMpKTspcysrOzI8PXMmJihyPSJcXCIrci5zbGljZShzKSl9cmV0dXJuIEVlLm5vcm1hbGl6ZShyKX0scmVsYXRpdmUoZSx0KXtpZih2ZShlLCJmcm9tIiksdmUodCwidG8iKSxlPT09dClyZXR1cm4iIjtjb25zdCByPUVlLnJlc29sdmUoZSksbj1FZS5yZXNvbHZlKHQpO2lmKHI9PT1uKXJldHVybiIiO2lmKChlPXIudG9Mb3dlckNhc2UoKSk9PT0odD1uLnRvTG93ZXJDYXNlKCkpKXJldHVybiIiO2xldCBpPTA7Zm9yKDtpPGUubGVuZ3RoJiY5Mj09PWUuY2hhckNvZGVBdChpKTspaSsrO2xldCBzPWUubGVuZ3RoO2Zvcig7cy0xPmkmJjkyPT09ZS5jaGFyQ29kZUF0KHMtMSk7KXMtLTt2YXIgbz1zLWk7bGV0IGE9MDtmb3IoO2E8dC5sZW5ndGgmJjkyPT09dC5jaGFyQ29kZUF0KGEpOylhKys7bGV0IGw9dC5sZW5ndGg7Zm9yKDtsLTE+YSYmOTI9PT10LmNoYXJDb2RlQXQobC0xKTspbC0tO3ZhciB1PWwtYSxoPW88dT9vOnU7bGV0IGQ9LTEsYz0wO2Zvcig7YzxoO2MrKyl7dmFyIG09ZS5jaGFyQ29kZUF0KGkrYyk7aWYobSE9PXQuY2hhckNvZGVBdChhK2MpKWJyZWFrOzkyPT09bSYmKGQ9Yyl9aWYoYyE9PWgpe2lmKC0xPT09ZClyZXR1cm4gbn1lbHNle2lmKGg8dSl7aWYoOTI9PT10LmNoYXJDb2RlQXQoYStjKSlyZXR1cm4gbi5zbGljZShhK2MrMSk7aWYoMj09PWMpcmV0dXJuIG4uc2xpY2UoYStjKX1oPG8mJig5Mj09PWUuY2hhckNvZGVBdChpK2MpP2Q9YzoyPT09YyYmKGQ9MykpLC0xPT09ZCYmKGQ9MCl9bGV0IGY9IiI7Zm9yKGM9aStkKzE7Yzw9czsrK2MpYyE9PXMmJjkyIT09ZS5jaGFyQ29kZUF0KGMpfHwoZis9MD09PWYubGVuZ3RoPyIuLiI6IlxcLi4iKTtyZXR1cm4gYSs9ZCwwPGYubGVuZ3RoPyIiK2Yrbi5zbGljZShhLGwpOig5Mj09PW4uY2hhckNvZGVBdChhKSYmKythLG4uc2xpY2UoYSxsKSl9LHRvTmFtZXNwYWNlZFBhdGgoZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4iIjtjb25zdCB0PUVlLnJlc29sdmUoZSk7aWYodC5sZW5ndGg8PTIpcmV0dXJuIGU7aWYoOTI9PT10LmNoYXJDb2RlQXQoMCkpe2lmKDkyPT09dC5jaGFyQ29kZUF0KDEpKXt2YXIgcj10LmNoYXJDb2RlQXQoMik7aWYoNjMhPT1yJiY0NiE9PXIpcmV0dXJuIlxcXFw/XFxVTkNcXCIrdC5zbGljZSgyKX19ZWxzZSBpZihOZSh0LmNoYXJDb2RlQXQoMCkpJiY1OD09PXQuY2hhckNvZGVBdCgxKSYmOTI9PT10LmNoYXJDb2RlQXQoMikpcmV0dXJuIlxcXFw/XFwiK3Q7cmV0dXJuIGV9LGRpcm5hbWUocil7dmUociwicGF0aCIpO3ZhciBuPXIubGVuZ3RoO2lmKDA9PT1uKXJldHVybiIuIjtsZXQgaT0tMSxzPTA7dmFyIGU9ci5jaGFyQ29kZUF0KDApO2lmKDE9PT1uKXJldHVybiBMZShlKT9yOiIuIjtpZihMZShlKSl7aWYoaT1zPTEsTGUoci5jaGFyQ29kZUF0KDEpKSl7bGV0IGU9Mix0PWU7Zm9yKDtlPG4mJiFMZShyLmNoYXJDb2RlQXQoZSkpOyllKys7aWYoZTxuJiZlIT09dCl7Zm9yKHQ9ZTtlPG4mJkxlKHIuY2hhckNvZGVBdChlKSk7KWUrKztpZihlPG4mJmUhPT10KXtmb3IodD1lO2U8biYmIUxlKHIuY2hhckNvZGVBdChlKSk7KWUrKztpZihlPT09bilyZXR1cm4gcjtlIT09dCYmKGk9cz1lKzEpfX19fWVsc2UgTmUoZSkmJjU4PT09ci5jaGFyQ29kZUF0KDEpJiYoaT0yPG4mJkxlKHIuY2hhckNvZGVBdCgyKSk/MzoyLHM9aSk7bGV0IHQ9LTEsbz0hMDtmb3IobGV0IGU9bi0xO2U+PXM7LS1lKWlmKExlKHIuY2hhckNvZGVBdChlKSkpe2lmKCFvKXt0PWU7YnJlYWt9fWVsc2Ugbz0hMTtpZigtMT09PXQpe2lmKC0xPT09aSlyZXR1cm4iLiI7dD1pfXJldHVybiByLnNsaWNlKDAsdCl9LGJhc2VuYW1lKHIsbil7dm9pZCAwIT09biYmdmUobiwiZXh0IiksdmUociwicGF0aCIpO2xldCBpPTAscz0tMSxvPSEwLGE7aWYoMjw9ci5sZW5ndGgmJk5lKHIuY2hhckNvZGVBdCgwKSkmJjU4PT09ci5jaGFyQ29kZUF0KDEpJiYoaT0yKSx2b2lkIDAhPT1uJiYwPG4ubGVuZ3RoJiZuLmxlbmd0aDw9ci5sZW5ndGgpe2lmKG49PT1yKXJldHVybiIiO2xldCBlPW4ubGVuZ3RoLTEsdD0tMTtmb3IoYT1yLmxlbmd0aC0xO2E+PWk7LS1hKXt2YXIgbD1yLmNoYXJDb2RlQXQoYSk7aWYoTGUobCkpe2lmKCFvKXtpPWErMTticmVha319ZWxzZS0xPT09dCYmKG89ITEsdD1hKzEpLDA8PWUmJihsPT09bi5jaGFyQ29kZUF0KGUpPy0xPT0tLWUmJihzPWEpOihlPS0xLHM9dCkpfXJldHVybiBpPT09cz9zPXQ6LTE9PT1zJiYocz1yLmxlbmd0aCksci5zbGljZShpLHMpfWZvcihhPXIubGVuZ3RoLTE7YT49aTstLWEpaWYoTGUoci5jaGFyQ29kZUF0KGEpKSl7aWYoIW8pe2k9YSsxO2JyZWFrfX1lbHNlLTE9PT1zJiYobz0hMSxzPWErMSk7cmV0dXJuLTE9PT1zPyIiOnIuc2xpY2UoaSxzKX0sZXh0bmFtZSh0KXt2ZSh0LCJwYXRoIik7bGV0IHI9MCxuPS0xLGk9MCxzPS0xLG89ITAsYT0wOzI8PXQubGVuZ3RoJiY1OD09PXQuY2hhckNvZGVBdCgxKSYmTmUodC5jaGFyQ29kZUF0KDApKSYmKHI9aT0yKTtmb3IobGV0IGU9dC5sZW5ndGgtMTtlPj1yOy0tZSl7dmFyIGw9dC5jaGFyQ29kZUF0KGUpO2lmKExlKGwpKXtpZihvKWNvbnRpbnVlO2k9ZSsxO2JyZWFrfS0xPT09cyYmKG89ITEscz1lKzEpLDQ2PT09bD8tMT09PW4/bj1lOjEhPT1hJiYoYT0xKTotMSE9PW4mJihhPS0xKX1yZXR1cm4tMT09PW58fC0xPT09c3x8MD09PWF8fDE9PT1hJiZuPT09cy0xJiZuPT09aSsxPyIiOnQuc2xpY2UobixzKX0sZm9ybWF0OnllLmJpbmQobnVsbCwiXFwiKSxwYXJzZShyKXt2ZShyLCJwYXRoIik7Y29uc3QgZT17cm9vdDoiIixkaXI6IiIsYmFzZToiIixleHQ6IiIsbmFtZToiIn07aWYoMD09PXIubGVuZ3RoKXJldHVybiBlO3ZhciBuPXIubGVuZ3RoO2xldCBpPTAsdD1yLmNoYXJDb2RlQXQoMCk7aWYoMT09PW4pcmV0dXJuIExlKHQpP2Uucm9vdD1lLmRpcj1yOmUuYmFzZT1lLm5hbWU9cixlO2lmKExlKHQpKXtpZihpPTEsTGUoci5jaGFyQ29kZUF0KDEpKSl7bGV0IGU9Mix0PWU7Zm9yKDtlPG4mJiFMZShyLmNoYXJDb2RlQXQoZSkpOyllKys7aWYoZTxuJiZlIT09dCl7Zm9yKHQ9ZTtlPG4mJkxlKHIuY2hhckNvZGVBdChlKSk7KWUrKztpZihlPG4mJmUhPT10KXtmb3IodD1lO2U8biYmIUxlKHIuY2hhckNvZGVBdChlKSk7KWUrKztlPT09bj9pPWU6ZSE9PXQmJihpPWUrMSl9fX19ZWxzZSBpZihOZSh0KSYmNTg9PT1yLmNoYXJDb2RlQXQoMSkpe2lmKG48PTIpcmV0dXJuIGUucm9vdD1lLmRpcj1yLGU7aWYoaT0yLExlKHIuY2hhckNvZGVBdCgyKSkpe2lmKDM9PT1uKXJldHVybiBlLnJvb3Q9ZS5kaXI9cixlO2k9M319MDxpJiYoZS5yb290PXIuc2xpY2UoMCxpKSk7bGV0IHM9LTEsbz1pLGE9LTEsbD0hMCx1PXIubGVuZ3RoLTEsaD0wO2Zvcig7dT49aTstLXUpe2lmKHQ9ci5jaGFyQ29kZUF0KHUpLExlKHQpKXtpZihsKWNvbnRpbnVlO289dSsxO2JyZWFrfS0xPT09YSYmKGw9ITEsYT11KzEpLDQ2PT09dD8tMT09PXM/cz11OjEhPT1oJiYoaD0xKTotMSE9PXMmJihoPS0xKX1yZXR1cm4tMSE9PWEmJigtMT09PXN8fDA9PT1ofHwxPT09aCYmcz09PWEtMSYmcz09PW8rMT9lLmJhc2U9ZS5uYW1lPXIuc2xpY2UobyxhKTooZS5uYW1lPXIuc2xpY2UobyxzKSxlLmJhc2U9ci5zbGljZShvLGEpLGUuZXh0PXIuc2xpY2UocyxhKSkpLDA8byYmbyE9PWk/ZS5kaXI9ci5zbGljZSgwLG8tMSk6ZS5kaXI9ZS5yb290LGV9LHNlcDoiXFwiLGRlbGltaXRlcjoiOyIsd2luMzI6bnVsbCxwb3NpeDpudWxsfSxBZT17cmVzb2x2ZSguLi50KXtsZXQgcj0iIixuPSExO2ZvcihsZXQgZT10Lmxlbmd0aC0xOy0xPD1lJiYhbjtlLS0pe2NvbnN0IGk9MDw9ZT90W2VdOmFlKCk7dmUoaSwicGF0aCIpLDAhPT1pLmxlbmd0aCYmKHI9aSsiLyIrcixuPTQ3PT09aS5jaGFyQ29kZUF0KDApKX1yZXR1cm4gcj1TZShyLCFuLCIvIix3ZSksbj8iLyIrcjowPHIubGVuZ3RoP3I6Ii4ifSxub3JtYWxpemUoZSl7aWYodmUoZSwicGF0aCIpLDA9PT1lLmxlbmd0aClyZXR1cm4iLiI7dmFyIHQ9NDc9PT1lLmNoYXJDb2RlQXQoMCkscj00Nz09PWUuY2hhckNvZGVBdChlLmxlbmd0aC0xKTtyZXR1cm4gMD09PShlPVNlKGUsIXQsIi8iLHdlKSkubGVuZ3RoP3Q/Ii8iOnI/Ii4vIjoiLiI6KHImJihlKz0iLyIpLHQ/Ii8iK2U6ZSl9LGlzQWJzb2x1dGUoZSl7cmV0dXJuIHZlKGUsInBhdGgiKSwwPGUubGVuZ3RoJiY0Nz09PWUuY2hhckNvZGVBdCgwKX0sam9pbiguLi50KXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIi4iO2xldCByO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXt2YXIgbj10W2VdO3ZlKG4sInBhdGgiKSwwPG4ubGVuZ3RoJiYodm9pZCAwPT09cj9yPW46cis9Ii8iK24pfXJldHVybiB2b2lkIDA9PT1yPyIuIjpBZS5ub3JtYWxpemUocil9LHJlbGF0aXZlKGUsdCl7aWYodmUoZSwiZnJvbSIpLHZlKHQsInRvIiksZT09PXQpcmV0dXJuIiI7aWYoKGU9QWUucmVzb2x2ZShlKSk9PT0odD1BZS5yZXNvbHZlKHQpKSlyZXR1cm4iIjt2YXIgcj1lLmxlbmd0aCxuPXItMSxpPXQubGVuZ3RoLTEscz1uPGk/bjppO2xldCBvPS0xLGE9MDtmb3IoO2E8czthKyspe3ZhciBsPWUuY2hhckNvZGVBdCgxK2EpO2lmKGwhPT10LmNoYXJDb2RlQXQoMSthKSlicmVhazs0Nz09PWwmJihvPWEpfWlmKGE9PT1zKWlmKHM8aSl7aWYoNDc9PT10LmNoYXJDb2RlQXQoMSthKSlyZXR1cm4gdC5zbGljZSgxK2ErMSk7aWYoMD09PWEpcmV0dXJuIHQuc2xpY2UoMSthKX1lbHNlIHM8biYmKDQ3PT09ZS5jaGFyQ29kZUF0KDErYSk/bz1hOjA9PT1hJiYobz0wKSk7bGV0IHU9IiI7Zm9yKGE9MStvKzE7YTw9cjsrK2EpYSE9PXImJjQ3IT09ZS5jaGFyQ29kZUF0KGEpfHwodSs9MD09PXUubGVuZ3RoPyIuLiI6Ii8uLiIpO3JldHVybiIiK3UrdC5zbGljZSgxK28pfSx0b05hbWVzcGFjZWRQYXRoKGUpe3JldHVybiBlfSxkaXJuYW1lKHQpe2lmKHZlKHQsInBhdGgiKSwwPT09dC5sZW5ndGgpcmV0dXJuIi4iO3ZhciBlPTQ3PT09dC5jaGFyQ29kZUF0KDApO2xldCByPS0xLG49ITA7Zm9yKGxldCBlPXQubGVuZ3RoLTE7MTw9ZTstLWUpaWYoNDc9PT10LmNoYXJDb2RlQXQoZSkpe2lmKCFuKXtyPWU7YnJlYWt9fWVsc2Ugbj0hMTtyZXR1cm4tMT09PXI/ZT8iLyI6Ii4iOmUmJjE9PT1yPyIvLyI6dC5zbGljZSgwLHIpfSxiYXNlbmFtZShyLG4pe3ZvaWQgMCE9PW4mJnZlKG4sImV4dCIpLHZlKHIsInBhdGgiKTtsZXQgaT0wLHM9LTEsbz0hMCxhO2lmKHZvaWQgMCE9PW4mJjA8bi5sZW5ndGgmJm4ubGVuZ3RoPD1yLmxlbmd0aCl7aWYobj09PXIpcmV0dXJuIiI7bGV0IGU9bi5sZW5ndGgtMSx0PS0xO2ZvcihhPXIubGVuZ3RoLTE7MDw9YTstLWEpe3ZhciBsPXIuY2hhckNvZGVBdChhKTtpZig0Nz09PWwpe2lmKCFvKXtpPWErMTticmVha319ZWxzZS0xPT09dCYmKG89ITEsdD1hKzEpLDA8PWUmJihsPT09bi5jaGFyQ29kZUF0KGUpPy0xPT0tLWUmJihzPWEpOihlPS0xLHM9dCkpfXJldHVybiBpPT09cz9zPXQ6LTE9PT1zJiYocz1yLmxlbmd0aCksci5zbGljZShpLHMpfWZvcihhPXIubGVuZ3RoLTE7MDw9YTstLWEpaWYoNDc9PT1yLmNoYXJDb2RlQXQoYSkpe2lmKCFvKXtpPWErMTticmVha319ZWxzZS0xPT09cyYmKG89ITEscz1hKzEpO3JldHVybi0xPT09cz8iIjpyLnNsaWNlKGkscyl9LGV4dG5hbWUodCl7dmUodCwicGF0aCIpO2xldCByPS0xLG49MCxpPS0xLHM9ITAsbz0wO2ZvcihsZXQgZT10Lmxlbmd0aC0xOzA8PWU7LS1lKXt2YXIgYT10LmNoYXJDb2RlQXQoZSk7aWYoNDc9PT1hKXtpZihzKWNvbnRpbnVlO249ZSsxO2JyZWFrfS0xPT09aSYmKHM9ITEsaT1lKzEpLDQ2PT09YT8tMT09PXI/cj1lOjEhPT1vJiYobz0xKTotMSE9PXImJihvPS0xKX1yZXR1cm4tMT09PXJ8fC0xPT09aXx8MD09PW98fDE9PT1vJiZyPT09aS0xJiZyPT09bisxPyIiOnQuc2xpY2UocixpKX0sZm9ybWF0OnllLmJpbmQobnVsbCwiLyIpLHBhcnNlKGUpe3ZlKGUsInBhdGgiKTtjb25zdCB0PXtyb290OiIiLGRpcjoiIixiYXNlOiIiLGV4dDoiIixuYW1lOiIifTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHQ7dmFyIHI9NDc9PT1lLmNoYXJDb2RlQXQoMCk7bGV0IG47bj1yPyh0LnJvb3Q9Ii8iLDEpOjA7bGV0IGk9LTEscz0wLG89LTEsYT0hMCxsPWUubGVuZ3RoLTEsdT0wO2Zvcig7bD49bjstLWwpe3ZhciBoPWUuY2hhckNvZGVBdChsKTtpZig0Nz09PWgpe2lmKGEpY29udGludWU7cz1sKzE7YnJlYWt9LTE9PT1vJiYoYT0hMSxvPWwrMSksNDY9PT1oPy0xPT09aT9pPWw6MSE9PXUmJih1PTEpOi0xIT09aSYmKHU9LTEpfWlmKC0xIT09byl7Y29uc3Qgbj0wPT09cyYmcj8xOnM7LTE9PT1pfHwwPT09dXx8MT09PXUmJmk9PT1vLTEmJmk9PT1zKzE/dC5iYXNlPXQubmFtZT1lLnNsaWNlKG4sbyk6KHQubmFtZT1lLnNsaWNlKG4saSksdC5iYXNlPWUuc2xpY2UobixvKSx0LmV4dD1lLnNsaWNlKGksbykpfXJldHVybiAwPHM/dC5kaXI9ZS5zbGljZSgwLHMtMSk6ciYmKHQuZGlyPSIvIiksdH0sc2VwOiIvIixkZWxpbWl0ZXI6IjoiLHdpbjMyOm51bGwscG9zaXg6bnVsbH07QWUud2luMzI9RWUud2luMzI9RWUsQWUucG9zaXg9RWUucG9zaXg9QWUsKCJ3aW4zMiI9PT1TP0VlOkFlKS5ub3JtYWxpemUsKCJ3aW4zMiI9PT1TP0VlOkFlKS5yZXNvbHZlLCgid2luMzIiPT09Uz9FZTpBZSkucmVsYXRpdmUsKCJ3aW4zMiI9PT1TP0VlOkFlKS5kaXJuYW1lLCgid2luMzIiPT09Uz9FZTpBZSkuYmFzZW5hbWUsKCJ3aW4zMiI9PT1TP0VlOkFlKS5leHRuYW1lLCgid2luMzIiPT09Uz9FZTpBZSkuc2VwO2NvbnN0IE1lPS9eXHdbXHdcZCsuLV0qJC8seGU9L15cLy8sS2U9L15cL1wvLztmdW5jdGlvbiBWZShlLHQpe2lmKCFlLnNjaGVtZSYmdCl0aHJvdyBuZXcgRXJyb3IoYFtVcmlFcnJvcl06IFNjaGVtZSBpcyBtaXNzaW5nOiB7c2NoZW1lOiAiIiwgYXV0aG9yaXR5OiAiJHtlLmF1dGhvcml0eX0iLCBwYXRoOiAiJHtlLnBhdGh9IiwgcXVlcnk6ICIke2UucXVlcnl9IiwgZnJhZ21lbnQ6ICIke2UuZnJhZ21lbnR9In1gKTtpZihlLnNjaGVtZSYmIU1lLnRlc3QoZS5zY2hlbWUpKXRocm93IG5ldyBFcnJvcigiW1VyaUVycm9yXTogU2NoZW1lIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycy4iKTtpZihlLnBhdGgpaWYoZS5hdXRob3JpdHkpe2lmKCF4ZS50ZXN0KGUucGF0aCkpdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBjb250YWlucyBhbiBhdXRob3JpdHkgY29tcG9uZW50LCB0aGVuIHRoZSBwYXRoIGNvbXBvbmVudCBtdXN0IGVpdGhlciBiZSBlbXB0eSBvciBiZWdpbiB3aXRoIGEgc2xhc2ggKCIvIikgY2hhcmFjdGVyJyl9ZWxzZSBpZihLZS50ZXN0KGUucGF0aCkpdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY2Fubm90IGJlZ2luIHdpdGggdHdvIHNsYXNoIGNoYXJhY3RlcnMgKCIvLyIpJyl9Y29uc3QgSWU9Ii8iLFBlPS9eKChbXjovPyNdKz8pOik/KFwvXC8oW14vPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT8vO2NsYXNzIFJle2NvbnN0cnVjdG9yKGUsdCxyLG4saSxzPSExKXt2YXIgbzsib2JqZWN0Ij09dHlwZW9mIGU/KHRoaXMuc2NoZW1lPWUuc2NoZW1lfHwiIix0aGlzLmF1dGhvcml0eT1lLmF1dGhvcml0eXx8IiIsdGhpcy5wYXRoPWUucGF0aHx8IiIsdGhpcy5xdWVyeT1lLnF1ZXJ5fHwiIix0aGlzLmZyYWdtZW50PWUuZnJhZ21lbnR8fCIiKToodGhpcy5zY2hlbWU9KG89cywoZT1lKXx8bz9lOiJmaWxlIiksdGhpcy5hdXRob3JpdHk9dHx8IiIsdGhpcy5wYXRoPWZ1bmN0aW9uKGUsdCl7c3dpdGNoKGUpe2Nhc2UiaHR0cHMiOmNhc2UiaHR0cCI6Y2FzZSJmaWxlIjp0P3RbMF0hPT1JZSYmKHQ9SWUrdCk6dD1JZX1yZXR1cm4gdH0odGhpcy5zY2hlbWUscnx8IiIpLHRoaXMucXVlcnk9bnx8IiIsdGhpcy5mcmFnbWVudD1pfHwiIixWZSh0aGlzLHMpKX1zdGF0aWMgaXNVcmkoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBSZXx8ISFlJiYoInN0cmluZyI9PXR5cGVvZiBlLmF1dGhvcml0eSYmInN0cmluZyI9PXR5cGVvZiBlLmZyYWdtZW50JiYic3RyaW5nIj09dHlwZW9mIGUucGF0aCYmInN0cmluZyI9PXR5cGVvZiBlLnF1ZXJ5JiYic3RyaW5nIj09dHlwZW9mIGUuc2NoZW1lJiYic3RyaW5nIj09dHlwZW9mIGUuZnNQYXRoJiYiZnVuY3Rpb24iPT10eXBlb2YgZS53aXRoJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50b1N0cmluZyl9Z2V0IGZzUGF0aCgpe3JldHVybiBVZSh0aGlzLCExKX13aXRoKGUpe2lmKCFlKXJldHVybiB0aGlzO2xldHtzY2hlbWU6dCxhdXRob3JpdHk6cixwYXRoOm4scXVlcnk6aSxmcmFnbWVudDpzfT1lO3JldHVybiB2b2lkIDA9PT10P3Q9dGhpcy5zY2hlbWU6bnVsbD09PXQmJih0PSIiKSx2b2lkIDA9PT1yP3I9dGhpcy5hdXRob3JpdHk6bnVsbD09PXImJihyPSIiKSx2b2lkIDA9PT1uP249dGhpcy5wYXRoOm51bGw9PT1uJiYobj0iIiksdm9pZCAwPT09aT9pPXRoaXMucXVlcnk6bnVsbD09PWkmJihpPSIiKSx2b2lkIDA9PT1zP3M9dGhpcy5mcmFnbWVudDpudWxsPT09cyYmKHM9IiIpLHQ9PT10aGlzLnNjaGVtZSYmcj09PXRoaXMuYXV0aG9yaXR5JiZuPT09dGhpcy5wYXRoJiZpPT09dGhpcy5xdWVyeSYmcz09PXRoaXMuZnJhZ21lbnQ/dGhpczpuZXcgRGUodCxyLG4saSxzKX1zdGF0aWMgcGFyc2UoZSx0PSExKXtlPVBlLmV4ZWMoZSk7cmV0dXJuIGU/bmV3IERlKGVbMl18fCIiLEhlKGVbNF18fCIiKSxIZShlWzVdfHwiIiksSGUoZVs3XXx8IiIpLEhlKGVbOV18fCIiKSx0KTpuZXcgRGUoIiIsIiIsIiIsIiIsIiIpfXN0YXRpYyBmaWxlKGUpe2xldCB0PSIiO3ZhciByO3JldHVybihlPUU/ZS5yZXBsYWNlKC9cXC9nLEllKTplKVswXT09PUllJiZlWzFdPT09SWUmJihlPS0xPT09KHI9ZS5pbmRleE9mKEllLDIpKT8odD1lLnN1YnN0cmluZygyKSxJZSk6KHQ9ZS5zdWJzdHJpbmcoMixyKSxlLnN1YnN0cmluZyhyKXx8SWUpKSxuZXcgRGUoImZpbGUiLHQsZSwiIiwiIil9c3RhdGljIGZyb20oZSl7ZT1uZXcgRGUoZS5zY2hlbWUsZS5hdXRob3JpdHksZS5wYXRoLGUucXVlcnksZS5mcmFnbWVudCk7cmV0dXJuIFZlKGUsITApLGV9c3RhdGljIGpvaW5QYXRoKGUsLi4udCl7aWYoIWUucGF0aCl0aHJvdyBuZXcgRXJyb3IoIltVcmlFcnJvcl06IGNhbm5vdCBjYWxsIGpvaW5QYXRoIG9uIFVSSSB3aXRob3V0IHBhdGgiKTtsZXQgcjtyZXR1cm4gcj1FJiYiZmlsZSI9PT1lLnNjaGVtZT9SZS5maWxlKEVlLmpvaW4oVWUoZSwhMCksLi4udCkpLnBhdGg6QWUuam9pbihlLnBhdGgsLi4udCksZS53aXRoKHtwYXRoOnJ9KX10b1N0cmluZyhlPSExKXtyZXR1cm4gQmUodGhpcyxlKX10b0pTT04oKXtyZXR1cm4gdGhpc31zdGF0aWMgcmV2aXZlKGUpe2lmKGUpe2lmKGUgaW5zdGFuY2VvZiBSZSlyZXR1cm4gZTt7Y29uc3QgdD1uZXcgRGUoZSk7cmV0dXJuIHQuX2Zvcm1hdHRlZD1lLmV4dGVybmFsLHQuX2ZzUGF0aD1lLl9zZXA9PT1rZT9lLmZzUGF0aDpudWxsLHR9fXJldHVybiBlfX1jb25zdCBrZT1FPzE6dm9pZCAwO2NsYXNzIERlIGV4dGVuZHMgUmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2Zvcm1hdHRlZD1udWxsLHRoaXMuX2ZzUGF0aD1udWxsfWdldCBmc1BhdGgoKXtyZXR1cm4gdGhpcy5fZnNQYXRofHwodGhpcy5fZnNQYXRoPVVlKHRoaXMsITEpKSx0aGlzLl9mc1BhdGh9dG9TdHJpbmcoZT0hMSl7cmV0dXJuIGU/QmUodGhpcywhMCk6KHRoaXMuX2Zvcm1hdHRlZHx8KHRoaXMuX2Zvcm1hdHRlZD1CZSh0aGlzLCExKSksdGhpcy5fZm9ybWF0dGVkKX10b0pTT04oKXtjb25zdCBlPXskbWlkOjF9O3JldHVybiB0aGlzLl9mc1BhdGgmJihlLmZzUGF0aD10aGlzLl9mc1BhdGgsZS5fc2VwPWtlKSx0aGlzLl9mb3JtYXR0ZWQmJihlLmV4dGVybmFsPXRoaXMuX2Zvcm1hdHRlZCksdGhpcy5wYXRoJiYoZS5wYXRoPXRoaXMucGF0aCksdGhpcy5zY2hlbWUmJihlLnNjaGVtZT10aGlzLnNjaGVtZSksdGhpcy5hdXRob3JpdHkmJihlLmF1dGhvcml0eT10aGlzLmF1dGhvcml0eSksdGhpcy5xdWVyeSYmKGUucXVlcnk9dGhpcy5xdWVyeSksdGhpcy5mcmFnbWVudCYmKGUuZnJhZ21lbnQ9dGhpcy5mcmFnbWVudCksZX19Y29uc3QgT2U9e1s1OF06IiUzQSIsNDc6IiUyRiIsNjM6IiUzRiIsMzU6IiUyMyIsOTE6IiU1QiIsOTM6IiU1RCIsNjQ6IiU0MCIsMzM6IiUyMSIsMzY6IiUyNCIsMzg6IiUyNiIsMzk6IiUyNyIsNDA6IiUyOCIsNDE6IiUyOSIsNDI6IiUyQSIsNDM6IiUyQiIsNDQ6IiUyQyIsNTk6IiUzQiIsNjE6IiUzRCIsMzI6IiUyMCJ9O2Z1bmN0aW9uIFRlKHQscil7bGV0IG49dm9pZCAwLGk9LTE7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBzPXQuY2hhckNvZGVBdChlKTs5Nzw9cyYmczw9MTIyfHw2NTw9cyYmczw9OTB8fDQ4PD1zJiZzPD01N3x8NDU9PT1zfHw0Nj09PXN8fDk1PT09c3x8MTI2PT09c3x8ciYmNDc9PT1zPygtMSE9PWkmJihuKz1lbmNvZGVVUklDb21wb25lbnQodC5zdWJzdHJpbmcoaSxlKSksaT0tMSksdm9pZCAwIT09biYmKG4rPXQuY2hhckF0KGUpKSk6KHZvaWQgMD09PW4mJihuPXQuc3Vic3RyKDAsZSkpLHZvaWQgMCE9PShzPU9lW3NdKT8oLTEhPT1pJiYobis9ZW5jb2RlVVJJQ29tcG9uZW50KHQuc3Vic3RyaW5nKGksZSkpLGk9LTEpLG4rPXMpOi0xPT09aSYmKGk9ZSkpfXJldHVybi0xIT09aSYmKG4rPWVuY29kZVVSSUNvbXBvbmVudCh0LnN1YnN0cmluZyhpKSkpLHZvaWQgMCE9PW4/bjp0fWZ1bmN0aW9uIEZlKHQpe2xldCByPXZvaWQgMDtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG49dC5jaGFyQ29kZUF0KGUpOzM1PT09bnx8NjM9PT1uPyh2b2lkIDA9PT1yJiYocj10LnN1YnN0cigwLGUpKSxyKz1PZVtuXSk6dm9pZCAwIT09ciYmKHIrPXRbZV0pfXJldHVybiB2b2lkIDAhPT1yP3I6dH1mdW5jdGlvbiBVZShlLHQpe2xldCByO3JldHVybiByPWUuYXV0aG9yaXR5JiYxPGUucGF0aC5sZW5ndGgmJiJmaWxlIj09PWUuc2NoZW1lPyIvLyIrZS5hdXRob3JpdHkrZS5wYXRoOjQ3PT09ZS5wYXRoLmNoYXJDb2RlQXQoMCkmJig2NTw9ZS5wYXRoLmNoYXJDb2RlQXQoMSkmJmUucGF0aC5jaGFyQ29kZUF0KDEpPD05MHx8OTc8PWUucGF0aC5jaGFyQ29kZUF0KDEpJiZlLnBhdGguY2hhckNvZGVBdCgxKTw9MTIyKSYmNTg9PT1lLnBhdGguY2hhckNvZGVBdCgyKT90P2UucGF0aC5zdWJzdHIoMSk6ZS5wYXRoWzFdLnRvTG93ZXJDYXNlKCkrZS5wYXRoLnN1YnN0cigyKTplLnBhdGgsRSYmKHI9ci5yZXBsYWNlKC9cLy9nLCJcXCIpKSxyfWZ1bmN0aW9uIEJlKGUsdCl7Y29uc3Qgcj10P0ZlOlRlO2xldCBuPSIiLHtzY2hlbWU6aSxhdXRob3JpdHk6cyxwYXRoOm8scXVlcnk6YSxmcmFnbWVudDpsfT1lO2lmKGkmJihuKz1pLG4rPSI6IiksIXMmJiJmaWxlIiE9PWl8fChuKz1JZSxuKz1JZSkscyl7bGV0IGU9cy5pbmRleE9mKCJAIik7aWYoLTEhPT1lKXtjb25zdCBoPXMuc3Vic3RyKDAsZSk7cz1zLnN1YnN0cihlKzEpLGU9aC5pbmRleE9mKCI6IiksLTE9PT1lP24rPXIoaCwhMSk6KG4rPXIoaC5zdWJzdHIoMCxlKSwhMSksbis9IjoiLG4rPXIoaC5zdWJzdHIoZSsxKSwhMSkpLG4rPSJAIn1zPXMudG9Mb3dlckNhc2UoKSxlPXMuaW5kZXhPZigiOiIpLC0xPT09ZT9uKz1yKHMsITEpOihuKz1yKHMuc3Vic3RyKDAsZSksITEpLG4rPXMuc3Vic3RyKGUpKX12YXIgdTtyZXR1cm4gbyYmKDM8PW8ubGVuZ3RoJiY0Nz09PW8uY2hhckNvZGVBdCgwKSYmNTg9PT1vLmNoYXJDb2RlQXQoMik/NjU8PSh1PW8uY2hhckNvZGVBdCgxKSkmJnU8PTkwJiYobz1gLyR7U3RyaW5nLmZyb21DaGFyQ29kZSh1KzMyKX06YCtvLnN1YnN0cigzKSk6Mjw9by5sZW5ndGgmJjU4PT09by5jaGFyQ29kZUF0KDEpJiYoNjU8PSh1PW8uY2hhckNvZGVBdCgwKSkmJnU8PTkwJiYobz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUrMzIpKyI6IitvLnN1YnN0cigyKSkpLG4rPXIobywhMCkpLGEmJihuKz0iPyIsbis9cihhLCExKSksbCYmKG4rPSIjIixuKz10P2w6VGUobCwhMSkpLG59Y29uc3QgcWU9LyglWzAtOUEtWmEtel1bMC05QS1aYS16XSkrL2c7ZnVuY3Rpb24gSGUoZSl7cmV0dXJuIGUubWF0Y2gocWUpP2UucmVwbGFjZShxZSxlPT5mdW5jdGlvbiB0KHIpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHIpfWNhdGNoKGUpe3JldHVybiAzPHIubGVuZ3RoP3Iuc3Vic3RyKDAsMykrdChyLnN1YnN0cigzKSk6cn19KGUpKTplfWNsYXNzIFdle2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5saW5lTnVtYmVyPWUsdGhpcy5jb2x1bW49dH13aXRoKGU9dGhpcy5saW5lTnVtYmVyLHQ9dGhpcy5jb2x1bW4pe3JldHVybiBlPT09dGhpcy5saW5lTnVtYmVyJiZ0PT09dGhpcy5jb2x1bW4/dGhpczpuZXcgV2UoZSx0KX1kZWx0YShlPTAsdD0wKXtyZXR1cm4gdGhpcy53aXRoKHRoaXMubGluZU51bWJlcitlLHRoaXMuY29sdW1uK3QpfWVxdWFscyhlKXtyZXR1cm4gV2UuZXF1YWxzKHRoaXMsZSl9c3RhdGljIGVxdWFscyhlLHQpe3JldHVybiFlJiYhdHx8ISFlJiYhIXQmJmUubGluZU51bWJlcj09PXQubGluZU51bWJlciYmZS5jb2x1bW49PT10LmNvbHVtbn1pc0JlZm9yZShlKXtyZXR1cm4gV2UuaXNCZWZvcmUodGhpcyxlKX1zdGF0aWMgaXNCZWZvcmUoZSx0KXtyZXR1cm4gZS5saW5lTnVtYmVyPHQubGluZU51bWJlcnx8ISh0LmxpbmVOdW1iZXI8ZS5saW5lTnVtYmVyKSYmZS5jb2x1bW48dC5jb2x1bW59aXNCZWZvcmVPckVxdWFsKGUpe3JldHVybiBXZS5pc0JlZm9yZU9yRXF1YWwodGhpcyxlKX1zdGF0aWMgaXNCZWZvcmVPckVxdWFsKGUsdCl7cmV0dXJuIGUubGluZU51bWJlcjx0LmxpbmVOdW1iZXJ8fCEodC5saW5lTnVtYmVyPGUubGluZU51bWJlcikmJmUuY29sdW1uPD10LmNvbHVtbn1zdGF0aWMgY29tcGFyZShlLHQpe3ZhciByPTB8ZS5saW5lTnVtYmVyLG49MHx0LmxpbmVOdW1iZXI7cmV0dXJuIHIhPW4/ci1uOigwfGUuY29sdW1uKS0oMHx0LmNvbHVtbil9Y2xvbmUoKXtyZXR1cm4gbmV3IFdlKHRoaXMubGluZU51bWJlcix0aGlzLmNvbHVtbil9dG9TdHJpbmcoKXtyZXR1cm4iKCIrdGhpcy5saW5lTnVtYmVyKyIsIit0aGlzLmNvbHVtbisiKSJ9c3RhdGljIGxpZnQoZSl7cmV0dXJuIG5ldyBXZShlLmxpbmVOdW1iZXIsZS5jb2x1bW4pfXN0YXRpYyBpc0lQb3NpdGlvbihlKXtyZXR1cm4gZSYmIm51bWJlciI9PXR5cGVvZiBlLmxpbmVOdW1iZXImJiJudW1iZXIiPT10eXBlb2YgZS5jb2x1bW59fWNsYXNzIHple2NvbnN0cnVjdG9yKGUsdCxyLG4pe3I8ZXx8ZT09PXImJm48dD8odGhpcy5zdGFydExpbmVOdW1iZXI9cix0aGlzLnN0YXJ0Q29sdW1uPW4sdGhpcy5lbmRMaW5lTnVtYmVyPWUsdGhpcy5lbmRDb2x1bW49dCk6KHRoaXMuc3RhcnRMaW5lTnVtYmVyPWUsdGhpcy5zdGFydENvbHVtbj10LHRoaXMuZW5kTGluZU51bWJlcj1yLHRoaXMuZW5kQ29sdW1uPW4pfWlzRW1wdHkoKXtyZXR1cm4gemUuaXNFbXB0eSh0aGlzKX1zdGF0aWMgaXNFbXB0eShlKXtyZXR1cm4gZS5zdGFydExpbmVOdW1iZXI9PT1lLmVuZExpbmVOdW1iZXImJmUuc3RhcnRDb2x1bW49PT1lLmVuZENvbHVtbn1jb250YWluc1Bvc2l0aW9uKGUpe3JldHVybiB6ZS5jb250YWluc1Bvc2l0aW9uKHRoaXMsZSl9c3RhdGljIGNvbnRhaW5zUG9zaXRpb24oZSx0KXtyZXR1cm4hKHQubGluZU51bWJlcjxlLnN0YXJ0TGluZU51bWJlcnx8dC5saW5lTnVtYmVyPmUuZW5kTGluZU51bWJlcikmJighKHQubGluZU51bWJlcj09PWUuc3RhcnRMaW5lTnVtYmVyJiZ0LmNvbHVtbjxlLnN0YXJ0Q29sdW1uKSYmISh0LmxpbmVOdW1iZXI9PT1lLmVuZExpbmVOdW1iZXImJnQuY29sdW1uPmUuZW5kQ29sdW1uKSl9c3RhdGljIHN0cmljdENvbnRhaW5zUG9zaXRpb24oZSx0KXtyZXR1cm4hKHQubGluZU51bWJlcjxlLnN0YXJ0TGluZU51bWJlcnx8dC5saW5lTnVtYmVyPmUuZW5kTGluZU51bWJlcikmJighKHQubGluZU51bWJlcj09PWUuc3RhcnRMaW5lTnVtYmVyJiZ0LmNvbHVtbjw9ZS5zdGFydENvbHVtbikmJiEodC5saW5lTnVtYmVyPT09ZS5lbmRMaW5lTnVtYmVyJiZ0LmNvbHVtbj49ZS5lbmRDb2x1bW4pKX1jb250YWluc1JhbmdlKGUpe3JldHVybiB6ZS5jb250YWluc1JhbmdlKHRoaXMsZSl9c3RhdGljIGNvbnRhaW5zUmFuZ2UoZSx0KXtyZXR1cm4hKHQuc3RhcnRMaW5lTnVtYmVyPGUuc3RhcnRMaW5lTnVtYmVyfHx0LmVuZExpbmVOdW1iZXI8ZS5zdGFydExpbmVOdW1iZXIpJiYoISh0LnN0YXJ0TGluZU51bWJlcj5lLmVuZExpbmVOdW1iZXJ8fHQuZW5kTGluZU51bWJlcj5lLmVuZExpbmVOdW1iZXIpJiYoISh0LnN0YXJ0TGluZU51bWJlcj09PWUuc3RhcnRMaW5lTnVtYmVyJiZ0LnN0YXJ0Q29sdW1uPGUuc3RhcnRDb2x1bW4pJiYhKHQuZW5kTGluZU51bWJlcj09PWUuZW5kTGluZU51bWJlciYmdC5lbmRDb2x1bW4+ZS5lbmRDb2x1bW4pKSl9c3RyaWN0Q29udGFpbnNSYW5nZShlKXtyZXR1cm4gemUuc3RyaWN0Q29udGFpbnNSYW5nZSh0aGlzLGUpfXN0YXRpYyBzdHJpY3RDb250YWluc1JhbmdlKGUsdCl7cmV0dXJuISh0LnN0YXJ0TGluZU51bWJlcjxlLnN0YXJ0TGluZU51bWJlcnx8dC5lbmRMaW5lTnVtYmVyPGUuc3RhcnRMaW5lTnVtYmVyKSYmKCEodC5zdGFydExpbmVOdW1iZXI+ZS5lbmRMaW5lTnVtYmVyfHx0LmVuZExpbmVOdW1iZXI+ZS5lbmRMaW5lTnVtYmVyKSYmKCEodC5zdGFydExpbmVOdW1iZXI9PT1lLnN0YXJ0TGluZU51bWJlciYmdC5zdGFydENvbHVtbjw9ZS5zdGFydENvbHVtbikmJiEodC5lbmRMaW5lTnVtYmVyPT09ZS5lbmRMaW5lTnVtYmVyJiZ0LmVuZENvbHVtbj49ZS5lbmRDb2x1bW4pKSl9cGx1c1JhbmdlKGUpe3JldHVybiB6ZS5wbHVzUmFuZ2UodGhpcyxlKX1zdGF0aWMgcGx1c1JhbmdlKGUsdCl7bGV0IHIsbixpLHM7cmV0dXJuIG49dC5zdGFydExpbmVOdW1iZXI8ZS5zdGFydExpbmVOdW1iZXI/KHI9dC5zdGFydExpbmVOdW1iZXIsdC5zdGFydENvbHVtbik6dC5zdGFydExpbmVOdW1iZXI9PT1lLnN0YXJ0TGluZU51bWJlcj8ocj10LnN0YXJ0TGluZU51bWJlcixNYXRoLm1pbih0LnN0YXJ0Q29sdW1uLGUuc3RhcnRDb2x1bW4pKToocj1lLnN0YXJ0TGluZU51bWJlcixlLnN0YXJ0Q29sdW1uKSxzPXQuZW5kTGluZU51bWJlcj5lLmVuZExpbmVOdW1iZXI/KGk9dC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKTp0LmVuZExpbmVOdW1iZXI9PT1lLmVuZExpbmVOdW1iZXI/KGk9dC5lbmRMaW5lTnVtYmVyLE1hdGgubWF4KHQuZW5kQ29sdW1uLGUuZW5kQ29sdW1uKSk6KGk9ZS5lbmRMaW5lTnVtYmVyLGUuZW5kQ29sdW1uKSxuZXcgemUocixuLGkscyl9aW50ZXJzZWN0UmFuZ2VzKGUpe3JldHVybiB6ZS5pbnRlcnNlY3RSYW5nZXModGhpcyxlKX1zdGF0aWMgaW50ZXJzZWN0UmFuZ2VzKGUsdCl7bGV0IHI9ZS5zdGFydExpbmVOdW1iZXIsbj1lLnN0YXJ0Q29sdW1uLGk9ZS5lbmRMaW5lTnVtYmVyLHM9ZS5lbmRDb2x1bW47dmFyIG89dC5zdGFydExpbmVOdW1iZXIsYT10LnN0YXJ0Q29sdW1uLGU9dC5lbmRMaW5lTnVtYmVyLHQ9dC5lbmRDb2x1bW47cmV0dXJuIHI8bz8ocj1vLG49YSk6cj09PW8mJihuPU1hdGgubWF4KG4sYSkpLGk+ZT8oaT1lLHM9dCk6aT09PWUmJihzPU1hdGgubWluKHMsdCkpLHI+aXx8cj09PWkmJm4+cz9udWxsOm5ldyB6ZShyLG4saSxzKX1lcXVhbHNSYW5nZShlKXtyZXR1cm4gemUuZXF1YWxzUmFuZ2UodGhpcyxlKX1zdGF0aWMgZXF1YWxzUmFuZ2UoZSx0KXtyZXR1cm4hIWUmJiEhdCYmZS5zdGFydExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmZS5zdGFydENvbHVtbj09PXQuc3RhcnRDb2x1bW4mJmUuZW5kTGluZU51bWJlcj09PXQuZW5kTGluZU51bWJlciYmZS5lbmRDb2x1bW49PT10LmVuZENvbHVtbn1nZXRFbmRQb3NpdGlvbigpe3JldHVybiB6ZS5nZXRFbmRQb3NpdGlvbih0aGlzKX1zdGF0aWMgZ2V0RW5kUG9zaXRpb24oZSl7cmV0dXJuIG5ldyBXZShlLmVuZExpbmVOdW1iZXIsZS5lbmRDb2x1bW4pfWdldFN0YXJ0UG9zaXRpb24oKXtyZXR1cm4gemUuZ2V0U3RhcnRQb3NpdGlvbih0aGlzKX1zdGF0aWMgZ2V0U3RhcnRQb3NpdGlvbihlKXtyZXR1cm4gbmV3IFdlKGUuc3RhcnRMaW5lTnVtYmVyLGUuc3RhcnRDb2x1bW4pfXRvU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuc3RhcnRMaW5lTnVtYmVyKyIsIit0aGlzLnN0YXJ0Q29sdW1uKyIgLT4gIit0aGlzLmVuZExpbmVOdW1iZXIrIiwiK3RoaXMuZW5kQ29sdW1uKyJdIn1zZXRFbmRQb3NpdGlvbihlLHQpe3JldHVybiBuZXcgemUodGhpcy5zdGFydExpbmVOdW1iZXIsdGhpcy5zdGFydENvbHVtbixlLHQpfXNldFN0YXJ0UG9zaXRpb24oZSx0KXtyZXR1cm4gbmV3IHplKGUsdCx0aGlzLmVuZExpbmVOdW1iZXIsdGhpcy5lbmRDb2x1bW4pfWNvbGxhcHNlVG9TdGFydCgpe3JldHVybiB6ZS5jb2xsYXBzZVRvU3RhcnQodGhpcyl9c3RhdGljIGNvbGxhcHNlVG9TdGFydChlKXtyZXR1cm4gbmV3IHplKGUuc3RhcnRMaW5lTnVtYmVyLGUuc3RhcnRDb2x1bW4sZS5zdGFydExpbmVOdW1iZXIsZS5zdGFydENvbHVtbil9c3RhdGljIGZyb21Qb3NpdGlvbnMoZSx0PWUpe3JldHVybiBuZXcgemUoZS5saW5lTnVtYmVyLGUuY29sdW1uLHQubGluZU51bWJlcix0LmNvbHVtbil9c3RhdGljIGxpZnQoZSl7cmV0dXJuIGU/bmV3IHplKGUuc3RhcnRMaW5lTnVtYmVyLGUuc3RhcnRDb2x1bW4sZS5lbmRMaW5lTnVtYmVyLGUuZW5kQ29sdW1uKTpudWxsfXN0YXRpYyBpc0lSYW5nZShlKXtyZXR1cm4gZSYmIm51bWJlciI9PXR5cGVvZiBlLnN0YXJ0TGluZU51bWJlciYmIm51bWJlciI9PXR5cGVvZiBlLnN0YXJ0Q29sdW1uJiYibnVtYmVyIj09dHlwZW9mIGUuZW5kTGluZU51bWJlciYmIm51bWJlciI9PXR5cGVvZiBlLmVuZENvbHVtbn1zdGF0aWMgYXJlSW50ZXJzZWN0aW5nT3JUb3VjaGluZyhlLHQpe3JldHVybiEoZS5lbmRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxlLmVuZExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmZS5lbmRDb2x1bW48dC5zdGFydENvbHVtbikmJiEodC5lbmRMaW5lTnVtYmVyPGUuc3RhcnRMaW5lTnVtYmVyfHx0LmVuZExpbmVOdW1iZXI9PT1lLnN0YXJ0TGluZU51bWJlciYmdC5lbmRDb2x1bW48ZS5zdGFydENvbHVtbil9c3RhdGljIGFyZUludGVyc2VjdGluZyhlLHQpe3JldHVybiEoZS5lbmRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxlLmVuZExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmZS5lbmRDb2x1bW48PXQuc3RhcnRDb2x1bW4pJiYhKHQuZW5kTGluZU51bWJlcjxlLnN0YXJ0TGluZU51bWJlcnx8dC5lbmRMaW5lTnVtYmVyPT09ZS5zdGFydExpbmVOdW1iZXImJnQuZW5kQ29sdW1uPD1lLnN0YXJ0Q29sdW1uKX1zdGF0aWMgY29tcGFyZVJhbmdlc1VzaW5nU3RhcnRzKGUsdCl7aWYoZSYmdCl7dmFyIHI9MHxlLnN0YXJ0TGluZU51bWJlcixuPTB8dC5zdGFydExpbmVOdW1iZXI7aWYociE9bilyZXR1cm4gci1uO3I9MHxlLnN0YXJ0Q29sdW1uLG49MHx0LnN0YXJ0Q29sdW1uO2lmKHIhPW4pcmV0dXJuIHItbjtyPTB8ZS5lbmRMaW5lTnVtYmVyLG49MHx0LmVuZExpbmVOdW1iZXI7cmV0dXJuIHIhPW4/ci1uOigwfGUuZW5kQ29sdW1uKS0oMHx0LmVuZENvbHVtbil9cmV0dXJuKGU/MTowKS0odD8xOjApfXN0YXRpYyBjb21wYXJlUmFuZ2VzVXNpbmdFbmRzKGUsdCl7cmV0dXJuIGUuZW5kTGluZU51bWJlcj09PXQuZW5kTGluZU51bWJlcj9lLmVuZENvbHVtbj09PXQuZW5kQ29sdW1uP2Uuc3RhcnRMaW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXI/ZS5zdGFydENvbHVtbi10LnN0YXJ0Q29sdW1uOmUuc3RhcnRMaW5lTnVtYmVyLXQuc3RhcnRMaW5lTnVtYmVyOmUuZW5kQ29sdW1uLXQuZW5kQ29sdW1uOmUuZW5kTGluZU51bWJlci10LmVuZExpbmVOdW1iZXJ9c3RhdGljIHNwYW5zTXVsdGlwbGVMaW5lcyhlKXtyZXR1cm4gZS5lbmRMaW5lTnVtYmVyPmUuc3RhcnRMaW5lTnVtYmVyfX1mdW5jdGlvbiBqZShlLHQscixuKXtjb25zdCBpPW5ldyBzZShlLHQscik7cmV0dXJuIGkuQ29tcHV0ZURpZmYobil9Y2xhc3MgJGV7Y29uc3RydWN0b3Iocil7Y29uc3Qgbj1bXSxpPVtdO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrKyluW2VdPVplKHJbZV0sMSksaVtlXT1YZShyW2VdLDEpO3RoaXMubGluZXM9cix0aGlzLl9zdGFydENvbHVtbnM9bix0aGlzLl9lbmRDb2x1bW5zPWl9Z2V0RWxlbWVudHMoKXtjb25zdCByPVtdO2ZvcihsZXQgZT0wLHQ9dGhpcy5saW5lcy5sZW5ndGg7ZTx0O2UrKylyW2VdPXRoaXMubGluZXNbZV0uc3Vic3RyaW5nKHRoaXMuX3N0YXJ0Q29sdW1uc1tlXS0xLHRoaXMuX2VuZENvbHVtbnNbZV0tMSk7cmV0dXJuIHJ9Z2V0U3RyaWN0RWxlbWVudChlKXtyZXR1cm4gdGhpcy5saW5lc1tlXX1nZXRTdGFydExpbmVOdW1iZXIoZSl7cmV0dXJuIGUrMX1nZXRFbmRMaW5lTnVtYmVyKGUpe3JldHVybiBlKzF9Y3JlYXRlQ2hhclNlcXVlbmNlKGUscixuKXtjb25zdCBpPVtdLHM9W10sbz1bXTtsZXQgYT0wO2ZvcihsZXQgdD1yO3Q8PW47dCsrKXtjb25zdCBoPXRoaXMubGluZXNbdF07dmFyIGw9ZT90aGlzLl9zdGFydENvbHVtbnNbdF06MSx1PWU/dGhpcy5fZW5kQ29sdW1uc1t0XTpoLmxlbmd0aCsxO2ZvcihsZXQgZT1sO2U8dTtlKyspaVthXT1oLmNoYXJDb2RlQXQoZS0xKSxzW2FdPXQrMSxvW2FdPWUsYSsrfXJldHVybiBuZXcgR2UoaSxzLG8pfX1jbGFzcyBHZXtjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5fY2hhckNvZGVzPWUsdGhpcy5fbGluZU51bWJlcnM9dCx0aGlzLl9jb2x1bW5zPXJ9Z2V0RWxlbWVudHMoKXtyZXR1cm4gdGhpcy5fY2hhckNvZGVzfWdldFN0YXJ0TGluZU51bWJlcihlKXtyZXR1cm4gdGhpcy5fbGluZU51bWJlcnNbZV19Z2V0U3RhcnRDb2x1bW4oZSl7cmV0dXJuIHRoaXMuX2NvbHVtbnNbZV19Z2V0RW5kTGluZU51bWJlcihlKXtyZXR1cm4gdGhpcy5fbGluZU51bWJlcnNbZV19Z2V0RW5kQ29sdW1uKGUpe3JldHVybiB0aGlzLl9jb2x1bW5zW2VdKzF9fWNsYXNzIEple2NvbnN0cnVjdG9yKGUsdCxyLG4saSxzLG8sYSl7dGhpcy5vcmlnaW5hbFN0YXJ0TGluZU51bWJlcj1lLHRoaXMub3JpZ2luYWxTdGFydENvbHVtbj10LHRoaXMub3JpZ2luYWxFbmRMaW5lTnVtYmVyPXIsdGhpcy5vcmlnaW5hbEVuZENvbHVtbj1uLHRoaXMubW9kaWZpZWRTdGFydExpbmVOdW1iZXI9aSx0aGlzLm1vZGlmaWVkU3RhcnRDb2x1bW49cyx0aGlzLm1vZGlmaWVkRW5kTGluZU51bWJlcj1vLHRoaXMubW9kaWZpZWRFbmRDb2x1bW49YX1zdGF0aWMgY3JlYXRlRnJvbURpZmZDaGFuZ2UoZSx0LHIpe2xldCBuLGkscyxvLGEsbCx1LGg7cmV0dXJuIG89MD09PWUub3JpZ2luYWxMZW5ndGg/KG49MCxpPTAscz0wKToobj10LmdldFN0YXJ0TGluZU51bWJlcihlLm9yaWdpbmFsU3RhcnQpLGk9dC5nZXRTdGFydENvbHVtbihlLm9yaWdpbmFsU3RhcnQpLHM9dC5nZXRFbmRMaW5lTnVtYmVyKGUub3JpZ2luYWxTdGFydCtlLm9yaWdpbmFsTGVuZ3RoLTEpLHQuZ2V0RW5kQ29sdW1uKGUub3JpZ2luYWxTdGFydCtlLm9yaWdpbmFsTGVuZ3RoLTEpKSxoPTA9PT1lLm1vZGlmaWVkTGVuZ3RoPyhhPTAsbD0wLHU9MCk6KGE9ci5nZXRTdGFydExpbmVOdW1iZXIoZS5tb2RpZmllZFN0YXJ0KSxsPXIuZ2V0U3RhcnRDb2x1bW4oZS5tb2RpZmllZFN0YXJ0KSx1PXIuZ2V0RW5kTGluZU51bWJlcihlLm1vZGlmaWVkU3RhcnQrZS5tb2RpZmllZExlbmd0aC0xKSxyLmdldEVuZENvbHVtbihlLm1vZGlmaWVkU3RhcnQrZS5tb2RpZmllZExlbmd0aC0xKSksbmV3IEplKG4saSxzLG8sYSxsLHUsaCl9fWNsYXNzIFFle2NvbnN0cnVjdG9yKGUsdCxyLG4saSl7dGhpcy5vcmlnaW5hbFN0YXJ0TGluZU51bWJlcj1lLHRoaXMub3JpZ2luYWxFbmRMaW5lTnVtYmVyPXQsdGhpcy5tb2RpZmllZFN0YXJ0TGluZU51bWJlcj1yLHRoaXMubW9kaWZpZWRFbmRMaW5lTnVtYmVyPW4sdGhpcy5jaGFyQ2hhbmdlcz1pfXN0YXRpYyBjcmVhdGVGcm9tRGlmZlJlc3VsdChlLHQsbixpLHMscixvKXtsZXQgYSxsLHUsaCxkPXZvaWQgMDtpZihsPTA9PT10Lm9yaWdpbmFsTGVuZ3RoPyhhPW4uZ2V0U3RhcnRMaW5lTnVtYmVyKHQub3JpZ2luYWxTdGFydCktMSwwKTooYT1uLmdldFN0YXJ0TGluZU51bWJlcih0Lm9yaWdpbmFsU3RhcnQpLG4uZ2V0RW5kTGluZU51bWJlcih0Lm9yaWdpbmFsU3RhcnQrdC5vcmlnaW5hbExlbmd0aC0xKSksaD0wPT09dC5tb2RpZmllZExlbmd0aD8odT1pLmdldFN0YXJ0TGluZU51bWJlcih0Lm1vZGlmaWVkU3RhcnQpLTEsMCk6KHU9aS5nZXRTdGFydExpbmVOdW1iZXIodC5tb2RpZmllZFN0YXJ0KSxpLmdldEVuZExpbmVOdW1iZXIodC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGgtMSkpLHImJjA8dC5vcmlnaW5hbExlbmd0aCYmdC5vcmlnaW5hbExlbmd0aDwyMCYmMDx0Lm1vZGlmaWVkTGVuZ3RoJiZ0Lm1vZGlmaWVkTGVuZ3RoPDIwJiZzKCkpe3ZhciBjPW4uY3JlYXRlQ2hhclNlcXVlbmNlKGUsdC5vcmlnaW5hbFN0YXJ0LHQub3JpZ2luYWxTdGFydCt0Lm9yaWdpbmFsTGVuZ3RoLTEpLG09aS5jcmVhdGVDaGFyU2VxdWVuY2UoZSx0Lm1vZGlmaWVkU3RhcnQsdC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGgtMSk7bGV0IHI9amUoYyxtLHMsITApLmNoYW5nZXM7byYmKHI9ZnVuY3Rpb24ocil7aWYoci5sZW5ndGg8PTEpcmV0dXJuIHI7Y29uc3Qgbj1bclswXV07bGV0IGk9blswXTtmb3IobGV0IGU9MSx0PXIubGVuZ3RoO2U8dDtlKyspe3ZhciBzPXJbZV0sbz1zLm9yaWdpbmFsU3RhcnQtKGkub3JpZ2luYWxTdGFydCtpLm9yaWdpbmFsTGVuZ3RoKSxhPXMubW9kaWZpZWRTdGFydC0oaS5tb2RpZmllZFN0YXJ0K2kubW9kaWZpZWRMZW5ndGgpO01hdGgubWluKG8sYSk8Mz8oaS5vcmlnaW5hbExlbmd0aD1zLm9yaWdpbmFsU3RhcnQrcy5vcmlnaW5hbExlbmd0aC1pLm9yaWdpbmFsU3RhcnQsaS5tb2RpZmllZExlbmd0aD1zLm1vZGlmaWVkU3RhcnQrcy5tb2RpZmllZExlbmd0aC1pLm1vZGlmaWVkU3RhcnQpOihuLnB1c2gocyksaT1zKX1yZXR1cm4gbn0ocikpLGQ9W107Zm9yKGxldCBlPTAsdD1yLmxlbmd0aDtlPHQ7ZSsrKWQucHVzaChKZS5jcmVhdGVGcm9tRGlmZkNoYW5nZShyW2VdLGMsbSkpfXJldHVybiBuZXcgUWUoYSxsLHUsaCxkKX19Y2xhc3MgWWV7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzPXIuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLHRoaXMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcz1yLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZT1yLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLHRoaXMuc2hvdWxkTWFrZVByZXR0eURpZmY9ci5zaG91bGRNYWtlUHJldHR5RGlmZix0aGlzLm9yaWdpbmFsTGluZXM9ZSx0aGlzLm1vZGlmaWVkTGluZXM9dCx0aGlzLm9yaWdpbmFsPW5ldyAkZShlKSx0aGlzLm1vZGlmaWVkPW5ldyAkZSh0KSx0aGlzLmNvbnRpbnVlTGluZURpZmY9ZXQoci5tYXhDb21wdXRhdGlvblRpbWUpLHRoaXMuY29udGludWVDaGFyRGlmZj1ldCgwPT09ci5tYXhDb21wdXRhdGlvblRpbWU/MDpNYXRoLm1pbihyLm1heENvbXB1dGF0aW9uVGltZSw1ZTMpKX1jb21wdXRlRGlmZigpe2lmKDE9PT10aGlzLm9yaWdpbmFsLmxpbmVzLmxlbmd0aCYmMD09PXRoaXMub3JpZ2luYWwubGluZXNbMF0ubGVuZ3RoKXJldHVybiAxPT09dGhpcy5tb2RpZmllZC5saW5lcy5sZW5ndGgmJjA9PT10aGlzLm1vZGlmaWVkLmxpbmVzWzBdLmxlbmd0aD97cXVpdEVhcmx5OiExLGNoYW5nZXM6W119OntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOjEsbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6MSxtb2RpZmllZEVuZExpbmVOdW1iZXI6dGhpcy5tb2RpZmllZC5saW5lcy5sZW5ndGgsY2hhckNoYW5nZXM6W3ttb2RpZmllZEVuZENvbHVtbjowLG1vZGlmaWVkRW5kTGluZU51bWJlcjowLG1vZGlmaWVkU3RhcnRDb2x1bW46MCxtb2RpZmllZFN0YXJ0TGluZU51bWJlcjowLG9yaWdpbmFsRW5kQ29sdW1uOjAsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOjAsb3JpZ2luYWxTdGFydENvbHVtbjowLG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjB9XX1dfTtpZigxPT09dGhpcy5tb2RpZmllZC5saW5lcy5sZW5ndGgmJjA9PT10aGlzLm1vZGlmaWVkLmxpbmVzWzBdLmxlbmd0aClyZXR1cm57cXVpdEVhcmx5OiExLGNoYW5nZXM6W3tvcmlnaW5hbFN0YXJ0TGluZU51bWJlcjoxLG9yaWdpbmFsRW5kTGluZU51bWJlcjp0aGlzLm9yaWdpbmFsLmxpbmVzLmxlbmd0aCxtb2RpZmllZFN0YXJ0TGluZU51bWJlcjoxLG1vZGlmaWVkRW5kTGluZU51bWJlcjoxLGNoYXJDaGFuZ2VzOlt7bW9kaWZpZWRFbmRDb2x1bW46MCxtb2RpZmllZEVuZExpbmVOdW1iZXI6MCxtb2RpZmllZFN0YXJ0Q29sdW1uOjAsbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6MCxvcmlnaW5hbEVuZENvbHVtbjowLG9yaWdpbmFsRW5kTGluZU51bWJlcjowLG9yaWdpbmFsU3RhcnRDb2x1bW46MCxvcmlnaW5hbFN0YXJ0TGluZU51bWJlcjowfV19XX07dmFyIGU9amUodGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVMaW5lRGlmZix0aGlzLnNob3VsZE1ha2VQcmV0dHlEaWZmKSxyPWUuY2hhbmdlcyxlPWUucXVpdEVhcmx5O2lmKHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2Upe2NvbnN0IGQ9W107Zm9yKGxldCBlPTAsdD1yLmxlbmd0aDtlPHQ7ZSsrKWQucHVzaChRZS5jcmVhdGVGcm9tRGlmZlJlc3VsdCh0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLHJbZV0sdGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVDaGFyRGlmZix0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyx0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpKTtyZXR1cm57cXVpdEVhcmx5OmUsY2hhbmdlczpkfX1jb25zdCBuPVtdO2xldCBpPTAscz0wO2ZvcihsZXQgZT0tMSx0PXIubGVuZ3RoO2U8dDtlKyspe2Zvcih2YXIgbz1lKzE8dD9yW2UrMV06bnVsbCxhPW8/by5vcmlnaW5hbFN0YXJ0OnRoaXMub3JpZ2luYWxMaW5lcy5sZW5ndGgsbD1vP28ubW9kaWZpZWRTdGFydDp0aGlzLm1vZGlmaWVkTGluZXMubGVuZ3RoO2k8YSYmczxsOyl7Y29uc3QgYz10aGlzLm9yaWdpbmFsTGluZXNbaV0sbT10aGlzLm1vZGlmaWVkTGluZXNbc107aWYoYyE9PW0pe3tsZXQgZT1aZShjLDEpLHQ9WmUobSwxKTtmb3IoOzE8ZSYmMTx0Oyl7aWYoYy5jaGFyQ29kZUF0KGUtMikhPT1tLmNoYXJDb2RlQXQodC0yKSlicmVhaztlLS0sdC0tfSgxPGV8fDE8dCkmJnRoaXMuX3B1c2hUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UobixpKzEsMSxlLHMrMSwxLHQpfXtsZXQgZT1YZShjLDEpLHQ9WGUobSwxKTtmb3IodmFyIHU9Yy5sZW5ndGgrMSxoPW0ubGVuZ3RoKzE7ZTx1JiZ0PGg7KXtpZihjLmNoYXJDb2RlQXQoZS0xKSE9PWMuY2hhckNvZGVBdCh0LTEpKWJyZWFrO2UrKyx0Kyt9KGU8dXx8dDxoKSYmdGhpcy5fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShuLGkrMSxlLHUscysxLHQsaCl9fWkrKyxzKyt9byYmKG4ucHVzaChRZS5jcmVhdGVGcm9tRGlmZlJlc3VsdCh0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLG8sdGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVDaGFyRGlmZix0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyx0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpKSxpKz1vLm9yaWdpbmFsTGVuZ3RoLHMrPW8ubW9kaWZpZWRMZW5ndGgpfXJldHVybntxdWl0RWFybHk6ZSxjaGFuZ2VzOm59fV9wdXNoVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHQscixuLGkscyxvLGEpe2lmKCF0aGlzLl9tZXJnZVRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZSh0LHIsbixpLHMsbyxhKSl7bGV0IGU9dm9pZCAwO3RoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzJiYoZT1bbmV3IEplKHIsbixyLGkscyxvLHMsYSldKSx0LnB1c2gobmV3IFFlKHIscixzLHMsZSkpfX1fbWVyZ2VUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UoZSx0LHIsbixpLHMsbyl7dmFyIGE9ZS5sZW5ndGg7aWYoMD09PWEpcmV0dXJuITE7Y29uc3QgbD1lW2EtMV07cmV0dXJuIDAhPT1sLm9yaWdpbmFsRW5kTGluZU51bWJlciYmMCE9PWwubW9kaWZpZWRFbmRMaW5lTnVtYmVyJiYobC5vcmlnaW5hbEVuZExpbmVOdW1iZXIrMT09PXQmJmwubW9kaWZpZWRFbmRMaW5lTnVtYmVyKzE9PT1pJiYobC5vcmlnaW5hbEVuZExpbmVOdW1iZXI9dCxsLm1vZGlmaWVkRW5kTGluZU51bWJlcj1pLHRoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzJiZsLmNoYXJDaGFuZ2VzJiZsLmNoYXJDaGFuZ2VzLnB1c2gobmV3IEplKHQscix0LG4saSxzLGksbykpLCEwKSl9fWZ1bmN0aW9uIFplKGUsdCl7ZT1mdW5jdGlvbihyKXtmb3IobGV0IGU9MCx0PXIubGVuZ3RoO2U8dDtlKyspe3ZhciBuPXIuY2hhckNvZGVBdChlKTtpZigzMiE9PW4mJjkhPT1uKXJldHVybiBlfXJldHVybi0xfShlKTtyZXR1cm4tMT09PWU/dDplKzF9ZnVuY3Rpb24gWGUoZSx0KXtlPWZ1bmN0aW9uKHQscj10Lmxlbmd0aC0xKXtmb3IobGV0IGU9cjswPD1lO2UtLSl7dmFyIG49dC5jaGFyQ29kZUF0KGUpO2lmKDMyIT09biYmOSE9PW4pcmV0dXJuIGV9cmV0dXJuLTF9KGUpO3JldHVybi0xPT09ZT90OmUrMn1mdW5jdGlvbiBldChlKXtpZigwPT09ZSlyZXR1cm4oKT0+ITA7Y29uc3QgdD1EYXRlLm5vdygpO3JldHVybigpPT5EYXRlLm5vdygpLXQ8ZX1mdW5jdGlvbiB0dChlKXtyZXR1cm4gZTwwPzA6MjU1PGU/MjU1OjB8ZX1mdW5jdGlvbiBydChlKXtyZXR1cm4gZTwwPzA6NDI5NDk2NzI5NTxlPzQyOTQ5NjcyOTU6MHxlfWNsYXNzIG50e2NvbnN0cnVjdG9yKGUpe3RoaXMudmFsdWVzPWUsdGhpcy5wcmVmaXhTdW09bmV3IFVpbnQzMkFycmF5KGUubGVuZ3RoKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXg9bmV3IEludDMyQXJyYXkoMSksdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPS0xfWluc2VydFZhbHVlcyhlLHQpe2U9cnQoZSk7Y29uc3Qgcj10aGlzLnZhbHVlcyxuPXRoaXMucHJlZml4U3VtO3ZhciBpPXQubGVuZ3RoO3JldHVybiAwIT09aSYmKHRoaXMudmFsdWVzPW5ldyBVaW50MzJBcnJheShyLmxlbmd0aCtpKSx0aGlzLnZhbHVlcy5zZXQoci5zdWJhcnJheSgwLGUpLDApLHRoaXMudmFsdWVzLnNldChyLnN1YmFycmF5KGUpLGUraSksdGhpcy52YWx1ZXMuc2V0KHQsZSksZS0xPHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSYmKHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXT1lLTEpLHRoaXMucHJlZml4U3VtPW5ldyBVaW50MzJBcnJheSh0aGlzLnZhbHVlcy5sZW5ndGgpLDA8PXRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSYmdGhpcy5wcmVmaXhTdW0uc2V0KG4uc3ViYXJyYXkoMCx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0rMSkpLCEwKX1zZXRWYWx1ZShlLHQpe3JldHVybiBlPXJ0KGUpLHQ9cnQodCksdGhpcy52YWx1ZXNbZV0hPT10JiYodGhpcy52YWx1ZXNbZV09dCxlLTE8dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiYodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPWUtMSksITApfXJlbW92ZVZhbHVlcyhlLHQpe2U9cnQoZSksdD1ydCh0KTtjb25zdCByPXRoaXMudmFsdWVzLG49dGhpcy5wcmVmaXhTdW07aWYoZT49ci5sZW5ndGgpcmV0dXJuITE7dmFyIGk9ci5sZW5ndGgtZTtyZXR1cm4gMCE9PSh0PWk8PXQ/aTp0KSYmKHRoaXMudmFsdWVzPW5ldyBVaW50MzJBcnJheShyLmxlbmd0aC10KSx0aGlzLnZhbHVlcy5zZXQoci5zdWJhcnJheSgwLGUpLDApLHRoaXMudmFsdWVzLnNldChyLnN1YmFycmF5KGUrdCksZSksdGhpcy5wcmVmaXhTdW09bmV3IFVpbnQzMkFycmF5KHRoaXMudmFsdWVzLmxlbmd0aCksZS0xPHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSYmKHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXT1lLTEpLDA8PXRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSYmdGhpcy5wcmVmaXhTdW0uc2V0KG4uc3ViYXJyYXkoMCx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0rMSkpLCEwKX1nZXRUb3RhbFN1bSgpe3JldHVybiAwPT09dGhpcy52YWx1ZXMubGVuZ3RoPzA6dGhpcy5fZ2V0UHJlZml4U3VtKHRoaXMudmFsdWVzLmxlbmd0aC0xKX1nZXRQcmVmaXhTdW0oZSl7cmV0dXJuIGU8MD8wOihlPXJ0KGUpLHRoaXMuX2dldFByZWZpeFN1bShlKSl9X2dldFByZWZpeFN1bSh0KXtpZih0PD10aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0pcmV0dXJuIHRoaXMucHJlZml4U3VtW3RdO2xldCByPXRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSsxOzA9PT1yJiYodGhpcy5wcmVmaXhTdW1bMF09dGhpcy52YWx1ZXNbMF0scisrKSx0Pj10aGlzLnZhbHVlcy5sZW5ndGgmJih0PXRoaXMudmFsdWVzLmxlbmd0aC0xKTtmb3IobGV0IGU9cjtlPD10O2UrKyl0aGlzLnByZWZpeFN1bVtlXT10aGlzLnByZWZpeFN1bVtlLTFdK3RoaXMudmFsdWVzW2VdO3JldHVybiB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF09TWF0aC5tYXgodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdLHQpLHRoaXMucHJlZml4U3VtW3RdfWdldEluZGV4T2YoZSl7ZT1NYXRoLmZsb29yKGUpLHRoaXMuZ2V0VG90YWxTdW0oKTtsZXQgdD0wLHI9dGhpcy52YWx1ZXMubGVuZ3RoLTEsbj0wO3ZhciBpO2xldCBzPTA7Zm9yKDt0PD1yOylpZihuPXQrKHItdCkvMnwwLGk9dGhpcy5wcmVmaXhTdW1bbl0scz1pLXRoaXMudmFsdWVzW25dLGU8cylyPW4tMTtlbHNle2lmKCEoaTw9ZSkpYnJlYWs7dD1uKzF9cmV0dXJuIG5ldyBpdChuLGUtcyl9fWNsYXNzIGl0e2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5pbmRleD1lLHRoaXMucmVtYWluZGVyPXQsdGhpcy5fcHJlZml4U3VtSW5kZXhPZlJlc3VsdEJyYW5kPXZvaWQgMCx0aGlzLmluZGV4PWUsdGhpcy5yZW1haW5kZXI9dH19Y29uc3Qgc3Q9ZnVuY3Rpb24oZT0iIil7bGV0IHQ9IigtP1xcZCpcXC5cXGRcXHcqKXwoW14iO2Zvcihjb25zdCByIG9mImB+IUAjJCVeJiooKS09K1t7XX1cXHw7OidcIiwuPD4vPyIpMDw9ZS5pbmRleE9mKHIpfHwodCs9IlxcIityKTtyZXR1cm4gdCs9Ilxcc10rKSIsbmV3IFJlZ0V4cCh0LCJnIil9KCk7Y29uc3Qgb3Q9e21heExlbjoxZTMsd2luZG93U2l6ZToxNSx0aW1lQnVkZ2V0OjE1MH07ZnVuY3Rpb24gYXQodCxyLG4saSxzPW90KXtpZihuLmxlbmd0aD5zLm1heExlbil7bGV0IGU9dC1zLm1heExlbi8yO3JldHVybiBlPDA/ZT0wOmkrPWUsYXQodCxyLG49bi5zdWJzdHJpbmcoZSx0K3MubWF4TGVuLzIpLGkscyl9dmFyIG89RGF0ZS5ub3coKSxhPXQtMS1pO2xldCBsPS0xLHU9bnVsbDtmb3IobGV0IGU9MTshKERhdGUubm93KCktbz49cy50aW1lQnVkZ2V0KTtlKyspe3ZhciBoPWEtcy53aW5kb3dTaXplKmU7ci5sYXN0SW5kZXg9TWF0aC5tYXgoMCxoKTt2YXIgZD1mdW5jdGlvbihlLHQscixuKXt2YXIgaTtmb3IoO2k9ZS5leGVjKHQpOyl7dmFyIHM9aS5pbmRleHx8MDtpZihzPD1yJiZlLmxhc3RJbmRleD49cilyZXR1cm4gaTtpZigwPG4mJm48cylyZXR1cm4gbnVsbH1yZXR1cm4gbnVsbH0ocixuLGEsbCk7aWYoIWQmJnUpYnJlYWs7aWYodT1kLGg8PTApYnJlYWs7bD1ofWlmKHUpe2k9e3dvcmQ6dVswXSxzdGFydENvbHVtbjppKzErdS5pbmRleCxlbmRDb2x1bW46aSsxK3UuaW5kZXgrdVswXS5sZW5ndGh9O3JldHVybiByLmxhc3RJbmRleD0wLGl9cmV0dXJuIG51bGx9Y2xhc3MgbHR7Y29uc3RydWN0b3IoZSl7ZT10dChlKTt0aGlzLl9kZWZhdWx0VmFsdWU9ZSx0aGlzLl9hc2NpaU1hcD1sdC5fY3JlYXRlQXNjaWlNYXAoZSksdGhpcy5fbWFwPW5ldyBNYXB9c3RhdGljIF9jcmVhdGVBc2NpaU1hcCh0KXtsZXQgcj1uZXcgVWludDhBcnJheSgyNTYpO2ZvcihsZXQgZT0wO2U8MjU2O2UrKylyW2VdPXQ7cmV0dXJuIHJ9c2V0KGUsdCl7dD10dCh0KTswPD1lJiZlPDI1Nj90aGlzLl9hc2NpaU1hcFtlXT10OnRoaXMuX21hcC5zZXQoZSx0KX1nZXQoZSl7cmV0dXJuIDA8PWUmJmU8MjU2P3RoaXMuX2FzY2lpTWFwW2VdOnRoaXMuX21hcC5nZXQoZSl8fHRoaXMuX2RlZmF1bHRWYWx1ZX19Y2xhc3MgdXR7Y29uc3RydWN0b3IocixuLGkpe2NvbnN0IHM9bmV3IFVpbnQ4QXJyYXkocipuKTtmb3IobGV0IGU9MCx0PXIqbjtlPHQ7ZSsrKXNbZV09aTt0aGlzLl9kYXRhPXMsdGhpcy5yb3dzPXIsdGhpcy5jb2xzPW59Z2V0KGUsdCl7cmV0dXJuIHRoaXMuX2RhdGFbZSp0aGlzLmNvbHMrdF19c2V0KGUsdCxyKXt0aGlzLl9kYXRhW2UqdGhpcy5jb2xzK3RdPXJ9fWNsYXNzIGh0e2NvbnN0cnVjdG9yKHIpe2xldCBuPTAsaT0wO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrKyl7dmFyW3MsbyxhXT1yW2VdO28+biYmKG49bykscz5pJiYoaT1zKSxhPmkmJihpPWEpfW4rKyxpKys7bGV0IGw9bmV3IHV0KGksbiwwKTtmb3IobGV0IGU9MCx0PXIubGVuZ3RoO2U8dDtlKyspe3Zhclt1LGgsZF09cltlXTtsLnNldCh1LGgsZCl9dGhpcy5fc3RhdGVzPWwsdGhpcy5fbWF4Q2hhckNvZGU9bn1uZXh0U3RhdGUoZSx0KXtyZXR1cm4gdDwwfHx0Pj10aGlzLl9tYXhDaGFyQ29kZT8wOnRoaXMuX3N0YXRlcy5nZXQoZSx0KX19bGV0IGR0PW51bGw7bGV0IGN0PW51bGw7Y2xhc3MgbXR7c3RhdGljIF9jcmVhdGVMaW5rKGUsdCxyLG4saSl7bGV0IHM9aS0xO2Rve3ZhciBvPXQuY2hhckNvZGVBdChzKTtpZigyIT09ZS5nZXQobykpYnJlYWt9d2hpbGUocy0tLHM+bik7dmFyIGE7cmV0dXJuIDA8biYmKGE9dC5jaGFyQ29kZUF0KG4tMSksaT10LmNoYXJDb2RlQXQocyksKDQwPT09YSYmNDE9PT1pfHw5MT09PWEmJjkzPT09aXx8MTIzPT09YSYmMTI1PT09aSkmJnMtLSkse3JhbmdlOntzdGFydExpbmVOdW1iZXI6cixzdGFydENvbHVtbjpuKzEsZW5kTGluZU51bWJlcjpyLGVuZENvbHVtbjpzKzJ9LHVybDp0LnN1YnN0cmluZyhuLHMrMSl9fXN0YXRpYyBjb21wdXRlTGlua3ModCxkPShudWxsPT09ZHQmJihkdD1uZXcgaHQoW1sxLDEwNCwyXSxbMSw3MiwyXSxbMSwxMDIsNl0sWzEsNzAsNl0sWzIsMTE2LDNdLFsyLDg0LDNdLFszLDExNiw0XSxbMyw4NCw0XSxbNCwxMTIsNV0sWzQsODAsNV0sWzUsMTE1LDldLFs1LDgzLDldLFs1LDU4LDEwXSxbNiwxMDUsN10sWzYsNzMsN10sWzcsMTA4LDhdLFs3LDc2LDhdLFs4LDEwMSw5XSxbOCw2OSw5XSxbOSw1OCwxMF0sWzEwLDQ3LDExXSxbMTEsNDcsMTJdXSkpLGR0KSl7Y29uc3QgYz1mdW5jdGlvbigpe2lmKG51bGw9PT1jdCl7Y3Q9bmV3IGx0KDApO3ZhciB0PSIgXHQ8PidcIuOAgeOAgu+9oe+9pO+8jO+8ju+8mu+8m+KAmOOAiOOAjOOAjuOAlO+8iO+8u++9m++9ou+9o++9ne+8ve+8ieOAleOAj+OAjeOAieKAme+9gO+9nuKApiI7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspY3Quc2V0KHQuY2hhckNvZGVBdChlKSwxKTtmb3IobGV0IGU9MDtlPCIuLDsiLmxlbmd0aDtlKyspY3Quc2V0KCIuLDsiLmNoYXJDb2RlQXQoZSksMil9cmV0dXJuIGN0fSgpO2xldCBtPVtdO2ZvcihsZXQgaD0xLGU9dC5nZXRMaW5lQ291bnQoKTtoPD1lO2grKyl7Y29uc3QgXz10LmdldExpbmVDb250ZW50KGgpO3ZhciBmPV8ubGVuZ3RoO2xldCByPTAsbj0wLGk9MCxzPTEsbz0hMSxhPSExLGw9ITEsdT0hMTtmb3IoO3I8Zjspe2xldCB0PSExO3ZhciBnPV8uY2hhckNvZGVBdChyKTtpZigxMz09PXMpe2xldCBlO3N3aXRjaChnKXtjYXNlIDQwOm89ITAsZT0wO2JyZWFrO2Nhc2UgNDE6ZT1vPzA6MTticmVhaztjYXNlIDkxOmw9ITAsYT0hMCxlPTA7YnJlYWs7Y2FzZSA5MzpsPSExLGU9YT8wOjE7YnJlYWs7Y2FzZSAxMjM6dT0hMCxlPTA7YnJlYWs7Y2FzZSAxMjU6ZT11PzA6MTticmVhaztjYXNlIDM5OmU9MzQ9PT1pfHw5Nj09PWk/MDoxO2JyZWFrO2Nhc2UgMzQ6ZT0zOT09PWl8fDk2PT09aT8wOjE7YnJlYWs7Y2FzZSA5NjplPTM5PT09aXx8MzQ9PT1pPzA6MTticmVhaztjYXNlIDQyOmU9NDI9PT1pPzE6MDticmVhaztjYXNlIDEyNDplPTEyND09PWk/MTowO2JyZWFrO2Nhc2UgMzI6ZT1sPzA6MTticmVhaztkZWZhdWx0OmU9Yy5nZXQoZyl9MT09PWUmJihtLnB1c2gobXQuX2NyZWF0ZUxpbmsoYyxfLGgsbixyKSksdD0hMCl9ZWxzZSBpZigxMj09PXMpe2xldCBlO2U9OTE9PT1nPyhhPSEwLDApOmMuZ2V0KGcpLDE9PT1lP3Q9ITA6cz0xM31lbHNlIHM9ZC5uZXh0U3RhdGUocyxnKSwwPT09cyYmKHQ9ITApO3QmJihzPTEsbz0hMSxhPSExLHU9ITEsbj1yKzEsaT1nKSxyKyt9MTM9PT1zJiZtLnB1c2gobXQuX2NyZWF0ZUxpbmsoYyxfLGgsbixmKSl9cmV0dXJuIG19fWNsYXNzIGZ0e2NvbnN0cnVjdG9yKCl7dGhpcy5fZGVmYXVsdFZhbHVlU2V0PVtbInRydWUiLCJmYWxzZSJdLFsiVHJ1ZSIsIkZhbHNlIl0sWyJQcml2YXRlIiwiUHVibGljIiwiRnJpZW5kIiwiUmVhZE9ubHkiLCJQYXJ0aWFsIiwiUHJvdGVjdGVkIiwiV3JpdGVPbmx5Il0sWyJwdWJsaWMiLCJwcm90ZWN0ZWQiLCJwcml2YXRlIl1dfW5hdmlnYXRlVmFsdWVTZXQoZSx0LHIsbixpKXtpZihlJiZ0KXt0PXRoaXMuZG9OYXZpZ2F0ZVZhbHVlU2V0KHQsaSk7aWYodClyZXR1cm57cmFuZ2U6ZSx2YWx1ZTp0fX1pZihyJiZuKXtpPXRoaXMuZG9OYXZpZ2F0ZVZhbHVlU2V0KG4saSk7aWYoaSlyZXR1cm57cmFuZ2U6cix2YWx1ZTppfX1yZXR1cm4gbnVsbH1kb05hdmlnYXRlVmFsdWVTZXQoZSx0KXt2YXIgcj10aGlzLm51bWJlclJlcGxhY2UoZSx0KTtyZXR1cm4gbnVsbCE9PXI/cjp0aGlzLnRleHRSZXBsYWNlKGUsdCl9bnVtYmVyUmVwbGFjZShlLHQpe3ZhciByPU1hdGgucG93KDEwLGUubGVuZ3RoLShlLmxhc3RJbmRleE9mKCIuIikrMSkpO2xldCBuPU51bWJlcihlKTtlPXBhcnNlRmxvYXQoZSk7cmV0dXJuIWlzTmFOKG4pJiYhaXNOYU4oZSkmJm49PT1lJiYoMCE9PW58fHQpPyhuPU1hdGguZmxvb3IobipyKSxuKz10P3I6LXIsU3RyaW5nKG4vcikpOm51bGx9dGV4dFJlcGxhY2UoZSx0KXtyZXR1cm4gdGhpcy52YWx1ZVNldHNSZXBsYWNlKHRoaXMuX2RlZmF1bHRWYWx1ZVNldCxlLHQpfXZhbHVlU2V0c1JlcGxhY2UocixuLGkpe2xldCBzPW51bGw7Zm9yKGxldCBlPTAsdD1yLmxlbmd0aDtudWxsPT09cyYmZTx0O2UrKylzPXRoaXMudmFsdWVTZXRSZXBsYWNlKHJbZV0sbixpKTtyZXR1cm4gc312YWx1ZVNldFJlcGxhY2UoZSx0LHIpe2xldCBuPWUuaW5kZXhPZih0KTtyZXR1cm4gMDw9bj8obis9cj8xOi0xLG48MD9uPWUubGVuZ3RoLTE6biU9ZS5sZW5ndGgsZVtuXSk6bnVsbH19ZnQuSU5TVEFOQ0U9bmV3IGZ0O2NvbnN0IGd0PU9iamVjdC5mcmVlemUoZnVuY3Rpb24oZSx0KXtjb25zdCByPXNldFRpbWVvdXQoZS5iaW5kKHQpLDApO3JldHVybntkaXNwb3NlKCl7Y2xlYXJUaW1lb3V0KHIpfX19KTsoaGU9dWU9dWV8fHt9KS5pc0NhbmNlbGxhdGlvblRva2VuPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09aGUuTm9uZXx8ZT09PWhlLkNhbmNlbGxlZHx8KGUgaW5zdGFuY2VvZiBfdHx8ISghZXx8Im9iamVjdCIhPXR5cGVvZiBlKSYmKCJib29sZWFuIj09dHlwZW9mIGUuaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKSl9LGhlLk5vbmU9T2JqZWN0LmZyZWV6ZSh7aXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6ITEsb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6SHQuTm9uZX0pLGhlLkNhbmNlbGxlZD1PYmplY3QuZnJlZXplKHtpc0NhbmNlbGxhdGlvblJlcXVlc3RlZDohMCxvbkNhbmNlbGxhdGlvblJlcXVlc3RlZDpndH0pO2NsYXNzIF90e2NvbnN0cnVjdG9yKCl7dGhpcy5faXNDYW5jZWxsZWQ9ITEsdGhpcy5fZW1pdHRlcj1udWxsfWNhbmNlbCgpe3RoaXMuX2lzQ2FuY2VsbGVkfHwodGhpcy5faXNDYW5jZWxsZWQ9ITAsdGhpcy5fZW1pdHRlciYmKHRoaXMuX2VtaXR0ZXIuZmlyZSh2b2lkIDApLHRoaXMuZGlzcG9zZSgpKSl9Z2V0IGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCl7cmV0dXJuIHRoaXMuX2lzQ2FuY2VsbGVkfWdldCBvbkNhbmNlbGxhdGlvblJlcXVlc3RlZCgpe3JldHVybiB0aGlzLl9pc0NhbmNlbGxlZD9ndDoodGhpcy5fZW1pdHRlcnx8KHRoaXMuX2VtaXR0ZXI9bmV3IFIpLHRoaXMuX2VtaXR0ZXIuZXZlbnQpfWRpc3Bvc2UoKXt0aGlzLl9lbWl0dGVyJiYodGhpcy5fZW1pdHRlci5kaXNwb3NlKCksdGhpcy5fZW1pdHRlcj1udWxsKX19Y2xhc3MgcHR7Y29uc3RydWN0b3IoZSl7dGhpcy5fdG9rZW49dm9pZCAwLHRoaXMuX3BhcmVudExpc3RlbmVyPXZvaWQgMCx0aGlzLl9wYXJlbnRMaXN0ZW5lcj1lJiZlLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKHRoaXMuY2FuY2VsLHRoaXMpfWdldCB0b2tlbigpe3JldHVybiB0aGlzLl90b2tlbnx8KHRoaXMuX3Rva2VuPW5ldyBfdCksdGhpcy5fdG9rZW59Y2FuY2VsKCl7dGhpcy5fdG9rZW4/dGhpcy5fdG9rZW4gaW5zdGFuY2VvZiBfdCYmdGhpcy5fdG9rZW4uY2FuY2VsKCk6dGhpcy5fdG9rZW49dWUuQ2FuY2VsbGVkfWRpc3Bvc2UoZT0hMSl7ZSYmdGhpcy5jYW5jZWwoKSx0aGlzLl9wYXJlbnRMaXN0ZW5lciYmdGhpcy5fcGFyZW50TGlzdGVuZXIuZGlzcG9zZSgpLHRoaXMuX3Rva2VuP3RoaXMuX3Rva2VuIGluc3RhbmNlb2YgX3QmJnRoaXMuX3Rva2VuLmRpc3Bvc2UoKTp0aGlzLl90b2tlbj11ZS5Ob25lfX1jbGFzcyBDdHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2tleUNvZGVUb1N0cj1bXSx0aGlzLl9zdHJUb0tleUNvZGU9T2JqZWN0LmNyZWF0ZShudWxsKX1kZWZpbmUoZSx0KXt0aGlzLl9rZXlDb2RlVG9TdHJbZV09dCx0aGlzLl9zdHJUb0tleUNvZGVbdC50b0xvd2VyQ2FzZSgpXT1lfWtleUNvZGVUb1N0cihlKXtyZXR1cm4gdGhpcy5fa2V5Q29kZVRvU3RyW2VdfXN0clRvS2V5Q29kZShlKXtyZXR1cm4gdGhpcy5fc3RyVG9LZXlDb2RlW2UudG9Mb3dlckNhc2UoKV18fDB9fWNvbnN0IGJ0PW5ldyBDdCx2dD1uZXcgQ3QsTHQ9bmV3IEN0LHd0PW5ldyBBcnJheSgyMzApLE50PXt9LFN0PVtdLHl0PU9iamVjdC5jcmVhdGUobnVsbCksRXQ9T2JqZWN0LmNyZWF0ZShudWxsKSxBdD1bXSxNdD1bXTtmb3IobGV0IGU9MDtlPD0xOTM7ZSsrKUF0W2VdPS0xO2ZvcihsZXQgZT0wO2U8PTEyNjtlKyspTXRbZV09LTE7IWZ1bmN0aW9uKCl7bGV0IGU9W10sdD1bXTtmb3IoY29uc3QgciBvZltbMCwxLDAsIk5vbmUiLDAsInVua25vd24iLDAsIlZLX1VOS05PV04iLCIiLCIiXSxbMCwxLDEsIkh5cGVyIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMiwiU3VwZXIiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwzLCJGbiIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDQsIkZuTG9jayIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDUsIlN1c3BlbmQiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSw2LCJSZXN1bWUiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSw3LCJUdXJibyIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDgsIlNsZWVwIiwwLCIiLDAsIlZLX1NMRUVQIiwiIiwiIl0sWzAsMSw5LCJXYWtlVXAiLDAsIiIsMCwiIiwiIiwiIl0sWzMxLDAsMTAsIktleUEiLDMxLCJBIiw2NSwiVktfQSIsIiIsIiJdLFszMiwwLDExLCJLZXlCIiwzMiwiQiIsNjYsIlZLX0IiLCIiLCIiXSxbMzMsMCwxMiwiS2V5QyIsMzMsIkMiLDY3LCJWS19DIiwiIiwiIl0sWzM0LDAsMTMsIktleUQiLDM0LCJEIiw2OCwiVktfRCIsIiIsIiJdLFszNSwwLDE0LCJLZXlFIiwzNSwiRSIsNjksIlZLX0UiLCIiLCIiXSxbMzYsMCwxNSwiS2V5RiIsMzYsIkYiLDcwLCJWS19GIiwiIiwiIl0sWzM3LDAsMTYsIktleUciLDM3LCJHIiw3MSwiVktfRyIsIiIsIiJdLFszOCwwLDE3LCJLZXlIIiwzOCwiSCIsNzIsIlZLX0giLCIiLCIiXSxbMzksMCwxOCwiS2V5SSIsMzksIkkiLDczLCJWS19JIiwiIiwiIl0sWzQwLDAsMTksIktleUoiLDQwLCJKIiw3NCwiVktfSiIsIiIsIiJdLFs0MSwwLDIwLCJLZXlLIiw0MSwiSyIsNzUsIlZLX0siLCIiLCIiXSxbNDIsMCwyMSwiS2V5TCIsNDIsIkwiLDc2LCJWS19MIiwiIiwiIl0sWzQzLDAsMjIsIktleU0iLDQzLCJNIiw3NywiVktfTSIsIiIsIiJdLFs0NCwwLDIzLCJLZXlOIiw0NCwiTiIsNzgsIlZLX04iLCIiLCIiXSxbNDUsMCwyNCwiS2V5TyIsNDUsIk8iLDc5LCJWS19PIiwiIiwiIl0sWzQ2LDAsMjUsIktleVAiLDQ2LCJQIiw4MCwiVktfUCIsIiIsIiJdLFs0NywwLDI2LCJLZXlRIiw0NywiUSIsODEsIlZLX1EiLCIiLCIiXSxbNDgsMCwyNywiS2V5UiIsNDgsIlIiLDgyLCJWS19SIiwiIiwiIl0sWzQ5LDAsMjgsIktleVMiLDQ5LCJTIiw4MywiVktfUyIsIiIsIiJdLFs1MCwwLDI5LCJLZXlUIiw1MCwiVCIsODQsIlZLX1QiLCIiLCIiXSxbNTEsMCwzMCwiS2V5VSIsNTEsIlUiLDg1LCJWS19VIiwiIiwiIl0sWzUyLDAsMzEsIktleVYiLDUyLCJWIiw4NiwiVktfViIsIiIsIiJdLFs1MywwLDMyLCJLZXlXIiw1MywiVyIsODcsIlZLX1ciLCIiLCIiXSxbNTQsMCwzMywiS2V5WCIsNTQsIlgiLDg4LCJWS19YIiwiIiwiIl0sWzU1LDAsMzQsIktleVkiLDU1LCJZIiw4OSwiVktfWSIsIiIsIiJdLFs1NiwwLDM1LCJLZXlaIiw1NiwiWiIsOTAsIlZLX1oiLCIiLCIiXSxbMjIsMCwzNiwiRGlnaXQxIiwyMiwiMSIsNDksIlZLXzEiLCIiLCIiXSxbMjMsMCwzNywiRGlnaXQyIiwyMywiMiIsNTAsIlZLXzIiLCIiLCIiXSxbMjQsMCwzOCwiRGlnaXQzIiwyNCwiMyIsNTEsIlZLXzMiLCIiLCIiXSxbMjUsMCwzOSwiRGlnaXQ0IiwyNSwiNCIsNTIsIlZLXzQiLCIiLCIiXSxbMjYsMCw0MCwiRGlnaXQ1IiwyNiwiNSIsNTMsIlZLXzUiLCIiLCIiXSxbMjcsMCw0MSwiRGlnaXQ2IiwyNywiNiIsNTQsIlZLXzYiLCIiLCIiXSxbMjgsMCw0MiwiRGlnaXQ3IiwyOCwiNyIsNTUsIlZLXzciLCIiLCIiXSxbMjksMCw0MywiRGlnaXQ4IiwyOSwiOCIsNTYsIlZLXzgiLCIiLCIiXSxbMzAsMCw0NCwiRGlnaXQ5IiwzMCwiOSIsNTcsIlZLXzkiLCIiLCIiXSxbMjEsMCw0NSwiRGlnaXQwIiwyMSwiMCIsNDgsIlZLXzAiLCIiLCIiXSxbMywxLDQ2LCJFbnRlciIsMywiRW50ZXIiLDEzLCJWS19SRVRVUk4iLCIiLCIiXSxbOSwxLDQ3LCJFc2NhcGUiLDksIkVzY2FwZSIsMjcsIlZLX0VTQ0FQRSIsIiIsIiJdLFsxLDEsNDgsIkJhY2tzcGFjZSIsMSwiQmFja3NwYWNlIiw4LCJWS19CQUNLIiwiIiwiIl0sWzIsMSw0OSwiVGFiIiwyLCJUYWIiLDksIlZLX1RBQiIsIiIsIiJdLFsxMCwxLDUwLCJTcGFjZSIsMTAsIlNwYWNlIiwzMiwiVktfU1BBQ0UiLCIiLCIiXSxbODMsMCw1MSwiTWludXMiLDgzLCItIiwxODksIlZLX09FTV9NSU5VUyIsIi0iLCJPRU1fTUlOVVMiXSxbODEsMCw1MiwiRXF1YWwiLDgxLCI9IiwxODcsIlZLX09FTV9QTFVTIiwiPSIsIk9FTV9QTFVTIl0sWzg3LDAsNTMsIkJyYWNrZXRMZWZ0Iiw4NywiWyIsMjE5LCJWS19PRU1fNCIsIlsiLCJPRU1fNCJdLFs4OSwwLDU0LCJCcmFja2V0UmlnaHQiLDg5LCJdIiwyMjEsIlZLX09FTV82IiwiXSIsIk9FTV82Il0sWzg4LDAsNTUsIkJhY2tzbGFzaCIsODgsIlxcIiwyMjAsIlZLX09FTV81IiwiXFwiLCJPRU1fNSJdLFswLDAsNTYsIkludGxIYXNoIiwwLCIiLDAsIiIsIiIsIiJdLFs4MCwwLDU3LCJTZW1pY29sb24iLDgwLCI7IiwxODYsIlZLX09FTV8xIiwiOyIsIk9FTV8xIl0sWzkwLDAsNTgsIlF1b3RlIiw5MCwiJyIsMjIyLCJWS19PRU1fNyIsIiciLCJPRU1fNyJdLFs4NiwwLDU5LCJCYWNrcXVvdGUiLDg2LCJgIiwxOTIsIlZLX09FTV8zIiwiYCIsIk9FTV8zIl0sWzgyLDAsNjAsIkNvbW1hIiw4MiwiLCIsMTg4LCJWS19PRU1fQ09NTUEiLCIsIiwiT0VNX0NPTU1BIl0sWzg0LDAsNjEsIlBlcmlvZCIsODQsIi4iLDE5MCwiVktfT0VNX1BFUklPRCIsIi4iLCJPRU1fUEVSSU9EIl0sWzg1LDAsNjIsIlNsYXNoIiw4NSwiLyIsMTkxLCJWS19PRU1fMiIsIi8iLCJPRU1fMiJdLFs4LDEsNjMsIkNhcHNMb2NrIiw4LCJDYXBzTG9jayIsMjAsIlZLX0NBUElUQUwiLCIiLCIiXSxbNTksMSw2NCwiRjEiLDU5LCJGMSIsMTEyLCJWS19GMSIsIiIsIiJdLFs2MCwxLDY1LCJGMiIsNjAsIkYyIiwxMTMsIlZLX0YyIiwiIiwiIl0sWzYxLDEsNjYsIkYzIiw2MSwiRjMiLDExNCwiVktfRjMiLCIiLCIiXSxbNjIsMSw2NywiRjQiLDYyLCJGNCIsMTE1LCJWS19GNCIsIiIsIiJdLFs2MywxLDY4LCJGNSIsNjMsIkY1IiwxMTYsIlZLX0Y1IiwiIiwiIl0sWzY0LDEsNjksIkY2Iiw2NCwiRjYiLDExNywiVktfRjYiLCIiLCIiXSxbNjUsMSw3MCwiRjciLDY1LCJGNyIsMTE4LCJWS19GNyIsIiIsIiJdLFs2NiwxLDcxLCJGOCIsNjYsIkY4IiwxMTksIlZLX0Y4IiwiIiwiIl0sWzY3LDEsNzIsIkY5Iiw2NywiRjkiLDEyMCwiVktfRjkiLCIiLCIiXSxbNjgsMSw3MywiRjEwIiw2OCwiRjEwIiwxMjEsIlZLX0YxMCIsIiIsIiJdLFs2OSwxLDc0LCJGMTEiLDY5LCJGMTEiLDEyMiwiVktfRjExIiwiIiwiIl0sWzcwLDEsNzUsIkYxMiIsNzAsIkYxMiIsMTIzLCJWS19GMTIiLCIiLCIiXSxbMCwxLDc2LCJQcmludFNjcmVlbiIsMCwiIiwwLCIiLCIiLCIiXSxbNzksMSw3NywiU2Nyb2xsTG9jayIsNzksIlNjcm9sbExvY2siLDE0NSwiVktfU0NST0xMIiwiIiwiIl0sWzcsMSw3OCwiUGF1c2UiLDcsIlBhdXNlQnJlYWsiLDE5LCJWS19QQVVTRSIsIiIsIiJdLFsxOSwxLDc5LCJJbnNlcnQiLDE5LCJJbnNlcnQiLDQ1LCJWS19JTlNFUlQiLCIiLCIiXSxbMTQsMSw4MCwiSG9tZSIsMTQsIkhvbWUiLDM2LCJWS19IT01FIiwiIiwiIl0sWzExLDEsODEsIlBhZ2VVcCIsMTEsIlBhZ2VVcCIsMzMsIlZLX1BSSU9SIiwiIiwiIl0sWzIwLDEsODIsIkRlbGV0ZSIsMjAsIkRlbGV0ZSIsNDYsIlZLX0RFTEVURSIsIiIsIiJdLFsxMywxLDgzLCJFbmQiLDEzLCJFbmQiLDM1LCJWS19FTkQiLCIiLCIiXSxbMTIsMSw4NCwiUGFnZURvd24iLDEyLCJQYWdlRG93biIsMzQsIlZLX05FWFQiLCIiLCIiXSxbMTcsMSw4NSwiQXJyb3dSaWdodCIsMTcsIlJpZ2h0QXJyb3ciLDM5LCJWS19SSUdIVCIsIlJpZ2h0IiwiIl0sWzE1LDEsODYsIkFycm93TGVmdCIsMTUsIkxlZnRBcnJvdyIsMzcsIlZLX0xFRlQiLCJMZWZ0IiwiIl0sWzE4LDEsODcsIkFycm93RG93biIsMTgsIkRvd25BcnJvdyIsNDAsIlZLX0RPV04iLCJEb3duIiwiIl0sWzE2LDEsODgsIkFycm93VXAiLDE2LCJVcEFycm93IiwzOCwiVktfVVAiLCJVcCIsIiJdLFs3OCwxLDg5LCJOdW1Mb2NrIiw3OCwiTnVtTG9jayIsMTQ0LCJWS19OVU1MT0NLIiwiIiwiIl0sWzEwOCwxLDkwLCJOdW1wYWREaXZpZGUiLDEwOCwiTnVtUGFkX0RpdmlkZSIsMTExLCJWS19ESVZJREUiLCIiLCIiXSxbMTAzLDEsOTEsIk51bXBhZE11bHRpcGx5IiwxMDMsIk51bVBhZF9NdWx0aXBseSIsMTA2LCJWS19NVUxUSVBMWSIsIiIsIiJdLFsxMDYsMSw5MiwiTnVtcGFkU3VidHJhY3QiLDEwNiwiTnVtUGFkX1N1YnRyYWN0IiwxMDksIlZLX1NVQlRSQUNUIiwiIiwiIl0sWzEwNCwxLDkzLCJOdW1wYWRBZGQiLDEwNCwiTnVtUGFkX0FkZCIsMTA3LCJWS19BREQiLCIiLCIiXSxbMywxLDk0LCJOdW1wYWRFbnRlciIsMywiIiwwLCIiLCIiLCIiXSxbOTQsMSw5NSwiTnVtcGFkMSIsOTQsIk51bVBhZDEiLDk3LCJWS19OVU1QQUQxIiwiIiwiIl0sWzk1LDEsOTYsIk51bXBhZDIiLDk1LCJOdW1QYWQyIiw5OCwiVktfTlVNUEFEMiIsIiIsIiJdLFs5NiwxLDk3LCJOdW1wYWQzIiw5NiwiTnVtUGFkMyIsOTksIlZLX05VTVBBRDMiLCIiLCIiXSxbOTcsMSw5OCwiTnVtcGFkNCIsOTcsIk51bVBhZDQiLDEwMCwiVktfTlVNUEFENCIsIiIsIiJdLFs5OCwxLDk5LCJOdW1wYWQ1Iiw5OCwiTnVtUGFkNSIsMTAxLCJWS19OVU1QQUQ1IiwiIiwiIl0sWzk5LDEsMTAwLCJOdW1wYWQ2Iiw5OSwiTnVtUGFkNiIsMTAyLCJWS19OVU1QQUQ2IiwiIiwiIl0sWzEwMCwxLDEwMSwiTnVtcGFkNyIsMTAwLCJOdW1QYWQ3IiwxMDMsIlZLX05VTVBBRDciLCIiLCIiXSxbMTAxLDEsMTAyLCJOdW1wYWQ4IiwxMDEsIk51bVBhZDgiLDEwNCwiVktfTlVNUEFEOCIsIiIsIiJdLFsxMDIsMSwxMDMsIk51bXBhZDkiLDEwMiwiTnVtUGFkOSIsMTA1LCJWS19OVU1QQUQ5IiwiIiwiIl0sWzkzLDEsMTA0LCJOdW1wYWQwIiw5MywiTnVtUGFkMCIsOTYsIlZLX05VTVBBRDAiLCIiLCIiXSxbMTA3LDEsMTA1LCJOdW1wYWREZWNpbWFsIiwxMDcsIk51bVBhZF9EZWNpbWFsIiwxMTAsIlZLX0RFQ0lNQUwiLCIiLCIiXSxbOTIsMCwxMDYsIkludGxCYWNrc2xhc2giLDkyLCJPRU1fMTAyIiwyMjYsIlZLX09FTV8xMDIiLCIiLCIiXSxbNTgsMSwxMDcsIkNvbnRleHRNZW51Iiw1OCwiQ29udGV4dE1lbnUiLDkzLCIiLCIiLCIiXSxbMCwxLDEwOCwiUG93ZXIiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxMDksIk51bXBhZEVxdWFsIiwwLCIiLDAsIiIsIiIsIiJdLFs3MSwxLDExMCwiRjEzIiw3MSwiRjEzIiwxMjQsIlZLX0YxMyIsIiIsIiJdLFs3MiwxLDExMSwiRjE0Iiw3MiwiRjE0IiwxMjUsIlZLX0YxNCIsIiIsIiJdLFs3MywxLDExMiwiRjE1Iiw3MywiRjE1IiwxMjYsIlZLX0YxNSIsIiIsIiJdLFs3NCwxLDExMywiRjE2Iiw3NCwiRjE2IiwxMjcsIlZLX0YxNiIsIiIsIiJdLFs3NSwxLDExNCwiRjE3Iiw3NSwiRjE3IiwxMjgsIlZLX0YxNyIsIiIsIiJdLFs3NiwxLDExNSwiRjE4Iiw3NiwiRjE4IiwxMjksIlZLX0YxOCIsIiIsIiJdLFs3NywxLDExNiwiRjE5Iiw3NywiRjE5IiwxMzAsIlZLX0YxOSIsIiIsIiJdLFswLDEsMTE3LCJGMjAiLDAsIiIsMCwiVktfRjIwIiwiIiwiIl0sWzAsMSwxMTgsIkYyMSIsMCwiIiwwLCJWS19GMjEiLCIiLCIiXSxbMCwxLDExOSwiRjIyIiwwLCIiLDAsIlZLX0YyMiIsIiIsIiJdLFswLDEsMTIwLCJGMjMiLDAsIiIsMCwiVktfRjIzIiwiIiwiIl0sWzAsMSwxMjEsIkYyNCIsMCwiIiwwLCJWS19GMjQiLCIiLCIiXSxbMCwxLDEyMiwiT3BlbiIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDEyMywiSGVscCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDEyNCwiU2VsZWN0IiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTI1LCJBZ2FpbiIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDEyNiwiVW5kbyIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDEyNywiQ3V0IiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTI4LCJDb3B5IiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTI5LCJQYXN0ZSIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDEzMCwiRmluZCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDEzMSwiQXVkaW9Wb2x1bWVNdXRlIiwxMTIsIkF1ZGlvVm9sdW1lTXV0ZSIsMTczLCJWS19WT0xVTUVfTVVURSIsIiIsIiJdLFswLDEsMTMyLCJBdWRpb1ZvbHVtZVVwIiwxMTMsIkF1ZGlvVm9sdW1lVXAiLDE3NSwiVktfVk9MVU1FX1VQIiwiIiwiIl0sWzAsMSwxMzMsIkF1ZGlvVm9sdW1lRG93biIsMTE0LCJBdWRpb1ZvbHVtZURvd24iLDE3NCwiVktfVk9MVU1FX0RPV04iLCIiLCIiXSxbMTA1LDEsMTM0LCJOdW1wYWRDb21tYSIsMTA1LCJOdW1QYWRfU2VwYXJhdG9yIiwxMDgsIlZLX1NFUEFSQVRPUiIsIiIsIiJdLFsxMTAsMCwxMzUsIkludGxSbyIsMTEwLCJBQk5UX0MxIiwxOTMsIlZLX0FCTlRfQzEiLCIiLCIiXSxbMCwxLDEzNiwiS2FuYU1vZGUiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMCwxMzcsIkludGxZZW4iLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxMzgsIkNvbnZlcnQiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxMzksIk5vbkNvbnZlcnQiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNDAsIkxhbmcxIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTQxLCJMYW5nMiIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE0MiwiTGFuZzMiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNDMsIkxhbmc0IiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTQ0LCJMYW5nNSIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE0NSwiQWJvcnQiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNDYsIlByb3BzIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTQ3LCJOdW1wYWRQYXJlbkxlZnQiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNDgsIk51bXBhZFBhcmVuUmlnaHQiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNDksIk51bXBhZEJhY2tzcGFjZSIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE1MCwiTnVtcGFkTWVtb3J5U3RvcmUiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNTEsIk51bXBhZE1lbW9yeVJlY2FsbCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE1MiwiTnVtcGFkTWVtb3J5Q2xlYXIiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNTMsIk51bXBhZE1lbW9yeUFkZCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE1NCwiTnVtcGFkTWVtb3J5U3VidHJhY3QiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNTUsIk51bXBhZENsZWFyIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTU2LCJOdW1wYWRDbGVhckVudHJ5IiwwLCIiLDAsIiIsIiIsIiJdLFs1LDEsMCwiIiw1LCJDdHJsIiwxNywiVktfQ09OVFJPTCIsIiIsIiJdLFs0LDEsMCwiIiw0LCJTaGlmdCIsMTYsIlZLX1NISUZUIiwiIiwiIl0sWzYsMSwwLCIiLDYsIkFsdCIsMTgsIlZLX01FTlUiLCIiLCIiXSxbNTcsMSwwLCIiLDU3LCJNZXRhIiwwLCJWS19DT01NQU5EIiwiIiwiIl0sWzUsMSwxNTcsIkNvbnRyb2xMZWZ0Iiw1LCIiLDAsIlZLX0xDT05UUk9MIiwiIiwiIl0sWzQsMSwxNTgsIlNoaWZ0TGVmdCIsNCwiIiwwLCJWS19MU0hJRlQiLCIiLCIiXSxbNiwxLDE1OSwiQWx0TGVmdCIsNiwiIiwwLCJWS19MTUVOVSIsIiIsIiJdLFs1NywxLDE2MCwiTWV0YUxlZnQiLDU3LCIiLDAsIlZLX0xXSU4iLCIiLCIiXSxbNSwxLDE2MSwiQ29udHJvbFJpZ2h0Iiw1LCIiLDAsIlZLX1JDT05UUk9MIiwiIiwiIl0sWzQsMSwxNjIsIlNoaWZ0UmlnaHQiLDQsIiIsMCwiVktfUlNISUZUIiwiIiwiIl0sWzYsMSwxNjMsIkFsdFJpZ2h0Iiw2LCIiLDAsIlZLX1JNRU5VIiwiIiwiIl0sWzU3LDEsMTY0LCJNZXRhUmlnaHQiLDU3LCIiLDAsIlZLX1JXSU4iLCIiLCIiXSxbMCwxLDE2NSwiQnJpZ2h0bmVzc1VwIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTY2LCJCcmlnaHRuZXNzRG93biIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE2NywiTWVkaWFQbGF5IiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTY4LCJNZWRpYVJlY29yZCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE2OSwiTWVkaWFGYXN0Rm9yd2FyZCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE3MCwiTWVkaWFSZXdpbmQiLDAsIiIsMCwiIiwiIiwiIl0sWzExNCwxLDE3MSwiTWVkaWFUcmFja05leHQiLDExOSwiTWVkaWFUcmFja05leHQiLDE3NiwiVktfTUVESUFfTkVYVF9UUkFDSyIsIiIsIiJdLFsxMTUsMSwxNzIsIk1lZGlhVHJhY2tQcmV2aW91cyIsMTIwLCJNZWRpYVRyYWNrUHJldmlvdXMiLDE3NywiVktfTUVESUFfUFJFVl9UUkFDSyIsIiIsIiJdLFsxMTYsMSwxNzMsIk1lZGlhU3RvcCIsMTIxLCJNZWRpYVN0b3AiLDE3OCwiVktfTUVESUFfU1RPUCIsIiIsIiJdLFswLDEsMTc0LCJFamVjdCIsMCwiIiwwLCIiLCIiLCIiXSxbMTE3LDEsMTc1LCJNZWRpYVBsYXlQYXVzZSIsMTIyLCJNZWRpYVBsYXlQYXVzZSIsMTc5LCJWS19NRURJQV9QTEFZX1BBVVNFIiwiIiwiIl0sWzAsMSwxNzYsIk1lZGlhU2VsZWN0IiwxMjMsIkxhdW5jaE1lZGlhUGxheWVyIiwxODEsIlZLX01FRElBX0xBVU5DSF9NRURJQV9TRUxFQ1QiLCIiLCIiXSxbMCwxLDE3NywiTGF1bmNoTWFpbCIsMTI0LCJMYXVuY2hNYWlsIiwxODAsIlZLX01FRElBX0xBVU5DSF9NQUlMIiwiIiwiIl0sWzAsMSwxNzgsIkxhdW5jaEFwcDIiLDEyNSwiTGF1bmNoQXBwMiIsMTgzLCJWS19NRURJQV9MQVVOQ0hfQVBQMiIsIiIsIiJdLFswLDEsMTc5LCJMYXVuY2hBcHAxIiwwLCIiLDAsIlZLX01FRElBX0xBVU5DSF9BUFAxIiwiIiwiIl0sWzAsMSwxODAsIlNlbGVjdFRhc2siLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxODEsIkxhdW5jaFNjcmVlblNhdmVyIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTgyLCJCcm93c2VyU2VhcmNoIiwxMTUsIkJyb3dzZXJTZWFyY2giLDE3MCwiVktfQlJPV1NFUl9TRUFSQ0giLCIiLCIiXSxbMCwxLDE4MywiQnJvd3NlckhvbWUiLDExNiwiQnJvd3NlckhvbWUiLDE3MiwiVktfQlJPV1NFUl9IT01FIiwiIiwiIl0sWzExMiwxLDE4NCwiQnJvd3NlckJhY2siLDExNywiQnJvd3NlckJhY2siLDE2NiwiVktfQlJPV1NFUl9CQUNLIiwiIiwiIl0sWzExMywxLDE4NSwiQnJvd3NlckZvcndhcmQiLDExOCwiQnJvd3NlckZvcndhcmQiLDE2NywiVktfQlJPV1NFUl9GT1JXQVJEIiwiIiwiIl0sWzAsMSwxODYsIkJyb3dzZXJTdG9wIiwwLCIiLDAsIlZLX0JST1dTRVJfU1RPUCIsIiIsIiJdLFswLDEsMTg3LCJCcm93c2VyUmVmcmVzaCIsMCwiIiwwLCJWS19CUk9XU0VSX1JFRlJFU0giLCIiLCIiXSxbMCwxLDE4OCwiQnJvd3NlckZhdm9yaXRlcyIsMCwiIiwwLCJWS19CUk9XU0VSX0ZBVk9SSVRFUyIsIiIsIiJdLFswLDEsMTg5LCJab29tVG9nZ2xlIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTkwLCJNYWlsUmVwbHkiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxOTEsIk1haWxGb3J3YXJkIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTkyLCJNYWlsU2VuZCIsMCwiIiwwLCIiLCIiLCIiXSxbMTA5LDEsMCwiIiwxMDksIktleUluQ29tcG9zaXRpb24iLDIyOSwiIiwiIiwiIl0sWzExMSwxLDAsIiIsMTExLCJBQk5UX0MyIiwxOTQsIlZLX0FCTlRfQzIiLCIiLCIiXSxbOTEsMSwwLCIiLDkxLCJPRU1fOCIsMjIzLCJWS19PRU1fOCIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0NMRUFSIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfS0FOQSIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0hBTkdVTCIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0pVTkpBIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfRklOQUwiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19IQU5KQSIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0tBTkpJIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfQ09OVkVSVCIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX05PTkNPTlZFUlQiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19BQ0NFUFQiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19NT0RFQ0hBTkdFIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfU0VMRUNUIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfUFJJTlQiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19FWEVDVVRFIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfU05BUFNIT1QiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19IRUxQIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfQVBQUyIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX1BST0NFU1NLRVkiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19QQUNLRVQiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19EQkVfU0JDU0NIQVIiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19EQkVfREJDU0NIQVIiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19BVFROIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfQ1JTRUwiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19FWFNFTCIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0VSRU9GIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfUExBWSIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX1pPT00iLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19OT05BTUUiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19QQTEiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19PRU1fQ0xFQVIiLCIiLCIiXV0pe2NvbnN0WyxuLGkscyxvLGEsbCx1LGgsZF09cjtpZih0W2ldfHwodFtpXT0hMCxTdFtpXT1zLHl0W3NdPWksRXRbcy50b0xvd2VyQ2FzZSgpXT1pLG4mJjAhPT0oQXRbaV09bykmJjMhPT1vJiY1IT09byYmNCE9PW8mJjYhPT1vJiY1NyE9PW8mJihNdFtvXT1pKSksIWVbb10pe2lmKGVbb109ITAsIWEpdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgcmVwcmVzZW50YXRpb24gbWlzc2luZyBmb3Iga2V5IGNvZGUgJHtvfSBhcm91bmQgc2NhbiBjb2RlIGArcyk7YnQuZGVmaW5lKG8sYSksdnQuZGVmaW5lKG8saHx8YSksTHQuZGVmaW5lKG8sZHx8aHx8YSl9bCYmKHd0W2xdPW8pLHUmJihOdFt1XT1vKX1NdFszXT00Nn0oKTtjbGFzcyB4dCBleHRlbmRzIHple2NvbnN0cnVjdG9yKGUsdCxyLG4pe3N1cGVyKGUsdCxyLG4pLHRoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPWUsdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbj10LHRoaXMucG9zaXRpb25MaW5lTnVtYmVyPXIsdGhpcy5wb3NpdGlvbkNvbHVtbj1ufXRvU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyKyIsIit0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uKyIgLT4gIit0aGlzLnBvc2l0aW9uTGluZU51bWJlcisiLCIrdGhpcy5wb3NpdGlvbkNvbHVtbisiXSJ9ZXF1YWxzU2VsZWN0aW9uKGUpe3JldHVybiB4dC5zZWxlY3Rpb25zRXF1YWwodGhpcyxlKX1zdGF0aWMgc2VsZWN0aW9uc0VxdWFsKGUsdCl7cmV0dXJuIGUuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPT09dC5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXImJmUuc2VsZWN0aW9uU3RhcnRDb2x1bW49PT10LnNlbGVjdGlvblN0YXJ0Q29sdW1uJiZlLnBvc2l0aW9uTGluZU51bWJlcj09PXQucG9zaXRpb25MaW5lTnVtYmVyJiZlLnBvc2l0aW9uQ29sdW1uPT09dC5wb3NpdGlvbkNvbHVtbn1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXI9PT10aGlzLnN0YXJ0TGluZU51bWJlciYmdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbj09PXRoaXMuc3RhcnRDb2x1bW4/MDoxfXNldEVuZFBvc2l0aW9uKGUsdCl7cmV0dXJuIDA9PT10aGlzLmdldERpcmVjdGlvbigpP25ldyB4dCh0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uLGUsdCk6bmV3IHh0KGUsdCx0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uKX1nZXRQb3NpdGlvbigpe3JldHVybiBuZXcgV2UodGhpcy5wb3NpdGlvbkxpbmVOdW1iZXIsdGhpcy5wb3NpdGlvbkNvbHVtbil9Z2V0U2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gbmV3IFdlKHRoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyLHRoaXMuc2VsZWN0aW9uU3RhcnRDb2x1bW4pfXNldFN0YXJ0UG9zaXRpb24oZSx0KXtyZXR1cm4gMD09PXRoaXMuZ2V0RGlyZWN0aW9uKCk/bmV3IHh0KGUsdCx0aGlzLmVuZExpbmVOdW1iZXIsdGhpcy5lbmRDb2x1bW4pOm5ldyB4dCh0aGlzLmVuZExpbmVOdW1iZXIsdGhpcy5lbmRDb2x1bW4sZSx0KX1zdGF0aWMgZnJvbVBvc2l0aW9ucyhlLHQ9ZSl7cmV0dXJuIG5ldyB4dChlLmxpbmVOdW1iZXIsZS5jb2x1bW4sdC5saW5lTnVtYmVyLHQuY29sdW1uKX1zdGF0aWMgZnJvbVJhbmdlKGUsdCl7cmV0dXJuIDA9PT10P25ldyB4dChlLnN0YXJ0TGluZU51bWJlcixlLnN0YXJ0Q29sdW1uLGUuZW5kTGluZU51bWJlcixlLmVuZENvbHVtbik6bmV3IHh0KGUuZW5kTGluZU51bWJlcixlLmVuZENvbHVtbixlLnN0YXJ0TGluZU51bWJlcixlLnN0YXJ0Q29sdW1uKX1zdGF0aWMgbGlmdFNlbGVjdGlvbihlKXtyZXR1cm4gbmV3IHh0KGUuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyLGUuc2VsZWN0aW9uU3RhcnRDb2x1bW4sZS5wb3NpdGlvbkxpbmVOdW1iZXIsZS5wb3NpdGlvbkNvbHVtbil9c3RhdGljIHNlbGVjdGlvbnNBcnJFcXVhbChyLG4pe2lmKHImJiFufHwhciYmbilyZXR1cm4hMTtpZighciYmIW4pcmV0dXJuITA7aWYoci5sZW5ndGghPT1uLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IGU9MCx0PXIubGVuZ3RoO2U8dDtlKyspaWYoIXRoaXMuc2VsZWN0aW9uc0VxdWFsKHJbZV0sbltlXSkpcmV0dXJuITE7cmV0dXJuITB9c3RhdGljIGlzSVNlbGVjdGlvbihlKXtyZXR1cm4gZSYmIm51bWJlciI9PXR5cGVvZiBlLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciYmIm51bWJlciI9PXR5cGVvZiBlLnNlbGVjdGlvblN0YXJ0Q29sdW1uJiYibnVtYmVyIj09dHlwZW9mIGUucG9zaXRpb25MaW5lTnVtYmVyJiYibnVtYmVyIj09dHlwZW9mIGUucG9zaXRpb25Db2x1bW59c3RhdGljIGNyZWF0ZVdpdGhEaXJlY3Rpb24oZSx0LHIsbixpKXtyZXR1cm4gMD09PWk/bmV3IHh0KGUsdCxyLG4pOm5ldyB4dChyLG4sZSx0KX19Y2xhc3MgS3R7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuX3Rva2VuQnJhbmQ9dm9pZCAwLHRoaXMub2Zmc2V0PWUsdGhpcy50eXBlPXQsdGhpcy5sYW5ndWFnZT1yfXRvU3RyaW5nKCl7cmV0dXJuIigiK3RoaXMub2Zmc2V0KyIsICIrdGhpcy50eXBlKyIpIn19Y2xhc3MgVnR7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl90b2tlbml6YXRpb25SZXN1bHRCcmFuZD12b2lkIDAsdGhpcy50b2tlbnM9ZSx0aGlzLmVuZFN0YXRlPXR9fWNsYXNzIEl0e2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fdG9rZW5pemF0aW9uUmVzdWx0MkJyYW5kPXZvaWQgMCx0aGlzLnRva2Vucz1lLHRoaXMuZW5kU3RhdGU9dH19KEh0PWRlPWRlfHx7fSlbSHQuRGVwZW5kc09uS2JMYXlvdXQ9LTFdPSJEZXBlbmRzT25LYkxheW91dCIsSHRbSHQuVW5rbm93bj0wXT0iVW5rbm93biIsSHRbSHQuQmFja3NwYWNlPTFdPSJCYWNrc3BhY2UiLEh0W0h0LlRhYj0yXT0iVGFiIixIdFtIdC5FbnRlcj0zXT0iRW50ZXIiLEh0W0h0LlNoaWZ0PTRdPSJTaGlmdCIsSHRbSHQuQ3RybD01XT0iQ3RybCIsSHRbSHQuQWx0PTZdPSJBbHQiLEh0W0h0LlBhdXNlQnJlYWs9N109IlBhdXNlQnJlYWsiLEh0W0h0LkNhcHNMb2NrPThdPSJDYXBzTG9jayIsSHRbSHQuRXNjYXBlPTldPSJFc2NhcGUiLEh0W0h0LlNwYWNlPTEwXT0iU3BhY2UiLEh0W0h0LlBhZ2VVcD0xMV09IlBhZ2VVcCIsSHRbSHQuUGFnZURvd249MTJdPSJQYWdlRG93biIsSHRbSHQuRW5kPTEzXT0iRW5kIixIdFtIdC5Ib21lPTE0XT0iSG9tZSIsSHRbSHQuTGVmdEFycm93PTE1XT0iTGVmdEFycm93IixIdFtIdC5VcEFycm93PTE2XT0iVXBBcnJvdyIsSHRbSHQuUmlnaHRBcnJvdz0xN109IlJpZ2h0QXJyb3ciLEh0W0h0LkRvd25BcnJvdz0xOF09IkRvd25BcnJvdyIsSHRbSHQuSW5zZXJ0PTE5XT0iSW5zZXJ0IixIdFtIdC5EZWxldGU9MjBdPSJEZWxldGUiLEh0W0h0LkRpZ2l0MD0yMV09IkRpZ2l0MCIsSHRbSHQuRGlnaXQxPTIyXT0iRGlnaXQxIixIdFtIdC5EaWdpdDI9MjNdPSJEaWdpdDIiLEh0W0h0LkRpZ2l0Mz0yNF09IkRpZ2l0MyIsSHRbSHQuRGlnaXQ0PTI1XT0iRGlnaXQ0IixIdFtIdC5EaWdpdDU9MjZdPSJEaWdpdDUiLEh0W0h0LkRpZ2l0Nj0yN109IkRpZ2l0NiIsSHRbSHQuRGlnaXQ3PTI4XT0iRGlnaXQ3IixIdFtIdC5EaWdpdDg9MjldPSJEaWdpdDgiLEh0W0h0LkRpZ2l0OT0zMF09IkRpZ2l0OSIsSHRbSHQuS2V5QT0zMV09IktleUEiLEh0W0h0LktleUI9MzJdPSJLZXlCIixIdFtIdC5LZXlDPTMzXT0iS2V5QyIsSHRbSHQuS2V5RD0zNF09IktleUQiLEh0W0h0LktleUU9MzVdPSJLZXlFIixIdFtIdC5LZXlGPTM2XT0iS2V5RiIsSHRbSHQuS2V5Rz0zN109IktleUciLEh0W0h0LktleUg9MzhdPSJLZXlIIixIdFtIdC5LZXlJPTM5XT0iS2V5SSIsSHRbSHQuS2V5Sj00MF09IktleUoiLEh0W0h0LktleUs9NDFdPSJLZXlLIixIdFtIdC5LZXlMPTQyXT0iS2V5TCIsSHRbSHQuS2V5TT00M109IktleU0iLEh0W0h0LktleU49NDRdPSJLZXlOIixIdFtIdC5LZXlPPTQ1XT0iS2V5TyIsSHRbSHQuS2V5UD00Nl09IktleVAiLEh0W0h0LktleVE9NDddPSJLZXlRIixIdFtIdC5LZXlSPTQ4XT0iS2V5UiIsSHRbSHQuS2V5Uz00OV09IktleVMiLEh0W0h0LktleVQ9NTBdPSJLZXlUIixIdFtIdC5LZXlVPTUxXT0iS2V5VSIsSHRbSHQuS2V5Vj01Ml09IktleVYiLEh0W0h0LktleVc9NTNdPSJLZXlXIixIdFtIdC5LZXlYPTU0XT0iS2V5WCIsSHRbSHQuS2V5WT01NV09IktleVkiLEh0W0h0LktleVo9NTZdPSJLZXlaIixIdFtIdC5NZXRhPTU3XT0iTWV0YSIsSHRbSHQuQ29udGV4dE1lbnU9NThdPSJDb250ZXh0TWVudSIsSHRbSHQuRjE9NTldPSJGMSIsSHRbSHQuRjI9NjBdPSJGMiIsSHRbSHQuRjM9NjFdPSJGMyIsSHRbSHQuRjQ9NjJdPSJGNCIsSHRbSHQuRjU9NjNdPSJGNSIsSHRbSHQuRjY9NjRdPSJGNiIsSHRbSHQuRjc9NjVdPSJGNyIsSHRbSHQuRjg9NjZdPSJGOCIsSHRbSHQuRjk9NjddPSJGOSIsSHRbSHQuRjEwPTY4XT0iRjEwIixIdFtIdC5GMTE9NjldPSJGMTEiLEh0W0h0LkYxMj03MF09IkYxMiIsSHRbSHQuRjEzPTcxXT0iRjEzIixIdFtIdC5GMTQ9NzJdPSJGMTQiLEh0W0h0LkYxNT03M109IkYxNSIsSHRbSHQuRjE2PTc0XT0iRjE2IixIdFtIdC5GMTc9NzVdPSJGMTciLEh0W0h0LkYxOD03Nl09IkYxOCIsSHRbSHQuRjE5PTc3XT0iRjE5IixIdFtIdC5OdW1Mb2NrPTc4XT0iTnVtTG9jayIsSHRbSHQuU2Nyb2xsTG9jaz03OV09IlNjcm9sbExvY2siLEh0W0h0LlNlbWljb2xvbj04MF09IlNlbWljb2xvbiIsSHRbSHQuRXF1YWw9ODFdPSJFcXVhbCIsSHRbSHQuQ29tbWE9ODJdPSJDb21tYSIsSHRbSHQuTWludXM9ODNdPSJNaW51cyIsSHRbSHQuUGVyaW9kPTg0XT0iUGVyaW9kIixIdFtIdC5TbGFzaD04NV09IlNsYXNoIixIdFtIdC5CYWNrcXVvdGU9ODZdPSJCYWNrcXVvdGUiLEh0W0h0LkJyYWNrZXRMZWZ0PTg3XT0iQnJhY2tldExlZnQiLEh0W0h0LkJhY2tzbGFzaD04OF09IkJhY2tzbGFzaCIsSHRbSHQuQnJhY2tldFJpZ2h0PTg5XT0iQnJhY2tldFJpZ2h0IixIdFtIdC5RdW90ZT05MF09IlF1b3RlIixIdFtIdC5PRU1fOD05MV09Ik9FTV84IixIdFtIdC5JbnRsQmFja3NsYXNoPTkyXT0iSW50bEJhY2tzbGFzaCIsSHRbSHQuTnVtcGFkMD05M109Ik51bXBhZDAiLEh0W0h0Lk51bXBhZDE9OTRdPSJOdW1wYWQxIixIdFtIdC5OdW1wYWQyPTk1XT0iTnVtcGFkMiIsSHRbSHQuTnVtcGFkMz05Nl09Ik51bXBhZDMiLEh0W0h0Lk51bXBhZDQ9OTddPSJOdW1wYWQ0IixIdFtIdC5OdW1wYWQ1PTk4XT0iTnVtcGFkNSIsSHRbSHQuTnVtcGFkNj05OV09Ik51bXBhZDYiLEh0W0h0Lk51bXBhZDc9MTAwXT0iTnVtcGFkNyIsSHRbSHQuTnVtcGFkOD0xMDFdPSJOdW1wYWQ4IixIdFtIdC5OdW1wYWQ5PTEwMl09Ik51bXBhZDkiLEh0W0h0Lk51bXBhZE11bHRpcGx5PTEwM109Ik51bXBhZE11bHRpcGx5IixIdFtIdC5OdW1wYWRBZGQ9MTA0XT0iTnVtcGFkQWRkIixIdFtIdC5OVU1QQURfU0VQQVJBVE9SPTEwNV09Ik5VTVBBRF9TRVBBUkFUT1IiLEh0W0h0Lk51bXBhZFN1YnRyYWN0PTEwNl09Ik51bXBhZFN1YnRyYWN0IixIdFtIdC5OdW1wYWREZWNpbWFsPTEwN109Ik51bXBhZERlY2ltYWwiLEh0W0h0Lk51bXBhZERpdmlkZT0xMDhdPSJOdW1wYWREaXZpZGUiLEh0W0h0LktFWV9JTl9DT01QT1NJVElPTj0xMDldPSJLRVlfSU5fQ09NUE9TSVRJT04iLEh0W0h0LkFCTlRfQzE9MTEwXT0iQUJOVF9DMSIsSHRbSHQuQUJOVF9DMj0xMTFdPSJBQk5UX0MyIixIdFtIdC5BdWRpb1ZvbHVtZU11dGU9MTEyXT0iQXVkaW9Wb2x1bWVNdXRlIixIdFtIdC5BdWRpb1ZvbHVtZVVwPTExM109IkF1ZGlvVm9sdW1lVXAiLEh0W0h0LkF1ZGlvVm9sdW1lRG93bj0xMTRdPSJBdWRpb1ZvbHVtZURvd24iLEh0W0h0LkJyb3dzZXJTZWFyY2g9MTE1XT0iQnJvd3NlclNlYXJjaCIsSHRbSHQuQnJvd3NlckhvbWU9MTE2XT0iQnJvd3NlckhvbWUiLEh0W0h0LkJyb3dzZXJCYWNrPTExN109IkJyb3dzZXJCYWNrIixIdFtIdC5Ccm93c2VyRm9yd2FyZD0xMThdPSJCcm93c2VyRm9yd2FyZCIsSHRbSHQuTWVkaWFUcmFja05leHQ9MTE5XT0iTWVkaWFUcmFja05leHQiLEh0W0h0Lk1lZGlhVHJhY2tQcmV2aW91cz0xMjBdPSJNZWRpYVRyYWNrUHJldmlvdXMiLEh0W0h0Lk1lZGlhU3RvcD0xMjFdPSJNZWRpYVN0b3AiLEh0W0h0Lk1lZGlhUGxheVBhdXNlPTEyMl09Ik1lZGlhUGxheVBhdXNlIixIdFtIdC5MYXVuY2hNZWRpYVBsYXllcj0xMjNdPSJMYXVuY2hNZWRpYVBsYXllciIsSHRbSHQuTGF1bmNoTWFpbD0xMjRdPSJMYXVuY2hNYWlsIixIdFtIdC5MYXVuY2hBcHAyPTEyNV09IkxhdW5jaEFwcDIiLEh0W0h0Lk1BWF9WQUxVRT0xMjZdPSJNQVhfVkFMVUUiLChIdD1jZT1jZXx8e30pW0h0LlRyYWNlPTBdPSJUcmFjZSIsSHRbSHQuRGVidWc9MV09IkRlYnVnIixIdFtIdC5JbmZvPTJdPSJJbmZvIixIdFtIdC5XYXJuaW5nPTNdPSJXYXJuaW5nIixIdFtIdC5FcnJvcj00XT0iRXJyb3IiLEh0W0h0LkNyaXRpY2FsPTVdPSJDcml0aWNhbCIsSHRbSHQuT2ZmPTZdPSJPZmYiLChIdD1tZT1tZXx8e30pW0h0LlBhcmFncmFwaD0wXT0iUGFyYWdyYXBoIixIdFtIdC5CcmVhaz0xXT0iQnJlYWsiLChIdD1mZT1mZXx8e30pW0h0LkhpbnQ9MV09IkhpbnQiLEh0W0h0LkluZm89Ml09IkluZm8iLEh0W0h0Lldhcm5pbmc9NF09Ildhcm5pbmciLEh0W0h0LkVycm9yPThdPSJFcnJvciIsKEh0PWdlPWdlfHx7fSlbSHQuVW5uZWNlc3Nhcnk9MV09IlVubmVjZXNzYXJ5IixIdFtIdC5EZXByZWNhdGVkPTJdPSJEZXByZWNhdGVkIiwoSHQ9X2U9X2V8fHt9KVtIdC5MVFI9MF09IkxUUiIsSHRbSHQuUlRMPTFdPSJSVEwiO2NvbnN0IFB0PW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2ljb25zPW5ldyBNYXAsdGhpcy5fb25EaWRSZWdpc3Rlcj1uZXcgUn1hZGQoZSl7Y29uc3QgdD10aGlzLl9pY29ucy5nZXQoZS5pZCk7dD9lLmRlc2NyaXB0aW9uP3QuZGVzY3JpcHRpb249ZS5kZXNjcmlwdGlvbjpjb25zb2xlLmVycm9yKCJEdXBsaWNhdGUgcmVnaXN0cmF0aW9uIG9mIGNvZGljb24gIitlLmlkKToodGhpcy5faWNvbnMuc2V0KGUuaWQsZSksdGhpcy5fb25EaWRSZWdpc3Rlci5maXJlKGUpKX1nZXQoZSl7cmV0dXJuIHRoaXMuX2ljb25zLmdldChlKX1nZXQgYWxsKCl7cmV0dXJuIHRoaXMuX2ljb25zLnZhbHVlcygpfWdldCBvbkRpZFJlZ2lzdGVyKCl7cmV0dXJuIHRoaXMuX29uRGlkUmVnaXN0ZXIuZXZlbnR9fTtjbGFzcyBSdHtjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5pZD1lLHRoaXMuZGVmaW5pdGlvbj10LHRoaXMuZGVzY3JpcHRpb249cixQdC5hZGQodGhpcyl9Z2V0IGNsYXNzTmFtZXMoKXtyZXR1cm4iY29kaWNvbiBjb2RpY29uLSIrdGhpcy5pZH1nZXQgY2xhc3NOYW1lc0FycmF5KCl7cmV0dXJuWyJjb2RpY29uIiwiY29kaWNvbi0iK3RoaXMuaWRdfWdldCBjc3NTZWxlY3Rvcigpe3JldHVybiIuY29kaWNvbi5jb2RpY29uLSIrdGhpcy5pZH19UnQuYWRkPW5ldyBSdCgiYWRkIix7Zm9udENoYXJhY3RlcjoiXFxlYTYwIn0pLFJ0LmxpZ2h0QnVsYj1uZXcgUnQoImxpZ2h0LWJ1bGIiLHtmb250Q2hhcmFjdGVyOiJcXGVhNjEifSksUnQud2FybmluZz1uZXcgUnQoIndhcm5pbmciLHtmb250Q2hhcmFjdGVyOiJcXGVhNmMifSksUnQuaW5mbz1uZXcgUnQoImluZm8iLHtmb250Q2hhcmFjdGVyOiJcXGVhNzQifSksUnQuY2xvc2U9bmV3IFJ0KCJjbG9zZSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE3NiJ9KSxSdC5zeW5jPW5ldyBSdCgic3luYyIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE3NyJ9KSxSdC5zeW1ib2xGb2xkZXI9bmV3IFJ0KCJzeW1ib2wtZm9sZGVyIix7Zm9udENoYXJhY3RlcjoiXFxlYTgzIn0pLFJ0LnN5bWJvbEV2ZW50PW5ldyBSdCgic3ltYm9sLWV2ZW50Iix7Zm9udENoYXJhY3RlcjoiXFxlYTg2In0pLFJ0LmVycm9yPW5ldyBSdCgiZXJyb3IiLHtmb250Q2hhcmFjdGVyOiJcXGVhODcifSksUnQuc3ltYm9sVmFyaWFibGU9bmV3IFJ0KCJzeW1ib2wtdmFyaWFibGUiLHtmb250Q2hhcmFjdGVyOiJcXGVhODgifSksUnQuc3ltYm9sQXJyYXk9bmV3IFJ0KCJzeW1ib2wtYXJyYXkiLHtmb250Q2hhcmFjdGVyOiJcXGVhOGEifSksUnQuc3ltYm9sTW9kdWxlPW5ldyBSdCgic3ltYm9sLW1vZHVsZSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE4YiJ9KSxSdC5zeW1ib2xQYWNrYWdlPW5ldyBSdCgic3ltYm9sLXBhY2thZ2UiLHtmb250Q2hhcmFjdGVyOiJcXGVhOGIifSksUnQuc3ltYm9sTmFtZXNwYWNlPW5ldyBSdCgic3ltYm9sLW5hbWVzcGFjZSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE4YiJ9KSxSdC5zeW1ib2xPYmplY3Q9bmV3IFJ0KCJzeW1ib2wtb2JqZWN0Iix7Zm9udENoYXJhY3RlcjoiXFxlYThiIn0pLFJ0LnN5bWJvbE1ldGhvZD1uZXcgUnQoInN5bWJvbC1tZXRob2QiLHtmb250Q2hhcmFjdGVyOiJcXGVhOGMifSksUnQuc3ltYm9sRnVuY3Rpb249bmV3IFJ0KCJzeW1ib2wtZnVuY3Rpb24iLHtmb250Q2hhcmFjdGVyOiJcXGVhOGMifSksUnQuc3ltYm9sQ29uc3RydWN0b3I9bmV3IFJ0KCJzeW1ib2wtY29uc3RydWN0b3IiLHtmb250Q2hhcmFjdGVyOiJcXGVhOGMifSksUnQuc3ltYm9sQm9vbGVhbj1uZXcgUnQoInN5bWJvbC1ib29sZWFuIix7Zm9udENoYXJhY3RlcjoiXFxlYThmIn0pLFJ0LnN5bWJvbE51bGw9bmV3IFJ0KCJzeW1ib2wtbnVsbCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE4ZiJ9KSxSdC5zeW1ib2xOdW1iZXI9bmV3IFJ0KCJzeW1ib2wtbnVtYmVyIix7Zm9udENoYXJhY3RlcjoiXFxlYTkwIn0pLFJ0LnN5bWJvbFN0cnVjdD1uZXcgUnQoInN5bWJvbC1zdHJ1Y3QiLHtmb250Q2hhcmFjdGVyOiJcXGVhOTEifSksUnQuc3ltYm9sVHlwZVBhcmFtZXRlcj1uZXcgUnQoInN5bWJvbC10eXBlLXBhcmFtZXRlciIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE5MiJ9KSxSdC5zeW1ib2xLZXk9bmV3IFJ0KCJzeW1ib2wta2V5Iix7Zm9udENoYXJhY3RlcjoiXFxlYTkzIn0pLFJ0LnN5bWJvbFRleHQ9bmV3IFJ0KCJzeW1ib2wtdGV4dCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE5MyJ9KSxSdC5zeW1ib2xSZWZlcmVuY2U9bmV3IFJ0KCJzeW1ib2wtcmVmZXJlbmNlIix7Zm9udENoYXJhY3RlcjoiXFxlYTk0In0pLFJ0LnN5bWJvbEVudW09bmV3IFJ0KCJzeW1ib2wtZW51bSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE5NSJ9KSxSdC5zeW1ib2xWYWx1ZT1uZXcgUnQoInN5bWJvbC12YWx1ZSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE5NSJ9KSxSdC5zeW1ib2xVbml0PW5ldyBSdCgic3ltYm9sLXVuaXQiLHtmb250Q2hhcmFjdGVyOiJcXGVhOTYifSksUnQuYXJyb3dEb3duPW5ldyBSdCgiYXJyb3ctZG93biIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE5YSJ9KSxSdC5hcnJvd0xlZnQ9bmV3IFJ0KCJhcnJvdy1sZWZ0Iix7Zm9udENoYXJhY3RlcjoiXFxlYTliIn0pLFJ0LmFycm93VXA9bmV3IFJ0KCJhcnJvdy11cCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWFhMSJ9KSxSdC5jYXNlU2Vuc2l0aXZlPW5ldyBSdCgiY2FzZS1zZW5zaXRpdmUiLHtmb250Q2hhcmFjdGVyOiJcXGVhYjEifSksUnQuY2hlY2s9bmV3IFJ0KCJjaGVjayIse2ZvbnRDaGFyYWN0ZXI6IlxcZWFiMiJ9KSxSdC5jaGV2cm9uRG93bj1uZXcgUnQoImNoZXZyb24tZG93biIse2ZvbnRDaGFyYWN0ZXI6IlxcZWFiNCJ9KSxSdC5jaGV2cm9uUmlnaHQ9bmV3IFJ0KCJjaGV2cm9uLXJpZ2h0Iix7Zm9udENoYXJhY3RlcjoiXFxlYWI2In0pLFJ0LmNoZXZyb25VcD1uZXcgUnQoImNoZXZyb24tdXAiLHtmb250Q2hhcmFjdGVyOiJcXGVhYjcifSksUnQubGlnaHRidWxiQXV0b2ZpeD1uZXcgUnQoImxpZ2h0YnVsYi1hdXRvZml4Iix7Zm9udENoYXJhY3RlcjoiXFxlYjEzIn0pLFJ0LmxvYWRpbmc9bmV3IFJ0KCJsb2FkaW5nIix7Zm9udENoYXJhY3RlcjoiXFxlYjE5In0pLFJ0LnByZXNlcnZlQ2FzZT1uZXcgUnQoInByZXNlcnZlLWNhc2UiLHtmb250Q2hhcmFjdGVyOiJcXGViMmUifSksUnQucmVnZXg9bmV3IFJ0KCJyZWdleCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWIzOCJ9KSxSdC5yZW1vdmU9bmV3IFJ0KCJyZW1vdmUiLHtmb250Q2hhcmFjdGVyOiJcXGViM2IifSksUnQucmVwbGFjZUFsbD1uZXcgUnQoInJlcGxhY2UtYWxsIix7Zm9udENoYXJhY3RlcjoiXFxlYjNjIn0pLFJ0LnJlcGxhY2U9bmV3IFJ0KCJyZXBsYWNlIix7Zm9udENoYXJhY3RlcjoiXFxlYjNkIn0pLFJ0LnNwbGl0SG9yaXpvbnRhbD1uZXcgUnQoInNwbGl0LWhvcml6b250YWwiLHtmb250Q2hhcmFjdGVyOiJcXGViNTYifSksUnQuc3BsaXRWZXJ0aWNhbD1uZXcgUnQoInNwbGl0LXZlcnRpY2FsIix7Zm9udENoYXJhY3RlcjoiXFxlYjU3In0pLFJ0LnN5bWJvbENsYXNzPW5ldyBSdCgic3ltYm9sLWNsYXNzIix7Zm9udENoYXJhY3RlcjoiXFxlYjViIn0pLFJ0LnN5bWJvbENvbG9yPW5ldyBSdCgic3ltYm9sLWNvbG9yIix7Zm9udENoYXJhY3RlcjoiXFxlYjVjIn0pLFJ0LnN5bWJvbENvbnN0YW50PW5ldyBSdCgic3ltYm9sLWNvbnN0YW50Iix7Zm9udENoYXJhY3RlcjoiXFxlYjVkIn0pLFJ0LnN5bWJvbEVudW1NZW1iZXI9bmV3IFJ0KCJzeW1ib2wtZW51bS1tZW1iZXIiLHtmb250Q2hhcmFjdGVyOiJcXGViNWUifSksUnQuc3ltYm9sRmllbGQ9bmV3IFJ0KCJzeW1ib2wtZmllbGQiLHtmb250Q2hhcmFjdGVyOiJcXGViNWYifSksUnQuc3ltYm9sRmlsZT1uZXcgUnQoInN5bWJvbC1maWxlIix7Zm9udENoYXJhY3RlcjoiXFxlYjYwIn0pLFJ0LnN5bWJvbEludGVyZmFjZT1uZXcgUnQoInN5bWJvbC1pbnRlcmZhY2UiLHtmb250Q2hhcmFjdGVyOiJcXGViNjEifSksUnQuc3ltYm9sS2V5d29yZD1uZXcgUnQoInN5bWJvbC1rZXl3b3JkIix7Zm9udENoYXJhY3RlcjoiXFxlYjYyIn0pLFJ0LnN5bWJvbE9wZXJhdG9yPW5ldyBSdCgic3ltYm9sLW9wZXJhdG9yIix7Zm9udENoYXJhY3RlcjoiXFxlYjY0In0pLFJ0LnN5bWJvbFByb3BlcnR5PW5ldyBSdCgic3ltYm9sLXByb3BlcnR5Iix7Zm9udENoYXJhY3RlcjoiXFxlYjY1In0pLFJ0LnN5bWJvbFNuaXBwZXQ9bmV3IFJ0KCJzeW1ib2wtc25pcHBldCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWI2NiJ9KSxSdC50cmlhbmdsZURvd249bmV3IFJ0KCJ0cmlhbmdsZS1kb3duIix7Zm9udENoYXJhY3RlcjoiXFxlYjZlIn0pLFJ0LnRyaWFuZ2xlTGVmdD1uZXcgUnQoInRyaWFuZ2xlLWxlZnQiLHtmb250Q2hhcmFjdGVyOiJcXGViNmYifSksUnQudHJpYW5nbGVSaWdodD1uZXcgUnQoInRyaWFuZ2xlLXJpZ2h0Iix7Zm9udENoYXJhY3RlcjoiXFxlYjcwIn0pLFJ0LnRyaWFuZ2xlVXA9bmV3IFJ0KCJ0cmlhbmdsZS11cCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWI3MSJ9KSxSdC53aG9sZVdvcmQ9bmV3IFJ0KCJ3aG9sZS13b3JkIix7Zm9udENoYXJhY3RlcjoiXFxlYjdlIn0pLFJ0Lmxpc3RGaWx0ZXI9bmV3IFJ0KCJsaXN0LWZpbHRlciIse2ZvbnRDaGFyYWN0ZXI6IlxcZWI4MyJ9KSxSdC5saXN0U2VsZWN0aW9uPW5ldyBSdCgibGlzdC1zZWxlY3Rpb24iLHtmb250Q2hhcmFjdGVyOiJcXGViODUifSksUnQuc2VsZWN0aW9uPW5ldyBSdCgic2VsZWN0aW9uIix7Zm9udENoYXJhY3RlcjoiXFxlYjg1In0pLFJ0LnN5bWJvbFN0cmluZz1uZXcgUnQoInN5bWJvbC1zdHJpbmciLHtmb250Q2hhcmFjdGVyOiJcXGViOGQifSksUnQudHJlZUl0ZW1FeHBhbmRlZD1uZXcgUnQoInRyZWUtaXRlbS1leHBhbmRlZCIsUnQuY2hldnJvbkRvd24uZGVmaW5pdGlvbiksUnQudHJlZUZpbHRlck9uVHlwZU9uPW5ldyBSdCgidHJlZS1maWx0ZXItb24tdHlwZS1vbiIsUnQubGlzdEZpbHRlci5kZWZpbml0aW9uKSxSdC50cmVlRmlsdGVyT25UeXBlT2ZmPW5ldyBSdCgidHJlZS1maWx0ZXItb24tdHlwZS1vZmYiLFJ0Lmxpc3RTZWxlY3Rpb24uZGVmaW5pdGlvbiksUnQudHJlZUZpbHRlckNsZWFyPW5ldyBSdCgidHJlZS1maWx0ZXItY2xlYXIiLFJ0LmNsb3NlLmRlZmluaXRpb24pLFJ0LnRyZWVJdGVtTG9hZGluZz1uZXcgUnQoInRyZWUtaXRlbS1sb2FkaW5nIixSdC5sb2FkaW5nLmRlZmluaXRpb24pLFJ0Lm1lbnVTZWxlY3Rpb249bmV3IFJ0KCJtZW51LXNlbGVjdGlvbiIsUnQuY2hlY2suZGVmaW5pdGlvbiksUnQubWVudVN1Ym1lbnU9bmV3IFJ0KCJtZW51LXN1Ym1lbnUiLFJ0LmNoZXZyb25SaWdodC5kZWZpbml0aW9uKSxSdC5zY3JvbGxiYXJCdXR0b25MZWZ0PW5ldyBSdCgic2Nyb2xsYmFyLWJ1dHRvbi1sZWZ0IixSdC50cmlhbmdsZUxlZnQuZGVmaW5pdGlvbiksUnQuc2Nyb2xsYmFyQnV0dG9uUmlnaHQ9bmV3IFJ0KCJzY3JvbGxiYXItYnV0dG9uLXJpZ2h0IixSdC50cmlhbmdsZVJpZ2h0LmRlZmluaXRpb24pLFJ0LnNjcm9sbGJhckJ1dHRvblVwPW5ldyBSdCgic2Nyb2xsYmFyLWJ1dHRvbi11cCIsUnQudHJpYW5nbGVVcC5kZWZpbml0aW9uKSxSdC5zY3JvbGxiYXJCdXR0b25Eb3duPW5ldyBSdCgic2Nyb2xsYmFyLWJ1dHRvbi1kb3duIixSdC50cmlhbmdsZURvd24uZGVmaW5pdGlvbiksUnQucXVpY2tJbnB1dEJhY2s9bmV3IFJ0KCJxdWljay1pbnB1dC1iYWNrIixSdC5hcnJvd0xlZnQuZGVmaW5pdGlvbiksZnVuY3Rpb24oZSl7ZS5pY29uTmFtZVNlZ21lbnQ9IltBLVphLXowLTldKyIsZS5pY29uTmFtZUV4cHJlc3Npb249IltBLVphLXowLTktXSsiLGUuaWNvbk1vZGlmaWVyRXhwcmVzc2lvbj0ifltBLVphLXpdKyIsZS5pY29uTmFtZUNoYXJhY3Rlcj0iW0EtWmEtejAtOX4tXSI7Y29uc3QgaT1uZXcgUmVnRXhwKGBeKCR7ZS5pY29uTmFtZUV4cHJlc3Npb259KSgke2UuaWNvbk1vZGlmaWVyRXhwcmVzc2lvbn0pPyRgKTtmdW5jdGlvbiBzKGUpe2lmKGUgaW5zdGFuY2VvZiBSdClyZXR1cm5bImNvZGljb24iLCJjb2RpY29uLSIrZS5pZF07ZT1pLmV4ZWMoZS5pZCk7aWYoIWUpcmV0dXJuIHMoUnQuZXJyb3IpO2xldFssdCxyXT1lO2NvbnN0IG49WyJjb2RpY29uIiwiY29kaWNvbi0iK3RdO3JldHVybiByJiZuLnB1c2goImNvZGljb24tbW9kaWZpZXItIityLnN1YnN0cigxKSksbn1lLmFzQ2xhc3NOYW1lQXJyYXk9cyxlLmFzQ2xhc3NOYW1lPWZ1bmN0aW9uKGUpe3JldHVybiBzKGUpLmpvaW4oIiAiKX0sZS5hc0NTU1NlbGVjdG9yPWZ1bmN0aW9uKGUpe3JldHVybiIuIitzKGUpLmpvaW4oIi4iKX19KHBlPXBlfHx7fSk7Y2xhc3Mga3R7Y29uc3RydWN0b3IoKXt0aGlzW0NlXT0iTGlua2VkTWFwIix0aGlzLl9tYXA9bmV3IE1hcCx0aGlzLl9oZWFkPXZvaWQgMCx0aGlzLl90YWlsPXZvaWQgMCx0aGlzLl9zaXplPTAsdGhpcy5fc3RhdGU9MH1jbGVhcigpe3RoaXMuX21hcC5jbGVhcigpLHRoaXMuX2hlYWQ9dm9pZCAwLHRoaXMuX3RhaWw9dm9pZCAwLHRoaXMuX3NpemU9MCx0aGlzLl9zdGF0ZSsrfWlzRW1wdHkoKXtyZXR1cm4hdGhpcy5faGVhZCYmIXRoaXMuX3RhaWx9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5fc2l6ZX1nZXQgZmlyc3QoKXt2YXIgZTtyZXR1cm4gbnVsbD09PShlPXRoaXMuX2hlYWQpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnZhbHVlfWdldCBsYXN0KCl7dmFyIGU7cmV0dXJuIG51bGw9PT0oZT10aGlzLl90YWlsKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS52YWx1ZX1oYXMoZSl7cmV0dXJuIHRoaXMuX21hcC5oYXMoZSl9Z2V0KGUsdD0wKXtlPXRoaXMuX21hcC5nZXQoZSk7aWYoZSlyZXR1cm4gMCE9PXQmJnRoaXMudG91Y2goZSx0KSxlLnZhbHVlfXNldChlLHQscj0wKXtsZXQgbj10aGlzLl9tYXAuZ2V0KGUpO2lmKG4pbi52YWx1ZT10LDAhPT1yJiZ0aGlzLnRvdWNoKG4scik7ZWxzZXtzd2l0Y2gobj17a2V5OmUsdmFsdWU6dCxuZXh0OnZvaWQgMCxwcmV2aW91czp2b2lkIDB9LHIpe2Nhc2UgMDp0aGlzLmFkZEl0ZW1MYXN0KG4pO2JyZWFrO2Nhc2UgMTp0aGlzLmFkZEl0ZW1GaXJzdChuKTticmVhaztkZWZhdWx0OnRoaXMuYWRkSXRlbUxhc3Qobil9dGhpcy5fbWFwLnNldChlLG4pLHRoaXMuX3NpemUrK31yZXR1cm4gdGhpc31kZWxldGUoZSl7cmV0dXJuISF0aGlzLnJlbW92ZShlKX1yZW1vdmUoZSl7dmFyIHQ9dGhpcy5fbWFwLmdldChlKTtpZih0KXJldHVybiB0aGlzLl9tYXAuZGVsZXRlKGUpLHRoaXMucmVtb3ZlSXRlbSh0KSx0aGlzLl9zaXplLS0sdC52YWx1ZX1zaGlmdCgpe2lmKHRoaXMuX2hlYWR8fHRoaXMuX3RhaWwpe2lmKCF0aGlzLl9oZWFkfHwhdGhpcy5fdGFpbCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO3ZhciBlPXRoaXMuX2hlYWQ7cmV0dXJuIHRoaXMuX21hcC5kZWxldGUoZS5rZXkpLHRoaXMucmVtb3ZlSXRlbShlKSx0aGlzLl9zaXplLS0sZS52YWx1ZX19Zm9yRWFjaChlLHQpe3ZhciByPXRoaXMuX3N0YXRlO2xldCBuPXRoaXMuX2hlYWQ7Zm9yKDtuOyl7aWYoKHQ/ZS5iaW5kKHQpOmUpKG4udmFsdWUsbi5rZXksdGhpcyksdGhpcy5fc3RhdGUhPT1yKXRocm93IG5ldyBFcnJvcigiTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiIpO249bi5uZXh0fX1rZXlzKCl7Y29uc3QgdD10aGlzLHI9dGhpcy5fc3RhdGU7bGV0IG49dGhpcy5faGVhZDtjb25zdCBlPXtbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBlfSxuZXh0KCl7aWYodC5fc3RhdGUhPT1yKXRocm93IG5ldyBFcnJvcigiTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiIpO2lmKG4pe3ZhciBlPXt2YWx1ZTpuLmtleSxkb25lOiExfTtyZXR1cm4gbj1uLm5leHQsZX1yZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fX07cmV0dXJuIGV9dmFsdWVzKCl7Y29uc3QgdD10aGlzLHI9dGhpcy5fc3RhdGU7bGV0IG49dGhpcy5faGVhZDtjb25zdCBlPXtbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBlfSxuZXh0KCl7aWYodC5fc3RhdGUhPT1yKXRocm93IG5ldyBFcnJvcigiTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiIpO2lmKG4pe3ZhciBlPXt2YWx1ZTpuLnZhbHVlLGRvbmU6ITF9O3JldHVybiBuPW4ubmV4dCxlfXJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19fTtyZXR1cm4gZX1lbnRyaWVzKCl7Y29uc3QgdD10aGlzLHI9dGhpcy5fc3RhdGU7bGV0IG49dGhpcy5faGVhZDtjb25zdCBlPXtbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBlfSxuZXh0KCl7aWYodC5fc3RhdGUhPT1yKXRocm93IG5ldyBFcnJvcigiTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiIpO2lmKG4pe3ZhciBlPXt2YWx1ZTpbbi5rZXksbi52YWx1ZV0sZG9uZTohMX07cmV0dXJuIG49bi5uZXh0LGV9cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX19O3JldHVybiBlfVsoQ2U9U3ltYm9sLnRvU3RyaW5nVGFnLFN5bWJvbC5pdGVyYXRvcildKCl7cmV0dXJuIHRoaXMuZW50cmllcygpfXRyaW1PbGQocil7aWYoIShyPj10aGlzLnNpemUpKWlmKDAhPT1yKXtsZXQgZT10aGlzLl9oZWFkLHQ9dGhpcy5zaXplO2Zvcig7ZSYmdD5yOyl0aGlzLl9tYXAuZGVsZXRlKGUua2V5KSxlPWUubmV4dCx0LS07dGhpcy5faGVhZD1lLHRoaXMuX3NpemU9dCxlJiYoZS5wcmV2aW91cz12b2lkIDApLHRoaXMuX3N0YXRlKyt9ZWxzZSB0aGlzLmNsZWFyKCl9YWRkSXRlbUZpcnN0KGUpe2lmKHRoaXMuX2hlYWR8fHRoaXMuX3RhaWwpe2lmKCF0aGlzLl9oZWFkKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7ZS5uZXh0PXRoaXMuX2hlYWQsdGhpcy5faGVhZC5wcmV2aW91cz1lfWVsc2UgdGhpcy5fdGFpbD1lO3RoaXMuX2hlYWQ9ZSx0aGlzLl9zdGF0ZSsrfWFkZEl0ZW1MYXN0KGUpe2lmKHRoaXMuX2hlYWR8fHRoaXMuX3RhaWwpe2lmKCF0aGlzLl90YWlsKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7ZS5wcmV2aW91cz10aGlzLl90YWlsLHRoaXMuX3RhaWwubmV4dD1lfWVsc2UgdGhpcy5faGVhZD1lO3RoaXMuX3RhaWw9ZSx0aGlzLl9zdGF0ZSsrfXJlbW92ZUl0ZW0oZSl7aWYoZT09PXRoaXMuX2hlYWQmJmU9PT10aGlzLl90YWlsKXRoaXMuX2hlYWQ9dm9pZCAwLHRoaXMuX3RhaWw9dm9pZCAwO2Vsc2UgaWYoZT09PXRoaXMuX2hlYWQpe2lmKCFlLm5leHQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTtlLm5leHQucHJldmlvdXM9dm9pZCAwLHRoaXMuX2hlYWQ9ZS5uZXh0fWVsc2UgaWYoZT09PXRoaXMuX3RhaWwpe2lmKCFlLnByZXZpb3VzKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7ZS5wcmV2aW91cy5uZXh0PXZvaWQgMCx0aGlzLl90YWlsPWUucHJldmlvdXN9ZWxzZXtjb25zdCB0PWUubmV4dCxyPWUucHJldmlvdXM7aWYoIXR8fCFyKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7dC5wcmV2aW91cz1yLHIubmV4dD10fWUubmV4dD12b2lkIDAsZS5wcmV2aW91cz12b2lkIDAsdGhpcy5fc3RhdGUrK310b3VjaChlLHQpe2lmKCF0aGlzLl9oZWFkfHwhdGhpcy5fdGFpbCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO2lmKDE9PT10fHwyPT09dClpZigxPT09dCl7aWYoZSE9PXRoaXMuX2hlYWQpe2NvbnN0IHI9ZS5uZXh0LG49ZS5wcmV2aW91cztlPT09dGhpcy5fdGFpbD8obi5uZXh0PXZvaWQgMCx0aGlzLl90YWlsPW4pOihyLnByZXZpb3VzPW4sbi5uZXh0PXIpLGUucHJldmlvdXM9dm9pZCAwLGUubmV4dD10aGlzLl9oZWFkLHRoaXMuX2hlYWQucHJldmlvdXM9ZSx0aGlzLl9oZWFkPWUsdGhpcy5fc3RhdGUrK319ZWxzZSBpZigyPT09dCYmZSE9PXRoaXMuX3RhaWwpe2NvbnN0IGk9ZS5uZXh0LHM9ZS5wcmV2aW91cztlPT09dGhpcy5faGVhZD8oaS5wcmV2aW91cz12b2lkIDAsdGhpcy5faGVhZD1pKTooaS5wcmV2aW91cz1zLHMubmV4dD1pKSxlLm5leHQ9dm9pZCAwLGUucHJldmlvdXM9dGhpcy5fdGFpbCx0aGlzLl90YWlsLm5leHQ9ZSx0aGlzLl90YWlsPWUsdGhpcy5fc3RhdGUrK319dG9KU09OKCl7Y29uc3Qgcj1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKChlLHQpPT57ci5wdXNoKFt0LGVdKX0pLHJ9ZnJvbUpTT04oZSl7dGhpcy5jbGVhcigpO2Zvcih2YXJbdCxyXW9mIGUpdGhpcy5zZXQodCxyKX19ZnVuY3Rpb24gRHQoZSx0LHIpe2lmKCFyfHxyLmxlbmd0aDx0Lmxlbmd0aClyZXR1cm4gbnVsbDtsZXQgbjt2YXIgaSxzO3JldHVybiBuPWU/KGk9cixlPShzPXQpLmxlbmd0aCwhKHMubGVuZ3RoPmkubGVuZ3RoKSYmMD09PU8oaSxzLDAsZSkpOjA9PT1yLmluZGV4T2YodCksbj8wPHQubGVuZ3RoP1t7c3RhcnQ6MCxlbmQ6dC5sZW5ndGh9XTpbXTpudWxsfUR0LmJpbmQodm9pZCAwLCExKSxEdC5iaW5kKHZvaWQgMCwhMCk7Y29uc3QgT3Q9bmV3IFNldDsiKClbXXt9PD5gJ1wiLS87OiwuPyEiLnNwbGl0KCIiKS5mb3JFYWNoKGU9Pk90LmFkZChlLmNoYXJDb2RlQXQoMCkpKSxuZXcgY2xhc3MgZXh0ZW5kcyBrdHtjb25zdHJ1Y3RvcihlLHQ9MSl7c3VwZXIoKSx0aGlzLl9saW1pdD1lLHRoaXMuX3JhdGlvPU1hdGgubWluKE1hdGgubWF4KDAsdCksMSl9Z2V0IGxpbWl0KCl7cmV0dXJuIHRoaXMuX2xpbWl0fXNldCBsaW1pdChlKXt0aGlzLl9saW1pdD1lLHRoaXMuY2hlY2tUcmltKCl9Z2V0KGUsdD0yKXtyZXR1cm4gc3VwZXIuZ2V0KGUsdCl9cGVlayhlKXtyZXR1cm4gc3VwZXIuZ2V0KGUsMCl9c2V0KGUsdCl7cmV0dXJuIHN1cGVyLnNldChlLHQsMiksdGhpcy5jaGVja1RyaW0oKSx0aGlzfWNoZWNrVHJpbSgpe3RoaXMuc2l6ZT50aGlzLl9saW1pdCYmdGhpcy50cmltT2xkKE1hdGgucm91bmQodGhpcy5fbGltaXQqdGhpcy5fcmF0aW8pKX19KDFlNCk7ZnVuY3Rpb24gVHQoKXtjb25zdCB0PVtdLHI9W107Zm9yKGxldCBlPTA7ZTw9MTI4O2UrKylyW2VdPTA7Zm9yKGxldCBlPTA7ZTw9MTI4O2UrKyl0LnB1c2goci5zbGljZSgwKSk7cmV0dXJuIHR9ZnVuY3Rpb24gRnQodCl7Y29uc3Qgcj1bXTtmb3IobGV0IGU9MDtlPD10O2UrKylyW2VdPTA7cmV0dXJuIHJ9RnQoMjU2KSxGdCgyNTYpLFR0KCksVHQoKSxUdCgpO3ZhciBVdCxCdCxxdCxIdD1uZXcgUmVnRXhwKGBcXCRcXCgke3BlLmljb25OYW1lRXhwcmVzc2lvbn0oPzoke3BlLmljb25Nb2RpZmllckV4cHJlc3Npb259KT9cXClgLCJnIik7bmV3IFJlZ0V4cChwZS5pY29uTmFtZUNoYXJhY3Rlcik7Y29uc3QgV3Q9bmV3IFJlZ0V4cCgiKFxcXFwpPyIrSHQuc291cmNlLCJnIik7bmV3IFJlZ0V4cCgiXFxcXCIrSHQuc291cmNlLCJnIiksbmV3IFJlZ0V4cChgKFxccyk/KFxcXFwpPyR7SHQuc291cmNlfShcXHMpP2AsImciKTtjbGFzcyB6dHtjb25zdHJ1Y3RvcihlPSIiLHQ9ITEpe3ZhciByO2lmKHRoaXMudmFsdWU9ZSwic3RyaW5nIiE9dHlwZW9mIHRoaXMudmFsdWUpdGhyb3cocj0idmFsdWUiKT9uZXcgRXJyb3IoIklsbGVnYWwgYXJndW1lbnQ6ICIrcik6bmV3IEVycm9yKCJJbGxlZ2FsIGFyZ3VtZW50Iik7ImJvb2xlYW4iPT10eXBlb2YgdD8odGhpcy5pc1RydXN0ZWQ9dCx0aGlzLnN1cHBvcnRUaGVtZUljb25zPSExLHRoaXMuc3VwcG9ydEh0bWw9ITEpOih0aGlzLmlzVHJ1c3RlZD1udWxsIT09KHI9dC5pc1RydXN0ZWQpJiZ2b2lkIDAhPT1yP3I6dm9pZCAwLHRoaXMuc3VwcG9ydFRoZW1lSWNvbnM9bnVsbCE9PShyPXQuc3VwcG9ydFRoZW1lSWNvbnMpJiZ2b2lkIDAhPT1yJiZyLHRoaXMuc3VwcG9ydEh0bWw9bnVsbCE9PSh0PXQuc3VwcG9ydEh0bWwpJiZ2b2lkIDAhPT10JiZ0KX1hcHBlbmRUZXh0KGUsdD0wKXtyZXR1cm4gdGhpcy52YWx1ZSs9KHRoaXMuc3VwcG9ydFRoZW1lSWNvbnM/ZS5yZXBsYWNlKFd0LChlLHQpPT50P2U6IlxcIitlKTplKS5yZXBsYWNlKC9bXFxgKl97fVtcXSgpIytcLSFdL2csIlxcJCYiKS5yZXBsYWNlKC8oWyBcdF0rKS9nLChlLHQpPT4iJm5ic3A7Ii5yZXBlYXQodC5sZW5ndGgpKS5yZXBsYWNlKC9cPi9nbSwiXFw+IikucmVwbGFjZSgvXG4vZywxPT09dD8iXFxcbiI6IlxuXG4iKSx0aGlzfWFwcGVuZE1hcmtkb3duKGUpe3JldHVybiB0aGlzLnZhbHVlKz1lLHRoaXN9YXBwZW5kQ29kZWJsb2NrKGUsdCl7cmV0dXJuIHRoaXMudmFsdWUrPSJcbmBgYCIsdGhpcy52YWx1ZSs9ZSx0aGlzLnZhbHVlKz0iXG4iLHRoaXMudmFsdWUrPXQsdGhpcy52YWx1ZSs9IlxuYGBgXG4iLHRoaXN9fWZ1bmN0aW9uIGp0KGUpe2lmKFV0LnNlcnZpY2VJZHMuaGFzKGUpKXJldHVybiBVdC5zZXJ2aWNlSWRzLmdldChlKTtmdW5jdGlvbiBzKGUsdCxyKXtpZigzIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkBJU2VydmljZU5hbWUtZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgdG8gZGVjb3JhdGUgYSBwYXJhbWV0ZXIiKTt2YXIgbixpO249cyxpPXIscj0hMSwoZT1lKVtVdC5ESV9UQVJHRVRdPT09ZT9lW1V0LkRJX0RFUEVOREVOQ0lFU10ucHVzaCh7aWQ6bixpbmRleDppLG9wdGlvbmFsOnJ9KTooZVtVdC5ESV9ERVBFTkRFTkNJRVNdPVt7aWQ6bixpbmRleDppLG9wdGlvbmFsOnJ9XSxlW1V0LkRJX1RBUkdFVF09ZSl9cmV0dXJuIHMudG9TdHJpbmc9KCk9PmUsVXQuc2VydmljZUlkcy5zZXQoZSxzKSxzLDF9KEJ0PVV0PVV0fHx7fSkuc2VydmljZUlkcz1uZXcgTWFwLEJ0LkRJX1RBUkdFVD0iJGRpJHRhcmdldCIsQnQuRElfREVQRU5ERU5DSUVTPSIkZGkkZGVwZW5kZW5jaWVzIixCdC5nZXRTZXJ2aWNlRGVwZW5kZW5jaWVzPWZ1bmN0aW9uKGUpe3JldHVybiBlW0J0LkRJX0RFUEVOREVOQ0lFU118fFtdfSxqdCgiaW5zdGFudGlhdGlvblNlcnZpY2UiKSxqdCgibG9nU2VydmljZSIpLGp0KCJsb2dnZXJTZXJ2aWNlIiksKEh0PXF0PXF0fHx7fSlbSHQuVHJhY2U9MF09IlRyYWNlIixIdFtIdC5EZWJ1Zz0xXT0iRGVidWciLEh0W0h0LkluZm89Ml09IkluZm8iLEh0W0h0Lldhcm5pbmc9M109Ildhcm5pbmciLEh0W0h0LkVycm9yPTRdPSJFcnJvciIsSHRbSHQuQ3JpdGljYWw9NV09IkNyaXRpY2FsIixIdFtIdC5PZmY9Nl09Ik9mZiI7Y29uc3QgJHQ9cXQuSW5mbztjbGFzcyBHdCBleHRlbmRzIGN7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMubGV2ZWw9JHQsdGhpcy5fb25EaWRDaGFuZ2VMb2dMZXZlbD10aGlzLl9yZWdpc3RlcihuZXcgUiksdGhpcy5vbkRpZENoYW5nZUxvZ0xldmVsPXRoaXMuX29uRGlkQ2hhbmdlTG9nTGV2ZWwuZXZlbnR9c2V0TGV2ZWwoZSl7dGhpcy5sZXZlbCE9PWUmJih0aGlzLmxldmVsPWUsdGhpcy5fb25EaWRDaGFuZ2VMb2dMZXZlbC5maXJlKHRoaXMubGV2ZWwpKX1nZXRMZXZlbCgpe3JldHVybiB0aGlzLmxldmVsfX1jbGFzcyBKdCBleHRlbmRzIEd0e2NvbnN0cnVjdG9yKGU9JHQpe3N1cGVyKCksdGhpcy5zZXRMZXZlbChlKX10cmFjZShlLC4uLnQpe3RoaXMuZ2V0TGV2ZWwoKTw9cXQuVHJhY2UmJmNvbnNvbGUubG9nKCIlY1RSQUNFIiwiY29sb3I6ICM4ODgiLGUsLi4udCl9ZGVidWcoZSwuLi50KXt0aGlzLmdldExldmVsKCk8PXF0LkRlYnVnJiZjb25zb2xlLmxvZygiJWNERUJVRyIsImJhY2tncm91bmQ6ICNlZWU7IGNvbG9yOiAjODg4IixlLC4uLnQpfWluZm8oZSwuLi50KXt0aGlzLmdldExldmVsKCk8PXF0LkluZm8mJmNvbnNvbGUubG9nKCIlYyBJTkZPIiwiY29sb3I6ICMzM2YiLGUsLi4udCl9d2FybihlLC4uLnQpe3RoaXMuZ2V0TGV2ZWwoKTw9cXQuV2FybmluZyYmY29uc29sZS5sb2coIiVjIFdBUk4iLCJjb2xvcjogIzk5MyIsZSwuLi50KX1lcnJvcihlLC4uLnQpe3RoaXMuZ2V0TGV2ZWwoKTw9cXQuRXJyb3ImJmNvbnNvbGUubG9nKCIlYyAgRVJSIiwiY29sb3I6ICNmMzMiLGUsLi4udCl9Y3JpdGljYWwoZSwuLi50KXt0aGlzLmdldExldmVsKCk8PXF0LkNyaXRpY2FsJiZjb25zb2xlLmxvZygiJWNDUklUSSIsImJhY2tncm91bmQ6ICNmMzM7IGNvbG9yOiB3aGl0ZSIsZSwuLi50KX1kaXNwb3NlKCl7fWZsdXNoKCl7fX1jbGFzcyBRdHtzdGF0aWMgY2hvcmQoZSx0KXtyZXR1cm4oZXwoNjU1MzUmdCk8PDE2Pj4+MCk+Pj4wfX1mdW5jdGlvbiBZdChlLHQscixuLGkpe3JldHVybiBmdW5jdGlvbihlLHQscixuKXtpZigwPT09cilyZXR1cm4gMTt2YXIgaT10LmNoYXJDb2RlQXQoci0xKTtpZigwIT09ZS5nZXQoaSkpcmV0dXJuIDE7aWYoMTM9PT1pfHwxMD09PWkpcmV0dXJuIDE7aWYoMDxuKXtyPXQuY2hhckNvZGVBdChyKTtpZigwIT09ZS5nZXQocikpcmV0dXJuIDF9cmV0dXJufShlLHQsbixpKSYmZnVuY3Rpb24oZSx0LHIsbixpKXtpZihuK2k9PT1yKXJldHVybiAxO2lmKHI9dC5jaGFyQ29kZUF0KG4raSksMCE9PWUuZ2V0KHIpKXJldHVybiAxO2lmKDEzPT09cnx8MTA9PT1yKXJldHVybiAxO2lmKDA8aSl7aT10LmNoYXJDb2RlQXQobitpLTEpO2lmKDAhPT1lLmdldChpKSlyZXR1cm4gMX1yZXR1cm59KGUsdCxyLG4saSl9UXQuQ3RybENtZD0yMDQ4LFF0LlNoaWZ0PTEwMjQsUXQuQWx0PTUxMixRdC5XaW5DdHJsPTI1NjtjbGFzcyBadHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX3dvcmRTZXBhcmF0b3JzPWUsdGhpcy5fc2VhcmNoUmVnZXg9dCx0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4PS0xLHRoaXMuX3ByZXZNYXRjaExlbmd0aD0wfXJlc2V0KGUpe3RoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleD1lLHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXg9LTEsdGhpcy5fcHJldk1hdGNoTGVuZ3RoPTB9bmV4dChlKXt2YXIgdD1lLmxlbmd0aDtsZXQgcjtkb3tpZih0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4K3RoaXMuX3ByZXZNYXRjaExlbmd0aD09PXQpcmV0dXJuIG51bGw7aWYocj10aGlzLl9zZWFyY2hSZWdleC5leGVjKGUpLCFyKXJldHVybiBudWxsO3ZhciBuPXIuaW5kZXgsaT1yWzBdLmxlbmd0aDtpZihuIT09dGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleHx8aSE9PXRoaXMuX3ByZXZNYXRjaExlbmd0aCl7aWYodGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleD1uLHRoaXMuX3ByZXZNYXRjaExlbmd0aD1pLCF0aGlzLl93b3JkU2VwYXJhdG9yc3x8WXQodGhpcy5fd29yZFNlcGFyYXRvcnMsZSx0LG4saSkpcmV0dXJuIHJ9ZWxzZXtpZigwIT09aSlyZXR1cm4gbnVsbDs2NTUzNTxmdW5jdGlvbihlLHQscil7dmFyIG49ZS5jaGFyQ29kZUF0KHIpO2lmKFUobikmJnIrMTx0KXtlPWUuY2hhckNvZGVBdChyKzEpO2lmKDU2MzIwPD0ocj1lKSYmcjw9NTczNDMpcmV0dXJuIGUtNTYzMjArKG4tNTUyOTY8PDEwKSs2NTUzNn1yZXR1cm4gbn0oZSx0LHRoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCk/dGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4Kz0yOnRoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCs9MX19d2hpbGUocik7cmV0dXJuIG51bGx9fWNsYXNzIFh0e3N0YXRpYyBjb21wdXRlVW5pY29kZUhpZ2hsaWdodHModCxlLHIpe3ZhciBuPXI/ci5zdGFydExpbmVOdW1iZXI6MSxpPXI/ci5lbmRMaW5lTnVtYmVyOnQuZ2V0TGluZUNvdW50KCk7Y29uc3Qgcz1uZXcgZTEoZSk7dmFyIG8sZT1zLmdldENhbmRpZGF0ZUNvZGVQb2ludHMoKTtsZXQgYTthPSJhbGxOb25CYXNpY0FzY2lpIj09PWU/bmV3IFJlZ0V4cCgiW15cXHRcXG5cXHJcXHgyMC1cXHg3RV0iLCJnIik6bmV3IFJlZ0V4cCgiIitmdW5jdGlvbihlKXtlPWBbJHtlLm1hcChlPT5TdHJpbmcuZnJvbUNvZGVQb2ludChlKSkuam9pbigiIikucmVwbGFjZSgvW1xcXHtcfVwqXCtcP1x8XF5cJFwuXFtcXVwoXCldL2csIlxcJCYiKX1dYDtyZXR1cm4gZX0oQXJyYXkuZnJvbShlKSksImciKTtjb25zdCBsPW5ldyBadChudWxsLGEpLHU9W107bGV0IGg9ITEsZD0wLGM9MCxtPTA7ZTpmb3IobGV0IHI9bixlPWk7cjw9ZTtyKyspe2NvbnN0IF89dC5nZXRMaW5lQ29udGVudChyKTt2YXIgZj1fLmxlbmd0aDtsLnJlc2V0KDApO2Rve2lmKG89bC5uZXh0KF8pKXtsZXQgZT1vLmluZGV4LHQ9by5pbmRleCtvWzBdLmxlbmd0aDswPGUmJlUoXy5jaGFyQ29kZUF0KGUtMSkpJiZlLS0sdCsxPGYmJlUoXy5jaGFyQ29kZUF0KHQtMSkpJiZ0Kys7dmFyIGc9Xy5zdWJzdHJpbmcoZSx0KSxnPXMuc2hvdWxkSGlnaGxpZ2h0Tm9uQmFzaWNBU0NJSShnKTtpZigwIT09Zyl7Mz09PWc/ZCsrOjI9PT1nP2MrKzoxPT09Zz9tKys6ZnVuY3Rpb24oZT0iVW5yZWFjaGFibGUiKXt0aHJvdyBuZXcgRXJyb3IoZSl9KCk7aWYoMWUzPD11Lmxlbmd0aCl7aD0hMDticmVhayBlfXUucHVzaChuZXcgemUocixlKzEscix0KzEpKX19fXdoaWxlKG8pfXJldHVybntyYW5nZXM6dSxoYXNNb3JlOmgsYW1iaWd1b3VzQ2hhcmFjdGVyQ291bnQ6ZCxpbnZpc2libGVDaGFyYWN0ZXJDb3VudDpjLG5vbkJhc2ljQXNjaWlDaGFyYWN0ZXJDb3VudDptfX1zdGF0aWMgY29tcHV0ZVVuaWNvZGVIaWdobGlnaHRSZWFzb24oZSx0KXtjb25zdCByPW5ldyBlMSh0KTtzd2l0Y2goci5zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKGUpKXtjYXNlIDA6cmV0dXJuIG51bGw7Y2FzZSAyOnJldHVybntraW5kOjF9O2Nhc2UgMzp2YXIgbj1CLmdldFByaW1hcnlDb25mdXNhYmxlKGUuY29kZVBvaW50QXQoMCkpO3JldHVybntraW5kOjAsY29uZnVzYWJsZVdpdGg6U3RyaW5nLmZyb21Db2RlUG9pbnQobil9O2Nhc2UgMTpyZXR1cm57a2luZDoyfX19fWNsYXNzIGUxe2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1lLHRoaXMuYWxsb3dlZENvZGVQb2ludHM9bmV3IFNldChlLmFsbG93ZWRDb2RlUG9pbnRzKX1nZXRDYW5kaWRhdGVDb2RlUG9pbnRzKCl7aWYodGhpcy5vcHRpb25zLm5vbkJhc2ljQVNDSUkpcmV0dXJuImFsbE5vbkJhc2ljQXNjaWkiO2NvbnN0IGU9bmV3IFNldDtpZih0aGlzLm9wdGlvbnMuaW52aXNpYmxlQ2hhcmFjdGVycylmb3IoY29uc3QgdCBvZiBxLmNvZGVQb2ludHMpZS5hZGQodCk7aWYodGhpcy5vcHRpb25zLmFtYmlndW91c0NoYXJhY3RlcnMpZm9yKGNvbnN0IHIgb2YgQi5nZXRQcmltYXJ5Q29uZnVzYWJsZUNvZGVQb2ludHMoKSllLmFkZChyKTtmb3IoY29uc3QgbiBvZiB0aGlzLmFsbG93ZWRDb2RlUG9pbnRzKWUuZGVsZXRlKG4pO3JldHVybiBlfXNob3VsZEhpZ2hsaWdodE5vbkJhc2ljQVNDSUkoZSl7dmFyIHQ9ZS5jb2RlUG9pbnRBdCgwKTtpZih0aGlzLmFsbG93ZWRDb2RlUG9pbnRzLmhhcyh0KSlyZXR1cm4gMDtpZih0aGlzLm9wdGlvbnMubm9uQmFzaWNBU0NJSSlyZXR1cm4gMTtpZih0aGlzLm9wdGlvbnMuaW52aXNpYmxlQ2hhcmFjdGVycyYmKCEoIiAiPT09ZXx8IlxuIj09PWV8fCJcdCI9PT1lKSYmcS5pc0ludmlzaWJsZUNoYXJhY3Rlcih0KSkpcmV0dXJuIDI7cmV0dXJuIHRoaXMub3B0aW9ucy5hbWJpZ3VvdXNDaGFyYWN0ZXJzJiZCLmlzQW1iaWd1b3VzKHQpPzM6MH19dmFyIHQxPWZ1bmN0aW9uKGUsbyxhLGwpe3JldHVybiBuZXcoYT1hfHxQcm9taXNlKShmdW5jdGlvbihyLHQpe2Z1bmN0aW9uIG4oZSl7dHJ5e3MobC5uZXh0KGUpKX1jYXRjaChlKXt0KGUpfX1mdW5jdGlvbiBpKGUpe3RyeXtzKGwudGhyb3coZSkpfWNhdGNoKGUpe3QoZSl9fWZ1bmN0aW9uIHMoZSl7dmFyIHQ7ZS5kb25lP3IoZS52YWx1ZSk6KCh0PWUudmFsdWUpaW5zdGFuY2VvZiBhP3Q6bmV3IGEoZnVuY3Rpb24oZSl7ZSh0KX0pKS50aGVuKG4saSl9cygobD1sLmFwcGx5KGUsb3x8W10pKS5uZXh0KCkpfSl9O2NsYXNzIHIxIGV4dGVuZHMgY2xhc3N7Y29uc3RydWN0b3IoZSx0LHIsbil7dGhpcy5fdXJpPWUsdGhpcy5fbGluZXM9dCx0aGlzLl9lb2w9cix0aGlzLl92ZXJzaW9uSWQ9bix0aGlzLl9saW5lU3RhcnRzPW51bGwsdGhpcy5fY2FjaGVkVGV4dFZhbHVlPW51bGx9ZGlzcG9zZSgpe3RoaXMuX2xpbmVzLmxlbmd0aD0wfWdldCB2ZXJzaW9uKCl7cmV0dXJuIHRoaXMuX3ZlcnNpb25JZH1nZXRUZXh0KCl7cmV0dXJuIG51bGw9PT10aGlzLl9jYWNoZWRUZXh0VmFsdWUmJih0aGlzLl9jYWNoZWRUZXh0VmFsdWU9dGhpcy5fbGluZXMuam9pbih0aGlzLl9lb2wpKSx0aGlzLl9jYWNoZWRUZXh0VmFsdWV9b25FdmVudHMoZSl7ZS5lb2wmJmUuZW9sIT09dGhpcy5fZW9sJiYodGhpcy5fZW9sPWUuZW9sLHRoaXMuX2xpbmVTdGFydHM9bnVsbCk7Zm9yKGNvbnN0IHQgb2YgZS5jaGFuZ2VzKXRoaXMuX2FjY2VwdERlbGV0ZVJhbmdlKHQucmFuZ2UpLHRoaXMuX2FjY2VwdEluc2VydFRleHQobmV3IFdlKHQucmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLHQucmFuZ2Uuc3RhcnRDb2x1bW4pLHQudGV4dCk7dGhpcy5fdmVyc2lvbklkPWUudmVyc2lvbklkLHRoaXMuX2NhY2hlZFRleHRWYWx1ZT1udWxsfV9lbnN1cmVMaW5lU3RhcnRzKCl7aWYoIXRoaXMuX2xpbmVTdGFydHMpe3ZhciB0PXRoaXMuX2VvbC5sZW5ndGgscj10aGlzLl9saW5lcy5sZW5ndGg7Y29uc3Qgbj1uZXcgVWludDMyQXJyYXkocik7Zm9yKGxldCBlPTA7ZTxyO2UrKyluW2VdPXRoaXMuX2xpbmVzW2VdLmxlbmd0aCt0O3RoaXMuX2xpbmVTdGFydHM9bmV3IG50KG4pfX1fc2V0TGluZVRleHQoZSx0KXt0aGlzLl9saW5lc1tlXT10LHRoaXMuX2xpbmVTdGFydHMmJnRoaXMuX2xpbmVTdGFydHMuc2V0VmFsdWUoZSx0aGlzLl9saW5lc1tlXS5sZW5ndGgrdGhpcy5fZW9sLmxlbmd0aCl9X2FjY2VwdERlbGV0ZVJhbmdlKGUpe2lmKGUuc3RhcnRMaW5lTnVtYmVyPT09ZS5lbmRMaW5lTnVtYmVyKXJldHVybiBlLnN0YXJ0Q29sdW1uPT09ZS5lbmRDb2x1bW4/dm9pZCAwOnZvaWQgdGhpcy5fc2V0TGluZVRleHQoZS5zdGFydExpbmVOdW1iZXItMSx0aGlzLl9saW5lc1tlLnN0YXJ0TGluZU51bWJlci0xXS5zdWJzdHJpbmcoMCxlLnN0YXJ0Q29sdW1uLTEpK3RoaXMuX2xpbmVzW2Uuc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZyhlLmVuZENvbHVtbi0xKSk7dGhpcy5fc2V0TGluZVRleHQoZS5zdGFydExpbmVOdW1iZXItMSx0aGlzLl9saW5lc1tlLnN0YXJ0TGluZU51bWJlci0xXS5zdWJzdHJpbmcoMCxlLnN0YXJ0Q29sdW1uLTEpK3RoaXMuX2xpbmVzW2UuZW5kTGluZU51bWJlci0xXS5zdWJzdHJpbmcoZS5lbmRDb2x1bW4tMSkpLHRoaXMuX2xpbmVzLnNwbGljZShlLnN0YXJ0TGluZU51bWJlcixlLmVuZExpbmVOdW1iZXItZS5zdGFydExpbmVOdW1iZXIpLHRoaXMuX2xpbmVTdGFydHMmJnRoaXMuX2xpbmVTdGFydHMucmVtb3ZlVmFsdWVzKGUuc3RhcnRMaW5lTnVtYmVyLGUuZW5kTGluZU51bWJlci1lLnN0YXJ0TGluZU51bWJlcil9X2FjY2VwdEluc2VydFRleHQobixlKXtpZigwIT09ZS5sZW5ndGgpe2xldCByPWUuc3BsaXQoL1xyXG58XHJ8XG4vKTtpZigxIT09ci5sZW5ndGgpe3Jbci5sZW5ndGgtMV0rPXRoaXMuX2xpbmVzW24ubGluZU51bWJlci0xXS5zdWJzdHJpbmcobi5jb2x1bW4tMSksdGhpcy5fc2V0TGluZVRleHQobi5saW5lTnVtYmVyLTEsdGhpcy5fbGluZXNbbi5saW5lTnVtYmVyLTFdLnN1YnN0cmluZygwLG4uY29sdW1uLTEpK3JbMF0pO2xldCB0PW5ldyBVaW50MzJBcnJheShyLmxlbmd0aC0xKTtmb3IobGV0IGU9MTtlPHIubGVuZ3RoO2UrKyl0aGlzLl9saW5lcy5zcGxpY2Uobi5saW5lTnVtYmVyK2UtMSwwLHJbZV0pLHRbZS0xXT1yW2VdLmxlbmd0aCt0aGlzLl9lb2wubGVuZ3RoO3RoaXMuX2xpbmVTdGFydHMmJnRoaXMuX2xpbmVTdGFydHMuaW5zZXJ0VmFsdWVzKG4ubGluZU51bWJlcix0KX1lbHNlIHRoaXMuX3NldExpbmVUZXh0KG4ubGluZU51bWJlci0xLHRoaXMuX2xpbmVzW24ubGluZU51bWJlci0xXS5zdWJzdHJpbmcoMCxuLmNvbHVtbi0xKStyWzBdK3RoaXMuX2xpbmVzW24ubGluZU51bWJlci0xXS5zdWJzdHJpbmcobi5jb2x1bW4tMSkpfX19e2dldCB1cmkoKXtyZXR1cm4gdGhpcy5fdXJpfWdldCBlb2woKXtyZXR1cm4gdGhpcy5fZW9sfWdldFZhbHVlKCl7cmV0dXJuIHRoaXMuZ2V0VGV4dCgpfWdldExpbmVzQ29udGVudCgpe3JldHVybiB0aGlzLl9saW5lcy5zbGljZSgwKX1nZXRMaW5lQ291bnQoKXtyZXR1cm4gdGhpcy5fbGluZXMubGVuZ3RofWdldExpbmVDb250ZW50KGUpe3JldHVybiB0aGlzLl9saW5lc1tlLTFdfWdldFdvcmRBdFBvc2l0aW9uKGUsdCl7dD1hdChlLmNvbHVtbixmdW5jdGlvbih0KXtsZXQgcj1zdDtpZih0JiZ0IGluc3RhbmNlb2YgUmVnRXhwKWlmKHQuZ2xvYmFsKXI9dDtlbHNle2xldCBlPSJnIjt0Lmlnbm9yZUNhc2UmJihlKz0iaSIpLHQubXVsdGlsaW5lJiYoZSs9Im0iKSx0LnVuaWNvZGUmJihlKz0idSIpLHI9bmV3IFJlZ0V4cCh0LnNvdXJjZSxlKX1yZXR1cm4gci5sYXN0SW5kZXg9MCxyfSh0KSx0aGlzLl9saW5lc1tlLmxpbmVOdW1iZXItMV0sMCk7cmV0dXJuIHQ/bmV3IHplKGUubGluZU51bWJlcix0LnN0YXJ0Q29sdW1uLGUubGluZU51bWJlcix0LmVuZENvbHVtbik6bnVsbH13b3Jkcyh0KXtjb25zdCByPXRoaXMuX2xpbmVzLG49dGhpcy5fd29yZGVuaXplLmJpbmQodGhpcyk7bGV0IGk9MCxzPSIiLG89MCxhPVtdO3JldHVybnsqW1N5bWJvbC5pdGVyYXRvcl0oKXtmb3IoOzspaWYobzxhLmxlbmd0aCl7dmFyIGU9cy5zdWJzdHJpbmcoYVtvXS5zdGFydCxhW29dLmVuZCk7bys9MSx5aWVsZCBlfWVsc2V7aWYoIShpPHIubGVuZ3RoKSlicmVhaztzPXJbaV0sYT1uKHMsdCksbz0wLGkrPTF9fX19Z2V0TGluZVdvcmRzKGUsdCl7bGV0IHI9dGhpcy5fbGluZXNbZS0xXTtsZXQgbj1bXTtmb3IoY29uc3QgaSBvZiB0aGlzLl93b3JkZW5pemUocix0KSluLnB1c2goe3dvcmQ6ci5zdWJzdHJpbmcoaS5zdGFydCxpLmVuZCksc3RhcnRDb2x1bW46aS5zdGFydCsxLGVuZENvbHVtbjppLmVuZCsxfSk7cmV0dXJuIG59X3dvcmRlbml6ZShlLHQpe2NvbnN0IHI9W107dmFyIG47Zm9yKHQubGFzdEluZGV4PTA7KG49dC5leGVjKGUpKSYmMCE9PW5bMF0ubGVuZ3RoOylyLnB1c2goe3N0YXJ0Om4uaW5kZXgsZW5kOm4uaW5kZXgrblswXS5sZW5ndGh9KTtyZXR1cm4gcn1nZXRWYWx1ZUluUmFuZ2UoZSl7aWYoKGU9dGhpcy5fdmFsaWRhdGVSYW5nZShlKSkuc3RhcnRMaW5lTnVtYmVyPT09ZS5lbmRMaW5lTnVtYmVyKXJldHVybiB0aGlzLl9saW5lc1tlLnN0YXJ0TGluZU51bWJlci0xXS5zdWJzdHJpbmcoZS5zdGFydENvbHVtbi0xLGUuZW5kQ29sdW1uLTEpO3ZhciB0PXRoaXMuX2VvbCxyPWUuc3RhcnRMaW5lTnVtYmVyLTEsbj1lLmVuZExpbmVOdW1iZXItMTtsZXQgaT1bXTtpLnB1c2godGhpcy5fbGluZXNbcl0uc3Vic3RyaW5nKGUuc3RhcnRDb2x1bW4tMSkpO2ZvcihsZXQgZT0xK3I7ZTxuO2UrKylpLnB1c2godGhpcy5fbGluZXNbZV0pO3JldHVybiBpLnB1c2godGhpcy5fbGluZXNbbl0uc3Vic3RyaW5nKDAsZS5lbmRDb2x1bW4tMSkpLGkuam9pbih0KX1vZmZzZXRBdChlKXtyZXR1cm4gZT10aGlzLl92YWxpZGF0ZVBvc2l0aW9uKGUpLHRoaXMuX2Vuc3VyZUxpbmVTdGFydHMoKSx0aGlzLl9saW5lU3RhcnRzLmdldFByZWZpeFN1bShlLmxpbmVOdW1iZXItMikrKGUuY29sdW1uLTEpfXBvc2l0aW9uQXQoZSl7ZT1NYXRoLmZsb29yKGUpLGU9TWF0aC5tYXgoMCxlKSx0aGlzLl9lbnN1cmVMaW5lU3RhcnRzKCk7dmFyIHQ9dGhpcy5fbGluZVN0YXJ0cy5nZXRJbmRleE9mKGUpLGU9dGhpcy5fbGluZXNbdC5pbmRleF0ubGVuZ3RoO3JldHVybntsaW5lTnVtYmVyOjErdC5pbmRleCxjb2x1bW46MStNYXRoLm1pbih0LnJlbWFpbmRlcixlKX19X3ZhbGlkYXRlUmFuZ2UoZSl7dmFyIHQ9dGhpcy5fdmFsaWRhdGVQb3NpdGlvbih7bGluZU51bWJlcjplLnN0YXJ0TGluZU51bWJlcixjb2x1bW46ZS5zdGFydENvbHVtbn0pLHI9dGhpcy5fdmFsaWRhdGVQb3NpdGlvbih7bGluZU51bWJlcjplLmVuZExpbmVOdW1iZXIsY29sdW1uOmUuZW5kQ29sdW1ufSk7cmV0dXJuIHQubGluZU51bWJlciE9PWUuc3RhcnRMaW5lTnVtYmVyfHx0LmNvbHVtbiE9PWUuc3RhcnRDb2x1bW58fHIubGluZU51bWJlciE9PWUuZW5kTGluZU51bWJlcnx8ci5jb2x1bW4hPT1lLmVuZENvbHVtbj97c3RhcnRMaW5lTnVtYmVyOnQubGluZU51bWJlcixzdGFydENvbHVtbjp0LmNvbHVtbixlbmRMaW5lTnVtYmVyOnIubGluZU51bWJlcixlbmRDb2x1bW46ci5jb2x1bW59OmV9X3ZhbGlkYXRlUG9zaXRpb24oZSl7aWYoIVdlLmlzSVBvc2l0aW9uKGUpKXRocm93IG5ldyBFcnJvcigiYmFkIHBvc2l0aW9uIik7bGV0e2xpbmVOdW1iZXI6dCxjb2x1bW46cn09ZSxuPSExO3ZhciBpO3JldHVybiB0PDE/KHQ9MSxyPTEsbj0hMCk6dD50aGlzLl9saW5lcy5sZW5ndGg/KHQ9dGhpcy5fbGluZXMubGVuZ3RoLHI9dGhpcy5fbGluZXNbdC0xXS5sZW5ndGgrMSxuPSEwKTooaT10aGlzLl9saW5lc1t0LTFdLmxlbmd0aCsxLHI8MT8ocj0xLG49ITApOnI+aSYmKHI9aSxuPSEwKSksbj97bGluZU51bWJlcjp0LGNvbHVtbjpyfTplfX1jbGFzcyBuMXtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX2hvc3Q9ZSx0aGlzLl9tb2RlbHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeT10LHRoaXMuX2ZvcmVpZ25Nb2R1bGU9bnVsbH1kaXNwb3NlKCl7dGhpcy5fbW9kZWxzPU9iamVjdC5jcmVhdGUobnVsbCl9X2dldE1vZGVsKGUpe3JldHVybiB0aGlzLl9tb2RlbHNbZV19X2dldE1vZGVscygpe2xldCB0PVtdO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tb2RlbHMpLmZvckVhY2goZT0+dC5wdXNoKHRoaXMuX21vZGVsc1tlXSkpLHR9YWNjZXB0TmV3TW9kZWwoZSl7dGhpcy5fbW9kZWxzW2UudXJsXT1uZXcgcjEoUmUucGFyc2UoZS51cmwpLGUubGluZXMsZS5FT0wsZS52ZXJzaW9uSWQpfWFjY2VwdE1vZGVsQ2hhbmdlZCh0LHIpe2lmKHRoaXMuX21vZGVsc1t0XSl7bGV0IGU9dGhpcy5fbW9kZWxzW3RdO2Uub25FdmVudHMocil9fWFjY2VwdFJlbW92ZWRNb2RlbChlKXt0aGlzLl9tb2RlbHNbZV0mJmRlbGV0ZSB0aGlzLl9tb2RlbHNbZV19Y29tcHV0ZVVuaWNvZGVIaWdobGlnaHRzKHQscixuKXtyZXR1cm4gdDEodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3ZhciBlPXRoaXMuX2dldE1vZGVsKHQpO3JldHVybiBlP1h0LmNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyhlLHIsbik6e3JhbmdlczpbXSxoYXNNb3JlOiExLGFtYmlndW91c0NoYXJhY3RlckNvdW50OjAsaW52aXNpYmxlQ2hhcmFjdGVyQ291bnQ6MCxub25CYXNpY0FzY2lpQ2hhcmFjdGVyQ291bnQ6MH19KX1jb21wdXRlRGlmZihzLG8sYSxsKXtyZXR1cm4gdDEodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2NvbnN0IGU9dGhpcy5fZ2V0TW9kZWwocyksdD10aGlzLl9nZXRNb2RlbChvKTtpZighZXx8IXQpcmV0dXJuIG51bGw7dmFyIHI9ZS5nZXRMaW5lc0NvbnRlbnQoKSxuPXQuZ2V0TGluZXNDb250ZW50KCk7Y29uc3QgaT1uZXcgWWUocixuLHtzaG91bGRDb21wdXRlQ2hhckNoYW5nZXM6ITAsc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlczohMCxzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZTphLHNob3VsZE1ha2VQcmV0dHlEaWZmOiEwLG1heENvbXB1dGF0aW9uVGltZTpsfSk7cj1pLmNvbXB1dGVEaWZmKCksbj0hKDA8ci5jaGFuZ2VzLmxlbmd0aCkmJnRoaXMuX21vZGVsc0FyZUlkZW50aWNhbChlLHQpO3JldHVybntxdWl0RWFybHk6ci5xdWl0RWFybHksaWRlbnRpY2FsOm4sY2hhbmdlczpyLmNoYW5nZXN9fSl9X21vZGVsc0FyZUlkZW50aWNhbCh0LHIpe3ZhciBuPXQuZ2V0TGluZUNvdW50KCk7aWYobiE9PXIuZ2V0TGluZUNvdW50KCkpcmV0dXJuITE7Zm9yKGxldCBlPTE7ZTw9bjtlKyspaWYodC5nZXRMaW5lQ29udGVudChlKSE9PXIuZ2V0TGluZUNvbnRlbnQoZSkpcmV0dXJuITE7cmV0dXJuITB9Y29tcHV0ZU1vcmVNaW5pbWFsRWRpdHMoYyxtKXtyZXR1cm4gdDEodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2NvbnN0IGU9dGhpcy5fZ2V0TW9kZWwoYyk7aWYoIWUpcmV0dXJuIG07Y29uc3QgdD1bXTtsZXQgcj12b2lkIDA7Zm9yKHZhcntyYW5nZTpuLHRleHQ6aSxlb2w6c31vZiBtPW0uc2xpY2UoMCkuc29ydCgoZSx0KT0+e3JldHVybiBlLnJhbmdlJiZ0LnJhbmdlP3plLmNvbXBhcmVSYW5nZXNVc2luZ1N0YXJ0cyhlLnJhbmdlLHQucmFuZ2UpOihlLnJhbmdlPzA6MSktKHQucmFuZ2U/MDoxKX0pKWlmKCJudW1iZXIiPT10eXBlb2YgcyYmKHI9cyksIXplLmlzRW1wdHkobil8fGkpe3ZhciBvPWUuZ2V0VmFsdWVJblJhbmdlKG4pO2lmKGk9aS5yZXBsYWNlKC9cclxufFxufFxyL2csZS5lb2wpLG8hPT1pKWlmKE1hdGgubWF4KGkubGVuZ3RoLG8ubGVuZ3RoKT5uMS5fZGlmZkxpbWl0KXQucHVzaCh7cmFuZ2U6bix0ZXh0Oml9KTtlbHNle3ZhciBvPShoPW8scz1pLG89ITEsbmV3IHNlKG5ldyB0ZShoKSxuZXcgdGUocykpLkNvbXB1dGVEaWZmKG8pLmNoYW5nZXMpLGE9ZS5vZmZzZXRBdCh6ZS5saWZ0KG4pLmdldFN0YXJ0UG9zaXRpb24oKSk7Zm9yKGNvbnN0IGQgb2Ygbyl7dmFyIGw9ZS5wb3NpdGlvbkF0KGErZC5vcmlnaW5hbFN0YXJ0KSx1PWUucG9zaXRpb25BdChhK2Qub3JpZ2luYWxTdGFydCtkLm9yaWdpbmFsTGVuZ3RoKSx1PXt0ZXh0Omkuc3Vic3RyKGQubW9kaWZpZWRTdGFydCxkLm1vZGlmaWVkTGVuZ3RoKSxyYW5nZTp7c3RhcnRMaW5lTnVtYmVyOmwubGluZU51bWJlcixzdGFydENvbHVtbjpsLmNvbHVtbixlbmRMaW5lTnVtYmVyOnUubGluZU51bWJlcixlbmRDb2x1bW46dS5jb2x1bW59fTtlLmdldFZhbHVlSW5SYW5nZSh1LnJhbmdlKSE9PXUudGV4dCYmdC5wdXNoKHUpfX19dmFyIGg7cmV0dXJuIm51bWJlciI9PXR5cGVvZiByJiZ0LnB1c2goe2VvbDpyLHRleHQ6IiIscmFuZ2U6e3N0YXJ0TGluZU51bWJlcjowLHN0YXJ0Q29sdW1uOjAsZW5kTGluZU51bWJlcjowLGVuZENvbHVtbjowfX0pLHR9KX1jb21wdXRlTGlua3ModCl7cmV0dXJuIHQxKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt2YXIgZT10aGlzLl9nZXRNb2RlbCh0KTtyZXR1cm4gZT8oZT1lKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0TGluZUNvdW50JiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRMaW5lQ29udGVudD9tdC5jb21wdXRlTGlua3MoZSk6W106bnVsbH0pfXRleHR1YWxTdWdnZXN0KG8sYSxsLHUpe3JldHVybiB0MSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7Y29uc3QgZT1uZXcgSSghMCk7dmFyIHQ9bmV3IFJlZ0V4cChsLHUpO2NvbnN0IHI9bmV3IFNldDtlOmZvcih2YXIgbiBvZiBvKXtjb25zdCBzPXRoaXMuX2dldE1vZGVsKG4pO2lmKHMpZm9yKHZhciBpIG9mIHMud29yZHModCkpaWYoaSE9PWEmJmlzTmFOKE51bWJlcihpKSkmJihyLmFkZChpKSxyLnNpemU+bjEuX3N1Z2dlc3Rpb25zTGltaXQpKWJyZWFrIGV9cmV0dXJue3dvcmRzOkFycmF5LmZyb20ociksZHVyYXRpb246ZS5lbGFwc2VkKCl9fSl9Y29tcHV0ZVdvcmRSYW5nZXModCxzLG8sYSl7cmV0dXJuIHQxKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtsZXQgZT10aGlzLl9nZXRNb2RlbCh0KTtpZighZSlyZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgcj1uZXcgUmVnRXhwKG8sYSk7Y29uc3Qgbj1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihsZXQgdD1zLnN0YXJ0TGluZU51bWJlcjt0PHMuZW5kTGluZU51bWJlcjt0KyspZm9yKGNvbnN0IGkgb2YgZS5nZXRMaW5lV29yZHModCxyKSlpZihpc05hTihOdW1iZXIoaS53b3JkKSkpe2xldCBlPW5baS53b3JkXTtlfHwoZT1bXSxuW2kud29yZF09ZSksZS5wdXNoKHtzdGFydExpbmVOdW1iZXI6dCxzdGFydENvbHVtbjppLnN0YXJ0Q29sdW1uLGVuZExpbmVOdW1iZXI6dCxlbmRDb2x1bW46aS5lbmRDb2x1bW59KX1yZXR1cm4gbn0pfW5hdmlnYXRlVmFsdWVTZXQoaSxzLG8sYSxsKXtyZXR1cm4gdDEodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2xldCBlPXRoaXMuX2dldE1vZGVsKGkpO2lmKCFlKXJldHVybiBudWxsO3ZhciB0PW5ldyBSZWdFeHAoYSxsKTtzLnN0YXJ0Q29sdW1uPT09cy5lbmRDb2x1bW4mJihzPXtzdGFydExpbmVOdW1iZXI6cy5zdGFydExpbmVOdW1iZXIsc3RhcnRDb2x1bW46cy5zdGFydENvbHVtbixlbmRMaW5lTnVtYmVyOnMuZW5kTGluZU51bWJlcixlbmRDb2x1bW46cy5lbmRDb2x1bW4rMX0pO3ZhciByPWUuZ2V0VmFsdWVJblJhbmdlKHMpLG49ZS5nZXRXb3JkQXRQb3NpdGlvbih7bGluZU51bWJlcjpzLnN0YXJ0TGluZU51bWJlcixjb2x1bW46cy5zdGFydENvbHVtbn0sdCk7aWYoIW4pcmV0dXJuIG51bGw7dD1lLmdldFZhbHVlSW5SYW5nZShuKTtyZXR1cm4gZnQuSU5TVEFOQ0UubmF2aWdhdGVWYWx1ZVNldChzLHIsbix0LG8pfSl9bG9hZEZvcmVpZ25Nb2R1bGUoZSx0LHIpe3I9RChyLChlLHQpPT50aGlzLl9ob3N0LmZocihlLHQpKTtyZXR1cm4gdGhpcy5fZm9yZWlnbk1vZHVsZUZhY3Rvcnk/KHRoaXMuX2ZvcmVpZ25Nb2R1bGU9dGhpcy5fZm9yZWlnbk1vZHVsZUZhY3Rvcnkoe2hvc3Q6cixnZXRNaXJyb3JNb2RlbHM6KCk9PnRoaXMuX2dldE1vZGVscygpfSx0KSxQcm9taXNlLnJlc29sdmUoayh0aGlzLl9mb3JlaWduTW9kdWxlKSkpOlByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiVW5leHBlY3RlZCB1c2FnZSIpKX1mbXIoZSx0KXtpZighdGhpcy5fZm9yZWlnbk1vZHVsZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXMuX2ZvcmVpZ25Nb2R1bGVbZV0pcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiTWlzc2luZyByZXF1ZXN0SGFuZGxlciBvciBtZXRob2Q6ICIrZSkpO3RyeXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2ZvcmVpZ25Nb2R1bGVbZV0uYXBwbHkodGhpcy5fZm9yZWlnbk1vZHVsZSx0KSl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfX19bjEuX2RpZmZMaW1pdD0xZTUsbjEuX3N1Z2dlc3Rpb25zTGltaXQ9MWU0LCJmdW5jdGlvbiI9PXR5cGVvZiBpbXBvcnRTY3JpcHRzJiYoTC5tb25hY289e2VkaXRvcjp2b2lkIDAsbGFuZ3VhZ2VzOnZvaWQgMCxleHRyYTp2b2lkIDAsQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2U6cHQsRW1pdHRlcjpSLEtleUNvZGU6ZGUsS2V5TW9kOlF0LFBvc2l0aW9uOldlLFJhbmdlOnplLFNlbGVjdGlvbjp4dCxVcmk6UmUsVG9rZW46S3QsTWFya2Rvd25TdHJpbmc6enQsRGlzcG9zYWJsZTpjLERpc3Bvc2FibGVTdG9yZTpsLEVycm9ySGFuZGxlcjp0LEFic3RyYWN0TG9nZ2VyOkd0LENvbnNvbGVMb2dnZXI6SnQsVG9rZW5pemF0aW9uUmVzdWx0OlZ0LFRva2VuaXphdGlvblJlc3VsdDI6SXQsU2VsZWN0aW9uRGlyZWN0aW9uOl9lLE1hcmtlclNldmVyaXR5OmZlLE1hcmtlclRhZzpnZSxNYXJrZG93blN0cmluZ1RleHROZXdsaW5lU3R5bGU6bWUsTG9nTGV2ZWw6Y2UsZXJyb3JIYW5kbGVyOnJ9KTtsZXQgaTE9ITE7ZnVuY3Rpb24gczEodCl7aWYoIWkxKXtpMT0hMDtjb25zdCByPW5ldyBaKGU9PntzZWxmLnBvc3RNZXNzYWdlKGUpfSxlPT5uZXcgbjEoZSx0KSk7c2VsZi5vbm1lc3NhZ2U9ZT0+e3Iub25tZXNzYWdlKGUuZGF0YSl9fX1yZXR1cm4gc2VsZi5vbm1lc3NhZ2U9ZT0+e2kxfHxzMShudWxsKX0sZS5pbml0aWFsaXplPXMxLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlfSh7fSk7Cgo=', null, false);
|
|
32
32
|
/* eslint-enable */
|
|
33
33
|
|
|
34
34
|
const workerLoaders = {
|