Socket
Socket
Sign inDemoInstall

@sentry/node

Package Overview
Dependencies
88
Maintainers
11
Versions
493
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 8.2.1 to 8.3.0

cjs/init.js

8

cjs/integrations/anr/index.js

@@ -8,10 +8,10 @@ var {

const inspector = require('node:inspector');
const node_worker_threads = require('node:worker_threads');
const core = require('@sentry/core');
const utils = require('@sentry/utils');
const inspector = require('inspector');
const worker_threads = require('worker_threads');
const nodeVersion = require('../../nodeVersion.js');
// This string is a placeholder that gets overwritten with the worker code.
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZSA4LjIuMSAoYmIyZjFiYykgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIHR9ZnJvbSJpbnNwZWN0b3IiO2ltcG9ydHtwYXJlbnRQb3J0IGFzIGUsd29ya2VyRGF0YSBhcyBufWZyb20id29ya2VyX3RocmVhZHMiO2ltcG9ydHtwb3NpeCBhcyByLHNlcCBhcyBvfWZyb20icGF0aCI7aW1wb3J0KmFzIHMgZnJvbSJub2RlOmh0dHAiO2ltcG9ydCphcyBpIGZyb20ibm9kZTpodHRwcyI7aW1wb3J0e1JlYWRhYmxlIGFzIGN9ZnJvbSJzdHJlYW0iO2ltcG9ydHtjcmVhdGVHemlwIGFzIHV9ZnJvbSJ6bGliIjtpbXBvcnQqYXMgYSBmcm9tIm5ldCI7aW1wb3J0KmFzIGYgZnJvbSJ0bHMiO2ltcG9ydCphcyBoIGZyb20iaHR0cCI7Y29uc3QgcD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIGwodCxlKXtyZXR1cm4gcC5jYWxsKHQpPT09YFtvYmplY3QgJHtlfV1gfWZ1bmN0aW9uIGQodCl7cmV0dXJuIGwodCwiT2JqZWN0Iil9ZnVuY3Rpb24gbSh0KXtyZXR1cm4gQm9vbGVhbih0JiZ0LnRoZW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW4pfWZ1bmN0aW9uIGcodCxlKXt0cnl7cmV0dXJuIHQgaW5zdGFuY2VvZiBlfWNhdGNoKHQpe3JldHVybiExfX1jb25zdCB5PWdsb2JhbFRoaXM7ZnVuY3Rpb24gYih0LGUsbil7Y29uc3Qgcj1ufHx5LG89ci5fX1NFTlRSWV9fPXIuX19TRU5UUllfX3x8e307cmV0dXJuIG9bdF18fChvW3RdPWUoKSl9Y29uc3Qgdj15LF89ODA7ZnVuY3Rpb24gdyh0LGUpe2NvbnN0IG49dCxyPVtdO2xldCBvLHMsaSxjLHU7aWYoIW58fCFuLnRhZ05hbWUpcmV0dXJuIiI7aWYodi5IVE1MRWxlbWVudCYmbiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZuLmRhdGFzZXQpe2lmKG4uZGF0YXNldC5zZW50cnlDb21wb25lbnQpcmV0dXJuIG4uZGF0YXNldC5zZW50cnlDb21wb25lbnQ7aWYobi5kYXRhc2V0LnNlbnRyeUVsZW1lbnQpcmV0dXJuIG4uZGF0YXNldC5zZW50cnlFbGVtZW50fXIucHVzaChuLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7Y29uc3QgYT1lJiZlLmxlbmd0aD9lLmZpbHRlcigodD0+bi5nZXRBdHRyaWJ1dGUodCkpKS5tYXAoKHQ9Plt0LG4uZ2V0QXR0cmlidXRlKHQpXSkpOm51bGw7aWYoYSYmYS5sZW5ndGgpYS5mb3JFYWNoKCh0PT57ci5wdXNoKGBbJHt0WzBdfT0iJHt0WzFdfSJdYCl9KSk7ZWxzZSBpZihuLmlkJiZyLnB1c2goYCMke24uaWR9YCksbz1uLmNsYXNzTmFtZSxvJiZsKG8sIlN0cmluZyIpKWZvcihzPW8uc3BsaXQoL1xzKy8pLHU9MDt1PHMubGVuZ3RoO3UrKylyLnB1c2goYC4ke3NbdV19YCk7Y29uc3QgZj1bImFyaWEtbGFiZWwiLCJ0eXBlIiwibmFtZSIsInRpdGxlIiwiYWx0Il07Zm9yKHU9MDt1PGYubGVuZ3RoO3UrKylpPWZbdV0sYz1uLmdldEF0dHJpYnV0ZShpKSxjJiZyLnB1c2goYFske2l9PSIke2N9Il1gKTtyZXR1cm4gci5qb2luKCIiKX1jb25zdCBTPSJ1bmRlZmluZWQiPT10eXBlb2YgX19TRU5UUllfREVCVUdfX3x8X19TRU5UUllfREVCVUdfXywkPVsiZGVidWciLCJpbmZvIiwid2FybiIsImVycm9yIiwibG9nIiwiYXNzZXJ0IiwidHJhY2UiXSxFPXt9O2Z1bmN0aW9uIHgodCl7aWYoISgiY29uc29sZSJpbiB5KSlyZXR1cm4gdCgpO2NvbnN0IGU9eS5jb25zb2xlLG49e30scj1PYmplY3Qua2V5cyhFKTtyLmZvckVhY2goKHQ9Pntjb25zdCByPUVbdF07blt0XT1lW3RdLGVbdF09cn0pKTt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e3IuZm9yRWFjaCgodD0+e2VbdF09blt0XX0pKX19Y29uc3QgTj1mdW5jdGlvbigpe2xldCB0PSExO2NvbnN0IGU9e2VuYWJsZTooKT0+e3Q9ITB9LGRpc2FibGU6KCk9Pnt0PSExfSxpc0VuYWJsZWQ6KCk9PnR9O3JldHVybiBTPyQuZm9yRWFjaCgobj0+e2Vbbl09KC4uLmUpPT57dCYmeCgoKCk9Pnt5LmNvbnNvbGVbbl0oYFNlbnRyeSBMb2dnZXIgWyR7bn1dOmAsLi4uZSl9KSl9fSkpOiQuZm9yRWFjaCgodD0+e2VbdF09KCk9Pnt9fSkpLGV9KCk7ZnVuY3Rpb24gayh0LGU9ITEpe2NvbnN0e2hvc3Q6bixwYXRoOnIscGFzczpvLHBvcnQ6cyxwcm9qZWN0SWQ6aSxwcm90b2NvbDpjLHB1YmxpY0tleTp1fT10O3JldHVybmAke2N9Oi8vJHt1fSR7ZSYmbz9gOiR7b31gOiIifUAke259JHtzP2A6JHtzfWA6IiJ9LyR7cj9gJHtyfS9gOnJ9JHtpfWB9Y2xhc3MgQyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsZT0id2FybiIpe3N1cGVyKHQpLHRoaXMubWVzc2FnZT10LHRoaXMubmFtZT1uZXcudGFyZ2V0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKSx0aGlzLmxvZ0xldmVsPWV9fWZ1bmN0aW9uIEQodCl7aWYoZnVuY3Rpb24odCl7c3dpdGNoKHAuY2FsbCh0KSl7Y2FzZSJbb2JqZWN0IEVycm9yXSI6Y2FzZSJbb2JqZWN0IEV4Y2VwdGlvbl0iOmNhc2UiW29iamVjdCBET01FeGNlcHRpb25dIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiBnKHQsRXJyb3IpfX0odCkpcmV0dXJue21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2ssLi4uTyh0KX07aWYoZT10LCJ1bmRlZmluZWQiIT10eXBlb2YgRXZlbnQmJmcoZSxFdmVudCkpe2NvbnN0IGU9e3R5cGU6dC50eXBlLHRhcmdldDpUKHQudGFyZ2V0KSxjdXJyZW50VGFyZ2V0OlQodC5jdXJyZW50VGFyZ2V0KSwuLi5PKHQpfTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEN1c3RvbUV2ZW50JiZnKHQsQ3VzdG9tRXZlbnQpJiYoZS5kZXRhaWw9dC5kZXRhaWwpLGV9cmV0dXJuIHQ7dmFyIGV9ZnVuY3Rpb24gVCh0KXt0cnl7cmV0dXJuIGU9dCwidW5kZWZpbmVkIiE9dHlwZW9mIEVsZW1lbnQmJmcoZSxFbGVtZW50KT9mdW5jdGlvbih0LGU9e30pe2lmKCF0KXJldHVybiI8dW5rbm93bj4iO3RyeXtsZXQgbj10O2NvbnN0IHI9NSxvPVtdO2xldCBzPTAsaT0wO2NvbnN0IGM9IiA+ICIsdT1jLmxlbmd0aDtsZXQgYTtjb25zdCBmPUFycmF5LmlzQXJyYXkoZSk/ZTplLmtleUF0dHJzLGg9IUFycmF5LmlzQXJyYXkoZSkmJmUubWF4U3RyaW5nTGVuZ3RofHxfO2Zvcig7biYmcysrPHImJihhPXcobixmKSwhKCJodG1sIj09PWF8fHM+MSYmaStvLmxlbmd0aCp1K2EubGVuZ3RoPj1oKSk7KW8ucHVzaChhKSxpKz1hLmxlbmd0aCxuPW4ucGFyZW50Tm9kZTtyZXR1cm4gby5yZXZlcnNlKCkuam9pbihjKX1jYXRjaCh0KXtyZXR1cm4iPHVua25vd24+In19KHQpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1jYXRjaCh0KXtyZXR1cm4iPHVua25vd24+In12YXIgZX1mdW5jdGlvbiBPKHQpe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQpe2NvbnN0IGU9e307Zm9yKGNvbnN0IG4gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGV9cmV0dXJue319ZnVuY3Rpb24gaih0KXtyZXR1cm4gUih0LG5ldyBNYXApfWZ1bmN0aW9uIFIodCxlKXtpZihmdW5jdGlvbih0KXtpZighZCh0KSlyZXR1cm4hMTt0cnl7Y29uc3QgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IubmFtZTtyZXR1cm4hZXx8Ik9iamVjdCI9PT1lfWNhdGNoKHQpe3JldHVybiEwfX0odCkpe2NvbnN0IG49ZS5nZXQodCk7aWYodm9pZCAwIT09bilyZXR1cm4gbjtjb25zdCByPXt9O2Uuc2V0KHQscik7Zm9yKGNvbnN0IG4gb2YgT2JqZWN0LmtleXModCkpdm9pZCAwIT09dFtuXSYmKHJbbl09Uih0W25dLGUpKTtyZXR1cm4gcn1pZihBcnJheS5pc0FycmF5KHQpKXtjb25zdCBuPWUuZ2V0KHQpO2lmKHZvaWQgMCE9PW4pcmV0dXJuIG47Y29uc3Qgcj1bXTtyZXR1cm4gZS5zZXQodCxyKSx0LmZvckVhY2goKHQ9PntyLnB1c2goUih0LGUpKX0pKSxyfXJldHVybiB0fWNvbnN0IEE9NTAsST0iPyIsUD0vY2FwdHVyZU1lc3NhZ2V8Y2FwdHVyZUV4Y2VwdGlvbi87Y29uc3QgVT0iPGFub255bW91cz4iO2NvbnN0IE09MWUzO2Z1bmN0aW9uIEwoKXtyZXR1cm4gRGF0ZS5ub3coKS9NfWNvbnN0IEI9ZnVuY3Rpb24oKXtjb25zdHtwZXJmb3JtYW5jZTp0fT15O2lmKCF0fHwhdC5ub3cpcmV0dXJuIEw7Y29uc3QgZT1EYXRlLm5vdygpLXQubm93KCksbj1udWxsPT10LnRpbWVPcmlnaW4/ZTp0LnRpbWVPcmlnaW47cmV0dXJuKCk9PihuK3Qubm93KCkpL019KCk7ZnVuY3Rpb24gRygpe2NvbnN0IHQ9eSxlPXQuY3J5cHRvfHx0Lm1zQ3J5cHRvO2xldCBuPSgpPT4xNipNYXRoLnJhbmRvbSgpO3RyeXtpZihlJiZlLnJhbmRvbVVVSUQpcmV0dXJuIGUucmFuZG9tVVVJRCgpLnJlcGxhY2UoLy0vZywiIik7ZSYmZS5nZXRSYW5kb21WYWx1ZXMmJihuPSgpPT57Y29uc3QgdD1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZS5nZXRSYW5kb21WYWx1ZXModCksdFswXX0pfWNhdGNoKHQpe31yZXR1cm4oWzFlN10rMWUzKzRlMys4ZTMrMWUxMSkucmVwbGFjZSgvWzAxOF0vZywodD0+KHReKDE1Jm4oKSk+PnQvNCkudG9TdHJpbmcoMTYpKSl9ZnVuY3Rpb24gSih0LGU9MTAwLG49MS8wKXt0cnl7cmV0dXJuIHooIiIsdCxlLG4pfWNhdGNoKHQpe3JldHVybntFUlJPUjpgKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH19fWZ1bmN0aW9uIHoodCxlLG49MS8wLHI9MS8wLG89ZnVuY3Rpb24oKXtjb25zdCB0PSJmdW5jdGlvbiI9PXR5cGVvZiBXZWFrU2V0LGU9dD9uZXcgV2Vha1NldDpbXTtyZXR1cm5bZnVuY3Rpb24obil7aWYodClyZXR1cm4hIWUuaGFzKG4pfHwoZS5hZGQobiksITEpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKGVbdF09PT1uKXJldHVybiEwO3JldHVybiBlLnB1c2gobiksITF9LGZ1bmN0aW9uKG4pe2lmKHQpZS5kZWxldGUobik7ZWxzZSBmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylpZihlW3RdPT09bil7ZS5zcGxpY2UodCwxKTticmVha319XX0oKSl7Y29uc3RbcyxpXT1vO2lmKG51bGw9PWV8fFsibnVtYmVyIiwiYm9vbGVhbiIsInN0cmluZyJdLmluY2x1ZGVzKHR5cGVvZiBlKSYmIU51bWJlci5pc05hTihlKSlyZXR1cm4gZTtjb25zdCBjPWZ1bmN0aW9uKHQsZSl7dHJ5e2lmKCJkb21haW4iPT09dCYmZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZlLnQpcmV0dXJuIltEb21haW5dIjtpZigiZG9tYWluRW1pdHRlciI9PT10KXJldHVybiJbRG9tYWluRW1pdHRlcl0iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZlPT09Z2xvYmFsKXJldHVybiJbR2xvYmFsXSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJmU9PT13aW5kb3cpcmV0dXJuIltXaW5kb3ddIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZlPT09ZG9jdW1lbnQpcmV0dXJuIltEb2N1bWVudF0iO2lmKCJvYmplY3QiPT10eXBlb2Yobj1lKSYmbnVsbCE9PW4mJihuLl9faXNWdWV8fG4ubykpcmV0dXJuIltWdWVWaWV3TW9kZWxdIjtpZihmdW5jdGlvbih0KXtyZXR1cm4gZCh0KSYmIm5hdGl2ZUV2ZW50ImluIHQmJiJwcmV2ZW50RGVmYXVsdCJpbiB0JiYic3RvcFByb3BhZ2F0aW9uImluIHR9KGUpKXJldHVybiJbU3ludGhldGljRXZlbnRdIjtpZigibnVtYmVyIj09dHlwZW9mIGUmJmUhPWUpcmV0dXJuIltOYU5dIjtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSlyZXR1cm5gW0Z1bmN0aW9uOiAke2Z1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQubmFtZXx8VX1jYXRjaCh0KXtyZXR1cm4gVX19KGUpfV1gO2lmKCJzeW1ib2wiPT10eXBlb2YgZSlyZXR1cm5gWyR7U3RyaW5nKGUpfV1gO2lmKCJiaWdpbnQiPT10eXBlb2YgZSlyZXR1cm5gW0JpZ0ludDogJHtTdHJpbmcoZSl9XWA7Y29uc3Qgcj1mdW5jdGlvbih0KXtjb25zdCBlPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtyZXR1cm4gZT9lLmNvbnN0cnVjdG9yLm5hbWU6Im51bGwgcHJvdG90eXBlIn0oZSk7cmV0dXJuL15IVE1MKFx3KilFbGVtZW50JC8udGVzdChyKT9gW0hUTUxFbGVtZW50OiAke3J9XWA6YFtvYmplY3QgJHtyfV1gfWNhdGNoKHQpe3JldHVybmAqKm5vbi1zZXJpYWxpemFibGUqKiAoJHt0fSlgfXZhciBufSh0LGUpO2lmKCFjLnN0YXJ0c1dpdGgoIltvYmplY3QgIikpcmV0dXJuIGM7aWYoZS5fX3NlbnRyeV9za2lwX25vcm1hbGl6YXRpb25fXylyZXR1cm4gZTtjb25zdCB1PSJudW1iZXIiPT10eXBlb2YgZS5fX3NlbnRyeV9vdmVycmlkZV9ub3JtYWxpemF0aW9uX2RlcHRoX18/ZS5fX3NlbnRyeV9vdmVycmlkZV9ub3JtYWxpemF0aW9uX2RlcHRoX186bjtpZigwPT09dSlyZXR1cm4gYy5yZXBsYWNlKCJvYmplY3QgIiwiIik7aWYocyhlKSlyZXR1cm4iW0NpcmN1bGFyIH5dIjtjb25zdCBhPWU7aWYoYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEudG9KU09OKXRyeXtyZXR1cm4geigiIixhLnRvSlNPTigpLHUtMSxyLG8pfWNhdGNoKHQpe31jb25zdCBmPUFycmF5LmlzQXJyYXkoZSk/W106e307bGV0IGg9MDtjb25zdCBwPUQoZSk7Zm9yKGNvbnN0IHQgaW4gcCl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwLHQpKWNvbnRpbnVlO2lmKGg+PXIpe2ZbdF09IltNYXhQcm9wZXJ0aWVzIH5dIjticmVha31jb25zdCBlPXBbdF07Zlt0XT16KHQsZSx1LTEscixvKSxoKyt9cmV0dXJuIGkoZSksZn1mdW5jdGlvbiBIKHQsZSl7Y29uc3Qgbj1lLnJlcGxhY2UoL1xcL2csIi8iKS5yZXBsYWNlKC9bfFxce30oKVtcXV4kKyo/Ll0vZywiXFwkJiIpO2xldCByPXQ7dHJ5e3I9ZGVjb2RlVVJJKHQpfWNhdGNoKHQpe31yZXR1cm4gci5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSgvd2VicGFjazpcLz8vZywiIikucmVwbGFjZShuZXcgUmVnRXhwKGAoZmlsZTovLyk/Lyoke259LypgLCJpZyIpLCJhcHA6Ly8vIil9KCgpPT57Y29uc3R7cGVyZm9ybWFuY2U6dH09eTtpZighdHx8IXQubm93KXJldHVybjtjb25zdCBlPTM2ZTUsbj10Lm5vdygpLHI9RGF0ZS5ub3coKSxvPXQudGltZU9yaWdpbj9NYXRoLmFicyh0LnRpbWVPcmlnaW4rbi1yKTplLHM9bzxlLGk9dC50aW1pbmcmJnQudGltaW5nLm5hdmlnYXRpb25TdGFydCxjPSJudW1iZXIiPT10eXBlb2YgaT9NYXRoLmFicyhpK24tcik6ZTsoc3x8YzxlKSYmKG88PWMmJnQudGltZU9yaWdpbil9KSgpO2NvbnN0IFc9L14oXFMrOlxcfFwvPykoW1xzXFNdKj8pKCg/OlwuezEsMn18W14vXFxdKz98KShcLlteLi9cXF0qfCkpKD86Wy9cXF0qKSQvO2Z1bmN0aW9uIFkodCl7Y29uc3QgZT1mdW5jdGlvbih0KXtjb25zdCBlPXQubGVuZ3RoPjEwMjQ/YDx0cnVuY2F0ZWQ+JHt0LnNsaWNlKC0xMDI0KX1gOnQsbj1XLmV4ZWMoZSk7cmV0dXJuIG4/bi5zbGljZSgxKTpbXX0odCksbj1lWzBdO2xldCByPWVbMV07cmV0dXJuIG58fHI/KHImJihyPXIuc2xpY2UoMCxyLmxlbmd0aC0xKSksbityKToiLiJ9dmFyIHE7ZnVuY3Rpb24gRih0KXtyZXR1cm4gbmV3IEsoKGU9PntlKHQpfSkpfSFmdW5jdGlvbih0KXt0W3QuUEVORElORz0wXT0iUEVORElORyI7dFt0LlJFU09MVkVEPTFdPSJSRVNPTFZFRCI7dFt0LlJFSkVDVEVEPTJdPSJSRUpFQ1RFRCJ9KHF8fChxPXt9KSk7Y2xhc3MgS3tjb25zdHJ1Y3Rvcih0KXtLLnByb3RvdHlwZS5fX2luaXQuY2FsbCh0aGlzKSxLLnByb3RvdHlwZS5fX2luaXQyLmNhbGwodGhpcyksSy5wcm90b3R5cGUuX19pbml0My5jYWxsKHRoaXMpLEsucHJvdG90eXBlLl9faW5pdDQuY2FsbCh0aGlzKSx0aGlzLmk9cS5QRU5ESU5HLHRoaXMudT1bXTt0cnl7dCh0aGlzLmgsdGhpcy5wKX1jYXRjaCh0KXt0aGlzLnAodCl9fXRoZW4odCxlKXtyZXR1cm4gbmV3IEsoKChuLHIpPT57dGhpcy51LnB1c2goWyExLGU9PntpZih0KXRyeXtuKHQoZSkpfWNhdGNoKHQpe3IodCl9ZWxzZSBuKGUpfSx0PT57aWYoZSl0cnl7bihlKHQpKX1jYXRjaCh0KXtyKHQpfWVsc2Ugcih0KX1dKSx0aGlzLmwoKX0pKX1jYXRjaCh0KXtyZXR1cm4gdGhpcy50aGVuKCh0PT50KSx0KX1maW5hbGx5KHQpe3JldHVybiBuZXcgSygoKGUsbik9PntsZXQgcixvO3JldHVybiB0aGlzLnRoZW4oKGU9PntvPSExLHI9ZSx0JiZ0KCl9KSwoZT0+e289ITAscj1lLHQmJnQoKX0pKS50aGVuKCgoKT0+e28/bihyKTplKHIpfSkpfSkpfV9faW5pdCgpe3RoaXMuaD10PT57dGhpcy5tKHEuUkVTT0xWRUQsdCl9fV9faW5pdDIoKXt0aGlzLnA9dD0+e3RoaXMubShxLlJFSkVDVEVELHQpfX1fX2luaXQzKCl7dGhpcy5tPSh0LGUpPT57dGhpcy5pPT09cS5QRU5ESU5HJiYobShlKT9lLnRoZW4odGhpcy5oLHRoaXMucCk6KHRoaXMuaT10LHRoaXMudj1lLHRoaXMubCgpKSl9fV9faW5pdDQoKXt0aGlzLmw9KCk9PntpZih0aGlzLmk9PT1xLlBFTkRJTkcpcmV0dXJuO2NvbnN0IHQ9dGhpcy51LnNsaWNlKCk7dGhpcy51PVtdLHQuZm9yRWFjaCgodD0+e3RbMF18fCh0aGlzLmk9PT1xLlJFU09MVkVEJiZ0WzFdKHRoaXMudiksdGhpcy5pPT09cS5SRUpFQ1RFRCYmdFsyXSh0aGlzLnYpLHRbMF09ITApfSkpfX19ZnVuY3Rpb24gVih0KXtjb25zdCBlPVtdO2Z1bmN0aW9uIG4odCl7cmV0dXJuIGUuc3BsaWNlKGUuaW5kZXhPZih0KSwxKVswXX1yZXR1cm57JDplLGFkZDpmdW5jdGlvbihyKXtpZighKHZvaWQgMD09PXR8fGUubGVuZ3RoPHQpKXJldHVybiBvPW5ldyBDKCJOb3QgYWRkaW5nIFByb21pc2UgYmVjYXVzZSBidWZmZXIgbGltaXQgd2FzIHJlYWNoZWQuIiksbmV3IEsoKCh0LGUpPT57ZShvKX0pKTt2YXIgbztjb25zdCBzPXIoKTtyZXR1cm4tMT09PWUuaW5kZXhPZihzKSYmZS5wdXNoKHMpLHMudGhlbigoKCk9Pm4ocykpKS50aGVuKG51bGwsKCgpPT5uKHMpLnRoZW4obnVsbCwoKCk9Pnt9KSkpKSxzfSxkcmFpbjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEsoKChuLHIpPT57bGV0IG89ZS5sZW5ndGg7aWYoIW8pcmV0dXJuIG4oITApO2NvbnN0IHM9c2V0VGltZW91dCgoKCk9Pnt0JiZ0PjAmJm4oITEpfSksdCk7ZS5mb3JFYWNoKCh0PT57Rih0KS50aGVuKCgoKT0+ey0tb3x8KGNsZWFyVGltZW91dChzKSxuKCEwKSl9KSxyKX0pKX0pKX19fWZ1bmN0aW9uIFoodCxlPSExKXtyZXR1cm4hKGV8fHQmJiF0LnN0YXJ0c1dpdGgoIi8iKSYmIXQubWF0Y2goL15bQS1aXTovKSYmIXQuc3RhcnRzV2l0aCgiLiIpJiYhdC5tYXRjaCgvXlthLXpBLVpdKFthLXpBLVowLTkuXC0rXSkqOlwvXC8vKSkmJnZvaWQgMCE9PXQmJiF0LmluY2x1ZGVzKCJub2RlX21vZHVsZXMvIil9ZnVuY3Rpb24gUSh0LGU9W10pe3JldHVyblt0LGVdfWZ1bmN0aW9uIFgodCxlKXtjb25zdCBuPXRbMV07Zm9yKGNvbnN0IHQgb2Ygbil7aWYoZSh0LHRbMF0udHlwZSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gdHQodCl7cmV0dXJuIHkuX19TRU5UUllfXyYmeS5fX1NFTlRSWV9fLmVuY29kZVBvbHlmaWxsP3kuX19TRU5UUllfXy5lbmNvZGVQb2x5ZmlsbCh0KToobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCl9ZnVuY3Rpb24gZXQodCl7Y29uc3RbZSxuXT10O2xldCByPUpTT04uc3RyaW5naWZ5KGUpO2Z1bmN0aW9uIG8odCl7InN0cmluZyI9PXR5cGVvZiByP3I9InN0cmluZyI9PXR5cGVvZiB0P3IrdDpbdHQociksdF06ci5wdXNoKCJzdHJpbmciPT10eXBlb2YgdD90dCh0KTp0KX1mb3IoY29uc3QgdCBvZiBuKXtjb25zdFtlLG5dPXQ7aWYobyhgXG4ke0pTT04uc3RyaW5naWZ5KGUpfVxuYCksInN0cmluZyI9PXR5cGVvZiBufHxuIGluc3RhbmNlb2YgVWludDhBcnJheSlvKG4pO2Vsc2V7bGV0IHQ7dHJ5e3Q9SlNPTi5zdHJpbmdpZnkobil9Y2F0Y2goZSl7dD1KU09OLnN0cmluZ2lmeShKKG4pKX1vKHQpfX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHI/cjpmdW5jdGlvbih0KXtjb25zdCBlPXQucmVkdWNlKCgodCxlKT0+dCtlLmxlbmd0aCksMCksbj1uZXcgVWludDhBcnJheShlKTtsZXQgcj0wO2Zvcihjb25zdCBlIG9mIHQpbi5zZXQoZSxyKSxyKz1lLmxlbmd0aDtyZXR1cm4gbn0ocil9Y29uc3QgbnQ9e3Nlc3Npb246InNlc3Npb24iLHNlc3Npb25zOiJzZXNzaW9uIixhdHRhY2htZW50OiJhdHRhY2htZW50Iix0cmFuc2FjdGlvbjoidHJhbnNhY3Rpb24iLGV2ZW50OiJlcnJvciIsY2xpZW50X3JlcG9ydDoiaW50ZXJuYWwiLHVzZXJfcmVwb3J0OiJkZWZhdWx0Iixwcm9maWxlOiJwcm9maWxlIixyZXBsYXlfZXZlbnQ6InJlcGxheSIscmVwbGF5X3JlY29yZGluZzoicmVwbGF5IixjaGVja19pbjoibW9uaXRvciIsZmVlZGJhY2s6ImZlZWRiYWNrIixzcGFuOiJzcGFuIixzdGF0c2Q6Im1ldHJpY19idWNrZXQifTtmdW5jdGlvbiBydCh0KXtyZXR1cm4gbnRbdF19ZnVuY3Rpb24gb3QodCl7aWYoIXR8fCF0LnNkaylyZXR1cm47Y29uc3R7bmFtZTplLHZlcnNpb246bn09dC5zZGs7cmV0dXJue25hbWU6ZSx2ZXJzaW9uOm59fWNvbnN0IHN0PTZlNDtmdW5jdGlvbiBpdCh0LHtzdGF0dXNDb2RlOmUsaGVhZGVyczpufSxyPURhdGUubm93KCkpe2NvbnN0IG89ey4uLnR9LHM9biYmblsieC1zZW50cnktcmF0ZS1saW1pdHMiXSxpPW4mJm5bInJldHJ5LWFmdGVyIl07aWYocylmb3IoY29uc3QgdCBvZiBzLnRyaW0oKS5zcGxpdCgiLCIpKXtjb25zdFtlLG4sLCxzXT10LnNwbGl0KCI6Iiw1KSxpPXBhcnNlSW50KGUsMTApLGM9MWUzKihpc05hTihpKT82MDppKTtpZihuKWZvcihjb25zdCB0IG9mIG4uc3BsaXQoIjsiKSkibWV0cmljX2J1Y2tldCI9PT10JiZzJiYhcy5zcGxpdCgiOyIpLmluY2x1ZGVzKCJjdXN0b20iKXx8KG9bdF09citjKTtlbHNlIG8uYWxsPXIrY31lbHNlIGk/by5hbGw9citmdW5jdGlvbih0LGU9RGF0ZS5ub3coKSl7Y29uc3Qgbj1wYXJzZUludChgJHt0fWAsMTApO2lmKCFpc05hTihuKSlyZXR1cm4gMWUzKm47Y29uc3Qgcj1EYXRlLnBhcnNlKGAke3R9YCk7cmV0dXJuIGlzTmFOKHIpP3N0OnItZX0oaSxyKTo0Mjk9PT1lJiYoby5hbGw9cis2ZTQpO3JldHVybiBvfWNvbnN0IGN0PSJ1bmRlZmluZWQiPT10eXBlb2YgX19TRU5UUllfREVCVUdfX3x8X19TRU5UUllfREVCVUdfXztmdW5jdGlvbiB1dCgpe3JldHVybiBhdCh5KSx5fWZ1bmN0aW9uIGF0KHQpe3JldHVybiB0Ll9fU0VOVFJZX198fCh0Ll9fU0VOVFJZX189e2V4dGVuc2lvbnM6e319KSx0Ll9fU0VOVFJZX199ZnVuY3Rpb24gZnQodCl7Y29uc3QgZT1CKCksbj17c2lkOkcoKSxpbml0OiEwLHRpbWVzdGFtcDplLHN0YXJ0ZWQ6ZSxkdXJhdGlvbjowLHN0YXR1czoib2siLGVycm9yczowLGlnbm9yZUR1cmF0aW9uOiExLHRvSlNPTjooKT0+ZnVuY3Rpb24odCl7cmV0dXJuIGooe3NpZDpgJHt0LnNpZH1gLGluaXQ6dC5pbml0LHN0YXJ0ZWQ6bmV3IERhdGUoMWUzKnQuc3RhcnRlZCkudG9JU09TdHJpbmcoKSx0aW1lc3RhbXA6bmV3IERhdGUoMWUzKnQudGltZXN0YW1wKS50b0lTT1N0cmluZygpLHN0YXR1czp0LnN0YXR1cyxlcnJvcnM6dC5lcnJvcnMsZGlkOiJudW1iZXIiPT10eXBlb2YgdC5kaWR8fCJzdHJpbmciPT10eXBlb2YgdC5kaWQ/YCR7dC5kaWR9YDp2b2lkIDAsZHVyYXRpb246dC5kdXJhdGlvbixhYm5vcm1hbF9tZWNoYW5pc206dC5hYm5vcm1hbF9tZWNoYW5pc20sYXR0cnM6e3JlbGVhc2U6dC5yZWxlYXNlLGVudmlyb25tZW50OnQuZW52aXJvbm1lbnQsaXBfYWRkcmVzczp0LmlwQWRkcmVzcyx1c2VyX2FnZW50OnQudXNlckFnZW50fX0pfShuKX07cmV0dXJuIHQmJmh0KG4sdCksbn1mdW5jdGlvbiBodCh0LGU9e30pe2lmKGUudXNlciYmKCF0LmlwQWRkcmVzcyYmZS51c2VyLmlwX2FkZHJlc3MmJih0LmlwQWRkcmVzcz1lLnVzZXIuaXBfYWRkcmVzcyksdC5kaWR8fGUuZGlkfHwodC5kaWQ9ZS51c2VyLmlkfHxlLnVzZXIuZW1haWx8fGUudXNlci51c2VybmFtZSkpLHQudGltZXN0YW1wPWUudGltZXN0YW1wfHxCKCksZS5hYm5vcm1hbF9tZWNoYW5pc20mJih0LmFibm9ybWFsX21lY2hhbmlzbT1lLmFibm9ybWFsX21lY2hhbmlzbSksZS5pZ25vcmVEdXJhdGlvbiYmKHQuaWdub3JlRHVyYXRpb249ZS5pZ25vcmVEdXJhdGlvbiksZS5zaWQmJih0LnNpZD0zMj09PWUuc2lkLmxlbmd0aD9lLnNpZDpHKCkpLHZvaWQgMCE9PWUuaW5pdCYmKHQuaW5pdD1lLmluaXQpLCF0LmRpZCYmZS5kaWQmJih0LmRpZD1gJHtlLmRpZH1gKSwibnVtYmVyIj09dHlwZW9mIGUuc3RhcnRlZCYmKHQuc3RhcnRlZD1lLnN0YXJ0ZWQpLHQuaWdub3JlRHVyYXRpb24pdC5kdXJhdGlvbj12b2lkIDA7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGUuZHVyYXRpb24pdC5kdXJhdGlvbj1lLmR1cmF0aW9uO2Vsc2V7Y29uc3QgZT10LnRpbWVzdGFtcC10LnN0YXJ0ZWQ7dC5kdXJhdGlvbj1lPj0wP2U6MH1lLnJlbGVhc2UmJih0LnJlbGVhc2U9ZS5yZWxlYXNlKSxlLmVudmlyb25tZW50JiYodC5lbnZpcm9ubWVudD1lLmVudmlyb25tZW50KSwhdC5pcEFkZHJlc3MmJmUuaXBBZGRyZXNzJiYodC5pcEFkZHJlc3M9ZS5pcEFkZHJlc3MpLCF0LnVzZXJBZ2VudCYmZS51c2VyQWdlbnQmJih0LnVzZXJBZ2VudD1lLnVzZXJBZ2VudCksIm51bWJlciI9PXR5cGVvZiBlLmVycm9ycyYmKHQuZXJyb3JzPWUuZXJyb3JzKSxlLnN0YXR1cyYmKHQuc3RhdHVzPWUuc3RhdHVzKX1jb25zdCBwdD0iX3NlbnRyeVNwYW4iO2Z1bmN0aW9uIGx0KHQsZSl7ZT9mdW5jdGlvbih0LGUsbil7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9Y2F0Y2gobil7UyYmTi5sb2coYEZhaWxlZCB0byBhZGQgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgIiR7ZX0iIHRvIG9iamVjdGAsdCl9fSh0LHB0LGUpOmRlbGV0ZSB0W3B0XX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gdFtwdF19Y2xhc3MgbXR7Y29uc3RydWN0b3IoKXt0aGlzLl89ITEsdGhpcy5TPVtdLHRoaXMuTj1bXSx0aGlzLms9W10sdGhpcy5DPVtdLHRoaXMuRD17fSx0aGlzLlQ9e30sdGhpcy5PPXt9LHRoaXMuaj17fSx0aGlzLlI9e30sdGhpcy5BPXl0KCl9Y2xvbmUoKXtjb25zdCB0PW5ldyBtdDtyZXR1cm4gdC5rPVsuLi50aGlzLmtdLHQuVD17Li4udGhpcy5UfSx0Lk89ey4uLnRoaXMuT30sdC5qPXsuLi50aGlzLmp9LHQuRD10aGlzLkQsdC5JPXRoaXMuSSx0LlA9dGhpcy5QLHQuVT10aGlzLlUsdC5NPXRoaXMuTSx0Lk49Wy4uLnRoaXMuTl0sdC5MPXRoaXMuTCx0LkM9Wy4uLnRoaXMuQ10sdC5SPXsuLi50aGlzLlJ9LHQuQT17Li4udGhpcy5BfSx0LkI9dGhpcy5CLHQuRz10aGlzLkcsbHQodCxkdCh0aGlzKSksdH1zZXRDbGllbnQodCl7dGhpcy5CPXR9c2V0TGFzdEV2ZW50SWQodCl7dGhpcy5HPXR9Z2V0Q2xpZW50KCl7cmV0dXJuIHRoaXMuQn1sYXN0RXZlbnRJZCgpe3JldHVybiB0aGlzLkd9YWRkU2NvcGVMaXN0ZW5lcih0KXt0aGlzLlMucHVzaCh0KX1hZGRFdmVudFByb2Nlc3Nvcih0KXtyZXR1cm4gdGhpcy5OLnB1c2godCksdGhpc31zZXRVc2VyKHQpe3JldHVybiB0aGlzLkQ9dHx8e2VtYWlsOnZvaWQgMCxpZDp2b2lkIDAsaXBfYWRkcmVzczp2b2lkIDAsdXNlcm5hbWU6dm9pZCAwfSx0aGlzLlAmJmh0KHRoaXMuUCx7dXNlcjp0fSksdGhpcy5KKCksdGhpc31nZXRVc2VyKCl7cmV0dXJuIHRoaXMuRH1nZXRSZXF1ZXN0U2Vzc2lvbigpe3JldHVybiB0aGlzLkx9c2V0UmVxdWVzdFNlc3Npb24odCl7cmV0dXJuIHRoaXMuTD10LHRoaXN9c2V0VGFncyh0KXtyZXR1cm4gdGhpcy5UPXsuLi50aGlzLlQsLi4udH0sdGhpcy5KKCksdGhpc31zZXRUYWcodCxlKXtyZXR1cm4gdGhpcy5UPXsuLi50aGlzLlQsW3RdOmV9LHRoaXMuSigpLHRoaXN9c2V0RXh0cmFzKHQpe3JldHVybiB0aGlzLk89ey4uLnRoaXMuTywuLi50fSx0aGlzLkooKSx0aGlzfXNldEV4dHJhKHQsZSl7cmV0dXJuIHRoaXMuTz17Li4udGhpcy5PLFt0XTplfSx0aGlzLkooKSx0aGlzfXNldEZpbmdlcnByaW50KHQpe3JldHVybiB0aGlzLk09dCx0aGlzLkooKSx0aGlzfXNldExldmVsKHQpe3JldHVybiB0aGlzLkk9dCx0aGlzLkooKSx0aGlzfXNldFRyYW5zYWN0aW9uTmFtZSh0KXtyZXR1cm4gdGhpcy5VPXQsdGhpcy5KKCksdGhpc31zZXRDb250ZXh0KHQsZSl7cmV0dXJuIG51bGw9PT1lP2RlbGV0ZSB0aGlzLmpbdF06dGhpcy5qW3RdPWUsdGhpcy5KKCksdGhpc31zZXRTZXNzaW9uKHQpe3JldHVybiB0P3RoaXMuUD10OmRlbGV0ZSB0aGlzLlAsdGhpcy5KKCksdGhpc31nZXRTZXNzaW9uKCl7cmV0dXJuIHRoaXMuUH11cGRhdGUodCl7aWYoIXQpcmV0dXJuIHRoaXM7Y29uc3QgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90KHRoaXMpOnQsW24scl09ZSBpbnN0YW5jZW9mIGd0P1tlLmdldFNjb3BlRGF0YSgpLGUuZ2V0UmVxdWVzdFNlc3Npb24oKV06ZChlKT9bdCx0LnJlcXVlc3RTZXNzaW9uXTpbXSx7dGFnczpvLGV4dHJhOnMsdXNlcjppLGNvbnRleHRzOmMsbGV2ZWw6dSxmaW5nZXJwcmludDphPVtdLHByb3BhZ2F0aW9uQ29udGV4dDpmfT1ufHx7fTtyZXR1cm4gdGhpcy5UPXsuLi50aGlzLlQsLi4ub30sdGhpcy5PPXsuLi50aGlzLk8sLi4uc30sdGhpcy5qPXsuLi50aGlzLmosLi4uY30saSYmT2JqZWN0LmtleXMoaSkubGVuZ3RoJiYodGhpcy5EPWkpLHUmJih0aGlzLkk9dSksYS5sZW5ndGgmJih0aGlzLk09YSksZiYmKHRoaXMuQT1mKSxyJiYodGhpcy5MPXIpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy5rPVtdLHRoaXMuVD17fSx0aGlzLk89e30sdGhpcy5EPXt9LHRoaXMuaj17fSx0aGlzLkk9dm9pZCAwLHRoaXMuVT12b2lkIDAsdGhpcy5NPXZvaWQgMCx0aGlzLkw9dm9pZCAwLHRoaXMuUD12b2lkIDAsbHQodGhpcyx2b2lkIDApLHRoaXMuQz1bXSx0aGlzLkE9eXQoKSx0aGlzLkooKSx0aGlzfWFkZEJyZWFkY3J1bWIodCxlKXtjb25zdCBuPSJudW1iZXIiPT10eXBlb2YgZT9lOjEwMDtpZihuPD0wKXJldHVybiB0aGlzO2NvbnN0IHI9e3RpbWVzdGFtcDpMKCksLi4udH0sbz10aGlzLms7cmV0dXJuIG8ucHVzaChyKSx0aGlzLms9by5sZW5ndGg+bj9vLnNsaWNlKC1uKTpvLHRoaXMuSigpLHRoaXN9Z2V0TGFzdEJyZWFkY3J1bWIoKXtyZXR1cm4gdGhpcy5rW3RoaXMuay5sZW5ndGgtMV19Y2xlYXJCcmVhZGNydW1icygpe3JldHVybiB0aGlzLms9W10sdGhpcy5KKCksdGhpc31hZGRBdHRhY2htZW50KHQpe3JldHVybiB0aGlzLkMucHVzaCh0KSx0aGlzfWNsZWFyQXR0YWNobWVudHMoKXtyZXR1cm4gdGhpcy5DPVtdLHRoaXN9Z2V0U2NvcGVEYXRhKCl7cmV0dXJue2JyZWFkY3J1bWJzOnRoaXMuayxhdHRhY2htZW50czp0aGlzLkMsY29udGV4dHM6dGhpcy5qLHRhZ3M6dGhpcy5ULGV4dHJhOnRoaXMuTyx1c2VyOnRoaXMuRCxsZXZlbDp0aGlzLkksZmluZ2VycHJpbnQ6dGhpcy5NfHxbXSxldmVudFByb2Nlc3NvcnM6dGhpcy5OLHByb3BhZ2F0aW9uQ29udGV4dDp0aGlzLkEsc2RrUHJvY2Vzc2luZ01ldGFkYXRhOnRoaXMuUix0cmFuc2FjdGlvbk5hbWU6dGhpcy5VLHNwYW46ZHQodGhpcyl9fXNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh0KXtyZXR1cm4gdGhpcy5SPXsuLi50aGlzLlIsLi4udH0sdGhpc31zZXRQcm9wYWdhdGlvbkNvbnRleHQodCl7cmV0dXJuIHRoaXMuQT10LHRoaXN9Z2V0UHJvcGFnYXRpb25Db250ZXh0KCl7cmV0dXJuIHRoaXMuQX1jYXB0dXJlRXhjZXB0aW9uKHQsZSl7Y29uc3Qgbj1lJiZlLmV2ZW50X2lkP2UuZXZlbnRfaWQ6RygpO2lmKCF0aGlzLkIpcmV0dXJuIE4ud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIGV4Y2VwdGlvbiEiKSxuO2NvbnN0IHI9bmV3IEVycm9yKCJTZW50cnkgc3ludGhldGljRXhjZXB0aW9uIik7cmV0dXJuIHRoaXMuQi5jYXB0dXJlRXhjZXB0aW9uKHQse29yaWdpbmFsRXhjZXB0aW9uOnQsc3ludGhldGljRXhjZXB0aW9uOnIsLi4uZSxldmVudF9pZDpufSx0aGlzKSxufWNhcHR1cmVNZXNzYWdlKHQsZSxuKXtjb25zdCByPW4mJm4uZXZlbnRfaWQ/bi5ldmVudF9pZDpHKCk7aWYoIXRoaXMuQilyZXR1cm4gTi53YXJuKCJObyBjbGllbnQgY29uZmlndXJlZCBvbiBzY29wZSAtIHdpbGwgbm90IGNhcHR1cmUgbWVzc2FnZSEiKSxyO2NvbnN0IG89bmV3IEVycm9yKHQpO3JldHVybiB0aGlzLkIuY2FwdHVyZU1lc3NhZ2UodCxlLHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpvLC4uLm4sZXZlbnRfaWQ6cn0sdGhpcykscn1jYXB0dXJlRXZlbnQodCxlKXtjb25zdCBuPWUmJmUuZXZlbnRfaWQ/ZS5ldmVudF9pZDpHKCk7cmV0dXJuIHRoaXMuQj8odGhpcy5CLmNhcHR1cmVFdmVudCh0LHsuLi5lLGV2ZW50X2lkOm59LHRoaXMpLG4pOihOLndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBldmVudCEiKSxuKX1KKCl7dGhpcy5ffHwodGhpcy5fPSEwLHRoaXMuUy5mb3JFYWNoKCh0PT57dCh0aGlzKX0pKSx0aGlzLl89ITEpfX1jb25zdCBndD1tdDtmdW5jdGlvbiB5dCgpe3JldHVybnt0cmFjZUlkOkcoKSxzcGFuSWQ6RygpLnN1YnN0cmluZygxNil9fWZ1bmN0aW9uIGJ0KCl7cmV0dXJuIEV0KHV0KCkpLmdldEN1cnJlbnRTY29wZSgpLmdldENsaWVudCgpfWNsYXNzIHZ0e2NvbnN0cnVjdG9yKHQsZSl7bGV0IG4scjtuPXR8fG5ldyBndCxyPWV8fG5ldyBndCx0aGlzLkg9W3tzY29wZTpufV0sdGhpcy5XPXJ9d2l0aFNjb3BlKHQpe2NvbnN0IGU9dGhpcy5ZKCk7bGV0IG47dHJ5e249dChlKX1jYXRjaCh0KXt0aHJvdyB0aGlzLnEoKSx0fXJldHVybiBtKG4pP24udGhlbigodD0+KHRoaXMucSgpLHQpKSwodD0+e3Rocm93IHRoaXMucSgpLHR9KSk6KHRoaXMucSgpLG4pfWdldENsaWVudCgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuY2xpZW50fWdldFNjb3BlKCl7cmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5zY29wZX1nZXRJc29sYXRpb25TY29wZSgpe3JldHVybiB0aGlzLld9Z2V0U3RhY2soKXtyZXR1cm4gdGhpcy5IfWdldFN0YWNrVG9wKCl7cmV0dXJuIHRoaXMuSFt0aGlzLkgubGVuZ3RoLTFdfVkoKXtjb25zdCB0PXRoaXMuZ2V0U2NvcGUoKS5jbG9uZSgpO3JldHVybiB0aGlzLmdldFN0YWNrKCkucHVzaCh7Y2xpZW50OnRoaXMuZ2V0Q2xpZW50KCksc2NvcGU6dH0pLHR9cSgpe3JldHVybiEodGhpcy5nZXRTdGFjaygpLmxlbmd0aDw9MSkmJiEhdGhpcy5nZXRTdGFjaygpLnBvcCgpfX1mdW5jdGlvbiBfdCgpe2NvbnN0IHQ9YXQodXQoKSk7cmV0dXJuIHQuaHVifHwodC5odWI9bmV3IHZ0KGIoImRlZmF1bHRDdXJyZW50U2NvcGUiLCgoKT0+bmV3IGd0KSksYigiZGVmYXVsdElzb2xhdGlvblNjb3BlIiwoKCk9Pm5ldyBndCkpKSksdC5odWJ9ZnVuY3Rpb24gd3QodCl7cmV0dXJuIF90KCkud2l0aFNjb3BlKHQpfWZ1bmN0aW9uIFN0KHQsZSl7Y29uc3Qgbj1fdCgpO3JldHVybiBuLndpdGhTY29wZSgoKCk9PihuLmdldFN0YWNrVG9wKCkuc2NvcGU9dCxlKHQpKSkpfWZ1bmN0aW9uICR0KHQpe3JldHVybiBfdCgpLndpdGhTY29wZSgoKCk9PnQoX3QoKS5nZXRJc29sYXRpb25TY29wZSgpKSkpfWZ1bmN0aW9uIEV0KHQpe2NvbnN0IGU9YXQodCk7cmV0dXJuIGUuYWNzP2UuYWNzOnt3aXRoSXNvbGF0aW9uU2NvcGU6JHQsd2l0aFNjb3BlOnd0LHdpdGhTZXRTY29wZTpTdCx3aXRoU2V0SXNvbGF0aW9uU2NvcGU6KHQsZSk9PiR0KGUpLGdldEN1cnJlbnRTY29wZTooKT0+X3QoKS5nZXRTY29wZSgpLGdldElzb2xhdGlvblNjb3BlOigpPT5fdCgpLmdldElzb2xhdGlvblNjb3BlKCl9fWNvbnN0IHh0PSJzZW50cnkuc291cmNlIixOdD0ic2VudHJ5LnNhbXBsZV9yYXRlIixrdD0ic2VudHJ5Lm9wIixDdD0ic2VudHJ5Lm9yaWdpbiIsRHQ9MCxUdD0xLE90PSJwcm9kdWN0aW9uIixqdD0iX2Zyb3plbkRzYyI7ZnVuY3Rpb24gUnQodCl7Y29uc3QgZT1idCgpO2lmKCFlKXJldHVybnt9O2NvbnN0IG49ZnVuY3Rpb24odCxlKXtjb25zdCBuPWUuZ2V0T3B0aW9ucygpLHtwdWJsaWNLZXk6cn09ZS5nZXREc24oKXx8e30sbz1qKHtlbnZpcm9ubWVudDpuLmVudmlyb25tZW50fHxPdCxyZWxlYXNlOm4ucmVsZWFzZSxwdWJsaWNfa2V5OnIsdHJhY2VfaWQ6dH0pO3JldHVybiBlLmVtaXQoImNyZWF0ZURzYyIsbyksb30oTXQodCkudHJhY2VfaWR8fCIiLGUpLHI9R3QodCk7aWYoIXIpcmV0dXJuIG47Y29uc3Qgbz1yW2p0XTtpZihvKXJldHVybiBvO2NvbnN0IHM9TXQociksaT1zLmRhdGF8fHt9LGM9aVtOdF07bnVsbCE9YyYmKG4uc2FtcGxlX3JhdGU9YCR7Y31gKTtjb25zdCB1PWlbeHRdO3JldHVybiB1JiYidXJsIiE9PXUmJihuLnRyYW5zYWN0aW9uPXMuZGVzY3JpcHRpb24pLG4uc2FtcGxlZD1TdHJpbmcoZnVuY3Rpb24odCl7Y29uc3R7dHJhY2VGbGFnczplfT10LnNwYW5Db250ZXh0KCk7cmV0dXJuIGU9PT1BdH0ocikpLGUuZW1pdCgiY3JlYXRlRHNjIixuKSxufWNvbnN0IEF0PTE7ZnVuY3Rpb24gSXQodCl7Y29uc3R7c3BhbklkOmUsdHJhY2VJZDpufT10LnNwYW5Db250ZXh0KCkse3BhcmVudF9zcGFuX2lkOnJ9PU10KHQpO3JldHVybiBqKHtwYXJlbnRfc3Bhbl9pZDpyLHNwYW5faWQ6ZSx0cmFjZV9pZDpufSl9ZnVuY3Rpb24gUHQodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P1V0KHQpOkFycmF5LmlzQXJyYXkodCk/dFswXSt0WzFdLzFlOTp0IGluc3RhbmNlb2YgRGF0ZT9VdCh0LmdldFRpbWUoKSk6QigpfWZ1bmN0aW9uIFV0KHQpe3JldHVybiB0Pjk5OTk5OTk5OTk/dC8xZTM6dH1mdW5jdGlvbiBNdCh0KXtpZihmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5nZXRTcGFuSlNPTn0odCkpcmV0dXJuIHQuZ2V0U3BhbkpTT04oKTt0cnl7Y29uc3R7c3BhbklkOmUsdHJhY2VJZDpufT10LnNwYW5Db250ZXh0KCk7aWYoZnVuY3Rpb24odCl7Y29uc3QgZT10O3JldHVybiEhKGUuYXR0cmlidXRlcyYmZS5zdGFydFRpbWUmJmUubmFtZSYmZS5lbmRUaW1lJiZlLnN0YXR1cyl9KHQpKXtjb25zdHthdHRyaWJ1dGVzOnIsc3RhcnRUaW1lOm8sbmFtZTpzLGVuZFRpbWU6aSxwYXJlbnRTcGFuSWQ6YyxzdGF0dXM6dX09dDtyZXR1cm4gaih7c3Bhbl9pZDplLHRyYWNlX2lkOm4sZGF0YTpyLGRlc2NyaXB0aW9uOnMscGFyZW50X3NwYW5faWQ6YyxzdGFydF90aW1lc3RhbXA6UHQobyksdGltZXN0YW1wOlB0KGkpfHx2b2lkIDAsc3RhdHVzOkx0KHUpLG9wOnJba3RdLG9yaWdpbjpyW0N0XSxGOnZvaWQgMH0pfXJldHVybntzcGFuX2lkOmUsdHJhY2VfaWQ6bn19Y2F0Y2godCl7cmV0dXJue319fWZ1bmN0aW9uIEx0KHQpe2lmKHQmJnQuY29kZSE9PUR0KXJldHVybiB0LmNvZGU9PT1UdD8ib2siOnQubWVzc2FnZXx8InVua25vd25fZXJyb3IifWNvbnN0IEJ0PSJfc2VudHJ5Um9vdFNwYW4iO2Z1bmN0aW9uIEd0KHQpe3JldHVybiB0W0J0XXx8dH1mdW5jdGlvbiBKdCh0LGUsbixyKXtjb25zdCBvPW90KG4pLHM9dC50eXBlJiYicmVwbGF5X2V2ZW50IiE9PXQudHlwZT90LnR5cGU6ImV2ZW50IjshZnVuY3Rpb24odCxlKXtlJiYodC5zZGs9dC5zZGt8fHt9LHQuc2RrLm5hbWU9dC5zZGsubmFtZXx8ZS5uYW1lLHQuc2RrLnZlcnNpb249dC5zZGsudmVyc2lvbnx8ZS52ZXJzaW9uLHQuc2RrLmludGVncmF0aW9ucz1bLi4udC5zZGsuaW50ZWdyYXRpb25zfHxbXSwuLi5lLmludGVncmF0aW9uc3x8W11dLHQuc2RrLnBhY2thZ2VzPVsuLi50LnNkay5wYWNrYWdlc3x8W10sLi4uZS5wYWNrYWdlc3x8W11dKX0odCxuJiZuLnNkayk7Y29uc3QgaT1mdW5jdGlvbih0LGUsbixyKXtjb25zdCBvPXQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhJiZ0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YS5keW5hbWljU2FtcGxpbmdDb250ZXh0O3JldHVybntldmVudF9pZDp0LmV2ZW50X2lkLHNlbnRfYXQ6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLC4uLmUmJntzZGs6ZX0sLi4uISFuJiZyJiZ7ZHNuOmsocil9LC4uLm8mJnt0cmFjZTpqKHsuLi5vfSl9fX0odCxvLHIsZSk7ZGVsZXRlIHQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhO3JldHVybiBRKGksW1t7dHlwZTpzfSx0XV0pfWNvbnN0IHp0PSJfX1NFTlRSWV9TVVBQUkVTU19UUkFDSU5HX18iO2Z1bmN0aW9uIEh0KHQpe2NvbnN0IGU9RXQodXQoKSk7cmV0dXJuIGUuc3VwcHJlc3NUcmFjaW5nP2Uuc3VwcHJlc3NUcmFjaW5nKHQpOmZ1bmN0aW9uKC4uLnQpe2NvbnN0IGU9RXQodXQoKSk7aWYoMj09PXQubGVuZ3RoKXtjb25zdFtuLHJdPXQ7cmV0dXJuIG4/ZS53aXRoU2V0U2NvcGUobixyKTplLndpdGhTY29wZShyKX1yZXR1cm4gZS53aXRoU2NvcGUodFswXSl9KChlPT4oZS5zZXRTREtQcm9jZXNzaW5nTWV0YWRhdGEoe1t6dF06ITB9KSx0KCkpKSl9ZnVuY3Rpb24gV3QodCxlKXtjb25zdHtmaW5nZXJwcmludDpuLHNwYW46cixicmVhZGNydW1iczpvLHNka1Byb2Nlc3NpbmdNZXRhZGF0YTpzfT1lOyFmdW5jdGlvbih0LGUpe2NvbnN0e2V4dHJhOm4sdGFnczpyLHVzZXI6byxjb250ZXh0czpzLGxldmVsOmksdHJhbnNhY3Rpb25OYW1lOmN9PWUsdT1qKG4pO3UmJk9iamVjdC5rZXlzKHUpLmxlbmd0aCYmKHQuZXh0cmE9ey4uLnUsLi4udC5leHRyYX0pO2NvbnN0IGE9aihyKTthJiZPYmplY3Qua2V5cyhhKS5sZW5ndGgmJih0LnRhZ3M9ey4uLmEsLi4udC50YWdzfSk7Y29uc3QgZj1qKG8pO2YmJk9iamVjdC5rZXlzKGYpLmxlbmd0aCYmKHQudXNlcj17Li4uZiwuLi50LnVzZXJ9KTtjb25zdCBoPWoocyk7aCYmT2JqZWN0LmtleXMoaCkubGVuZ3RoJiYodC5jb250ZXh0cz17Li4uaCwuLi50LmNvbnRleHRzfSk7aSYmKHQubGV2ZWw9aSk7YyYmInRyYW5zYWN0aW9uIiE9PXQudHlwZSYmKHQudHJhbnNhY3Rpb249Yyl9KHQsZSksciYmZnVuY3Rpb24odCxlKXt0LmNvbnRleHRzPXt0cmFjZTpJdChlKSwuLi50LmNvbnRleHRzfSx0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YT17ZHluYW1pY1NhbXBsaW5nQ29udGV4dDpSdChlKSwuLi50LnNka1Byb2Nlc3NpbmdNZXRhZGF0YX07Y29uc3Qgbj1HdChlKSxyPU10KG4pLmRlc2NyaXB0aW9uO3ImJiF0LnRyYW5zYWN0aW9uJiYidHJhbnNhY3Rpb24iPT09dC50eXBlJiYodC50cmFuc2FjdGlvbj1yKX0odCxyKSxmdW5jdGlvbih0LGUpe3QuZmluZ2VycHJpbnQ9dC5maW5nZXJwcmludD9mdW5jdGlvbih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90Olt0XX0odC5maW5nZXJwcmludCk6W10sZSYmKHQuZmluZ2VycHJpbnQ9dC5maW5nZXJwcmludC5jb25jYXQoZSkpO3QuZmluZ2VycHJpbnQmJiF0LmZpbmdlcnByaW50Lmxlbmd0aCYmZGVsZXRlIHQuZmluZ2VycHJpbnR9KHQsbiksZnVuY3Rpb24odCxlKXtjb25zdCBuPVsuLi50LmJyZWFkY3J1bWJzfHxbXSwuLi5lXTt0LmJyZWFkY3J1bWJzPW4ubGVuZ3RoP246dm9pZCAwfSh0LG8pLGZ1bmN0aW9uKHQsZSl7dC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE9ey4uLnQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhLC4uLmV9fSh0LHMpfWNvbnN0IFl0PSI3IjtmdW5jdGlvbiBxdCh0LGUpe3JldHVybiBuPXtzZW50cnlfa2V5OnQucHVibGljS2V5LHNlbnRyeV92ZXJzaW9uOll0LC4uLmUmJntzZW50cnlfY2xpZW50OmAke2UubmFtZX0vJHtlLnZlcnNpb259YH19LE9iamVjdC5rZXlzKG4pLm1hcCgodD0+YCR7ZW5jb2RlVVJJQ29tcG9uZW50KHQpfT0ke2VuY29kZVVSSUNvbXBvbmVudChuW3RdKX1gKSkuam9pbigiJiIpO3ZhciBufWNvbnN0IEZ0PTY0O2Z1bmN0aW9uIEt0KHQsZSxuPVYodC5idWZmZXJTaXplfHxGdCkpe2xldCByPXt9O3JldHVybntzZW5kOmZ1bmN0aW9uKG8pe2NvbnN0IHM9W107aWYoWChvLCgoZSxuKT0+e2NvbnN0IG89cnQobik7aWYoZnVuY3Rpb24odCxlLG49RGF0ZS5ub3coKSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbZV18fHQuYWxsfHwwfSh0LGUpPm59KHIsbykpe2NvbnN0IHI9VnQoZSxuKTt0LnJlY29yZERyb3BwZWRFdmVudCgicmF0ZWxpbWl0X2JhY2tvZmYiLG8scil9ZWxzZSBzLnB1c2goZSl9KSksMD09PXMubGVuZ3RoKXJldHVybiBGKHt9KTtjb25zdCBpPVEob1swXSxzKSxjPWU9PntYKGksKChuLHIpPT57Y29uc3Qgbz1WdChuLHIpO3QucmVjb3JkRHJvcHBlZEV2ZW50KGUscnQociksbyl9KSl9O3JldHVybiBuLmFkZCgoKCk9PmUoe2JvZHk6ZXQoaSl9KS50aGVuKCh0PT4odm9pZCAwIT09dC5zdGF0dXNDb2RlJiYodC5zdGF0dXNDb2RlPDIwMHx8dC5zdGF0dXNDb2RlPj0zMDApJiZjdCYmTi53YXJuKGBTZW50cnkgcmVzcG9uZGVkIHdpdGggc3RhdHVzIGNvZGUgJHt0LnN0YXR1c0NvZGV9IHRvIHNlbnQgZXZlbnQuYCkscj1pdChyLHQpLHQpKSwodD0+e3Rocm93IGMoIm5ldHdvcmtfZXJyb3IiKSx0fSkpKSkudGhlbigodD0+dCksKHQ9PntpZih0IGluc3RhbmNlb2YgQylyZXR1cm4gY3QmJk4uZXJyb3IoIlNraXBwZWQgc2VuZGluZyBldmVudCBiZWNhdXNlIGJ1ZmZlciBpcyBmdWxsLiIpLGMoInF1ZXVlX292ZXJmbG93IiksRih7fSk7dGhyb3cgdH0pKX0sZmx1c2g6dD0+bi5kcmFpbih0KX19ZnVuY3Rpb24gVnQodCxlKXtpZigiZXZlbnQiPT09ZXx8InRyYW5zYWN0aW9uIj09PWUpcmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dFsxXTp2b2lkIDB9Y29uc3QgWnQ9U3ltYm9sKCJBZ2VudEJhc2VJbnRlcm5hbFN0YXRlIik7Y2xhc3MgUXQgZXh0ZW5kcyBoLkFnZW50e1tadF07b3B0aW9ucztrZWVwQWxpdmU7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpc1tadF09e319aXNTZWN1cmVFbmRwb2ludCh0KXtpZih0KXtpZigiYm9vbGVhbiI9PXR5cGVvZiB0LnNlY3VyZUVuZHBvaW50KXJldHVybiB0LnNlY3VyZUVuZHBvaW50O2lmKCJzdHJpbmciPT10eXBlb2YgdC5wcm90b2NvbClyZXR1cm4iaHR0cHM6Ij09PXQucHJvdG9jb2x9Y29uc3R7c3RhY2s6ZX09bmV3IEVycm9yO3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmZS5zcGxpdCgiXG4iKS5zb21lKCh0PT4tMSE9PXQuaW5kZXhPZigiKGh0dHBzLmpzOiIpfHwtMSE9PXQuaW5kZXhPZigibm9kZTpodHRwczoiKSkpfWNyZWF0ZVNvY2tldCh0LGUsbil7Y29uc3Qgcj17Li4uZSxzZWN1cmVFbmRwb2ludDp0aGlzLmlzU2VjdXJlRW5kcG9pbnQoZSl9O1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT50aGlzLmNvbm5lY3QodCxyKSkpLnRoZW4oKG89PntpZihvIGluc3RhbmNlb2YgaC5BZ2VudClyZXR1cm4gby5hZGRSZXF1ZXN0KHQscik7dGhpc1tadF0uY3VycmVudFNvY2tldD1vLHN1cGVyLmNyZWF0ZVNvY2tldCh0LGUsbil9KSxuKX1jcmVhdGVDb25uZWN0aW9uKCl7Y29uc3QgdD10aGlzW1p0XS5jdXJyZW50U29ja2V0O2lmKHRoaXNbWnRdLmN1cnJlbnRTb2NrZXQ9dm9pZCAwLCF0KXRocm93IG5ldyBFcnJvcigiTm8gc29ja2V0IHdhcyByZXR1cm5lZCBpbiB0aGUgYGNvbm5lY3QoKWAgZnVuY3Rpb24iKTtyZXR1cm4gdH1nZXQgZGVmYXVsdFBvcnQoKXtyZXR1cm4gdGhpc1tadF0uZGVmYXVsdFBvcnQ/PygiaHR0cHM6Ij09PXRoaXMucHJvdG9jb2w/NDQzOjgwKX1zZXQgZGVmYXVsdFBvcnQodCl7dGhpc1tadF0mJih0aGlzW1p0XS5kZWZhdWx0UG9ydD10KX1nZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpc1tadF0ucHJvdG9jb2w/Pyh0aGlzLmlzU2VjdXJlRW5kcG9pbnQoKT8iaHR0cHM6IjoiaHR0cDoiKX1zZXQgcHJvdG9jb2wodCl7dGhpc1tadF0mJih0aGlzW1p0XS5wcm90b2NvbD10KX19ZnVuY3Rpb24gWHQoLi4udCl7Ti5sb2coIltodHRwcy1wcm94eS1hZ2VudDpwYXJzZS1wcm94eS1yZXNwb25zZV0iLC4uLnQpfWZ1bmN0aW9uIHRlKHQpe3JldHVybiBuZXcgUHJvbWlzZSgoKGUsbik9PntsZXQgcj0wO2NvbnN0IG89W107ZnVuY3Rpb24gcygpe2NvbnN0IGM9dC5yZWFkKCk7Yz9mdW5jdGlvbihjKXtvLnB1c2goYykscis9Yy5sZW5ndGg7Y29uc3QgdT1CdWZmZXIuY29uY2F0KG8sciksYT11LmluZGV4T2YoIlxyXG5cclxuIik7aWYoLTE9PT1hKXJldHVybiBYdCgiaGF2ZSBub3QgcmVjZWl2ZWQgZW5kIG9mIEhUVFAgaGVhZGVycyB5ZXQuLi4iKSx2b2lkIHMoKTtjb25zdCBmPXUuc2xpY2UoMCxhKS50b1N0cmluZygiYXNjaWkiKS5zcGxpdCgiXHJcbiIpLGg9Zi5zaGlmdCgpO2lmKCFoKXJldHVybiB0LmRlc3Ryb3koKSxuKG5ldyBFcnJvcigiTm8gaGVhZGVyIHJlY2VpdmVkIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZSIpKTtjb25zdCBwPWguc3BsaXQoIiAiKSxsPStwWzFdLGQ9cC5zbGljZSgyKS5qb2luKCIgIiksbT17fTtmb3IoY29uc3QgZSBvZiBmKXtpZighZSljb250aW51ZTtjb25zdCByPWUuaW5kZXhPZigiOiIpO2lmKC0xPT09cilyZXR1cm4gdC5kZXN0cm95KCksbihuZXcgRXJyb3IoYEludmFsaWQgaGVhZGVyIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZTogIiR7ZX0iYCkpO2NvbnN0IG89ZS5zbGljZSgwLHIpLnRvTG93ZXJDYXNlKCkscz1lLnNsaWNlKHIrMSkudHJpbVN0YXJ0KCksaT1tW29dOyJzdHJpbmciPT10eXBlb2YgaT9tW29dPVtpLHNdOkFycmF5LmlzQXJyYXkoaSk/aS5wdXNoKHMpOm1bb109c31YdCgiZ290IHByb3h5IHNlcnZlciByZXNwb25zZTogJW8gJW8iLGgsbSksaSgpLGUoe2Nvbm5lY3Q6e3N0YXR1c0NvZGU6bCxzdGF0dXNUZXh0OmQsaGVhZGVyczptfSxidWZmZXJlZDp1fSl9KGMpOnQub25jZSgicmVhZGFibGUiLHMpfWZ1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLGMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIix1KSx0LnJlbW92ZUxpc3RlbmVyKCJyZWFkYWJsZSIscyl9ZnVuY3Rpb24gYygpe2koKSxYdCgib25lbmQiKSxuKG5ldyBFcnJvcigiUHJveHkgY29ubmVjdGlvbiBlbmRlZCBiZWZvcmUgcmVjZWl2aW5nIENPTk5FQ1QgcmVzcG9uc2UiKSl9ZnVuY3Rpb24gdSh0KXtpKCksWHQoIm9uZXJyb3IgJW8iLHQpLG4odCl9dC5vbigiZXJyb3IiLHUpLHQub24oImVuZCIsYykscygpfSkpfWZ1bmN0aW9uIGVlKC4uLnQpe04ubG9nKCJbaHR0cHMtcHJveHktYWdlbnRdIiwuLi50KX1jbGFzcyBuZSBleHRlbmRzIFF0e3N0YXRpYyBwcm90b2NvbHM9WyJodHRwIiwiaHR0cHMiXTtwcm94eTtwcm94eUhlYWRlcnM7Y29ubmVjdE9wdHM7Y29uc3RydWN0b3IodCxlKXtzdXBlcihlKSx0aGlzLm9wdGlvbnM9e30sdGhpcy5wcm94eT0ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFVSTCh0KTp0LHRoaXMucHJveHlIZWFkZXJzPWU/LmhlYWRlcnM/P3t9LGVlKCJDcmVhdGluZyBuZXcgSHR0cHNQcm94eUFnZW50IGluc3RhbmNlOiAlbyIsdGhpcy5wcm94eS5ocmVmKTtjb25zdCBuPSh0aGlzLnByb3h5Lmhvc3RuYW1lfHx0aGlzLnByb3h5Lmhvc3QpLnJlcGxhY2UoL15cW3xcXSQvZywiIikscj10aGlzLnByb3h5LnBvcnQ/cGFyc2VJbnQodGhpcy5wcm94eS5wb3J0LDEwKToiaHR0cHM6Ij09PXRoaXMucHJveHkucHJvdG9jb2w/NDQzOjgwO3RoaXMuY29ubmVjdE9wdHM9e0FMUE5Qcm90b2NvbHM6WyJodHRwLzEuMSJdLC4uLmU/b2UoZSwiaGVhZGVycyIpOm51bGwsaG9zdDpuLHBvcnQ6cn19YXN5bmMgY29ubmVjdCh0LGUpe2NvbnN0e3Byb3h5Om59PXRoaXM7aWYoIWUuaG9zdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyAiaG9zdCIgcHJvdmlkZWQnKTtsZXQgcjtpZigiaHR0cHM6Ij09PW4ucHJvdG9jb2wpe2VlKCJDcmVhdGluZyBgdGxzLlNvY2tldGA6ICVvIix0aGlzLmNvbm5lY3RPcHRzKTtjb25zdCB0PXRoaXMuY29ubmVjdE9wdHMuc2VydmVybmFtZXx8dGhpcy5jb25uZWN0T3B0cy5ob3N0O3I9Zi5jb25uZWN0KHsuLi50aGlzLmNvbm5lY3RPcHRzLHNlcnZlcm5hbWU6dCYmYS5pc0lQKHQpP3ZvaWQgMDp0fSl9ZWxzZSBlZSgiQ3JlYXRpbmcgYG5ldC5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cykscj1hLmNvbm5lY3QodGhpcy5jb25uZWN0T3B0cyk7Y29uc3Qgbz0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wcm94eUhlYWRlcnM/dGhpcy5wcm94eUhlYWRlcnMoKTp7Li4udGhpcy5wcm94eUhlYWRlcnN9LHM9YS5pc0lQdjYoZS5ob3N0KT9gWyR7ZS5ob3N0fV1gOmUuaG9zdDtsZXQgaT1gQ09OTkVDVCAke3N9OiR7ZS5wb3J0fSBIVFRQLzEuMVxyXG5gO2lmKG4udXNlcm5hbWV8fG4ucGFzc3dvcmQpe2NvbnN0IHQ9YCR7ZGVjb2RlVVJJQ29tcG9uZW50KG4udXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChuLnBhc3N3b3JkKX1gO29bIlByb3h5LUF1dGhvcml6YXRpb24iXT1gQmFzaWMgJHtCdWZmZXIuZnJvbSh0KS50b1N0cmluZygiYmFzZTY0Iil9YH1vLkhvc3Q9YCR7c306JHtlLnBvcnR9YCxvWyJQcm94eS1Db25uZWN0aW9uIl18fChvWyJQcm94eS1Db25uZWN0aW9uIl09dGhpcy5rZWVwQWxpdmU/IktlZXAtQWxpdmUiOiJjbG9zZSIpO2Zvcihjb25zdCB0IG9mIE9iamVjdC5rZXlzKG8pKWkrPWAke3R9OiAke29bdF19XHJcbmA7Y29uc3QgYz10ZShyKTtyLndyaXRlKGAke2l9XHJcbmApO2NvbnN0e2Nvbm5lY3Q6dSxidWZmZXJlZDpofT1hd2FpdCBjO2lmKHQuZW1pdCgicHJveHlDb25uZWN0Iix1KSx0aGlzLmVtaXQoInByb3h5Q29ubmVjdCIsdSx0KSwyMDA9PT11LnN0YXR1c0NvZGUpe2lmKHQub25jZSgic29ja2V0IixyZSksZS5zZWN1cmVFbmRwb2ludCl7ZWUoIlVwZ3JhZGluZyBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMiKTtjb25zdCB0PWUuc2VydmVybmFtZXx8ZS5ob3N0O3JldHVybiBmLmNvbm5lY3Qoey4uLm9lKGUsImhvc3QiLCJwYXRoIiwicG9ydCIpLHNvY2tldDpyLHNlcnZlcm5hbWU6YS5pc0lQKHQpP3ZvaWQgMDp0fSl9cmV0dXJuIHJ9ci5kZXN0cm95KCk7Y29uc3QgcD1uZXcgYS5Tb2NrZXQoe3dyaXRhYmxlOiExfSk7cmV0dXJuIHAucmVhZGFibGU9ITAsdC5vbmNlKCJzb2NrZXQiLCh0PT57ZWUoIlJlcGxheWluZyBwcm94eSBidWZmZXIgZm9yIGZhaWxlZCByZXF1ZXN0IiksdC5wdXNoKGgpLHQucHVzaChudWxsKX0pKSxwfX1mdW5jdGlvbiByZSh0KXt0LnJlc3VtZSgpfWZ1bmN0aW9uIG9lKHQsLi4uZSl7Y29uc3Qgbj17fTtsZXQgcjtmb3IociBpbiB0KWUuaW5jbHVkZXMocil8fChuW3JdPXRbcl0pO3JldHVybiBufWNvbnN0IHNlPTMyNzY4O2Z1bmN0aW9uIGllKHQpe3JldHVybiB0LnJlcGxhY2UoL15bQS1aXTovLCIiKS5yZXBsYWNlKC9cXC9nLCIvIil9Y29uc3QgY2U9bjtsZXQgdWUsYWU9ITE7ZnVuY3Rpb24gZmUodCl7Y2UuZGVidWcmJmNvbnNvbGUubG9nKGBbQU5SIFdvcmtlcl0gJHt0fWApfXZhciBoZSxwZSxsZTtjb25zdCBkZT1mdW5jdGlvbih0KXtsZXQgZTt0cnl7ZT1uZXcgVVJMKHQudXJsKX1jYXRjaChlKXtyZXR1cm4geCgoKCk9Pntjb25zb2xlLndhcm4oIltAc2VudHJ5L25vZGVdOiBJbnZhbGlkIGRzbiBvciB0dW5uZWwgb3B0aW9uLCB3aWxsIG5vdCBzZW5kIGFueSBldmVudHMuIFRoZSB0dW5uZWwgb3B0aW9uIG11c3QgYmUgYSBmdWxsIFVSTCB3aGVuIHVzZWQuIil9KSksS3QodCwoKCk9PlByb21pc2UucmVzb2x2ZSh7fSkpKX1jb25zdCBuPSJodHRwczoiPT09ZS5wcm90b2NvbCxyPWZ1bmN0aW9uKHQsZSl7Y29uc3R7bm9fcHJveHk6bn09cHJvY2Vzcy5lbnY7cmV0dXJuIG4mJm4uc3BsaXQoIiwiKS5zb21lKChlPT50Lmhvc3QuZW5kc1dpdGgoZSl8fHQuaG9zdG5hbWUuZW5kc1dpdGgoZSkpKT92b2lkIDA6ZX0oZSx0LnByb3h5fHwobj9wcm9jZXNzLmVudi5odHRwc19wcm94eTp2b2lkIDApfHxwcm9jZXNzLmVudi5odHRwX3Byb3h5KSxvPW4/aTpzLGE9dm9pZCAwIT09dC5rZWVwQWxpdmUmJnQua2VlcEFsaXZlLGY9cj9uZXcgbmUocik6bmV3IG8uQWdlbnQoe2tlZXBBbGl2ZTphLG1heFNvY2tldHM6MzAsdGltZW91dDoyZTN9KTtyZXR1cm4gSHQoKCgpPT57Y29uc3QgZT1mdW5jdGlvbih0LGUsbil7Y29uc3R7aG9zdG5hbWU6cixwYXRobmFtZTpvLHBvcnQ6cyxwcm90b2NvbDppLHNlYXJjaDphfT1uZXcgVVJMKHQudXJsKTtyZXR1cm4gZnVuY3Rpb24oZil7cmV0dXJuIG5ldyBQcm9taXNlKCgoaCxwKT0+e2xldCBsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYyh7cmVhZCgpe3RoaXMucHVzaCh0KSx0aGlzLnB1c2gobnVsbCl9fSl9KGYuYm9keSk7Y29uc3QgZD17Li4udC5oZWFkZXJzfTtmLmJvZHkubGVuZ3RoPnNlJiYoZFsiY29udGVudC1lbmNvZGluZyJdPSJnemlwIixsPWwucGlwZSh1KCkpKTtjb25zdCBtPWUucmVxdWVzdCh7bWV0aG9kOiJQT1NUIixhZ2VudDpuLGhlYWRlcnM6ZCxob3N0bmFtZTpyLHBhdGg6YCR7b30ke2F9YCxwb3J0OnMscHJvdG9jb2w6aSxjYTp0LmNhQ2VydHN9LCh0PT57dC5vbigiZGF0YSIsKCgpPT57fSkpLHQub24oImVuZCIsKCgpPT57fSkpLHQuc2V0RW5jb2RpbmcoInV0ZjgiKTtjb25zdCBlPXQuaGVhZGVyc1sicmV0cnktYWZ0ZXIiXT8/bnVsbCxuPXQuaGVhZGVyc1sieC1zZW50cnktcmF0ZS1saW1pdHMiXT8/bnVsbDtoKHtzdGF0dXNDb2RlOnQuc3RhdHVzQ29kZSxoZWFkZXJzOnsicmV0cnktYWZ0ZXIiOmUsIngtc2VudHJ5LXJhdGUtbGltaXRzIjpBcnJheS5pc0FycmF5KG4pP25bMF06bn19KX0pKTttLm9uKCJlcnJvciIscCksbC5waXBlKG0pfSkpfX0odCx0Lmh0dHBNb2R1bGU/P28sZik7cmV0dXJuIEt0KHQsZSl9KSl9KHt1cmw6KGhlPWNlLmRzbixwZT1jZS50dW5uZWwsbGU9Y2Uuc2RrTWV0YWRhdGEuc2RrLHBlfHxgJHtmdW5jdGlvbih0KXtyZXR1cm5gJHtmdW5jdGlvbih0KXtjb25zdCBlPXQucHJvdG9jb2w/YCR7dC5wcm90b2NvbH06YDoiIixuPXQucG9ydD9gOiR7dC5wb3J0fWA6IiI7cmV0dXJuYCR7ZX0vLyR7dC5ob3N0fSR7bn0ke3QucGF0aD9gLyR7dC5wYXRofWA6IiJ9L2FwaS9gfSh0KX0ke3QucHJvamVjdElkfS9lbnZlbG9wZS9gfShoZSl9PyR7cXQoaGUsbGUpfWApLHJlY29yZERyb3BwZWRFdmVudDooKT0+e319KTthc3luYyBmdW5jdGlvbiBtZSgpe2lmKHVlKXtmZSgiU2VuZGluZyBhYm5vcm1hbCBzZXNzaW9uIiksaHQodWUse3N0YXR1czoiYWJub3JtYWwiLGFibm9ybWFsX21lY2hhbmlzbToiYW5yX2ZvcmVncm91bmQifSk7Y29uc3QgdD1mdW5jdGlvbih0LGUsbixyKXtjb25zdCBvPW90KG4pO3JldHVybiBRKHtzZW50X2F0OihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKSwuLi5vJiZ7c2RrOm99LC4uLiEhciYmZSYme2RzbjprKGUpfX0sWyJhZ2dyZWdhdGVzImluIHQ/W3t0eXBlOiJzZXNzaW9ucyJ9LHRdOlt7dHlwZToic2Vzc2lvbiJ9LHQudG9KU09OKCldXSl9KHVlLGNlLmRzbixjZS5zZGtNZXRhZGF0YSxjZS50dW5uZWwpO2ZlKEpTT04uc3RyaW5naWZ5KHQpKSxhd2FpdCBkZS5zZW5kKHQpO3RyeXtlPy5wb3N0TWVzc2FnZSgic2Vzc2lvbi1lbmRlZCIpfWNhdGNoKHQpe319fWZ1bmN0aW9uIGdlKHQpe2lmKCF0KXJldHVybjtjb25zdCBlPWZ1bmN0aW9uKHQpe2lmKCF0Lmxlbmd0aClyZXR1cm5bXTtjb25zdCBlPUFycmF5LmZyb20odCk7cmV0dXJuL3NlbnRyeVdyYXBwZWQvLnRlc3QoZVtlLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiZlLnBvcCgpLGUucmV2ZXJzZSgpLFAudGVzdChlW2UubGVuZ3RoLTFdLmZ1bmN0aW9ufHwiIikmJihlLnBvcCgpLFAudGVzdChlW2UubGVuZ3RoLTFdLmZ1bmN0aW9ufHwiIikmJmUucG9wKCkpLGUuc2xpY2UoMCxBKS5tYXAoKHQ9Pih7Li4udCxmaWxlbmFtZTp0LmZpbGVuYW1lfHxlW2UubGVuZ3RoLTFdLmZpbGVuYW1lLGZ1bmN0aW9uOnQuZnVuY3Rpb258fEl9KSkpfSh0KTtpZihjZS5hcHBSb290UGF0aClmb3IoY29uc3QgdCBvZiBlKXQuZmlsZW5hbWUmJih0LmZpbGVuYW1lPUgodC5maWxlbmFtZSxjZS5hcHBSb290UGF0aCkpO3JldHVybiBlfWFzeW5jIGZ1bmN0aW9uIHllKHQsZSl7aWYoYWUpcmV0dXJuO2FlPSEwLGF3YWl0IG1lKCksZmUoIlNlbmRpbmcgZXZlbnQiKTtjb25zdCBuPXtldmVudF9pZDpHKCksY29udGV4dHM6Y2UuY29udGV4dHMscmVsZWFzZTpjZS5yZWxlYXNlLGVudmlyb25tZW50OmNlLmVudmlyb25tZW50LGRpc3Q6Y2UuZGlzdCxwbGF0Zm9ybToibm9kZSIsbGV2ZWw6ImVycm9yIixleGNlcHRpb246e3ZhbHVlczpbe3R5cGU6IkFwcGxpY2F0aW9uTm90UmVzcG9uZGluZyIsdmFsdWU6YEFwcGxpY2F0aW9uIE5vdCBSZXNwb25kaW5nIGZvciBhdCBsZWFzdCAke2NlLmFuclRocmVzaG9sZH0gbXNgLHN0YWNrdHJhY2U6e2ZyYW1lczpnZSh0KX0sbWVjaGFuaXNtOnt0eXBlOiJBTlIifX1dfSx0YWdzOmNlLnN0YXRpY1RhZ3N9O2UmJmZ1bmN0aW9uKHQsZSl7aWYoV3QodCxlKSwhdC5jb250ZXh0cz8udHJhY2Upe2NvbnN0e3RyYWNlSWQ6bixzcGFuSWQ6cixwYXJlbnRTcGFuSWQ6b309ZS5wcm9wYWdhdGlvbkNvbnRleHQ7dC5jb250ZXh0cz17dHJhY2U6e3RyYWNlX2lkOm4sc3Bhbl9pZDpyLHBhcmVudF9zcGFuX2lkOm99LC4uLnQuY29udGV4dHN9fX0obixlKTtjb25zdCByPUp0KG4sY2UuZHNuLGNlLnNka01ldGFkYXRhLGNlLnR1bm5lbCk7ZmUoSlNPTi5zdHJpbmdpZnkocikpLGF3YWl0IGRlLnNlbmQociksYXdhaXQgZGUuZmx1c2goMmUzKSxzZXRUaW1lb3V0KCgoKT0+e3Byb2Nlc3MuZXhpdCgwKX0pLDVlMyl9bGV0IGJlO2lmKGZlKCJTdGFydGVkIiksY2UuY2FwdHVyZVN0YWNrVHJhY2Upe2ZlKCJDb25uZWN0aW5nIHRvIGRlYnVnZ2VyIik7Y29uc3QgZT1uZXcgdDtlLmNvbm5lY3RUb01haW5UaHJlYWQoKSxmZSgiQ29ubmVjdGVkIHRvIGRlYnVnZ2VyIik7Y29uc3Qgbj1uZXcgTWFwO2Uub24oIkRlYnVnZ2VyLnNjcmlwdFBhcnNlZCIsKHQ9PntuLnNldCh0LnBhcmFtcy5zY3JpcHRJZCx0LnBhcmFtcy51cmwpfSkpLGUub24oIkRlYnVnZ2VyLnBhdXNlZCIsKHQ9PntpZigib3RoZXIiPT09dC5wYXJhbXMucmVhc29uKXRyeXtmZSgiRGVidWdnZXIgcGF1c2VkIik7Y29uc3Qgcz1bLi4udC5wYXJhbXMuY2FsbEZyYW1lc10saT1jZS5hcHBSb290UGF0aD9mdW5jdGlvbih0PShwcm9jZXNzLmFyZ3ZbMV0/WShwcm9jZXNzLmFyZ3ZbMV0pOnByb2Nlc3MuY3dkKCkpLGU9IlxcIj09PW8pe2NvbnN0IG49ZT9pZSh0KTp0O3JldHVybiB0PT57aWYoIXQpcmV0dXJuO2NvbnN0IG89ZT9pZSh0KTp0O2xldHtkaXI6cyxiYXNlOmksZXh0OmN9PXIucGFyc2Uobyk7Ii5qcyIhPT1jJiYiLm1qcyIhPT1jJiYiLmNqcyIhPT1jfHwoaT1pLnNsaWNlKDAsLTEqYy5sZW5ndGgpKSxzfHwocz0iLiIpO2NvbnN0IHU9cy5sYXN0SW5kZXhPZigiL25vZGVfbW9kdWxlcyIpO2lmKHU+LTEpcmV0dXJuYCR7cy5zbGljZSh1KzE0KS5yZXBsYWNlKC9cLy9nLCIuIil9OiR7aX1gO2lmKHMuc3RhcnRzV2l0aChuKSl7bGV0IHQ9cy5zbGljZShuLmxlbmd0aCsxKS5yZXBsYWNlKC9cLy9nLCIuIik7cmV0dXJuIHQmJih0Kz0iOiIpLHQrPWksdH1yZXR1cm4gaX19KGNlLmFwcFJvb3RQYXRoKTooKT0+e30sYz1zLm1hcCgodD0+ZnVuY3Rpb24odCxlLG4pe2NvbnN0IHI9ZT9lLnJlcGxhY2UoL15maWxlOlwvXC8vLCIiKTp2b2lkIDAsbz10LmxvY2F0aW9uLmNvbHVtbk51bWJlcj90LmxvY2F0aW9uLmNvbHVtbk51bWJlcisxOnZvaWQgMCxzPXQubG9jYXRpb24ubGluZU51bWJlcj90LmxvY2F0aW9uLmxpbmVOdW1iZXIrMTp2b2lkIDA7cmV0dXJuIGooe2ZpbGVuYW1lOnIsbW9kdWxlOm4ociksZnVuY3Rpb246dC5mdW5jdGlvbk5hbWV8fEksY29sbm86byxsaW5lbm86cyxpbl9hcHA6cj9aKHIpOnZvaWQgMH0pfSh0LG4uZ2V0KHQubG9jYXRpb24uc2NyaXB0SWQpLGkpKSksdT1zZXRUaW1lb3V0KCgoKT0+e3llKGMpLnRoZW4obnVsbCwoKCk9PntmZSgiU2VuZGluZyBBTlIgZXZlbnQgZmFpbGVkLiIpfSkpfSksNWUzKTtlLnBvc3QoIlJ1bnRpbWUuZXZhbHVhdGUiLHtleHByZXNzaW9uOiJnbG9iYWwuX19TRU5UUllfR0VUX1NDT1BFU19fKCk7IixzaWxlbnQ6ITAscmV0dXJuQnlWYWx1ZTohMH0sKCh0LG4pPT57dCYmZmUoYEVycm9yIGV4ZWN1dGluZyBzY3JpcHQ6ICcke3QubWVzc2FnZX0nYCksY2xlYXJUaW1lb3V0KHUpO2NvbnN0IHI9biYmbi5yZXN1bHQ/bi5yZXN1bHQudmFsdWU6dm9pZCAwO2UucG9zdCgiRGVidWdnZXIucmVzdW1lIiksZS5wb3N0KCJEZWJ1Z2dlci5kaXNhYmxlIikseWUoYyxyKS50aGVuKG51bGwsKCgpPT57ZmUoIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pKX0pKX1jYXRjaCh0KXt0aHJvdyBlLnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLGUucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLHR9fSkpLGJlPSgpPT57dHJ5e2UucG9zdCgiRGVidWdnZXIuZW5hYmxlIiwoKCk9PntlLnBvc3QoIkRlYnVnZ2VyLnBhdXNlIil9KSl9Y2F0Y2godCl7fX19Y29uc3R7cG9sbDp2ZX09ZnVuY3Rpb24odCxlLG4scil7Y29uc3Qgbz10KCk7bGV0IHM9ITEsaT0hMDtyZXR1cm4gc2V0SW50ZXJ2YWwoKCgpPT57Y29uc3QgdD1vLmdldFRpbWVNcygpOyExPT09cyYmdD5lK24mJihzPSEwLGkmJnIoKSksdDxlK24mJihzPSExKX0pLDIwKSx7cG9sbDooKT0+e28ucmVzZXQoKX0sZW5hYmxlZDp0PT57aT10fX19KChmdW5jdGlvbigpe2xldCB0PXByb2Nlc3MuaHJ0aW1lKCk7cmV0dXJue2dldFRpbWVNczooKT0+e2NvbnN0W2Usbl09cHJvY2Vzcy5ocnRpbWUodCk7cmV0dXJuIE1hdGguZmxvb3IoMWUzKmUrbi8xZTYpfSxyZXNldDooKT0+e3Q9cHJvY2Vzcy5ocnRpbWUoKX19fSksY2UucG9sbEludGVydmFsLGNlLmFuclRocmVzaG9sZCwoZnVuY3Rpb24oKXtmZSgiV2F0Y2hkb2cgdGltZW91dCIpLGJlPyhmZSgiUGF1c2luZyBkZWJ1Z2dlciB0byBjYXB0dXJlIHN0YWNrIHRyYWNlIiksYmUoKSk6KGZlKCJDYXB0dXJpbmcgZXZlbnQgd2l0aG91dCBhIHN0YWNrIHRyYWNlIikseWUoKS50aGVuKG51bGwsKCgpPT57ZmUoIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZCBvbiB3YXRjaGRvZyB0aW1lb3V0LiIpfSkpKX0pKTtlPy5vbigibWVzc2FnZSIsKHQ9Pnt0LnNlc3Npb24mJih1ZT1mdCh0LnNlc3Npb24pKSx2ZSgpfSkpOw==';
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZSA4LjMuMCAoOGI5OWRlNykgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtwYXJlbnRQb3J0IGFzIHQsd29ya2VyRGF0YSBhcyBlfWZyb20ibm9kZTp3b3JrZXJfdGhyZWFkcyI7aW1wb3J0e1Nlc3Npb24gYXMgbn1mcm9tImluc3BlY3RvciI7aW1wb3J0e3Bvc2l4IGFzIHIsc2VwIGFzIG99ZnJvbSJub2RlOnBhdGgiO2ltcG9ydCphcyBzIGZyb20ibm9kZTpodHRwIjtpbXBvcnQqYXMgaSBmcm9tIm5vZGU6aHR0cHMiO2ltcG9ydHtSZWFkYWJsZSBhcyBjfWZyb20ibm9kZTpzdHJlYW0iO2ltcG9ydHtjcmVhdGVHemlwIGFzIHV9ZnJvbSJub2RlOnpsaWIiO2ltcG9ydCphcyBhIGZyb20ibm9kZTpuZXQiO2ltcG9ydCphcyBmIGZyb20ibm9kZTp0bHMiO2NvbnN0IGg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBwKHQsZSl7cmV0dXJuIGguY2FsbCh0KT09PWBbb2JqZWN0ICR7ZX1dYH1mdW5jdGlvbiBsKHQpe3JldHVybiBwKHQsIk9iamVjdCIpfWZ1bmN0aW9uIGQodCl7cmV0dXJuIEJvb2xlYW4odCYmdC50aGVuJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuKX1mdW5jdGlvbiBtKHQsZSl7dHJ5e3JldHVybiB0IGluc3RhbmNlb2YgZX1jYXRjaCh0KXtyZXR1cm4hMX19Y29uc3QgZz1nbG9iYWxUaGlzO2Z1bmN0aW9uIHkodCxlLG4pe2NvbnN0IHI9bnx8ZyxvPXIuX19TRU5UUllfXz1yLl9fU0VOVFJZX198fHt9O3JldHVybiBvW3RdfHwob1t0XT1lKCkpfWNvbnN0IGI9Zyx2PTgwO2Z1bmN0aW9uIF8odCxlKXtjb25zdCBuPXQscj1bXTtsZXQgbyxzLGksYyx1O2lmKCFufHwhbi50YWdOYW1lKXJldHVybiIiO2lmKGIuSFRNTEVsZW1lbnQmJm4gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmbi5kYXRhc2V0KXtpZihuLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50KXJldHVybiBuLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50O2lmKG4uZGF0YXNldC5zZW50cnlFbGVtZW50KXJldHVybiBuLmRhdGFzZXQuc2VudHJ5RWxlbWVudH1yLnB1c2gobi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpO2NvbnN0IGE9ZSYmZS5sZW5ndGg/ZS5maWx0ZXIoKHQ9Pm4uZ2V0QXR0cmlidXRlKHQpKSkubWFwKCh0PT5bdCxuLmdldEF0dHJpYnV0ZSh0KV0pKTpudWxsO2lmKGEmJmEubGVuZ3RoKWEuZm9yRWFjaCgodD0+e3IucHVzaChgWyR7dFswXX09IiR7dFsxXX0iXWApfSkpO2Vsc2UgaWYobi5pZCYmci5wdXNoKGAjJHtuLmlkfWApLG89bi5jbGFzc05hbWUsbyYmcChvLCJTdHJpbmciKSlmb3Iocz1vLnNwbGl0KC9ccysvKSx1PTA7dTxzLmxlbmd0aDt1Kyspci5wdXNoKGAuJHtzW3VdfWApO2NvbnN0IGY9WyJhcmlhLWxhYmVsIiwidHlwZSIsIm5hbWUiLCJ0aXRsZSIsImFsdCJdO2Zvcih1PTA7dTxmLmxlbmd0aDt1KyspaT1mW3VdLGM9bi5nZXRBdHRyaWJ1dGUoaSksYyYmci5wdXNoKGBbJHtpfT0iJHtjfSJdYCk7cmV0dXJuIHIuam9pbigiIil9Y29uc3Qgdz0idW5kZWZpbmVkIj09dHlwZW9mIF9fU0VOVFJZX0RFQlVHX198fF9fU0VOVFJZX0RFQlVHX18sUz1bImRlYnVnIiwiaW5mbyIsIndhcm4iLCJlcnJvciIsImxvZyIsImFzc2VydCIsInRyYWNlIl0sJD17fTtmdW5jdGlvbiBFKHQpe2lmKCEoImNvbnNvbGUiaW4gZykpcmV0dXJuIHQoKTtjb25zdCBlPWcuY29uc29sZSxuPXt9LHI9T2JqZWN0LmtleXMoJCk7ci5mb3JFYWNoKCh0PT57Y29uc3Qgcj0kW3RdO25bdF09ZVt0XSxlW3RdPXJ9KSk7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtyLmZvckVhY2goKHQ9PntlW3RdPW5bdF19KSl9fWNvbnN0IHg9ZnVuY3Rpb24oKXtsZXQgdD0hMTtjb25zdCBlPXtlbmFibGU6KCk9Pnt0PSEwfSxkaXNhYmxlOigpPT57dD0hMX0saXNFbmFibGVkOigpPT50fTtyZXR1cm4gdz9TLmZvckVhY2goKG49PntlW25dPSguLi5lKT0+e3QmJkUoKCgpPT57Zy5jb25zb2xlW25dKGBTZW50cnkgTG9nZ2VyIFske259XTpgLC4uLmUpfSkpfX0pKTpTLmZvckVhY2goKHQ9PntlW3RdPSgpPT57fX0pKSxlfSgpO2Z1bmN0aW9uIE4odCxlPSExKXtjb25zdHtob3N0Om4scGF0aDpyLHBhc3M6byxwb3J0OnMscHJvamVjdElkOmkscHJvdG9jb2w6YyxwdWJsaWNLZXk6dX09dDtyZXR1cm5gJHtjfTovLyR7dX0ke2UmJm8/YDoke299YDoiIn1AJHtufSR7cz9gOiR7c31gOiIifS8ke3I/YCR7cn0vYDpyfSR7aX1gfWNsYXNzIGsgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LGU9Indhcm4iKXtzdXBlcih0KSx0aGlzLm1lc3NhZ2U9dCx0aGlzLm5hbWU9bmV3LnRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxuZXcudGFyZ2V0LnByb3RvdHlwZSksdGhpcy5sb2dMZXZlbD1lfX1mdW5jdGlvbiBDKHQpe2lmKGZ1bmN0aW9uKHQpe3N3aXRjaChoLmNhbGwodCkpe2Nhc2UiW29iamVjdCBFcnJvcl0iOmNhc2UiW29iamVjdCBFeGNlcHRpb25dIjpjYXNlIltvYmplY3QgRE9NRXhjZXB0aW9uXSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4gbSh0LEVycm9yKX19KHQpKXJldHVybnttZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrLC4uLlQodCl9O2lmKGU9dCwidW5kZWZpbmVkIiE9dHlwZW9mIEV2ZW50JiZtKGUsRXZlbnQpKXtjb25zdCBlPXt0eXBlOnQudHlwZSx0YXJnZXQ6RCh0LnRhcmdldCksY3VycmVudFRhcmdldDpEKHQuY3VycmVudFRhcmdldCksLi4uVCh0KX07cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBDdXN0b21FdmVudCYmbSh0LEN1c3RvbUV2ZW50KSYmKGUuZGV0YWlsPXQuZGV0YWlsKSxlfXJldHVybiB0O3ZhciBlfWZ1bmN0aW9uIEQodCl7dHJ5e3JldHVybiBlPXQsInVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50JiZtKGUsRWxlbWVudCk/ZnVuY3Rpb24odCxlPXt9KXtpZighdClyZXR1cm4iPHVua25vd24+Ijt0cnl7bGV0IG49dDtjb25zdCByPTUsbz1bXTtsZXQgcz0wLGk9MDtjb25zdCBjPSIgPiAiLHU9Yy5sZW5ndGg7bGV0IGE7Y29uc3QgZj1BcnJheS5pc0FycmF5KGUpP2U6ZS5rZXlBdHRycyxoPSFBcnJheS5pc0FycmF5KGUpJiZlLm1heFN0cmluZ0xlbmd0aHx8djtmb3IoO24mJnMrKzxyJiYoYT1fKG4sZiksISgiaHRtbCI9PT1hfHxzPjEmJmkrby5sZW5ndGgqdSthLmxlbmd0aD49aCkpOylvLnB1c2goYSksaSs9YS5sZW5ndGgsbj1uLnBhcmVudE5vZGU7cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oYyl9Y2F0Y2godCl7cmV0dXJuIjx1bmtub3duPiJ9fSh0KTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9Y2F0Y2godCl7cmV0dXJuIjx1bmtub3duPiJ9dmFyIGV9ZnVuY3Rpb24gVCh0KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KXtjb25zdCBlPXt9O2Zvcihjb25zdCBuIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW25dPXRbbl0pO3JldHVybiBlfXJldHVybnt9fWZ1bmN0aW9uIE8odCl7cmV0dXJuIGoodCxuZXcgTWFwKX1mdW5jdGlvbiBqKHQsZSl7aWYoZnVuY3Rpb24odCl7aWYoIWwodCkpcmV0dXJuITE7dHJ5e2NvbnN0IGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpLmNvbnN0cnVjdG9yLm5hbWU7cmV0dXJuIWV8fCJPYmplY3QiPT09ZX1jYXRjaCh0KXtyZXR1cm4hMH19KHQpKXtjb25zdCBuPWUuZ2V0KHQpO2lmKHZvaWQgMCE9PW4pcmV0dXJuIG47Y29uc3Qgcj17fTtlLnNldCh0LHIpO2Zvcihjb25zdCBuIG9mIE9iamVjdC5rZXlzKHQpKXZvaWQgMCE9PXRbbl0mJihyW25dPWoodFtuXSxlKSk7cmV0dXJuIHJ9aWYoQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgbj1lLmdldCh0KTtpZih2b2lkIDAhPT1uKXJldHVybiBuO2NvbnN0IHI9W107cmV0dXJuIGUuc2V0KHQsciksdC5mb3JFYWNoKCh0PT57ci5wdXNoKGoodCxlKSl9KSkscn1yZXR1cm4gdH1jb25zdCBSPTUwLEE9Ij8iLEk9L2NhcHR1cmVNZXNzYWdlfGNhcHR1cmVFeGNlcHRpb24vO2NvbnN0IFA9Ijxhbm9ueW1vdXM+Ijtjb25zdCBVPTFlMztmdW5jdGlvbiBNKCl7cmV0dXJuIERhdGUubm93KCkvVX1jb25zdCBMPWZ1bmN0aW9uKCl7Y29uc3R7cGVyZm9ybWFuY2U6dH09ZztpZighdHx8IXQubm93KXJldHVybiBNO2NvbnN0IGU9RGF0ZS5ub3coKS10Lm5vdygpLG49bnVsbD09dC50aW1lT3JpZ2luP2U6dC50aW1lT3JpZ2luO3JldHVybigpPT4obit0Lm5vdygpKS9VfSgpO2Z1bmN0aW9uIEIoKXtjb25zdCB0PWcsZT10LmNyeXB0b3x8dC5tc0NyeXB0bztsZXQgbj0oKT0+MTYqTWF0aC5yYW5kb20oKTt0cnl7aWYoZSYmZS5yYW5kb21VVUlEKXJldHVybiBlLnJhbmRvbVVVSUQoKS5yZXBsYWNlKC8tL2csIiIpO2UmJmUuZ2V0UmFuZG9tVmFsdWVzJiYobj0oKT0+e2NvbnN0IHQ9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIGUuZ2V0UmFuZG9tVmFsdWVzKHQpLHRbMF19KX1jYXRjaCh0KXt9cmV0dXJuKFsxZTddKzFlMys0ZTMrOGUzKzFlMTEpLnJlcGxhY2UoL1swMThdL2csKHQ9Pih0XigxNSZuKCkpPj50LzQpLnRvU3RyaW5nKDE2KSkpfWZ1bmN0aW9uIEcodCxlPTEwMCxuPTEvMCl7dHJ5e3JldHVybiBKKCIiLHQsZSxuKX1jYXRjaCh0KXtyZXR1cm57RVJST1I6YCoqbm9uLXNlcmlhbGl6YWJsZSoqICgke3R9KWB9fX1mdW5jdGlvbiBKKHQsZSxuPTEvMCxyPTEvMCxvPWZ1bmN0aW9uKCl7Y29uc3QgdD0iZnVuY3Rpb24iPT10eXBlb2YgV2Vha1NldCxlPXQ/bmV3IFdlYWtTZXQ6W107cmV0dXJuW2Z1bmN0aW9uKG4pe2lmKHQpcmV0dXJuISFlLmhhcyhuKXx8KGUuYWRkKG4pLCExKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylpZihlW3RdPT09bilyZXR1cm4hMDtyZXR1cm4gZS5wdXNoKG4pLCExfSxmdW5jdGlvbihuKXtpZih0KWUuZGVsZXRlKG4pO2Vsc2UgZm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspaWYoZVt0XT09PW4pe2Uuc3BsaWNlKHQsMSk7YnJlYWt9fV19KCkpe2NvbnN0W3MsaV09bztpZihudWxsPT1lfHxbIm51bWJlciIsImJvb2xlYW4iLCJzdHJpbmciXS5pbmNsdWRlcyh0eXBlb2YgZSkmJiFOdW1iZXIuaXNOYU4oZSkpcmV0dXJuIGU7Y29uc3QgYz1mdW5jdGlvbih0LGUpe3RyeXtpZigiZG9tYWluIj09PXQmJmUmJiJvYmplY3QiPT10eXBlb2YgZSYmZS50KXJldHVybiJbRG9tYWluXSI7aWYoImRvbWFpbkVtaXR0ZXIiPT09dClyZXR1cm4iW0RvbWFpbkVtaXR0ZXJdIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmZT09PWdsb2JhbClyZXR1cm4iW0dsb2JhbF0iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZlPT09d2luZG93KXJldHVybiJbV2luZG93XSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZT09PWRvY3VtZW50KXJldHVybiJbRG9jdW1lbnRdIjtpZigib2JqZWN0Ij09dHlwZW9mKG49ZSkmJm51bGwhPT1uJiYobi5fX2lzVnVlfHxuLm8pKXJldHVybiJbVnVlVmlld01vZGVsXSI7aWYoZnVuY3Rpb24odCl7cmV0dXJuIGwodCkmJiJuYXRpdmVFdmVudCJpbiB0JiYicHJldmVudERlZmF1bHQiaW4gdCYmInN0b3BQcm9wYWdhdGlvbiJpbiB0fShlKSlyZXR1cm4iW1N5bnRoZXRpY0V2ZW50XSI7aWYoIm51bWJlciI9PXR5cGVvZiBlJiZlIT1lKXJldHVybiJbTmFOXSI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuYFtGdW5jdGlvbjogJHtmdW5jdGlvbih0KXt0cnl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0Lm5hbWV8fFB9Y2F0Y2godCl7cmV0dXJuIFB9fShlKX1dYDtpZigic3ltYm9sIj09dHlwZW9mIGUpcmV0dXJuYFske1N0cmluZyhlKX1dYDtpZigiYmlnaW50Ij09dHlwZW9mIGUpcmV0dXJuYFtCaWdJbnQ6ICR7U3RyaW5nKGUpfV1gO2NvbnN0IHI9ZnVuY3Rpb24odCl7Y29uc3QgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7cmV0dXJuIGU/ZS5jb25zdHJ1Y3Rvci5uYW1lOiJudWxsIHByb3RvdHlwZSJ9KGUpO3JldHVybi9eSFRNTChcdyopRWxlbWVudCQvLnRlc3Qocik/YFtIVE1MRWxlbWVudDogJHtyfV1gOmBbb2JqZWN0ICR7cn1dYH1jYXRjaCh0KXtyZXR1cm5gKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH12YXIgbn0odCxlKTtpZighYy5zdGFydHNXaXRoKCJbb2JqZWN0ICIpKXJldHVybiBjO2lmKGUuX19zZW50cnlfc2tpcF9ub3JtYWxpemF0aW9uX18pcmV0dXJuIGU7Y29uc3QgdT0ibnVtYmVyIj09dHlwZW9mIGUuX19zZW50cnlfb3ZlcnJpZGVfbm9ybWFsaXphdGlvbl9kZXB0aF9fP2UuX19zZW50cnlfb3ZlcnJpZGVfbm9ybWFsaXphdGlvbl9kZXB0aF9fOm47aWYoMD09PXUpcmV0dXJuIGMucmVwbGFjZSgib2JqZWN0ICIsIiIpO2lmKHMoZSkpcmV0dXJuIltDaXJjdWxhciB+XSI7Y29uc3QgYT1lO2lmKGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnRvSlNPTil0cnl7cmV0dXJuIEooIiIsYS50b0pTT04oKSx1LTEscixvKX1jYXRjaCh0KXt9Y29uc3QgZj1BcnJheS5pc0FycmF5KGUpP1tdOnt9O2xldCBoPTA7Y29uc3QgcD1DKGUpO2Zvcihjb25zdCB0IGluIHApe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCx0KSljb250aW51ZTtpZihoPj1yKXtmW3RdPSJbTWF4UHJvcGVydGllcyB+XSI7YnJlYWt9Y29uc3QgZT1wW3RdO2ZbdF09Sih0LGUsdS0xLHIsbyksaCsrfXJldHVybiBpKGUpLGZ9ZnVuY3Rpb24geih0LGUpe2NvbnN0IG49ZS5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSgvW3xcXHt9KClbXF1eJCsqPy5dL2csIlxcJCYiKTtsZXQgcj10O3RyeXtyPWRlY29kZVVSSSh0KX1jYXRjaCh0KXt9cmV0dXJuIHIucmVwbGFjZSgvXFwvZywiLyIpLnJlcGxhY2UoL3dlYnBhY2s6XC8/L2csIiIpLnJlcGxhY2UobmV3IFJlZ0V4cChgKGZpbGU6Ly8pPy8qJHtufS8qYCwiaWciKSwiYXBwOi8vLyIpfSgoKT0+e2NvbnN0e3BlcmZvcm1hbmNlOnR9PWc7aWYoIXR8fCF0Lm5vdylyZXR1cm47Y29uc3QgZT0zNmU1LG49dC5ub3coKSxyPURhdGUubm93KCksbz10LnRpbWVPcmlnaW4/TWF0aC5hYnModC50aW1lT3JpZ2luK24tcik6ZSxzPW88ZSxpPXQudGltaW5nJiZ0LnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQsYz0ibnVtYmVyIj09dHlwZW9mIGk/TWF0aC5hYnMoaStuLXIpOmU7KHN8fGM8ZSkmJihvPD1jJiZ0LnRpbWVPcmlnaW4pfSkoKTtjb25zdCBIPS9eKFxTKzpcXHxcLz8pKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteL1xcXSs/fCkoXC5bXi4vXFxdKnwpKSg/OlsvXFxdKikkLztmdW5jdGlvbiBXKHQpe2NvbnN0IGU9ZnVuY3Rpb24odCl7Y29uc3QgZT10Lmxlbmd0aD4xMDI0P2A8dHJ1bmNhdGVkPiR7dC5zbGljZSgtMTAyNCl9YDp0LG49SC5leGVjKGUpO3JldHVybiBuP24uc2xpY2UoMSk6W119KHQpLG49ZVswXTtsZXQgcj1lWzFdO3JldHVybiBufHxyPyhyJiYocj1yLnNsaWNlKDAsci5sZW5ndGgtMSkpLG4rcik6Ii4ifXZhciBZO2Z1bmN0aW9uIHEodCl7cmV0dXJuIG5ldyBGKChlPT57ZSh0KX0pKX0hZnVuY3Rpb24odCl7dFt0LlBFTkRJTkc9MF09IlBFTkRJTkciO3RbdC5SRVNPTFZFRD0xXT0iUkVTT0xWRUQiO3RbdC5SRUpFQ1RFRD0yXT0iUkVKRUNURUQifShZfHwoWT17fSkpO2NsYXNzIEZ7Y29uc3RydWN0b3IodCl7Ri5wcm90b3R5cGUuX19pbml0LmNhbGwodGhpcyksRi5wcm90b3R5cGUuX19pbml0Mi5jYWxsKHRoaXMpLEYucHJvdG90eXBlLl9faW5pdDMuY2FsbCh0aGlzKSxGLnByb3RvdHlwZS5fX2luaXQ0LmNhbGwodGhpcyksdGhpcy5pPVkuUEVORElORyx0aGlzLnU9W107dHJ5e3QodGhpcy5oLHRoaXMucCl9Y2F0Y2godCl7dGhpcy5wKHQpfX10aGVuKHQsZSl7cmV0dXJuIG5ldyBGKCgobixyKT0+e3RoaXMudS5wdXNoKFshMSxlPT57aWYodCl0cnl7bih0KGUpKX1jYXRjaCh0KXtyKHQpfWVsc2UgbihlKX0sdD0+e2lmKGUpdHJ5e24oZSh0KSl9Y2F0Y2godCl7cih0KX1lbHNlIHIodCl9XSksdGhpcy5sKCl9KSl9Y2F0Y2godCl7cmV0dXJuIHRoaXMudGhlbigodD0+dCksdCl9ZmluYWxseSh0KXtyZXR1cm4gbmV3IEYoKChlLG4pPT57bGV0IHIsbztyZXR1cm4gdGhpcy50aGVuKChlPT57bz0hMSxyPWUsdCYmdCgpfSksKGU9PntvPSEwLHI9ZSx0JiZ0KCl9KSkudGhlbigoKCk9PntvP24ocik6ZShyKX0pKX0pKX1fX2luaXQoKXt0aGlzLmg9dD0+e3RoaXMubShZLlJFU09MVkVELHQpfX1fX2luaXQyKCl7dGhpcy5wPXQ9Pnt0aGlzLm0oWS5SRUpFQ1RFRCx0KX19X19pbml0Mygpe3RoaXMubT0odCxlKT0+e3RoaXMuaT09PVkuUEVORElORyYmKGQoZSk/ZS50aGVuKHRoaXMuaCx0aGlzLnApOih0aGlzLmk9dCx0aGlzLnY9ZSx0aGlzLmwoKSkpfX1fX2luaXQ0KCl7dGhpcy5sPSgpPT57aWYodGhpcy5pPT09WS5QRU5ESU5HKXJldHVybjtjb25zdCB0PXRoaXMudS5zbGljZSgpO3RoaXMudT1bXSx0LmZvckVhY2goKHQ9Pnt0WzBdfHwodGhpcy5pPT09WS5SRVNPTFZFRCYmdFsxXSh0aGlzLnYpLHRoaXMuaT09PVkuUkVKRUNURUQmJnRbMl0odGhpcy52KSx0WzBdPSEwKX0pKX19fWZ1bmN0aW9uIEsodCl7Y29uc3QgZT1bXTtmdW5jdGlvbiBuKHQpe3JldHVybiBlLnNwbGljZShlLmluZGV4T2YodCksMSlbMF19cmV0dXJueyQ6ZSxhZGQ6ZnVuY3Rpb24ocil7aWYoISh2b2lkIDA9PT10fHxlLmxlbmd0aDx0KSlyZXR1cm4gbz1uZXcgaygiTm90IGFkZGluZyBQcm9taXNlIGJlY2F1c2UgYnVmZmVyIGxpbWl0IHdhcyByZWFjaGVkLiIpLG5ldyBGKCgodCxlKT0+e2Uobyl9KSk7dmFyIG87Y29uc3Qgcz1yKCk7cmV0dXJuLTE9PT1lLmluZGV4T2YocykmJmUucHVzaChzKSxzLnRoZW4oKCgpPT5uKHMpKSkudGhlbihudWxsLCgoKT0+bihzKS50aGVuKG51bGwsKCgpPT57fSkpKSksc30sZHJhaW46ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGKCgobixyKT0+e2xldCBvPWUubGVuZ3RoO2lmKCFvKXJldHVybiBuKCEwKTtjb25zdCBzPXNldFRpbWVvdXQoKCgpPT57dCYmdD4wJiZuKCExKX0pLHQpO2UuZm9yRWFjaCgodD0+e3EodCkudGhlbigoKCk9PnstLW98fChjbGVhclRpbWVvdXQocyksbighMCkpfSkscil9KSl9KSl9fX1mdW5jdGlvbiBWKHQsZT0hMSl7cmV0dXJuIShlfHx0JiYhdC5zdGFydHNXaXRoKCIvIikmJiF0Lm1hdGNoKC9eW0EtWl06LykmJiF0LnN0YXJ0c1dpdGgoIi4iKSYmIXQubWF0Y2goL15bYS16QS1aXShbYS16QS1aMC05LlwtK10pKjpcL1wvLykpJiZ2b2lkIDAhPT10JiYhdC5pbmNsdWRlcygibm9kZV9tb2R1bGVzLyIpfWZ1bmN0aW9uIFoodCxlPVtdKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBRKHQsZSl7Y29uc3Qgbj10WzFdO2Zvcihjb25zdCB0IG9mIG4pe2lmKGUodCx0WzBdLnR5cGUpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFgodCl7cmV0dXJuIGcuX19TRU5UUllfXyYmZy5fX1NFTlRSWV9fLmVuY29kZVBvbHlmaWxsP2cuX19TRU5UUllfXy5lbmNvZGVQb2x5ZmlsbCh0KToobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCl9ZnVuY3Rpb24gdHQodCl7Y29uc3RbZSxuXT10O2xldCByPUpTT04uc3RyaW5naWZ5KGUpO2Z1bmN0aW9uIG8odCl7InN0cmluZyI9PXR5cGVvZiByP3I9InN0cmluZyI9PXR5cGVvZiB0P3IrdDpbWChyKSx0XTpyLnB1c2goInN0cmluZyI9PXR5cGVvZiB0P1godCk6dCl9Zm9yKGNvbnN0IHQgb2Ygbil7Y29uc3RbZSxuXT10O2lmKG8oYFxuJHtKU09OLnN0cmluZ2lmeShlKX1cbmApLCJzdHJpbmciPT10eXBlb2Ygbnx8biBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpbyhuKTtlbHNle2xldCB0O3RyeXt0PUpTT04uc3RyaW5naWZ5KG4pfWNhdGNoKGUpe3Q9SlNPTi5zdHJpbmdpZnkoRyhuKSl9byh0KX19cmV0dXJuInN0cmluZyI9PXR5cGVvZiByP3I6ZnVuY3Rpb24odCl7Y29uc3QgZT10LnJlZHVjZSgoKHQsZSk9PnQrZS5sZW5ndGgpLDApLG49bmV3IFVpbnQ4QXJyYXkoZSk7bGV0IHI9MDtmb3IoY29uc3QgZSBvZiB0KW4uc2V0KGUscikscis9ZS5sZW5ndGg7cmV0dXJuIG59KHIpfWNvbnN0IGV0PXtzZXNzaW9uOiJzZXNzaW9uIixzZXNzaW9uczoic2Vzc2lvbiIsYXR0YWNobWVudDoiYXR0YWNobWVudCIsdHJhbnNhY3Rpb246InRyYW5zYWN0aW9uIixldmVudDoiZXJyb3IiLGNsaWVudF9yZXBvcnQ6ImludGVybmFsIix1c2VyX3JlcG9ydDoiZGVmYXVsdCIscHJvZmlsZToicHJvZmlsZSIscmVwbGF5X2V2ZW50OiJyZXBsYXkiLHJlcGxheV9yZWNvcmRpbmc6InJlcGxheSIsY2hlY2tfaW46Im1vbml0b3IiLGZlZWRiYWNrOiJmZWVkYmFjayIsc3Bhbjoic3BhbiIsc3RhdHNkOiJtZXRyaWNfYnVja2V0In07ZnVuY3Rpb24gbnQodCl7cmV0dXJuIGV0W3RdfWZ1bmN0aW9uIHJ0KHQpe2lmKCF0fHwhdC5zZGspcmV0dXJuO2NvbnN0e25hbWU6ZSx2ZXJzaW9uOm59PXQuc2RrO3JldHVybntuYW1lOmUsdmVyc2lvbjpufX1jb25zdCBvdD02ZTQ7ZnVuY3Rpb24gc3QodCx7c3RhdHVzQ29kZTplLGhlYWRlcnM6bn0scj1EYXRlLm5vdygpKXtjb25zdCBvPXsuLi50fSxzPW4mJm5bIngtc2VudHJ5LXJhdGUtbGltaXRzIl0saT1uJiZuWyJyZXRyeS1hZnRlciJdO2lmKHMpZm9yKGNvbnN0IHQgb2Ygcy50cmltKCkuc3BsaXQoIiwiKSl7Y29uc3RbZSxuLCwsc109dC5zcGxpdCgiOiIsNSksaT1wYXJzZUludChlLDEwKSxjPTFlMyooaXNOYU4oaSk/NjA6aSk7aWYobilmb3IoY29uc3QgdCBvZiBuLnNwbGl0KCI7IikpIm1ldHJpY19idWNrZXQiPT09dCYmcyYmIXMuc3BsaXQoIjsiKS5pbmNsdWRlcygiY3VzdG9tIil8fChvW3RdPXIrYyk7ZWxzZSBvLmFsbD1yK2N9ZWxzZSBpP28uYWxsPXIrZnVuY3Rpb24odCxlPURhdGUubm93KCkpe2NvbnN0IG49cGFyc2VJbnQoYCR7dH1gLDEwKTtpZighaXNOYU4obikpcmV0dXJuIDFlMypuO2NvbnN0IHI9RGF0ZS5wYXJzZShgJHt0fWApO3JldHVybiBpc05hTihyKT9vdDpyLWV9KGkscik6NDI5PT09ZSYmKG8uYWxsPXIrNmU0KTtyZXR1cm4gb31jb25zdCBpdD0idW5kZWZpbmVkIj09dHlwZW9mIF9fU0VOVFJZX0RFQlVHX198fF9fU0VOVFJZX0RFQlVHX187ZnVuY3Rpb24gY3QoKXtyZXR1cm4gdXQoZyksZ31mdW5jdGlvbiB1dCh0KXtyZXR1cm4gdC5fX1NFTlRSWV9ffHwodC5fX1NFTlRSWV9fPXtleHRlbnNpb25zOnt9fSksdC5fX1NFTlRSWV9ffWZ1bmN0aW9uIGF0KHQpe2NvbnN0IGU9TCgpLG49e3NpZDpCKCksaW5pdDohMCx0aW1lc3RhbXA6ZSxzdGFydGVkOmUsZHVyYXRpb246MCxzdGF0dXM6Im9rIixlcnJvcnM6MCxpZ25vcmVEdXJhdGlvbjohMSx0b0pTT046KCk9PmZ1bmN0aW9uKHQpe3JldHVybiBPKHtzaWQ6YCR7dC5zaWR9YCxpbml0OnQuaW5pdCxzdGFydGVkOm5ldyBEYXRlKDFlMyp0LnN0YXJ0ZWQpLnRvSVNPU3RyaW5nKCksdGltZXN0YW1wOm5ldyBEYXRlKDFlMyp0LnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKSxzdGF0dXM6dC5zdGF0dXMsZXJyb3JzOnQuZXJyb3JzLGRpZDoibnVtYmVyIj09dHlwZW9mIHQuZGlkfHwic3RyaW5nIj09dHlwZW9mIHQuZGlkP2Ake3QuZGlkfWA6dm9pZCAwLGR1cmF0aW9uOnQuZHVyYXRpb24sYWJub3JtYWxfbWVjaGFuaXNtOnQuYWJub3JtYWxfbWVjaGFuaXNtLGF0dHJzOntyZWxlYXNlOnQucmVsZWFzZSxlbnZpcm9ubWVudDp0LmVudmlyb25tZW50LGlwX2FkZHJlc3M6dC5pcEFkZHJlc3MsdXNlcl9hZ2VudDp0LnVzZXJBZ2VudH19KX0obil9O3JldHVybiB0JiZmdChuLHQpLG59ZnVuY3Rpb24gZnQodCxlPXt9KXtpZihlLnVzZXImJighdC5pcEFkZHJlc3MmJmUudXNlci5pcF9hZGRyZXNzJiYodC5pcEFkZHJlc3M9ZS51c2VyLmlwX2FkZHJlc3MpLHQuZGlkfHxlLmRpZHx8KHQuZGlkPWUudXNlci5pZHx8ZS51c2VyLmVtYWlsfHxlLnVzZXIudXNlcm5hbWUpKSx0LnRpbWVzdGFtcD1lLnRpbWVzdGFtcHx8TCgpLGUuYWJub3JtYWxfbWVjaGFuaXNtJiYodC5hYm5vcm1hbF9tZWNoYW5pc209ZS5hYm5vcm1hbF9tZWNoYW5pc20pLGUuaWdub3JlRHVyYXRpb24mJih0Lmlnbm9yZUR1cmF0aW9uPWUuaWdub3JlRHVyYXRpb24pLGUuc2lkJiYodC5zaWQ9MzI9PT1lLnNpZC5sZW5ndGg/ZS5zaWQ6QigpKSx2b2lkIDAhPT1lLmluaXQmJih0LmluaXQ9ZS5pbml0KSwhdC5kaWQmJmUuZGlkJiYodC5kaWQ9YCR7ZS5kaWR9YCksIm51bWJlciI9PXR5cGVvZiBlLnN0YXJ0ZWQmJih0LnN0YXJ0ZWQ9ZS5zdGFydGVkKSx0Lmlnbm9yZUR1cmF0aW9uKXQuZHVyYXRpb249dm9pZCAwO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlLmR1cmF0aW9uKXQuZHVyYXRpb249ZS5kdXJhdGlvbjtlbHNle2NvbnN0IGU9dC50aW1lc3RhbXAtdC5zdGFydGVkO3QuZHVyYXRpb249ZT49MD9lOjB9ZS5yZWxlYXNlJiYodC5yZWxlYXNlPWUucmVsZWFzZSksZS5lbnZpcm9ubWVudCYmKHQuZW52aXJvbm1lbnQ9ZS5lbnZpcm9ubWVudCksIXQuaXBBZGRyZXNzJiZlLmlwQWRkcmVzcyYmKHQuaXBBZGRyZXNzPWUuaXBBZGRyZXNzKSwhdC51c2VyQWdlbnQmJmUudXNlckFnZW50JiYodC51c2VyQWdlbnQ9ZS51c2VyQWdlbnQpLCJudW1iZXIiPT10eXBlb2YgZS5lcnJvcnMmJih0LmVycm9ycz1lLmVycm9ycyksZS5zdGF0dXMmJih0LnN0YXR1cz1lLnN0YXR1cyl9Y29uc3QgaHQ9Il9zZW50cnlTcGFuIjtmdW5jdGlvbiBwdCh0LGUpe2U/ZnVuY3Rpb24odCxlLG4pe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfWNhdGNoKG4pe3cmJngubG9nKGBGYWlsZWQgdG8gYWRkIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5ICIke2V9IiB0byBvYmplY3RgLHQpfX0odCxodCxlKTpkZWxldGUgdFtodF19ZnVuY3Rpb24gbHQodCl7cmV0dXJuIHRbaHRdfWNsYXNzIGR0e2NvbnN0cnVjdG9yKCl7dGhpcy5fPSExLHRoaXMuUz1bXSx0aGlzLk49W10sdGhpcy5rPVtdLHRoaXMuQz1bXSx0aGlzLkQ9e30sdGhpcy5UPXt9LHRoaXMuTz17fSx0aGlzLmo9e30sdGhpcy5SPXt9LHRoaXMuQT1ndCgpfWNsb25lKCl7Y29uc3QgdD1uZXcgZHQ7cmV0dXJuIHQuaz1bLi4udGhpcy5rXSx0LlQ9ey4uLnRoaXMuVH0sdC5PPXsuLi50aGlzLk99LHQuaj17Li4udGhpcy5qfSx0LkQ9dGhpcy5ELHQuST10aGlzLkksdC5QPXRoaXMuUCx0LlU9dGhpcy5VLHQuTT10aGlzLk0sdC5OPVsuLi50aGlzLk5dLHQuTD10aGlzLkwsdC5DPVsuLi50aGlzLkNdLHQuUj17Li4udGhpcy5SfSx0LkE9ey4uLnRoaXMuQX0sdC5CPXRoaXMuQix0Lkc9dGhpcy5HLHB0KHQsbHQodGhpcykpLHR9c2V0Q2xpZW50KHQpe3RoaXMuQj10fXNldExhc3RFdmVudElkKHQpe3RoaXMuRz10fWdldENsaWVudCgpe3JldHVybiB0aGlzLkJ9bGFzdEV2ZW50SWQoKXtyZXR1cm4gdGhpcy5HfWFkZFNjb3BlTGlzdGVuZXIodCl7dGhpcy5TLnB1c2godCl9YWRkRXZlbnRQcm9jZXNzb3IodCl7cmV0dXJuIHRoaXMuTi5wdXNoKHQpLHRoaXN9c2V0VXNlcih0KXtyZXR1cm4gdGhpcy5EPXR8fHtlbWFpbDp2b2lkIDAsaWQ6dm9pZCAwLGlwX2FkZHJlc3M6dm9pZCAwLHVzZXJuYW1lOnZvaWQgMH0sdGhpcy5QJiZmdCh0aGlzLlAse3VzZXI6dH0pLHRoaXMuSigpLHRoaXN9Z2V0VXNlcigpe3JldHVybiB0aGlzLkR9Z2V0UmVxdWVzdFNlc3Npb24oKXtyZXR1cm4gdGhpcy5MfXNldFJlcXVlc3RTZXNzaW9uKHQpe3JldHVybiB0aGlzLkw9dCx0aGlzfXNldFRhZ3ModCl7cmV0dXJuIHRoaXMuVD17Li4udGhpcy5ULC4uLnR9LHRoaXMuSigpLHRoaXN9c2V0VGFnKHQsZSl7cmV0dXJuIHRoaXMuVD17Li4udGhpcy5ULFt0XTplfSx0aGlzLkooKSx0aGlzfXNldEV4dHJhcyh0KXtyZXR1cm4gdGhpcy5PPXsuLi50aGlzLk8sLi4udH0sdGhpcy5KKCksdGhpc31zZXRFeHRyYSh0LGUpe3JldHVybiB0aGlzLk89ey4uLnRoaXMuTyxbdF06ZX0sdGhpcy5KKCksdGhpc31zZXRGaW5nZXJwcmludCh0KXtyZXR1cm4gdGhpcy5NPXQsdGhpcy5KKCksdGhpc31zZXRMZXZlbCh0KXtyZXR1cm4gdGhpcy5JPXQsdGhpcy5KKCksdGhpc31zZXRUcmFuc2FjdGlvbk5hbWUodCl7cmV0dXJuIHRoaXMuVT10LHRoaXMuSigpLHRoaXN9c2V0Q29udGV4dCh0LGUpe3JldHVybiBudWxsPT09ZT9kZWxldGUgdGhpcy5qW3RdOnRoaXMualt0XT1lLHRoaXMuSigpLHRoaXN9c2V0U2Vzc2lvbih0KXtyZXR1cm4gdD90aGlzLlA9dDpkZWxldGUgdGhpcy5QLHRoaXMuSigpLHRoaXN9Z2V0U2Vzc2lvbigpe3JldHVybiB0aGlzLlB9dXBkYXRlKHQpe2lmKCF0KXJldHVybiB0aGlzO2NvbnN0IGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCh0aGlzKTp0LFtuLHJdPWUgaW5zdGFuY2VvZiBtdD9bZS5nZXRTY29wZURhdGEoKSxlLmdldFJlcXVlc3RTZXNzaW9uKCldOmwoZSk/W3QsdC5yZXF1ZXN0U2Vzc2lvbl06W10se3RhZ3M6byxleHRyYTpzLHVzZXI6aSxjb250ZXh0czpjLGxldmVsOnUsZmluZ2VycHJpbnQ6YT1bXSxwcm9wYWdhdGlvbkNvbnRleHQ6Zn09bnx8e307cmV0dXJuIHRoaXMuVD17Li4udGhpcy5ULC4uLm99LHRoaXMuTz17Li4udGhpcy5PLC4uLnN9LHRoaXMuaj17Li4udGhpcy5qLC4uLmN9LGkmJk9iamVjdC5rZXlzKGkpLmxlbmd0aCYmKHRoaXMuRD1pKSx1JiYodGhpcy5JPXUpLGEubGVuZ3RoJiYodGhpcy5NPWEpLGYmJih0aGlzLkE9ZiksciYmKHRoaXMuTD1yKSx0aGlzfWNsZWFyKCl7cmV0dXJuIHRoaXMuaz1bXSx0aGlzLlQ9e30sdGhpcy5PPXt9LHRoaXMuRD17fSx0aGlzLmo9e30sdGhpcy5JPXZvaWQgMCx0aGlzLlU9dm9pZCAwLHRoaXMuTT12b2lkIDAsdGhpcy5MPXZvaWQgMCx0aGlzLlA9dm9pZCAwLHB0KHRoaXMsdm9pZCAwKSx0aGlzLkM9W10sdGhpcy5BPWd0KCksdGhpcy5KKCksdGhpc31hZGRCcmVhZGNydW1iKHQsZSl7Y29uc3Qgbj0ibnVtYmVyIj09dHlwZW9mIGU/ZToxMDA7aWYobjw9MClyZXR1cm4gdGhpcztjb25zdCByPXt0aW1lc3RhbXA6TSgpLC4uLnR9LG89dGhpcy5rO3JldHVybiBvLnB1c2gociksdGhpcy5rPW8ubGVuZ3RoPm4/by5zbGljZSgtbik6byx0aGlzLkooKSx0aGlzfWdldExhc3RCcmVhZGNydW1iKCl7cmV0dXJuIHRoaXMua1t0aGlzLmsubGVuZ3RoLTFdfWNsZWFyQnJlYWRjcnVtYnMoKXtyZXR1cm4gdGhpcy5rPVtdLHRoaXMuSigpLHRoaXN9YWRkQXR0YWNobWVudCh0KXtyZXR1cm4gdGhpcy5DLnB1c2godCksdGhpc31jbGVhckF0dGFjaG1lbnRzKCl7cmV0dXJuIHRoaXMuQz1bXSx0aGlzfWdldFNjb3BlRGF0YSgpe3JldHVybnticmVhZGNydW1iczp0aGlzLmssYXR0YWNobWVudHM6dGhpcy5DLGNvbnRleHRzOnRoaXMuaix0YWdzOnRoaXMuVCxleHRyYTp0aGlzLk8sdXNlcjp0aGlzLkQsbGV2ZWw6dGhpcy5JLGZpbmdlcnByaW50OnRoaXMuTXx8W10sZXZlbnRQcm9jZXNzb3JzOnRoaXMuTixwcm9wYWdhdGlvbkNvbnRleHQ6dGhpcy5BLHNka1Byb2Nlc3NpbmdNZXRhZGF0YTp0aGlzLlIsdHJhbnNhY3Rpb25OYW1lOnRoaXMuVSxzcGFuOmx0KHRoaXMpfX1zZXRTREtQcm9jZXNzaW5nTWV0YWRhdGEodCl7cmV0dXJuIHRoaXMuUj17Li4udGhpcy5SLC4uLnR9LHRoaXN9c2V0UHJvcGFnYXRpb25Db250ZXh0KHQpe3JldHVybiB0aGlzLkE9dCx0aGlzfWdldFByb3BhZ2F0aW9uQ29udGV4dCgpe3JldHVybiB0aGlzLkF9Y2FwdHVyZUV4Y2VwdGlvbih0LGUpe2NvbnN0IG49ZSYmZS5ldmVudF9pZD9lLmV2ZW50X2lkOkIoKTtpZighdGhpcy5CKXJldHVybiB4Lndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBleGNlcHRpb24hIiksbjtjb25zdCByPW5ldyBFcnJvcigiU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbiIpO3JldHVybiB0aGlzLkIuY2FwdHVyZUV4Y2VwdGlvbih0LHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpyLC4uLmUsZXZlbnRfaWQ6bn0sdGhpcyksbn1jYXB0dXJlTWVzc2FnZSh0LGUsbil7Y29uc3Qgcj1uJiZuLmV2ZW50X2lkP24uZXZlbnRfaWQ6QigpO2lmKCF0aGlzLkIpcmV0dXJuIHgud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIG1lc3NhZ2UhIikscjtjb25zdCBvPW5ldyBFcnJvcih0KTtyZXR1cm4gdGhpcy5CLmNhcHR1cmVNZXNzYWdlKHQsZSx7b3JpZ2luYWxFeGNlcHRpb246dCxzeW50aGV0aWNFeGNlcHRpb246bywuLi5uLGV2ZW50X2lkOnJ9LHRoaXMpLHJ9Y2FwdHVyZUV2ZW50KHQsZSl7Y29uc3Qgbj1lJiZlLmV2ZW50X2lkP2UuZXZlbnRfaWQ6QigpO3JldHVybiB0aGlzLkI/KHRoaXMuQi5jYXB0dXJlRXZlbnQodCx7Li4uZSxldmVudF9pZDpufSx0aGlzKSxuKTooeC53YXJuKCJObyBjbGllbnQgY29uZmlndXJlZCBvbiBzY29wZSAtIHdpbGwgbm90IGNhcHR1cmUgZXZlbnQhIiksbil9Sigpe3RoaXMuX3x8KHRoaXMuXz0hMCx0aGlzLlMuZm9yRWFjaCgodD0+e3QodGhpcyl9KSksdGhpcy5fPSExKX19Y29uc3QgbXQ9ZHQ7ZnVuY3Rpb24gZ3QoKXtyZXR1cm57dHJhY2VJZDpCKCksc3BhbklkOkIoKS5zdWJzdHJpbmcoMTYpfX1jbGFzcyB5dHtjb25zdHJ1Y3Rvcih0LGUpe2xldCBuLHI7bj10fHxuZXcgbXQscj1lfHxuZXcgbXQsdGhpcy5IPVt7c2NvcGU6bn1dLHRoaXMuVz1yfXdpdGhTY29wZSh0KXtjb25zdCBlPXRoaXMuWSgpO2xldCBuO3RyeXtuPXQoZSl9Y2F0Y2godCl7dGhyb3cgdGhpcy5xKCksdH1yZXR1cm4gZChuKT9uLnRoZW4oKHQ9Pih0aGlzLnEoKSx0KSksKHQ9Pnt0aHJvdyB0aGlzLnEoKSx0fSkpOih0aGlzLnEoKSxuKX1nZXRDbGllbnQoKXtyZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLmNsaWVudH1nZXRTY29wZSgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGV9Z2V0SXNvbGF0aW9uU2NvcGUoKXtyZXR1cm4gdGhpcy5XfWdldFN0YWNrKCl7cmV0dXJuIHRoaXMuSH1nZXRTdGFja1RvcCgpe3JldHVybiB0aGlzLkhbdGhpcy5ILmxlbmd0aC0xXX1ZKCl7Y29uc3QgdD10aGlzLmdldFNjb3BlKCkuY2xvbmUoKTtyZXR1cm4gdGhpcy5nZXRTdGFjaygpLnB1c2goe2NsaWVudDp0aGlzLmdldENsaWVudCgpLHNjb3BlOnR9KSx0fXEoKXtyZXR1cm4hKHRoaXMuZ2V0U3RhY2soKS5sZW5ndGg8PTEpJiYhIXRoaXMuZ2V0U3RhY2soKS5wb3AoKX19ZnVuY3Rpb24gYnQoKXtjb25zdCB0PXV0KGN0KCkpO3JldHVybiB0Lmh1Ynx8KHQuaHViPW5ldyB5dCh5KCJkZWZhdWx0Q3VycmVudFNjb3BlIiwoKCk9Pm5ldyBtdCkpLHkoImRlZmF1bHRJc29sYXRpb25TY29wZSIsKCgpPT5uZXcgbXQpKSkpLHQuaHVifWZ1bmN0aW9uIHZ0KHQpe3JldHVybiBidCgpLndpdGhTY29wZSh0KX1mdW5jdGlvbiBfdCh0LGUpe2NvbnN0IG49YnQoKTtyZXR1cm4gbi53aXRoU2NvcGUoKCgpPT4obi5nZXRTdGFja1RvcCgpLnNjb3BlPXQsZSh0KSkpKX1mdW5jdGlvbiB3dCh0KXtyZXR1cm4gYnQoKS53aXRoU2NvcGUoKCgpPT50KGJ0KCkuZ2V0SXNvbGF0aW9uU2NvcGUoKSkpKX1mdW5jdGlvbiBTdCh0KXtjb25zdCBlPXV0KHQpO3JldHVybiBlLmFjcz9lLmFjczp7d2l0aElzb2xhdGlvblNjb3BlOnd0LHdpdGhTY29wZTp2dCx3aXRoU2V0U2NvcGU6X3Qsd2l0aFNldElzb2xhdGlvblNjb3BlOih0LGUpPT53dChlKSxnZXRDdXJyZW50U2NvcGU6KCk9PmJ0KCkuZ2V0U2NvcGUoKSxnZXRJc29sYXRpb25TY29wZTooKT0+YnQoKS5nZXRJc29sYXRpb25TY29wZSgpfX1mdW5jdGlvbiAkdCgpe3JldHVybiBTdChjdCgpKS5nZXRDdXJyZW50U2NvcGUoKS5nZXRDbGllbnQoKX1jb25zdCBFdD0ic2VudHJ5LnNvdXJjZSIseHQ9InNlbnRyeS5zYW1wbGVfcmF0ZSIsTnQ9InNlbnRyeS5vcCIsa3Q9InNlbnRyeS5vcmlnaW4iLEN0PTAsRHQ9MSxUdD0xO2Z1bmN0aW9uIE90KHQpe2NvbnN0e3NwYW5JZDplLHRyYWNlSWQ6bn09dC5zcGFuQ29udGV4dCgpLHtwYXJlbnRfc3Bhbl9pZDpyfT1BdCh0KTtyZXR1cm4gTyh7cGFyZW50X3NwYW5faWQ6cixzcGFuX2lkOmUsdHJhY2VfaWQ6bn0pfWZ1bmN0aW9uIGp0KHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD9SdCh0KTpBcnJheS5pc0FycmF5KHQpP3RbMF0rdFsxXS8xZTk6dCBpbnN0YW5jZW9mIERhdGU/UnQodC5nZXRUaW1lKCkpOkwoKX1mdW5jdGlvbiBSdCh0KXtyZXR1cm4gdD45OTk5OTk5OTk5P3QvMWUzOnR9ZnVuY3Rpb24gQXQodCl7aWYoZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0U3BhbkpTT059KHQpKXJldHVybiB0LmdldFNwYW5KU09OKCk7dHJ5e2NvbnN0e3NwYW5JZDplLHRyYWNlSWQ6bn09dC5zcGFuQ29udGV4dCgpO2lmKGZ1bmN0aW9uKHQpe2NvbnN0IGU9dDtyZXR1cm4hIShlLmF0dHJpYnV0ZXMmJmUuc3RhcnRUaW1lJiZlLm5hbWUmJmUuZW5kVGltZSYmZS5zdGF0dXMpfSh0KSl7Y29uc3R7YXR0cmlidXRlczpyLHN0YXJ0VGltZTpvLG5hbWU6cyxlbmRUaW1lOmkscGFyZW50U3BhbklkOmMsc3RhdHVzOnV9PXQ7cmV0dXJuIE8oe3NwYW5faWQ6ZSx0cmFjZV9pZDpuLGRhdGE6cixkZXNjcmlwdGlvbjpzLHBhcmVudF9zcGFuX2lkOmMsc3RhcnRfdGltZXN0YW1wOmp0KG8pLHRpbWVzdGFtcDpqdChpKXx8dm9pZCAwLHN0YXR1czpJdCh1KSxvcDpyW050XSxvcmlnaW46cltrdF0sRjp2b2lkIDB9KX1yZXR1cm57c3Bhbl9pZDplLHRyYWNlX2lkOm59fWNhdGNoKHQpe3JldHVybnt9fX1mdW5jdGlvbiBJdCh0KXtpZih0JiZ0LmNvZGUhPT1DdClyZXR1cm4gdC5jb2RlPT09RHQ/Im9rIjp0Lm1lc3NhZ2V8fCJ1bmtub3duX2Vycm9yIn1jb25zdCBQdD0iX3NlbnRyeVJvb3RTcGFuIjtmdW5jdGlvbiBVdCh0KXtyZXR1cm4gdFtQdF18fHR9Y29uc3QgTXQ9InByb2R1Y3Rpb24iLEx0PSJfZnJvemVuRHNjIjtmdW5jdGlvbiBCdCh0KXtjb25zdCBlPSR0KCk7aWYoIWUpcmV0dXJue307Y29uc3Qgbj1mdW5jdGlvbih0LGUpe2NvbnN0IG49ZS5nZXRPcHRpb25zKCkse3B1YmxpY0tleTpyfT1lLmdldERzbigpfHx7fSxvPU8oe2Vudmlyb25tZW50Om4uZW52aXJvbm1lbnR8fE10LHJlbGVhc2U6bi5yZWxlYXNlLHB1YmxpY19rZXk6cix0cmFjZV9pZDp0fSk7cmV0dXJuIGUuZW1pdCgiY3JlYXRlRHNjIixvKSxvfShBdCh0KS50cmFjZV9pZHx8IiIsZSkscj1VdCh0KTtpZighcilyZXR1cm4gbjtjb25zdCBvPXJbTHRdO2lmKG8pcmV0dXJuIG87Y29uc3Qgcz1BdChyKSxpPXMuZGF0YXx8e30sYz1pW3h0XTtudWxsIT1jJiYobi5zYW1wbGVfcmF0ZT1gJHtjfWApO2NvbnN0IHU9aVtFdF07cmV0dXJuIHUmJiJ1cmwiIT09dSYmKG4udHJhbnNhY3Rpb249cy5kZXNjcmlwdGlvbiksbi5zYW1wbGVkPVN0cmluZyhmdW5jdGlvbih0KXtjb25zdHt0cmFjZUZsYWdzOmV9PXQuc3BhbkNvbnRleHQoKTtyZXR1cm4gZT09PVR0fShyKSksZS5lbWl0KCJjcmVhdGVEc2MiLG4pLG59ZnVuY3Rpb24gR3QodCxlLG4scil7Y29uc3Qgbz1ydChuKSxzPXQudHlwZSYmInJlcGxheV9ldmVudCIhPT10LnR5cGU/dC50eXBlOiJldmVudCI7IWZ1bmN0aW9uKHQsZSl7ZSYmKHQuc2RrPXQuc2RrfHx7fSx0LnNkay5uYW1lPXQuc2RrLm5hbWV8fGUubmFtZSx0LnNkay52ZXJzaW9uPXQuc2RrLnZlcnNpb258fGUudmVyc2lvbix0LnNkay5pbnRlZ3JhdGlvbnM9Wy4uLnQuc2RrLmludGVncmF0aW9uc3x8W10sLi4uZS5pbnRlZ3JhdGlvbnN8fFtdXSx0LnNkay5wYWNrYWdlcz1bLi4udC5zZGsucGFja2FnZXN8fFtdLC4uLmUucGFja2FnZXN8fFtdXSl9KHQsbiYmbi5zZGspO2NvbnN0IGk9ZnVuY3Rpb24odCxlLG4scil7Y29uc3Qgbz10LnNka1Byb2Nlc3NpbmdNZXRhZGF0YSYmdC5zZGtQcm9jZXNzaW5nTWV0YWRhdGEuZHluYW1pY1NhbXBsaW5nQ29udGV4dDtyZXR1cm57ZXZlbnRfaWQ6dC5ldmVudF9pZCxzZW50X2F0OihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKSwuLi5lJiZ7c2RrOmV9LC4uLiEhbiYmciYme2RzbjpOKHIpfSwuLi5vJiZ7dHJhY2U6Tyh7Li4ub30pfX19KHQsbyxyLGUpO2RlbGV0ZSB0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YTtyZXR1cm4gWihpLFtbe3R5cGU6c30sdF1dKX1jb25zdCBKdD0iX19TRU5UUllfU1VQUFJFU1NfVFJBQ0lOR19fIjtmdW5jdGlvbiB6dCh0KXtjb25zdCBlPVN0KGN0KCkpO3JldHVybiBlLnN1cHByZXNzVHJhY2luZz9lLnN1cHByZXNzVHJhY2luZyh0KTpmdW5jdGlvbiguLi50KXtjb25zdCBlPVN0KGN0KCkpO2lmKDI9PT10Lmxlbmd0aCl7Y29uc3RbbixyXT10O3JldHVybiBuP2Uud2l0aFNldFNjb3BlKG4scik6ZS53aXRoU2NvcGUocil9cmV0dXJuIGUud2l0aFNjb3BlKHRbMF0pfSgoZT0+KGUuc2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHtbSnRdOiEwfSksdCgpKSkpfWZ1bmN0aW9uIEh0KHQsZSl7Y29uc3R7ZmluZ2VycHJpbnQ6bixzcGFuOnIsYnJlYWRjcnVtYnM6byxzZGtQcm9jZXNzaW5nTWV0YWRhdGE6c309ZTshZnVuY3Rpb24odCxlKXtjb25zdHtleHRyYTpuLHRhZ3M6cix1c2VyOm8sY29udGV4dHM6cyxsZXZlbDppLHRyYW5zYWN0aW9uTmFtZTpjfT1lLHU9TyhuKTt1JiZPYmplY3Qua2V5cyh1KS5sZW5ndGgmJih0LmV4dHJhPXsuLi51LC4uLnQuZXh0cmF9KTtjb25zdCBhPU8ocik7YSYmT2JqZWN0LmtleXMoYSkubGVuZ3RoJiYodC50YWdzPXsuLi5hLC4uLnQudGFnc30pO2NvbnN0IGY9TyhvKTtmJiZPYmplY3Qua2V5cyhmKS5sZW5ndGgmJih0LnVzZXI9ey4uLmYsLi4udC51c2VyfSk7Y29uc3QgaD1PKHMpO2gmJk9iamVjdC5rZXlzKGgpLmxlbmd0aCYmKHQuY29udGV4dHM9ey4uLmgsLi4udC5jb250ZXh0c30pO2kmJih0LmxldmVsPWkpO2MmJiJ0cmFuc2FjdGlvbiIhPT10LnR5cGUmJih0LnRyYW5zYWN0aW9uPWMpfSh0LGUpLHImJmZ1bmN0aW9uKHQsZSl7dC5jb250ZXh0cz17dHJhY2U6T3QoZSksLi4udC5jb250ZXh0c30sdC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE9e2R5bmFtaWNTYW1wbGluZ0NvbnRleHQ6QnQoZSksLi4udC5zZGtQcm9jZXNzaW5nTWV0YWRhdGF9O2NvbnN0IG49VXQoZSkscj1BdChuKS5kZXNjcmlwdGlvbjtyJiYhdC50cmFuc2FjdGlvbiYmInRyYW5zYWN0aW9uIj09PXQudHlwZSYmKHQudHJhbnNhY3Rpb249cil9KHQsciksZnVuY3Rpb24odCxlKXt0LmZpbmdlcnByaW50PXQuZmluZ2VycHJpbnQ/ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19KHQuZmluZ2VycHJpbnQpOltdLGUmJih0LmZpbmdlcnByaW50PXQuZmluZ2VycHJpbnQuY29uY2F0KGUpKTt0LmZpbmdlcnByaW50JiYhdC5maW5nZXJwcmludC5sZW5ndGgmJmRlbGV0ZSB0LmZpbmdlcnByaW50fSh0LG4pLGZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1bLi4udC5icmVhZGNydW1ic3x8W10sLi4uZV07dC5icmVhZGNydW1icz1uLmxlbmd0aD9uOnZvaWQgMH0odCxvKSxmdW5jdGlvbih0LGUpe3Quc2RrUHJvY2Vzc2luZ01ldGFkYXRhPXsuLi50LnNka1Byb2Nlc3NpbmdNZXRhZGF0YSwuLi5lfX0odCxzKX1jb25zdCBXdD0iNyI7ZnVuY3Rpb24gWXQodCxlKXtyZXR1cm4gbj17c2VudHJ5X2tleTp0LnB1YmxpY0tleSxzZW50cnlfdmVyc2lvbjpXdCwuLi5lJiZ7c2VudHJ5X2NsaWVudDpgJHtlLm5hbWV9LyR7ZS52ZXJzaW9ufWB9fSxPYmplY3Qua2V5cyhuKS5tYXAoKHQ9PmAke2VuY29kZVVSSUNvbXBvbmVudCh0KX09JHtlbmNvZGVVUklDb21wb25lbnQoblt0XSl9YCkpLmpvaW4oIiYiKTt2YXIgbn1jb25zdCBxdD02NDtmdW5jdGlvbiBGdCh0LGUsbj1LKHQuYnVmZmVyU2l6ZXx8cXQpKXtsZXQgcj17fTtyZXR1cm57c2VuZDpmdW5jdGlvbihvKXtjb25zdCBzPVtdO2lmKFEobywoKGUsbik9Pntjb25zdCBvPW50KG4pO2lmKGZ1bmN0aW9uKHQsZSxuPURhdGUubm93KCkpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0W2VdfHx0LmFsbHx8MH0odCxlKT5ufShyLG8pKXtjb25zdCByPUt0KGUsbik7dC5yZWNvcmREcm9wcGVkRXZlbnQoInJhdGVsaW1pdF9iYWNrb2ZmIixvLHIpfWVsc2Ugcy5wdXNoKGUpfSkpLDA9PT1zLmxlbmd0aClyZXR1cm4gcSh7fSk7Y29uc3QgaT1aKG9bMF0scyksYz1lPT57UShpLCgobixyKT0+e2NvbnN0IG89S3QobixyKTt0LnJlY29yZERyb3BwZWRFdmVudChlLG50KHIpLG8pfSkpfTtyZXR1cm4gbi5hZGQoKCgpPT5lKHtib2R5OnR0KGkpfSkudGhlbigodD0+KHZvaWQgMCE9PXQuc3RhdHVzQ29kZSYmKHQuc3RhdHVzQ29kZTwyMDB8fHQuc3RhdHVzQ29kZT49MzAwKSYmaXQmJngud2FybihgU2VudHJ5IHJlc3BvbmRlZCB3aXRoIHN0YXR1cyBjb2RlICR7dC5zdGF0dXNDb2RlfSB0byBzZW50IGV2ZW50LmApLHI9c3Qocix0KSx0KSksKHQ9Pnt0aHJvdyBjKCJuZXR3b3JrX2Vycm9yIiksdH0pKSkpLnRoZW4oKHQ9PnQpLCh0PT57aWYodCBpbnN0YW5jZW9mIGspcmV0dXJuIGl0JiZ4LmVycm9yKCJTa2lwcGVkIHNlbmRpbmcgZXZlbnQgYmVjYXVzZSBidWZmZXIgaXMgZnVsbC4iKSxjKCJxdWV1ZV9vdmVyZmxvdyIpLHEoe30pO3Rocm93IHR9KSl9LGZsdXNoOnQ9Pm4uZHJhaW4odCl9fWZ1bmN0aW9uIEt0KHQsZSl7aWYoImV2ZW50Ij09PWV8fCJ0cmFuc2FjdGlvbiI9PT1lKXJldHVybiBBcnJheS5pc0FycmF5KHQpP3RbMV06dm9pZCAwfWNvbnN0IFZ0PVN5bWJvbCgiQWdlbnRCYXNlSW50ZXJuYWxTdGF0ZSIpO2NsYXNzIFp0IGV4dGVuZHMgcy5BZ2VudHtbVnRdO29wdGlvbnM7a2VlcEFsaXZlO2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXNbVnRdPXt9fWlzU2VjdXJlRW5kcG9pbnQodCl7aWYodCl7aWYoImJvb2xlYW4iPT10eXBlb2YgdC5zZWN1cmVFbmRwb2ludClyZXR1cm4gdC5zZWN1cmVFbmRwb2ludDtpZigic3RyaW5nIj09dHlwZW9mIHQucHJvdG9jb2wpcmV0dXJuImh0dHBzOiI9PT10LnByb3RvY29sfWNvbnN0e3N0YWNrOmV9PW5ldyBFcnJvcjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJmUuc3BsaXQoIlxuIikuc29tZSgodD0+LTEhPT10LmluZGV4T2YoIihodHRwcy5qczoiKXx8LTEhPT10LmluZGV4T2YoIm5vZGU6aHR0cHM6IikpKX1jcmVhdGVTb2NrZXQodCxlLG4pe2NvbnN0IHI9ey4uLmUsc2VjdXJlRW5kcG9pbnQ6dGhpcy5pc1NlY3VyZUVuZHBvaW50KGUpfTtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+dGhpcy5jb25uZWN0KHQscikpKS50aGVuKChvPT57aWYobyBpbnN0YW5jZW9mIHMuQWdlbnQpcmV0dXJuIG8uYWRkUmVxdWVzdCh0LHIpO3RoaXNbVnRdLmN1cnJlbnRTb2NrZXQ9byxzdXBlci5jcmVhdGVTb2NrZXQodCxlLG4pfSksbil9Y3JlYXRlQ29ubmVjdGlvbigpe2NvbnN0IHQ9dGhpc1tWdF0uY3VycmVudFNvY2tldDtpZih0aGlzW1Z0XS5jdXJyZW50U29ja2V0PXZvaWQgMCwhdCl0aHJvdyBuZXcgRXJyb3IoIk5vIHNvY2tldCB3YXMgcmV0dXJuZWQgaW4gdGhlIGBjb25uZWN0KClgIGZ1bmN0aW9uIik7cmV0dXJuIHR9Z2V0IGRlZmF1bHRQb3J0KCl7cmV0dXJuIHRoaXNbVnRdLmRlZmF1bHRQb3J0Pz8oImh0dHBzOiI9PT10aGlzLnByb3RvY29sPzQ0Mzo4MCl9c2V0IGRlZmF1bHRQb3J0KHQpe3RoaXNbVnRdJiYodGhpc1tWdF0uZGVmYXVsdFBvcnQ9dCl9Z2V0IHByb3RvY29sKCl7cmV0dXJuIHRoaXNbVnRdLnByb3RvY29sPz8odGhpcy5pc1NlY3VyZUVuZHBvaW50KCk/Imh0dHBzOiI6Imh0dHA6Iil9c2V0IHByb3RvY29sKHQpe3RoaXNbVnRdJiYodGhpc1tWdF0ucHJvdG9jb2w9dCl9fWZ1bmN0aW9uIFF0KC4uLnQpe3gubG9nKCJbaHR0cHMtcHJveHktYWdlbnQ6cGFyc2UtcHJveHktcmVzcG9uc2VdIiwuLi50KX1mdW5jdGlvbiBYdCh0KXtyZXR1cm4gbmV3IFByb21pc2UoKChlLG4pPT57bGV0IHI9MDtjb25zdCBvPVtdO2Z1bmN0aW9uIHMoKXtjb25zdCBjPXQucmVhZCgpO2M/ZnVuY3Rpb24oYyl7by5wdXNoKGMpLHIrPWMubGVuZ3RoO2NvbnN0IHU9QnVmZmVyLmNvbmNhdChvLHIpLGE9dS5pbmRleE9mKCJcclxuXHJcbiIpO2lmKC0xPT09YSlyZXR1cm4gUXQoImhhdmUgbm90IHJlY2VpdmVkIGVuZCBvZiBIVFRQIGhlYWRlcnMgeWV0Li4uIiksdm9pZCBzKCk7Y29uc3QgZj11LnNsaWNlKDAsYSkudG9TdHJpbmcoImFzY2lpIikuc3BsaXQoIlxyXG4iKSxoPWYuc2hpZnQoKTtpZighaClyZXR1cm4gdC5kZXN0cm95KCksbihuZXcgRXJyb3IoIk5vIGhlYWRlciByZWNlaXZlZCBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2UiKSk7Y29uc3QgcD1oLnNwbGl0KCIgIiksbD0rcFsxXSxkPXAuc2xpY2UoMikuam9pbigiICIpLG09e307Zm9yKGNvbnN0IGUgb2YgZil7aWYoIWUpY29udGludWU7Y29uc3Qgcj1lLmluZGV4T2YoIjoiKTtpZigtMT09PXIpcmV0dXJuIHQuZGVzdHJveSgpLG4obmV3IEVycm9yKGBJbnZhbGlkIGhlYWRlciBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2U6ICIke2V9ImApKTtjb25zdCBvPWUuc2xpY2UoMCxyKS50b0xvd2VyQ2FzZSgpLHM9ZS5zbGljZShyKzEpLnRyaW1TdGFydCgpLGk9bVtvXTsic3RyaW5nIj09dHlwZW9mIGk/bVtvXT1baSxzXTpBcnJheS5pc0FycmF5KGkpP2kucHVzaChzKTptW29dPXN9UXQoImdvdCBwcm94eSBzZXJ2ZXIgcmVzcG9uc2U6ICVvICVvIixoLG0pLGkoKSxlKHtjb25uZWN0OntzdGF0dXNDb2RlOmwsc3RhdHVzVGV4dDpkLGhlYWRlcnM6bX0sYnVmZmVyZWQ6dX0pfShjKTp0Lm9uY2UoInJlYWRhYmxlIixzKX1mdW5jdGlvbiBpKCl7dC5yZW1vdmVMaXN0ZW5lcigiZW5kIixjKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsdSksdC5yZW1vdmVMaXN0ZW5lcigicmVhZGFibGUiLHMpfWZ1bmN0aW9uIGMoKXtpKCksUXQoIm9uZW5kIiksbihuZXcgRXJyb3IoIlByb3h5IGNvbm5lY3Rpb24gZW5kZWQgYmVmb3JlIHJlY2VpdmluZyBDT05ORUNUIHJlc3BvbnNlIikpfWZ1bmN0aW9uIHUodCl7aSgpLFF0KCJvbmVycm9yICVvIix0KSxuKHQpfXQub24oImVycm9yIix1KSx0Lm9uKCJlbmQiLGMpLHMoKX0pKX1mdW5jdGlvbiB0ZSguLi50KXt4LmxvZygiW2h0dHBzLXByb3h5LWFnZW50XSIsLi4udCl9Y2xhc3MgZWUgZXh0ZW5kcyBadHtzdGF0aWMgcHJvdG9jb2xzPVsiaHR0cCIsImh0dHBzIl07cHJveHk7cHJveHlIZWFkZXJzO2Nvbm5lY3RPcHRzO2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoZSksdGhpcy5vcHRpb25zPXt9LHRoaXMucHJveHk9InN0cmluZyI9PXR5cGVvZiB0P25ldyBVUkwodCk6dCx0aGlzLnByb3h5SGVhZGVycz1lPy5oZWFkZXJzPz97fSx0ZSgiQ3JlYXRpbmcgbmV3IEh0dHBzUHJveHlBZ2VudCBpbnN0YW5jZTogJW8iLHRoaXMucHJveHkuaHJlZik7Y29uc3Qgbj0odGhpcy5wcm94eS5ob3N0bmFtZXx8dGhpcy5wcm94eS5ob3N0KS5yZXBsYWNlKC9eXFt8XF0kL2csIiIpLHI9dGhpcy5wcm94eS5wb3J0P3BhcnNlSW50KHRoaXMucHJveHkucG9ydCwxMCk6Imh0dHBzOiI9PT10aGlzLnByb3h5LnByb3RvY29sPzQ0Mzo4MDt0aGlzLmNvbm5lY3RPcHRzPXtBTFBOUHJvdG9jb2xzOlsiaHR0cC8xLjEiXSwuLi5lP3JlKGUsImhlYWRlcnMiKTpudWxsLGhvc3Q6bixwb3J0OnJ9fWFzeW5jIGNvbm5lY3QodCxlKXtjb25zdHtwcm94eTpufT10aGlzO2lmKCFlLmhvc3QpdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gImhvc3QiIHByb3ZpZGVkJyk7bGV0IHI7aWYoImh0dHBzOiI9PT1uLnByb3RvY29sKXt0ZSgiQ3JlYXRpbmcgYHRscy5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cyk7Y29uc3QgdD10aGlzLmNvbm5lY3RPcHRzLnNlcnZlcm5hbWV8fHRoaXMuY29ubmVjdE9wdHMuaG9zdDtyPWYuY29ubmVjdCh7Li4udGhpcy5jb25uZWN0T3B0cyxzZXJ2ZXJuYW1lOnQmJmEuaXNJUCh0KT92b2lkIDA6dH0pfWVsc2UgdGUoIkNyZWF0aW5nIGBuZXQuU29ja2V0YDogJW8iLHRoaXMuY29ubmVjdE9wdHMpLHI9YS5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO2NvbnN0IG89ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucHJveHlIZWFkZXJzP3RoaXMucHJveHlIZWFkZXJzKCk6ey4uLnRoaXMucHJveHlIZWFkZXJzfSxzPWEuaXNJUHY2KGUuaG9zdCk/YFske2UuaG9zdH1dYDplLmhvc3Q7bGV0IGk9YENPTk5FQ1QgJHtzfToke2UucG9ydH0gSFRUUC8xLjFcclxuYDtpZihuLnVzZXJuYW1lfHxuLnBhc3N3b3JkKXtjb25zdCB0PWAke2RlY29kZVVSSUNvbXBvbmVudChuLnVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQobi5wYXNzd29yZCl9YDtvWyJQcm94eS1BdXRob3JpemF0aW9uIl09YEJhc2ljICR7QnVmZmVyLmZyb20odCkudG9TdHJpbmcoImJhc2U2NCIpfWB9by5Ib3N0PWAke3N9OiR7ZS5wb3J0fWAsb1siUHJveHktQ29ubmVjdGlvbiJdfHwob1siUHJveHktQ29ubmVjdGlvbiJdPXRoaXMua2VlcEFsaXZlPyJLZWVwLUFsaXZlIjoiY2xvc2UiKTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhvKSlpKz1gJHt0fTogJHtvW3RdfVxyXG5gO2NvbnN0IGM9WHQocik7ci53cml0ZShgJHtpfVxyXG5gKTtjb25zdHtjb25uZWN0OnUsYnVmZmVyZWQ6aH09YXdhaXQgYztpZih0LmVtaXQoInByb3h5Q29ubmVjdCIsdSksdGhpcy5lbWl0KCJwcm94eUNvbm5lY3QiLHUsdCksMjAwPT09dS5zdGF0dXNDb2RlKXtpZih0Lm9uY2UoInNvY2tldCIsbmUpLGUuc2VjdXJlRW5kcG9pbnQpe3RlKCJVcGdyYWRpbmcgc29ja2V0IGNvbm5lY3Rpb24gdG8gVExTIik7Y29uc3QgdD1lLnNlcnZlcm5hbWV8fGUuaG9zdDtyZXR1cm4gZi5jb25uZWN0KHsuLi5yZShlLCJob3N0IiwicGF0aCIsInBvcnQiKSxzb2NrZXQ6cixzZXJ2ZXJuYW1lOmEuaXNJUCh0KT92b2lkIDA6dH0pfXJldHVybiByfXIuZGVzdHJveSgpO2NvbnN0IHA9bmV3IGEuU29ja2V0KHt3cml0YWJsZTohMX0pO3JldHVybiBwLnJlYWRhYmxlPSEwLHQub25jZSgic29ja2V0IiwodD0+e3RlKCJSZXBsYXlpbmcgcHJveHkgYnVmZmVyIGZvciBmYWlsZWQgcmVxdWVzdCIpLHQucHVzaChoKSx0LnB1c2gobnVsbCl9KSkscH19ZnVuY3Rpb24gbmUodCl7dC5yZXN1bWUoKX1mdW5jdGlvbiByZSh0LC4uLmUpe2NvbnN0IG49e307bGV0IHI7Zm9yKHIgaW4gdCllLmluY2x1ZGVzKHIpfHwobltyXT10W3JdKTtyZXR1cm4gbn1jb25zdCBvZT0zMjc2ODtmdW5jdGlvbiBzZSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9eW0EtWl06LywiIikucmVwbGFjZSgvXFwvZywiLyIpfWNvbnN0IGllPWU7bGV0IGNlLHVlPSExO2Z1bmN0aW9uIGFlKHQpe2llLmRlYnVnJiZjb25zb2xlLmxvZyhgW0FOUiBXb3JrZXJdICR7dH1gKX12YXIgZmUsaGUscGU7Y29uc3QgbGU9ZnVuY3Rpb24odCl7bGV0IGU7dHJ5e2U9bmV3IFVSTCh0LnVybCl9Y2F0Y2goZSl7cmV0dXJuIEUoKCgpPT57Y29uc29sZS53YXJuKCJbQHNlbnRyeS9ub2RlXTogSW52YWxpZCBkc24gb3IgdHVubmVsIG9wdGlvbiwgd2lsbCBub3Qgc2VuZCBhbnkgZXZlbnRzLiBUaGUgdHVubmVsIG9wdGlvbiBtdXN0IGJlIGEgZnVsbCBVUkwgd2hlbiB1c2VkLiIpfSkpLEZ0KHQsKCgpPT5Qcm9taXNlLnJlc29sdmUoe30pKSl9Y29uc3Qgbj0iaHR0cHM6Ij09PWUucHJvdG9jb2wscj1mdW5jdGlvbih0LGUpe2NvbnN0e25vX3Byb3h5Om59PXByb2Nlc3MuZW52O3JldHVybiBuJiZuLnNwbGl0KCIsIikuc29tZSgoZT0+dC5ob3N0LmVuZHNXaXRoKGUpfHx0Lmhvc3RuYW1lLmVuZHNXaXRoKGUpKSk/dm9pZCAwOmV9KGUsdC5wcm94eXx8KG4/cHJvY2Vzcy5lbnYuaHR0cHNfcHJveHk6dm9pZCAwKXx8cHJvY2Vzcy5lbnYuaHR0cF9wcm94eSksbz1uP2k6cyxhPXZvaWQgMCE9PXQua2VlcEFsaXZlJiZ0LmtlZXBBbGl2ZSxmPXI/bmV3IGVlKHIpOm5ldyBvLkFnZW50KHtrZWVwQWxpdmU6YSxtYXhTb2NrZXRzOjMwLHRpbWVvdXQ6MmUzfSk7cmV0dXJuIHp0KCgoKT0+e2NvbnN0IGU9ZnVuY3Rpb24odCxlLG4pe2NvbnN0e2hvc3RuYW1lOnIscGF0aG5hbWU6byxwb3J0OnMscHJvdG9jb2w6aSxzZWFyY2g6YX09bmV3IFVSTCh0LnVybCk7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBuZXcgUHJvbWlzZSgoKGgscCk9PntsZXQgbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGMoe3JlYWQoKXt0aGlzLnB1c2godCksdGhpcy5wdXNoKG51bGwpfX0pfShmLmJvZHkpO2NvbnN0IGQ9ey4uLnQuaGVhZGVyc307Zi5ib2R5Lmxlbmd0aD5vZSYmKGRbImNvbnRlbnQtZW5jb2RpbmciXT0iZ3ppcCIsbD1sLnBpcGUodSgpKSk7Y29uc3QgbT1lLnJlcXVlc3Qoe21ldGhvZDoiUE9TVCIsYWdlbnQ6bixoZWFkZXJzOmQsaG9zdG5hbWU6cixwYXRoOmAke299JHthfWAscG9ydDpzLHByb3RvY29sOmksY2E6dC5jYUNlcnRzfSwodD0+e3Qub24oImRhdGEiLCgoKT0+e30pKSx0Lm9uKCJlbmQiLCgoKT0+e30pKSx0LnNldEVuY29kaW5nKCJ1dGY4Iik7Y29uc3QgZT10LmhlYWRlcnNbInJldHJ5LWFmdGVyIl0/P251bGwsbj10LmhlYWRlcnNbIngtc2VudHJ5LXJhdGUtbGltaXRzIl0/P251bGw7aCh7c3RhdHVzQ29kZTp0LnN0YXR1c0NvZGUsaGVhZGVyczp7InJldHJ5LWFmdGVyIjplLCJ4LXNlbnRyeS1yYXRlLWxpbWl0cyI6QXJyYXkuaXNBcnJheShuKT9uWzBdOm59fSl9KSk7bS5vbigiZXJyb3IiLHApLGwucGlwZShtKX0pKX19KHQsdC5odHRwTW9kdWxlPz9vLGYpO3JldHVybiBGdCh0LGUpfSkpfSh7dXJsOihmZT1pZS5kc24saGU9aWUudHVubmVsLHBlPWllLnNka01ldGFkYXRhLnNkayxoZXx8YCR7ZnVuY3Rpb24odCl7cmV0dXJuYCR7ZnVuY3Rpb24odCl7Y29uc3QgZT10LnByb3RvY29sP2Ake3QucHJvdG9jb2x9OmA6IiIsbj10LnBvcnQ/YDoke3QucG9ydH1gOiIiO3JldHVybmAke2V9Ly8ke3QuaG9zdH0ke259JHt0LnBhdGg/YC8ke3QucGF0aH1gOiIifS9hcGkvYH0odCl9JHt0LnByb2plY3RJZH0vZW52ZWxvcGUvYH0oZmUpfT8ke1l0KGZlLHBlKX1gKSxyZWNvcmREcm9wcGVkRXZlbnQ6KCk9Pnt9fSk7YXN5bmMgZnVuY3Rpb24gZGUoKXtpZihjZSl7YWUoIlNlbmRpbmcgYWJub3JtYWwgc2Vzc2lvbiIpLGZ0KGNlLHtzdGF0dXM6ImFibm9ybWFsIixhYm5vcm1hbF9tZWNoYW5pc206ImFucl9mb3JlZ3JvdW5kIn0pO2NvbnN0IGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3Qgbz1ydChuKTtyZXR1cm4gWih7c2VudF9hdDoobmV3IERhdGUpLnRvSVNPU3RyaW5nKCksLi4ubyYme3NkazpvfSwuLi4hIXImJmUmJntkc246TihlKX19LFsiYWdncmVnYXRlcyJpbiB0P1t7dHlwZToic2Vzc2lvbnMifSx0XTpbe3R5cGU6InNlc3Npb24ifSx0LnRvSlNPTigpXV0pfShjZSxpZS5kc24saWUuc2RrTWV0YWRhdGEsaWUudHVubmVsKTthZShKU09OLnN0cmluZ2lmeShlKSksYXdhaXQgbGUuc2VuZChlKTt0cnl7dD8ucG9zdE1lc3NhZ2UoInNlc3Npb24tZW5kZWQiKX1jYXRjaCh0KXt9fX1mdW5jdGlvbiBtZSh0KXtpZighdClyZXR1cm47Y29uc3QgZT1mdW5jdGlvbih0KXtpZighdC5sZW5ndGgpcmV0dXJuW107Y29uc3QgZT1BcnJheS5mcm9tKHQpO3JldHVybi9zZW50cnlXcmFwcGVkLy50ZXN0KGVbZS5sZW5ndGgtMV0uZnVuY3Rpb258fCIiKSYmZS5wb3AoKSxlLnJldmVyc2UoKSxJLnRlc3QoZVtlLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiYoZS5wb3AoKSxJLnRlc3QoZVtlLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiZlLnBvcCgpKSxlLnNsaWNlKDAsUikubWFwKCh0PT4oey4uLnQsZmlsZW5hbWU6dC5maWxlbmFtZXx8ZVtlLmxlbmd0aC0xXS5maWxlbmFtZSxmdW5jdGlvbjp0LmZ1bmN0aW9ufHxBfSkpKX0odCk7aWYoaWUuYXBwUm9vdFBhdGgpZm9yKGNvbnN0IHQgb2YgZSl0LmZpbGVuYW1lJiYodC5maWxlbmFtZT16KHQuZmlsZW5hbWUsaWUuYXBwUm9vdFBhdGgpKTtyZXR1cm4gZX1hc3luYyBmdW5jdGlvbiBnZSh0LGUpe2lmKHVlKXJldHVybjt1ZT0hMCxhd2FpdCBkZSgpLGFlKCJTZW5kaW5nIGV2ZW50Iik7Y29uc3Qgbj17ZXZlbnRfaWQ6QigpLGNvbnRleHRzOmllLmNvbnRleHRzLHJlbGVhc2U6aWUucmVsZWFzZSxlbnZpcm9ubWVudDppZS5lbnZpcm9ubWVudCxkaXN0OmllLmRpc3QscGxhdGZvcm06Im5vZGUiLGxldmVsOiJlcnJvciIsZXhjZXB0aW9uOnt2YWx1ZXM6W3t0eXBlOiJBcHBsaWNhdGlvbk5vdFJlc3BvbmRpbmciLHZhbHVlOmBBcHBsaWNhdGlvbiBOb3QgUmVzcG9uZGluZyBmb3IgYXQgbGVhc3QgJHtpZS5hbnJUaHJlc2hvbGR9IG1zYCxzdGFja3RyYWNlOntmcmFtZXM6bWUodCl9LG1lY2hhbmlzbTp7dHlwZToiQU5SIn19XX0sdGFnczppZS5zdGF0aWNUYWdzfTtlJiZmdW5jdGlvbih0LGUpe2lmKEh0KHQsZSksIXQuY29udGV4dHM/LnRyYWNlKXtjb25zdHt0cmFjZUlkOm4sc3BhbklkOnIscGFyZW50U3BhbklkOm99PWUucHJvcGFnYXRpb25Db250ZXh0O3QuY29udGV4dHM9e3RyYWNlOnt0cmFjZV9pZDpuLHNwYW5faWQ6cixwYXJlbnRfc3Bhbl9pZDpvfSwuLi50LmNvbnRleHRzfX19KG4sZSk7Y29uc3Qgcj1HdChuLGllLmRzbixpZS5zZGtNZXRhZGF0YSxpZS50dW5uZWwpO2FlKEpTT04uc3RyaW5naWZ5KHIpKSxhd2FpdCBsZS5zZW5kKHIpLGF3YWl0IGxlLmZsdXNoKDJlMyksc2V0VGltZW91dCgoKCk9Pntwcm9jZXNzLmV4aXQoMCl9KSw1ZTMpfWxldCB5ZTtpZihhZSgiU3RhcnRlZCIpLGllLmNhcHR1cmVTdGFja1RyYWNlKXthZSgiQ29ubmVjdGluZyB0byBkZWJ1Z2dlciIpO2NvbnN0IHQ9bmV3IG47dC5jb25uZWN0VG9NYWluVGhyZWFkKCksYWUoIkNvbm5lY3RlZCB0byBkZWJ1Z2dlciIpO2NvbnN0IGU9bmV3IE1hcDt0Lm9uKCJEZWJ1Z2dlci5zY3JpcHRQYXJzZWQiLCh0PT57ZS5zZXQodC5wYXJhbXMuc2NyaXB0SWQsdC5wYXJhbXMudXJsKX0pKSx0Lm9uKCJEZWJ1Z2dlci5wYXVzZWQiLChuPT57aWYoIm90aGVyIj09PW4ucGFyYW1zLnJlYXNvbil0cnl7YWUoIkRlYnVnZ2VyIHBhdXNlZCIpO2NvbnN0IHM9Wy4uLm4ucGFyYW1zLmNhbGxGcmFtZXNdLGk9aWUuYXBwUm9vdFBhdGg/ZnVuY3Rpb24odD0ocHJvY2Vzcy5hcmd2WzFdP1cocHJvY2Vzcy5hcmd2WzFdKTpwcm9jZXNzLmN3ZCgpKSxlPSJcXCI9PT1vKXtjb25zdCBuPWU/c2UodCk6dDtyZXR1cm4gdD0+e2lmKCF0KXJldHVybjtjb25zdCBvPWU/c2UodCk6dDtsZXR7ZGlyOnMsYmFzZTppLGV4dDpjfT1yLnBhcnNlKG8pOyIuanMiIT09YyYmIi5tanMiIT09YyYmIi5janMiIT09Y3x8KGk9aS5zbGljZSgwLC0xKmMubGVuZ3RoKSksc3x8KHM9Ii4iKTtjb25zdCB1PXMubGFzdEluZGV4T2YoIi9ub2RlX21vZHVsZXMiKTtpZih1Pi0xKXJldHVybmAke3Muc2xpY2UodSsxNCkucmVwbGFjZSgvXC8vZywiLiIpfToke2l9YDtpZihzLnN0YXJ0c1dpdGgobikpe2xldCB0PXMuc2xpY2Uobi5sZW5ndGgrMSkucmVwbGFjZSgvXC8vZywiLiIpO3JldHVybiB0JiYodCs9IjoiKSx0Kz1pLHR9cmV0dXJuIGl9fShpZS5hcHBSb290UGF0aCk6KCk9Pnt9LGM9cy5tYXAoKHQ9PmZ1bmN0aW9uKHQsZSxuKXtjb25zdCByPWU/ZS5yZXBsYWNlKC9eZmlsZTpcL1wvLywiIik6dm9pZCAwLG89dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXI/dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXIrMTp2b2lkIDAscz10LmxvY2F0aW9uLmxpbmVOdW1iZXI/dC5sb2NhdGlvbi5saW5lTnVtYmVyKzE6dm9pZCAwO3JldHVybiBPKHtmaWxlbmFtZTpyLG1vZHVsZTpuKHIpLGZ1bmN0aW9uOnQuZnVuY3Rpb25OYW1lfHxBLGNvbG5vOm8sbGluZW5vOnMsaW5fYXBwOnI/VihyKTp2b2lkIDB9KX0odCxlLmdldCh0LmxvY2F0aW9uLnNjcmlwdElkKSxpKSkpLHU9c2V0VGltZW91dCgoKCk9PntnZShjKS50aGVuKG51bGwsKCgpPT57YWUoIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pKX0pLDVlMyk7dC5wb3N0KCJSdW50aW1lLmV2YWx1YXRlIix7ZXhwcmVzc2lvbjoiZ2xvYmFsLl9fU0VOVFJZX0dFVF9TQ09QRVNfXygpOyIsc2lsZW50OiEwLHJldHVybkJ5VmFsdWU6ITB9LCgoZSxuKT0+e2UmJmFlKGBFcnJvciBleGVjdXRpbmcgc2NyaXB0OiAnJHtlLm1lc3NhZ2V9J2ApLGNsZWFyVGltZW91dCh1KTtjb25zdCByPW4mJm4ucmVzdWx0P24ucmVzdWx0LnZhbHVlOnZvaWQgMDt0LnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLHQucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLGdlKGMscikudGhlbihudWxsLCgoKT0+e2FlKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQuIil9KSl9KSl9Y2F0Y2goZSl7dGhyb3cgdC5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKSx0LnBvc3QoIkRlYnVnZ2VyLmRpc2FibGUiKSxlfX0pKSx5ZT0oKT0+e3RyeXt0LnBvc3QoIkRlYnVnZ2VyLmVuYWJsZSIsKCgpPT57dC5wb3N0KCJEZWJ1Z2dlci5wYXVzZSIpfSkpfWNhdGNoKHQpe319fWNvbnN0e3BvbGw6YmV9PWZ1bmN0aW9uKHQsZSxuLHIpe2NvbnN0IG89dCgpO2xldCBzPSExLGk9ITA7cmV0dXJuIHNldEludGVydmFsKCgoKT0+e2NvbnN0IHQ9by5nZXRUaW1lTXMoKTshMT09PXMmJnQ+ZStuJiYocz0hMCxpJiZyKCkpLHQ8ZStuJiYocz0hMSl9KSwyMCkse3BvbGw6KCk9PntvLnJlc2V0KCl9LGVuYWJsZWQ6dD0+e2k9dH19fSgoZnVuY3Rpb24oKXtsZXQgdD1wcm9jZXNzLmhydGltZSgpO3JldHVybntnZXRUaW1lTXM6KCk9Pntjb25zdFtlLG5dPXByb2Nlc3MuaHJ0aW1lKHQpO3JldHVybiBNYXRoLmZsb29yKDFlMyplK24vMWU2KX0scmVzZXQ6KCk9Pnt0PXByb2Nlc3MuaHJ0aW1lKCl9fX0pLGllLnBvbGxJbnRlcnZhbCxpZS5hbnJUaHJlc2hvbGQsKGZ1bmN0aW9uKCl7YWUoIldhdGNoZG9nIHRpbWVvdXQiKSx5ZT8oYWUoIlBhdXNpbmcgZGVidWdnZXIgdG8gY2FwdHVyZSBzdGFjayB0cmFjZSIpLHllKCkpOihhZSgiQ2FwdHVyaW5nIGV2ZW50IHdpdGhvdXQgYSBzdGFjayB0cmFjZSIpLGdlKCkudGhlbihudWxsLCgoKT0+e2FlKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQgb24gd2F0Y2hkb2cgdGltZW91dC4iKX0pKSl9KSk7dD8ub24oIm1lc3NhZ2UiLCh0PT57dC5zZXNzaW9uJiYoY2U9YXQodC5zZXNzaW9uKSksYmUoKX0pKTs=';

@@ -157,3 +157,3 @@ const DEFAULT_INTERVAL = 50;

const worker = new worker_threads.Worker(new URL(`data:application/javascript;base64,${base64WorkerScript}`), {
const worker = new node_worker_threads.Worker(new URL(`data:application/javascript;base64,${base64WorkerScript}`), {
workerData: options,

@@ -160,0 +160,0 @@ // We don't want any Node args to be passed to the worker

Object.defineProperty(exports, '__esModule', { value: true });
const util = require('util');
const util = require('node:util');
const core = require('@sentry/core');

@@ -5,0 +5,0 @@ const utils = require('@sentry/utils');

@@ -7,12 +7,17 @@ var {

const child_process = require('child_process');
const fs = require('fs');
const os = require('os');
const path = require('path');
const util = require('util');
const node_child_process = require('node:child_process');
const node_fs = require('node:fs');
const os = require('node:os');
const node_path = require('node:path');
const util = require('node:util');
const core = require('@sentry/core');
const readFileAsync = util.promisify(fs.readFile);
const readDirAsync = util.promisify(fs.readdir);
/* eslint-disable max-lines */
const readFileAsync = util.promisify(node_fs.readFile);
const readDirAsync = util.promisify(node_fs.readdir);
// Process enhanced with methods from Node 18, 20, 22 as @types/node
// is on `14.18.0` to match minimum version requirements of the SDK
const INTEGRATION_NAME = 'Context';

@@ -101,2 +106,3 @@

// Only update properties if they exist
if (_optionalChain([contexts, 'optionalAccess', _11 => _11.app, 'optionalAccess', _12 => _12.app_memory])) {

@@ -106,3 +112,10 @@ contexts.app.app_memory = process.memoryUsage().rss;

if (_optionalChain([contexts, 'optionalAccess', _13 => _13.device, 'optionalAccess', _14 => _14.free_memory])) {
if (_optionalChain([contexts, 'optionalAccess', _13 => _13.app, 'optionalAccess', _14 => _14.free_memory]) && typeof (process ).availableMemory === 'function') {
const freeMemory = _optionalChain([(process ), 'access', _15 => _15.availableMemory, 'optionalCall', _16 => _16()]);
if (freeMemory != null) {
contexts.app.free_memory = freeMemory;
}
}
if (_optionalChain([contexts, 'optionalAccess', _17 => _17.device, 'optionalAccess', _18 => _18.free_memory])) {
contexts.device.free_memory = os.freemem();

@@ -172,7 +185,19 @@ }

/**
* Get app context information from process
*/
function getAppContext() {
const app_memory = process.memoryUsage().rss;
const app_start_time = new Date(Date.now() - process.uptime() * 1000).toISOString();
// https://nodejs.org/api/process.html#processavailablememory
const appContext = { app_start_time, app_memory };
return { app_start_time, app_memory };
if (typeof (process ).availableMemory === 'function') {
const freeMemory = _optionalChain([(process ), 'access', _19 => _19.availableMemory, 'optionalCall', _20 => _20()]);
if (freeMemory != null) {
appContext.free_memory = freeMemory;
}
}
return appContext;
}

@@ -292,3 +317,3 @@

const output = await new Promise((resolve, reject) => {
child_process.execFile('/usr/bin/sw_vers', (error, stdout) => {
node_child_process.execFile('/usr/bin/sw_vers', (error, stdout) => {
if (error) {

@@ -344,3 +369,3 @@ reject(error);

// hold on to it for a very short amount of time.
const distroPath = path.join('/etc', distroFile.name);
const distroPath = node_path.join('/etc', distroFile.name);
const contents = ((await readFileAsync(distroPath, { encoding: 'utf-8' })) ).toLowerCase();

@@ -437,2 +462,3 @@

exports.getAppContext = getAppContext;
exports.getDeviceContext = getDeviceContext;

@@ -439,0 +465,0 @@ exports.nodeContextIntegration = nodeContextIntegration;

@@ -7,3 +7,3 @@ var {

const fs = require('fs');
const node_fs = require('node:fs');
const core = require('@sentry/core');

@@ -16,3 +16,3 @@ const utils = require('@sentry/utils');

const readFileAsync = fs.promises.readFile;
const readFileAsync = node_fs.promises.readFile;

@@ -19,0 +19,0 @@ /** Exported only for tests, as a type-safe variant. */

@@ -7,3 +7,2 @@ var {

const api = require('@opentelemetry/api');
const instrumentationHttp = require('@opentelemetry/instrumentation-http');

@@ -98,7 +97,3 @@ const opentelemetry = require('@sentry/opentelemetry');

},
responseHook: (span, res) => {
if (_breadcrumbs) {
_addRequestBreadcrumb(span, res);
}
responseHook: () => {
const client = opentelemetry.getClient();

@@ -111,2 +106,11 @@ if (client && client.getOptions().autoSessionTracking) {

},
applyCustomAttributesOnSpan: (
_span,
request,
response,
) => {
if (_breadcrumbs) {
_addRequestBreadcrumb(request, response);
}
},
}),

@@ -125,8 +129,12 @@ );

/** Add a breadcrumb for outgoing requests. */
function _addRequestBreadcrumb(span, response) {
if (opentelemetry.getSpanKind(span) !== api.SpanKind.CLIENT) {
function _addRequestBreadcrumb(
request,
response,
) {
// Only generate breadcrumbs for outgoing requests
if (!_isClientRequest(request)) {
return;
}
const data = opentelemetry.getRequestSpanData(span);
const data = getBreadcrumbData(request);
core.addBreadcrumb(

@@ -143,5 +151,3 @@ {

event: 'response',
// TODO FN: Do we need access to `request` here?
// If we do, we'll have to use the `applyCustomAttributesOnSpan` hook instead,
// but this has worse context semantics than request/responseHook.
request,
response,

@@ -152,2 +158,27 @@ },

function getBreadcrumbData(request) {
try {
// `request.host` does not contain the port, but the host header does
const host = request.getHeader('host') || request.host;
const url = new URL(request.path, `${request.protocol}//${host}`);
const parsedUrl = utils.parseUrl(url.toString());
const data = {
url: utils.getSanitizedUrlString(parsedUrl),
'http.method': request.method || 'GET',
};
if (parsedUrl.search) {
data['http.query'] = parsedUrl.search;
}
if (parsedUrl.hash) {
data['http.fragment'] = parsedUrl.hash;
}
return data;
} catch (e) {
return {};
}
}
/**

@@ -154,0 +185,0 @@ * Determines if @param req is a ClientRequest, meaning the request was created within the express app

@@ -7,9 +7,9 @@ var {

const node_worker_threads = require('node:worker_threads');
const core = require('@sentry/core');
const utils = require('@sentry/utils');
const worker_threads = require('worker_threads');
const common = require('./common.js');
// This string is a placeholder that gets overwritten with the worker code.
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZSA4LjIuMSAoYmIyZjFiYykgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIGV9ZnJvbSJub2RlOmluc3BlY3Rvci9wcm9taXNlcyI7aW1wb3J0e3dvcmtlckRhdGEgYXMgbixwYXJlbnRQb3J0IGFzIHR9ZnJvbSJ3b3JrZXJfdGhyZWFkcyI7aW1wb3J0e3Bvc2l4IGFzIG8sc2VwIGFzIHJ9ZnJvbSJwYXRoIjtjb25zdCBpPTUwLHM9Ij8iLGM9L1woZXJyb3I6ICguKilcKS8sYT0vY2FwdHVyZU1lc3NhZ2V8Y2FwdHVyZUV4Y2VwdGlvbi87Y29uc3QgdT0vXihcUys6XFx8XC8/KShbXHNcU10qPykoKD86XC57MSwyfXxbXi9cXF0rP3wpKFwuW14uL1xcXSp8KSkoPzpbL1xcXSopJC87ZnVuY3Rpb24gZihlKXtjb25zdCBuPWZ1bmN0aW9uKGUpe2NvbnN0IG49ZS5sZW5ndGg+MTAyND9gPHRydW5jYXRlZD4ke2Uuc2xpY2UoLTEwMjQpfWA6ZSx0PXUuZXhlYyhuKTtyZXR1cm4gdD90LnNsaWNlKDEpOltdfShlKSx0PW5bMF07bGV0IG89blsxXTtyZXR1cm4gdHx8bz8obyYmKG89by5zbGljZSgwLG8ubGVuZ3RoLTEpKSx0K28pOiIuIn1mdW5jdGlvbiBsKGUsbj0hMSl7cmV0dXJuIShufHxlJiYhZS5zdGFydHNXaXRoKCIvIikmJiFlLm1hdGNoKC9eW0EtWl06LykmJiFlLnN0YXJ0c1dpdGgoIi4iKSYmIWUubWF0Y2goL15bYS16QS1aXShbYS16QS1aMC05LlwtK10pKjpcL1wvLykpJiZ2b2lkIDAhPT1lJiYhZS5pbmNsdWRlcygibm9kZV9tb2R1bGVzLyIpfWZ1bmN0aW9uIGQoZSl7Y29uc3Qgbj0vXlxzKlstXXs0LH0kLyx0PS9hdCAoPzphc3luYyApPyg/OiguKz8pXHMrXCgpPyg/OiguKyk6KFxkKyk6KFxkKyk/fChbXildKykpXCk/LztyZXR1cm4gbz0+e2NvbnN0IHI9by5tYXRjaCh0KTtpZihyKXtsZXQgbix0LG8saSxjO2lmKHJbMV0pe289clsxXTtsZXQgZT1vLmxhc3RJbmRleE9mKCIuIik7aWYoIi4iPT09b1tlLTFdJiZlLS0sZT4wKXtuPW8uc2xpY2UoMCxlKSx0PW8uc2xpY2UoZSsxKTtjb25zdCByPW4uaW5kZXhPZigiLk1vZHVsZSIpO3I+MCYmKG89by5zbGljZShyKzEpLG49bi5zbGljZSgwLHIpKX1pPXZvaWQgMH10JiYoaT1uLGM9dCksIjxhbm9ueW1vdXM+Ij09PXQmJihjPXZvaWQgMCxvPXZvaWQgMCksdm9pZCAwPT09byYmKGM9Y3x8cyxvPWk/YCR7aX0uJHtjfWA6Yyk7bGV0IGE9clsyXSYmclsyXS5zdGFydHNXaXRoKCJmaWxlOi8vIik/clsyXS5zbGljZSg3KTpyWzJdO2NvbnN0IHU9Im5hdGl2ZSI9PT1yWzVdO3JldHVybiBhJiZhLm1hdGNoKC9cL1tBLVpdOi8pJiYoYT1hLnNsaWNlKDEpKSxhfHwhcls1XXx8dXx8KGE9cls1XSkse2ZpbGVuYW1lOmEsbW9kdWxlOmU/ZShhKTp2b2lkIDAsZnVuY3Rpb246byxsaW5lbm86cGFyc2VJbnQoclszXSwxMCl8fHZvaWQgMCxjb2xubzpwYXJzZUludChyWzRdLDEwKXx8dm9pZCAwLGluX2FwcDpsKGEsdSl9fWlmKG8ubWF0Y2gobikpcmV0dXJue2ZpbGVuYW1lOm99fX1mdW5jdGlvbiBwKGUpe3JldHVybiBlLnJlcGxhY2UoL15bQS1aXTovLCIiKS5yZXBsYWNlKC9cXC9nLCIvIil9Y29uc3QgZz1uLG09ZnVuY3Rpb24oLi4uZSl7Y29uc3Qgbj1lLnNvcnQoKChlLG4pPT5lWzBdLW5bMF0pKS5tYXAoKGU9PmVbMV0pKTtyZXR1cm4oZSx0PTAsbz0wKT0+e2NvbnN0IHI9W10sdT1lLnNwbGl0KCJcbiIpO2ZvcihsZXQgZT10O2U8dS5sZW5ndGg7ZSsrKXtjb25zdCB0PXVbZV07aWYodC5sZW5ndGg+MTAyNCljb250aW51ZTtjb25zdCBzPWMudGVzdCh0KT90LnJlcGxhY2UoYywiJDEiKTp0O2lmKCFzLm1hdGNoKC9cUypFcnJvcjogLykpe2Zvcihjb25zdCBlIG9mIG4pe2NvbnN0IG49ZShzKTtpZihuKXtyLnB1c2gobik7YnJlYWt9fWlmKHIubGVuZ3RoPj1pK28pYnJlYWt9fXJldHVybiBmdW5jdGlvbihlKXtpZighZS5sZW5ndGgpcmV0dXJuW107Y29uc3Qgbj1BcnJheS5mcm9tKGUpOy9zZW50cnlXcmFwcGVkLy50ZXN0KG5bbi5sZW5ndGgtMV0uZnVuY3Rpb258fCIiKSYmbi5wb3AoKTtuLnJldmVyc2UoKSxhLnRlc3QobltuLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiYobi5wb3AoKSxhLnRlc3QobltuLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiZuLnBvcCgpKTtyZXR1cm4gbi5zbGljZSgwLGkpLm1hcCgoZT0+KHsuLi5lLGZpbGVuYW1lOmUuZmlsZW5hbWV8fG5bbi5sZW5ndGgtMV0uZmlsZW5hbWUsZnVuY3Rpb246ZS5mdW5jdGlvbnx8c30pKSl9KHIuc2xpY2UobykpfX0oWzkwLGQoZnVuY3Rpb24oZT0ocHJvY2Vzcy5hcmd2WzFdP2YocHJvY2Vzcy5hcmd2WzFdKTpwcm9jZXNzLmN3ZCgpKSxuPSJcXCI9PT1yKXtjb25zdCB0PW4/cChlKTplO3JldHVybiBlPT57aWYoIWUpcmV0dXJuO2NvbnN0IHI9bj9wKGUpOmU7bGV0e2RpcjppLGJhc2U6cyxleHQ6Y309by5wYXJzZShyKTsiLmpzIiE9PWMmJiIubWpzIiE9PWMmJiIuY2pzIiE9PWN8fChzPXMuc2xpY2UoMCwtMSpjLmxlbmd0aCkpLGl8fChpPSIuIik7Y29uc3QgYT1pLmxhc3RJbmRleE9mKCIvbm9kZV9tb2R1bGVzIik7aWYoYT4tMSlyZXR1cm5gJHtpLnNsaWNlKGErMTQpLnJlcGxhY2UoL1wvL2csIi4iKX06JHtzfWA7aWYoaS5zdGFydHNXaXRoKHQpKXtsZXQgZT1pLnNsaWNlKHQubGVuZ3RoKzEpLnJlcGxhY2UoL1wvL2csIi4iKTtyZXR1cm4gZSYmKGUrPSI6IiksZSs9cyxlfXJldHVybiBzfX0oZy5iYXNlUGF0aCkpXSk7ZnVuY3Rpb24gYiguLi5lKXtnLmRlYnVnJiZjb25zb2xlLmxvZygiW0xvY2FsVmFyaWFibGVzIFdvcmtlcl0iLC4uLmUpfWFzeW5jIGZ1bmN0aW9uIHYoZSxuLHQsbyl7Y29uc3Qgcj1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOm4sb3duUHJvcGVydGllczohMH0pO29bdF09ci5yZXN1bHQuZmlsdGVyKChlPT4ibGVuZ3RoIiE9PWUubmFtZSYmIWlzTmFOKHBhcnNlSW50KGUubmFtZSwxMCkpKSkuc29ydCgoKGUsbik9PnBhcnNlSW50KGUubmFtZSwxMCktcGFyc2VJbnQobi5uYW1lLDEwKSkpLm1hcCgoZT0+ZS52YWx1ZT8udmFsdWUpKX1hc3luYyBmdW5jdGlvbiAkKGUsbix0LG8pe2NvbnN0IHI9YXdhaXQgZS5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLHtvYmplY3RJZDpuLG93blByb3BlcnRpZXM6ITB9KTtvW3RdPXIucmVzdWx0Lm1hcCgoZT0+W2UubmFtZSxlLnZhbHVlPy52YWx1ZV0pKS5yZWR1Y2UoKChlLFtuLHRdKT0+KGVbbl09dCxlKSkse30pfWZ1bmN0aW9uIHcoZSxuKXtlLnZhbHVlJiYoInZhbHVlImluIGUudmFsdWU/dm9pZCAwPT09ZS52YWx1ZS52YWx1ZXx8bnVsbD09PWUudmFsdWUudmFsdWU/bltlLm5hbWVdPWA8JHtlLnZhbHVlLnZhbHVlfT5gOm5bZS5uYW1lXT1lLnZhbHVlLnZhbHVlOiJkZXNjcmlwdGlvbiJpbiBlLnZhbHVlJiYiZnVuY3Rpb24iIT09ZS52YWx1ZS50eXBlP25bZS5uYW1lXT1gPCR7ZS52YWx1ZS5kZXNjcmlwdGlvbn0+YDoidW5kZWZpbmVkIj09PWUudmFsdWUudHlwZSYmKG5bZS5uYW1lXT0iPHVuZGVmaW5lZD4iKSl9YXN5bmMgZnVuY3Rpb24geShlLG4pe2NvbnN0IHQ9YXdhaXQgZS5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLHtvYmplY3RJZDpuLG93blByb3BlcnRpZXM6ITB9KSxvPXt9O2Zvcihjb25zdCBuIG9mIHQucmVzdWx0KWlmKG4/LnZhbHVlPy5vYmplY3RJZCYmIkFycmF5Ij09PW4/LnZhbHVlLmNsYXNzTmFtZSl7Y29uc3QgdD1uLnZhbHVlLm9iamVjdElkO2F3YWl0IHYoZSx0LG4ubmFtZSxvKX1lbHNlIGlmKG4/LnZhbHVlPy5vYmplY3RJZCYmIk9iamVjdCI9PT1uPy52YWx1ZT8uY2xhc3NOYW1lKXtjb25zdCB0PW4udmFsdWUub2JqZWN0SWQ7YXdhaXQgJChlLHQsbi5uYW1lLG8pfWVsc2Ugbj8udmFsdWUmJncobixvKTtyZXR1cm4gb31sZXQgaDsoYXN5bmMgZnVuY3Rpb24oKXtjb25zdCBuPW5ldyBlO24uY29ubmVjdFRvTWFpblRocmVhZCgpLGIoIkNvbm5lY3RlZCB0byBtYWluIHRocmVhZCIpO2xldCBvPSExO24ub24oIkRlYnVnZ2VyLnJlc3VtZWQiLCgoKT0+e289ITF9KSksbi5vbigiRGVidWdnZXIucGF1c2VkIiwoZT0+e289ITAsYXN5bmMgZnVuY3Rpb24oZSxuLHtyZWFzb246byxkYXRhOnIsY2FsbEZyYW1lczppfSl7aWYoImV4Y2VwdGlvbiIhPT1vJiYicHJvbWlzZVJlamVjdGlvbiIhPT1vKXJldHVybjtoPy4oKTtjb25zdCBzPWZ1bmN0aW9uKGUsbil7aWYodm9pZCAwIT09bilyZXR1cm4gZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09ZSlyZXR1cm4gZS5zbGljZSgtMTApLnJlZHVjZSgoKGUsbik9PmAke2V9LCR7bi5mdW5jdGlvbn0sJHtuLmxpbmVub30sJHtuLmNvbG5vfWApLCIiKX0oZShuLDEpKX0obixyPy5kZXNjcmlwdGlvbik7aWYobnVsbD09cylyZXR1cm47Y29uc3QgYz1bXTtmb3IobGV0IG49MDtuPGkubGVuZ3RoO24rKyl7Y29uc3R7c2NvcGVDaGFpbjp0LGZ1bmN0aW9uTmFtZTpvLHRoaXM6cn09aVtuXSxzPXQuZmluZCgoZT0+ImxvY2FsIj09PWUudHlwZSkpLGE9Imdsb2JhbCIhPT1yLmNsYXNzTmFtZSYmci5jbGFzc05hbWU/YCR7ci5jbGFzc05hbWV9LiR7b31gOm87aWYodm9pZCAwPT09cz8ub2JqZWN0Lm9iamVjdElkKWNbbl09e2Z1bmN0aW9uOmF9O2Vsc2V7Y29uc3QgdD1hd2FpdCB5KGUscy5vYmplY3Qub2JqZWN0SWQpO2Nbbl09e2Z1bmN0aW9uOmEsdmFyczp0fX19dD8ucG9zdE1lc3NhZ2Uoe2V4Y2VwdGlvbkhhc2g6cyxmcmFtZXM6Y30pfShuLG0sZS5wYXJhbXMpLnRoZW4oKCgpPT5vP24ucG9zdCgiRGVidWdnZXIucmVzdW1lIik6UHJvbWlzZS5yZXNvbHZlKCkpLChlPT57fSkpfSkpLGF3YWl0IG4ucG9zdCgiRGVidWdnZXIuZW5hYmxlIik7Y29uc3Qgcj0hMSE9PWcuY2FwdHVyZUFsbEV4Y2VwdGlvbnM7aWYoYXdhaXQgbi5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOnI/ImFsbCI6InVuY2F1Z2h0In0pLHIpe2NvbnN0IGU9Zy5tYXhFeGNlcHRpb25zUGVyU2Vjb25kfHw1MDtoPWZ1bmN0aW9uKGUsbix0KXtsZXQgbz0wLHI9NSxpPTA7cmV0dXJuIHNldEludGVydmFsKCgoKT0+ezA9PT1pP28+ZSYmKHIqPTIsdChyKSxyPjg2NDAwJiYocj04NjQwMCksaT1yKTooaS09MSwwPT09aSYmbigpKSxvPTB9KSwxZTMpLnVucmVmKCksKCk9PntvKz0xfX0oZSwoYXN5bmMoKT0+e2IoIlJhdGUtbGltaXQgbGlmdGVkLiIpLGF3YWl0IG4ucG9zdCgiRGVidWdnZXIuc2V0UGF1c2VPbkV4Y2VwdGlvbnMiLHtzdGF0ZToiYWxsIn0pfSksKGFzeW5jIGU9PntiKGBSYXRlLWxpbWl0IGV4Y2VlZGVkLiBEaXNhYmxpbmcgY2FwdHVyaW5nIG9mIGNhdWdodCBleGNlcHRpb25zIGZvciAke2V9IHNlY29uZHMuYCksYXdhaXQgbi5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOiJ1bmNhdWdodCJ9KX0pKX19KSgpLmNhdGNoKChlPT57YigiRmFpbGVkIHRvIHN0YXJ0IGRlYnVnZ2VyIixlKX0pKSxzZXRJbnRlcnZhbCgoKCk9Pnt9KSwxZTQpOw==';
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZSA4LjMuMCAoOGI5OWRlNykgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIGV9ZnJvbSJub2RlOmluc3BlY3Rvci9wcm9taXNlcyI7aW1wb3J0e3dvcmtlckRhdGEgYXMgbixwYXJlbnRQb3J0IGFzIHR9ZnJvbSJub2RlOndvcmtlcl90aHJlYWRzIjtpbXBvcnR7cG9zaXggYXMgbyxzZXAgYXMgcn1mcm9tIm5vZGU6cGF0aCI7Y29uc3QgaT01MCxzPSI/IixjPS9cKGVycm9yOiAoLiopXCkvLGE9L2NhcHR1cmVNZXNzYWdlfGNhcHR1cmVFeGNlcHRpb24vO2NvbnN0IHU9L14oXFMrOlxcfFwvPykoW1xzXFNdKj8pKCg/OlwuezEsMn18W14vXFxdKz98KShcLlteLi9cXF0qfCkpKD86Wy9cXF0qKSQvO2Z1bmN0aW9uIGYoZSl7Y29uc3Qgbj1mdW5jdGlvbihlKXtjb25zdCBuPWUubGVuZ3RoPjEwMjQ/YDx0cnVuY2F0ZWQ+JHtlLnNsaWNlKC0xMDI0KX1gOmUsdD11LmV4ZWMobik7cmV0dXJuIHQ/dC5zbGljZSgxKTpbXX0oZSksdD1uWzBdO2xldCBvPW5bMV07cmV0dXJuIHR8fG8/KG8mJihvPW8uc2xpY2UoMCxvLmxlbmd0aC0xKSksdCtvKToiLiJ9ZnVuY3Rpb24gbChlLG49ITEpe3JldHVybiEobnx8ZSYmIWUuc3RhcnRzV2l0aCgiLyIpJiYhZS5tYXRjaCgvXltBLVpdOi8pJiYhZS5zdGFydHNXaXRoKCIuIikmJiFlLm1hdGNoKC9eW2EtekEtWl0oW2EtekEtWjAtOS5cLStdKSo6XC9cLy8pKSYmdm9pZCAwIT09ZSYmIWUuaW5jbHVkZXMoIm5vZGVfbW9kdWxlcy8iKX1mdW5jdGlvbiBkKGUpe2NvbnN0IG49L15ccypbLV17NCx9JC8sdD0vYXQgKD86YXN5bmMgKT8oPzooLis/KVxzK1woKT8oPzooLispOihcZCspOihcZCspP3woW14pXSspKVwpPy87cmV0dXJuIG89Pntjb25zdCByPW8ubWF0Y2godCk7aWYocil7bGV0IG4sdCxvLGksYztpZihyWzFdKXtvPXJbMV07bGV0IGU9by5sYXN0SW5kZXhPZigiLiIpO2lmKCIuIj09PW9bZS0xXSYmZS0tLGU+MCl7bj1vLnNsaWNlKDAsZSksdD1vLnNsaWNlKGUrMSk7Y29uc3Qgcj1uLmluZGV4T2YoIi5Nb2R1bGUiKTtyPjAmJihvPW8uc2xpY2UocisxKSxuPW4uc2xpY2UoMCxyKSl9aT12b2lkIDB9dCYmKGk9bixjPXQpLCI8YW5vbnltb3VzPiI9PT10JiYoYz12b2lkIDAsbz12b2lkIDApLHZvaWQgMD09PW8mJihjPWN8fHMsbz1pP2Ake2l9LiR7Y31gOmMpO2xldCBhPXJbMl0mJnJbMl0uc3RhcnRzV2l0aCgiZmlsZTovLyIpP3JbMl0uc2xpY2UoNyk6clsyXTtjb25zdCB1PSJuYXRpdmUiPT09cls1XTtyZXR1cm4gYSYmYS5tYXRjaCgvXC9bQS1aXTovKSYmKGE9YS5zbGljZSgxKSksYXx8IXJbNV18fHV8fChhPXJbNV0pLHtmaWxlbmFtZTphLG1vZHVsZTplP2UoYSk6dm9pZCAwLGZ1bmN0aW9uOm8sbGluZW5vOnBhcnNlSW50KHJbM10sMTApfHx2b2lkIDAsY29sbm86cGFyc2VJbnQocls0XSwxMCl8fHZvaWQgMCxpbl9hcHA6bChhLHUpfX1pZihvLm1hdGNoKG4pKXJldHVybntmaWxlbmFtZTpvfX19ZnVuY3Rpb24gcChlKXtyZXR1cm4gZS5yZXBsYWNlKC9eW0EtWl06LywiIikucmVwbGFjZSgvXFwvZywiLyIpfWNvbnN0IGc9bixtPWZ1bmN0aW9uKC4uLmUpe2NvbnN0IG49ZS5zb3J0KCgoZSxuKT0+ZVswXS1uWzBdKSkubWFwKChlPT5lWzFdKSk7cmV0dXJuKGUsdD0wLG89MCk9Pntjb25zdCByPVtdLHU9ZS5zcGxpdCgiXG4iKTtmb3IobGV0IGU9dDtlPHUubGVuZ3RoO2UrKyl7Y29uc3QgdD11W2VdO2lmKHQubGVuZ3RoPjEwMjQpY29udGludWU7Y29uc3Qgcz1jLnRlc3QodCk/dC5yZXBsYWNlKGMsIiQxIik6dDtpZighcy5tYXRjaCgvXFMqRXJyb3I6IC8pKXtmb3IoY29uc3QgZSBvZiBuKXtjb25zdCBuPWUocyk7aWYobil7ci5wdXNoKG4pO2JyZWFrfX1pZihyLmxlbmd0aD49aStvKWJyZWFrfX1yZXR1cm4gZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RoKXJldHVybltdO2NvbnN0IG49QXJyYXkuZnJvbShlKTsvc2VudHJ5V3JhcHBlZC8udGVzdChuW24ubGVuZ3RoLTFdLmZ1bmN0aW9ufHwiIikmJm4ucG9wKCk7bi5yZXZlcnNlKCksYS50ZXN0KG5bbi5sZW5ndGgtMV0uZnVuY3Rpb258fCIiKSYmKG4ucG9wKCksYS50ZXN0KG5bbi5sZW5ndGgtMV0uZnVuY3Rpb258fCIiKSYmbi5wb3AoKSk7cmV0dXJuIG4uc2xpY2UoMCxpKS5tYXAoKGU9Pih7Li4uZSxmaWxlbmFtZTplLmZpbGVuYW1lfHxuW24ubGVuZ3RoLTFdLmZpbGVuYW1lLGZ1bmN0aW9uOmUuZnVuY3Rpb258fHN9KSkpfShyLnNsaWNlKG8pKX19KFs5MCxkKGZ1bmN0aW9uKGU9KHByb2Nlc3MuYXJndlsxXT9mKHByb2Nlc3MuYXJndlsxXSk6cHJvY2Vzcy5jd2QoKSksbj0iXFwiPT09cil7Y29uc3QgdD1uP3AoZSk6ZTtyZXR1cm4gZT0+e2lmKCFlKXJldHVybjtjb25zdCByPW4/cChlKTplO2xldHtkaXI6aSxiYXNlOnMsZXh0OmN9PW8ucGFyc2Uocik7Ii5qcyIhPT1jJiYiLm1qcyIhPT1jJiYiLmNqcyIhPT1jfHwocz1zLnNsaWNlKDAsLTEqYy5sZW5ndGgpKSxpfHwoaT0iLiIpO2NvbnN0IGE9aS5sYXN0SW5kZXhPZigiL25vZGVfbW9kdWxlcyIpO2lmKGE+LTEpcmV0dXJuYCR7aS5zbGljZShhKzE0KS5yZXBsYWNlKC9cLy9nLCIuIil9OiR7c31gO2lmKGkuc3RhcnRzV2l0aCh0KSl7bGV0IGU9aS5zbGljZSh0Lmxlbmd0aCsxKS5yZXBsYWNlKC9cLy9nLCIuIik7cmV0dXJuIGUmJihlKz0iOiIpLGUrPXMsZX1yZXR1cm4gc319KGcuYmFzZVBhdGgpKV0pO2Z1bmN0aW9uIGIoLi4uZSl7Zy5kZWJ1ZyYmY29uc29sZS5sb2coIltMb2NhbFZhcmlhYmxlcyBXb3JrZXJdIiwuLi5lKX1hc3luYyBmdW5jdGlvbiB2KGUsbix0LG8pe2NvbnN0IHI9YXdhaXQgZS5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLHtvYmplY3RJZDpuLG93blByb3BlcnRpZXM6ITB9KTtvW3RdPXIucmVzdWx0LmZpbHRlcigoZT0+Imxlbmd0aCIhPT1lLm5hbWUmJiFpc05hTihwYXJzZUludChlLm5hbWUsMTApKSkpLnNvcnQoKChlLG4pPT5wYXJzZUludChlLm5hbWUsMTApLXBhcnNlSW50KG4ubmFtZSwxMCkpKS5tYXAoKGU9PmUudmFsdWU/LnZhbHVlKSl9YXN5bmMgZnVuY3Rpb24gJChlLG4sdCxvKXtjb25zdCByPWF3YWl0IGUucG9zdCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIix7b2JqZWN0SWQ6bixvd25Qcm9wZXJ0aWVzOiEwfSk7b1t0XT1yLnJlc3VsdC5tYXAoKGU9PltlLm5hbWUsZS52YWx1ZT8udmFsdWVdKSkucmVkdWNlKCgoZSxbbix0XSk9PihlW25dPXQsZSkpLHt9KX1mdW5jdGlvbiB3KGUsbil7ZS52YWx1ZSYmKCJ2YWx1ZSJpbiBlLnZhbHVlP3ZvaWQgMD09PWUudmFsdWUudmFsdWV8fG51bGw9PT1lLnZhbHVlLnZhbHVlP25bZS5uYW1lXT1gPCR7ZS52YWx1ZS52YWx1ZX0+YDpuW2UubmFtZV09ZS52YWx1ZS52YWx1ZToiZGVzY3JpcHRpb24iaW4gZS52YWx1ZSYmImZ1bmN0aW9uIiE9PWUudmFsdWUudHlwZT9uW2UubmFtZV09YDwke2UudmFsdWUuZGVzY3JpcHRpb259PmA6InVuZGVmaW5lZCI9PT1lLnZhbHVlLnR5cGUmJihuW2UubmFtZV09Ijx1bmRlZmluZWQ+IikpfWFzeW5jIGZ1bmN0aW9uIHkoZSxuKXtjb25zdCB0PWF3YWl0IGUucG9zdCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIix7b2JqZWN0SWQ6bixvd25Qcm9wZXJ0aWVzOiEwfSksbz17fTtmb3IoY29uc3QgbiBvZiB0LnJlc3VsdClpZihuPy52YWx1ZT8ub2JqZWN0SWQmJiJBcnJheSI9PT1uPy52YWx1ZS5jbGFzc05hbWUpe2NvbnN0IHQ9bi52YWx1ZS5vYmplY3RJZDthd2FpdCB2KGUsdCxuLm5hbWUsbyl9ZWxzZSBpZihuPy52YWx1ZT8ub2JqZWN0SWQmJiJPYmplY3QiPT09bj8udmFsdWU/LmNsYXNzTmFtZSl7Y29uc3QgdD1uLnZhbHVlLm9iamVjdElkO2F3YWl0ICQoZSx0LG4ubmFtZSxvKX1lbHNlIG4/LnZhbHVlJiZ3KG4sbyk7cmV0dXJuIG99bGV0IGg7KGFzeW5jIGZ1bmN0aW9uKCl7Y29uc3Qgbj1uZXcgZTtuLmNvbm5lY3RUb01haW5UaHJlYWQoKSxiKCJDb25uZWN0ZWQgdG8gbWFpbiB0aHJlYWQiKTtsZXQgbz0hMTtuLm9uKCJEZWJ1Z2dlci5yZXN1bWVkIiwoKCk9PntvPSExfSkpLG4ub24oIkRlYnVnZ2VyLnBhdXNlZCIsKGU9PntvPSEwLGFzeW5jIGZ1bmN0aW9uKGUsbix7cmVhc29uOm8sZGF0YTpyLGNhbGxGcmFtZXM6aX0pe2lmKCJleGNlcHRpb24iIT09byYmInByb21pc2VSZWplY3Rpb24iIT09bylyZXR1cm47aD8uKCk7Y29uc3Qgcz1mdW5jdGlvbihlLG4pe2lmKHZvaWQgMCE9PW4pcmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PWUpcmV0dXJuIGUuc2xpY2UoLTEwKS5yZWR1Y2UoKChlLG4pPT5gJHtlfSwke24uZnVuY3Rpb259LCR7bi5saW5lbm99LCR7bi5jb2xub31gKSwiIil9KGUobiwxKSl9KG4scj8uZGVzY3JpcHRpb24pO2lmKG51bGw9PXMpcmV0dXJuO2NvbnN0IGM9W107Zm9yKGxldCBuPTA7bjxpLmxlbmd0aDtuKyspe2NvbnN0e3Njb3BlQ2hhaW46dCxmdW5jdGlvbk5hbWU6byx0aGlzOnJ9PWlbbl0scz10LmZpbmQoKGU9PiJsb2NhbCI9PT1lLnR5cGUpKSxhPSJnbG9iYWwiIT09ci5jbGFzc05hbWUmJnIuY2xhc3NOYW1lP2Ake3IuY2xhc3NOYW1lfS4ke299YDpvO2lmKHZvaWQgMD09PXM/Lm9iamVjdC5vYmplY3RJZCljW25dPXtmdW5jdGlvbjphfTtlbHNle2NvbnN0IHQ9YXdhaXQgeShlLHMub2JqZWN0Lm9iamVjdElkKTtjW25dPXtmdW5jdGlvbjphLHZhcnM6dH19fXQ/LnBvc3RNZXNzYWdlKHtleGNlcHRpb25IYXNoOnMsZnJhbWVzOmN9KX0obixtLGUucGFyYW1zKS50aGVuKCgoKT0+bz9uLnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpOlByb21pc2UucmVzb2x2ZSgpKSwoZT0+e30pKX0pKSxhd2FpdCBuLnBvc3QoIkRlYnVnZ2VyLmVuYWJsZSIpO2NvbnN0IHI9ITEhPT1nLmNhcHR1cmVBbGxFeGNlcHRpb25zO2lmKGF3YWl0IG4ucG9zdCgiRGVidWdnZXIuc2V0UGF1c2VPbkV4Y2VwdGlvbnMiLHtzdGF0ZTpyPyJhbGwiOiJ1bmNhdWdodCJ9KSxyKXtjb25zdCBlPWcubWF4RXhjZXB0aW9uc1BlclNlY29uZHx8NTA7aD1mdW5jdGlvbihlLG4sdCl7bGV0IG89MCxyPTUsaT0wO3JldHVybiBzZXRJbnRlcnZhbCgoKCk9PnswPT09aT9vPmUmJihyKj0yLHQocikscj44NjQwMCYmKHI9ODY0MDApLGk9cik6KGktPTEsMD09PWkmJm4oKSksbz0wfSksMWUzKS51bnJlZigpLCgpPT57bys9MX19KGUsKGFzeW5jKCk9PntiKCJSYXRlLWxpbWl0IGxpZnRlZC4iKSxhd2FpdCBuLnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6ImFsbCJ9KX0pLChhc3luYyBlPT57YihgUmF0ZS1saW1pdCBleGNlZWRlZC4gRGlzYWJsaW5nIGNhcHR1cmluZyBvZiBjYXVnaHQgZXhjZXB0aW9ucyBmb3IgJHtlfSBzZWNvbmRzLmApLGF3YWl0IG4ucG9zdCgiRGVidWdnZXIuc2V0UGF1c2VPbkV4Y2VwdGlvbnMiLHtzdGF0ZToidW5jYXVnaHQifSl9KSl9fSkoKS5jYXRjaCgoZT0+e2IoIkZhaWxlZCB0byBzdGFydCBkZWJ1Z2dlciIsZSl9KSksc2V0SW50ZXJ2YWwoKCgpPT57fSksMWU0KTs=';

@@ -88,3 +88,3 @@ function log(...args) {

function startWorker(options) {
const worker = new worker_threads.Worker(new URL(`data:application/javascript;base64,${base64WorkerScript}`), {
const worker = new node_worker_threads.Worker(new URL(`data:application/javascript;base64,${base64WorkerScript}`), {
workerData: options,

@@ -91,0 +91,0 @@ // We don't want any Node args to be passed to the worker

@@ -7,5 +7,5 @@ var {

const inspector = require('node:inspector');
const core = require('@sentry/core');
const utils = require('@sentry/utils');
const inspector = require('inspector');
const nodeVersion = require('../../nodeVersion.js');

@@ -12,0 +12,0 @@ const common = require('./common.js');

Object.defineProperty(exports, '__esModule', { value: true });
const fs = require('fs');
const path = require('path');
const node_fs = require('node:fs');
const node_path = require('node:path');
const core = require('@sentry/core');

@@ -52,4 +52,4 @@

paths.forEach(path$1 => {
let dir = path$1;
paths.forEach(path => {
let dir = path;

@@ -59,3 +59,3 @@ /** Traverse directories upward in the search of package.json file */

const orig = dir;
dir = path.dirname(orig);
dir = node_path.dirname(orig);

@@ -69,6 +69,6 @@ if (!dir || orig === dir || seen[orig]) {

const pkgfile = path.join(orig, 'package.json');
const pkgfile = node_path.join(orig, 'package.json');
seen[orig] = true;
if (!fs.existsSync(pkgfile)) {
if (!node_fs.existsSync(pkgfile)) {
return updir();

@@ -78,3 +78,3 @@ }

try {
const info = JSON.parse(fs.readFileSync(pkgfile, 'utf8'))
const info = JSON.parse(node_fs.readFileSync(pkgfile, 'utf8'))

@@ -81,0 +81,0 @@ ;

Object.defineProperty(exports, '__esModule', { value: true });
const api = require('@opentelemetry/api');
const core = require('@sentry/core');

@@ -24,3 +23,16 @@ const opentelemetry = require('@sentry/opentelemetry');

const pkg = await import('opentelemetry-instrumentation-fetch-node');
return new pkg.FetchInstrumentation({
const { FetchInstrumentation } = pkg;
class SentryNodeFetchInstrumentation extends FetchInstrumentation {
// We extend this method so we have access to request _and_ response for the breadcrumb
onHeaders({ request, response }) {
if (_breadcrumbs) {
_addRequestBreadcrumb(request, response);
}
return super.onHeaders({ request, response });
}
}
return new SentryNodeFetchInstrumentation({
ignoreRequestHook: (request) => {

@@ -32,6 +44,2 @@ const url = request.origin;

_updateSpan(span);
if (_breadcrumbs) {
_addRequestBreadcrumb(span);
}
},

@@ -67,18 +75,46 @@ // eslint-disable-next-line @typescript-eslint/no-explicit-any

/** Add a breadcrumb for outgoing requests. */
function _addRequestBreadcrumb(span) {
if (opentelemetry.getSpanKind(span) !== api.SpanKind.CLIENT) {
return;
}
function _addRequestBreadcrumb(request, response) {
const data = getBreadcrumbData(request);
const data = opentelemetry.getRequestSpanData(span);
core.addBreadcrumb({
category: 'http',
data: {
...data,
core.addBreadcrumb(
{
category: 'http',
data: {
status_code: response.statusCode,
...data,
},
type: 'http',
},
type: 'http',
});
{
event: 'response',
request,
response,
},
);
}
function getBreadcrumbData(request) {
try {
const url = new URL(request.path, request.origin);
const parsedUrl = utils.parseUrl(url.toString());
const data = {
url: utils.getSanitizedUrlString(parsedUrl),
'http.method': request.method || 'GET',
};
if (parsedUrl.search) {
data['http.query'] = parsedUrl.search;
}
if (parsedUrl.hash) {
data['http.fragment'] = parsedUrl.hash;
}
return data;
} catch (e) {
return {};
}
}
exports.nativeNodeFetchIntegration = nativeNodeFetchIntegration;
//# sourceMappingURL=node-fetch.js.map
Object.defineProperty(exports, '__esModule', { value: true });
const http = require('http');
const http = require('node:http');
const core = require('@sentry/core');

@@ -5,0 +5,0 @@ const utils = require('@sentry/utils');

Object.defineProperty(exports, '__esModule', { value: true });
const core$1 = require('@opentelemetry/core');
const instrumentationConnect = require('@opentelemetry/instrumentation-connect');
const core = require('@sentry/core');
const opentelemetry = require('@sentry/opentelemetry');
const utils = require('@sentry/utils');
const ensureIsWrapped = require('../../utils/ensureIsWrapped.js');

@@ -29,14 +28,40 @@ const _connectIntegration = (() => {

if (!core$1.isWrapped(app.use) && core.isEnabled()) {
utils.consoleSandbox(() => {
// eslint-disable-next-line no-console
console.warn(
'[Sentry] Connect is not instrumented. This is likely because you required/imported connect before calling `Sentry.init()`.',
);
// Sadly, ConnectInstrumentation has no requestHook, so we need to add the attributes here
// We register this hook in this method, because if we register it in the integration `setup`,
// it would always run even for users that are not even using connect
const client = core.getClient();
if (client) {
client.on('spanStart', span => {
addConnectSpanAttributes(span);
});
}
ensureIsWrapped.ensureIsWrapped(app.use, 'connect');
};
function addConnectSpanAttributes(span) {
const attributes = core.spanToJSON(span).data || {};
// this is one of: middleware, request_handler
const type = attributes['connect.type'];
// If this is already set, or we have no connect span, no need to process again...
if (attributes[core.SEMANTIC_ATTRIBUTE_SENTRY_OP] || !type) {
return;
}
span.setAttributes({
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.otel.connect',
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${type}.connect`,
});
// Also update the name, we don't need to "middleware - " prefix
const name = attributes['connect.name'];
if (typeof name === 'string') {
span.updateName(name);
}
}
exports.connectIntegration = connectIntegration;
exports.setupConnectErrorHandler = setupConnectErrorHandler;
//# sourceMappingURL=connect.js.map

@@ -10,6 +10,6 @@ var {

const opentelemetry = require('@sentry/opentelemetry');
const core$1 = require('@opentelemetry/core');
const utils = require('@sentry/utils');
const debugBuild = require('../../debug-build.js');
const addOriginToSpan = require('../../utils/addOriginToSpan.js');
const ensureIsWrapped = require('../../utils/ensureIsWrapped.js');

@@ -24,2 +24,16 @@ const _expressIntegration = (() => {

addOriginToSpan.addOriginToSpan(span, 'auto.http.otel.express');
const attributes = core.spanToJSON(span).data || {};
// this is one of: middleware, request_handler, router
const type = attributes['express.type'];
if (type) {
span.setAttribute(core.SEMANTIC_ATTRIBUTE_SENTRY_OP, `${type}.express`);
}
// Also update the name, we don't need to "middleware - " prefix
const name = attributes['express.name'];
if (typeof name === 'string') {
span.updateName(name);
}
},

@@ -104,11 +118,3 @@ spanNameHook(info, defaultName) {

app.use(expressErrorHandler());
if (!core$1.isWrapped(app.use) && core.isEnabled()) {
utils.consoleSandbox(() => {
// eslint-disable-next-line no-console
console.warn(
'[Sentry] Express is not instrumented. This is likely because you required/imported express before calling `Sentry.init()`.',
);
});
}
ensureIsWrapped.ensureIsWrapped(app.use, 'express');
}

@@ -115,0 +121,0 @@

@@ -7,9 +7,9 @@ var {

const core$1 = require('@opentelemetry/core');
const instrumentationFastify = require('@opentelemetry/instrumentation-fastify');
const core = require('@sentry/core');
const opentelemetry = require('@sentry/opentelemetry');
const utils = require('@sentry/utils');
const addOriginToSpan = require('../../utils/addOriginToSpan.js');
const ensureIsWrapped = require('../../utils/ensureIsWrapped.js');
// We inline the types we care about here
const _fastifyIntegration = (() => {

@@ -22,3 +22,3 @@ return {

requestHook(span) {
addOriginToSpan.addOriginToSpan(span, 'auto.http.otel.fastify');
addFastifySpanAttributes(span);
},

@@ -38,4 +38,2 @@ }),

// We inline the types we care about here
/**

@@ -75,14 +73,41 @@ * Setup an error handler for Fastify.

if (!core$1.isWrapped(fastify.addHook) && core.isEnabled()) {
utils.consoleSandbox(() => {
// eslint-disable-next-line no-console
console.warn(
'[Sentry] Fastify is not instrumented. This is likely because you required/imported fastify before calling `Sentry.init()`.',
);
// Sadly, middleware spans do not go through `requestHook`, so we handle those here
// We register this hook in this method, because if we register it in the integration `setup`,
// it would always run even for users that are not even using fastify
const client = core.getClient();
if (client) {
client.on('spanStart', span => {
addFastifySpanAttributes(span);
});
}
ensureIsWrapped.ensureIsWrapped(fastify.addHook, 'fastify');
}
function addFastifySpanAttributes(span) {
const attributes = core.spanToJSON(span).data || {};
// this is one of: middleware, request_handler
const type = attributes['fastify.type'];
// If this is already set, or we have no fastify span, no need to process again...
if (attributes[core.SEMANTIC_ATTRIBUTE_SENTRY_OP] || !type) {
return;
}
span.setAttributes({
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.otel.fastify',
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${type}.fastify`,
});
// Also update the name, we don't need to "middleware - " prefix
const name = attributes['fastify.name'] || attributes['plugin.name'] || attributes['hook.name'];
if (typeof name === 'string') {
// Also remove `fastify -> ` prefix
span.updateName(name.replace(/^fastify -> /, ''));
}
}
exports.fastifyIntegration = fastifyIntegration;
exports.setupFastifyErrorHandler = setupFastifyErrorHandler;
//# sourceMappingURL=fastify.js.map

@@ -8,3 +8,9 @@ Object.defineProperty(exports, '__esModule', { value: true });

const _graphqlIntegration = (() => {
const _graphqlIntegration = ((_options = {}) => {
const options = {
ignoreResolveSpans: true,
ignoreTrivialResolveSpans: true,
..._options,
};
return {

@@ -15,3 +21,3 @@ name: 'Graphql',

new instrumentationGraphql.GraphQLInstrumentation({
ignoreTrivialResolveSpans: true,
...options,
responseHook(span) {

@@ -18,0 +24,0 @@ addOriginToSpan.addOriginToSpan(span, 'auto.graphql.otel.graphql');

@@ -7,3 +7,2 @@ var {

const core$1 = require('@opentelemetry/core');
const instrumentationHapi = require('@opentelemetry/instrumentation-hapi');

@@ -14,2 +13,3 @@ const core = require('@sentry/core');

const debugBuild = require('../../../debug-build.js');
const ensureIsWrapped = require('../../../utils/ensureIsWrapped.js');

@@ -94,13 +94,33 @@ const _hapiIntegration = (() => {

// eslint-disable-next-line @typescript-eslint/unbound-method
if (!core$1.isWrapped(server.register) && core.isEnabled()) {
utils.consoleSandbox(() => {
// eslint-disable-next-line no-console
console.warn(
'[Sentry] Hapi is not instrumented. This is likely because you required/imported hapi before calling `Sentry.init()`.',
);
// Sadly, middleware spans do not go through `requestHook`, so we handle those here
// We register this hook in this method, because if we register it in the integration `setup`,
// it would always run even for users that are not even using hapi
const client = core.getClient();
if (client) {
client.on('spanStart', span => {
addHapiSpanAttributes(span);
});
}
// eslint-disable-next-line @typescript-eslint/unbound-method
ensureIsWrapped.ensureIsWrapped(server.register, 'hapi');
}
function addHapiSpanAttributes(span) {
const attributes = core.spanToJSON(span).data || {};
// this is one of: router, plugin, server.ext
const type = attributes['hapi.type'];
// If this is already set, or we have no Hapi span, no need to process again...
if (attributes[core.SEMANTIC_ATTRIBUTE_SENTRY_OP] || !type) {
return;
}
span.setAttributes({
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.otel.hapi',
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${type}.hapi`,
});
}
exports.hapiErrorPlugin = hapiErrorPlugin;

@@ -107,0 +127,0 @@ exports.hapiIntegration = hapiIntegration;

Object.defineProperty(exports, '__esModule', { value: true });
const core$1 = require('@opentelemetry/core');
const instrumentationKoa = require('@opentelemetry/instrumentation-koa');

@@ -10,3 +9,25 @@ const semanticConventions = require('@opentelemetry/semantic-conventions');

const debugBuild = require('../../debug-build.js');
const ensureIsWrapped = require('../../utils/ensureIsWrapped.js');
function addKoaSpanAttributes(span) {
span.setAttribute(core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, 'auto.http.otel.koa');
const attributes = core.spanToJSON(span).data || {};
// this is one of: middleware, router
const type = attributes['koa.type'];
if (type) {
span.setAttribute(core.SEMANTIC_ATTRIBUTE_SENTRY_OP, `${type}.koa`);
}
// Also update the name
const name = attributes['koa.name'];
if (typeof name === 'string') {
// Somehow, name is sometimes `''` for middleware spans
// See: https://github.com/open-telemetry/opentelemetry-js-contrib/issues/2220
span.updateName(name || '< unknown >');
}
}
const _koaIntegration = (() => {

@@ -19,2 +40,4 @@ return {

requestHook(span, info) {
addKoaSpanAttributes(span);
if (core.getIsolationScope() === core.getDefaultIsolationScope()) {

@@ -50,10 +73,3 @@ debugBuild.DEBUG_BUILD &&

if (!core$1.isWrapped(app.use) && core.isEnabled()) {
utils.consoleSandbox(() => {
// eslint-disable-next-line no-console
console.warn(
'[Sentry] Koa is not instrumented. This is likely because you required/imported koa before calling `Sentry.init()`.',
);
});
}
ensureIsWrapped.ensureIsWrapped(app.use, 'koa');
};

@@ -60,0 +76,0 @@

@@ -32,2 +32,12 @@ var {

function setupNestErrorHandler(app, baseFilter) {
// Sadly, NestInstrumentation has no requestHook, so we need to add the attributes here
// We register this hook in this method, because if we register it in the integration `setup`,
// it would always run even for users that are not even using Nest.js
const client = core.getClient();
if (client) {
client.on('spanStart', span => {
addNestSpanAttributes(span);
});
}
app.useGlobalInterceptors({

@@ -68,4 +78,21 @@ intercept(context, next) {

function addNestSpanAttributes(span) {
const attributes = core.spanToJSON(span).data || {};
// this is one of: app_creation, request_context, handler
const type = attributes['nestjs.type'];
// If this is already set, or we have no nest.js span, no need to process again...
if (attributes[core.SEMANTIC_ATTRIBUTE_SENTRY_OP] || !type) {
return;
}
span.setAttributes({
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.otel.nestjs',
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${type}.nestjs`,
});
}
exports.nestIntegration = nestIntegration;
exports.setupNestErrorHandler = setupNestErrorHandler;
//# sourceMappingURL=nest.js.map

@@ -7,4 +7,3 @@ var {

const http = require('http');
require('node:http');
const http = require('node:http');
require('node:https');

@@ -11,0 +10,0 @@

@@ -8,4 +8,4 @@ var {

const net = require('net');
const tls = require('tls');
const net = require('node:net');
const tls = require('node:tls');
const utils = require('@sentry/utils');

@@ -12,0 +12,0 @@ const base = require('./base.js');

@@ -7,3 +7,3 @@ var {

const os = require('os');
const os = require('node:os');
const api = require('@opentelemetry/api');

@@ -10,0 +10,0 @@ const core = require('@sentry/core');

@@ -20,2 +20,3 @@ Object.defineProperty(exports, '__esModule', { value: true });

const http$1 = require('../transports/http.js');
const commonjs = require('../utils/commonjs.js');
const api = require('./api.js');

@@ -26,8 +27,4 @@ const client = require('./client.js');

var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
function isCjs() {
return typeof require !== 'undefined';
}
function getCjsOnlyIntegrations() {
return isCjs() ? [modules.modulesIntegration()] : [];
return commonjs.isCjs() ? [modules.modulesIntegration()] : [];
}

@@ -116,3 +113,3 @@

if (!isCjs()) {
if (!commonjs.isCjs()) {
const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(Number);

@@ -127,5 +124,9 @@

if (!utils.GLOBAL_OBJ._sentryEsmLoaderHookRegistered && importMetaUrl) {
// @ts-expect-error register is available in these versions
moduleModule.default.register('@opentelemetry/instrumentation/hook.mjs', importMetaUrl);
utils.GLOBAL_OBJ._sentryEsmLoaderHookRegistered = true;
try {
// @ts-expect-error register is available in these versions
moduleModule.default.register('@opentelemetry/instrumentation/hook.mjs', importMetaUrl);
utils.GLOBAL_OBJ._sentryEsmLoaderHookRegistered = true;
} catch (error) {
utils.logger.warn('Failed to register ESM hook', error);
}
}

@@ -155,2 +156,4 @@ } else {

utils.logger.log(`Running in ${commonjs.isCjs() ? 'CommonJS' : 'ESM'} mode.`);
if (options.autoSessionTracking) {

@@ -157,0 +160,0 @@ startSessionTracking();

@@ -9,4 +9,4 @@ var {

const https = require('node:https');
const stream = require('stream');
const zlib = require('zlib');
const node_stream = require('node:stream');
const node_zlib = require('node:zlib');
const core = require('@sentry/core');

@@ -24,3 +24,3 @@ const utils = require('@sentry/utils');

function streamFromBody(body) {
return new stream.Readable({
return new node_stream.Readable({
read() {

@@ -63,3 +63,3 @@ this.push(body);

// TODO(v7): Evaluate if we can set keepAlive to true. This would involve testing for memory leaks in older node
// TODO(v9): Evaluate if we can set keepAlive to true. This would involve testing for memory leaks in older node
// versions(>= 8) as they had memory leaks when using it: #2555

@@ -119,3 +119,3 @@ const agent = proxy

headers['content-encoding'] = 'gzip';
body = body.pipe(zlib.createGzip());
body = body.pipe(node_zlib.createGzip());
}

@@ -122,0 +122,0 @@

Object.defineProperty(exports, '__esModule', { value: true });
const path = require('path');
const node_path = require('node:path');
const utils = require('@sentry/utils');

@@ -16,3 +16,3 @@

basePath = process.argv[1] ? utils.dirname(process.argv[1]) : process.cwd(),
isWindows = path.sep === '\\',
isWindows = node_path.sep === '\\',
) {

@@ -29,3 +29,3 @@ const normalizedBase = isWindows ? normalizeWindowsPath(basePath) : basePath;

// eslint-disable-next-line prefer-const
let { dir, base: file, ext } = path.posix.parse(normalizedFilename);
let { dir, base: file, ext } = node_path.posix.parse(normalizedFilename);

@@ -32,0 +32,0 @@ if (ext === '.js' || ext === '.mjs' || ext === '.cjs') {

import { _optionalChain, _optionalChainDelete } from '@sentry/utils';
import * as inspector from 'node:inspector';
import { Worker } from 'node:worker_threads';
import { defineIntegration, getGlobalScope, mergeScopeData, getIsolationScope, getCurrentScope } from '@sentry/core';
import { logger, GLOBAL_OBJ } from '@sentry/utils';
import * as inspector from 'inspector';
import { Worker } from 'worker_threads';
import { NODE_VERSION } from '../../nodeVersion.js';
// This string is a placeholder that gets overwritten with the worker code.
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZSA4LjIuMSAoYmIyZjFiYykgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIHR9ZnJvbSJpbnNwZWN0b3IiO2ltcG9ydHtwYXJlbnRQb3J0IGFzIGUsd29ya2VyRGF0YSBhcyBufWZyb20id29ya2VyX3RocmVhZHMiO2ltcG9ydHtwb3NpeCBhcyByLHNlcCBhcyBvfWZyb20icGF0aCI7aW1wb3J0KmFzIHMgZnJvbSJub2RlOmh0dHAiO2ltcG9ydCphcyBpIGZyb20ibm9kZTpodHRwcyI7aW1wb3J0e1JlYWRhYmxlIGFzIGN9ZnJvbSJzdHJlYW0iO2ltcG9ydHtjcmVhdGVHemlwIGFzIHV9ZnJvbSJ6bGliIjtpbXBvcnQqYXMgYSBmcm9tIm5ldCI7aW1wb3J0KmFzIGYgZnJvbSJ0bHMiO2ltcG9ydCphcyBoIGZyb20iaHR0cCI7Y29uc3QgcD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIGwodCxlKXtyZXR1cm4gcC5jYWxsKHQpPT09YFtvYmplY3QgJHtlfV1gfWZ1bmN0aW9uIGQodCl7cmV0dXJuIGwodCwiT2JqZWN0Iil9ZnVuY3Rpb24gbSh0KXtyZXR1cm4gQm9vbGVhbih0JiZ0LnRoZW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW4pfWZ1bmN0aW9uIGcodCxlKXt0cnl7cmV0dXJuIHQgaW5zdGFuY2VvZiBlfWNhdGNoKHQpe3JldHVybiExfX1jb25zdCB5PWdsb2JhbFRoaXM7ZnVuY3Rpb24gYih0LGUsbil7Y29uc3Qgcj1ufHx5LG89ci5fX1NFTlRSWV9fPXIuX19TRU5UUllfX3x8e307cmV0dXJuIG9bdF18fChvW3RdPWUoKSl9Y29uc3Qgdj15LF89ODA7ZnVuY3Rpb24gdyh0LGUpe2NvbnN0IG49dCxyPVtdO2xldCBvLHMsaSxjLHU7aWYoIW58fCFuLnRhZ05hbWUpcmV0dXJuIiI7aWYodi5IVE1MRWxlbWVudCYmbiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZuLmRhdGFzZXQpe2lmKG4uZGF0YXNldC5zZW50cnlDb21wb25lbnQpcmV0dXJuIG4uZGF0YXNldC5zZW50cnlDb21wb25lbnQ7aWYobi5kYXRhc2V0LnNlbnRyeUVsZW1lbnQpcmV0dXJuIG4uZGF0YXNldC5zZW50cnlFbGVtZW50fXIucHVzaChuLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7Y29uc3QgYT1lJiZlLmxlbmd0aD9lLmZpbHRlcigodD0+bi5nZXRBdHRyaWJ1dGUodCkpKS5tYXAoKHQ9Plt0LG4uZ2V0QXR0cmlidXRlKHQpXSkpOm51bGw7aWYoYSYmYS5sZW5ndGgpYS5mb3JFYWNoKCh0PT57ci5wdXNoKGBbJHt0WzBdfT0iJHt0WzFdfSJdYCl9KSk7ZWxzZSBpZihuLmlkJiZyLnB1c2goYCMke24uaWR9YCksbz1uLmNsYXNzTmFtZSxvJiZsKG8sIlN0cmluZyIpKWZvcihzPW8uc3BsaXQoL1xzKy8pLHU9MDt1PHMubGVuZ3RoO3UrKylyLnB1c2goYC4ke3NbdV19YCk7Y29uc3QgZj1bImFyaWEtbGFiZWwiLCJ0eXBlIiwibmFtZSIsInRpdGxlIiwiYWx0Il07Zm9yKHU9MDt1PGYubGVuZ3RoO3UrKylpPWZbdV0sYz1uLmdldEF0dHJpYnV0ZShpKSxjJiZyLnB1c2goYFske2l9PSIke2N9Il1gKTtyZXR1cm4gci5qb2luKCIiKX1jb25zdCBTPSJ1bmRlZmluZWQiPT10eXBlb2YgX19TRU5UUllfREVCVUdfX3x8X19TRU5UUllfREVCVUdfXywkPVsiZGVidWciLCJpbmZvIiwid2FybiIsImVycm9yIiwibG9nIiwiYXNzZXJ0IiwidHJhY2UiXSxFPXt9O2Z1bmN0aW9uIHgodCl7aWYoISgiY29uc29sZSJpbiB5KSlyZXR1cm4gdCgpO2NvbnN0IGU9eS5jb25zb2xlLG49e30scj1PYmplY3Qua2V5cyhFKTtyLmZvckVhY2goKHQ9Pntjb25zdCByPUVbdF07blt0XT1lW3RdLGVbdF09cn0pKTt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e3IuZm9yRWFjaCgodD0+e2VbdF09blt0XX0pKX19Y29uc3QgTj1mdW5jdGlvbigpe2xldCB0PSExO2NvbnN0IGU9e2VuYWJsZTooKT0+e3Q9ITB9LGRpc2FibGU6KCk9Pnt0PSExfSxpc0VuYWJsZWQ6KCk9PnR9O3JldHVybiBTPyQuZm9yRWFjaCgobj0+e2Vbbl09KC4uLmUpPT57dCYmeCgoKCk9Pnt5LmNvbnNvbGVbbl0oYFNlbnRyeSBMb2dnZXIgWyR7bn1dOmAsLi4uZSl9KSl9fSkpOiQuZm9yRWFjaCgodD0+e2VbdF09KCk9Pnt9fSkpLGV9KCk7ZnVuY3Rpb24gayh0LGU9ITEpe2NvbnN0e2hvc3Q6bixwYXRoOnIscGFzczpvLHBvcnQ6cyxwcm9qZWN0SWQ6aSxwcm90b2NvbDpjLHB1YmxpY0tleTp1fT10O3JldHVybmAke2N9Oi8vJHt1fSR7ZSYmbz9gOiR7b31gOiIifUAke259JHtzP2A6JHtzfWA6IiJ9LyR7cj9gJHtyfS9gOnJ9JHtpfWB9Y2xhc3MgQyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsZT0id2FybiIpe3N1cGVyKHQpLHRoaXMubWVzc2FnZT10LHRoaXMubmFtZT1uZXcudGFyZ2V0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKSx0aGlzLmxvZ0xldmVsPWV9fWZ1bmN0aW9uIEQodCl7aWYoZnVuY3Rpb24odCl7c3dpdGNoKHAuY2FsbCh0KSl7Y2FzZSJbb2JqZWN0IEVycm9yXSI6Y2FzZSJbb2JqZWN0IEV4Y2VwdGlvbl0iOmNhc2UiW29iamVjdCBET01FeGNlcHRpb25dIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiBnKHQsRXJyb3IpfX0odCkpcmV0dXJue21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2ssLi4uTyh0KX07aWYoZT10LCJ1bmRlZmluZWQiIT10eXBlb2YgRXZlbnQmJmcoZSxFdmVudCkpe2NvbnN0IGU9e3R5cGU6dC50eXBlLHRhcmdldDpUKHQudGFyZ2V0KSxjdXJyZW50VGFyZ2V0OlQodC5jdXJyZW50VGFyZ2V0KSwuLi5PKHQpfTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEN1c3RvbUV2ZW50JiZnKHQsQ3VzdG9tRXZlbnQpJiYoZS5kZXRhaWw9dC5kZXRhaWwpLGV9cmV0dXJuIHQ7dmFyIGV9ZnVuY3Rpb24gVCh0KXt0cnl7cmV0dXJuIGU9dCwidW5kZWZpbmVkIiE9dHlwZW9mIEVsZW1lbnQmJmcoZSxFbGVtZW50KT9mdW5jdGlvbih0LGU9e30pe2lmKCF0KXJldHVybiI8dW5rbm93bj4iO3RyeXtsZXQgbj10O2NvbnN0IHI9NSxvPVtdO2xldCBzPTAsaT0wO2NvbnN0IGM9IiA+ICIsdT1jLmxlbmd0aDtsZXQgYTtjb25zdCBmPUFycmF5LmlzQXJyYXkoZSk/ZTplLmtleUF0dHJzLGg9IUFycmF5LmlzQXJyYXkoZSkmJmUubWF4U3RyaW5nTGVuZ3RofHxfO2Zvcig7biYmcysrPHImJihhPXcobixmKSwhKCJodG1sIj09PWF8fHM+MSYmaStvLmxlbmd0aCp1K2EubGVuZ3RoPj1oKSk7KW8ucHVzaChhKSxpKz1hLmxlbmd0aCxuPW4ucGFyZW50Tm9kZTtyZXR1cm4gby5yZXZlcnNlKCkuam9pbihjKX1jYXRjaCh0KXtyZXR1cm4iPHVua25vd24+In19KHQpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1jYXRjaCh0KXtyZXR1cm4iPHVua25vd24+In12YXIgZX1mdW5jdGlvbiBPKHQpe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQpe2NvbnN0IGU9e307Zm9yKGNvbnN0IG4gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGV9cmV0dXJue319ZnVuY3Rpb24gaih0KXtyZXR1cm4gUih0LG5ldyBNYXApfWZ1bmN0aW9uIFIodCxlKXtpZihmdW5jdGlvbih0KXtpZighZCh0KSlyZXR1cm4hMTt0cnl7Y29uc3QgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IubmFtZTtyZXR1cm4hZXx8Ik9iamVjdCI9PT1lfWNhdGNoKHQpe3JldHVybiEwfX0odCkpe2NvbnN0IG49ZS5nZXQodCk7aWYodm9pZCAwIT09bilyZXR1cm4gbjtjb25zdCByPXt9O2Uuc2V0KHQscik7Zm9yKGNvbnN0IG4gb2YgT2JqZWN0LmtleXModCkpdm9pZCAwIT09dFtuXSYmKHJbbl09Uih0W25dLGUpKTtyZXR1cm4gcn1pZihBcnJheS5pc0FycmF5KHQpKXtjb25zdCBuPWUuZ2V0KHQpO2lmKHZvaWQgMCE9PW4pcmV0dXJuIG47Y29uc3Qgcj1bXTtyZXR1cm4gZS5zZXQodCxyKSx0LmZvckVhY2goKHQ9PntyLnB1c2goUih0LGUpKX0pKSxyfXJldHVybiB0fWNvbnN0IEE9NTAsST0iPyIsUD0vY2FwdHVyZU1lc3NhZ2V8Y2FwdHVyZUV4Y2VwdGlvbi87Y29uc3QgVT0iPGFub255bW91cz4iO2NvbnN0IE09MWUzO2Z1bmN0aW9uIEwoKXtyZXR1cm4gRGF0ZS5ub3coKS9NfWNvbnN0IEI9ZnVuY3Rpb24oKXtjb25zdHtwZXJmb3JtYW5jZTp0fT15O2lmKCF0fHwhdC5ub3cpcmV0dXJuIEw7Y29uc3QgZT1EYXRlLm5vdygpLXQubm93KCksbj1udWxsPT10LnRpbWVPcmlnaW4/ZTp0LnRpbWVPcmlnaW47cmV0dXJuKCk9PihuK3Qubm93KCkpL019KCk7ZnVuY3Rpb24gRygpe2NvbnN0IHQ9eSxlPXQuY3J5cHRvfHx0Lm1zQ3J5cHRvO2xldCBuPSgpPT4xNipNYXRoLnJhbmRvbSgpO3RyeXtpZihlJiZlLnJhbmRvbVVVSUQpcmV0dXJuIGUucmFuZG9tVVVJRCgpLnJlcGxhY2UoLy0vZywiIik7ZSYmZS5nZXRSYW5kb21WYWx1ZXMmJihuPSgpPT57Y29uc3QgdD1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZS5nZXRSYW5kb21WYWx1ZXModCksdFswXX0pfWNhdGNoKHQpe31yZXR1cm4oWzFlN10rMWUzKzRlMys4ZTMrMWUxMSkucmVwbGFjZSgvWzAxOF0vZywodD0+KHReKDE1Jm4oKSk+PnQvNCkudG9TdHJpbmcoMTYpKSl9ZnVuY3Rpb24gSih0LGU9MTAwLG49MS8wKXt0cnl7cmV0dXJuIHooIiIsdCxlLG4pfWNhdGNoKHQpe3JldHVybntFUlJPUjpgKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH19fWZ1bmN0aW9uIHoodCxlLG49MS8wLHI9MS8wLG89ZnVuY3Rpb24oKXtjb25zdCB0PSJmdW5jdGlvbiI9PXR5cGVvZiBXZWFrU2V0LGU9dD9uZXcgV2Vha1NldDpbXTtyZXR1cm5bZnVuY3Rpb24obil7aWYodClyZXR1cm4hIWUuaGFzKG4pfHwoZS5hZGQobiksITEpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKGVbdF09PT1uKXJldHVybiEwO3JldHVybiBlLnB1c2gobiksITF9LGZ1bmN0aW9uKG4pe2lmKHQpZS5kZWxldGUobik7ZWxzZSBmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylpZihlW3RdPT09bil7ZS5zcGxpY2UodCwxKTticmVha319XX0oKSl7Y29uc3RbcyxpXT1vO2lmKG51bGw9PWV8fFsibnVtYmVyIiwiYm9vbGVhbiIsInN0cmluZyJdLmluY2x1ZGVzKHR5cGVvZiBlKSYmIU51bWJlci5pc05hTihlKSlyZXR1cm4gZTtjb25zdCBjPWZ1bmN0aW9uKHQsZSl7dHJ5e2lmKCJkb21haW4iPT09dCYmZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZlLnQpcmV0dXJuIltEb21haW5dIjtpZigiZG9tYWluRW1pdHRlciI9PT10KXJldHVybiJbRG9tYWluRW1pdHRlcl0iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZlPT09Z2xvYmFsKXJldHVybiJbR2xvYmFsXSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJmU9PT13aW5kb3cpcmV0dXJuIltXaW5kb3ddIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZlPT09ZG9jdW1lbnQpcmV0dXJuIltEb2N1bWVudF0iO2lmKCJvYmplY3QiPT10eXBlb2Yobj1lKSYmbnVsbCE9PW4mJihuLl9faXNWdWV8fG4ubykpcmV0dXJuIltWdWVWaWV3TW9kZWxdIjtpZihmdW5jdGlvbih0KXtyZXR1cm4gZCh0KSYmIm5hdGl2ZUV2ZW50ImluIHQmJiJwcmV2ZW50RGVmYXVsdCJpbiB0JiYic3RvcFByb3BhZ2F0aW9uImluIHR9KGUpKXJldHVybiJbU3ludGhldGljRXZlbnRdIjtpZigibnVtYmVyIj09dHlwZW9mIGUmJmUhPWUpcmV0dXJuIltOYU5dIjtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSlyZXR1cm5gW0Z1bmN0aW9uOiAke2Z1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQubmFtZXx8VX1jYXRjaCh0KXtyZXR1cm4gVX19KGUpfV1gO2lmKCJzeW1ib2wiPT10eXBlb2YgZSlyZXR1cm5gWyR7U3RyaW5nKGUpfV1gO2lmKCJiaWdpbnQiPT10eXBlb2YgZSlyZXR1cm5gW0JpZ0ludDogJHtTdHJpbmcoZSl9XWA7Y29uc3Qgcj1mdW5jdGlvbih0KXtjb25zdCBlPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtyZXR1cm4gZT9lLmNvbnN0cnVjdG9yLm5hbWU6Im51bGwgcHJvdG90eXBlIn0oZSk7cmV0dXJuL15IVE1MKFx3KilFbGVtZW50JC8udGVzdChyKT9gW0hUTUxFbGVtZW50OiAke3J9XWA6YFtvYmplY3QgJHtyfV1gfWNhdGNoKHQpe3JldHVybmAqKm5vbi1zZXJpYWxpemFibGUqKiAoJHt0fSlgfXZhciBufSh0LGUpO2lmKCFjLnN0YXJ0c1dpdGgoIltvYmplY3QgIikpcmV0dXJuIGM7aWYoZS5fX3NlbnRyeV9za2lwX25vcm1hbGl6YXRpb25fXylyZXR1cm4gZTtjb25zdCB1PSJudW1iZXIiPT10eXBlb2YgZS5fX3NlbnRyeV9vdmVycmlkZV9ub3JtYWxpemF0aW9uX2RlcHRoX18/ZS5fX3NlbnRyeV9vdmVycmlkZV9ub3JtYWxpemF0aW9uX2RlcHRoX186bjtpZigwPT09dSlyZXR1cm4gYy5yZXBsYWNlKCJvYmplY3QgIiwiIik7aWYocyhlKSlyZXR1cm4iW0NpcmN1bGFyIH5dIjtjb25zdCBhPWU7aWYoYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEudG9KU09OKXRyeXtyZXR1cm4geigiIixhLnRvSlNPTigpLHUtMSxyLG8pfWNhdGNoKHQpe31jb25zdCBmPUFycmF5LmlzQXJyYXkoZSk/W106e307bGV0IGg9MDtjb25zdCBwPUQoZSk7Zm9yKGNvbnN0IHQgaW4gcCl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwLHQpKWNvbnRpbnVlO2lmKGg+PXIpe2ZbdF09IltNYXhQcm9wZXJ0aWVzIH5dIjticmVha31jb25zdCBlPXBbdF07Zlt0XT16KHQsZSx1LTEscixvKSxoKyt9cmV0dXJuIGkoZSksZn1mdW5jdGlvbiBIKHQsZSl7Y29uc3Qgbj1lLnJlcGxhY2UoL1xcL2csIi8iKS5yZXBsYWNlKC9bfFxce30oKVtcXV4kKyo/Ll0vZywiXFwkJiIpO2xldCByPXQ7dHJ5e3I9ZGVjb2RlVVJJKHQpfWNhdGNoKHQpe31yZXR1cm4gci5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSgvd2VicGFjazpcLz8vZywiIikucmVwbGFjZShuZXcgUmVnRXhwKGAoZmlsZTovLyk/Lyoke259LypgLCJpZyIpLCJhcHA6Ly8vIil9KCgpPT57Y29uc3R7cGVyZm9ybWFuY2U6dH09eTtpZighdHx8IXQubm93KXJldHVybjtjb25zdCBlPTM2ZTUsbj10Lm5vdygpLHI9RGF0ZS5ub3coKSxvPXQudGltZU9yaWdpbj9NYXRoLmFicyh0LnRpbWVPcmlnaW4rbi1yKTplLHM9bzxlLGk9dC50aW1pbmcmJnQudGltaW5nLm5hdmlnYXRpb25TdGFydCxjPSJudW1iZXIiPT10eXBlb2YgaT9NYXRoLmFicyhpK24tcik6ZTsoc3x8YzxlKSYmKG88PWMmJnQudGltZU9yaWdpbil9KSgpO2NvbnN0IFc9L14oXFMrOlxcfFwvPykoW1xzXFNdKj8pKCg/OlwuezEsMn18W14vXFxdKz98KShcLlteLi9cXF0qfCkpKD86Wy9cXF0qKSQvO2Z1bmN0aW9uIFkodCl7Y29uc3QgZT1mdW5jdGlvbih0KXtjb25zdCBlPXQubGVuZ3RoPjEwMjQ/YDx0cnVuY2F0ZWQ+JHt0LnNsaWNlKC0xMDI0KX1gOnQsbj1XLmV4ZWMoZSk7cmV0dXJuIG4/bi5zbGljZSgxKTpbXX0odCksbj1lWzBdO2xldCByPWVbMV07cmV0dXJuIG58fHI/KHImJihyPXIuc2xpY2UoMCxyLmxlbmd0aC0xKSksbityKToiLiJ9dmFyIHE7ZnVuY3Rpb24gRih0KXtyZXR1cm4gbmV3IEsoKGU9PntlKHQpfSkpfSFmdW5jdGlvbih0KXt0W3QuUEVORElORz0wXT0iUEVORElORyI7dFt0LlJFU09MVkVEPTFdPSJSRVNPTFZFRCI7dFt0LlJFSkVDVEVEPTJdPSJSRUpFQ1RFRCJ9KHF8fChxPXt9KSk7Y2xhc3MgS3tjb25zdHJ1Y3Rvcih0KXtLLnByb3RvdHlwZS5fX2luaXQuY2FsbCh0aGlzKSxLLnByb3RvdHlwZS5fX2luaXQyLmNhbGwodGhpcyksSy5wcm90b3R5cGUuX19pbml0My5jYWxsKHRoaXMpLEsucHJvdG90eXBlLl9faW5pdDQuY2FsbCh0aGlzKSx0aGlzLmk9cS5QRU5ESU5HLHRoaXMudT1bXTt0cnl7dCh0aGlzLmgsdGhpcy5wKX1jYXRjaCh0KXt0aGlzLnAodCl9fXRoZW4odCxlKXtyZXR1cm4gbmV3IEsoKChuLHIpPT57dGhpcy51LnB1c2goWyExLGU9PntpZih0KXRyeXtuKHQoZSkpfWNhdGNoKHQpe3IodCl9ZWxzZSBuKGUpfSx0PT57aWYoZSl0cnl7bihlKHQpKX1jYXRjaCh0KXtyKHQpfWVsc2Ugcih0KX1dKSx0aGlzLmwoKX0pKX1jYXRjaCh0KXtyZXR1cm4gdGhpcy50aGVuKCh0PT50KSx0KX1maW5hbGx5KHQpe3JldHVybiBuZXcgSygoKGUsbik9PntsZXQgcixvO3JldHVybiB0aGlzLnRoZW4oKGU9PntvPSExLHI9ZSx0JiZ0KCl9KSwoZT0+e289ITAscj1lLHQmJnQoKX0pKS50aGVuKCgoKT0+e28/bihyKTplKHIpfSkpfSkpfV9faW5pdCgpe3RoaXMuaD10PT57dGhpcy5tKHEuUkVTT0xWRUQsdCl9fV9faW5pdDIoKXt0aGlzLnA9dD0+e3RoaXMubShxLlJFSkVDVEVELHQpfX1fX2luaXQzKCl7dGhpcy5tPSh0LGUpPT57dGhpcy5pPT09cS5QRU5ESU5HJiYobShlKT9lLnRoZW4odGhpcy5oLHRoaXMucCk6KHRoaXMuaT10LHRoaXMudj1lLHRoaXMubCgpKSl9fV9faW5pdDQoKXt0aGlzLmw9KCk9PntpZih0aGlzLmk9PT1xLlBFTkRJTkcpcmV0dXJuO2NvbnN0IHQ9dGhpcy51LnNsaWNlKCk7dGhpcy51PVtdLHQuZm9yRWFjaCgodD0+e3RbMF18fCh0aGlzLmk9PT1xLlJFU09MVkVEJiZ0WzFdKHRoaXMudiksdGhpcy5pPT09cS5SRUpFQ1RFRCYmdFsyXSh0aGlzLnYpLHRbMF09ITApfSkpfX19ZnVuY3Rpb24gVih0KXtjb25zdCBlPVtdO2Z1bmN0aW9uIG4odCl7cmV0dXJuIGUuc3BsaWNlKGUuaW5kZXhPZih0KSwxKVswXX1yZXR1cm57JDplLGFkZDpmdW5jdGlvbihyKXtpZighKHZvaWQgMD09PXR8fGUubGVuZ3RoPHQpKXJldHVybiBvPW5ldyBDKCJOb3QgYWRkaW5nIFByb21pc2UgYmVjYXVzZSBidWZmZXIgbGltaXQgd2FzIHJlYWNoZWQuIiksbmV3IEsoKCh0LGUpPT57ZShvKX0pKTt2YXIgbztjb25zdCBzPXIoKTtyZXR1cm4tMT09PWUuaW5kZXhPZihzKSYmZS5wdXNoKHMpLHMudGhlbigoKCk9Pm4ocykpKS50aGVuKG51bGwsKCgpPT5uKHMpLnRoZW4obnVsbCwoKCk9Pnt9KSkpKSxzfSxkcmFpbjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEsoKChuLHIpPT57bGV0IG89ZS5sZW5ndGg7aWYoIW8pcmV0dXJuIG4oITApO2NvbnN0IHM9c2V0VGltZW91dCgoKCk9Pnt0JiZ0PjAmJm4oITEpfSksdCk7ZS5mb3JFYWNoKCh0PT57Rih0KS50aGVuKCgoKT0+ey0tb3x8KGNsZWFyVGltZW91dChzKSxuKCEwKSl9KSxyKX0pKX0pKX19fWZ1bmN0aW9uIFoodCxlPSExKXtyZXR1cm4hKGV8fHQmJiF0LnN0YXJ0c1dpdGgoIi8iKSYmIXQubWF0Y2goL15bQS1aXTovKSYmIXQuc3RhcnRzV2l0aCgiLiIpJiYhdC5tYXRjaCgvXlthLXpBLVpdKFthLXpBLVowLTkuXC0rXSkqOlwvXC8vKSkmJnZvaWQgMCE9PXQmJiF0LmluY2x1ZGVzKCJub2RlX21vZHVsZXMvIil9ZnVuY3Rpb24gUSh0LGU9W10pe3JldHVyblt0LGVdfWZ1bmN0aW9uIFgodCxlKXtjb25zdCBuPXRbMV07Zm9yKGNvbnN0IHQgb2Ygbil7aWYoZSh0LHRbMF0udHlwZSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gdHQodCl7cmV0dXJuIHkuX19TRU5UUllfXyYmeS5fX1NFTlRSWV9fLmVuY29kZVBvbHlmaWxsP3kuX19TRU5UUllfXy5lbmNvZGVQb2x5ZmlsbCh0KToobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCl9ZnVuY3Rpb24gZXQodCl7Y29uc3RbZSxuXT10O2xldCByPUpTT04uc3RyaW5naWZ5KGUpO2Z1bmN0aW9uIG8odCl7InN0cmluZyI9PXR5cGVvZiByP3I9InN0cmluZyI9PXR5cGVvZiB0P3IrdDpbdHQociksdF06ci5wdXNoKCJzdHJpbmciPT10eXBlb2YgdD90dCh0KTp0KX1mb3IoY29uc3QgdCBvZiBuKXtjb25zdFtlLG5dPXQ7aWYobyhgXG4ke0pTT04uc3RyaW5naWZ5KGUpfVxuYCksInN0cmluZyI9PXR5cGVvZiBufHxuIGluc3RhbmNlb2YgVWludDhBcnJheSlvKG4pO2Vsc2V7bGV0IHQ7dHJ5e3Q9SlNPTi5zdHJpbmdpZnkobil9Y2F0Y2goZSl7dD1KU09OLnN0cmluZ2lmeShKKG4pKX1vKHQpfX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHI/cjpmdW5jdGlvbih0KXtjb25zdCBlPXQucmVkdWNlKCgodCxlKT0+dCtlLmxlbmd0aCksMCksbj1uZXcgVWludDhBcnJheShlKTtsZXQgcj0wO2Zvcihjb25zdCBlIG9mIHQpbi5zZXQoZSxyKSxyKz1lLmxlbmd0aDtyZXR1cm4gbn0ocil9Y29uc3QgbnQ9e3Nlc3Npb246InNlc3Npb24iLHNlc3Npb25zOiJzZXNzaW9uIixhdHRhY2htZW50OiJhdHRhY2htZW50Iix0cmFuc2FjdGlvbjoidHJhbnNhY3Rpb24iLGV2ZW50OiJlcnJvciIsY2xpZW50X3JlcG9ydDoiaW50ZXJuYWwiLHVzZXJfcmVwb3J0OiJkZWZhdWx0Iixwcm9maWxlOiJwcm9maWxlIixyZXBsYXlfZXZlbnQ6InJlcGxheSIscmVwbGF5X3JlY29yZGluZzoicmVwbGF5IixjaGVja19pbjoibW9uaXRvciIsZmVlZGJhY2s6ImZlZWRiYWNrIixzcGFuOiJzcGFuIixzdGF0c2Q6Im1ldHJpY19idWNrZXQifTtmdW5jdGlvbiBydCh0KXtyZXR1cm4gbnRbdF19ZnVuY3Rpb24gb3QodCl7aWYoIXR8fCF0LnNkaylyZXR1cm47Y29uc3R7bmFtZTplLHZlcnNpb246bn09dC5zZGs7cmV0dXJue25hbWU6ZSx2ZXJzaW9uOm59fWNvbnN0IHN0PTZlNDtmdW5jdGlvbiBpdCh0LHtzdGF0dXNDb2RlOmUsaGVhZGVyczpufSxyPURhdGUubm93KCkpe2NvbnN0IG89ey4uLnR9LHM9biYmblsieC1zZW50cnktcmF0ZS1saW1pdHMiXSxpPW4mJm5bInJldHJ5LWFmdGVyIl07aWYocylmb3IoY29uc3QgdCBvZiBzLnRyaW0oKS5zcGxpdCgiLCIpKXtjb25zdFtlLG4sLCxzXT10LnNwbGl0KCI6Iiw1KSxpPXBhcnNlSW50KGUsMTApLGM9MWUzKihpc05hTihpKT82MDppKTtpZihuKWZvcihjb25zdCB0IG9mIG4uc3BsaXQoIjsiKSkibWV0cmljX2J1Y2tldCI9PT10JiZzJiYhcy5zcGxpdCgiOyIpLmluY2x1ZGVzKCJjdXN0b20iKXx8KG9bdF09citjKTtlbHNlIG8uYWxsPXIrY31lbHNlIGk/by5hbGw9citmdW5jdGlvbih0LGU9RGF0ZS5ub3coKSl7Y29uc3Qgbj1wYXJzZUludChgJHt0fWAsMTApO2lmKCFpc05hTihuKSlyZXR1cm4gMWUzKm47Y29uc3Qgcj1EYXRlLnBhcnNlKGAke3R9YCk7cmV0dXJuIGlzTmFOKHIpP3N0OnItZX0oaSxyKTo0Mjk9PT1lJiYoby5hbGw9cis2ZTQpO3JldHVybiBvfWNvbnN0IGN0PSJ1bmRlZmluZWQiPT10eXBlb2YgX19TRU5UUllfREVCVUdfX3x8X19TRU5UUllfREVCVUdfXztmdW5jdGlvbiB1dCgpe3JldHVybiBhdCh5KSx5fWZ1bmN0aW9uIGF0KHQpe3JldHVybiB0Ll9fU0VOVFJZX198fCh0Ll9fU0VOVFJZX189e2V4dGVuc2lvbnM6e319KSx0Ll9fU0VOVFJZX199ZnVuY3Rpb24gZnQodCl7Y29uc3QgZT1CKCksbj17c2lkOkcoKSxpbml0OiEwLHRpbWVzdGFtcDplLHN0YXJ0ZWQ6ZSxkdXJhdGlvbjowLHN0YXR1czoib2siLGVycm9yczowLGlnbm9yZUR1cmF0aW9uOiExLHRvSlNPTjooKT0+ZnVuY3Rpb24odCl7cmV0dXJuIGooe3NpZDpgJHt0LnNpZH1gLGluaXQ6dC5pbml0LHN0YXJ0ZWQ6bmV3IERhdGUoMWUzKnQuc3RhcnRlZCkudG9JU09TdHJpbmcoKSx0aW1lc3RhbXA6bmV3IERhdGUoMWUzKnQudGltZXN0YW1wKS50b0lTT1N0cmluZygpLHN0YXR1czp0LnN0YXR1cyxlcnJvcnM6dC5lcnJvcnMsZGlkOiJudW1iZXIiPT10eXBlb2YgdC5kaWR8fCJzdHJpbmciPT10eXBlb2YgdC5kaWQ/YCR7dC5kaWR9YDp2b2lkIDAsZHVyYXRpb246dC5kdXJhdGlvbixhYm5vcm1hbF9tZWNoYW5pc206dC5hYm5vcm1hbF9tZWNoYW5pc20sYXR0cnM6e3JlbGVhc2U6dC5yZWxlYXNlLGVudmlyb25tZW50OnQuZW52aXJvbm1lbnQsaXBfYWRkcmVzczp0LmlwQWRkcmVzcyx1c2VyX2FnZW50OnQudXNlckFnZW50fX0pfShuKX07cmV0dXJuIHQmJmh0KG4sdCksbn1mdW5jdGlvbiBodCh0LGU9e30pe2lmKGUudXNlciYmKCF0LmlwQWRkcmVzcyYmZS51c2VyLmlwX2FkZHJlc3MmJih0LmlwQWRkcmVzcz1lLnVzZXIuaXBfYWRkcmVzcyksdC5kaWR8fGUuZGlkfHwodC5kaWQ9ZS51c2VyLmlkfHxlLnVzZXIuZW1haWx8fGUudXNlci51c2VybmFtZSkpLHQudGltZXN0YW1wPWUudGltZXN0YW1wfHxCKCksZS5hYm5vcm1hbF9tZWNoYW5pc20mJih0LmFibm9ybWFsX21lY2hhbmlzbT1lLmFibm9ybWFsX21lY2hhbmlzbSksZS5pZ25vcmVEdXJhdGlvbiYmKHQuaWdub3JlRHVyYXRpb249ZS5pZ25vcmVEdXJhdGlvbiksZS5zaWQmJih0LnNpZD0zMj09PWUuc2lkLmxlbmd0aD9lLnNpZDpHKCkpLHZvaWQgMCE9PWUuaW5pdCYmKHQuaW5pdD1lLmluaXQpLCF0LmRpZCYmZS5kaWQmJih0LmRpZD1gJHtlLmRpZH1gKSwibnVtYmVyIj09dHlwZW9mIGUuc3RhcnRlZCYmKHQuc3RhcnRlZD1lLnN0YXJ0ZWQpLHQuaWdub3JlRHVyYXRpb24pdC5kdXJhdGlvbj12b2lkIDA7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGUuZHVyYXRpb24pdC5kdXJhdGlvbj1lLmR1cmF0aW9uO2Vsc2V7Y29uc3QgZT10LnRpbWVzdGFtcC10LnN0YXJ0ZWQ7dC5kdXJhdGlvbj1lPj0wP2U6MH1lLnJlbGVhc2UmJih0LnJlbGVhc2U9ZS5yZWxlYXNlKSxlLmVudmlyb25tZW50JiYodC5lbnZpcm9ubWVudD1lLmVudmlyb25tZW50KSwhdC5pcEFkZHJlc3MmJmUuaXBBZGRyZXNzJiYodC5pcEFkZHJlc3M9ZS5pcEFkZHJlc3MpLCF0LnVzZXJBZ2VudCYmZS51c2VyQWdlbnQmJih0LnVzZXJBZ2VudD1lLnVzZXJBZ2VudCksIm51bWJlciI9PXR5cGVvZiBlLmVycm9ycyYmKHQuZXJyb3JzPWUuZXJyb3JzKSxlLnN0YXR1cyYmKHQuc3RhdHVzPWUuc3RhdHVzKX1jb25zdCBwdD0iX3NlbnRyeVNwYW4iO2Z1bmN0aW9uIGx0KHQsZSl7ZT9mdW5jdGlvbih0LGUsbil7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9Y2F0Y2gobil7UyYmTi5sb2coYEZhaWxlZCB0byBhZGQgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgIiR7ZX0iIHRvIG9iamVjdGAsdCl9fSh0LHB0LGUpOmRlbGV0ZSB0W3B0XX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gdFtwdF19Y2xhc3MgbXR7Y29uc3RydWN0b3IoKXt0aGlzLl89ITEsdGhpcy5TPVtdLHRoaXMuTj1bXSx0aGlzLms9W10sdGhpcy5DPVtdLHRoaXMuRD17fSx0aGlzLlQ9e30sdGhpcy5PPXt9LHRoaXMuaj17fSx0aGlzLlI9e30sdGhpcy5BPXl0KCl9Y2xvbmUoKXtjb25zdCB0PW5ldyBtdDtyZXR1cm4gdC5rPVsuLi50aGlzLmtdLHQuVD17Li4udGhpcy5UfSx0Lk89ey4uLnRoaXMuT30sdC5qPXsuLi50aGlzLmp9LHQuRD10aGlzLkQsdC5JPXRoaXMuSSx0LlA9dGhpcy5QLHQuVT10aGlzLlUsdC5NPXRoaXMuTSx0Lk49Wy4uLnRoaXMuTl0sdC5MPXRoaXMuTCx0LkM9Wy4uLnRoaXMuQ10sdC5SPXsuLi50aGlzLlJ9LHQuQT17Li4udGhpcy5BfSx0LkI9dGhpcy5CLHQuRz10aGlzLkcsbHQodCxkdCh0aGlzKSksdH1zZXRDbGllbnQodCl7dGhpcy5CPXR9c2V0TGFzdEV2ZW50SWQodCl7dGhpcy5HPXR9Z2V0Q2xpZW50KCl7cmV0dXJuIHRoaXMuQn1sYXN0RXZlbnRJZCgpe3JldHVybiB0aGlzLkd9YWRkU2NvcGVMaXN0ZW5lcih0KXt0aGlzLlMucHVzaCh0KX1hZGRFdmVudFByb2Nlc3Nvcih0KXtyZXR1cm4gdGhpcy5OLnB1c2godCksdGhpc31zZXRVc2VyKHQpe3JldHVybiB0aGlzLkQ9dHx8e2VtYWlsOnZvaWQgMCxpZDp2b2lkIDAsaXBfYWRkcmVzczp2b2lkIDAsdXNlcm5hbWU6dm9pZCAwfSx0aGlzLlAmJmh0KHRoaXMuUCx7dXNlcjp0fSksdGhpcy5KKCksdGhpc31nZXRVc2VyKCl7cmV0dXJuIHRoaXMuRH1nZXRSZXF1ZXN0U2Vzc2lvbigpe3JldHVybiB0aGlzLkx9c2V0UmVxdWVzdFNlc3Npb24odCl7cmV0dXJuIHRoaXMuTD10LHRoaXN9c2V0VGFncyh0KXtyZXR1cm4gdGhpcy5UPXsuLi50aGlzLlQsLi4udH0sdGhpcy5KKCksdGhpc31zZXRUYWcodCxlKXtyZXR1cm4gdGhpcy5UPXsuLi50aGlzLlQsW3RdOmV9LHRoaXMuSigpLHRoaXN9c2V0RXh0cmFzKHQpe3JldHVybiB0aGlzLk89ey4uLnRoaXMuTywuLi50fSx0aGlzLkooKSx0aGlzfXNldEV4dHJhKHQsZSl7cmV0dXJuIHRoaXMuTz17Li4udGhpcy5PLFt0XTplfSx0aGlzLkooKSx0aGlzfXNldEZpbmdlcnByaW50KHQpe3JldHVybiB0aGlzLk09dCx0aGlzLkooKSx0aGlzfXNldExldmVsKHQpe3JldHVybiB0aGlzLkk9dCx0aGlzLkooKSx0aGlzfXNldFRyYW5zYWN0aW9uTmFtZSh0KXtyZXR1cm4gdGhpcy5VPXQsdGhpcy5KKCksdGhpc31zZXRDb250ZXh0KHQsZSl7cmV0dXJuIG51bGw9PT1lP2RlbGV0ZSB0aGlzLmpbdF06dGhpcy5qW3RdPWUsdGhpcy5KKCksdGhpc31zZXRTZXNzaW9uKHQpe3JldHVybiB0P3RoaXMuUD10OmRlbGV0ZSB0aGlzLlAsdGhpcy5KKCksdGhpc31nZXRTZXNzaW9uKCl7cmV0dXJuIHRoaXMuUH11cGRhdGUodCl7aWYoIXQpcmV0dXJuIHRoaXM7Y29uc3QgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90KHRoaXMpOnQsW24scl09ZSBpbnN0YW5jZW9mIGd0P1tlLmdldFNjb3BlRGF0YSgpLGUuZ2V0UmVxdWVzdFNlc3Npb24oKV06ZChlKT9bdCx0LnJlcXVlc3RTZXNzaW9uXTpbXSx7dGFnczpvLGV4dHJhOnMsdXNlcjppLGNvbnRleHRzOmMsbGV2ZWw6dSxmaW5nZXJwcmludDphPVtdLHByb3BhZ2F0aW9uQ29udGV4dDpmfT1ufHx7fTtyZXR1cm4gdGhpcy5UPXsuLi50aGlzLlQsLi4ub30sdGhpcy5PPXsuLi50aGlzLk8sLi4uc30sdGhpcy5qPXsuLi50aGlzLmosLi4uY30saSYmT2JqZWN0LmtleXMoaSkubGVuZ3RoJiYodGhpcy5EPWkpLHUmJih0aGlzLkk9dSksYS5sZW5ndGgmJih0aGlzLk09YSksZiYmKHRoaXMuQT1mKSxyJiYodGhpcy5MPXIpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy5rPVtdLHRoaXMuVD17fSx0aGlzLk89e30sdGhpcy5EPXt9LHRoaXMuaj17fSx0aGlzLkk9dm9pZCAwLHRoaXMuVT12b2lkIDAsdGhpcy5NPXZvaWQgMCx0aGlzLkw9dm9pZCAwLHRoaXMuUD12b2lkIDAsbHQodGhpcyx2b2lkIDApLHRoaXMuQz1bXSx0aGlzLkE9eXQoKSx0aGlzLkooKSx0aGlzfWFkZEJyZWFkY3J1bWIodCxlKXtjb25zdCBuPSJudW1iZXIiPT10eXBlb2YgZT9lOjEwMDtpZihuPD0wKXJldHVybiB0aGlzO2NvbnN0IHI9e3RpbWVzdGFtcDpMKCksLi4udH0sbz10aGlzLms7cmV0dXJuIG8ucHVzaChyKSx0aGlzLms9by5sZW5ndGg+bj9vLnNsaWNlKC1uKTpvLHRoaXMuSigpLHRoaXN9Z2V0TGFzdEJyZWFkY3J1bWIoKXtyZXR1cm4gdGhpcy5rW3RoaXMuay5sZW5ndGgtMV19Y2xlYXJCcmVhZGNydW1icygpe3JldHVybiB0aGlzLms9W10sdGhpcy5KKCksdGhpc31hZGRBdHRhY2htZW50KHQpe3JldHVybiB0aGlzLkMucHVzaCh0KSx0aGlzfWNsZWFyQXR0YWNobWVudHMoKXtyZXR1cm4gdGhpcy5DPVtdLHRoaXN9Z2V0U2NvcGVEYXRhKCl7cmV0dXJue2JyZWFkY3J1bWJzOnRoaXMuayxhdHRhY2htZW50czp0aGlzLkMsY29udGV4dHM6dGhpcy5qLHRhZ3M6dGhpcy5ULGV4dHJhOnRoaXMuTyx1c2VyOnRoaXMuRCxsZXZlbDp0aGlzLkksZmluZ2VycHJpbnQ6dGhpcy5NfHxbXSxldmVudFByb2Nlc3NvcnM6dGhpcy5OLHByb3BhZ2F0aW9uQ29udGV4dDp0aGlzLkEsc2RrUHJvY2Vzc2luZ01ldGFkYXRhOnRoaXMuUix0cmFuc2FjdGlvbk5hbWU6dGhpcy5VLHNwYW46ZHQodGhpcyl9fXNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh0KXtyZXR1cm4gdGhpcy5SPXsuLi50aGlzLlIsLi4udH0sdGhpc31zZXRQcm9wYWdhdGlvbkNvbnRleHQodCl7cmV0dXJuIHRoaXMuQT10LHRoaXN9Z2V0UHJvcGFnYXRpb25Db250ZXh0KCl7cmV0dXJuIHRoaXMuQX1jYXB0dXJlRXhjZXB0aW9uKHQsZSl7Y29uc3Qgbj1lJiZlLmV2ZW50X2lkP2UuZXZlbnRfaWQ6RygpO2lmKCF0aGlzLkIpcmV0dXJuIE4ud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIGV4Y2VwdGlvbiEiKSxuO2NvbnN0IHI9bmV3IEVycm9yKCJTZW50cnkgc3ludGhldGljRXhjZXB0aW9uIik7cmV0dXJuIHRoaXMuQi5jYXB0dXJlRXhjZXB0aW9uKHQse29yaWdpbmFsRXhjZXB0aW9uOnQsc3ludGhldGljRXhjZXB0aW9uOnIsLi4uZSxldmVudF9pZDpufSx0aGlzKSxufWNhcHR1cmVNZXNzYWdlKHQsZSxuKXtjb25zdCByPW4mJm4uZXZlbnRfaWQ/bi5ldmVudF9pZDpHKCk7aWYoIXRoaXMuQilyZXR1cm4gTi53YXJuKCJObyBjbGllbnQgY29uZmlndXJlZCBvbiBzY29wZSAtIHdpbGwgbm90IGNhcHR1cmUgbWVzc2FnZSEiKSxyO2NvbnN0IG89bmV3IEVycm9yKHQpO3JldHVybiB0aGlzLkIuY2FwdHVyZU1lc3NhZ2UodCxlLHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpvLC4uLm4sZXZlbnRfaWQ6cn0sdGhpcykscn1jYXB0dXJlRXZlbnQodCxlKXtjb25zdCBuPWUmJmUuZXZlbnRfaWQ/ZS5ldmVudF9pZDpHKCk7cmV0dXJuIHRoaXMuQj8odGhpcy5CLmNhcHR1cmVFdmVudCh0LHsuLi5lLGV2ZW50X2lkOm59LHRoaXMpLG4pOihOLndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBldmVudCEiKSxuKX1KKCl7dGhpcy5ffHwodGhpcy5fPSEwLHRoaXMuUy5mb3JFYWNoKCh0PT57dCh0aGlzKX0pKSx0aGlzLl89ITEpfX1jb25zdCBndD1tdDtmdW5jdGlvbiB5dCgpe3JldHVybnt0cmFjZUlkOkcoKSxzcGFuSWQ6RygpLnN1YnN0cmluZygxNil9fWZ1bmN0aW9uIGJ0KCl7cmV0dXJuIEV0KHV0KCkpLmdldEN1cnJlbnRTY29wZSgpLmdldENsaWVudCgpfWNsYXNzIHZ0e2NvbnN0cnVjdG9yKHQsZSl7bGV0IG4scjtuPXR8fG5ldyBndCxyPWV8fG5ldyBndCx0aGlzLkg9W3tzY29wZTpufV0sdGhpcy5XPXJ9d2l0aFNjb3BlKHQpe2NvbnN0IGU9dGhpcy5ZKCk7bGV0IG47dHJ5e249dChlKX1jYXRjaCh0KXt0aHJvdyB0aGlzLnEoKSx0fXJldHVybiBtKG4pP24udGhlbigodD0+KHRoaXMucSgpLHQpKSwodD0+e3Rocm93IHRoaXMucSgpLHR9KSk6KHRoaXMucSgpLG4pfWdldENsaWVudCgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuY2xpZW50fWdldFNjb3BlKCl7cmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5zY29wZX1nZXRJc29sYXRpb25TY29wZSgpe3JldHVybiB0aGlzLld9Z2V0U3RhY2soKXtyZXR1cm4gdGhpcy5IfWdldFN0YWNrVG9wKCl7cmV0dXJuIHRoaXMuSFt0aGlzLkgubGVuZ3RoLTFdfVkoKXtjb25zdCB0PXRoaXMuZ2V0U2NvcGUoKS5jbG9uZSgpO3JldHVybiB0aGlzLmdldFN0YWNrKCkucHVzaCh7Y2xpZW50OnRoaXMuZ2V0Q2xpZW50KCksc2NvcGU6dH0pLHR9cSgpe3JldHVybiEodGhpcy5nZXRTdGFjaygpLmxlbmd0aDw9MSkmJiEhdGhpcy5nZXRTdGFjaygpLnBvcCgpfX1mdW5jdGlvbiBfdCgpe2NvbnN0IHQ9YXQodXQoKSk7cmV0dXJuIHQuaHVifHwodC5odWI9bmV3IHZ0KGIoImRlZmF1bHRDdXJyZW50U2NvcGUiLCgoKT0+bmV3IGd0KSksYigiZGVmYXVsdElzb2xhdGlvblNjb3BlIiwoKCk9Pm5ldyBndCkpKSksdC5odWJ9ZnVuY3Rpb24gd3QodCl7cmV0dXJuIF90KCkud2l0aFNjb3BlKHQpfWZ1bmN0aW9uIFN0KHQsZSl7Y29uc3Qgbj1fdCgpO3JldHVybiBuLndpdGhTY29wZSgoKCk9PihuLmdldFN0YWNrVG9wKCkuc2NvcGU9dCxlKHQpKSkpfWZ1bmN0aW9uICR0KHQpe3JldHVybiBfdCgpLndpdGhTY29wZSgoKCk9PnQoX3QoKS5nZXRJc29sYXRpb25TY29wZSgpKSkpfWZ1bmN0aW9uIEV0KHQpe2NvbnN0IGU9YXQodCk7cmV0dXJuIGUuYWNzP2UuYWNzOnt3aXRoSXNvbGF0aW9uU2NvcGU6JHQsd2l0aFNjb3BlOnd0LHdpdGhTZXRTY29wZTpTdCx3aXRoU2V0SXNvbGF0aW9uU2NvcGU6KHQsZSk9PiR0KGUpLGdldEN1cnJlbnRTY29wZTooKT0+X3QoKS5nZXRTY29wZSgpLGdldElzb2xhdGlvblNjb3BlOigpPT5fdCgpLmdldElzb2xhdGlvblNjb3BlKCl9fWNvbnN0IHh0PSJzZW50cnkuc291cmNlIixOdD0ic2VudHJ5LnNhbXBsZV9yYXRlIixrdD0ic2VudHJ5Lm9wIixDdD0ic2VudHJ5Lm9yaWdpbiIsRHQ9MCxUdD0xLE90PSJwcm9kdWN0aW9uIixqdD0iX2Zyb3plbkRzYyI7ZnVuY3Rpb24gUnQodCl7Y29uc3QgZT1idCgpO2lmKCFlKXJldHVybnt9O2NvbnN0IG49ZnVuY3Rpb24odCxlKXtjb25zdCBuPWUuZ2V0T3B0aW9ucygpLHtwdWJsaWNLZXk6cn09ZS5nZXREc24oKXx8e30sbz1qKHtlbnZpcm9ubWVudDpuLmVudmlyb25tZW50fHxPdCxyZWxlYXNlOm4ucmVsZWFzZSxwdWJsaWNfa2V5OnIsdHJhY2VfaWQ6dH0pO3JldHVybiBlLmVtaXQoImNyZWF0ZURzYyIsbyksb30oTXQodCkudHJhY2VfaWR8fCIiLGUpLHI9R3QodCk7aWYoIXIpcmV0dXJuIG47Y29uc3Qgbz1yW2p0XTtpZihvKXJldHVybiBvO2NvbnN0IHM9TXQociksaT1zLmRhdGF8fHt9LGM9aVtOdF07bnVsbCE9YyYmKG4uc2FtcGxlX3JhdGU9YCR7Y31gKTtjb25zdCB1PWlbeHRdO3JldHVybiB1JiYidXJsIiE9PXUmJihuLnRyYW5zYWN0aW9uPXMuZGVzY3JpcHRpb24pLG4uc2FtcGxlZD1TdHJpbmcoZnVuY3Rpb24odCl7Y29uc3R7dHJhY2VGbGFnczplfT10LnNwYW5Db250ZXh0KCk7cmV0dXJuIGU9PT1BdH0ocikpLGUuZW1pdCgiY3JlYXRlRHNjIixuKSxufWNvbnN0IEF0PTE7ZnVuY3Rpb24gSXQodCl7Y29uc3R7c3BhbklkOmUsdHJhY2VJZDpufT10LnNwYW5Db250ZXh0KCkse3BhcmVudF9zcGFuX2lkOnJ9PU10KHQpO3JldHVybiBqKHtwYXJlbnRfc3Bhbl9pZDpyLHNwYW5faWQ6ZSx0cmFjZV9pZDpufSl9ZnVuY3Rpb24gUHQodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P1V0KHQpOkFycmF5LmlzQXJyYXkodCk/dFswXSt0WzFdLzFlOTp0IGluc3RhbmNlb2YgRGF0ZT9VdCh0LmdldFRpbWUoKSk6QigpfWZ1bmN0aW9uIFV0KHQpe3JldHVybiB0Pjk5OTk5OTk5OTk/dC8xZTM6dH1mdW5jdGlvbiBNdCh0KXtpZihmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5nZXRTcGFuSlNPTn0odCkpcmV0dXJuIHQuZ2V0U3BhbkpTT04oKTt0cnl7Y29uc3R7c3BhbklkOmUsdHJhY2VJZDpufT10LnNwYW5Db250ZXh0KCk7aWYoZnVuY3Rpb24odCl7Y29uc3QgZT10O3JldHVybiEhKGUuYXR0cmlidXRlcyYmZS5zdGFydFRpbWUmJmUubmFtZSYmZS5lbmRUaW1lJiZlLnN0YXR1cyl9KHQpKXtjb25zdHthdHRyaWJ1dGVzOnIsc3RhcnRUaW1lOm8sbmFtZTpzLGVuZFRpbWU6aSxwYXJlbnRTcGFuSWQ6YyxzdGF0dXM6dX09dDtyZXR1cm4gaih7c3Bhbl9pZDplLHRyYWNlX2lkOm4sZGF0YTpyLGRlc2NyaXB0aW9uOnMscGFyZW50X3NwYW5faWQ6YyxzdGFydF90aW1lc3RhbXA6UHQobyksdGltZXN0YW1wOlB0KGkpfHx2b2lkIDAsc3RhdHVzOkx0KHUpLG9wOnJba3RdLG9yaWdpbjpyW0N0XSxGOnZvaWQgMH0pfXJldHVybntzcGFuX2lkOmUsdHJhY2VfaWQ6bn19Y2F0Y2godCl7cmV0dXJue319fWZ1bmN0aW9uIEx0KHQpe2lmKHQmJnQuY29kZSE9PUR0KXJldHVybiB0LmNvZGU9PT1UdD8ib2siOnQubWVzc2FnZXx8InVua25vd25fZXJyb3IifWNvbnN0IEJ0PSJfc2VudHJ5Um9vdFNwYW4iO2Z1bmN0aW9uIEd0KHQpe3JldHVybiB0W0J0XXx8dH1mdW5jdGlvbiBKdCh0LGUsbixyKXtjb25zdCBvPW90KG4pLHM9dC50eXBlJiYicmVwbGF5X2V2ZW50IiE9PXQudHlwZT90LnR5cGU6ImV2ZW50IjshZnVuY3Rpb24odCxlKXtlJiYodC5zZGs9dC5zZGt8fHt9LHQuc2RrLm5hbWU9dC5zZGsubmFtZXx8ZS5uYW1lLHQuc2RrLnZlcnNpb249dC5zZGsudmVyc2lvbnx8ZS52ZXJzaW9uLHQuc2RrLmludGVncmF0aW9ucz1bLi4udC5zZGsuaW50ZWdyYXRpb25zfHxbXSwuLi5lLmludGVncmF0aW9uc3x8W11dLHQuc2RrLnBhY2thZ2VzPVsuLi50LnNkay5wYWNrYWdlc3x8W10sLi4uZS5wYWNrYWdlc3x8W11dKX0odCxuJiZuLnNkayk7Y29uc3QgaT1mdW5jdGlvbih0LGUsbixyKXtjb25zdCBvPXQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhJiZ0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YS5keW5hbWljU2FtcGxpbmdDb250ZXh0O3JldHVybntldmVudF9pZDp0LmV2ZW50X2lkLHNlbnRfYXQ6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLC4uLmUmJntzZGs6ZX0sLi4uISFuJiZyJiZ7ZHNuOmsocil9LC4uLm8mJnt0cmFjZTpqKHsuLi5vfSl9fX0odCxvLHIsZSk7ZGVsZXRlIHQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhO3JldHVybiBRKGksW1t7dHlwZTpzfSx0XV0pfWNvbnN0IHp0PSJfX1NFTlRSWV9TVVBQUkVTU19UUkFDSU5HX18iO2Z1bmN0aW9uIEh0KHQpe2NvbnN0IGU9RXQodXQoKSk7cmV0dXJuIGUuc3VwcHJlc3NUcmFjaW5nP2Uuc3VwcHJlc3NUcmFjaW5nKHQpOmZ1bmN0aW9uKC4uLnQpe2NvbnN0IGU9RXQodXQoKSk7aWYoMj09PXQubGVuZ3RoKXtjb25zdFtuLHJdPXQ7cmV0dXJuIG4/ZS53aXRoU2V0U2NvcGUobixyKTplLndpdGhTY29wZShyKX1yZXR1cm4gZS53aXRoU2NvcGUodFswXSl9KChlPT4oZS5zZXRTREtQcm9jZXNzaW5nTWV0YWRhdGEoe1t6dF06ITB9KSx0KCkpKSl9ZnVuY3Rpb24gV3QodCxlKXtjb25zdHtmaW5nZXJwcmludDpuLHNwYW46cixicmVhZGNydW1iczpvLHNka1Byb2Nlc3NpbmdNZXRhZGF0YTpzfT1lOyFmdW5jdGlvbih0LGUpe2NvbnN0e2V4dHJhOm4sdGFnczpyLHVzZXI6byxjb250ZXh0czpzLGxldmVsOmksdHJhbnNhY3Rpb25OYW1lOmN9PWUsdT1qKG4pO3UmJk9iamVjdC5rZXlzKHUpLmxlbmd0aCYmKHQuZXh0cmE9ey4uLnUsLi4udC5leHRyYX0pO2NvbnN0IGE9aihyKTthJiZPYmplY3Qua2V5cyhhKS5sZW5ndGgmJih0LnRhZ3M9ey4uLmEsLi4udC50YWdzfSk7Y29uc3QgZj1qKG8pO2YmJk9iamVjdC5rZXlzKGYpLmxlbmd0aCYmKHQudXNlcj17Li4uZiwuLi50LnVzZXJ9KTtjb25zdCBoPWoocyk7aCYmT2JqZWN0LmtleXMoaCkubGVuZ3RoJiYodC5jb250ZXh0cz17Li4uaCwuLi50LmNvbnRleHRzfSk7aSYmKHQubGV2ZWw9aSk7YyYmInRyYW5zYWN0aW9uIiE9PXQudHlwZSYmKHQudHJhbnNhY3Rpb249Yyl9KHQsZSksciYmZnVuY3Rpb24odCxlKXt0LmNvbnRleHRzPXt0cmFjZTpJdChlKSwuLi50LmNvbnRleHRzfSx0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YT17ZHluYW1pY1NhbXBsaW5nQ29udGV4dDpSdChlKSwuLi50LnNka1Byb2Nlc3NpbmdNZXRhZGF0YX07Y29uc3Qgbj1HdChlKSxyPU10KG4pLmRlc2NyaXB0aW9uO3ImJiF0LnRyYW5zYWN0aW9uJiYidHJhbnNhY3Rpb24iPT09dC50eXBlJiYodC50cmFuc2FjdGlvbj1yKX0odCxyKSxmdW5jdGlvbih0LGUpe3QuZmluZ2VycHJpbnQ9dC5maW5nZXJwcmludD9mdW5jdGlvbih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90Olt0XX0odC5maW5nZXJwcmludCk6W10sZSYmKHQuZmluZ2VycHJpbnQ9dC5maW5nZXJwcmludC5jb25jYXQoZSkpO3QuZmluZ2VycHJpbnQmJiF0LmZpbmdlcnByaW50Lmxlbmd0aCYmZGVsZXRlIHQuZmluZ2VycHJpbnR9KHQsbiksZnVuY3Rpb24odCxlKXtjb25zdCBuPVsuLi50LmJyZWFkY3J1bWJzfHxbXSwuLi5lXTt0LmJyZWFkY3J1bWJzPW4ubGVuZ3RoP246dm9pZCAwfSh0LG8pLGZ1bmN0aW9uKHQsZSl7dC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE9ey4uLnQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhLC4uLmV9fSh0LHMpfWNvbnN0IFl0PSI3IjtmdW5jdGlvbiBxdCh0LGUpe3JldHVybiBuPXtzZW50cnlfa2V5OnQucHVibGljS2V5LHNlbnRyeV92ZXJzaW9uOll0LC4uLmUmJntzZW50cnlfY2xpZW50OmAke2UubmFtZX0vJHtlLnZlcnNpb259YH19LE9iamVjdC5rZXlzKG4pLm1hcCgodD0+YCR7ZW5jb2RlVVJJQ29tcG9uZW50KHQpfT0ke2VuY29kZVVSSUNvbXBvbmVudChuW3RdKX1gKSkuam9pbigiJiIpO3ZhciBufWNvbnN0IEZ0PTY0O2Z1bmN0aW9uIEt0KHQsZSxuPVYodC5idWZmZXJTaXplfHxGdCkpe2xldCByPXt9O3JldHVybntzZW5kOmZ1bmN0aW9uKG8pe2NvbnN0IHM9W107aWYoWChvLCgoZSxuKT0+e2NvbnN0IG89cnQobik7aWYoZnVuY3Rpb24odCxlLG49RGF0ZS5ub3coKSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbZV18fHQuYWxsfHwwfSh0LGUpPm59KHIsbykpe2NvbnN0IHI9VnQoZSxuKTt0LnJlY29yZERyb3BwZWRFdmVudCgicmF0ZWxpbWl0X2JhY2tvZmYiLG8scil9ZWxzZSBzLnB1c2goZSl9KSksMD09PXMubGVuZ3RoKXJldHVybiBGKHt9KTtjb25zdCBpPVEob1swXSxzKSxjPWU9PntYKGksKChuLHIpPT57Y29uc3Qgbz1WdChuLHIpO3QucmVjb3JkRHJvcHBlZEV2ZW50KGUscnQociksbyl9KSl9O3JldHVybiBuLmFkZCgoKCk9PmUoe2JvZHk6ZXQoaSl9KS50aGVuKCh0PT4odm9pZCAwIT09dC5zdGF0dXNDb2RlJiYodC5zdGF0dXNDb2RlPDIwMHx8dC5zdGF0dXNDb2RlPj0zMDApJiZjdCYmTi53YXJuKGBTZW50cnkgcmVzcG9uZGVkIHdpdGggc3RhdHVzIGNvZGUgJHt0LnN0YXR1c0NvZGV9IHRvIHNlbnQgZXZlbnQuYCkscj1pdChyLHQpLHQpKSwodD0+e3Rocm93IGMoIm5ldHdvcmtfZXJyb3IiKSx0fSkpKSkudGhlbigodD0+dCksKHQ9PntpZih0IGluc3RhbmNlb2YgQylyZXR1cm4gY3QmJk4uZXJyb3IoIlNraXBwZWQgc2VuZGluZyBldmVudCBiZWNhdXNlIGJ1ZmZlciBpcyBmdWxsLiIpLGMoInF1ZXVlX292ZXJmbG93IiksRih7fSk7dGhyb3cgdH0pKX0sZmx1c2g6dD0+bi5kcmFpbih0KX19ZnVuY3Rpb24gVnQodCxlKXtpZigiZXZlbnQiPT09ZXx8InRyYW5zYWN0aW9uIj09PWUpcmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dFsxXTp2b2lkIDB9Y29uc3QgWnQ9U3ltYm9sKCJBZ2VudEJhc2VJbnRlcm5hbFN0YXRlIik7Y2xhc3MgUXQgZXh0ZW5kcyBoLkFnZW50e1tadF07b3B0aW9ucztrZWVwQWxpdmU7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpc1tadF09e319aXNTZWN1cmVFbmRwb2ludCh0KXtpZih0KXtpZigiYm9vbGVhbiI9PXR5cGVvZiB0LnNlY3VyZUVuZHBvaW50KXJldHVybiB0LnNlY3VyZUVuZHBvaW50O2lmKCJzdHJpbmciPT10eXBlb2YgdC5wcm90b2NvbClyZXR1cm4iaHR0cHM6Ij09PXQucHJvdG9jb2x9Y29uc3R7c3RhY2s6ZX09bmV3IEVycm9yO3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmZS5zcGxpdCgiXG4iKS5zb21lKCh0PT4tMSE9PXQuaW5kZXhPZigiKGh0dHBzLmpzOiIpfHwtMSE9PXQuaW5kZXhPZigibm9kZTpodHRwczoiKSkpfWNyZWF0ZVNvY2tldCh0LGUsbil7Y29uc3Qgcj17Li4uZSxzZWN1cmVFbmRwb2ludDp0aGlzLmlzU2VjdXJlRW5kcG9pbnQoZSl9O1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT50aGlzLmNvbm5lY3QodCxyKSkpLnRoZW4oKG89PntpZihvIGluc3RhbmNlb2YgaC5BZ2VudClyZXR1cm4gby5hZGRSZXF1ZXN0KHQscik7dGhpc1tadF0uY3VycmVudFNvY2tldD1vLHN1cGVyLmNyZWF0ZVNvY2tldCh0LGUsbil9KSxuKX1jcmVhdGVDb25uZWN0aW9uKCl7Y29uc3QgdD10aGlzW1p0XS5jdXJyZW50U29ja2V0O2lmKHRoaXNbWnRdLmN1cnJlbnRTb2NrZXQ9dm9pZCAwLCF0KXRocm93IG5ldyBFcnJvcigiTm8gc29ja2V0IHdhcyByZXR1cm5lZCBpbiB0aGUgYGNvbm5lY3QoKWAgZnVuY3Rpb24iKTtyZXR1cm4gdH1nZXQgZGVmYXVsdFBvcnQoKXtyZXR1cm4gdGhpc1tadF0uZGVmYXVsdFBvcnQ/PygiaHR0cHM6Ij09PXRoaXMucHJvdG9jb2w/NDQzOjgwKX1zZXQgZGVmYXVsdFBvcnQodCl7dGhpc1tadF0mJih0aGlzW1p0XS5kZWZhdWx0UG9ydD10KX1nZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpc1tadF0ucHJvdG9jb2w/Pyh0aGlzLmlzU2VjdXJlRW5kcG9pbnQoKT8iaHR0cHM6IjoiaHR0cDoiKX1zZXQgcHJvdG9jb2wodCl7dGhpc1tadF0mJih0aGlzW1p0XS5wcm90b2NvbD10KX19ZnVuY3Rpb24gWHQoLi4udCl7Ti5sb2coIltodHRwcy1wcm94eS1hZ2VudDpwYXJzZS1wcm94eS1yZXNwb25zZV0iLC4uLnQpfWZ1bmN0aW9uIHRlKHQpe3JldHVybiBuZXcgUHJvbWlzZSgoKGUsbik9PntsZXQgcj0wO2NvbnN0IG89W107ZnVuY3Rpb24gcygpe2NvbnN0IGM9dC5yZWFkKCk7Yz9mdW5jdGlvbihjKXtvLnB1c2goYykscis9Yy5sZW5ndGg7Y29uc3QgdT1CdWZmZXIuY29uY2F0KG8sciksYT11LmluZGV4T2YoIlxyXG5cclxuIik7aWYoLTE9PT1hKXJldHVybiBYdCgiaGF2ZSBub3QgcmVjZWl2ZWQgZW5kIG9mIEhUVFAgaGVhZGVycyB5ZXQuLi4iKSx2b2lkIHMoKTtjb25zdCBmPXUuc2xpY2UoMCxhKS50b1N0cmluZygiYXNjaWkiKS5zcGxpdCgiXHJcbiIpLGg9Zi5zaGlmdCgpO2lmKCFoKXJldHVybiB0LmRlc3Ryb3koKSxuKG5ldyBFcnJvcigiTm8gaGVhZGVyIHJlY2VpdmVkIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZSIpKTtjb25zdCBwPWguc3BsaXQoIiAiKSxsPStwWzFdLGQ9cC5zbGljZSgyKS5qb2luKCIgIiksbT17fTtmb3IoY29uc3QgZSBvZiBmKXtpZighZSljb250aW51ZTtjb25zdCByPWUuaW5kZXhPZigiOiIpO2lmKC0xPT09cilyZXR1cm4gdC5kZXN0cm95KCksbihuZXcgRXJyb3IoYEludmFsaWQgaGVhZGVyIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZTogIiR7ZX0iYCkpO2NvbnN0IG89ZS5zbGljZSgwLHIpLnRvTG93ZXJDYXNlKCkscz1lLnNsaWNlKHIrMSkudHJpbVN0YXJ0KCksaT1tW29dOyJzdHJpbmciPT10eXBlb2YgaT9tW29dPVtpLHNdOkFycmF5LmlzQXJyYXkoaSk/aS5wdXNoKHMpOm1bb109c31YdCgiZ290IHByb3h5IHNlcnZlciByZXNwb25zZTogJW8gJW8iLGgsbSksaSgpLGUoe2Nvbm5lY3Q6e3N0YXR1c0NvZGU6bCxzdGF0dXNUZXh0OmQsaGVhZGVyczptfSxidWZmZXJlZDp1fSl9KGMpOnQub25jZSgicmVhZGFibGUiLHMpfWZ1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLGMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIix1KSx0LnJlbW92ZUxpc3RlbmVyKCJyZWFkYWJsZSIscyl9ZnVuY3Rpb24gYygpe2koKSxYdCgib25lbmQiKSxuKG5ldyBFcnJvcigiUHJveHkgY29ubmVjdGlvbiBlbmRlZCBiZWZvcmUgcmVjZWl2aW5nIENPTk5FQ1QgcmVzcG9uc2UiKSl9ZnVuY3Rpb24gdSh0KXtpKCksWHQoIm9uZXJyb3IgJW8iLHQpLG4odCl9dC5vbigiZXJyb3IiLHUpLHQub24oImVuZCIsYykscygpfSkpfWZ1bmN0aW9uIGVlKC4uLnQpe04ubG9nKCJbaHR0cHMtcHJveHktYWdlbnRdIiwuLi50KX1jbGFzcyBuZSBleHRlbmRzIFF0e3N0YXRpYyBwcm90b2NvbHM9WyJodHRwIiwiaHR0cHMiXTtwcm94eTtwcm94eUhlYWRlcnM7Y29ubmVjdE9wdHM7Y29uc3RydWN0b3IodCxlKXtzdXBlcihlKSx0aGlzLm9wdGlvbnM9e30sdGhpcy5wcm94eT0ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFVSTCh0KTp0LHRoaXMucHJveHlIZWFkZXJzPWU/LmhlYWRlcnM/P3t9LGVlKCJDcmVhdGluZyBuZXcgSHR0cHNQcm94eUFnZW50IGluc3RhbmNlOiAlbyIsdGhpcy5wcm94eS5ocmVmKTtjb25zdCBuPSh0aGlzLnByb3h5Lmhvc3RuYW1lfHx0aGlzLnByb3h5Lmhvc3QpLnJlcGxhY2UoL15cW3xcXSQvZywiIikscj10aGlzLnByb3h5LnBvcnQ/cGFyc2VJbnQodGhpcy5wcm94eS5wb3J0LDEwKToiaHR0cHM6Ij09PXRoaXMucHJveHkucHJvdG9jb2w/NDQzOjgwO3RoaXMuY29ubmVjdE9wdHM9e0FMUE5Qcm90b2NvbHM6WyJodHRwLzEuMSJdLC4uLmU/b2UoZSwiaGVhZGVycyIpOm51bGwsaG9zdDpuLHBvcnQ6cn19YXN5bmMgY29ubmVjdCh0LGUpe2NvbnN0e3Byb3h5Om59PXRoaXM7aWYoIWUuaG9zdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyAiaG9zdCIgcHJvdmlkZWQnKTtsZXQgcjtpZigiaHR0cHM6Ij09PW4ucHJvdG9jb2wpe2VlKCJDcmVhdGluZyBgdGxzLlNvY2tldGA6ICVvIix0aGlzLmNvbm5lY3RPcHRzKTtjb25zdCB0PXRoaXMuY29ubmVjdE9wdHMuc2VydmVybmFtZXx8dGhpcy5jb25uZWN0T3B0cy5ob3N0O3I9Zi5jb25uZWN0KHsuLi50aGlzLmNvbm5lY3RPcHRzLHNlcnZlcm5hbWU6dCYmYS5pc0lQKHQpP3ZvaWQgMDp0fSl9ZWxzZSBlZSgiQ3JlYXRpbmcgYG5ldC5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cykscj1hLmNvbm5lY3QodGhpcy5jb25uZWN0T3B0cyk7Y29uc3Qgbz0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wcm94eUhlYWRlcnM/dGhpcy5wcm94eUhlYWRlcnMoKTp7Li4udGhpcy5wcm94eUhlYWRlcnN9LHM9YS5pc0lQdjYoZS5ob3N0KT9gWyR7ZS5ob3N0fV1gOmUuaG9zdDtsZXQgaT1gQ09OTkVDVCAke3N9OiR7ZS5wb3J0fSBIVFRQLzEuMVxyXG5gO2lmKG4udXNlcm5hbWV8fG4ucGFzc3dvcmQpe2NvbnN0IHQ9YCR7ZGVjb2RlVVJJQ29tcG9uZW50KG4udXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChuLnBhc3N3b3JkKX1gO29bIlByb3h5LUF1dGhvcml6YXRpb24iXT1gQmFzaWMgJHtCdWZmZXIuZnJvbSh0KS50b1N0cmluZygiYmFzZTY0Iil9YH1vLkhvc3Q9YCR7c306JHtlLnBvcnR9YCxvWyJQcm94eS1Db25uZWN0aW9uIl18fChvWyJQcm94eS1Db25uZWN0aW9uIl09dGhpcy5rZWVwQWxpdmU/IktlZXAtQWxpdmUiOiJjbG9zZSIpO2Zvcihjb25zdCB0IG9mIE9iamVjdC5rZXlzKG8pKWkrPWAke3R9OiAke29bdF19XHJcbmA7Y29uc3QgYz10ZShyKTtyLndyaXRlKGAke2l9XHJcbmApO2NvbnN0e2Nvbm5lY3Q6dSxidWZmZXJlZDpofT1hd2FpdCBjO2lmKHQuZW1pdCgicHJveHlDb25uZWN0Iix1KSx0aGlzLmVtaXQoInByb3h5Q29ubmVjdCIsdSx0KSwyMDA9PT11LnN0YXR1c0NvZGUpe2lmKHQub25jZSgic29ja2V0IixyZSksZS5zZWN1cmVFbmRwb2ludCl7ZWUoIlVwZ3JhZGluZyBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMiKTtjb25zdCB0PWUuc2VydmVybmFtZXx8ZS5ob3N0O3JldHVybiBmLmNvbm5lY3Qoey4uLm9lKGUsImhvc3QiLCJwYXRoIiwicG9ydCIpLHNvY2tldDpyLHNlcnZlcm5hbWU6YS5pc0lQKHQpP3ZvaWQgMDp0fSl9cmV0dXJuIHJ9ci5kZXN0cm95KCk7Y29uc3QgcD1uZXcgYS5Tb2NrZXQoe3dyaXRhYmxlOiExfSk7cmV0dXJuIHAucmVhZGFibGU9ITAsdC5vbmNlKCJzb2NrZXQiLCh0PT57ZWUoIlJlcGxheWluZyBwcm94eSBidWZmZXIgZm9yIGZhaWxlZCByZXF1ZXN0IiksdC5wdXNoKGgpLHQucHVzaChudWxsKX0pKSxwfX1mdW5jdGlvbiByZSh0KXt0LnJlc3VtZSgpfWZ1bmN0aW9uIG9lKHQsLi4uZSl7Y29uc3Qgbj17fTtsZXQgcjtmb3IociBpbiB0KWUuaW5jbHVkZXMocil8fChuW3JdPXRbcl0pO3JldHVybiBufWNvbnN0IHNlPTMyNzY4O2Z1bmN0aW9uIGllKHQpe3JldHVybiB0LnJlcGxhY2UoL15bQS1aXTovLCIiKS5yZXBsYWNlKC9cXC9nLCIvIil9Y29uc3QgY2U9bjtsZXQgdWUsYWU9ITE7ZnVuY3Rpb24gZmUodCl7Y2UuZGVidWcmJmNvbnNvbGUubG9nKGBbQU5SIFdvcmtlcl0gJHt0fWApfXZhciBoZSxwZSxsZTtjb25zdCBkZT1mdW5jdGlvbih0KXtsZXQgZTt0cnl7ZT1uZXcgVVJMKHQudXJsKX1jYXRjaChlKXtyZXR1cm4geCgoKCk9Pntjb25zb2xlLndhcm4oIltAc2VudHJ5L25vZGVdOiBJbnZhbGlkIGRzbiBvciB0dW5uZWwgb3B0aW9uLCB3aWxsIG5vdCBzZW5kIGFueSBldmVudHMuIFRoZSB0dW5uZWwgb3B0aW9uIG11c3QgYmUgYSBmdWxsIFVSTCB3aGVuIHVzZWQuIil9KSksS3QodCwoKCk9PlByb21pc2UucmVzb2x2ZSh7fSkpKX1jb25zdCBuPSJodHRwczoiPT09ZS5wcm90b2NvbCxyPWZ1bmN0aW9uKHQsZSl7Y29uc3R7bm9fcHJveHk6bn09cHJvY2Vzcy5lbnY7cmV0dXJuIG4mJm4uc3BsaXQoIiwiKS5zb21lKChlPT50Lmhvc3QuZW5kc1dpdGgoZSl8fHQuaG9zdG5hbWUuZW5kc1dpdGgoZSkpKT92b2lkIDA6ZX0oZSx0LnByb3h5fHwobj9wcm9jZXNzLmVudi5odHRwc19wcm94eTp2b2lkIDApfHxwcm9jZXNzLmVudi5odHRwX3Byb3h5KSxvPW4/aTpzLGE9dm9pZCAwIT09dC5rZWVwQWxpdmUmJnQua2VlcEFsaXZlLGY9cj9uZXcgbmUocik6bmV3IG8uQWdlbnQoe2tlZXBBbGl2ZTphLG1heFNvY2tldHM6MzAsdGltZW91dDoyZTN9KTtyZXR1cm4gSHQoKCgpPT57Y29uc3QgZT1mdW5jdGlvbih0LGUsbil7Y29uc3R7aG9zdG5hbWU6cixwYXRobmFtZTpvLHBvcnQ6cyxwcm90b2NvbDppLHNlYXJjaDphfT1uZXcgVVJMKHQudXJsKTtyZXR1cm4gZnVuY3Rpb24oZil7cmV0dXJuIG5ldyBQcm9taXNlKCgoaCxwKT0+e2xldCBsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYyh7cmVhZCgpe3RoaXMucHVzaCh0KSx0aGlzLnB1c2gobnVsbCl9fSl9KGYuYm9keSk7Y29uc3QgZD17Li4udC5oZWFkZXJzfTtmLmJvZHkubGVuZ3RoPnNlJiYoZFsiY29udGVudC1lbmNvZGluZyJdPSJnemlwIixsPWwucGlwZSh1KCkpKTtjb25zdCBtPWUucmVxdWVzdCh7bWV0aG9kOiJQT1NUIixhZ2VudDpuLGhlYWRlcnM6ZCxob3N0bmFtZTpyLHBhdGg6YCR7b30ke2F9YCxwb3J0OnMscHJvdG9jb2w6aSxjYTp0LmNhQ2VydHN9LCh0PT57dC5vbigiZGF0YSIsKCgpPT57fSkpLHQub24oImVuZCIsKCgpPT57fSkpLHQuc2V0RW5jb2RpbmcoInV0ZjgiKTtjb25zdCBlPXQuaGVhZGVyc1sicmV0cnktYWZ0ZXIiXT8/bnVsbCxuPXQuaGVhZGVyc1sieC1zZW50cnktcmF0ZS1saW1pdHMiXT8/bnVsbDtoKHtzdGF0dXNDb2RlOnQuc3RhdHVzQ29kZSxoZWFkZXJzOnsicmV0cnktYWZ0ZXIiOmUsIngtc2VudHJ5LXJhdGUtbGltaXRzIjpBcnJheS5pc0FycmF5KG4pP25bMF06bn19KX0pKTttLm9uKCJlcnJvciIscCksbC5waXBlKG0pfSkpfX0odCx0Lmh0dHBNb2R1bGU/P28sZik7cmV0dXJuIEt0KHQsZSl9KSl9KHt1cmw6KGhlPWNlLmRzbixwZT1jZS50dW5uZWwsbGU9Y2Uuc2RrTWV0YWRhdGEuc2RrLHBlfHxgJHtmdW5jdGlvbih0KXtyZXR1cm5gJHtmdW5jdGlvbih0KXtjb25zdCBlPXQucHJvdG9jb2w/YCR7dC5wcm90b2NvbH06YDoiIixuPXQucG9ydD9gOiR7dC5wb3J0fWA6IiI7cmV0dXJuYCR7ZX0vLyR7dC5ob3N0fSR7bn0ke3QucGF0aD9gLyR7dC5wYXRofWA6IiJ9L2FwaS9gfSh0KX0ke3QucHJvamVjdElkfS9lbnZlbG9wZS9gfShoZSl9PyR7cXQoaGUsbGUpfWApLHJlY29yZERyb3BwZWRFdmVudDooKT0+e319KTthc3luYyBmdW5jdGlvbiBtZSgpe2lmKHVlKXtmZSgiU2VuZGluZyBhYm5vcm1hbCBzZXNzaW9uIiksaHQodWUse3N0YXR1czoiYWJub3JtYWwiLGFibm9ybWFsX21lY2hhbmlzbToiYW5yX2ZvcmVncm91bmQifSk7Y29uc3QgdD1mdW5jdGlvbih0LGUsbixyKXtjb25zdCBvPW90KG4pO3JldHVybiBRKHtzZW50X2F0OihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKSwuLi5vJiZ7c2RrOm99LC4uLiEhciYmZSYme2RzbjprKGUpfX0sWyJhZ2dyZWdhdGVzImluIHQ/W3t0eXBlOiJzZXNzaW9ucyJ9LHRdOlt7dHlwZToic2Vzc2lvbiJ9LHQudG9KU09OKCldXSl9KHVlLGNlLmRzbixjZS5zZGtNZXRhZGF0YSxjZS50dW5uZWwpO2ZlKEpTT04uc3RyaW5naWZ5KHQpKSxhd2FpdCBkZS5zZW5kKHQpO3RyeXtlPy5wb3N0TWVzc2FnZSgic2Vzc2lvbi1lbmRlZCIpfWNhdGNoKHQpe319fWZ1bmN0aW9uIGdlKHQpe2lmKCF0KXJldHVybjtjb25zdCBlPWZ1bmN0aW9uKHQpe2lmKCF0Lmxlbmd0aClyZXR1cm5bXTtjb25zdCBlPUFycmF5LmZyb20odCk7cmV0dXJuL3NlbnRyeVdyYXBwZWQvLnRlc3QoZVtlLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiZlLnBvcCgpLGUucmV2ZXJzZSgpLFAudGVzdChlW2UubGVuZ3RoLTFdLmZ1bmN0aW9ufHwiIikmJihlLnBvcCgpLFAudGVzdChlW2UubGVuZ3RoLTFdLmZ1bmN0aW9ufHwiIikmJmUucG9wKCkpLGUuc2xpY2UoMCxBKS5tYXAoKHQ9Pih7Li4udCxmaWxlbmFtZTp0LmZpbGVuYW1lfHxlW2UubGVuZ3RoLTFdLmZpbGVuYW1lLGZ1bmN0aW9uOnQuZnVuY3Rpb258fEl9KSkpfSh0KTtpZihjZS5hcHBSb290UGF0aClmb3IoY29uc3QgdCBvZiBlKXQuZmlsZW5hbWUmJih0LmZpbGVuYW1lPUgodC5maWxlbmFtZSxjZS5hcHBSb290UGF0aCkpO3JldHVybiBlfWFzeW5jIGZ1bmN0aW9uIHllKHQsZSl7aWYoYWUpcmV0dXJuO2FlPSEwLGF3YWl0IG1lKCksZmUoIlNlbmRpbmcgZXZlbnQiKTtjb25zdCBuPXtldmVudF9pZDpHKCksY29udGV4dHM6Y2UuY29udGV4dHMscmVsZWFzZTpjZS5yZWxlYXNlLGVudmlyb25tZW50OmNlLmVudmlyb25tZW50LGRpc3Q6Y2UuZGlzdCxwbGF0Zm9ybToibm9kZSIsbGV2ZWw6ImVycm9yIixleGNlcHRpb246e3ZhbHVlczpbe3R5cGU6IkFwcGxpY2F0aW9uTm90UmVzcG9uZGluZyIsdmFsdWU6YEFwcGxpY2F0aW9uIE5vdCBSZXNwb25kaW5nIGZvciBhdCBsZWFzdCAke2NlLmFuclRocmVzaG9sZH0gbXNgLHN0YWNrdHJhY2U6e2ZyYW1lczpnZSh0KX0sbWVjaGFuaXNtOnt0eXBlOiJBTlIifX1dfSx0YWdzOmNlLnN0YXRpY1RhZ3N9O2UmJmZ1bmN0aW9uKHQsZSl7aWYoV3QodCxlKSwhdC5jb250ZXh0cz8udHJhY2Upe2NvbnN0e3RyYWNlSWQ6bixzcGFuSWQ6cixwYXJlbnRTcGFuSWQ6b309ZS5wcm9wYWdhdGlvbkNvbnRleHQ7dC5jb250ZXh0cz17dHJhY2U6e3RyYWNlX2lkOm4sc3Bhbl9pZDpyLHBhcmVudF9zcGFuX2lkOm99LC4uLnQuY29udGV4dHN9fX0obixlKTtjb25zdCByPUp0KG4sY2UuZHNuLGNlLnNka01ldGFkYXRhLGNlLnR1bm5lbCk7ZmUoSlNPTi5zdHJpbmdpZnkocikpLGF3YWl0IGRlLnNlbmQociksYXdhaXQgZGUuZmx1c2goMmUzKSxzZXRUaW1lb3V0KCgoKT0+e3Byb2Nlc3MuZXhpdCgwKX0pLDVlMyl9bGV0IGJlO2lmKGZlKCJTdGFydGVkIiksY2UuY2FwdHVyZVN0YWNrVHJhY2Upe2ZlKCJDb25uZWN0aW5nIHRvIGRlYnVnZ2VyIik7Y29uc3QgZT1uZXcgdDtlLmNvbm5lY3RUb01haW5UaHJlYWQoKSxmZSgiQ29ubmVjdGVkIHRvIGRlYnVnZ2VyIik7Y29uc3Qgbj1uZXcgTWFwO2Uub24oIkRlYnVnZ2VyLnNjcmlwdFBhcnNlZCIsKHQ9PntuLnNldCh0LnBhcmFtcy5zY3JpcHRJZCx0LnBhcmFtcy51cmwpfSkpLGUub24oIkRlYnVnZ2VyLnBhdXNlZCIsKHQ9PntpZigib3RoZXIiPT09dC5wYXJhbXMucmVhc29uKXRyeXtmZSgiRGVidWdnZXIgcGF1c2VkIik7Y29uc3Qgcz1bLi4udC5wYXJhbXMuY2FsbEZyYW1lc10saT1jZS5hcHBSb290UGF0aD9mdW5jdGlvbih0PShwcm9jZXNzLmFyZ3ZbMV0/WShwcm9jZXNzLmFyZ3ZbMV0pOnByb2Nlc3MuY3dkKCkpLGU9IlxcIj09PW8pe2NvbnN0IG49ZT9pZSh0KTp0O3JldHVybiB0PT57aWYoIXQpcmV0dXJuO2NvbnN0IG89ZT9pZSh0KTp0O2xldHtkaXI6cyxiYXNlOmksZXh0OmN9PXIucGFyc2Uobyk7Ii5qcyIhPT1jJiYiLm1qcyIhPT1jJiYiLmNqcyIhPT1jfHwoaT1pLnNsaWNlKDAsLTEqYy5sZW5ndGgpKSxzfHwocz0iLiIpO2NvbnN0IHU9cy5sYXN0SW5kZXhPZigiL25vZGVfbW9kdWxlcyIpO2lmKHU+LTEpcmV0dXJuYCR7cy5zbGljZSh1KzE0KS5yZXBsYWNlKC9cLy9nLCIuIil9OiR7aX1gO2lmKHMuc3RhcnRzV2l0aChuKSl7bGV0IHQ9cy5zbGljZShuLmxlbmd0aCsxKS5yZXBsYWNlKC9cLy9nLCIuIik7cmV0dXJuIHQmJih0Kz0iOiIpLHQrPWksdH1yZXR1cm4gaX19KGNlLmFwcFJvb3RQYXRoKTooKT0+e30sYz1zLm1hcCgodD0+ZnVuY3Rpb24odCxlLG4pe2NvbnN0IHI9ZT9lLnJlcGxhY2UoL15maWxlOlwvXC8vLCIiKTp2b2lkIDAsbz10LmxvY2F0aW9uLmNvbHVtbk51bWJlcj90LmxvY2F0aW9uLmNvbHVtbk51bWJlcisxOnZvaWQgMCxzPXQubG9jYXRpb24ubGluZU51bWJlcj90LmxvY2F0aW9uLmxpbmVOdW1iZXIrMTp2b2lkIDA7cmV0dXJuIGooe2ZpbGVuYW1lOnIsbW9kdWxlOm4ociksZnVuY3Rpb246dC5mdW5jdGlvbk5hbWV8fEksY29sbm86byxsaW5lbm86cyxpbl9hcHA6cj9aKHIpOnZvaWQgMH0pfSh0LG4uZ2V0KHQubG9jYXRpb24uc2NyaXB0SWQpLGkpKSksdT1zZXRUaW1lb3V0KCgoKT0+e3llKGMpLnRoZW4obnVsbCwoKCk9PntmZSgiU2VuZGluZyBBTlIgZXZlbnQgZmFpbGVkLiIpfSkpfSksNWUzKTtlLnBvc3QoIlJ1bnRpbWUuZXZhbHVhdGUiLHtleHByZXNzaW9uOiJnbG9iYWwuX19TRU5UUllfR0VUX1NDT1BFU19fKCk7IixzaWxlbnQ6ITAscmV0dXJuQnlWYWx1ZTohMH0sKCh0LG4pPT57dCYmZmUoYEVycm9yIGV4ZWN1dGluZyBzY3JpcHQ6ICcke3QubWVzc2FnZX0nYCksY2xlYXJUaW1lb3V0KHUpO2NvbnN0IHI9biYmbi5yZXN1bHQ/bi5yZXN1bHQudmFsdWU6dm9pZCAwO2UucG9zdCgiRGVidWdnZXIucmVzdW1lIiksZS5wb3N0KCJEZWJ1Z2dlci5kaXNhYmxlIikseWUoYyxyKS50aGVuKG51bGwsKCgpPT57ZmUoIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pKX0pKX1jYXRjaCh0KXt0aHJvdyBlLnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLGUucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLHR9fSkpLGJlPSgpPT57dHJ5e2UucG9zdCgiRGVidWdnZXIuZW5hYmxlIiwoKCk9PntlLnBvc3QoIkRlYnVnZ2VyLnBhdXNlIil9KSl9Y2F0Y2godCl7fX19Y29uc3R7cG9sbDp2ZX09ZnVuY3Rpb24odCxlLG4scil7Y29uc3Qgbz10KCk7bGV0IHM9ITEsaT0hMDtyZXR1cm4gc2V0SW50ZXJ2YWwoKCgpPT57Y29uc3QgdD1vLmdldFRpbWVNcygpOyExPT09cyYmdD5lK24mJihzPSEwLGkmJnIoKSksdDxlK24mJihzPSExKX0pLDIwKSx7cG9sbDooKT0+e28ucmVzZXQoKX0sZW5hYmxlZDp0PT57aT10fX19KChmdW5jdGlvbigpe2xldCB0PXByb2Nlc3MuaHJ0aW1lKCk7cmV0dXJue2dldFRpbWVNczooKT0+e2NvbnN0W2Usbl09cHJvY2Vzcy5ocnRpbWUodCk7cmV0dXJuIE1hdGguZmxvb3IoMWUzKmUrbi8xZTYpfSxyZXNldDooKT0+e3Q9cHJvY2Vzcy5ocnRpbWUoKX19fSksY2UucG9sbEludGVydmFsLGNlLmFuclRocmVzaG9sZCwoZnVuY3Rpb24oKXtmZSgiV2F0Y2hkb2cgdGltZW91dCIpLGJlPyhmZSgiUGF1c2luZyBkZWJ1Z2dlciB0byBjYXB0dXJlIHN0YWNrIHRyYWNlIiksYmUoKSk6KGZlKCJDYXB0dXJpbmcgZXZlbnQgd2l0aG91dCBhIHN0YWNrIHRyYWNlIikseWUoKS50aGVuKG51bGwsKCgpPT57ZmUoIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZCBvbiB3YXRjaGRvZyB0aW1lb3V0LiIpfSkpKX0pKTtlPy5vbigibWVzc2FnZSIsKHQ9Pnt0LnNlc3Npb24mJih1ZT1mdCh0LnNlc3Npb24pKSx2ZSgpfSkpOw==';
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZSA4LjMuMCAoOGI5OWRlNykgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtwYXJlbnRQb3J0IGFzIHQsd29ya2VyRGF0YSBhcyBlfWZyb20ibm9kZTp3b3JrZXJfdGhyZWFkcyI7aW1wb3J0e1Nlc3Npb24gYXMgbn1mcm9tImluc3BlY3RvciI7aW1wb3J0e3Bvc2l4IGFzIHIsc2VwIGFzIG99ZnJvbSJub2RlOnBhdGgiO2ltcG9ydCphcyBzIGZyb20ibm9kZTpodHRwIjtpbXBvcnQqYXMgaSBmcm9tIm5vZGU6aHR0cHMiO2ltcG9ydHtSZWFkYWJsZSBhcyBjfWZyb20ibm9kZTpzdHJlYW0iO2ltcG9ydHtjcmVhdGVHemlwIGFzIHV9ZnJvbSJub2RlOnpsaWIiO2ltcG9ydCphcyBhIGZyb20ibm9kZTpuZXQiO2ltcG9ydCphcyBmIGZyb20ibm9kZTp0bHMiO2NvbnN0IGg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBwKHQsZSl7cmV0dXJuIGguY2FsbCh0KT09PWBbb2JqZWN0ICR7ZX1dYH1mdW5jdGlvbiBsKHQpe3JldHVybiBwKHQsIk9iamVjdCIpfWZ1bmN0aW9uIGQodCl7cmV0dXJuIEJvb2xlYW4odCYmdC50aGVuJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuKX1mdW5jdGlvbiBtKHQsZSl7dHJ5e3JldHVybiB0IGluc3RhbmNlb2YgZX1jYXRjaCh0KXtyZXR1cm4hMX19Y29uc3QgZz1nbG9iYWxUaGlzO2Z1bmN0aW9uIHkodCxlLG4pe2NvbnN0IHI9bnx8ZyxvPXIuX19TRU5UUllfXz1yLl9fU0VOVFJZX198fHt9O3JldHVybiBvW3RdfHwob1t0XT1lKCkpfWNvbnN0IGI9Zyx2PTgwO2Z1bmN0aW9uIF8odCxlKXtjb25zdCBuPXQscj1bXTtsZXQgbyxzLGksYyx1O2lmKCFufHwhbi50YWdOYW1lKXJldHVybiIiO2lmKGIuSFRNTEVsZW1lbnQmJm4gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmbi5kYXRhc2V0KXtpZihuLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50KXJldHVybiBuLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50O2lmKG4uZGF0YXNldC5zZW50cnlFbGVtZW50KXJldHVybiBuLmRhdGFzZXQuc2VudHJ5RWxlbWVudH1yLnB1c2gobi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpO2NvbnN0IGE9ZSYmZS5sZW5ndGg/ZS5maWx0ZXIoKHQ9Pm4uZ2V0QXR0cmlidXRlKHQpKSkubWFwKCh0PT5bdCxuLmdldEF0dHJpYnV0ZSh0KV0pKTpudWxsO2lmKGEmJmEubGVuZ3RoKWEuZm9yRWFjaCgodD0+e3IucHVzaChgWyR7dFswXX09IiR7dFsxXX0iXWApfSkpO2Vsc2UgaWYobi5pZCYmci5wdXNoKGAjJHtuLmlkfWApLG89bi5jbGFzc05hbWUsbyYmcChvLCJTdHJpbmciKSlmb3Iocz1vLnNwbGl0KC9ccysvKSx1PTA7dTxzLmxlbmd0aDt1Kyspci5wdXNoKGAuJHtzW3VdfWApO2NvbnN0IGY9WyJhcmlhLWxhYmVsIiwidHlwZSIsIm5hbWUiLCJ0aXRsZSIsImFsdCJdO2Zvcih1PTA7dTxmLmxlbmd0aDt1KyspaT1mW3VdLGM9bi5nZXRBdHRyaWJ1dGUoaSksYyYmci5wdXNoKGBbJHtpfT0iJHtjfSJdYCk7cmV0dXJuIHIuam9pbigiIil9Y29uc3Qgdz0idW5kZWZpbmVkIj09dHlwZW9mIF9fU0VOVFJZX0RFQlVHX198fF9fU0VOVFJZX0RFQlVHX18sUz1bImRlYnVnIiwiaW5mbyIsIndhcm4iLCJlcnJvciIsImxvZyIsImFzc2VydCIsInRyYWNlIl0sJD17fTtmdW5jdGlvbiBFKHQpe2lmKCEoImNvbnNvbGUiaW4gZykpcmV0dXJuIHQoKTtjb25zdCBlPWcuY29uc29sZSxuPXt9LHI9T2JqZWN0LmtleXMoJCk7ci5mb3JFYWNoKCh0PT57Y29uc3Qgcj0kW3RdO25bdF09ZVt0XSxlW3RdPXJ9KSk7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtyLmZvckVhY2goKHQ9PntlW3RdPW5bdF19KSl9fWNvbnN0IHg9ZnVuY3Rpb24oKXtsZXQgdD0hMTtjb25zdCBlPXtlbmFibGU6KCk9Pnt0PSEwfSxkaXNhYmxlOigpPT57dD0hMX0saXNFbmFibGVkOigpPT50fTtyZXR1cm4gdz9TLmZvckVhY2goKG49PntlW25dPSguLi5lKT0+e3QmJkUoKCgpPT57Zy5jb25zb2xlW25dKGBTZW50cnkgTG9nZ2VyIFske259XTpgLC4uLmUpfSkpfX0pKTpTLmZvckVhY2goKHQ9PntlW3RdPSgpPT57fX0pKSxlfSgpO2Z1bmN0aW9uIE4odCxlPSExKXtjb25zdHtob3N0Om4scGF0aDpyLHBhc3M6byxwb3J0OnMscHJvamVjdElkOmkscHJvdG9jb2w6YyxwdWJsaWNLZXk6dX09dDtyZXR1cm5gJHtjfTovLyR7dX0ke2UmJm8/YDoke299YDoiIn1AJHtufSR7cz9gOiR7c31gOiIifS8ke3I/YCR7cn0vYDpyfSR7aX1gfWNsYXNzIGsgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LGU9Indhcm4iKXtzdXBlcih0KSx0aGlzLm1lc3NhZ2U9dCx0aGlzLm5hbWU9bmV3LnRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxuZXcudGFyZ2V0LnByb3RvdHlwZSksdGhpcy5sb2dMZXZlbD1lfX1mdW5jdGlvbiBDKHQpe2lmKGZ1bmN0aW9uKHQpe3N3aXRjaChoLmNhbGwodCkpe2Nhc2UiW29iamVjdCBFcnJvcl0iOmNhc2UiW29iamVjdCBFeGNlcHRpb25dIjpjYXNlIltvYmplY3QgRE9NRXhjZXB0aW9uXSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4gbSh0LEVycm9yKX19KHQpKXJldHVybnttZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrLC4uLlQodCl9O2lmKGU9dCwidW5kZWZpbmVkIiE9dHlwZW9mIEV2ZW50JiZtKGUsRXZlbnQpKXtjb25zdCBlPXt0eXBlOnQudHlwZSx0YXJnZXQ6RCh0LnRhcmdldCksY3VycmVudFRhcmdldDpEKHQuY3VycmVudFRhcmdldCksLi4uVCh0KX07cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBDdXN0b21FdmVudCYmbSh0LEN1c3RvbUV2ZW50KSYmKGUuZGV0YWlsPXQuZGV0YWlsKSxlfXJldHVybiB0O3ZhciBlfWZ1bmN0aW9uIEQodCl7dHJ5e3JldHVybiBlPXQsInVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50JiZtKGUsRWxlbWVudCk/ZnVuY3Rpb24odCxlPXt9KXtpZighdClyZXR1cm4iPHVua25vd24+Ijt0cnl7bGV0IG49dDtjb25zdCByPTUsbz1bXTtsZXQgcz0wLGk9MDtjb25zdCBjPSIgPiAiLHU9Yy5sZW5ndGg7bGV0IGE7Y29uc3QgZj1BcnJheS5pc0FycmF5KGUpP2U6ZS5rZXlBdHRycyxoPSFBcnJheS5pc0FycmF5KGUpJiZlLm1heFN0cmluZ0xlbmd0aHx8djtmb3IoO24mJnMrKzxyJiYoYT1fKG4sZiksISgiaHRtbCI9PT1hfHxzPjEmJmkrby5sZW5ndGgqdSthLmxlbmd0aD49aCkpOylvLnB1c2goYSksaSs9YS5sZW5ndGgsbj1uLnBhcmVudE5vZGU7cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oYyl9Y2F0Y2godCl7cmV0dXJuIjx1bmtub3duPiJ9fSh0KTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9Y2F0Y2godCl7cmV0dXJuIjx1bmtub3duPiJ9dmFyIGV9ZnVuY3Rpb24gVCh0KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KXtjb25zdCBlPXt9O2Zvcihjb25zdCBuIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW25dPXRbbl0pO3JldHVybiBlfXJldHVybnt9fWZ1bmN0aW9uIE8odCl7cmV0dXJuIGoodCxuZXcgTWFwKX1mdW5jdGlvbiBqKHQsZSl7aWYoZnVuY3Rpb24odCl7aWYoIWwodCkpcmV0dXJuITE7dHJ5e2NvbnN0IGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpLmNvbnN0cnVjdG9yLm5hbWU7cmV0dXJuIWV8fCJPYmplY3QiPT09ZX1jYXRjaCh0KXtyZXR1cm4hMH19KHQpKXtjb25zdCBuPWUuZ2V0KHQpO2lmKHZvaWQgMCE9PW4pcmV0dXJuIG47Y29uc3Qgcj17fTtlLnNldCh0LHIpO2Zvcihjb25zdCBuIG9mIE9iamVjdC5rZXlzKHQpKXZvaWQgMCE9PXRbbl0mJihyW25dPWoodFtuXSxlKSk7cmV0dXJuIHJ9aWYoQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgbj1lLmdldCh0KTtpZih2b2lkIDAhPT1uKXJldHVybiBuO2NvbnN0IHI9W107cmV0dXJuIGUuc2V0KHQsciksdC5mb3JFYWNoKCh0PT57ci5wdXNoKGoodCxlKSl9KSkscn1yZXR1cm4gdH1jb25zdCBSPTUwLEE9Ij8iLEk9L2NhcHR1cmVNZXNzYWdlfGNhcHR1cmVFeGNlcHRpb24vO2NvbnN0IFA9Ijxhbm9ueW1vdXM+Ijtjb25zdCBVPTFlMztmdW5jdGlvbiBNKCl7cmV0dXJuIERhdGUubm93KCkvVX1jb25zdCBMPWZ1bmN0aW9uKCl7Y29uc3R7cGVyZm9ybWFuY2U6dH09ZztpZighdHx8IXQubm93KXJldHVybiBNO2NvbnN0IGU9RGF0ZS5ub3coKS10Lm5vdygpLG49bnVsbD09dC50aW1lT3JpZ2luP2U6dC50aW1lT3JpZ2luO3JldHVybigpPT4obit0Lm5vdygpKS9VfSgpO2Z1bmN0aW9uIEIoKXtjb25zdCB0PWcsZT10LmNyeXB0b3x8dC5tc0NyeXB0bztsZXQgbj0oKT0+MTYqTWF0aC5yYW5kb20oKTt0cnl7aWYoZSYmZS5yYW5kb21VVUlEKXJldHVybiBlLnJhbmRvbVVVSUQoKS5yZXBsYWNlKC8tL2csIiIpO2UmJmUuZ2V0UmFuZG9tVmFsdWVzJiYobj0oKT0+e2NvbnN0IHQ9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIGUuZ2V0UmFuZG9tVmFsdWVzKHQpLHRbMF19KX1jYXRjaCh0KXt9cmV0dXJuKFsxZTddKzFlMys0ZTMrOGUzKzFlMTEpLnJlcGxhY2UoL1swMThdL2csKHQ9Pih0XigxNSZuKCkpPj50LzQpLnRvU3RyaW5nKDE2KSkpfWZ1bmN0aW9uIEcodCxlPTEwMCxuPTEvMCl7dHJ5e3JldHVybiBKKCIiLHQsZSxuKX1jYXRjaCh0KXtyZXR1cm57RVJST1I6YCoqbm9uLXNlcmlhbGl6YWJsZSoqICgke3R9KWB9fX1mdW5jdGlvbiBKKHQsZSxuPTEvMCxyPTEvMCxvPWZ1bmN0aW9uKCl7Y29uc3QgdD0iZnVuY3Rpb24iPT10eXBlb2YgV2Vha1NldCxlPXQ/bmV3IFdlYWtTZXQ6W107cmV0dXJuW2Z1bmN0aW9uKG4pe2lmKHQpcmV0dXJuISFlLmhhcyhuKXx8KGUuYWRkKG4pLCExKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylpZihlW3RdPT09bilyZXR1cm4hMDtyZXR1cm4gZS5wdXNoKG4pLCExfSxmdW5jdGlvbihuKXtpZih0KWUuZGVsZXRlKG4pO2Vsc2UgZm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspaWYoZVt0XT09PW4pe2Uuc3BsaWNlKHQsMSk7YnJlYWt9fV19KCkpe2NvbnN0W3MsaV09bztpZihudWxsPT1lfHxbIm51bWJlciIsImJvb2xlYW4iLCJzdHJpbmciXS5pbmNsdWRlcyh0eXBlb2YgZSkmJiFOdW1iZXIuaXNOYU4oZSkpcmV0dXJuIGU7Y29uc3QgYz1mdW5jdGlvbih0LGUpe3RyeXtpZigiZG9tYWluIj09PXQmJmUmJiJvYmplY3QiPT10eXBlb2YgZSYmZS50KXJldHVybiJbRG9tYWluXSI7aWYoImRvbWFpbkVtaXR0ZXIiPT09dClyZXR1cm4iW0RvbWFpbkVtaXR0ZXJdIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmZT09PWdsb2JhbClyZXR1cm4iW0dsb2JhbF0iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZlPT09d2luZG93KXJldHVybiJbV2luZG93XSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZT09PWRvY3VtZW50KXJldHVybiJbRG9jdW1lbnRdIjtpZigib2JqZWN0Ij09dHlwZW9mKG49ZSkmJm51bGwhPT1uJiYobi5fX2lzVnVlfHxuLm8pKXJldHVybiJbVnVlVmlld01vZGVsXSI7aWYoZnVuY3Rpb24odCl7cmV0dXJuIGwodCkmJiJuYXRpdmVFdmVudCJpbiB0JiYicHJldmVudERlZmF1bHQiaW4gdCYmInN0b3BQcm9wYWdhdGlvbiJpbiB0fShlKSlyZXR1cm4iW1N5bnRoZXRpY0V2ZW50XSI7aWYoIm51bWJlciI9PXR5cGVvZiBlJiZlIT1lKXJldHVybiJbTmFOXSI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuYFtGdW5jdGlvbjogJHtmdW5jdGlvbih0KXt0cnl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0Lm5hbWV8fFB9Y2F0Y2godCl7cmV0dXJuIFB9fShlKX1dYDtpZigic3ltYm9sIj09dHlwZW9mIGUpcmV0dXJuYFske1N0cmluZyhlKX1dYDtpZigiYmlnaW50Ij09dHlwZW9mIGUpcmV0dXJuYFtCaWdJbnQ6ICR7U3RyaW5nKGUpfV1gO2NvbnN0IHI9ZnVuY3Rpb24odCl7Y29uc3QgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7cmV0dXJuIGU/ZS5jb25zdHJ1Y3Rvci5uYW1lOiJudWxsIHByb3RvdHlwZSJ9KGUpO3JldHVybi9eSFRNTChcdyopRWxlbWVudCQvLnRlc3Qocik/YFtIVE1MRWxlbWVudDogJHtyfV1gOmBbb2JqZWN0ICR7cn1dYH1jYXRjaCh0KXtyZXR1cm5gKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH12YXIgbn0odCxlKTtpZighYy5zdGFydHNXaXRoKCJbb2JqZWN0ICIpKXJldHVybiBjO2lmKGUuX19zZW50cnlfc2tpcF9ub3JtYWxpemF0aW9uX18pcmV0dXJuIGU7Y29uc3QgdT0ibnVtYmVyIj09dHlwZW9mIGUuX19zZW50cnlfb3ZlcnJpZGVfbm9ybWFsaXphdGlvbl9kZXB0aF9fP2UuX19zZW50cnlfb3ZlcnJpZGVfbm9ybWFsaXphdGlvbl9kZXB0aF9fOm47aWYoMD09PXUpcmV0dXJuIGMucmVwbGFjZSgib2JqZWN0ICIsIiIpO2lmKHMoZSkpcmV0dXJuIltDaXJjdWxhciB+XSI7Y29uc3QgYT1lO2lmKGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnRvSlNPTil0cnl7cmV0dXJuIEooIiIsYS50b0pTT04oKSx1LTEscixvKX1jYXRjaCh0KXt9Y29uc3QgZj1BcnJheS5pc0FycmF5KGUpP1tdOnt9O2xldCBoPTA7Y29uc3QgcD1DKGUpO2Zvcihjb25zdCB0IGluIHApe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCx0KSljb250aW51ZTtpZihoPj1yKXtmW3RdPSJbTWF4UHJvcGVydGllcyB+XSI7YnJlYWt9Y29uc3QgZT1wW3RdO2ZbdF09Sih0LGUsdS0xLHIsbyksaCsrfXJldHVybiBpKGUpLGZ9ZnVuY3Rpb24geih0LGUpe2NvbnN0IG49ZS5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSgvW3xcXHt9KClbXF1eJCsqPy5dL2csIlxcJCYiKTtsZXQgcj10O3RyeXtyPWRlY29kZVVSSSh0KX1jYXRjaCh0KXt9cmV0dXJuIHIucmVwbGFjZSgvXFwvZywiLyIpLnJlcGxhY2UoL3dlYnBhY2s6XC8/L2csIiIpLnJlcGxhY2UobmV3IFJlZ0V4cChgKGZpbGU6Ly8pPy8qJHtufS8qYCwiaWciKSwiYXBwOi8vLyIpfSgoKT0+e2NvbnN0e3BlcmZvcm1hbmNlOnR9PWc7aWYoIXR8fCF0Lm5vdylyZXR1cm47Y29uc3QgZT0zNmU1LG49dC5ub3coKSxyPURhdGUubm93KCksbz10LnRpbWVPcmlnaW4/TWF0aC5hYnModC50aW1lT3JpZ2luK24tcik6ZSxzPW88ZSxpPXQudGltaW5nJiZ0LnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQsYz0ibnVtYmVyIj09dHlwZW9mIGk/TWF0aC5hYnMoaStuLXIpOmU7KHN8fGM8ZSkmJihvPD1jJiZ0LnRpbWVPcmlnaW4pfSkoKTtjb25zdCBIPS9eKFxTKzpcXHxcLz8pKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteL1xcXSs/fCkoXC5bXi4vXFxdKnwpKSg/OlsvXFxdKikkLztmdW5jdGlvbiBXKHQpe2NvbnN0IGU9ZnVuY3Rpb24odCl7Y29uc3QgZT10Lmxlbmd0aD4xMDI0P2A8dHJ1bmNhdGVkPiR7dC5zbGljZSgtMTAyNCl9YDp0LG49SC5leGVjKGUpO3JldHVybiBuP24uc2xpY2UoMSk6W119KHQpLG49ZVswXTtsZXQgcj1lWzFdO3JldHVybiBufHxyPyhyJiYocj1yLnNsaWNlKDAsci5sZW5ndGgtMSkpLG4rcik6Ii4ifXZhciBZO2Z1bmN0aW9uIHEodCl7cmV0dXJuIG5ldyBGKChlPT57ZSh0KX0pKX0hZnVuY3Rpb24odCl7dFt0LlBFTkRJTkc9MF09IlBFTkRJTkciO3RbdC5SRVNPTFZFRD0xXT0iUkVTT0xWRUQiO3RbdC5SRUpFQ1RFRD0yXT0iUkVKRUNURUQifShZfHwoWT17fSkpO2NsYXNzIEZ7Y29uc3RydWN0b3IodCl7Ri5wcm90b3R5cGUuX19pbml0LmNhbGwodGhpcyksRi5wcm90b3R5cGUuX19pbml0Mi5jYWxsKHRoaXMpLEYucHJvdG90eXBlLl9faW5pdDMuY2FsbCh0aGlzKSxGLnByb3RvdHlwZS5fX2luaXQ0LmNhbGwodGhpcyksdGhpcy5pPVkuUEVORElORyx0aGlzLnU9W107dHJ5e3QodGhpcy5oLHRoaXMucCl9Y2F0Y2godCl7dGhpcy5wKHQpfX10aGVuKHQsZSl7cmV0dXJuIG5ldyBGKCgobixyKT0+e3RoaXMudS5wdXNoKFshMSxlPT57aWYodCl0cnl7bih0KGUpKX1jYXRjaCh0KXtyKHQpfWVsc2UgbihlKX0sdD0+e2lmKGUpdHJ5e24oZSh0KSl9Y2F0Y2godCl7cih0KX1lbHNlIHIodCl9XSksdGhpcy5sKCl9KSl9Y2F0Y2godCl7cmV0dXJuIHRoaXMudGhlbigodD0+dCksdCl9ZmluYWxseSh0KXtyZXR1cm4gbmV3IEYoKChlLG4pPT57bGV0IHIsbztyZXR1cm4gdGhpcy50aGVuKChlPT57bz0hMSxyPWUsdCYmdCgpfSksKGU9PntvPSEwLHI9ZSx0JiZ0KCl9KSkudGhlbigoKCk9PntvP24ocik6ZShyKX0pKX0pKX1fX2luaXQoKXt0aGlzLmg9dD0+e3RoaXMubShZLlJFU09MVkVELHQpfX1fX2luaXQyKCl7dGhpcy5wPXQ9Pnt0aGlzLm0oWS5SRUpFQ1RFRCx0KX19X19pbml0Mygpe3RoaXMubT0odCxlKT0+e3RoaXMuaT09PVkuUEVORElORyYmKGQoZSk/ZS50aGVuKHRoaXMuaCx0aGlzLnApOih0aGlzLmk9dCx0aGlzLnY9ZSx0aGlzLmwoKSkpfX1fX2luaXQ0KCl7dGhpcy5sPSgpPT57aWYodGhpcy5pPT09WS5QRU5ESU5HKXJldHVybjtjb25zdCB0PXRoaXMudS5zbGljZSgpO3RoaXMudT1bXSx0LmZvckVhY2goKHQ9Pnt0WzBdfHwodGhpcy5pPT09WS5SRVNPTFZFRCYmdFsxXSh0aGlzLnYpLHRoaXMuaT09PVkuUkVKRUNURUQmJnRbMl0odGhpcy52KSx0WzBdPSEwKX0pKX19fWZ1bmN0aW9uIEsodCl7Y29uc3QgZT1bXTtmdW5jdGlvbiBuKHQpe3JldHVybiBlLnNwbGljZShlLmluZGV4T2YodCksMSlbMF19cmV0dXJueyQ6ZSxhZGQ6ZnVuY3Rpb24ocil7aWYoISh2b2lkIDA9PT10fHxlLmxlbmd0aDx0KSlyZXR1cm4gbz1uZXcgaygiTm90IGFkZGluZyBQcm9taXNlIGJlY2F1c2UgYnVmZmVyIGxpbWl0IHdhcyByZWFjaGVkLiIpLG5ldyBGKCgodCxlKT0+e2Uobyl9KSk7dmFyIG87Y29uc3Qgcz1yKCk7cmV0dXJuLTE9PT1lLmluZGV4T2YocykmJmUucHVzaChzKSxzLnRoZW4oKCgpPT5uKHMpKSkudGhlbihudWxsLCgoKT0+bihzKS50aGVuKG51bGwsKCgpPT57fSkpKSksc30sZHJhaW46ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGKCgobixyKT0+e2xldCBvPWUubGVuZ3RoO2lmKCFvKXJldHVybiBuKCEwKTtjb25zdCBzPXNldFRpbWVvdXQoKCgpPT57dCYmdD4wJiZuKCExKX0pLHQpO2UuZm9yRWFjaCgodD0+e3EodCkudGhlbigoKCk9PnstLW98fChjbGVhclRpbWVvdXQocyksbighMCkpfSkscil9KSl9KSl9fX1mdW5jdGlvbiBWKHQsZT0hMSl7cmV0dXJuIShlfHx0JiYhdC5zdGFydHNXaXRoKCIvIikmJiF0Lm1hdGNoKC9eW0EtWl06LykmJiF0LnN0YXJ0c1dpdGgoIi4iKSYmIXQubWF0Y2goL15bYS16QS1aXShbYS16QS1aMC05LlwtK10pKjpcL1wvLykpJiZ2b2lkIDAhPT10JiYhdC5pbmNsdWRlcygibm9kZV9tb2R1bGVzLyIpfWZ1bmN0aW9uIFoodCxlPVtdKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBRKHQsZSl7Y29uc3Qgbj10WzFdO2Zvcihjb25zdCB0IG9mIG4pe2lmKGUodCx0WzBdLnR5cGUpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFgodCl7cmV0dXJuIGcuX19TRU5UUllfXyYmZy5fX1NFTlRSWV9fLmVuY29kZVBvbHlmaWxsP2cuX19TRU5UUllfXy5lbmNvZGVQb2x5ZmlsbCh0KToobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCl9ZnVuY3Rpb24gdHQodCl7Y29uc3RbZSxuXT10O2xldCByPUpTT04uc3RyaW5naWZ5KGUpO2Z1bmN0aW9uIG8odCl7InN0cmluZyI9PXR5cGVvZiByP3I9InN0cmluZyI9PXR5cGVvZiB0P3IrdDpbWChyKSx0XTpyLnB1c2goInN0cmluZyI9PXR5cGVvZiB0P1godCk6dCl9Zm9yKGNvbnN0IHQgb2Ygbil7Y29uc3RbZSxuXT10O2lmKG8oYFxuJHtKU09OLnN0cmluZ2lmeShlKX1cbmApLCJzdHJpbmciPT10eXBlb2Ygbnx8biBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpbyhuKTtlbHNle2xldCB0O3RyeXt0PUpTT04uc3RyaW5naWZ5KG4pfWNhdGNoKGUpe3Q9SlNPTi5zdHJpbmdpZnkoRyhuKSl9byh0KX19cmV0dXJuInN0cmluZyI9PXR5cGVvZiByP3I6ZnVuY3Rpb24odCl7Y29uc3QgZT10LnJlZHVjZSgoKHQsZSk9PnQrZS5sZW5ndGgpLDApLG49bmV3IFVpbnQ4QXJyYXkoZSk7bGV0IHI9MDtmb3IoY29uc3QgZSBvZiB0KW4uc2V0KGUscikscis9ZS5sZW5ndGg7cmV0dXJuIG59KHIpfWNvbnN0IGV0PXtzZXNzaW9uOiJzZXNzaW9uIixzZXNzaW9uczoic2Vzc2lvbiIsYXR0YWNobWVudDoiYXR0YWNobWVudCIsdHJhbnNhY3Rpb246InRyYW5zYWN0aW9uIixldmVudDoiZXJyb3IiLGNsaWVudF9yZXBvcnQ6ImludGVybmFsIix1c2VyX3JlcG9ydDoiZGVmYXVsdCIscHJvZmlsZToicHJvZmlsZSIscmVwbGF5X2V2ZW50OiJyZXBsYXkiLHJlcGxheV9yZWNvcmRpbmc6InJlcGxheSIsY2hlY2tfaW46Im1vbml0b3IiLGZlZWRiYWNrOiJmZWVkYmFjayIsc3Bhbjoic3BhbiIsc3RhdHNkOiJtZXRyaWNfYnVja2V0In07ZnVuY3Rpb24gbnQodCl7cmV0dXJuIGV0W3RdfWZ1bmN0aW9uIHJ0KHQpe2lmKCF0fHwhdC5zZGspcmV0dXJuO2NvbnN0e25hbWU6ZSx2ZXJzaW9uOm59PXQuc2RrO3JldHVybntuYW1lOmUsdmVyc2lvbjpufX1jb25zdCBvdD02ZTQ7ZnVuY3Rpb24gc3QodCx7c3RhdHVzQ29kZTplLGhlYWRlcnM6bn0scj1EYXRlLm5vdygpKXtjb25zdCBvPXsuLi50fSxzPW4mJm5bIngtc2VudHJ5LXJhdGUtbGltaXRzIl0saT1uJiZuWyJyZXRyeS1hZnRlciJdO2lmKHMpZm9yKGNvbnN0IHQgb2Ygcy50cmltKCkuc3BsaXQoIiwiKSl7Y29uc3RbZSxuLCwsc109dC5zcGxpdCgiOiIsNSksaT1wYXJzZUludChlLDEwKSxjPTFlMyooaXNOYU4oaSk/NjA6aSk7aWYobilmb3IoY29uc3QgdCBvZiBuLnNwbGl0KCI7IikpIm1ldHJpY19idWNrZXQiPT09dCYmcyYmIXMuc3BsaXQoIjsiKS5pbmNsdWRlcygiY3VzdG9tIil8fChvW3RdPXIrYyk7ZWxzZSBvLmFsbD1yK2N9ZWxzZSBpP28uYWxsPXIrZnVuY3Rpb24odCxlPURhdGUubm93KCkpe2NvbnN0IG49cGFyc2VJbnQoYCR7dH1gLDEwKTtpZighaXNOYU4obikpcmV0dXJuIDFlMypuO2NvbnN0IHI9RGF0ZS5wYXJzZShgJHt0fWApO3JldHVybiBpc05hTihyKT9vdDpyLWV9KGkscik6NDI5PT09ZSYmKG8uYWxsPXIrNmU0KTtyZXR1cm4gb31jb25zdCBpdD0idW5kZWZpbmVkIj09dHlwZW9mIF9fU0VOVFJZX0RFQlVHX198fF9fU0VOVFJZX0RFQlVHX187ZnVuY3Rpb24gY3QoKXtyZXR1cm4gdXQoZyksZ31mdW5jdGlvbiB1dCh0KXtyZXR1cm4gdC5fX1NFTlRSWV9ffHwodC5fX1NFTlRSWV9fPXtleHRlbnNpb25zOnt9fSksdC5fX1NFTlRSWV9ffWZ1bmN0aW9uIGF0KHQpe2NvbnN0IGU9TCgpLG49e3NpZDpCKCksaW5pdDohMCx0aW1lc3RhbXA6ZSxzdGFydGVkOmUsZHVyYXRpb246MCxzdGF0dXM6Im9rIixlcnJvcnM6MCxpZ25vcmVEdXJhdGlvbjohMSx0b0pTT046KCk9PmZ1bmN0aW9uKHQpe3JldHVybiBPKHtzaWQ6YCR7dC5zaWR9YCxpbml0OnQuaW5pdCxzdGFydGVkOm5ldyBEYXRlKDFlMyp0LnN0YXJ0ZWQpLnRvSVNPU3RyaW5nKCksdGltZXN0YW1wOm5ldyBEYXRlKDFlMyp0LnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKSxzdGF0dXM6dC5zdGF0dXMsZXJyb3JzOnQuZXJyb3JzLGRpZDoibnVtYmVyIj09dHlwZW9mIHQuZGlkfHwic3RyaW5nIj09dHlwZW9mIHQuZGlkP2Ake3QuZGlkfWA6dm9pZCAwLGR1cmF0aW9uOnQuZHVyYXRpb24sYWJub3JtYWxfbWVjaGFuaXNtOnQuYWJub3JtYWxfbWVjaGFuaXNtLGF0dHJzOntyZWxlYXNlOnQucmVsZWFzZSxlbnZpcm9ubWVudDp0LmVudmlyb25tZW50LGlwX2FkZHJlc3M6dC5pcEFkZHJlc3MsdXNlcl9hZ2VudDp0LnVzZXJBZ2VudH19KX0obil9O3JldHVybiB0JiZmdChuLHQpLG59ZnVuY3Rpb24gZnQodCxlPXt9KXtpZihlLnVzZXImJighdC5pcEFkZHJlc3MmJmUudXNlci5pcF9hZGRyZXNzJiYodC5pcEFkZHJlc3M9ZS51c2VyLmlwX2FkZHJlc3MpLHQuZGlkfHxlLmRpZHx8KHQuZGlkPWUudXNlci5pZHx8ZS51c2VyLmVtYWlsfHxlLnVzZXIudXNlcm5hbWUpKSx0LnRpbWVzdGFtcD1lLnRpbWVzdGFtcHx8TCgpLGUuYWJub3JtYWxfbWVjaGFuaXNtJiYodC5hYm5vcm1hbF9tZWNoYW5pc209ZS5hYm5vcm1hbF9tZWNoYW5pc20pLGUuaWdub3JlRHVyYXRpb24mJih0Lmlnbm9yZUR1cmF0aW9uPWUuaWdub3JlRHVyYXRpb24pLGUuc2lkJiYodC5zaWQ9MzI9PT1lLnNpZC5sZW5ndGg/ZS5zaWQ6QigpKSx2b2lkIDAhPT1lLmluaXQmJih0LmluaXQ9ZS5pbml0KSwhdC5kaWQmJmUuZGlkJiYodC5kaWQ9YCR7ZS5kaWR9YCksIm51bWJlciI9PXR5cGVvZiBlLnN0YXJ0ZWQmJih0LnN0YXJ0ZWQ9ZS5zdGFydGVkKSx0Lmlnbm9yZUR1cmF0aW9uKXQuZHVyYXRpb249dm9pZCAwO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlLmR1cmF0aW9uKXQuZHVyYXRpb249ZS5kdXJhdGlvbjtlbHNle2NvbnN0IGU9dC50aW1lc3RhbXAtdC5zdGFydGVkO3QuZHVyYXRpb249ZT49MD9lOjB9ZS5yZWxlYXNlJiYodC5yZWxlYXNlPWUucmVsZWFzZSksZS5lbnZpcm9ubWVudCYmKHQuZW52aXJvbm1lbnQ9ZS5lbnZpcm9ubWVudCksIXQuaXBBZGRyZXNzJiZlLmlwQWRkcmVzcyYmKHQuaXBBZGRyZXNzPWUuaXBBZGRyZXNzKSwhdC51c2VyQWdlbnQmJmUudXNlckFnZW50JiYodC51c2VyQWdlbnQ9ZS51c2VyQWdlbnQpLCJudW1iZXIiPT10eXBlb2YgZS5lcnJvcnMmJih0LmVycm9ycz1lLmVycm9ycyksZS5zdGF0dXMmJih0LnN0YXR1cz1lLnN0YXR1cyl9Y29uc3QgaHQ9Il9zZW50cnlTcGFuIjtmdW5jdGlvbiBwdCh0LGUpe2U/ZnVuY3Rpb24odCxlLG4pe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfWNhdGNoKG4pe3cmJngubG9nKGBGYWlsZWQgdG8gYWRkIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5ICIke2V9IiB0byBvYmplY3RgLHQpfX0odCxodCxlKTpkZWxldGUgdFtodF19ZnVuY3Rpb24gbHQodCl7cmV0dXJuIHRbaHRdfWNsYXNzIGR0e2NvbnN0cnVjdG9yKCl7dGhpcy5fPSExLHRoaXMuUz1bXSx0aGlzLk49W10sdGhpcy5rPVtdLHRoaXMuQz1bXSx0aGlzLkQ9e30sdGhpcy5UPXt9LHRoaXMuTz17fSx0aGlzLmo9e30sdGhpcy5SPXt9LHRoaXMuQT1ndCgpfWNsb25lKCl7Y29uc3QgdD1uZXcgZHQ7cmV0dXJuIHQuaz1bLi4udGhpcy5rXSx0LlQ9ey4uLnRoaXMuVH0sdC5PPXsuLi50aGlzLk99LHQuaj17Li4udGhpcy5qfSx0LkQ9dGhpcy5ELHQuST10aGlzLkksdC5QPXRoaXMuUCx0LlU9dGhpcy5VLHQuTT10aGlzLk0sdC5OPVsuLi50aGlzLk5dLHQuTD10aGlzLkwsdC5DPVsuLi50aGlzLkNdLHQuUj17Li4udGhpcy5SfSx0LkE9ey4uLnRoaXMuQX0sdC5CPXRoaXMuQix0Lkc9dGhpcy5HLHB0KHQsbHQodGhpcykpLHR9c2V0Q2xpZW50KHQpe3RoaXMuQj10fXNldExhc3RFdmVudElkKHQpe3RoaXMuRz10fWdldENsaWVudCgpe3JldHVybiB0aGlzLkJ9bGFzdEV2ZW50SWQoKXtyZXR1cm4gdGhpcy5HfWFkZFNjb3BlTGlzdGVuZXIodCl7dGhpcy5TLnB1c2godCl9YWRkRXZlbnRQcm9jZXNzb3IodCl7cmV0dXJuIHRoaXMuTi5wdXNoKHQpLHRoaXN9c2V0VXNlcih0KXtyZXR1cm4gdGhpcy5EPXR8fHtlbWFpbDp2b2lkIDAsaWQ6dm9pZCAwLGlwX2FkZHJlc3M6dm9pZCAwLHVzZXJuYW1lOnZvaWQgMH0sdGhpcy5QJiZmdCh0aGlzLlAse3VzZXI6dH0pLHRoaXMuSigpLHRoaXN9Z2V0VXNlcigpe3JldHVybiB0aGlzLkR9Z2V0UmVxdWVzdFNlc3Npb24oKXtyZXR1cm4gdGhpcy5MfXNldFJlcXVlc3RTZXNzaW9uKHQpe3JldHVybiB0aGlzLkw9dCx0aGlzfXNldFRhZ3ModCl7cmV0dXJuIHRoaXMuVD17Li4udGhpcy5ULC4uLnR9LHRoaXMuSigpLHRoaXN9c2V0VGFnKHQsZSl7cmV0dXJuIHRoaXMuVD17Li4udGhpcy5ULFt0XTplfSx0aGlzLkooKSx0aGlzfXNldEV4dHJhcyh0KXtyZXR1cm4gdGhpcy5PPXsuLi50aGlzLk8sLi4udH0sdGhpcy5KKCksdGhpc31zZXRFeHRyYSh0LGUpe3JldHVybiB0aGlzLk89ey4uLnRoaXMuTyxbdF06ZX0sdGhpcy5KKCksdGhpc31zZXRGaW5nZXJwcmludCh0KXtyZXR1cm4gdGhpcy5NPXQsdGhpcy5KKCksdGhpc31zZXRMZXZlbCh0KXtyZXR1cm4gdGhpcy5JPXQsdGhpcy5KKCksdGhpc31zZXRUcmFuc2FjdGlvbk5hbWUodCl7cmV0dXJuIHRoaXMuVT10LHRoaXMuSigpLHRoaXN9c2V0Q29udGV4dCh0LGUpe3JldHVybiBudWxsPT09ZT9kZWxldGUgdGhpcy5qW3RdOnRoaXMualt0XT1lLHRoaXMuSigpLHRoaXN9c2V0U2Vzc2lvbih0KXtyZXR1cm4gdD90aGlzLlA9dDpkZWxldGUgdGhpcy5QLHRoaXMuSigpLHRoaXN9Z2V0U2Vzc2lvbigpe3JldHVybiB0aGlzLlB9dXBkYXRlKHQpe2lmKCF0KXJldHVybiB0aGlzO2NvbnN0IGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCh0aGlzKTp0LFtuLHJdPWUgaW5zdGFuY2VvZiBtdD9bZS5nZXRTY29wZURhdGEoKSxlLmdldFJlcXVlc3RTZXNzaW9uKCldOmwoZSk/W3QsdC5yZXF1ZXN0U2Vzc2lvbl06W10se3RhZ3M6byxleHRyYTpzLHVzZXI6aSxjb250ZXh0czpjLGxldmVsOnUsZmluZ2VycHJpbnQ6YT1bXSxwcm9wYWdhdGlvbkNvbnRleHQ6Zn09bnx8e307cmV0dXJuIHRoaXMuVD17Li4udGhpcy5ULC4uLm99LHRoaXMuTz17Li4udGhpcy5PLC4uLnN9LHRoaXMuaj17Li4udGhpcy5qLC4uLmN9LGkmJk9iamVjdC5rZXlzKGkpLmxlbmd0aCYmKHRoaXMuRD1pKSx1JiYodGhpcy5JPXUpLGEubGVuZ3RoJiYodGhpcy5NPWEpLGYmJih0aGlzLkE9ZiksciYmKHRoaXMuTD1yKSx0aGlzfWNsZWFyKCl7cmV0dXJuIHRoaXMuaz1bXSx0aGlzLlQ9e30sdGhpcy5PPXt9LHRoaXMuRD17fSx0aGlzLmo9e30sdGhpcy5JPXZvaWQgMCx0aGlzLlU9dm9pZCAwLHRoaXMuTT12b2lkIDAsdGhpcy5MPXZvaWQgMCx0aGlzLlA9dm9pZCAwLHB0KHRoaXMsdm9pZCAwKSx0aGlzLkM9W10sdGhpcy5BPWd0KCksdGhpcy5KKCksdGhpc31hZGRCcmVhZGNydW1iKHQsZSl7Y29uc3Qgbj0ibnVtYmVyIj09dHlwZW9mIGU/ZToxMDA7aWYobjw9MClyZXR1cm4gdGhpcztjb25zdCByPXt0aW1lc3RhbXA6TSgpLC4uLnR9LG89dGhpcy5rO3JldHVybiBvLnB1c2gociksdGhpcy5rPW8ubGVuZ3RoPm4/by5zbGljZSgtbik6byx0aGlzLkooKSx0aGlzfWdldExhc3RCcmVhZGNydW1iKCl7cmV0dXJuIHRoaXMua1t0aGlzLmsubGVuZ3RoLTFdfWNsZWFyQnJlYWRjcnVtYnMoKXtyZXR1cm4gdGhpcy5rPVtdLHRoaXMuSigpLHRoaXN9YWRkQXR0YWNobWVudCh0KXtyZXR1cm4gdGhpcy5DLnB1c2godCksdGhpc31jbGVhckF0dGFjaG1lbnRzKCl7cmV0dXJuIHRoaXMuQz1bXSx0aGlzfWdldFNjb3BlRGF0YSgpe3JldHVybnticmVhZGNydW1iczp0aGlzLmssYXR0YWNobWVudHM6dGhpcy5DLGNvbnRleHRzOnRoaXMuaix0YWdzOnRoaXMuVCxleHRyYTp0aGlzLk8sdXNlcjp0aGlzLkQsbGV2ZWw6dGhpcy5JLGZpbmdlcnByaW50OnRoaXMuTXx8W10sZXZlbnRQcm9jZXNzb3JzOnRoaXMuTixwcm9wYWdhdGlvbkNvbnRleHQ6dGhpcy5BLHNka1Byb2Nlc3NpbmdNZXRhZGF0YTp0aGlzLlIsdHJhbnNhY3Rpb25OYW1lOnRoaXMuVSxzcGFuOmx0KHRoaXMpfX1zZXRTREtQcm9jZXNzaW5nTWV0YWRhdGEodCl7cmV0dXJuIHRoaXMuUj17Li4udGhpcy5SLC4uLnR9LHRoaXN9c2V0UHJvcGFnYXRpb25Db250ZXh0KHQpe3JldHVybiB0aGlzLkE9dCx0aGlzfWdldFByb3BhZ2F0aW9uQ29udGV4dCgpe3JldHVybiB0aGlzLkF9Y2FwdHVyZUV4Y2VwdGlvbih0LGUpe2NvbnN0IG49ZSYmZS5ldmVudF9pZD9lLmV2ZW50X2lkOkIoKTtpZighdGhpcy5CKXJldHVybiB4Lndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBleGNlcHRpb24hIiksbjtjb25zdCByPW5ldyBFcnJvcigiU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbiIpO3JldHVybiB0aGlzLkIuY2FwdHVyZUV4Y2VwdGlvbih0LHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpyLC4uLmUsZXZlbnRfaWQ6bn0sdGhpcyksbn1jYXB0dXJlTWVzc2FnZSh0LGUsbil7Y29uc3Qgcj1uJiZuLmV2ZW50X2lkP24uZXZlbnRfaWQ6QigpO2lmKCF0aGlzLkIpcmV0dXJuIHgud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIG1lc3NhZ2UhIikscjtjb25zdCBvPW5ldyBFcnJvcih0KTtyZXR1cm4gdGhpcy5CLmNhcHR1cmVNZXNzYWdlKHQsZSx7b3JpZ2luYWxFeGNlcHRpb246dCxzeW50aGV0aWNFeGNlcHRpb246bywuLi5uLGV2ZW50X2lkOnJ9LHRoaXMpLHJ9Y2FwdHVyZUV2ZW50KHQsZSl7Y29uc3Qgbj1lJiZlLmV2ZW50X2lkP2UuZXZlbnRfaWQ6QigpO3JldHVybiB0aGlzLkI/KHRoaXMuQi5jYXB0dXJlRXZlbnQodCx7Li4uZSxldmVudF9pZDpufSx0aGlzKSxuKTooeC53YXJuKCJObyBjbGllbnQgY29uZmlndXJlZCBvbiBzY29wZSAtIHdpbGwgbm90IGNhcHR1cmUgZXZlbnQhIiksbil9Sigpe3RoaXMuX3x8KHRoaXMuXz0hMCx0aGlzLlMuZm9yRWFjaCgodD0+e3QodGhpcyl9KSksdGhpcy5fPSExKX19Y29uc3QgbXQ9ZHQ7ZnVuY3Rpb24gZ3QoKXtyZXR1cm57dHJhY2VJZDpCKCksc3BhbklkOkIoKS5zdWJzdHJpbmcoMTYpfX1jbGFzcyB5dHtjb25zdHJ1Y3Rvcih0LGUpe2xldCBuLHI7bj10fHxuZXcgbXQscj1lfHxuZXcgbXQsdGhpcy5IPVt7c2NvcGU6bn1dLHRoaXMuVz1yfXdpdGhTY29wZSh0KXtjb25zdCBlPXRoaXMuWSgpO2xldCBuO3RyeXtuPXQoZSl9Y2F0Y2godCl7dGhyb3cgdGhpcy5xKCksdH1yZXR1cm4gZChuKT9uLnRoZW4oKHQ9Pih0aGlzLnEoKSx0KSksKHQ9Pnt0aHJvdyB0aGlzLnEoKSx0fSkpOih0aGlzLnEoKSxuKX1nZXRDbGllbnQoKXtyZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLmNsaWVudH1nZXRTY29wZSgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGV9Z2V0SXNvbGF0aW9uU2NvcGUoKXtyZXR1cm4gdGhpcy5XfWdldFN0YWNrKCl7cmV0dXJuIHRoaXMuSH1nZXRTdGFja1RvcCgpe3JldHVybiB0aGlzLkhbdGhpcy5ILmxlbmd0aC0xXX1ZKCl7Y29uc3QgdD10aGlzLmdldFNjb3BlKCkuY2xvbmUoKTtyZXR1cm4gdGhpcy5nZXRTdGFjaygpLnB1c2goe2NsaWVudDp0aGlzLmdldENsaWVudCgpLHNjb3BlOnR9KSx0fXEoKXtyZXR1cm4hKHRoaXMuZ2V0U3RhY2soKS5sZW5ndGg8PTEpJiYhIXRoaXMuZ2V0U3RhY2soKS5wb3AoKX19ZnVuY3Rpb24gYnQoKXtjb25zdCB0PXV0KGN0KCkpO3JldHVybiB0Lmh1Ynx8KHQuaHViPW5ldyB5dCh5KCJkZWZhdWx0Q3VycmVudFNjb3BlIiwoKCk9Pm5ldyBtdCkpLHkoImRlZmF1bHRJc29sYXRpb25TY29wZSIsKCgpPT5uZXcgbXQpKSkpLHQuaHVifWZ1bmN0aW9uIHZ0KHQpe3JldHVybiBidCgpLndpdGhTY29wZSh0KX1mdW5jdGlvbiBfdCh0LGUpe2NvbnN0IG49YnQoKTtyZXR1cm4gbi53aXRoU2NvcGUoKCgpPT4obi5nZXRTdGFja1RvcCgpLnNjb3BlPXQsZSh0KSkpKX1mdW5jdGlvbiB3dCh0KXtyZXR1cm4gYnQoKS53aXRoU2NvcGUoKCgpPT50KGJ0KCkuZ2V0SXNvbGF0aW9uU2NvcGUoKSkpKX1mdW5jdGlvbiBTdCh0KXtjb25zdCBlPXV0KHQpO3JldHVybiBlLmFjcz9lLmFjczp7d2l0aElzb2xhdGlvblNjb3BlOnd0LHdpdGhTY29wZTp2dCx3aXRoU2V0U2NvcGU6X3Qsd2l0aFNldElzb2xhdGlvblNjb3BlOih0LGUpPT53dChlKSxnZXRDdXJyZW50U2NvcGU6KCk9PmJ0KCkuZ2V0U2NvcGUoKSxnZXRJc29sYXRpb25TY29wZTooKT0+YnQoKS5nZXRJc29sYXRpb25TY29wZSgpfX1mdW5jdGlvbiAkdCgpe3JldHVybiBTdChjdCgpKS5nZXRDdXJyZW50U2NvcGUoKS5nZXRDbGllbnQoKX1jb25zdCBFdD0ic2VudHJ5LnNvdXJjZSIseHQ9InNlbnRyeS5zYW1wbGVfcmF0ZSIsTnQ9InNlbnRyeS5vcCIsa3Q9InNlbnRyeS5vcmlnaW4iLEN0PTAsRHQ9MSxUdD0xO2Z1bmN0aW9uIE90KHQpe2NvbnN0e3NwYW5JZDplLHRyYWNlSWQ6bn09dC5zcGFuQ29udGV4dCgpLHtwYXJlbnRfc3Bhbl9pZDpyfT1BdCh0KTtyZXR1cm4gTyh7cGFyZW50X3NwYW5faWQ6cixzcGFuX2lkOmUsdHJhY2VfaWQ6bn0pfWZ1bmN0aW9uIGp0KHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD9SdCh0KTpBcnJheS5pc0FycmF5KHQpP3RbMF0rdFsxXS8xZTk6dCBpbnN0YW5jZW9mIERhdGU/UnQodC5nZXRUaW1lKCkpOkwoKX1mdW5jdGlvbiBSdCh0KXtyZXR1cm4gdD45OTk5OTk5OTk5P3QvMWUzOnR9ZnVuY3Rpb24gQXQodCl7aWYoZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0U3BhbkpTT059KHQpKXJldHVybiB0LmdldFNwYW5KU09OKCk7dHJ5e2NvbnN0e3NwYW5JZDplLHRyYWNlSWQ6bn09dC5zcGFuQ29udGV4dCgpO2lmKGZ1bmN0aW9uKHQpe2NvbnN0IGU9dDtyZXR1cm4hIShlLmF0dHJpYnV0ZXMmJmUuc3RhcnRUaW1lJiZlLm5hbWUmJmUuZW5kVGltZSYmZS5zdGF0dXMpfSh0KSl7Y29uc3R7YXR0cmlidXRlczpyLHN0YXJ0VGltZTpvLG5hbWU6cyxlbmRUaW1lOmkscGFyZW50U3BhbklkOmMsc3RhdHVzOnV9PXQ7cmV0dXJuIE8oe3NwYW5faWQ6ZSx0cmFjZV9pZDpuLGRhdGE6cixkZXNjcmlwdGlvbjpzLHBhcmVudF9zcGFuX2lkOmMsc3RhcnRfdGltZXN0YW1wOmp0KG8pLHRpbWVzdGFtcDpqdChpKXx8dm9pZCAwLHN0YXR1czpJdCh1KSxvcDpyW050XSxvcmlnaW46cltrdF0sRjp2b2lkIDB9KX1yZXR1cm57c3Bhbl9pZDplLHRyYWNlX2lkOm59fWNhdGNoKHQpe3JldHVybnt9fX1mdW5jdGlvbiBJdCh0KXtpZih0JiZ0LmNvZGUhPT1DdClyZXR1cm4gdC5jb2RlPT09RHQ/Im9rIjp0Lm1lc3NhZ2V8fCJ1bmtub3duX2Vycm9yIn1jb25zdCBQdD0iX3NlbnRyeVJvb3RTcGFuIjtmdW5jdGlvbiBVdCh0KXtyZXR1cm4gdFtQdF18fHR9Y29uc3QgTXQ9InByb2R1Y3Rpb24iLEx0PSJfZnJvemVuRHNjIjtmdW5jdGlvbiBCdCh0KXtjb25zdCBlPSR0KCk7aWYoIWUpcmV0dXJue307Y29uc3Qgbj1mdW5jdGlvbih0LGUpe2NvbnN0IG49ZS5nZXRPcHRpb25zKCkse3B1YmxpY0tleTpyfT1lLmdldERzbigpfHx7fSxvPU8oe2Vudmlyb25tZW50Om4uZW52aXJvbm1lbnR8fE10LHJlbGVhc2U6bi5yZWxlYXNlLHB1YmxpY19rZXk6cix0cmFjZV9pZDp0fSk7cmV0dXJuIGUuZW1pdCgiY3JlYXRlRHNjIixvKSxvfShBdCh0KS50cmFjZV9pZHx8IiIsZSkscj1VdCh0KTtpZighcilyZXR1cm4gbjtjb25zdCBvPXJbTHRdO2lmKG8pcmV0dXJuIG87Y29uc3Qgcz1BdChyKSxpPXMuZGF0YXx8e30sYz1pW3h0XTtudWxsIT1jJiYobi5zYW1wbGVfcmF0ZT1gJHtjfWApO2NvbnN0IHU9aVtFdF07cmV0dXJuIHUmJiJ1cmwiIT09dSYmKG4udHJhbnNhY3Rpb249cy5kZXNjcmlwdGlvbiksbi5zYW1wbGVkPVN0cmluZyhmdW5jdGlvbih0KXtjb25zdHt0cmFjZUZsYWdzOmV9PXQuc3BhbkNvbnRleHQoKTtyZXR1cm4gZT09PVR0fShyKSksZS5lbWl0KCJjcmVhdGVEc2MiLG4pLG59ZnVuY3Rpb24gR3QodCxlLG4scil7Y29uc3Qgbz1ydChuKSxzPXQudHlwZSYmInJlcGxheV9ldmVudCIhPT10LnR5cGU/dC50eXBlOiJldmVudCI7IWZ1bmN0aW9uKHQsZSl7ZSYmKHQuc2RrPXQuc2RrfHx7fSx0LnNkay5uYW1lPXQuc2RrLm5hbWV8fGUubmFtZSx0LnNkay52ZXJzaW9uPXQuc2RrLnZlcnNpb258fGUudmVyc2lvbix0LnNkay5pbnRlZ3JhdGlvbnM9Wy4uLnQuc2RrLmludGVncmF0aW9uc3x8W10sLi4uZS5pbnRlZ3JhdGlvbnN8fFtdXSx0LnNkay5wYWNrYWdlcz1bLi4udC5zZGsucGFja2FnZXN8fFtdLC4uLmUucGFja2FnZXN8fFtdXSl9KHQsbiYmbi5zZGspO2NvbnN0IGk9ZnVuY3Rpb24odCxlLG4scil7Y29uc3Qgbz10LnNka1Byb2Nlc3NpbmdNZXRhZGF0YSYmdC5zZGtQcm9jZXNzaW5nTWV0YWRhdGEuZHluYW1pY1NhbXBsaW5nQ29udGV4dDtyZXR1cm57ZXZlbnRfaWQ6dC5ldmVudF9pZCxzZW50X2F0OihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKSwuLi5lJiZ7c2RrOmV9LC4uLiEhbiYmciYme2RzbjpOKHIpfSwuLi5vJiZ7dHJhY2U6Tyh7Li4ub30pfX19KHQsbyxyLGUpO2RlbGV0ZSB0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YTtyZXR1cm4gWihpLFtbe3R5cGU6c30sdF1dKX1jb25zdCBKdD0iX19TRU5UUllfU1VQUFJFU1NfVFJBQ0lOR19fIjtmdW5jdGlvbiB6dCh0KXtjb25zdCBlPVN0KGN0KCkpO3JldHVybiBlLnN1cHByZXNzVHJhY2luZz9lLnN1cHByZXNzVHJhY2luZyh0KTpmdW5jdGlvbiguLi50KXtjb25zdCBlPVN0KGN0KCkpO2lmKDI9PT10Lmxlbmd0aCl7Y29uc3RbbixyXT10O3JldHVybiBuP2Uud2l0aFNldFNjb3BlKG4scik6ZS53aXRoU2NvcGUocil9cmV0dXJuIGUud2l0aFNjb3BlKHRbMF0pfSgoZT0+KGUuc2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHtbSnRdOiEwfSksdCgpKSkpfWZ1bmN0aW9uIEh0KHQsZSl7Y29uc3R7ZmluZ2VycHJpbnQ6bixzcGFuOnIsYnJlYWRjcnVtYnM6byxzZGtQcm9jZXNzaW5nTWV0YWRhdGE6c309ZTshZnVuY3Rpb24odCxlKXtjb25zdHtleHRyYTpuLHRhZ3M6cix1c2VyOm8sY29udGV4dHM6cyxsZXZlbDppLHRyYW5zYWN0aW9uTmFtZTpjfT1lLHU9TyhuKTt1JiZPYmplY3Qua2V5cyh1KS5sZW5ndGgmJih0LmV4dHJhPXsuLi51LC4uLnQuZXh0cmF9KTtjb25zdCBhPU8ocik7YSYmT2JqZWN0LmtleXMoYSkubGVuZ3RoJiYodC50YWdzPXsuLi5hLC4uLnQudGFnc30pO2NvbnN0IGY9TyhvKTtmJiZPYmplY3Qua2V5cyhmKS5sZW5ndGgmJih0LnVzZXI9ey4uLmYsLi4udC51c2VyfSk7Y29uc3QgaD1PKHMpO2gmJk9iamVjdC5rZXlzKGgpLmxlbmd0aCYmKHQuY29udGV4dHM9ey4uLmgsLi4udC5jb250ZXh0c30pO2kmJih0LmxldmVsPWkpO2MmJiJ0cmFuc2FjdGlvbiIhPT10LnR5cGUmJih0LnRyYW5zYWN0aW9uPWMpfSh0LGUpLHImJmZ1bmN0aW9uKHQsZSl7dC5jb250ZXh0cz17dHJhY2U6T3QoZSksLi4udC5jb250ZXh0c30sdC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE9e2R5bmFtaWNTYW1wbGluZ0NvbnRleHQ6QnQoZSksLi4udC5zZGtQcm9jZXNzaW5nTWV0YWRhdGF9O2NvbnN0IG49VXQoZSkscj1BdChuKS5kZXNjcmlwdGlvbjtyJiYhdC50cmFuc2FjdGlvbiYmInRyYW5zYWN0aW9uIj09PXQudHlwZSYmKHQudHJhbnNhY3Rpb249cil9KHQsciksZnVuY3Rpb24odCxlKXt0LmZpbmdlcnByaW50PXQuZmluZ2VycHJpbnQ/ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19KHQuZmluZ2VycHJpbnQpOltdLGUmJih0LmZpbmdlcnByaW50PXQuZmluZ2VycHJpbnQuY29uY2F0KGUpKTt0LmZpbmdlcnByaW50JiYhdC5maW5nZXJwcmludC5sZW5ndGgmJmRlbGV0ZSB0LmZpbmdlcnByaW50fSh0LG4pLGZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1bLi4udC5icmVhZGNydW1ic3x8W10sLi4uZV07dC5icmVhZGNydW1icz1uLmxlbmd0aD9uOnZvaWQgMH0odCxvKSxmdW5jdGlvbih0LGUpe3Quc2RrUHJvY2Vzc2luZ01ldGFkYXRhPXsuLi50LnNka1Byb2Nlc3NpbmdNZXRhZGF0YSwuLi5lfX0odCxzKX1jb25zdCBXdD0iNyI7ZnVuY3Rpb24gWXQodCxlKXtyZXR1cm4gbj17c2VudHJ5X2tleTp0LnB1YmxpY0tleSxzZW50cnlfdmVyc2lvbjpXdCwuLi5lJiZ7c2VudHJ5X2NsaWVudDpgJHtlLm5hbWV9LyR7ZS52ZXJzaW9ufWB9fSxPYmplY3Qua2V5cyhuKS5tYXAoKHQ9PmAke2VuY29kZVVSSUNvbXBvbmVudCh0KX09JHtlbmNvZGVVUklDb21wb25lbnQoblt0XSl9YCkpLmpvaW4oIiYiKTt2YXIgbn1jb25zdCBxdD02NDtmdW5jdGlvbiBGdCh0LGUsbj1LKHQuYnVmZmVyU2l6ZXx8cXQpKXtsZXQgcj17fTtyZXR1cm57c2VuZDpmdW5jdGlvbihvKXtjb25zdCBzPVtdO2lmKFEobywoKGUsbik9Pntjb25zdCBvPW50KG4pO2lmKGZ1bmN0aW9uKHQsZSxuPURhdGUubm93KCkpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0W2VdfHx0LmFsbHx8MH0odCxlKT5ufShyLG8pKXtjb25zdCByPUt0KGUsbik7dC5yZWNvcmREcm9wcGVkRXZlbnQoInJhdGVsaW1pdF9iYWNrb2ZmIixvLHIpfWVsc2Ugcy5wdXNoKGUpfSkpLDA9PT1zLmxlbmd0aClyZXR1cm4gcSh7fSk7Y29uc3QgaT1aKG9bMF0scyksYz1lPT57UShpLCgobixyKT0+e2NvbnN0IG89S3QobixyKTt0LnJlY29yZERyb3BwZWRFdmVudChlLG50KHIpLG8pfSkpfTtyZXR1cm4gbi5hZGQoKCgpPT5lKHtib2R5OnR0KGkpfSkudGhlbigodD0+KHZvaWQgMCE9PXQuc3RhdHVzQ29kZSYmKHQuc3RhdHVzQ29kZTwyMDB8fHQuc3RhdHVzQ29kZT49MzAwKSYmaXQmJngud2FybihgU2VudHJ5IHJlc3BvbmRlZCB3aXRoIHN0YXR1cyBjb2RlICR7dC5zdGF0dXNDb2RlfSB0byBzZW50IGV2ZW50LmApLHI9c3Qocix0KSx0KSksKHQ9Pnt0aHJvdyBjKCJuZXR3b3JrX2Vycm9yIiksdH0pKSkpLnRoZW4oKHQ9PnQpLCh0PT57aWYodCBpbnN0YW5jZW9mIGspcmV0dXJuIGl0JiZ4LmVycm9yKCJTa2lwcGVkIHNlbmRpbmcgZXZlbnQgYmVjYXVzZSBidWZmZXIgaXMgZnVsbC4iKSxjKCJxdWV1ZV9vdmVyZmxvdyIpLHEoe30pO3Rocm93IHR9KSl9LGZsdXNoOnQ9Pm4uZHJhaW4odCl9fWZ1bmN0aW9uIEt0KHQsZSl7aWYoImV2ZW50Ij09PWV8fCJ0cmFuc2FjdGlvbiI9PT1lKXJldHVybiBBcnJheS5pc0FycmF5KHQpP3RbMV06dm9pZCAwfWNvbnN0IFZ0PVN5bWJvbCgiQWdlbnRCYXNlSW50ZXJuYWxTdGF0ZSIpO2NsYXNzIFp0IGV4dGVuZHMgcy5BZ2VudHtbVnRdO29wdGlvbnM7a2VlcEFsaXZlO2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXNbVnRdPXt9fWlzU2VjdXJlRW5kcG9pbnQodCl7aWYodCl7aWYoImJvb2xlYW4iPT10eXBlb2YgdC5zZWN1cmVFbmRwb2ludClyZXR1cm4gdC5zZWN1cmVFbmRwb2ludDtpZigic3RyaW5nIj09dHlwZW9mIHQucHJvdG9jb2wpcmV0dXJuImh0dHBzOiI9PT10LnByb3RvY29sfWNvbnN0e3N0YWNrOmV9PW5ldyBFcnJvcjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJmUuc3BsaXQoIlxuIikuc29tZSgodD0+LTEhPT10LmluZGV4T2YoIihodHRwcy5qczoiKXx8LTEhPT10LmluZGV4T2YoIm5vZGU6aHR0cHM6IikpKX1jcmVhdGVTb2NrZXQodCxlLG4pe2NvbnN0IHI9ey4uLmUsc2VjdXJlRW5kcG9pbnQ6dGhpcy5pc1NlY3VyZUVuZHBvaW50KGUpfTtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+dGhpcy5jb25uZWN0KHQscikpKS50aGVuKChvPT57aWYobyBpbnN0YW5jZW9mIHMuQWdlbnQpcmV0dXJuIG8uYWRkUmVxdWVzdCh0LHIpO3RoaXNbVnRdLmN1cnJlbnRTb2NrZXQ9byxzdXBlci5jcmVhdGVTb2NrZXQodCxlLG4pfSksbil9Y3JlYXRlQ29ubmVjdGlvbigpe2NvbnN0IHQ9dGhpc1tWdF0uY3VycmVudFNvY2tldDtpZih0aGlzW1Z0XS5jdXJyZW50U29ja2V0PXZvaWQgMCwhdCl0aHJvdyBuZXcgRXJyb3IoIk5vIHNvY2tldCB3YXMgcmV0dXJuZWQgaW4gdGhlIGBjb25uZWN0KClgIGZ1bmN0aW9uIik7cmV0dXJuIHR9Z2V0IGRlZmF1bHRQb3J0KCl7cmV0dXJuIHRoaXNbVnRdLmRlZmF1bHRQb3J0Pz8oImh0dHBzOiI9PT10aGlzLnByb3RvY29sPzQ0Mzo4MCl9c2V0IGRlZmF1bHRQb3J0KHQpe3RoaXNbVnRdJiYodGhpc1tWdF0uZGVmYXVsdFBvcnQ9dCl9Z2V0IHByb3RvY29sKCl7cmV0dXJuIHRoaXNbVnRdLnByb3RvY29sPz8odGhpcy5pc1NlY3VyZUVuZHBvaW50KCk/Imh0dHBzOiI6Imh0dHA6Iil9c2V0IHByb3RvY29sKHQpe3RoaXNbVnRdJiYodGhpc1tWdF0ucHJvdG9jb2w9dCl9fWZ1bmN0aW9uIFF0KC4uLnQpe3gubG9nKCJbaHR0cHMtcHJveHktYWdlbnQ6cGFyc2UtcHJveHktcmVzcG9uc2VdIiwuLi50KX1mdW5jdGlvbiBYdCh0KXtyZXR1cm4gbmV3IFByb21pc2UoKChlLG4pPT57bGV0IHI9MDtjb25zdCBvPVtdO2Z1bmN0aW9uIHMoKXtjb25zdCBjPXQucmVhZCgpO2M/ZnVuY3Rpb24oYyl7by5wdXNoKGMpLHIrPWMubGVuZ3RoO2NvbnN0IHU9QnVmZmVyLmNvbmNhdChvLHIpLGE9dS5pbmRleE9mKCJcclxuXHJcbiIpO2lmKC0xPT09YSlyZXR1cm4gUXQoImhhdmUgbm90IHJlY2VpdmVkIGVuZCBvZiBIVFRQIGhlYWRlcnMgeWV0Li4uIiksdm9pZCBzKCk7Y29uc3QgZj11LnNsaWNlKDAsYSkudG9TdHJpbmcoImFzY2lpIikuc3BsaXQoIlxyXG4iKSxoPWYuc2hpZnQoKTtpZighaClyZXR1cm4gdC5kZXN0cm95KCksbihuZXcgRXJyb3IoIk5vIGhlYWRlciByZWNlaXZlZCBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2UiKSk7Y29uc3QgcD1oLnNwbGl0KCIgIiksbD0rcFsxXSxkPXAuc2xpY2UoMikuam9pbigiICIpLG09e307Zm9yKGNvbnN0IGUgb2YgZil7aWYoIWUpY29udGludWU7Y29uc3Qgcj1lLmluZGV4T2YoIjoiKTtpZigtMT09PXIpcmV0dXJuIHQuZGVzdHJveSgpLG4obmV3IEVycm9yKGBJbnZhbGlkIGhlYWRlciBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2U6ICIke2V9ImApKTtjb25zdCBvPWUuc2xpY2UoMCxyKS50b0xvd2VyQ2FzZSgpLHM9ZS5zbGljZShyKzEpLnRyaW1TdGFydCgpLGk9bVtvXTsic3RyaW5nIj09dHlwZW9mIGk/bVtvXT1baSxzXTpBcnJheS5pc0FycmF5KGkpP2kucHVzaChzKTptW29dPXN9UXQoImdvdCBwcm94eSBzZXJ2ZXIgcmVzcG9uc2U6ICVvICVvIixoLG0pLGkoKSxlKHtjb25uZWN0OntzdGF0dXNDb2RlOmwsc3RhdHVzVGV4dDpkLGhlYWRlcnM6bX0sYnVmZmVyZWQ6dX0pfShjKTp0Lm9uY2UoInJlYWRhYmxlIixzKX1mdW5jdGlvbiBpKCl7dC5yZW1vdmVMaXN0ZW5lcigiZW5kIixjKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsdSksdC5yZW1vdmVMaXN0ZW5lcigicmVhZGFibGUiLHMpfWZ1bmN0aW9uIGMoKXtpKCksUXQoIm9uZW5kIiksbihuZXcgRXJyb3IoIlByb3h5IGNvbm5lY3Rpb24gZW5kZWQgYmVmb3JlIHJlY2VpdmluZyBDT05ORUNUIHJlc3BvbnNlIikpfWZ1bmN0aW9uIHUodCl7aSgpLFF0KCJvbmVycm9yICVvIix0KSxuKHQpfXQub24oImVycm9yIix1KSx0Lm9uKCJlbmQiLGMpLHMoKX0pKX1mdW5jdGlvbiB0ZSguLi50KXt4LmxvZygiW2h0dHBzLXByb3h5LWFnZW50XSIsLi4udCl9Y2xhc3MgZWUgZXh0ZW5kcyBadHtzdGF0aWMgcHJvdG9jb2xzPVsiaHR0cCIsImh0dHBzIl07cHJveHk7cHJveHlIZWFkZXJzO2Nvbm5lY3RPcHRzO2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoZSksdGhpcy5vcHRpb25zPXt9LHRoaXMucHJveHk9InN0cmluZyI9PXR5cGVvZiB0P25ldyBVUkwodCk6dCx0aGlzLnByb3h5SGVhZGVycz1lPy5oZWFkZXJzPz97fSx0ZSgiQ3JlYXRpbmcgbmV3IEh0dHBzUHJveHlBZ2VudCBpbnN0YW5jZTogJW8iLHRoaXMucHJveHkuaHJlZik7Y29uc3Qgbj0odGhpcy5wcm94eS5ob3N0bmFtZXx8dGhpcy5wcm94eS5ob3N0KS5yZXBsYWNlKC9eXFt8XF0kL2csIiIpLHI9dGhpcy5wcm94eS5wb3J0P3BhcnNlSW50KHRoaXMucHJveHkucG9ydCwxMCk6Imh0dHBzOiI9PT10aGlzLnByb3h5LnByb3RvY29sPzQ0Mzo4MDt0aGlzLmNvbm5lY3RPcHRzPXtBTFBOUHJvdG9jb2xzOlsiaHR0cC8xLjEiXSwuLi5lP3JlKGUsImhlYWRlcnMiKTpudWxsLGhvc3Q6bixwb3J0OnJ9fWFzeW5jIGNvbm5lY3QodCxlKXtjb25zdHtwcm94eTpufT10aGlzO2lmKCFlLmhvc3QpdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gImhvc3QiIHByb3ZpZGVkJyk7bGV0IHI7aWYoImh0dHBzOiI9PT1uLnByb3RvY29sKXt0ZSgiQ3JlYXRpbmcgYHRscy5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cyk7Y29uc3QgdD10aGlzLmNvbm5lY3RPcHRzLnNlcnZlcm5hbWV8fHRoaXMuY29ubmVjdE9wdHMuaG9zdDtyPWYuY29ubmVjdCh7Li4udGhpcy5jb25uZWN0T3B0cyxzZXJ2ZXJuYW1lOnQmJmEuaXNJUCh0KT92b2lkIDA6dH0pfWVsc2UgdGUoIkNyZWF0aW5nIGBuZXQuU29ja2V0YDogJW8iLHRoaXMuY29ubmVjdE9wdHMpLHI9YS5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO2NvbnN0IG89ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucHJveHlIZWFkZXJzP3RoaXMucHJveHlIZWFkZXJzKCk6ey4uLnRoaXMucHJveHlIZWFkZXJzfSxzPWEuaXNJUHY2KGUuaG9zdCk/YFske2UuaG9zdH1dYDplLmhvc3Q7bGV0IGk9YENPTk5FQ1QgJHtzfToke2UucG9ydH0gSFRUUC8xLjFcclxuYDtpZihuLnVzZXJuYW1lfHxuLnBhc3N3b3JkKXtjb25zdCB0PWAke2RlY29kZVVSSUNvbXBvbmVudChuLnVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQobi5wYXNzd29yZCl9YDtvWyJQcm94eS1BdXRob3JpemF0aW9uIl09YEJhc2ljICR7QnVmZmVyLmZyb20odCkudG9TdHJpbmcoImJhc2U2NCIpfWB9by5Ib3N0PWAke3N9OiR7ZS5wb3J0fWAsb1siUHJveHktQ29ubmVjdGlvbiJdfHwob1siUHJveHktQ29ubmVjdGlvbiJdPXRoaXMua2VlcEFsaXZlPyJLZWVwLUFsaXZlIjoiY2xvc2UiKTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhvKSlpKz1gJHt0fTogJHtvW3RdfVxyXG5gO2NvbnN0IGM9WHQocik7ci53cml0ZShgJHtpfVxyXG5gKTtjb25zdHtjb25uZWN0OnUsYnVmZmVyZWQ6aH09YXdhaXQgYztpZih0LmVtaXQoInByb3h5Q29ubmVjdCIsdSksdGhpcy5lbWl0KCJwcm94eUNvbm5lY3QiLHUsdCksMjAwPT09dS5zdGF0dXNDb2RlKXtpZih0Lm9uY2UoInNvY2tldCIsbmUpLGUuc2VjdXJlRW5kcG9pbnQpe3RlKCJVcGdyYWRpbmcgc29ja2V0IGNvbm5lY3Rpb24gdG8gVExTIik7Y29uc3QgdD1lLnNlcnZlcm5hbWV8fGUuaG9zdDtyZXR1cm4gZi5jb25uZWN0KHsuLi5yZShlLCJob3N0IiwicGF0aCIsInBvcnQiKSxzb2NrZXQ6cixzZXJ2ZXJuYW1lOmEuaXNJUCh0KT92b2lkIDA6dH0pfXJldHVybiByfXIuZGVzdHJveSgpO2NvbnN0IHA9bmV3IGEuU29ja2V0KHt3cml0YWJsZTohMX0pO3JldHVybiBwLnJlYWRhYmxlPSEwLHQub25jZSgic29ja2V0IiwodD0+e3RlKCJSZXBsYXlpbmcgcHJveHkgYnVmZmVyIGZvciBmYWlsZWQgcmVxdWVzdCIpLHQucHVzaChoKSx0LnB1c2gobnVsbCl9KSkscH19ZnVuY3Rpb24gbmUodCl7dC5yZXN1bWUoKX1mdW5jdGlvbiByZSh0LC4uLmUpe2NvbnN0IG49e307bGV0IHI7Zm9yKHIgaW4gdCllLmluY2x1ZGVzKHIpfHwobltyXT10W3JdKTtyZXR1cm4gbn1jb25zdCBvZT0zMjc2ODtmdW5jdGlvbiBzZSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9eW0EtWl06LywiIikucmVwbGFjZSgvXFwvZywiLyIpfWNvbnN0IGllPWU7bGV0IGNlLHVlPSExO2Z1bmN0aW9uIGFlKHQpe2llLmRlYnVnJiZjb25zb2xlLmxvZyhgW0FOUiBXb3JrZXJdICR7dH1gKX12YXIgZmUsaGUscGU7Y29uc3QgbGU9ZnVuY3Rpb24odCl7bGV0IGU7dHJ5e2U9bmV3IFVSTCh0LnVybCl9Y2F0Y2goZSl7cmV0dXJuIEUoKCgpPT57Y29uc29sZS53YXJuKCJbQHNlbnRyeS9ub2RlXTogSW52YWxpZCBkc24gb3IgdHVubmVsIG9wdGlvbiwgd2lsbCBub3Qgc2VuZCBhbnkgZXZlbnRzLiBUaGUgdHVubmVsIG9wdGlvbiBtdXN0IGJlIGEgZnVsbCBVUkwgd2hlbiB1c2VkLiIpfSkpLEZ0KHQsKCgpPT5Qcm9taXNlLnJlc29sdmUoe30pKSl9Y29uc3Qgbj0iaHR0cHM6Ij09PWUucHJvdG9jb2wscj1mdW5jdGlvbih0LGUpe2NvbnN0e25vX3Byb3h5Om59PXByb2Nlc3MuZW52O3JldHVybiBuJiZuLnNwbGl0KCIsIikuc29tZSgoZT0+dC5ob3N0LmVuZHNXaXRoKGUpfHx0Lmhvc3RuYW1lLmVuZHNXaXRoKGUpKSk/dm9pZCAwOmV9KGUsdC5wcm94eXx8KG4/cHJvY2Vzcy5lbnYuaHR0cHNfcHJveHk6dm9pZCAwKXx8cHJvY2Vzcy5lbnYuaHR0cF9wcm94eSksbz1uP2k6cyxhPXZvaWQgMCE9PXQua2VlcEFsaXZlJiZ0LmtlZXBBbGl2ZSxmPXI/bmV3IGVlKHIpOm5ldyBvLkFnZW50KHtrZWVwQWxpdmU6YSxtYXhTb2NrZXRzOjMwLHRpbWVvdXQ6MmUzfSk7cmV0dXJuIHp0KCgoKT0+e2NvbnN0IGU9ZnVuY3Rpb24odCxlLG4pe2NvbnN0e2hvc3RuYW1lOnIscGF0aG5hbWU6byxwb3J0OnMscHJvdG9jb2w6aSxzZWFyY2g6YX09bmV3IFVSTCh0LnVybCk7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBuZXcgUHJvbWlzZSgoKGgscCk9PntsZXQgbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGMoe3JlYWQoKXt0aGlzLnB1c2godCksdGhpcy5wdXNoKG51bGwpfX0pfShmLmJvZHkpO2NvbnN0IGQ9ey4uLnQuaGVhZGVyc307Zi5ib2R5Lmxlbmd0aD5vZSYmKGRbImNvbnRlbnQtZW5jb2RpbmciXT0iZ3ppcCIsbD1sLnBpcGUodSgpKSk7Y29uc3QgbT1lLnJlcXVlc3Qoe21ldGhvZDoiUE9TVCIsYWdlbnQ6bixoZWFkZXJzOmQsaG9zdG5hbWU6cixwYXRoOmAke299JHthfWAscG9ydDpzLHByb3RvY29sOmksY2E6dC5jYUNlcnRzfSwodD0+e3Qub24oImRhdGEiLCgoKT0+e30pKSx0Lm9uKCJlbmQiLCgoKT0+e30pKSx0LnNldEVuY29kaW5nKCJ1dGY4Iik7Y29uc3QgZT10LmhlYWRlcnNbInJldHJ5LWFmdGVyIl0/P251bGwsbj10LmhlYWRlcnNbIngtc2VudHJ5LXJhdGUtbGltaXRzIl0/P251bGw7aCh7c3RhdHVzQ29kZTp0LnN0YXR1c0NvZGUsaGVhZGVyczp7InJldHJ5LWFmdGVyIjplLCJ4LXNlbnRyeS1yYXRlLWxpbWl0cyI6QXJyYXkuaXNBcnJheShuKT9uWzBdOm59fSl9KSk7bS5vbigiZXJyb3IiLHApLGwucGlwZShtKX0pKX19KHQsdC5odHRwTW9kdWxlPz9vLGYpO3JldHVybiBGdCh0LGUpfSkpfSh7dXJsOihmZT1pZS5kc24saGU9aWUudHVubmVsLHBlPWllLnNka01ldGFkYXRhLnNkayxoZXx8YCR7ZnVuY3Rpb24odCl7cmV0dXJuYCR7ZnVuY3Rpb24odCl7Y29uc3QgZT10LnByb3RvY29sP2Ake3QucHJvdG9jb2x9OmA6IiIsbj10LnBvcnQ/YDoke3QucG9ydH1gOiIiO3JldHVybmAke2V9Ly8ke3QuaG9zdH0ke259JHt0LnBhdGg/YC8ke3QucGF0aH1gOiIifS9hcGkvYH0odCl9JHt0LnByb2plY3RJZH0vZW52ZWxvcGUvYH0oZmUpfT8ke1l0KGZlLHBlKX1gKSxyZWNvcmREcm9wcGVkRXZlbnQ6KCk9Pnt9fSk7YXN5bmMgZnVuY3Rpb24gZGUoKXtpZihjZSl7YWUoIlNlbmRpbmcgYWJub3JtYWwgc2Vzc2lvbiIpLGZ0KGNlLHtzdGF0dXM6ImFibm9ybWFsIixhYm5vcm1hbF9tZWNoYW5pc206ImFucl9mb3JlZ3JvdW5kIn0pO2NvbnN0IGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3Qgbz1ydChuKTtyZXR1cm4gWih7c2VudF9hdDoobmV3IERhdGUpLnRvSVNPU3RyaW5nKCksLi4ubyYme3NkazpvfSwuLi4hIXImJmUmJntkc246TihlKX19LFsiYWdncmVnYXRlcyJpbiB0P1t7dHlwZToic2Vzc2lvbnMifSx0XTpbe3R5cGU6InNlc3Npb24ifSx0LnRvSlNPTigpXV0pfShjZSxpZS5kc24saWUuc2RrTWV0YWRhdGEsaWUudHVubmVsKTthZShKU09OLnN0cmluZ2lmeShlKSksYXdhaXQgbGUuc2VuZChlKTt0cnl7dD8ucG9zdE1lc3NhZ2UoInNlc3Npb24tZW5kZWQiKX1jYXRjaCh0KXt9fX1mdW5jdGlvbiBtZSh0KXtpZighdClyZXR1cm47Y29uc3QgZT1mdW5jdGlvbih0KXtpZighdC5sZW5ndGgpcmV0dXJuW107Y29uc3QgZT1BcnJheS5mcm9tKHQpO3JldHVybi9zZW50cnlXcmFwcGVkLy50ZXN0KGVbZS5sZW5ndGgtMV0uZnVuY3Rpb258fCIiKSYmZS5wb3AoKSxlLnJldmVyc2UoKSxJLnRlc3QoZVtlLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiYoZS5wb3AoKSxJLnRlc3QoZVtlLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiZlLnBvcCgpKSxlLnNsaWNlKDAsUikubWFwKCh0PT4oey4uLnQsZmlsZW5hbWU6dC5maWxlbmFtZXx8ZVtlLmxlbmd0aC0xXS5maWxlbmFtZSxmdW5jdGlvbjp0LmZ1bmN0aW9ufHxBfSkpKX0odCk7aWYoaWUuYXBwUm9vdFBhdGgpZm9yKGNvbnN0IHQgb2YgZSl0LmZpbGVuYW1lJiYodC5maWxlbmFtZT16KHQuZmlsZW5hbWUsaWUuYXBwUm9vdFBhdGgpKTtyZXR1cm4gZX1hc3luYyBmdW5jdGlvbiBnZSh0LGUpe2lmKHVlKXJldHVybjt1ZT0hMCxhd2FpdCBkZSgpLGFlKCJTZW5kaW5nIGV2ZW50Iik7Y29uc3Qgbj17ZXZlbnRfaWQ6QigpLGNvbnRleHRzOmllLmNvbnRleHRzLHJlbGVhc2U6aWUucmVsZWFzZSxlbnZpcm9ubWVudDppZS5lbnZpcm9ubWVudCxkaXN0OmllLmRpc3QscGxhdGZvcm06Im5vZGUiLGxldmVsOiJlcnJvciIsZXhjZXB0aW9uOnt2YWx1ZXM6W3t0eXBlOiJBcHBsaWNhdGlvbk5vdFJlc3BvbmRpbmciLHZhbHVlOmBBcHBsaWNhdGlvbiBOb3QgUmVzcG9uZGluZyBmb3IgYXQgbGVhc3QgJHtpZS5hbnJUaHJlc2hvbGR9IG1zYCxzdGFja3RyYWNlOntmcmFtZXM6bWUodCl9LG1lY2hhbmlzbTp7dHlwZToiQU5SIn19XX0sdGFnczppZS5zdGF0aWNUYWdzfTtlJiZmdW5jdGlvbih0LGUpe2lmKEh0KHQsZSksIXQuY29udGV4dHM/LnRyYWNlKXtjb25zdHt0cmFjZUlkOm4sc3BhbklkOnIscGFyZW50U3BhbklkOm99PWUucHJvcGFnYXRpb25Db250ZXh0O3QuY29udGV4dHM9e3RyYWNlOnt0cmFjZV9pZDpuLHNwYW5faWQ6cixwYXJlbnRfc3Bhbl9pZDpvfSwuLi50LmNvbnRleHRzfX19KG4sZSk7Y29uc3Qgcj1HdChuLGllLmRzbixpZS5zZGtNZXRhZGF0YSxpZS50dW5uZWwpO2FlKEpTT04uc3RyaW5naWZ5KHIpKSxhd2FpdCBsZS5zZW5kKHIpLGF3YWl0IGxlLmZsdXNoKDJlMyksc2V0VGltZW91dCgoKCk9Pntwcm9jZXNzLmV4aXQoMCl9KSw1ZTMpfWxldCB5ZTtpZihhZSgiU3RhcnRlZCIpLGllLmNhcHR1cmVTdGFja1RyYWNlKXthZSgiQ29ubmVjdGluZyB0byBkZWJ1Z2dlciIpO2NvbnN0IHQ9bmV3IG47dC5jb25uZWN0VG9NYWluVGhyZWFkKCksYWUoIkNvbm5lY3RlZCB0byBkZWJ1Z2dlciIpO2NvbnN0IGU9bmV3IE1hcDt0Lm9uKCJEZWJ1Z2dlci5zY3JpcHRQYXJzZWQiLCh0PT57ZS5zZXQodC5wYXJhbXMuc2NyaXB0SWQsdC5wYXJhbXMudXJsKX0pKSx0Lm9uKCJEZWJ1Z2dlci5wYXVzZWQiLChuPT57aWYoIm90aGVyIj09PW4ucGFyYW1zLnJlYXNvbil0cnl7YWUoIkRlYnVnZ2VyIHBhdXNlZCIpO2NvbnN0IHM9Wy4uLm4ucGFyYW1zLmNhbGxGcmFtZXNdLGk9aWUuYXBwUm9vdFBhdGg/ZnVuY3Rpb24odD0ocHJvY2Vzcy5hcmd2WzFdP1cocHJvY2Vzcy5hcmd2WzFdKTpwcm9jZXNzLmN3ZCgpKSxlPSJcXCI9PT1vKXtjb25zdCBuPWU/c2UodCk6dDtyZXR1cm4gdD0+e2lmKCF0KXJldHVybjtjb25zdCBvPWU/c2UodCk6dDtsZXR7ZGlyOnMsYmFzZTppLGV4dDpjfT1yLnBhcnNlKG8pOyIuanMiIT09YyYmIi5tanMiIT09YyYmIi5janMiIT09Y3x8KGk9aS5zbGljZSgwLC0xKmMubGVuZ3RoKSksc3x8KHM9Ii4iKTtjb25zdCB1PXMubGFzdEluZGV4T2YoIi9ub2RlX21vZHVsZXMiKTtpZih1Pi0xKXJldHVybmAke3Muc2xpY2UodSsxNCkucmVwbGFjZSgvXC8vZywiLiIpfToke2l9YDtpZihzLnN0YXJ0c1dpdGgobikpe2xldCB0PXMuc2xpY2Uobi5sZW5ndGgrMSkucmVwbGFjZSgvXC8vZywiLiIpO3JldHVybiB0JiYodCs9IjoiKSx0Kz1pLHR9cmV0dXJuIGl9fShpZS5hcHBSb290UGF0aCk6KCk9Pnt9LGM9cy5tYXAoKHQ9PmZ1bmN0aW9uKHQsZSxuKXtjb25zdCByPWU/ZS5yZXBsYWNlKC9eZmlsZTpcL1wvLywiIik6dm9pZCAwLG89dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXI/dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXIrMTp2b2lkIDAscz10LmxvY2F0aW9uLmxpbmVOdW1iZXI/dC5sb2NhdGlvbi5saW5lTnVtYmVyKzE6dm9pZCAwO3JldHVybiBPKHtmaWxlbmFtZTpyLG1vZHVsZTpuKHIpLGZ1bmN0aW9uOnQuZnVuY3Rpb25OYW1lfHxBLGNvbG5vOm8sbGluZW5vOnMsaW5fYXBwOnI/VihyKTp2b2lkIDB9KX0odCxlLmdldCh0LmxvY2F0aW9uLnNjcmlwdElkKSxpKSkpLHU9c2V0VGltZW91dCgoKCk9PntnZShjKS50aGVuKG51bGwsKCgpPT57YWUoIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pKX0pLDVlMyk7dC5wb3N0KCJSdW50aW1lLmV2YWx1YXRlIix7ZXhwcmVzc2lvbjoiZ2xvYmFsLl9fU0VOVFJZX0dFVF9TQ09QRVNfXygpOyIsc2lsZW50OiEwLHJldHVybkJ5VmFsdWU6ITB9LCgoZSxuKT0+e2UmJmFlKGBFcnJvciBleGVjdXRpbmcgc2NyaXB0OiAnJHtlLm1lc3NhZ2V9J2ApLGNsZWFyVGltZW91dCh1KTtjb25zdCByPW4mJm4ucmVzdWx0P24ucmVzdWx0LnZhbHVlOnZvaWQgMDt0LnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLHQucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLGdlKGMscikudGhlbihudWxsLCgoKT0+e2FlKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQuIil9KSl9KSl9Y2F0Y2goZSl7dGhyb3cgdC5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKSx0LnBvc3QoIkRlYnVnZ2VyLmRpc2FibGUiKSxlfX0pKSx5ZT0oKT0+e3RyeXt0LnBvc3QoIkRlYnVnZ2VyLmVuYWJsZSIsKCgpPT57dC5wb3N0KCJEZWJ1Z2dlci5wYXVzZSIpfSkpfWNhdGNoKHQpe319fWNvbnN0e3BvbGw6YmV9PWZ1bmN0aW9uKHQsZSxuLHIpe2NvbnN0IG89dCgpO2xldCBzPSExLGk9ITA7cmV0dXJuIHNldEludGVydmFsKCgoKT0+e2NvbnN0IHQ9by5nZXRUaW1lTXMoKTshMT09PXMmJnQ+ZStuJiYocz0hMCxpJiZyKCkpLHQ8ZStuJiYocz0hMSl9KSwyMCkse3BvbGw6KCk9PntvLnJlc2V0KCl9LGVuYWJsZWQ6dD0+e2k9dH19fSgoZnVuY3Rpb24oKXtsZXQgdD1wcm9jZXNzLmhydGltZSgpO3JldHVybntnZXRUaW1lTXM6KCk9Pntjb25zdFtlLG5dPXByb2Nlc3MuaHJ0aW1lKHQpO3JldHVybiBNYXRoLmZsb29yKDFlMyplK24vMWU2KX0scmVzZXQ6KCk9Pnt0PXByb2Nlc3MuaHJ0aW1lKCl9fX0pLGllLnBvbGxJbnRlcnZhbCxpZS5hbnJUaHJlc2hvbGQsKGZ1bmN0aW9uKCl7YWUoIldhdGNoZG9nIHRpbWVvdXQiKSx5ZT8oYWUoIlBhdXNpbmcgZGVidWdnZXIgdG8gY2FwdHVyZSBzdGFjayB0cmFjZSIpLHllKCkpOihhZSgiQ2FwdHVyaW5nIGV2ZW50IHdpdGhvdXQgYSBzdGFjayB0cmFjZSIpLGdlKCkudGhlbihudWxsLCgoKT0+e2FlKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQgb24gd2F0Y2hkb2cgdGltZW91dC4iKX0pKSl9KSk7dD8ub24oIm1lc3NhZ2UiLCh0PT57dC5zZXNzaW9uJiYoY2U9YXQodC5zZXNzaW9uKSksYmUoKX0pKTs=';

@@ -11,0 +11,0 @@ const DEFAULT_INTERVAL = 50;

@@ -1,2 +0,2 @@

/*! @sentry/node 8.2.1 (bb2f1bc) | https://github.com/getsentry/sentry-javascript */
import{Session as t}from"inspector";import{parentPort as e,workerData as n}from"worker_threads";import{posix as r,sep as o}from"path";import*as s from"node:http";import*as i from"node:https";import{Readable as c}from"stream";import{createGzip as u}from"zlib";import*as a from"net";import*as f from"tls";import*as h from"http";const p=Object.prototype.toString;function l(t,e){return p.call(t)===`[object ${e}]`}function d(t){return l(t,"Object")}function m(t){return Boolean(t&&t.then&&"function"==typeof t.then)}function g(t,e){try{return t instanceof e}catch(t){return!1}}const y=globalThis;function b(t,e,n){const r=n||y,o=r.__SENTRY__=r.__SENTRY__||{};return o[t]||(o[t]=e())}const v=y,_=80;function w(t,e){const n=t,r=[];let o,s,i,c,u;if(!n||!n.tagName)return"";if(v.HTMLElement&&n instanceof HTMLElement&&n.dataset){if(n.dataset.sentryComponent)return n.dataset.sentryComponent;if(n.dataset.sentryElement)return n.dataset.sentryElement}r.push(n.tagName.toLowerCase());const a=e&&e.length?e.filter((t=>n.getAttribute(t))).map((t=>[t,n.getAttribute(t)])):null;if(a&&a.length)a.forEach((t=>{r.push(`[${t[0]}="${t[1]}"]`)}));else if(n.id&&r.push(`#${n.id}`),o=n.className,o&&l(o,"String"))for(s=o.split(/\s+/),u=0;u<s.length;u++)r.push(`.${s[u]}`);const f=["aria-label","type","name","title","alt"];for(u=0;u<f.length;u++)i=f[u],c=n.getAttribute(i),c&&r.push(`[${i}="${c}"]`);return r.join("")}const S="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__,$=["debug","info","warn","error","log","assert","trace"],E={};function x(t){if(!("console"in y))return t();const e=y.console,n={},r=Object.keys(E);r.forEach((t=>{const r=E[t];n[t]=e[t],e[t]=r}));try{return t()}finally{r.forEach((t=>{e[t]=n[t]}))}}const N=function(){let t=!1;const e={enable:()=>{t=!0},disable:()=>{t=!1},isEnabled:()=>t};return S?$.forEach((n=>{e[n]=(...e)=>{t&&x((()=>{y.console[n](`Sentry Logger [${n}]:`,...e)}))}})):$.forEach((t=>{e[t]=()=>{}})),e}();function k(t,e=!1){const{host:n,path:r,pass:o,port:s,projectId:i,protocol:c,publicKey:u}=t;return`${c}://${u}${e&&o?`:${o}`:""}@${n}${s?`:${s}`:""}/${r?`${r}/`:r}${i}`}class C extends Error{constructor(t,e="warn"){super(t),this.message=t,this.name=new.target.prototype.constructor.name,Object.setPrototypeOf(this,new.target.prototype),this.logLevel=e}}function D(t){if(function(t){switch(p.call(t)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return g(t,Error)}}(t))return{message:t.message,name:t.name,stack:t.stack,...O(t)};if(e=t,"undefined"!=typeof Event&&g(e,Event)){const e={type:t.type,target:T(t.target),currentTarget:T(t.currentTarget),...O(t)};return"undefined"!=typeof CustomEvent&&g(t,CustomEvent)&&(e.detail=t.detail),e}return t;var e}function T(t){try{return e=t,"undefined"!=typeof Element&&g(e,Element)?function(t,e={}){if(!t)return"<unknown>";try{let n=t;const r=5,o=[];let s=0,i=0;const c=" > ",u=c.length;let a;const f=Array.isArray(e)?e:e.keyAttrs,h=!Array.isArray(e)&&e.maxStringLength||_;for(;n&&s++<r&&(a=w(n,f),!("html"===a||s>1&&i+o.length*u+a.length>=h));)o.push(a),i+=a.length,n=n.parentNode;return o.reverse().join(c)}catch(t){return"<unknown>"}}(t):Object.prototype.toString.call(t)}catch(t){return"<unknown>"}var e}function O(t){if("object"==typeof t&&null!==t){const e={};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}return{}}function j(t){return R(t,new Map)}function R(t,e){if(function(t){if(!d(t))return!1;try{const e=Object.getPrototypeOf(t).constructor.name;return!e||"Object"===e}catch(t){return!0}}(t)){const n=e.get(t);if(void 0!==n)return n;const r={};e.set(t,r);for(const n of Object.keys(t))void 0!==t[n]&&(r[n]=R(t[n],e));return r}if(Array.isArray(t)){const n=e.get(t);if(void 0!==n)return n;const r=[];return e.set(t,r),t.forEach((t=>{r.push(R(t,e))})),r}return t}const A=50,I="?",P=/captureMessage|captureException/;const U="<anonymous>";const M=1e3;function L(){return Date.now()/M}const B=function(){const{performance:t}=y;if(!t||!t.now)return L;const e=Date.now()-t.now(),n=null==t.timeOrigin?e:t.timeOrigin;return()=>(n+t.now())/M}();function G(){const t=y,e=t.crypto||t.msCrypto;let n=()=>16*Math.random();try{if(e&&e.randomUUID)return e.randomUUID().replace(/-/g,"");e&&e.getRandomValues&&(n=()=>{const t=new Uint8Array(1);return e.getRandomValues(t),t[0]})}catch(t){}return([1e7]+1e3+4e3+8e3+1e11).replace(/[018]/g,(t=>(t^(15&n())>>t/4).toString(16)))}function J(t,e=100,n=1/0){try{return z("",t,e,n)}catch(t){return{ERROR:`**non-serializable** (${t})`}}}function z(t,e,n=1/0,r=1/0,o=function(){const t="function"==typeof WeakSet,e=t?new WeakSet:[];return[function(n){if(t)return!!e.has(n)||(e.add(n),!1);for(let t=0;t<e.length;t++)if(e[t]===n)return!0;return e.push(n),!1},function(n){if(t)e.delete(n);else for(let t=0;t<e.length;t++)if(e[t]===n){e.splice(t,1);break}}]}()){const[s,i]=o;if(null==e||["number","boolean","string"].includes(typeof e)&&!Number.isNaN(e))return e;const c=function(t,e){try{if("domain"===t&&e&&"object"==typeof e&&e.t)return"[Domain]";if("domainEmitter"===t)return"[DomainEmitter]";if("undefined"!=typeof global&&e===global)return"[Global]";if("undefined"!=typeof window&&e===window)return"[Window]";if("undefined"!=typeof document&&e===document)return"[Document]";if("object"==typeof(n=e)&&null!==n&&(n.__isVue||n.o))return"[VueViewModel]";if(function(t){return d(t)&&"nativeEvent"in t&&"preventDefault"in t&&"stopPropagation"in t}(e))return"[SyntheticEvent]";if("number"==typeof e&&e!=e)return"[NaN]";if("function"==typeof e)return`[Function: ${function(t){try{return t&&"function"==typeof t&&t.name||U}catch(t){return U}}(e)}]`;if("symbol"==typeof e)return`[${String(e)}]`;if("bigint"==typeof e)return`[BigInt: ${String(e)}]`;const r=function(t){const e=Object.getPrototypeOf(t);return e?e.constructor.name:"null prototype"}(e);return/^HTML(\w*)Element$/.test(r)?`[HTMLElement: ${r}]`:`[object ${r}]`}catch(t){return`**non-serializable** (${t})`}var n}(t,e);if(!c.startsWith("[object "))return c;if(e.__sentry_skip_normalization__)return e;const u="number"==typeof e.__sentry_override_normalization_depth__?e.__sentry_override_normalization_depth__:n;if(0===u)return c.replace("object ","");if(s(e))return"[Circular ~]";const a=e;if(a&&"function"==typeof a.toJSON)try{return z("",a.toJSON(),u-1,r,o)}catch(t){}const f=Array.isArray(e)?[]:{};let h=0;const p=D(e);for(const t in p){if(!Object.prototype.hasOwnProperty.call(p,t))continue;if(h>=r){f[t]="[MaxProperties ~]";break}const e=p[t];f[t]=z(t,e,u-1,r,o),h++}return i(e),f}function H(t,e){const n=e.replace(/\\/g,"/").replace(/[|\\{}()[\]^$+*?.]/g,"\\$&");let r=t;try{r=decodeURI(t)}catch(t){}return r.replace(/\\/g,"/").replace(/webpack:\/?/g,"").replace(new RegExp(`(file://)?/*${n}/*`,"ig"),"app:///")}(()=>{const{performance:t}=y;if(!t||!t.now)return;const e=36e5,n=t.now(),r=Date.now(),o=t.timeOrigin?Math.abs(t.timeOrigin+n-r):e,s=o<e,i=t.timing&&t.timing.navigationStart,c="number"==typeof i?Math.abs(i+n-r):e;(s||c<e)&&(o<=c&&t.timeOrigin)})();const W=/^(\S+:\\|\/?)([\s\S]*?)((?:\.{1,2}|[^/\\]+?|)(\.[^./\\]*|))(?:[/\\]*)$/;function Y(t){const e=function(t){const e=t.length>1024?`<truncated>${t.slice(-1024)}`:t,n=W.exec(e);return n?n.slice(1):[]}(t),n=e[0];let r=e[1];return n||r?(r&&(r=r.slice(0,r.length-1)),n+r):"."}var q;function F(t){return new K((e=>{e(t)}))}!function(t){t[t.PENDING=0]="PENDING";t[t.RESOLVED=1]="RESOLVED";t[t.REJECTED=2]="REJECTED"}(q||(q={}));class K{constructor(t){K.prototype.__init.call(this),K.prototype.__init2.call(this),K.prototype.__init3.call(this),K.prototype.__init4.call(this),this.i=q.PENDING,this.u=[];try{t(this.h,this.p)}catch(t){this.p(t)}}then(t,e){return new K(((n,r)=>{this.u.push([!1,e=>{if(t)try{n(t(e))}catch(t){r(t)}else n(e)},t=>{if(e)try{n(e(t))}catch(t){r(t)}else r(t)}]),this.l()}))}catch(t){return this.then((t=>t),t)}finally(t){return new K(((e,n)=>{let r,o;return this.then((e=>{o=!1,r=e,t&&t()}),(e=>{o=!0,r=e,t&&t()})).then((()=>{o?n(r):e(r)}))}))}__init(){this.h=t=>{this.m(q.RESOLVED,t)}}__init2(){this.p=t=>{this.m(q.REJECTED,t)}}__init3(){this.m=(t,e)=>{this.i===q.PENDING&&(m(e)?e.then(this.h,this.p):(this.i=t,this.v=e,this.l()))}}__init4(){this.l=()=>{if(this.i===q.PENDING)return;const t=this.u.slice();this.u=[],t.forEach((t=>{t[0]||(this.i===q.RESOLVED&&t[1](this.v),this.i===q.REJECTED&&t[2](this.v),t[0]=!0)}))}}}function V(t){const e=[];function n(t){return e.splice(e.indexOf(t),1)[0]}return{$:e,add:function(r){if(!(void 0===t||e.length<t))return o=new C("Not adding Promise because buffer limit was reached."),new K(((t,e)=>{e(o)}));var o;const s=r();return-1===e.indexOf(s)&&e.push(s),s.then((()=>n(s))).then(null,(()=>n(s).then(null,(()=>{})))),s},drain:function(t){return new K(((n,r)=>{let o=e.length;if(!o)return n(!0);const s=setTimeout((()=>{t&&t>0&&n(!1)}),t);e.forEach((t=>{F(t).then((()=>{--o||(clearTimeout(s),n(!0))}),r)}))}))}}}function Z(t,e=!1){return!(e||t&&!t.startsWith("/")&&!t.match(/^[A-Z]:/)&&!t.startsWith(".")&&!t.match(/^[a-zA-Z]([a-zA-Z0-9.\-+])*:\/\//))&&void 0!==t&&!t.includes("node_modules/")}function Q(t,e=[]){return[t,e]}function X(t,e){const n=t[1];for(const t of n){if(e(t,t[0].type))return!0}return!1}function tt(t){return y.__SENTRY__&&y.__SENTRY__.encodePolyfill?y.__SENTRY__.encodePolyfill(t):(new TextEncoder).encode(t)}function et(t){const[e,n]=t;let r=JSON.stringify(e);function o(t){"string"==typeof r?r="string"==typeof t?r+t:[tt(r),t]:r.push("string"==typeof t?tt(t):t)}for(const t of n){const[e,n]=t;if(o(`\n${JSON.stringify(e)}\n`),"string"==typeof n||n instanceof Uint8Array)o(n);else{let t;try{t=JSON.stringify(n)}catch(e){t=JSON.stringify(J(n))}o(t)}}return"string"==typeof r?r:function(t){const e=t.reduce(((t,e)=>t+e.length),0),n=new Uint8Array(e);let r=0;for(const e of t)n.set(e,r),r+=e.length;return n}(r)}const nt={session:"session",sessions:"session",attachment:"attachment",transaction:"transaction",event:"error",client_report:"internal",user_report:"default",profile:"profile",replay_event:"replay",replay_recording:"replay",check_in:"monitor",feedback:"feedback",span:"span",statsd:"metric_bucket"};function rt(t){return nt[t]}function ot(t){if(!t||!t.sdk)return;const{name:e,version:n}=t.sdk;return{name:e,version:n}}const st=6e4;function it(t,{statusCode:e,headers:n},r=Date.now()){const o={...t},s=n&&n["x-sentry-rate-limits"],i=n&&n["retry-after"];if(s)for(const t of s.trim().split(",")){const[e,n,,,s]=t.split(":",5),i=parseInt(e,10),c=1e3*(isNaN(i)?60:i);if(n)for(const t of n.split(";"))"metric_bucket"===t&&s&&!s.split(";").includes("custom")||(o[t]=r+c);else o.all=r+c}else i?o.all=r+function(t,e=Date.now()){const n=parseInt(`${t}`,10);if(!isNaN(n))return 1e3*n;const r=Date.parse(`${t}`);return isNaN(r)?st:r-e}(i,r):429===e&&(o.all=r+6e4);return o}const ct="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__;function ut(){return at(y),y}function at(t){return t.__SENTRY__||(t.__SENTRY__={extensions:{}}),t.__SENTRY__}function ft(t){const e=B(),n={sid:G(),init:!0,timestamp:e,started:e,duration:0,status:"ok",errors:0,ignoreDuration:!1,toJSON:()=>function(t){return j({sid:`${t.sid}`,init:t.init,started:new Date(1e3*t.started).toISOString(),timestamp:new Date(1e3*t.timestamp).toISOString(),status:t.status,errors:t.errors,did:"number"==typeof t.did||"string"==typeof t.did?`${t.did}`:void 0,duration:t.duration,abnormal_mechanism:t.abnormal_mechanism,attrs:{release:t.release,environment:t.environment,ip_address:t.ipAddress,user_agent:t.userAgent}})}(n)};return t&&ht(n,t),n}function ht(t,e={}){if(e.user&&(!t.ipAddress&&e.user.ip_address&&(t.ipAddress=e.user.ip_address),t.did||e.did||(t.did=e.user.id||e.user.email||e.user.username)),t.timestamp=e.timestamp||B(),e.abnormal_mechanism&&(t.abnormal_mechanism=e.abnormal_mechanism),e.ignoreDuration&&(t.ignoreDuration=e.ignoreDuration),e.sid&&(t.sid=32===e.sid.length?e.sid:G()),void 0!==e.init&&(t.init=e.init),!t.did&&e.did&&(t.did=`${e.did}`),"number"==typeof e.started&&(t.started=e.started),t.ignoreDuration)t.duration=void 0;else if("number"==typeof e.duration)t.duration=e.duration;else{const e=t.timestamp-t.started;t.duration=e>=0?e:0}e.release&&(t.release=e.release),e.environment&&(t.environment=e.environment),!t.ipAddress&&e.ipAddress&&(t.ipAddress=e.ipAddress),!t.userAgent&&e.userAgent&&(t.userAgent=e.userAgent),"number"==typeof e.errors&&(t.errors=e.errors),e.status&&(t.status=e.status)}const pt="_sentrySpan";function lt(t,e){e?function(t,e,n){try{Object.defineProperty(t,e,{value:n,writable:!0,configurable:!0})}catch(n){S&&N.log(`Failed to add non-enumerable property "${e}" to object`,t)}}(t,pt,e):delete t[pt]}function dt(t){return t[pt]}class mt{constructor(){this._=!1,this.S=[],this.N=[],this.k=[],this.C=[],this.D={},this.T={},this.O={},this.j={},this.R={},this.A=yt()}clone(){const t=new mt;return t.k=[...this.k],t.T={...this.T},t.O={...this.O},t.j={...this.j},t.D=this.D,t.I=this.I,t.P=this.P,t.U=this.U,t.M=this.M,t.N=[...this.N],t.L=this.L,t.C=[...this.C],t.R={...this.R},t.A={...this.A},t.B=this.B,t.G=this.G,lt(t,dt(this)),t}setClient(t){this.B=t}setLastEventId(t){this.G=t}getClient(){return this.B}lastEventId(){return this.G}addScopeListener(t){this.S.push(t)}addEventProcessor(t){return this.N.push(t),this}setUser(t){return this.D=t||{email:void 0,id:void 0,ip_address:void 0,username:void 0},this.P&&ht(this.P,{user:t}),this.J(),this}getUser(){return this.D}getRequestSession(){return this.L}setRequestSession(t){return this.L=t,this}setTags(t){return this.T={...this.T,...t},this.J(),this}setTag(t,e){return this.T={...this.T,[t]:e},this.J(),this}setExtras(t){return this.O={...this.O,...t},this.J(),this}setExtra(t,e){return this.O={...this.O,[t]:e},this.J(),this}setFingerprint(t){return this.M=t,this.J(),this}setLevel(t){return this.I=t,this.J(),this}setTransactionName(t){return this.U=t,this.J(),this}setContext(t,e){return null===e?delete this.j[t]:this.j[t]=e,this.J(),this}setSession(t){return t?this.P=t:delete this.P,this.J(),this}getSession(){return this.P}update(t){if(!t)return this;const e="function"==typeof t?t(this):t,[n,r]=e instanceof gt?[e.getScopeData(),e.getRequestSession()]:d(e)?[t,t.requestSession]:[],{tags:o,extra:s,user:i,contexts:c,level:u,fingerprint:a=[],propagationContext:f}=n||{};return this.T={...this.T,...o},this.O={...this.O,...s},this.j={...this.j,...c},i&&Object.keys(i).length&&(this.D=i),u&&(this.I=u),a.length&&(this.M=a),f&&(this.A=f),r&&(this.L=r),this}clear(){return this.k=[],this.T={},this.O={},this.D={},this.j={},this.I=void 0,this.U=void 0,this.M=void 0,this.L=void 0,this.P=void 0,lt(this,void 0),this.C=[],this.A=yt(),this.J(),this}addBreadcrumb(t,e){const n="number"==typeof e?e:100;if(n<=0)return this;const r={timestamp:L(),...t},o=this.k;return o.push(r),this.k=o.length>n?o.slice(-n):o,this.J(),this}getLastBreadcrumb(){return this.k[this.k.length-1]}clearBreadcrumbs(){return this.k=[],this.J(),this}addAttachment(t){return this.C.push(t),this}clearAttachments(){return this.C=[],this}getScopeData(){return{breadcrumbs:this.k,attachments:this.C,contexts:this.j,tags:this.T,extra:this.O,user:this.D,level:this.I,fingerprint:this.M||[],eventProcessors:this.N,propagationContext:this.A,sdkProcessingMetadata:this.R,transactionName:this.U,span:dt(this)}}setSDKProcessingMetadata(t){return this.R={...this.R,...t},this}setPropagationContext(t){return this.A=t,this}getPropagationContext(){return this.A}captureException(t,e){const n=e&&e.event_id?e.event_id:G();if(!this.B)return N.warn("No client configured on scope - will not capture exception!"),n;const r=new Error("Sentry syntheticException");return this.B.captureException(t,{originalException:t,syntheticException:r,...e,event_id:n},this),n}captureMessage(t,e,n){const r=n&&n.event_id?n.event_id:G();if(!this.B)return N.warn("No client configured on scope - will not capture message!"),r;const o=new Error(t);return this.B.captureMessage(t,e,{originalException:t,syntheticException:o,...n,event_id:r},this),r}captureEvent(t,e){const n=e&&e.event_id?e.event_id:G();return this.B?(this.B.captureEvent(t,{...e,event_id:n},this),n):(N.warn("No client configured on scope - will not capture event!"),n)}J(){this._||(this._=!0,this.S.forEach((t=>{t(this)})),this._=!1)}}const gt=mt;function yt(){return{traceId:G(),spanId:G().substring(16)}}function bt(){return Et(ut()).getCurrentScope().getClient()}class vt{constructor(t,e){let n,r;n=t||new gt,r=e||new gt,this.H=[{scope:n}],this.W=r}withScope(t){const e=this.Y();let n;try{n=t(e)}catch(t){throw this.q(),t}return m(n)?n.then((t=>(this.q(),t)),(t=>{throw this.q(),t})):(this.q(),n)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this.W}getStack(){return this.H}getStackTop(){return this.H[this.H.length-1]}Y(){const t=this.getScope().clone();return this.getStack().push({client:this.getClient(),scope:t}),t}q(){return!(this.getStack().length<=1)&&!!this.getStack().pop()}}function _t(){const t=at(ut());return t.hub||(t.hub=new vt(b("defaultCurrentScope",(()=>new gt)),b("defaultIsolationScope",(()=>new gt)))),t.hub}function wt(t){return _t().withScope(t)}function St(t,e){const n=_t();return n.withScope((()=>(n.getStackTop().scope=t,e(t))))}function $t(t){return _t().withScope((()=>t(_t().getIsolationScope())))}function Et(t){const e=at(t);return e.acs?e.acs:{withIsolationScope:$t,withScope:wt,withSetScope:St,withSetIsolationScope:(t,e)=>$t(e),getCurrentScope:()=>_t().getScope(),getIsolationScope:()=>_t().getIsolationScope()}}const xt="sentry.source",Nt="sentry.sample_rate",kt="sentry.op",Ct="sentry.origin",Dt=0,Tt=1,Ot="production",jt="_frozenDsc";function Rt(t){const e=bt();if(!e)return{};const n=function(t,e){const n=e.getOptions(),{publicKey:r}=e.getDsn()||{},o=j({environment:n.environment||Ot,release:n.release,public_key:r,trace_id:t});return e.emit("createDsc",o),o}(Mt(t).trace_id||"",e),r=Gt(t);if(!r)return n;const o=r[jt];if(o)return o;const s=Mt(r),i=s.data||{},c=i[Nt];null!=c&&(n.sample_rate=`${c}`);const u=i[xt];return u&&"url"!==u&&(n.transaction=s.description),n.sampled=String(function(t){const{traceFlags:e}=t.spanContext();return e===At}(r)),e.emit("createDsc",n),n}const At=1;function It(t){const{spanId:e,traceId:n}=t.spanContext(),{parent_span_id:r}=Mt(t);return j({parent_span_id:r,span_id:e,trace_id:n})}function Pt(t){return"number"==typeof t?Ut(t):Array.isArray(t)?t[0]+t[1]/1e9:t instanceof Date?Ut(t.getTime()):B()}function Ut(t){return t>9999999999?t/1e3:t}function Mt(t){if(function(t){return"function"==typeof t.getSpanJSON}(t))return t.getSpanJSON();try{const{spanId:e,traceId:n}=t.spanContext();if(function(t){const e=t;return!!(e.attributes&&e.startTime&&e.name&&e.endTime&&e.status)}(t)){const{attributes:r,startTime:o,name:s,endTime:i,parentSpanId:c,status:u}=t;return j({span_id:e,trace_id:n,data:r,description:s,parent_span_id:c,start_timestamp:Pt(o),timestamp:Pt(i)||void 0,status:Lt(u),op:r[kt],origin:r[Ct],F:void 0})}return{span_id:e,trace_id:n}}catch(t){return{}}}function Lt(t){if(t&&t.code!==Dt)return t.code===Tt?"ok":t.message||"unknown_error"}const Bt="_sentryRootSpan";function Gt(t){return t[Bt]||t}function Jt(t,e,n,r){const o=ot(n),s=t.type&&"replay_event"!==t.type?t.type:"event";!function(t,e){e&&(t.sdk=t.sdk||{},t.sdk.name=t.sdk.name||e.name,t.sdk.version=t.sdk.version||e.version,t.sdk.integrations=[...t.sdk.integrations||[],...e.integrations||[]],t.sdk.packages=[...t.sdk.packages||[],...e.packages||[]])}(t,n&&n.sdk);const i=function(t,e,n,r){const o=t.sdkProcessingMetadata&&t.sdkProcessingMetadata.dynamicSamplingContext;return{event_id:t.event_id,sent_at:(new Date).toISOString(),...e&&{sdk:e},...!!n&&r&&{dsn:k(r)},...o&&{trace:j({...o})}}}(t,o,r,e);delete t.sdkProcessingMetadata;return Q(i,[[{type:s},t]])}const zt="__SENTRY_SUPPRESS_TRACING__";function Ht(t){const e=Et(ut());return e.suppressTracing?e.suppressTracing(t):function(...t){const e=Et(ut());if(2===t.length){const[n,r]=t;return n?e.withSetScope(n,r):e.withScope(r)}return e.withScope(t[0])}((e=>(e.setSDKProcessingMetadata({[zt]:!0}),t())))}function Wt(t,e){const{fingerprint:n,span:r,breadcrumbs:o,sdkProcessingMetadata:s}=e;!function(t,e){const{extra:n,tags:r,user:o,contexts:s,level:i,transactionName:c}=e,u=j(n);u&&Object.keys(u).length&&(t.extra={...u,...t.extra});const a=j(r);a&&Object.keys(a).length&&(t.tags={...a,...t.tags});const f=j(o);f&&Object.keys(f).length&&(t.user={...f,...t.user});const h=j(s);h&&Object.keys(h).length&&(t.contexts={...h,...t.contexts});i&&(t.level=i);c&&"transaction"!==t.type&&(t.transaction=c)}(t,e),r&&function(t,e){t.contexts={trace:It(e),...t.contexts},t.sdkProcessingMetadata={dynamicSamplingContext:Rt(e),...t.sdkProcessingMetadata};const n=Gt(e),r=Mt(n).description;r&&!t.transaction&&"transaction"===t.type&&(t.transaction=r)}(t,r),function(t,e){t.fingerprint=t.fingerprint?function(t){return Array.isArray(t)?t:[t]}(t.fingerprint):[],e&&(t.fingerprint=t.fingerprint.concat(e));t.fingerprint&&!t.fingerprint.length&&delete t.fingerprint}(t,n),function(t,e){const n=[...t.breadcrumbs||[],...e];t.breadcrumbs=n.length?n:void 0}(t,o),function(t,e){t.sdkProcessingMetadata={...t.sdkProcessingMetadata,...e}}(t,s)}const Yt="7";function qt(t,e){return n={sentry_key:t.publicKey,sentry_version:Yt,...e&&{sentry_client:`${e.name}/${e.version}`}},Object.keys(n).map((t=>`${encodeURIComponent(t)}=${encodeURIComponent(n[t])}`)).join("&");var n}const Ft=64;function Kt(t,e,n=V(t.bufferSize||Ft)){let r={};return{send:function(o){const s=[];if(X(o,((e,n)=>{const o=rt(n);if(function(t,e,n=Date.now()){return function(t,e){return t[e]||t.all||0}(t,e)>n}(r,o)){const r=Vt(e,n);t.recordDroppedEvent("ratelimit_backoff",o,r)}else s.push(e)})),0===s.length)return F({});const i=Q(o[0],s),c=e=>{X(i,((n,r)=>{const o=Vt(n,r);t.recordDroppedEvent(e,rt(r),o)}))};return n.add((()=>e({body:et(i)}).then((t=>(void 0!==t.statusCode&&(t.statusCode<200||t.statusCode>=300)&&ct&&N.warn(`Sentry responded with status code ${t.statusCode} to sent event.`),r=it(r,t),t)),(t=>{throw c("network_error"),t})))).then((t=>t),(t=>{if(t instanceof C)return ct&&N.error("Skipped sending event because buffer is full."),c("queue_overflow"),F({});throw t}))},flush:t=>n.drain(t)}}function Vt(t,e){if("event"===e||"transaction"===e)return Array.isArray(t)?t[1]:void 0}const Zt=Symbol("AgentBaseInternalState");class Qt extends h.Agent{[Zt];options;keepAlive;constructor(t){super(t),this[Zt]={}}isSecureEndpoint(t){if(t){if("boolean"==typeof t.secureEndpoint)return t.secureEndpoint;if("string"==typeof t.protocol)return"https:"===t.protocol}const{stack:e}=new Error;return"string"==typeof e&&e.split("\n").some((t=>-1!==t.indexOf("(https.js:")||-1!==t.indexOf("node:https:")))}createSocket(t,e,n){const r={...e,secureEndpoint:this.isSecureEndpoint(e)};Promise.resolve().then((()=>this.connect(t,r))).then((o=>{if(o instanceof h.Agent)return o.addRequest(t,r);this[Zt].currentSocket=o,super.createSocket(t,e,n)}),n)}createConnection(){const t=this[Zt].currentSocket;if(this[Zt].currentSocket=void 0,!t)throw new Error("No socket was returned in the `connect()` function");return t}get defaultPort(){return this[Zt].defaultPort??("https:"===this.protocol?443:80)}set defaultPort(t){this[Zt]&&(this[Zt].defaultPort=t)}get protocol(){return this[Zt].protocol??(this.isSecureEndpoint()?"https:":"http:")}set protocol(t){this[Zt]&&(this[Zt].protocol=t)}}function Xt(...t){N.log("[https-proxy-agent:parse-proxy-response]",...t)}function te(t){return new Promise(((e,n)=>{let r=0;const o=[];function s(){const c=t.read();c?function(c){o.push(c),r+=c.length;const u=Buffer.concat(o,r),a=u.indexOf("\r\n\r\n");if(-1===a)return Xt("have not received end of HTTP headers yet..."),void s();const f=u.slice(0,a).toString("ascii").split("\r\n"),h=f.shift();if(!h)return t.destroy(),n(new Error("No header received from proxy CONNECT response"));const p=h.split(" "),l=+p[1],d=p.slice(2).join(" "),m={};for(const e of f){if(!e)continue;const r=e.indexOf(":");if(-1===r)return t.destroy(),n(new Error(`Invalid header from proxy CONNECT response: "${e}"`));const o=e.slice(0,r).toLowerCase(),s=e.slice(r+1).trimStart(),i=m[o];"string"==typeof i?m[o]=[i,s]:Array.isArray(i)?i.push(s):m[o]=s}Xt("got proxy server response: %o %o",h,m),i(),e({connect:{statusCode:l,statusText:d,headers:m},buffered:u})}(c):t.once("readable",s)}function i(){t.removeListener("end",c),t.removeListener("error",u),t.removeListener("readable",s)}function c(){i(),Xt("onend"),n(new Error("Proxy connection ended before receiving CONNECT response"))}function u(t){i(),Xt("onerror %o",t),n(t)}t.on("error",u),t.on("end",c),s()}))}function ee(...t){N.log("[https-proxy-agent]",...t)}class ne extends Qt{static protocols=["http","https"];proxy;proxyHeaders;connectOpts;constructor(t,e){super(e),this.options={},this.proxy="string"==typeof t?new URL(t):t,this.proxyHeaders=e?.headers??{},ee("Creating new HttpsProxyAgent instance: %o",this.proxy.href);const n=(this.proxy.hostname||this.proxy.host).replace(/^\[|\]$/g,""),r=this.proxy.port?parseInt(this.proxy.port,10):"https:"===this.proxy.protocol?443:80;this.connectOpts={ALPNProtocols:["http/1.1"],...e?oe(e,"headers"):null,host:n,port:r}}async connect(t,e){const{proxy:n}=this;if(!e.host)throw new TypeError('No "host" provided');let r;if("https:"===n.protocol){ee("Creating `tls.Socket`: %o",this.connectOpts);const t=this.connectOpts.servername||this.connectOpts.host;r=f.connect({...this.connectOpts,servername:t&&a.isIP(t)?void 0:t})}else ee("Creating `net.Socket`: %o",this.connectOpts),r=a.connect(this.connectOpts);const o="function"==typeof this.proxyHeaders?this.proxyHeaders():{...this.proxyHeaders},s=a.isIPv6(e.host)?`[${e.host}]`:e.host;let i=`CONNECT ${s}:${e.port} HTTP/1.1\r\n`;if(n.username||n.password){const t=`${decodeURIComponent(n.username)}:${decodeURIComponent(n.password)}`;o["Proxy-Authorization"]=`Basic ${Buffer.from(t).toString("base64")}`}o.Host=`${s}:${e.port}`,o["Proxy-Connection"]||(o["Proxy-Connection"]=this.keepAlive?"Keep-Alive":"close");for(const t of Object.keys(o))i+=`${t}: ${o[t]}\r\n`;const c=te(r);r.write(`${i}\r\n`);const{connect:u,buffered:h}=await c;if(t.emit("proxyConnect",u),this.emit("proxyConnect",u,t),200===u.statusCode){if(t.once("socket",re),e.secureEndpoint){ee("Upgrading socket connection to TLS");const t=e.servername||e.host;return f.connect({...oe(e,"host","path","port"),socket:r,servername:a.isIP(t)?void 0:t})}return r}r.destroy();const p=new a.Socket({writable:!1});return p.readable=!0,t.once("socket",(t=>{ee("Replaying proxy buffer for failed request"),t.push(h),t.push(null)})),p}}function re(t){t.resume()}function oe(t,...e){const n={};let r;for(r in t)e.includes(r)||(n[r]=t[r]);return n}const se=32768;function ie(t){return t.replace(/^[A-Z]:/,"").replace(/\\/g,"/")}const ce=n;let ue,ae=!1;function fe(t){ce.debug&&console.log(`[ANR Worker] ${t}`)}var he,pe,le;const de=function(t){let e;try{e=new URL(t.url)}catch(e){return x((()=>{console.warn("[@sentry/node]: Invalid dsn or tunnel option, will not send any events. The tunnel option must be a full URL when used.")})),Kt(t,(()=>Promise.resolve({})))}const n="https:"===e.protocol,r=function(t,e){const{no_proxy:n}=process.env;return n&&n.split(",").some((e=>t.host.endsWith(e)||t.hostname.endsWith(e)))?void 0:e}(e,t.proxy||(n?process.env.https_proxy:void 0)||process.env.http_proxy),o=n?i:s,a=void 0!==t.keepAlive&&t.keepAlive,f=r?new ne(r):new o.Agent({keepAlive:a,maxSockets:30,timeout:2e3});return Ht((()=>{const e=function(t,e,n){const{hostname:r,pathname:o,port:s,protocol:i,search:a}=new URL(t.url);return function(f){return new Promise(((h,p)=>{let l=function(t){return new c({read(){this.push(t),this.push(null)}})}(f.body);const d={...t.headers};f.body.length>se&&(d["content-encoding"]="gzip",l=l.pipe(u()));const m=e.request({method:"POST",agent:n,headers:d,hostname:r,path:`${o}${a}`,port:s,protocol:i,ca:t.caCerts},(t=>{t.on("data",(()=>{})),t.on("end",(()=>{})),t.setEncoding("utf8");const e=t.headers["retry-after"]??null,n=t.headers["x-sentry-rate-limits"]??null;h({statusCode:t.statusCode,headers:{"retry-after":e,"x-sentry-rate-limits":Array.isArray(n)?n[0]:n}})}));m.on("error",p),l.pipe(m)}))}}(t,t.httpModule??o,f);return Kt(t,e)}))}({url:(he=ce.dsn,pe=ce.tunnel,le=ce.sdkMetadata.sdk,pe||`${function(t){return`${function(t){const e=t.protocol?`${t.protocol}:`:"",n=t.port?`:${t.port}`:"";return`${e}//${t.host}${n}${t.path?`/${t.path}`:""}/api/`}(t)}${t.projectId}/envelope/`}(he)}?${qt(he,le)}`),recordDroppedEvent:()=>{}});async function me(){if(ue){fe("Sending abnormal session"),ht(ue,{status:"abnormal",abnormal_mechanism:"anr_foreground"});const t=function(t,e,n,r){const o=ot(n);return Q({sent_at:(new Date).toISOString(),...o&&{sdk:o},...!!r&&e&&{dsn:k(e)}},["aggregates"in t?[{type:"sessions"},t]:[{type:"session"},t.toJSON()]])}(ue,ce.dsn,ce.sdkMetadata,ce.tunnel);fe(JSON.stringify(t)),await de.send(t);try{e?.postMessage("session-ended")}catch(t){}}}function ge(t){if(!t)return;const e=function(t){if(!t.length)return[];const e=Array.from(t);return/sentryWrapped/.test(e[e.length-1].function||"")&&e.pop(),e.reverse(),P.test(e[e.length-1].function||"")&&(e.pop(),P.test(e[e.length-1].function||"")&&e.pop()),e.slice(0,A).map((t=>({...t,filename:t.filename||e[e.length-1].filename,function:t.function||I})))}(t);if(ce.appRootPath)for(const t of e)t.filename&&(t.filename=H(t.filename,ce.appRootPath));return e}async function ye(t,e){if(ae)return;ae=!0,await me(),fe("Sending event");const n={event_id:G(),contexts:ce.contexts,release:ce.release,environment:ce.environment,dist:ce.dist,platform:"node",level:"error",exception:{values:[{type:"ApplicationNotResponding",value:`Application Not Responding for at least ${ce.anrThreshold} ms`,stacktrace:{frames:ge(t)},mechanism:{type:"ANR"}}]},tags:ce.staticTags};e&&function(t,e){if(Wt(t,e),!t.contexts?.trace){const{traceId:n,spanId:r,parentSpanId:o}=e.propagationContext;t.contexts={trace:{trace_id:n,span_id:r,parent_span_id:o},...t.contexts}}}(n,e);const r=Jt(n,ce.dsn,ce.sdkMetadata,ce.tunnel);fe(JSON.stringify(r)),await de.send(r),await de.flush(2e3),setTimeout((()=>{process.exit(0)}),5e3)}let be;if(fe("Started"),ce.captureStackTrace){fe("Connecting to debugger");const e=new t;e.connectToMainThread(),fe("Connected to debugger");const n=new Map;e.on("Debugger.scriptParsed",(t=>{n.set(t.params.scriptId,t.params.url)})),e.on("Debugger.paused",(t=>{if("other"===t.params.reason)try{fe("Debugger paused");const s=[...t.params.callFrames],i=ce.appRootPath?function(t=(process.argv[1]?Y(process.argv[1]):process.cwd()),e="\\"===o){const n=e?ie(t):t;return t=>{if(!t)return;const o=e?ie(t):t;let{dir:s,base:i,ext:c}=r.parse(o);".js"!==c&&".mjs"!==c&&".cjs"!==c||(i=i.slice(0,-1*c.length)),s||(s=".");const u=s.lastIndexOf("/node_modules");if(u>-1)return`${s.slice(u+14).replace(/\//g,".")}:${i}`;if(s.startsWith(n)){let t=s.slice(n.length+1).replace(/\//g,".");return t&&(t+=":"),t+=i,t}return i}}(ce.appRootPath):()=>{},c=s.map((t=>function(t,e,n){const r=e?e.replace(/^file:\/\//,""):void 0,o=t.location.columnNumber?t.location.columnNumber+1:void 0,s=t.location.lineNumber?t.location.lineNumber+1:void 0;return j({filename:r,module:n(r),function:t.functionName||I,colno:o,lineno:s,in_app:r?Z(r):void 0})}(t,n.get(t.location.scriptId),i))),u=setTimeout((()=>{ye(c).then(null,(()=>{fe("Sending ANR event failed.")}))}),5e3);e.post("Runtime.evaluate",{expression:"global.__SENTRY_GET_SCOPES__();",silent:!0,returnByValue:!0},((t,n)=>{t&&fe(`Error executing script: '${t.message}'`),clearTimeout(u);const r=n&&n.result?n.result.value:void 0;e.post("Debugger.resume"),e.post("Debugger.disable"),ye(c,r).then(null,(()=>{fe("Sending ANR event failed.")}))}))}catch(t){throw e.post("Debugger.resume"),e.post("Debugger.disable"),t}})),be=()=>{try{e.post("Debugger.enable",(()=>{e.post("Debugger.pause")}))}catch(t){}}}const{poll:ve}=function(t,e,n,r){const o=t();let s=!1,i=!0;return setInterval((()=>{const t=o.getTimeMs();!1===s&&t>e+n&&(s=!0,i&&r()),t<e+n&&(s=!1)}),20),{poll:()=>{o.reset()},enabled:t=>{i=t}}}((function(){let t=process.hrtime();return{getTimeMs:()=>{const[e,n]=process.hrtime(t);return Math.floor(1e3*e+n/1e6)},reset:()=>{t=process.hrtime()}}}),ce.pollInterval,ce.anrThreshold,(function(){fe("Watchdog timeout"),be?(fe("Pausing debugger to capture stack trace"),be()):(fe("Capturing event without a stack trace"),ye().then(null,(()=>{fe("Sending ANR event failed on watchdog timeout.")})))}));e?.on("message",(t=>{t.session&&(ue=ft(t.session)),ve()}));
/*! @sentry/node 8.3.0 (8b99de7) | https://github.com/getsentry/sentry-javascript */
import{parentPort as t,workerData as e}from"node:worker_threads";import{Session as n}from"inspector";import{posix as r,sep as o}from"node:path";import*as s from"node:http";import*as i from"node:https";import{Readable as c}from"node:stream";import{createGzip as u}from"node:zlib";import*as a from"node:net";import*as f from"node:tls";const h=Object.prototype.toString;function p(t,e){return h.call(t)===`[object ${e}]`}function l(t){return p(t,"Object")}function d(t){return Boolean(t&&t.then&&"function"==typeof t.then)}function m(t,e){try{return t instanceof e}catch(t){return!1}}const g=globalThis;function y(t,e,n){const r=n||g,o=r.__SENTRY__=r.__SENTRY__||{};return o[t]||(o[t]=e())}const b=g,v=80;function _(t,e){const n=t,r=[];let o,s,i,c,u;if(!n||!n.tagName)return"";if(b.HTMLElement&&n instanceof HTMLElement&&n.dataset){if(n.dataset.sentryComponent)return n.dataset.sentryComponent;if(n.dataset.sentryElement)return n.dataset.sentryElement}r.push(n.tagName.toLowerCase());const a=e&&e.length?e.filter((t=>n.getAttribute(t))).map((t=>[t,n.getAttribute(t)])):null;if(a&&a.length)a.forEach((t=>{r.push(`[${t[0]}="${t[1]}"]`)}));else if(n.id&&r.push(`#${n.id}`),o=n.className,o&&p(o,"String"))for(s=o.split(/\s+/),u=0;u<s.length;u++)r.push(`.${s[u]}`);const f=["aria-label","type","name","title","alt"];for(u=0;u<f.length;u++)i=f[u],c=n.getAttribute(i),c&&r.push(`[${i}="${c}"]`);return r.join("")}const w="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__,S=["debug","info","warn","error","log","assert","trace"],$={};function E(t){if(!("console"in g))return t();const e=g.console,n={},r=Object.keys($);r.forEach((t=>{const r=$[t];n[t]=e[t],e[t]=r}));try{return t()}finally{r.forEach((t=>{e[t]=n[t]}))}}const x=function(){let t=!1;const e={enable:()=>{t=!0},disable:()=>{t=!1},isEnabled:()=>t};return w?S.forEach((n=>{e[n]=(...e)=>{t&&E((()=>{g.console[n](`Sentry Logger [${n}]:`,...e)}))}})):S.forEach((t=>{e[t]=()=>{}})),e}();function N(t,e=!1){const{host:n,path:r,pass:o,port:s,projectId:i,protocol:c,publicKey:u}=t;return`${c}://${u}${e&&o?`:${o}`:""}@${n}${s?`:${s}`:""}/${r?`${r}/`:r}${i}`}class k extends Error{constructor(t,e="warn"){super(t),this.message=t,this.name=new.target.prototype.constructor.name,Object.setPrototypeOf(this,new.target.prototype),this.logLevel=e}}function C(t){if(function(t){switch(h.call(t)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return m(t,Error)}}(t))return{message:t.message,name:t.name,stack:t.stack,...T(t)};if(e=t,"undefined"!=typeof Event&&m(e,Event)){const e={type:t.type,target:D(t.target),currentTarget:D(t.currentTarget),...T(t)};return"undefined"!=typeof CustomEvent&&m(t,CustomEvent)&&(e.detail=t.detail),e}return t;var e}function D(t){try{return e=t,"undefined"!=typeof Element&&m(e,Element)?function(t,e={}){if(!t)return"<unknown>";try{let n=t;const r=5,o=[];let s=0,i=0;const c=" > ",u=c.length;let a;const f=Array.isArray(e)?e:e.keyAttrs,h=!Array.isArray(e)&&e.maxStringLength||v;for(;n&&s++<r&&(a=_(n,f),!("html"===a||s>1&&i+o.length*u+a.length>=h));)o.push(a),i+=a.length,n=n.parentNode;return o.reverse().join(c)}catch(t){return"<unknown>"}}(t):Object.prototype.toString.call(t)}catch(t){return"<unknown>"}var e}function T(t){if("object"==typeof t&&null!==t){const e={};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}return{}}function O(t){return j(t,new Map)}function j(t,e){if(function(t){if(!l(t))return!1;try{const e=Object.getPrototypeOf(t).constructor.name;return!e||"Object"===e}catch(t){return!0}}(t)){const n=e.get(t);if(void 0!==n)return n;const r={};e.set(t,r);for(const n of Object.keys(t))void 0!==t[n]&&(r[n]=j(t[n],e));return r}if(Array.isArray(t)){const n=e.get(t);if(void 0!==n)return n;const r=[];return e.set(t,r),t.forEach((t=>{r.push(j(t,e))})),r}return t}const R=50,A="?",I=/captureMessage|captureException/;const P="<anonymous>";const U=1e3;function M(){return Date.now()/U}const L=function(){const{performance:t}=g;if(!t||!t.now)return M;const e=Date.now()-t.now(),n=null==t.timeOrigin?e:t.timeOrigin;return()=>(n+t.now())/U}();function B(){const t=g,e=t.crypto||t.msCrypto;let n=()=>16*Math.random();try{if(e&&e.randomUUID)return e.randomUUID().replace(/-/g,"");e&&e.getRandomValues&&(n=()=>{const t=new Uint8Array(1);return e.getRandomValues(t),t[0]})}catch(t){}return([1e7]+1e3+4e3+8e3+1e11).replace(/[018]/g,(t=>(t^(15&n())>>t/4).toString(16)))}function G(t,e=100,n=1/0){try{return J("",t,e,n)}catch(t){return{ERROR:`**non-serializable** (${t})`}}}function J(t,e,n=1/0,r=1/0,o=function(){const t="function"==typeof WeakSet,e=t?new WeakSet:[];return[function(n){if(t)return!!e.has(n)||(e.add(n),!1);for(let t=0;t<e.length;t++)if(e[t]===n)return!0;return e.push(n),!1},function(n){if(t)e.delete(n);else for(let t=0;t<e.length;t++)if(e[t]===n){e.splice(t,1);break}}]}()){const[s,i]=o;if(null==e||["number","boolean","string"].includes(typeof e)&&!Number.isNaN(e))return e;const c=function(t,e){try{if("domain"===t&&e&&"object"==typeof e&&e.t)return"[Domain]";if("domainEmitter"===t)return"[DomainEmitter]";if("undefined"!=typeof global&&e===global)return"[Global]";if("undefined"!=typeof window&&e===window)return"[Window]";if("undefined"!=typeof document&&e===document)return"[Document]";if("object"==typeof(n=e)&&null!==n&&(n.__isVue||n.o))return"[VueViewModel]";if(function(t){return l(t)&&"nativeEvent"in t&&"preventDefault"in t&&"stopPropagation"in t}(e))return"[SyntheticEvent]";if("number"==typeof e&&e!=e)return"[NaN]";if("function"==typeof e)return`[Function: ${function(t){try{return t&&"function"==typeof t&&t.name||P}catch(t){return P}}(e)}]`;if("symbol"==typeof e)return`[${String(e)}]`;if("bigint"==typeof e)return`[BigInt: ${String(e)}]`;const r=function(t){const e=Object.getPrototypeOf(t);return e?e.constructor.name:"null prototype"}(e);return/^HTML(\w*)Element$/.test(r)?`[HTMLElement: ${r}]`:`[object ${r}]`}catch(t){return`**non-serializable** (${t})`}var n}(t,e);if(!c.startsWith("[object "))return c;if(e.__sentry_skip_normalization__)return e;const u="number"==typeof e.__sentry_override_normalization_depth__?e.__sentry_override_normalization_depth__:n;if(0===u)return c.replace("object ","");if(s(e))return"[Circular ~]";const a=e;if(a&&"function"==typeof a.toJSON)try{return J("",a.toJSON(),u-1,r,o)}catch(t){}const f=Array.isArray(e)?[]:{};let h=0;const p=C(e);for(const t in p){if(!Object.prototype.hasOwnProperty.call(p,t))continue;if(h>=r){f[t]="[MaxProperties ~]";break}const e=p[t];f[t]=J(t,e,u-1,r,o),h++}return i(e),f}function z(t,e){const n=e.replace(/\\/g,"/").replace(/[|\\{}()[\]^$+*?.]/g,"\\$&");let r=t;try{r=decodeURI(t)}catch(t){}return r.replace(/\\/g,"/").replace(/webpack:\/?/g,"").replace(new RegExp(`(file://)?/*${n}/*`,"ig"),"app:///")}(()=>{const{performance:t}=g;if(!t||!t.now)return;const e=36e5,n=t.now(),r=Date.now(),o=t.timeOrigin?Math.abs(t.timeOrigin+n-r):e,s=o<e,i=t.timing&&t.timing.navigationStart,c="number"==typeof i?Math.abs(i+n-r):e;(s||c<e)&&(o<=c&&t.timeOrigin)})();const H=/^(\S+:\\|\/?)([\s\S]*?)((?:\.{1,2}|[^/\\]+?|)(\.[^./\\]*|))(?:[/\\]*)$/;function W(t){const e=function(t){const e=t.length>1024?`<truncated>${t.slice(-1024)}`:t,n=H.exec(e);return n?n.slice(1):[]}(t),n=e[0];let r=e[1];return n||r?(r&&(r=r.slice(0,r.length-1)),n+r):"."}var Y;function q(t){return new F((e=>{e(t)}))}!function(t){t[t.PENDING=0]="PENDING";t[t.RESOLVED=1]="RESOLVED";t[t.REJECTED=2]="REJECTED"}(Y||(Y={}));class F{constructor(t){F.prototype.__init.call(this),F.prototype.__init2.call(this),F.prototype.__init3.call(this),F.prototype.__init4.call(this),this.i=Y.PENDING,this.u=[];try{t(this.h,this.p)}catch(t){this.p(t)}}then(t,e){return new F(((n,r)=>{this.u.push([!1,e=>{if(t)try{n(t(e))}catch(t){r(t)}else n(e)},t=>{if(e)try{n(e(t))}catch(t){r(t)}else r(t)}]),this.l()}))}catch(t){return this.then((t=>t),t)}finally(t){return new F(((e,n)=>{let r,o;return this.then((e=>{o=!1,r=e,t&&t()}),(e=>{o=!0,r=e,t&&t()})).then((()=>{o?n(r):e(r)}))}))}__init(){this.h=t=>{this.m(Y.RESOLVED,t)}}__init2(){this.p=t=>{this.m(Y.REJECTED,t)}}__init3(){this.m=(t,e)=>{this.i===Y.PENDING&&(d(e)?e.then(this.h,this.p):(this.i=t,this.v=e,this.l()))}}__init4(){this.l=()=>{if(this.i===Y.PENDING)return;const t=this.u.slice();this.u=[],t.forEach((t=>{t[0]||(this.i===Y.RESOLVED&&t[1](this.v),this.i===Y.REJECTED&&t[2](this.v),t[0]=!0)}))}}}function K(t){const e=[];function n(t){return e.splice(e.indexOf(t),1)[0]}return{$:e,add:function(r){if(!(void 0===t||e.length<t))return o=new k("Not adding Promise because buffer limit was reached."),new F(((t,e)=>{e(o)}));var o;const s=r();return-1===e.indexOf(s)&&e.push(s),s.then((()=>n(s))).then(null,(()=>n(s).then(null,(()=>{})))),s},drain:function(t){return new F(((n,r)=>{let o=e.length;if(!o)return n(!0);const s=setTimeout((()=>{t&&t>0&&n(!1)}),t);e.forEach((t=>{q(t).then((()=>{--o||(clearTimeout(s),n(!0))}),r)}))}))}}}function V(t,e=!1){return!(e||t&&!t.startsWith("/")&&!t.match(/^[A-Z]:/)&&!t.startsWith(".")&&!t.match(/^[a-zA-Z]([a-zA-Z0-9.\-+])*:\/\//))&&void 0!==t&&!t.includes("node_modules/")}function Z(t,e=[]){return[t,e]}function Q(t,e){const n=t[1];for(const t of n){if(e(t,t[0].type))return!0}return!1}function X(t){return g.__SENTRY__&&g.__SENTRY__.encodePolyfill?g.__SENTRY__.encodePolyfill(t):(new TextEncoder).encode(t)}function tt(t){const[e,n]=t;let r=JSON.stringify(e);function o(t){"string"==typeof r?r="string"==typeof t?r+t:[X(r),t]:r.push("string"==typeof t?X(t):t)}for(const t of n){const[e,n]=t;if(o(`\n${JSON.stringify(e)}\n`),"string"==typeof n||n instanceof Uint8Array)o(n);else{let t;try{t=JSON.stringify(n)}catch(e){t=JSON.stringify(G(n))}o(t)}}return"string"==typeof r?r:function(t){const e=t.reduce(((t,e)=>t+e.length),0),n=new Uint8Array(e);let r=0;for(const e of t)n.set(e,r),r+=e.length;return n}(r)}const et={session:"session",sessions:"session",attachment:"attachment",transaction:"transaction",event:"error",client_report:"internal",user_report:"default",profile:"profile",replay_event:"replay",replay_recording:"replay",check_in:"monitor",feedback:"feedback",span:"span",statsd:"metric_bucket"};function nt(t){return et[t]}function rt(t){if(!t||!t.sdk)return;const{name:e,version:n}=t.sdk;return{name:e,version:n}}const ot=6e4;function st(t,{statusCode:e,headers:n},r=Date.now()){const o={...t},s=n&&n["x-sentry-rate-limits"],i=n&&n["retry-after"];if(s)for(const t of s.trim().split(",")){const[e,n,,,s]=t.split(":",5),i=parseInt(e,10),c=1e3*(isNaN(i)?60:i);if(n)for(const t of n.split(";"))"metric_bucket"===t&&s&&!s.split(";").includes("custom")||(o[t]=r+c);else o.all=r+c}else i?o.all=r+function(t,e=Date.now()){const n=parseInt(`${t}`,10);if(!isNaN(n))return 1e3*n;const r=Date.parse(`${t}`);return isNaN(r)?ot:r-e}(i,r):429===e&&(o.all=r+6e4);return o}const it="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__;function ct(){return ut(g),g}function ut(t){return t.__SENTRY__||(t.__SENTRY__={extensions:{}}),t.__SENTRY__}function at(t){const e=L(),n={sid:B(),init:!0,timestamp:e,started:e,duration:0,status:"ok",errors:0,ignoreDuration:!1,toJSON:()=>function(t){return O({sid:`${t.sid}`,init:t.init,started:new Date(1e3*t.started).toISOString(),timestamp:new Date(1e3*t.timestamp).toISOString(),status:t.status,errors:t.errors,did:"number"==typeof t.did||"string"==typeof t.did?`${t.did}`:void 0,duration:t.duration,abnormal_mechanism:t.abnormal_mechanism,attrs:{release:t.release,environment:t.environment,ip_address:t.ipAddress,user_agent:t.userAgent}})}(n)};return t&&ft(n,t),n}function ft(t,e={}){if(e.user&&(!t.ipAddress&&e.user.ip_address&&(t.ipAddress=e.user.ip_address),t.did||e.did||(t.did=e.user.id||e.user.email||e.user.username)),t.timestamp=e.timestamp||L(),e.abnormal_mechanism&&(t.abnormal_mechanism=e.abnormal_mechanism),e.ignoreDuration&&(t.ignoreDuration=e.ignoreDuration),e.sid&&(t.sid=32===e.sid.length?e.sid:B()),void 0!==e.init&&(t.init=e.init),!t.did&&e.did&&(t.did=`${e.did}`),"number"==typeof e.started&&(t.started=e.started),t.ignoreDuration)t.duration=void 0;else if("number"==typeof e.duration)t.duration=e.duration;else{const e=t.timestamp-t.started;t.duration=e>=0?e:0}e.release&&(t.release=e.release),e.environment&&(t.environment=e.environment),!t.ipAddress&&e.ipAddress&&(t.ipAddress=e.ipAddress),!t.userAgent&&e.userAgent&&(t.userAgent=e.userAgent),"number"==typeof e.errors&&(t.errors=e.errors),e.status&&(t.status=e.status)}const ht="_sentrySpan";function pt(t,e){e?function(t,e,n){try{Object.defineProperty(t,e,{value:n,writable:!0,configurable:!0})}catch(n){w&&x.log(`Failed to add non-enumerable property "${e}" to object`,t)}}(t,ht,e):delete t[ht]}function lt(t){return t[ht]}class dt{constructor(){this._=!1,this.S=[],this.N=[],this.k=[],this.C=[],this.D={},this.T={},this.O={},this.j={},this.R={},this.A=gt()}clone(){const t=new dt;return t.k=[...this.k],t.T={...this.T},t.O={...this.O},t.j={...this.j},t.D=this.D,t.I=this.I,t.P=this.P,t.U=this.U,t.M=this.M,t.N=[...this.N],t.L=this.L,t.C=[...this.C],t.R={...this.R},t.A={...this.A},t.B=this.B,t.G=this.G,pt(t,lt(this)),t}setClient(t){this.B=t}setLastEventId(t){this.G=t}getClient(){return this.B}lastEventId(){return this.G}addScopeListener(t){this.S.push(t)}addEventProcessor(t){return this.N.push(t),this}setUser(t){return this.D=t||{email:void 0,id:void 0,ip_address:void 0,username:void 0},this.P&&ft(this.P,{user:t}),this.J(),this}getUser(){return this.D}getRequestSession(){return this.L}setRequestSession(t){return this.L=t,this}setTags(t){return this.T={...this.T,...t},this.J(),this}setTag(t,e){return this.T={...this.T,[t]:e},this.J(),this}setExtras(t){return this.O={...this.O,...t},this.J(),this}setExtra(t,e){return this.O={...this.O,[t]:e},this.J(),this}setFingerprint(t){return this.M=t,this.J(),this}setLevel(t){return this.I=t,this.J(),this}setTransactionName(t){return this.U=t,this.J(),this}setContext(t,e){return null===e?delete this.j[t]:this.j[t]=e,this.J(),this}setSession(t){return t?this.P=t:delete this.P,this.J(),this}getSession(){return this.P}update(t){if(!t)return this;const e="function"==typeof t?t(this):t,[n,r]=e instanceof mt?[e.getScopeData(),e.getRequestSession()]:l(e)?[t,t.requestSession]:[],{tags:o,extra:s,user:i,contexts:c,level:u,fingerprint:a=[],propagationContext:f}=n||{};return this.T={...this.T,...o},this.O={...this.O,...s},this.j={...this.j,...c},i&&Object.keys(i).length&&(this.D=i),u&&(this.I=u),a.length&&(this.M=a),f&&(this.A=f),r&&(this.L=r),this}clear(){return this.k=[],this.T={},this.O={},this.D={},this.j={},this.I=void 0,this.U=void 0,this.M=void 0,this.L=void 0,this.P=void 0,pt(this,void 0),this.C=[],this.A=gt(),this.J(),this}addBreadcrumb(t,e){const n="number"==typeof e?e:100;if(n<=0)return this;const r={timestamp:M(),...t},o=this.k;return o.push(r),this.k=o.length>n?o.slice(-n):o,this.J(),this}getLastBreadcrumb(){return this.k[this.k.length-1]}clearBreadcrumbs(){return this.k=[],this.J(),this}addAttachment(t){return this.C.push(t),this}clearAttachments(){return this.C=[],this}getScopeData(){return{breadcrumbs:this.k,attachments:this.C,contexts:this.j,tags:this.T,extra:this.O,user:this.D,level:this.I,fingerprint:this.M||[],eventProcessors:this.N,propagationContext:this.A,sdkProcessingMetadata:this.R,transactionName:this.U,span:lt(this)}}setSDKProcessingMetadata(t){return this.R={...this.R,...t},this}setPropagationContext(t){return this.A=t,this}getPropagationContext(){return this.A}captureException(t,e){const n=e&&e.event_id?e.event_id:B();if(!this.B)return x.warn("No client configured on scope - will not capture exception!"),n;const r=new Error("Sentry syntheticException");return this.B.captureException(t,{originalException:t,syntheticException:r,...e,event_id:n},this),n}captureMessage(t,e,n){const r=n&&n.event_id?n.event_id:B();if(!this.B)return x.warn("No client configured on scope - will not capture message!"),r;const o=new Error(t);return this.B.captureMessage(t,e,{originalException:t,syntheticException:o,...n,event_id:r},this),r}captureEvent(t,e){const n=e&&e.event_id?e.event_id:B();return this.B?(this.B.captureEvent(t,{...e,event_id:n},this),n):(x.warn("No client configured on scope - will not capture event!"),n)}J(){this._||(this._=!0,this.S.forEach((t=>{t(this)})),this._=!1)}}const mt=dt;function gt(){return{traceId:B(),spanId:B().substring(16)}}class yt{constructor(t,e){let n,r;n=t||new mt,r=e||new mt,this.H=[{scope:n}],this.W=r}withScope(t){const e=this.Y();let n;try{n=t(e)}catch(t){throw this.q(),t}return d(n)?n.then((t=>(this.q(),t)),(t=>{throw this.q(),t})):(this.q(),n)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this.W}getStack(){return this.H}getStackTop(){return this.H[this.H.length-1]}Y(){const t=this.getScope().clone();return this.getStack().push({client:this.getClient(),scope:t}),t}q(){return!(this.getStack().length<=1)&&!!this.getStack().pop()}}function bt(){const t=ut(ct());return t.hub||(t.hub=new yt(y("defaultCurrentScope",(()=>new mt)),y("defaultIsolationScope",(()=>new mt)))),t.hub}function vt(t){return bt().withScope(t)}function _t(t,e){const n=bt();return n.withScope((()=>(n.getStackTop().scope=t,e(t))))}function wt(t){return bt().withScope((()=>t(bt().getIsolationScope())))}function St(t){const e=ut(t);return e.acs?e.acs:{withIsolationScope:wt,withScope:vt,withSetScope:_t,withSetIsolationScope:(t,e)=>wt(e),getCurrentScope:()=>bt().getScope(),getIsolationScope:()=>bt().getIsolationScope()}}function $t(){return St(ct()).getCurrentScope().getClient()}const Et="sentry.source",xt="sentry.sample_rate",Nt="sentry.op",kt="sentry.origin",Ct=0,Dt=1,Tt=1;function Ot(t){const{spanId:e,traceId:n}=t.spanContext(),{parent_span_id:r}=At(t);return O({parent_span_id:r,span_id:e,trace_id:n})}function jt(t){return"number"==typeof t?Rt(t):Array.isArray(t)?t[0]+t[1]/1e9:t instanceof Date?Rt(t.getTime()):L()}function Rt(t){return t>9999999999?t/1e3:t}function At(t){if(function(t){return"function"==typeof t.getSpanJSON}(t))return t.getSpanJSON();try{const{spanId:e,traceId:n}=t.spanContext();if(function(t){const e=t;return!!(e.attributes&&e.startTime&&e.name&&e.endTime&&e.status)}(t)){const{attributes:r,startTime:o,name:s,endTime:i,parentSpanId:c,status:u}=t;return O({span_id:e,trace_id:n,data:r,description:s,parent_span_id:c,start_timestamp:jt(o),timestamp:jt(i)||void 0,status:It(u),op:r[Nt],origin:r[kt],F:void 0})}return{span_id:e,trace_id:n}}catch(t){return{}}}function It(t){if(t&&t.code!==Ct)return t.code===Dt?"ok":t.message||"unknown_error"}const Pt="_sentryRootSpan";function Ut(t){return t[Pt]||t}const Mt="production",Lt="_frozenDsc";function Bt(t){const e=$t();if(!e)return{};const n=function(t,e){const n=e.getOptions(),{publicKey:r}=e.getDsn()||{},o=O({environment:n.environment||Mt,release:n.release,public_key:r,trace_id:t});return e.emit("createDsc",o),o}(At(t).trace_id||"",e),r=Ut(t);if(!r)return n;const o=r[Lt];if(o)return o;const s=At(r),i=s.data||{},c=i[xt];null!=c&&(n.sample_rate=`${c}`);const u=i[Et];return u&&"url"!==u&&(n.transaction=s.description),n.sampled=String(function(t){const{traceFlags:e}=t.spanContext();return e===Tt}(r)),e.emit("createDsc",n),n}function Gt(t,e,n,r){const o=rt(n),s=t.type&&"replay_event"!==t.type?t.type:"event";!function(t,e){e&&(t.sdk=t.sdk||{},t.sdk.name=t.sdk.name||e.name,t.sdk.version=t.sdk.version||e.version,t.sdk.integrations=[...t.sdk.integrations||[],...e.integrations||[]],t.sdk.packages=[...t.sdk.packages||[],...e.packages||[]])}(t,n&&n.sdk);const i=function(t,e,n,r){const o=t.sdkProcessingMetadata&&t.sdkProcessingMetadata.dynamicSamplingContext;return{event_id:t.event_id,sent_at:(new Date).toISOString(),...e&&{sdk:e},...!!n&&r&&{dsn:N(r)},...o&&{trace:O({...o})}}}(t,o,r,e);delete t.sdkProcessingMetadata;return Z(i,[[{type:s},t]])}const Jt="__SENTRY_SUPPRESS_TRACING__";function zt(t){const e=St(ct());return e.suppressTracing?e.suppressTracing(t):function(...t){const e=St(ct());if(2===t.length){const[n,r]=t;return n?e.withSetScope(n,r):e.withScope(r)}return e.withScope(t[0])}((e=>(e.setSDKProcessingMetadata({[Jt]:!0}),t())))}function Ht(t,e){const{fingerprint:n,span:r,breadcrumbs:o,sdkProcessingMetadata:s}=e;!function(t,e){const{extra:n,tags:r,user:o,contexts:s,level:i,transactionName:c}=e,u=O(n);u&&Object.keys(u).length&&(t.extra={...u,...t.extra});const a=O(r);a&&Object.keys(a).length&&(t.tags={...a,...t.tags});const f=O(o);f&&Object.keys(f).length&&(t.user={...f,...t.user});const h=O(s);h&&Object.keys(h).length&&(t.contexts={...h,...t.contexts});i&&(t.level=i);c&&"transaction"!==t.type&&(t.transaction=c)}(t,e),r&&function(t,e){t.contexts={trace:Ot(e),...t.contexts},t.sdkProcessingMetadata={dynamicSamplingContext:Bt(e),...t.sdkProcessingMetadata};const n=Ut(e),r=At(n).description;r&&!t.transaction&&"transaction"===t.type&&(t.transaction=r)}(t,r),function(t,e){t.fingerprint=t.fingerprint?function(t){return Array.isArray(t)?t:[t]}(t.fingerprint):[],e&&(t.fingerprint=t.fingerprint.concat(e));t.fingerprint&&!t.fingerprint.length&&delete t.fingerprint}(t,n),function(t,e){const n=[...t.breadcrumbs||[],...e];t.breadcrumbs=n.length?n:void 0}(t,o),function(t,e){t.sdkProcessingMetadata={...t.sdkProcessingMetadata,...e}}(t,s)}const Wt="7";function Yt(t,e){return n={sentry_key:t.publicKey,sentry_version:Wt,...e&&{sentry_client:`${e.name}/${e.version}`}},Object.keys(n).map((t=>`${encodeURIComponent(t)}=${encodeURIComponent(n[t])}`)).join("&");var n}const qt=64;function Ft(t,e,n=K(t.bufferSize||qt)){let r={};return{send:function(o){const s=[];if(Q(o,((e,n)=>{const o=nt(n);if(function(t,e,n=Date.now()){return function(t,e){return t[e]||t.all||0}(t,e)>n}(r,o)){const r=Kt(e,n);t.recordDroppedEvent("ratelimit_backoff",o,r)}else s.push(e)})),0===s.length)return q({});const i=Z(o[0],s),c=e=>{Q(i,((n,r)=>{const o=Kt(n,r);t.recordDroppedEvent(e,nt(r),o)}))};return n.add((()=>e({body:tt(i)}).then((t=>(void 0!==t.statusCode&&(t.statusCode<200||t.statusCode>=300)&&it&&x.warn(`Sentry responded with status code ${t.statusCode} to sent event.`),r=st(r,t),t)),(t=>{throw c("network_error"),t})))).then((t=>t),(t=>{if(t instanceof k)return it&&x.error("Skipped sending event because buffer is full."),c("queue_overflow"),q({});throw t}))},flush:t=>n.drain(t)}}function Kt(t,e){if("event"===e||"transaction"===e)return Array.isArray(t)?t[1]:void 0}const Vt=Symbol("AgentBaseInternalState");class Zt extends s.Agent{[Vt];options;keepAlive;constructor(t){super(t),this[Vt]={}}isSecureEndpoint(t){if(t){if("boolean"==typeof t.secureEndpoint)return t.secureEndpoint;if("string"==typeof t.protocol)return"https:"===t.protocol}const{stack:e}=new Error;return"string"==typeof e&&e.split("\n").some((t=>-1!==t.indexOf("(https.js:")||-1!==t.indexOf("node:https:")))}createSocket(t,e,n){const r={...e,secureEndpoint:this.isSecureEndpoint(e)};Promise.resolve().then((()=>this.connect(t,r))).then((o=>{if(o instanceof s.Agent)return o.addRequest(t,r);this[Vt].currentSocket=o,super.createSocket(t,e,n)}),n)}createConnection(){const t=this[Vt].currentSocket;if(this[Vt].currentSocket=void 0,!t)throw new Error("No socket was returned in the `connect()` function");return t}get defaultPort(){return this[Vt].defaultPort??("https:"===this.protocol?443:80)}set defaultPort(t){this[Vt]&&(this[Vt].defaultPort=t)}get protocol(){return this[Vt].protocol??(this.isSecureEndpoint()?"https:":"http:")}set protocol(t){this[Vt]&&(this[Vt].protocol=t)}}function Qt(...t){x.log("[https-proxy-agent:parse-proxy-response]",...t)}function Xt(t){return new Promise(((e,n)=>{let r=0;const o=[];function s(){const c=t.read();c?function(c){o.push(c),r+=c.length;const u=Buffer.concat(o,r),a=u.indexOf("\r\n\r\n");if(-1===a)return Qt("have not received end of HTTP headers yet..."),void s();const f=u.slice(0,a).toString("ascii").split("\r\n"),h=f.shift();if(!h)return t.destroy(),n(new Error("No header received from proxy CONNECT response"));const p=h.split(" "),l=+p[1],d=p.slice(2).join(" "),m={};for(const e of f){if(!e)continue;const r=e.indexOf(":");if(-1===r)return t.destroy(),n(new Error(`Invalid header from proxy CONNECT response: "${e}"`));const o=e.slice(0,r).toLowerCase(),s=e.slice(r+1).trimStart(),i=m[o];"string"==typeof i?m[o]=[i,s]:Array.isArray(i)?i.push(s):m[o]=s}Qt("got proxy server response: %o %o",h,m),i(),e({connect:{statusCode:l,statusText:d,headers:m},buffered:u})}(c):t.once("readable",s)}function i(){t.removeListener("end",c),t.removeListener("error",u),t.removeListener("readable",s)}function c(){i(),Qt("onend"),n(new Error("Proxy connection ended before receiving CONNECT response"))}function u(t){i(),Qt("onerror %o",t),n(t)}t.on("error",u),t.on("end",c),s()}))}function te(...t){x.log("[https-proxy-agent]",...t)}class ee extends Zt{static protocols=["http","https"];proxy;proxyHeaders;connectOpts;constructor(t,e){super(e),this.options={},this.proxy="string"==typeof t?new URL(t):t,this.proxyHeaders=e?.headers??{},te("Creating new HttpsProxyAgent instance: %o",this.proxy.href);const n=(this.proxy.hostname||this.proxy.host).replace(/^\[|\]$/g,""),r=this.proxy.port?parseInt(this.proxy.port,10):"https:"===this.proxy.protocol?443:80;this.connectOpts={ALPNProtocols:["http/1.1"],...e?re(e,"headers"):null,host:n,port:r}}async connect(t,e){const{proxy:n}=this;if(!e.host)throw new TypeError('No "host" provided');let r;if("https:"===n.protocol){te("Creating `tls.Socket`: %o",this.connectOpts);const t=this.connectOpts.servername||this.connectOpts.host;r=f.connect({...this.connectOpts,servername:t&&a.isIP(t)?void 0:t})}else te("Creating `net.Socket`: %o",this.connectOpts),r=a.connect(this.connectOpts);const o="function"==typeof this.proxyHeaders?this.proxyHeaders():{...this.proxyHeaders},s=a.isIPv6(e.host)?`[${e.host}]`:e.host;let i=`CONNECT ${s}:${e.port} HTTP/1.1\r\n`;if(n.username||n.password){const t=`${decodeURIComponent(n.username)}:${decodeURIComponent(n.password)}`;o["Proxy-Authorization"]=`Basic ${Buffer.from(t).toString("base64")}`}o.Host=`${s}:${e.port}`,o["Proxy-Connection"]||(o["Proxy-Connection"]=this.keepAlive?"Keep-Alive":"close");for(const t of Object.keys(o))i+=`${t}: ${o[t]}\r\n`;const c=Xt(r);r.write(`${i}\r\n`);const{connect:u,buffered:h}=await c;if(t.emit("proxyConnect",u),this.emit("proxyConnect",u,t),200===u.statusCode){if(t.once("socket",ne),e.secureEndpoint){te("Upgrading socket connection to TLS");const t=e.servername||e.host;return f.connect({...re(e,"host","path","port"),socket:r,servername:a.isIP(t)?void 0:t})}return r}r.destroy();const p=new a.Socket({writable:!1});return p.readable=!0,t.once("socket",(t=>{te("Replaying proxy buffer for failed request"),t.push(h),t.push(null)})),p}}function ne(t){t.resume()}function re(t,...e){const n={};let r;for(r in t)e.includes(r)||(n[r]=t[r]);return n}const oe=32768;function se(t){return t.replace(/^[A-Z]:/,"").replace(/\\/g,"/")}const ie=e;let ce,ue=!1;function ae(t){ie.debug&&console.log(`[ANR Worker] ${t}`)}var fe,he,pe;const le=function(t){let e;try{e=new URL(t.url)}catch(e){return E((()=>{console.warn("[@sentry/node]: Invalid dsn or tunnel option, will not send any events. The tunnel option must be a full URL when used.")})),Ft(t,(()=>Promise.resolve({})))}const n="https:"===e.protocol,r=function(t,e){const{no_proxy:n}=process.env;return n&&n.split(",").some((e=>t.host.endsWith(e)||t.hostname.endsWith(e)))?void 0:e}(e,t.proxy||(n?process.env.https_proxy:void 0)||process.env.http_proxy),o=n?i:s,a=void 0!==t.keepAlive&&t.keepAlive,f=r?new ee(r):new o.Agent({keepAlive:a,maxSockets:30,timeout:2e3});return zt((()=>{const e=function(t,e,n){const{hostname:r,pathname:o,port:s,protocol:i,search:a}=new URL(t.url);return function(f){return new Promise(((h,p)=>{let l=function(t){return new c({read(){this.push(t),this.push(null)}})}(f.body);const d={...t.headers};f.body.length>oe&&(d["content-encoding"]="gzip",l=l.pipe(u()));const m=e.request({method:"POST",agent:n,headers:d,hostname:r,path:`${o}${a}`,port:s,protocol:i,ca:t.caCerts},(t=>{t.on("data",(()=>{})),t.on("end",(()=>{})),t.setEncoding("utf8");const e=t.headers["retry-after"]??null,n=t.headers["x-sentry-rate-limits"]??null;h({statusCode:t.statusCode,headers:{"retry-after":e,"x-sentry-rate-limits":Array.isArray(n)?n[0]:n}})}));m.on("error",p),l.pipe(m)}))}}(t,t.httpModule??o,f);return Ft(t,e)}))}({url:(fe=ie.dsn,he=ie.tunnel,pe=ie.sdkMetadata.sdk,he||`${function(t){return`${function(t){const e=t.protocol?`${t.protocol}:`:"",n=t.port?`:${t.port}`:"";return`${e}//${t.host}${n}${t.path?`/${t.path}`:""}/api/`}(t)}${t.projectId}/envelope/`}(fe)}?${Yt(fe,pe)}`),recordDroppedEvent:()=>{}});async function de(){if(ce){ae("Sending abnormal session"),ft(ce,{status:"abnormal",abnormal_mechanism:"anr_foreground"});const e=function(t,e,n,r){const o=rt(n);return Z({sent_at:(new Date).toISOString(),...o&&{sdk:o},...!!r&&e&&{dsn:N(e)}},["aggregates"in t?[{type:"sessions"},t]:[{type:"session"},t.toJSON()]])}(ce,ie.dsn,ie.sdkMetadata,ie.tunnel);ae(JSON.stringify(e)),await le.send(e);try{t?.postMessage("session-ended")}catch(t){}}}function me(t){if(!t)return;const e=function(t){if(!t.length)return[];const e=Array.from(t);return/sentryWrapped/.test(e[e.length-1].function||"")&&e.pop(),e.reverse(),I.test(e[e.length-1].function||"")&&(e.pop(),I.test(e[e.length-1].function||"")&&e.pop()),e.slice(0,R).map((t=>({...t,filename:t.filename||e[e.length-1].filename,function:t.function||A})))}(t);if(ie.appRootPath)for(const t of e)t.filename&&(t.filename=z(t.filename,ie.appRootPath));return e}async function ge(t,e){if(ue)return;ue=!0,await de(),ae("Sending event");const n={event_id:B(),contexts:ie.contexts,release:ie.release,environment:ie.environment,dist:ie.dist,platform:"node",level:"error",exception:{values:[{type:"ApplicationNotResponding",value:`Application Not Responding for at least ${ie.anrThreshold} ms`,stacktrace:{frames:me(t)},mechanism:{type:"ANR"}}]},tags:ie.staticTags};e&&function(t,e){if(Ht(t,e),!t.contexts?.trace){const{traceId:n,spanId:r,parentSpanId:o}=e.propagationContext;t.contexts={trace:{trace_id:n,span_id:r,parent_span_id:o},...t.contexts}}}(n,e);const r=Gt(n,ie.dsn,ie.sdkMetadata,ie.tunnel);ae(JSON.stringify(r)),await le.send(r),await le.flush(2e3),setTimeout((()=>{process.exit(0)}),5e3)}let ye;if(ae("Started"),ie.captureStackTrace){ae("Connecting to debugger");const t=new n;t.connectToMainThread(),ae("Connected to debugger");const e=new Map;t.on("Debugger.scriptParsed",(t=>{e.set(t.params.scriptId,t.params.url)})),t.on("Debugger.paused",(n=>{if("other"===n.params.reason)try{ae("Debugger paused");const s=[...n.params.callFrames],i=ie.appRootPath?function(t=(process.argv[1]?W(process.argv[1]):process.cwd()),e="\\"===o){const n=e?se(t):t;return t=>{if(!t)return;const o=e?se(t):t;let{dir:s,base:i,ext:c}=r.parse(o);".js"!==c&&".mjs"!==c&&".cjs"!==c||(i=i.slice(0,-1*c.length)),s||(s=".");const u=s.lastIndexOf("/node_modules");if(u>-1)return`${s.slice(u+14).replace(/\//g,".")}:${i}`;if(s.startsWith(n)){let t=s.slice(n.length+1).replace(/\//g,".");return t&&(t+=":"),t+=i,t}return i}}(ie.appRootPath):()=>{},c=s.map((t=>function(t,e,n){const r=e?e.replace(/^file:\/\//,""):void 0,o=t.location.columnNumber?t.location.columnNumber+1:void 0,s=t.location.lineNumber?t.location.lineNumber+1:void 0;return O({filename:r,module:n(r),function:t.functionName||A,colno:o,lineno:s,in_app:r?V(r):void 0})}(t,e.get(t.location.scriptId),i))),u=setTimeout((()=>{ge(c).then(null,(()=>{ae("Sending ANR event failed.")}))}),5e3);t.post("Runtime.evaluate",{expression:"global.__SENTRY_GET_SCOPES__();",silent:!0,returnByValue:!0},((e,n)=>{e&&ae(`Error executing script: '${e.message}'`),clearTimeout(u);const r=n&&n.result?n.result.value:void 0;t.post("Debugger.resume"),t.post("Debugger.disable"),ge(c,r).then(null,(()=>{ae("Sending ANR event failed.")}))}))}catch(e){throw t.post("Debugger.resume"),t.post("Debugger.disable"),e}})),ye=()=>{try{t.post("Debugger.enable",(()=>{t.post("Debugger.pause")}))}catch(t){}}}const{poll:be}=function(t,e,n,r){const o=t();let s=!1,i=!0;return setInterval((()=>{const t=o.getTimeMs();!1===s&&t>e+n&&(s=!0,i&&r()),t<e+n&&(s=!1)}),20),{poll:()=>{o.reset()},enabled:t=>{i=t}}}((function(){let t=process.hrtime();return{getTimeMs:()=>{const[e,n]=process.hrtime(t);return Math.floor(1e3*e+n/1e6)},reset:()=>{t=process.hrtime()}}}),ie.pollInterval,ie.anrThreshold,(function(){ae("Watchdog timeout"),ye?(ae("Pausing debugger to capture stack trace"),ye()):(ae("Capturing event without a stack trace"),ge().then(null,(()=>{ae("Sending ANR event failed on watchdog timeout.")})))}));t?.on("message",(t=>{t.session&&(ce=at(t.session)),be()}));

@@ -1,2 +0,2 @@

import * as util from 'util';
import * as util from 'node:util';
import { defineIntegration, getClient, addBreadcrumb } from '@sentry/core';

@@ -3,0 +3,0 @@ import { addConsoleInstrumentationHandler, severityLevelFromString } from '@sentry/utils';

import { _optionalChain } from '@sentry/utils';
import { execFile } from 'child_process';
import { readFile, readdir } from 'fs';
import * as os from 'os';
import { join } from 'path';
import { promisify } from 'util';
import { execFile } from 'node:child_process';
import { readFile, readdir } from 'node:fs';
import * as os from 'node:os';
import { join } from 'node:path';
import { promisify } from 'node:util';
import { defineIntegration } from '@sentry/core';
/* eslint-disable max-lines */
const readFileAsync = promisify(readFile);
const readDirAsync = promisify(readdir);
// Process enhanced with methods from Node 18, 20, 22 as @types/node
// is on `14.18.0` to match minimum version requirements of the SDK
const INTEGRATION_NAME = 'Context';

@@ -95,2 +100,3 @@

// Only update properties if they exist
if (_optionalChain([contexts, 'optionalAccess', _11 => _11.app, 'optionalAccess', _12 => _12.app_memory])) {

@@ -100,3 +106,10 @@ contexts.app.app_memory = process.memoryUsage().rss;

if (_optionalChain([contexts, 'optionalAccess', _13 => _13.device, 'optionalAccess', _14 => _14.free_memory])) {
if (_optionalChain([contexts, 'optionalAccess', _13 => _13.app, 'optionalAccess', _14 => _14.free_memory]) && typeof (process ).availableMemory === 'function') {
const freeMemory = _optionalChain([(process ), 'access', _15 => _15.availableMemory, 'optionalCall', _16 => _16()]);
if (freeMemory != null) {
contexts.app.free_memory = freeMemory;
}
}
if (_optionalChain([contexts, 'optionalAccess', _17 => _17.device, 'optionalAccess', _18 => _18.free_memory])) {
contexts.device.free_memory = os.freemem();

@@ -166,7 +179,19 @@ }

/**
* Get app context information from process
*/
function getAppContext() {
const app_memory = process.memoryUsage().rss;
const app_start_time = new Date(Date.now() - process.uptime() * 1000).toISOString();
// https://nodejs.org/api/process.html#processavailablememory
const appContext = { app_start_time, app_memory };
return { app_start_time, app_memory };
if (typeof (process ).availableMemory === 'function') {
const freeMemory = _optionalChain([(process ), 'access', _19 => _19.availableMemory, 'optionalCall', _20 => _20()]);
if (freeMemory != null) {
appContext.free_memory = freeMemory;
}
}
return appContext;
}

@@ -429,3 +454,3 @@

export { getDeviceContext, nodeContextIntegration, readDirAsync, readFileAsync };
export { getAppContext, getDeviceContext, nodeContextIntegration, readDirAsync, readFileAsync };
//# sourceMappingURL=context.js.map
import { _optionalChain } from '@sentry/utils';
import { promises } from 'fs';
import { promises } from 'node:fs';
import { defineIntegration } from '@sentry/core';

@@ -4,0 +4,0 @@ import { LRUMap, addContextToFrame } from '@sentry/utils';

import { _optionalChain } from '@sentry/utils';
import { SpanKind } from '@opentelemetry/api';
import { HttpInstrumentation } from '@opentelemetry/instrumentation-http';
import { addOpenTelemetryInstrumentation, getClient, getSpanKind, getRequestSpanData } from '@sentry/opentelemetry';
import { addOpenTelemetryInstrumentation, getClient } from '@sentry/opentelemetry';
import { defineIntegration, isSentryRequestUrl, getCapturedScopesOnSpan, getIsolationScope, getCurrentScope, setCapturedScopesOnSpan, addBreadcrumb } from '@sentry/core';
import { stripUrlQueryAndFragment } from '@sentry/utils';
import { stripUrlQueryAndFragment, parseUrl, getSanitizedUrlString } from '@sentry/utils';
import { setIsolationScope } from '../sdk/scope.js';

@@ -92,7 +91,3 @@ import { addOriginToSpan } from '../utils/addOriginToSpan.js';

},
responseHook: (span, res) => {
if (_breadcrumbs) {
_addRequestBreadcrumb(span, res);
}
responseHook: () => {
const client = getClient();

@@ -105,2 +100,11 @@ if (client && client.getOptions().autoSessionTracking) {

},
applyCustomAttributesOnSpan: (
_span,
request,
response,
) => {
if (_breadcrumbs) {
_addRequestBreadcrumb(request, response);
}
},
}),

@@ -119,8 +123,12 @@ );

/** Add a breadcrumb for outgoing requests. */
function _addRequestBreadcrumb(span, response) {
if (getSpanKind(span) !== SpanKind.CLIENT) {
function _addRequestBreadcrumb(
request,
response,
) {
// Only generate breadcrumbs for outgoing requests
if (!_isClientRequest(request)) {
return;
}
const data = getRequestSpanData(span);
const data = getBreadcrumbData(request);
addBreadcrumb(

@@ -137,5 +145,3 @@ {

event: 'response',
// TODO FN: Do we need access to `request` here?
// If we do, we'll have to use the `applyCustomAttributesOnSpan` hook instead,
// but this has worse context semantics than request/responseHook.
request,
response,

@@ -146,2 +152,27 @@ },

function getBreadcrumbData(request) {
try {
// `request.host` does not contain the port, but the host header does
const host = request.getHeader('host') || request.host;
const url = new URL(request.path, `${request.protocol}//${host}`);
const parsedUrl = parseUrl(url.toString());
const data = {
url: getSanitizedUrlString(parsedUrl),
'http.method': request.method || 'GET',
};
if (parsedUrl.search) {
data['http.query'] = parsedUrl.search;
}
if (parsedUrl.hash) {
data['http.fragment'] = parsedUrl.hash;
}
return data;
} catch (e) {
return {};
}
}
/**

@@ -148,0 +179,0 @@ * Determines if @param req is a ClientRequest, meaning the request was created within the express app

import { _optionalChain } from '@sentry/utils';
import { Worker } from 'node:worker_threads';
import { defineIntegration } from '@sentry/core';
import { LRUMap, logger } from '@sentry/utils';
import { Worker } from 'worker_threads';
import { hashFrames, functionNamesMatch } from './common.js';
// This string is a placeholder that gets overwritten with the worker code.
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZSA4LjIuMSAoYmIyZjFiYykgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIGV9ZnJvbSJub2RlOmluc3BlY3Rvci9wcm9taXNlcyI7aW1wb3J0e3dvcmtlckRhdGEgYXMgbixwYXJlbnRQb3J0IGFzIHR9ZnJvbSJ3b3JrZXJfdGhyZWFkcyI7aW1wb3J0e3Bvc2l4IGFzIG8sc2VwIGFzIHJ9ZnJvbSJwYXRoIjtjb25zdCBpPTUwLHM9Ij8iLGM9L1woZXJyb3I6ICguKilcKS8sYT0vY2FwdHVyZU1lc3NhZ2V8Y2FwdHVyZUV4Y2VwdGlvbi87Y29uc3QgdT0vXihcUys6XFx8XC8/KShbXHNcU10qPykoKD86XC57MSwyfXxbXi9cXF0rP3wpKFwuW14uL1xcXSp8KSkoPzpbL1xcXSopJC87ZnVuY3Rpb24gZihlKXtjb25zdCBuPWZ1bmN0aW9uKGUpe2NvbnN0IG49ZS5sZW5ndGg+MTAyND9gPHRydW5jYXRlZD4ke2Uuc2xpY2UoLTEwMjQpfWA6ZSx0PXUuZXhlYyhuKTtyZXR1cm4gdD90LnNsaWNlKDEpOltdfShlKSx0PW5bMF07bGV0IG89blsxXTtyZXR1cm4gdHx8bz8obyYmKG89by5zbGljZSgwLG8ubGVuZ3RoLTEpKSx0K28pOiIuIn1mdW5jdGlvbiBsKGUsbj0hMSl7cmV0dXJuIShufHxlJiYhZS5zdGFydHNXaXRoKCIvIikmJiFlLm1hdGNoKC9eW0EtWl06LykmJiFlLnN0YXJ0c1dpdGgoIi4iKSYmIWUubWF0Y2goL15bYS16QS1aXShbYS16QS1aMC05LlwtK10pKjpcL1wvLykpJiZ2b2lkIDAhPT1lJiYhZS5pbmNsdWRlcygibm9kZV9tb2R1bGVzLyIpfWZ1bmN0aW9uIGQoZSl7Y29uc3Qgbj0vXlxzKlstXXs0LH0kLyx0PS9hdCAoPzphc3luYyApPyg/OiguKz8pXHMrXCgpPyg/OiguKyk6KFxkKyk6KFxkKyk/fChbXildKykpXCk/LztyZXR1cm4gbz0+e2NvbnN0IHI9by5tYXRjaCh0KTtpZihyKXtsZXQgbix0LG8saSxjO2lmKHJbMV0pe289clsxXTtsZXQgZT1vLmxhc3RJbmRleE9mKCIuIik7aWYoIi4iPT09b1tlLTFdJiZlLS0sZT4wKXtuPW8uc2xpY2UoMCxlKSx0PW8uc2xpY2UoZSsxKTtjb25zdCByPW4uaW5kZXhPZigiLk1vZHVsZSIpO3I+MCYmKG89by5zbGljZShyKzEpLG49bi5zbGljZSgwLHIpKX1pPXZvaWQgMH10JiYoaT1uLGM9dCksIjxhbm9ueW1vdXM+Ij09PXQmJihjPXZvaWQgMCxvPXZvaWQgMCksdm9pZCAwPT09byYmKGM9Y3x8cyxvPWk/YCR7aX0uJHtjfWA6Yyk7bGV0IGE9clsyXSYmclsyXS5zdGFydHNXaXRoKCJmaWxlOi8vIik/clsyXS5zbGljZSg3KTpyWzJdO2NvbnN0IHU9Im5hdGl2ZSI9PT1yWzVdO3JldHVybiBhJiZhLm1hdGNoKC9cL1tBLVpdOi8pJiYoYT1hLnNsaWNlKDEpKSxhfHwhcls1XXx8dXx8KGE9cls1XSkse2ZpbGVuYW1lOmEsbW9kdWxlOmU/ZShhKTp2b2lkIDAsZnVuY3Rpb246byxsaW5lbm86cGFyc2VJbnQoclszXSwxMCl8fHZvaWQgMCxjb2xubzpwYXJzZUludChyWzRdLDEwKXx8dm9pZCAwLGluX2FwcDpsKGEsdSl9fWlmKG8ubWF0Y2gobikpcmV0dXJue2ZpbGVuYW1lOm99fX1mdW5jdGlvbiBwKGUpe3JldHVybiBlLnJlcGxhY2UoL15bQS1aXTovLCIiKS5yZXBsYWNlKC9cXC9nLCIvIil9Y29uc3QgZz1uLG09ZnVuY3Rpb24oLi4uZSl7Y29uc3Qgbj1lLnNvcnQoKChlLG4pPT5lWzBdLW5bMF0pKS5tYXAoKGU9PmVbMV0pKTtyZXR1cm4oZSx0PTAsbz0wKT0+e2NvbnN0IHI9W10sdT1lLnNwbGl0KCJcbiIpO2ZvcihsZXQgZT10O2U8dS5sZW5ndGg7ZSsrKXtjb25zdCB0PXVbZV07aWYodC5sZW5ndGg+MTAyNCljb250aW51ZTtjb25zdCBzPWMudGVzdCh0KT90LnJlcGxhY2UoYywiJDEiKTp0O2lmKCFzLm1hdGNoKC9cUypFcnJvcjogLykpe2Zvcihjb25zdCBlIG9mIG4pe2NvbnN0IG49ZShzKTtpZihuKXtyLnB1c2gobik7YnJlYWt9fWlmKHIubGVuZ3RoPj1pK28pYnJlYWt9fXJldHVybiBmdW5jdGlvbihlKXtpZighZS5sZW5ndGgpcmV0dXJuW107Y29uc3Qgbj1BcnJheS5mcm9tKGUpOy9zZW50cnlXcmFwcGVkLy50ZXN0KG5bbi5sZW5ndGgtMV0uZnVuY3Rpb258fCIiKSYmbi5wb3AoKTtuLnJldmVyc2UoKSxhLnRlc3QobltuLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiYobi5wb3AoKSxhLnRlc3QobltuLmxlbmd0aC0xXS5mdW5jdGlvbnx8IiIpJiZuLnBvcCgpKTtyZXR1cm4gbi5zbGljZSgwLGkpLm1hcCgoZT0+KHsuLi5lLGZpbGVuYW1lOmUuZmlsZW5hbWV8fG5bbi5sZW5ndGgtMV0uZmlsZW5hbWUsZnVuY3Rpb246ZS5mdW5jdGlvbnx8c30pKSl9KHIuc2xpY2UobykpfX0oWzkwLGQoZnVuY3Rpb24oZT0ocHJvY2Vzcy5hcmd2WzFdP2YocHJvY2Vzcy5hcmd2WzFdKTpwcm9jZXNzLmN3ZCgpKSxuPSJcXCI9PT1yKXtjb25zdCB0PW4/cChlKTplO3JldHVybiBlPT57aWYoIWUpcmV0dXJuO2NvbnN0IHI9bj9wKGUpOmU7bGV0e2RpcjppLGJhc2U6cyxleHQ6Y309by5wYXJzZShyKTsiLmpzIiE9PWMmJiIubWpzIiE9PWMmJiIuY2pzIiE9PWN8fChzPXMuc2xpY2UoMCwtMSpjLmxlbmd0aCkpLGl8fChpPSIuIik7Y29uc3QgYT1pLmxhc3RJbmRleE9mKCIvbm9kZV9tb2R1bGVzIik7aWYoYT4tMSlyZXR1cm5gJHtpLnNsaWNlKGErMTQpLnJlcGxhY2UoL1wvL2csIi4iKX06JHtzfWA7aWYoaS5zdGFydHNXaXRoKHQpKXtsZXQgZT1pLnNsaWNlKHQubGVuZ3RoKzEpLnJlcGxhY2UoL1wvL2csIi4iKTtyZXR1cm4gZSYmKGUrPSI6IiksZSs9cyxlfXJldHVybiBzfX0oZy5iYXNlUGF0aCkpXSk7ZnVuY3Rpb24gYiguLi5lKXtnLmRlYnVnJiZjb25zb2xlLmxvZygiW0xvY2FsVmFyaWFibGVzIFdvcmtlcl0iLC4uLmUpfWFzeW5jIGZ1bmN0aW9uIHYoZSxuLHQsbyl7Y29uc3Qgcj1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOm4sb3duUHJvcGVydGllczohMH0pO29bdF09ci5yZXN1bHQuZmlsdGVyKChlPT4ibGVuZ3RoIiE9PWUubmFtZSYmIWlzTmFOKHBhcnNlSW50KGUubmFtZSwxMCkpKSkuc29ydCgoKGUsbik9PnBhcnNlSW50KGUubmFtZSwxMCktcGFyc2VJbnQobi5uYW1lLDEwKSkpLm1hcCgoZT0+ZS52YWx1ZT8udmFsdWUpKX1hc3luYyBmdW5jdGlvbiAkKGUsbix0LG8pe2NvbnN0IHI9YXdhaXQgZS5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLHtvYmplY3RJZDpuLG93blByb3BlcnRpZXM6ITB9KTtvW3RdPXIucmVzdWx0Lm1hcCgoZT0+W2UubmFtZSxlLnZhbHVlPy52YWx1ZV0pKS5yZWR1Y2UoKChlLFtuLHRdKT0+KGVbbl09dCxlKSkse30pfWZ1bmN0aW9uIHcoZSxuKXtlLnZhbHVlJiYoInZhbHVlImluIGUudmFsdWU/dm9pZCAwPT09ZS52YWx1ZS52YWx1ZXx8bnVsbD09PWUudmFsdWUudmFsdWU/bltlLm5hbWVdPWA8JHtlLnZhbHVlLnZhbHVlfT5gOm5bZS5uYW1lXT1lLnZhbHVlLnZhbHVlOiJkZXNjcmlwdGlvbiJpbiBlLnZhbHVlJiYiZnVuY3Rpb24iIT09ZS52YWx1ZS50eXBlP25bZS5uYW1lXT1gPCR7ZS52YWx1ZS5kZXNjcmlwdGlvbn0+YDoidW5kZWZpbmVkIj09PWUudmFsdWUudHlwZSYmKG5bZS5uYW1lXT0iPHVuZGVmaW5lZD4iKSl9YXN5bmMgZnVuY3Rpb24geShlLG4pe2NvbnN0IHQ9YXdhaXQgZS5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLHtvYmplY3RJZDpuLG93blByb3BlcnRpZXM6ITB9KSxvPXt9O2Zvcihjb25zdCBuIG9mIHQucmVzdWx0KWlmKG4/LnZhbHVlPy5vYmplY3RJZCYmIkFycmF5Ij09PW4/LnZhbHVlLmNsYXNzTmFtZSl7Y29uc3QgdD1uLnZhbHVlLm9iamVjdElkO2F3YWl0IHYoZSx0LG4ubmFtZSxvKX1lbHNlIGlmKG4/LnZhbHVlPy5vYmplY3RJZCYmIk9iamVjdCI9PT1uPy52YWx1ZT8uY2xhc3NOYW1lKXtjb25zdCB0PW4udmFsdWUub2JqZWN0SWQ7YXdhaXQgJChlLHQsbi5uYW1lLG8pfWVsc2Ugbj8udmFsdWUmJncobixvKTtyZXR1cm4gb31sZXQgaDsoYXN5bmMgZnVuY3Rpb24oKXtjb25zdCBuPW5ldyBlO24uY29ubmVjdFRvTWFpblRocmVhZCgpLGIoIkNvbm5lY3RlZCB0byBtYWluIHRocmVhZCIpO2xldCBvPSExO24ub24oIkRlYnVnZ2VyLnJlc3VtZWQiLCgoKT0+e289ITF9KSksbi5vbigiRGVidWdnZXIucGF1c2VkIiwoZT0+e289ITAsYXN5bmMgZnVuY3Rpb24oZSxuLHtyZWFzb246byxkYXRhOnIsY2FsbEZyYW1lczppfSl7aWYoImV4Y2VwdGlvbiIhPT1vJiYicHJvbWlzZVJlamVjdGlvbiIhPT1vKXJldHVybjtoPy4oKTtjb25zdCBzPWZ1bmN0aW9uKGUsbil7aWYodm9pZCAwIT09bilyZXR1cm4gZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09ZSlyZXR1cm4gZS5zbGljZSgtMTApLnJlZHVjZSgoKGUsbik9PmAke2V9LCR7bi5mdW5jdGlvbn0sJHtuLmxpbmVub30sJHtuLmNvbG5vfWApLCIiKX0oZShuLDEpKX0obixyPy5kZXNjcmlwdGlvbik7aWYobnVsbD09cylyZXR1cm47Y29uc3QgYz1bXTtmb3IobGV0IG49MDtuPGkubGVuZ3RoO24rKyl7Y29uc3R7c2NvcGVDaGFpbjp0LGZ1bmN0aW9uTmFtZTpvLHRoaXM6cn09aVtuXSxzPXQuZmluZCgoZT0+ImxvY2FsIj09PWUudHlwZSkpLGE9Imdsb2JhbCIhPT1yLmNsYXNzTmFtZSYmci5jbGFzc05hbWU/YCR7ci5jbGFzc05hbWV9LiR7b31gOm87aWYodm9pZCAwPT09cz8ub2JqZWN0Lm9iamVjdElkKWNbbl09e2Z1bmN0aW9uOmF9O2Vsc2V7Y29uc3QgdD1hd2FpdCB5KGUscy5vYmplY3Qub2JqZWN0SWQpO2Nbbl09e2Z1bmN0aW9uOmEsdmFyczp0fX19dD8ucG9zdE1lc3NhZ2Uoe2V4Y2VwdGlvbkhhc2g6cyxmcmFtZXM6Y30pfShuLG0sZS5wYXJhbXMpLnRoZW4oKCgpPT5vP24ucG9zdCgiRGVidWdnZXIucmVzdW1lIik6UHJvbWlzZS5yZXNvbHZlKCkpLChlPT57fSkpfSkpLGF3YWl0IG4ucG9zdCgiRGVidWdnZXIuZW5hYmxlIik7Y29uc3Qgcj0hMSE9PWcuY2FwdHVyZUFsbEV4Y2VwdGlvbnM7aWYoYXdhaXQgbi5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOnI/ImFsbCI6InVuY2F1Z2h0In0pLHIpe2NvbnN0IGU9Zy5tYXhFeGNlcHRpb25zUGVyU2Vjb25kfHw1MDtoPWZ1bmN0aW9uKGUsbix0KXtsZXQgbz0wLHI9NSxpPTA7cmV0dXJuIHNldEludGVydmFsKCgoKT0+ezA9PT1pP28+ZSYmKHIqPTIsdChyKSxyPjg2NDAwJiYocj04NjQwMCksaT1yKTooaS09MSwwPT09aSYmbigpKSxvPTB9KSwxZTMpLnVucmVmKCksKCk9PntvKz0xfX0oZSwoYXN5bmMoKT0+e2IoIlJhdGUtbGltaXQgbGlmdGVkLiIpLGF3YWl0IG4ucG9zdCgiRGVidWdnZXIuc2V0UGF1c2VPbkV4Y2VwdGlvbnMiLHtzdGF0ZToiYWxsIn0pfSksKGFzeW5jIGU9PntiKGBSYXRlLWxpbWl0IGV4Y2VlZGVkLiBEaXNhYmxpbmcgY2FwdHVyaW5nIG9mIGNhdWdodCBleGNlcHRpb25zIGZvciAke2V9IHNlY29uZHMuYCksYXdhaXQgbi5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOiJ1bmNhdWdodCJ9KX0pKX19KSgpLmNhdGNoKChlPT57YigiRmFpbGVkIHRvIHN0YXJ0IGRlYnVnZ2VyIixlKX0pKSxzZXRJbnRlcnZhbCgoKCk9Pnt9KSwxZTQpOw==';
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZSA4LjMuMCAoOGI5OWRlNykgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIGV9ZnJvbSJub2RlOmluc3BlY3Rvci9wcm9taXNlcyI7aW1wb3J0e3dvcmtlckRhdGEgYXMgbixwYXJlbnRQb3J0IGFzIHR9ZnJvbSJub2RlOndvcmtlcl90aHJlYWRzIjtpbXBvcnR7cG9zaXggYXMgbyxzZXAgYXMgcn1mcm9tIm5vZGU6cGF0aCI7Y29uc3QgaT01MCxzPSI/IixjPS9cKGVycm9yOiAoLiopXCkvLGE9L2NhcHR1cmVNZXNzYWdlfGNhcHR1cmVFeGNlcHRpb24vO2NvbnN0IHU9L14oXFMrOlxcfFwvPykoW1xzXFNdKj8pKCg/OlwuezEsMn18W14vXFxdKz98KShcLlteLi9cXF0qfCkpKD86Wy9cXF0qKSQvO2Z1bmN0aW9uIGYoZSl7Y29uc3Qgbj1mdW5jdGlvbihlKXtjb25zdCBuPWUubGVuZ3RoPjEwMjQ/YDx0cnVuY2F0ZWQ+JHtlLnNsaWNlKC0xMDI0KX1gOmUsdD11LmV4ZWMobik7cmV0dXJuIHQ/dC5zbGljZSgxKTpbXX0oZSksdD1uWzBdO2xldCBvPW5bMV07cmV0dXJuIHR8fG8/KG8mJihvPW8uc2xpY2UoMCxvLmxlbmd0aC0xKSksdCtvKToiLiJ9ZnVuY3Rpb24gbChlLG49ITEpe3JldHVybiEobnx8ZSYmIWUuc3RhcnRzV2l0aCgiLyIpJiYhZS5tYXRjaCgvXltBLVpdOi8pJiYhZS5zdGFydHNXaXRoKCIuIikmJiFlLm1hdGNoKC9eW2EtekEtWl0oW2EtekEtWjAtOS5cLStdKSo6XC9cLy8pKSYmdm9pZCAwIT09ZSYmIWUuaW5jbHVkZXMoIm5vZGVfbW9kdWxlcy8iKX1mdW5jdGlvbiBkKGUpe2NvbnN0IG49L15ccypbLV17NCx9JC8sdD0vYXQgKD86YXN5bmMgKT8oPzooLis/KVxzK1woKT8oPzooLispOihcZCspOihcZCspP3woW14pXSspKVwpPy87cmV0dXJuIG89Pntjb25zdCByPW8ubWF0Y2godCk7aWYocil7bGV0IG4sdCxvLGksYztpZihyWzFdKXtvPXJbMV07bGV0IGU9by5sYXN0SW5kZXhPZigiLiIpO2lmKCIuIj09PW9bZS0xXSYmZS0tLGU+MCl7bj1vLnNsaWNlKDAsZSksdD1vLnNsaWNlKGUrMSk7Y29uc3Qgcj1uLmluZGV4T2YoIi5Nb2R1bGUiKTtyPjAmJihvPW8uc2xpY2UocisxKSxuPW4uc2xpY2UoMCxyKSl9aT12b2lkIDB9dCYmKGk9bixjPXQpLCI8YW5vbnltb3VzPiI9PT10JiYoYz12b2lkIDAsbz12b2lkIDApLHZvaWQgMD09PW8mJihjPWN8fHMsbz1pP2Ake2l9LiR7Y31gOmMpO2xldCBhPXJbMl0mJnJbMl0uc3RhcnRzV2l0aCgiZmlsZTovLyIpP3JbMl0uc2xpY2UoNyk6clsyXTtjb25zdCB1PSJuYXRpdmUiPT09cls1XTtyZXR1cm4gYSYmYS5tYXRjaCgvXC9bQS1aXTovKSYmKGE9YS5zbGljZSgxKSksYXx8IXJbNV18fHV8fChhPXJbNV0pLHtmaWxlbmFtZTphLG1vZHVsZTplP2UoYSk6dm9pZCAwLGZ1bmN0aW9uOm8sbGluZW5vOnBhcnNlSW50KHJbM10sMTApfHx2b2lkIDAsY29sbm86cGFyc2VJbnQocls0XSwxMCl8fHZvaWQgMCxpbl9hcHA6bChhLHUpfX1pZihvLm1hdGNoKG4pKXJldHVybntmaWxlbmFtZTpvfX19ZnVuY3Rpb24gcChlKXtyZXR1cm4gZS5yZXBsYWNlKC9eW0EtWl06LywiIikucmVwbGFjZSgvXFwvZywiLyIpfWNvbnN0IGc9bixtPWZ1bmN0aW9uKC4uLmUpe2NvbnN0IG49ZS5zb3J0KCgoZSxuKT0+ZVswXS1uWzBdKSkubWFwKChlPT5lWzFdKSk7cmV0dXJuKGUsdD0wLG89MCk9Pntjb25zdCByPVtdLHU9ZS5zcGxpdCgiXG4iKTtmb3IobGV0IGU9dDtlPHUubGVuZ3RoO2UrKyl7Y29uc3QgdD11W2VdO2lmKHQubGVuZ3RoPjEwMjQpY29udGludWU7Y29uc3Qgcz1jLnRlc3QodCk/dC5yZXBsYWNlKGMsIiQxIik6dDtpZighcy5tYXRjaCgvXFMqRXJyb3I6IC8pKXtmb3IoY29uc3QgZSBvZiBuKXtjb25zdCBuPWUocyk7aWYobil7ci5wdXNoKG4pO2JyZWFrfX1pZihyLmxlbmd0aD49aStvKWJyZWFrfX1yZXR1cm4gZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RoKXJldHVybltdO2NvbnN0IG49QXJyYXkuZnJvbShlKTsvc2VudHJ5V3JhcHBlZC8udGVzdChuW24ubGVuZ3RoLTFdLmZ1bmN0aW9ufHwiIikmJm4ucG9wKCk7bi5yZXZlcnNlKCksYS50ZXN0KG5bbi5sZW5ndGgtMV0uZnVuY3Rpb258fCIiKSYmKG4ucG9wKCksYS50ZXN0KG5bbi5sZW5ndGgtMV0uZnVuY3Rpb258fCIiKSYmbi5wb3AoKSk7cmV0dXJuIG4uc2xpY2UoMCxpKS5tYXAoKGU9Pih7Li4uZSxmaWxlbmFtZTplLmZpbGVuYW1lfHxuW24ubGVuZ3RoLTFdLmZpbGVuYW1lLGZ1bmN0aW9uOmUuZnVuY3Rpb258fHN9KSkpfShyLnNsaWNlKG8pKX19KFs5MCxkKGZ1bmN0aW9uKGU9KHByb2Nlc3MuYXJndlsxXT9mKHByb2Nlc3MuYXJndlsxXSk6cHJvY2Vzcy5jd2QoKSksbj0iXFwiPT09cil7Y29uc3QgdD1uP3AoZSk6ZTtyZXR1cm4gZT0+e2lmKCFlKXJldHVybjtjb25zdCByPW4/cChlKTplO2xldHtkaXI6aSxiYXNlOnMsZXh0OmN9PW8ucGFyc2Uocik7Ii5qcyIhPT1jJiYiLm1qcyIhPT1jJiYiLmNqcyIhPT1jfHwocz1zLnNsaWNlKDAsLTEqYy5sZW5ndGgpKSxpfHwoaT0iLiIpO2NvbnN0IGE9aS5sYXN0SW5kZXhPZigiL25vZGVfbW9kdWxlcyIpO2lmKGE+LTEpcmV0dXJuYCR7aS5zbGljZShhKzE0KS5yZXBsYWNlKC9cLy9nLCIuIil9OiR7c31gO2lmKGkuc3RhcnRzV2l0aCh0KSl7bGV0IGU9aS5zbGljZSh0Lmxlbmd0aCsxKS5yZXBsYWNlKC9cLy9nLCIuIik7cmV0dXJuIGUmJihlKz0iOiIpLGUrPXMsZX1yZXR1cm4gc319KGcuYmFzZVBhdGgpKV0pO2Z1bmN0aW9uIGIoLi4uZSl7Zy5kZWJ1ZyYmY29uc29sZS5sb2coIltMb2NhbFZhcmlhYmxlcyBXb3JrZXJdIiwuLi5lKX1hc3luYyBmdW5jdGlvbiB2KGUsbix0LG8pe2NvbnN0IHI9YXdhaXQgZS5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLHtvYmplY3RJZDpuLG93blByb3BlcnRpZXM6ITB9KTtvW3RdPXIucmVzdWx0LmZpbHRlcigoZT0+Imxlbmd0aCIhPT1lLm5hbWUmJiFpc05hTihwYXJzZUludChlLm5hbWUsMTApKSkpLnNvcnQoKChlLG4pPT5wYXJzZUludChlLm5hbWUsMTApLXBhcnNlSW50KG4ubmFtZSwxMCkpKS5tYXAoKGU9PmUudmFsdWU/LnZhbHVlKSl9YXN5bmMgZnVuY3Rpb24gJChlLG4sdCxvKXtjb25zdCByPWF3YWl0IGUucG9zdCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIix7b2JqZWN0SWQ6bixvd25Qcm9wZXJ0aWVzOiEwfSk7b1t0XT1yLnJlc3VsdC5tYXAoKGU9PltlLm5hbWUsZS52YWx1ZT8udmFsdWVdKSkucmVkdWNlKCgoZSxbbix0XSk9PihlW25dPXQsZSkpLHt9KX1mdW5jdGlvbiB3KGUsbil7ZS52YWx1ZSYmKCJ2YWx1ZSJpbiBlLnZhbHVlP3ZvaWQgMD09PWUudmFsdWUudmFsdWV8fG51bGw9PT1lLnZhbHVlLnZhbHVlP25bZS5uYW1lXT1gPCR7ZS52YWx1ZS52YWx1ZX0+YDpuW2UubmFtZV09ZS52YWx1ZS52YWx1ZToiZGVzY3JpcHRpb24iaW4gZS52YWx1ZSYmImZ1bmN0aW9uIiE9PWUudmFsdWUudHlwZT9uW2UubmFtZV09YDwke2UudmFsdWUuZGVzY3JpcHRpb259PmA6InVuZGVmaW5lZCI9PT1lLnZhbHVlLnR5cGUmJihuW2UubmFtZV09Ijx1bmRlZmluZWQ+IikpfWFzeW5jIGZ1bmN0aW9uIHkoZSxuKXtjb25zdCB0PWF3YWl0IGUucG9zdCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIix7b2JqZWN0SWQ6bixvd25Qcm9wZXJ0aWVzOiEwfSksbz17fTtmb3IoY29uc3QgbiBvZiB0LnJlc3VsdClpZihuPy52YWx1ZT8ub2JqZWN0SWQmJiJBcnJheSI9PT1uPy52YWx1ZS5jbGFzc05hbWUpe2NvbnN0IHQ9bi52YWx1ZS5vYmplY3RJZDthd2FpdCB2KGUsdCxuLm5hbWUsbyl9ZWxzZSBpZihuPy52YWx1ZT8ub2JqZWN0SWQmJiJPYmplY3QiPT09bj8udmFsdWU/LmNsYXNzTmFtZSl7Y29uc3QgdD1uLnZhbHVlLm9iamVjdElkO2F3YWl0ICQoZSx0LG4ubmFtZSxvKX1lbHNlIG4/LnZhbHVlJiZ3KG4sbyk7cmV0dXJuIG99bGV0IGg7KGFzeW5jIGZ1bmN0aW9uKCl7Y29uc3Qgbj1uZXcgZTtuLmNvbm5lY3RUb01haW5UaHJlYWQoKSxiKCJDb25uZWN0ZWQgdG8gbWFpbiB0aHJlYWQiKTtsZXQgbz0hMTtuLm9uKCJEZWJ1Z2dlci5yZXN1bWVkIiwoKCk9PntvPSExfSkpLG4ub24oIkRlYnVnZ2VyLnBhdXNlZCIsKGU9PntvPSEwLGFzeW5jIGZ1bmN0aW9uKGUsbix7cmVhc29uOm8sZGF0YTpyLGNhbGxGcmFtZXM6aX0pe2lmKCJleGNlcHRpb24iIT09byYmInByb21pc2VSZWplY3Rpb24iIT09bylyZXR1cm47aD8uKCk7Y29uc3Qgcz1mdW5jdGlvbihlLG4pe2lmKHZvaWQgMCE9PW4pcmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PWUpcmV0dXJuIGUuc2xpY2UoLTEwKS5yZWR1Y2UoKChlLG4pPT5gJHtlfSwke24uZnVuY3Rpb259LCR7bi5saW5lbm99LCR7bi5jb2xub31gKSwiIil9KGUobiwxKSl9KG4scj8uZGVzY3JpcHRpb24pO2lmKG51bGw9PXMpcmV0dXJuO2NvbnN0IGM9W107Zm9yKGxldCBuPTA7bjxpLmxlbmd0aDtuKyspe2NvbnN0e3Njb3BlQ2hhaW46dCxmdW5jdGlvbk5hbWU6byx0aGlzOnJ9PWlbbl0scz10LmZpbmQoKGU9PiJsb2NhbCI9PT1lLnR5cGUpKSxhPSJnbG9iYWwiIT09ci5jbGFzc05hbWUmJnIuY2xhc3NOYW1lP2Ake3IuY2xhc3NOYW1lfS4ke299YDpvO2lmKHZvaWQgMD09PXM/Lm9iamVjdC5vYmplY3RJZCljW25dPXtmdW5jdGlvbjphfTtlbHNle2NvbnN0IHQ9YXdhaXQgeShlLHMub2JqZWN0Lm9iamVjdElkKTtjW25dPXtmdW5jdGlvbjphLHZhcnM6dH19fXQ/LnBvc3RNZXNzYWdlKHtleGNlcHRpb25IYXNoOnMsZnJhbWVzOmN9KX0obixtLGUucGFyYW1zKS50aGVuKCgoKT0+bz9uLnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpOlByb21pc2UucmVzb2x2ZSgpKSwoZT0+e30pKX0pKSxhd2FpdCBuLnBvc3QoIkRlYnVnZ2VyLmVuYWJsZSIpO2NvbnN0IHI9ITEhPT1nLmNhcHR1cmVBbGxFeGNlcHRpb25zO2lmKGF3YWl0IG4ucG9zdCgiRGVidWdnZXIuc2V0UGF1c2VPbkV4Y2VwdGlvbnMiLHtzdGF0ZTpyPyJhbGwiOiJ1bmNhdWdodCJ9KSxyKXtjb25zdCBlPWcubWF4RXhjZXB0aW9uc1BlclNlY29uZHx8NTA7aD1mdW5jdGlvbihlLG4sdCl7bGV0IG89MCxyPTUsaT0wO3JldHVybiBzZXRJbnRlcnZhbCgoKCk9PnswPT09aT9vPmUmJihyKj0yLHQocikscj44NjQwMCYmKHI9ODY0MDApLGk9cik6KGktPTEsMD09PWkmJm4oKSksbz0wfSksMWUzKS51bnJlZigpLCgpPT57bys9MX19KGUsKGFzeW5jKCk9PntiKCJSYXRlLWxpbWl0IGxpZnRlZC4iKSxhd2FpdCBuLnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6ImFsbCJ9KX0pLChhc3luYyBlPT57YihgUmF0ZS1saW1pdCBleGNlZWRlZC4gRGlzYWJsaW5nIGNhcHR1cmluZyBvZiBjYXVnaHQgZXhjZXB0aW9ucyBmb3IgJHtlfSBzZWNvbmRzLmApLGF3YWl0IG4ucG9zdCgiRGVidWdnZXIuc2V0UGF1c2VPbkV4Y2VwdGlvbnMiLHtzdGF0ZToidW5jYXVnaHQifSl9KSl9fSkoKS5jYXRjaCgoZT0+e2IoIkZhaWxlZCB0byBzdGFydCBkZWJ1Z2dlciIsZSl9KSksc2V0SW50ZXJ2YWwoKCgpPT57fSksMWU0KTs=';

@@ -10,0 +10,0 @@ function log(...args) {

import { _optionalChain } from '@sentry/utils';
import { Session } from 'node:inspector';
import { defineIntegration, getClient } from '@sentry/core';
import { LRUMap, logger } from '@sentry/utils';
import { Session } from 'inspector';
import { NODE_MAJOR } from '../../nodeVersion.js';

@@ -6,0 +6,0 @@ import { createRateLimiter, hashFromStack, hashFrames, functionNamesMatch } from './common.js';

@@ -1,2 +0,2 @@

/*! @sentry/node 8.2.1 (bb2f1bc) | https://github.com/getsentry/sentry-javascript */
import{Session as e}from"node:inspector/promises";import{workerData as n,parentPort as t}from"worker_threads";import{posix as o,sep as r}from"path";const i=50,s="?",c=/\(error: (.*)\)/,a=/captureMessage|captureException/;const u=/^(\S+:\\|\/?)([\s\S]*?)((?:\.{1,2}|[^/\\]+?|)(\.[^./\\]*|))(?:[/\\]*)$/;function f(e){const n=function(e){const n=e.length>1024?`<truncated>${e.slice(-1024)}`:e,t=u.exec(n);return t?t.slice(1):[]}(e),t=n[0];let o=n[1];return t||o?(o&&(o=o.slice(0,o.length-1)),t+o):"."}function l(e,n=!1){return!(n||e&&!e.startsWith("/")&&!e.match(/^[A-Z]:/)&&!e.startsWith(".")&&!e.match(/^[a-zA-Z]([a-zA-Z0-9.\-+])*:\/\//))&&void 0!==e&&!e.includes("node_modules/")}function d(e){const n=/^\s*[-]{4,}$/,t=/at (?:async )?(?:(.+?)\s+\()?(?:(.+):(\d+):(\d+)?|([^)]+))\)?/;return o=>{const r=o.match(t);if(r){let n,t,o,i,c;if(r[1]){o=r[1];let e=o.lastIndexOf(".");if("."===o[e-1]&&e--,e>0){n=o.slice(0,e),t=o.slice(e+1);const r=n.indexOf(".Module");r>0&&(o=o.slice(r+1),n=n.slice(0,r))}i=void 0}t&&(i=n,c=t),"<anonymous>"===t&&(c=void 0,o=void 0),void 0===o&&(c=c||s,o=i?`${i}.${c}`:c);let a=r[2]&&r[2].startsWith("file://")?r[2].slice(7):r[2];const u="native"===r[5];return a&&a.match(/\/[A-Z]:/)&&(a=a.slice(1)),a||!r[5]||u||(a=r[5]),{filename:a,module:e?e(a):void 0,function:o,lineno:parseInt(r[3],10)||void 0,colno:parseInt(r[4],10)||void 0,in_app:l(a,u)}}if(o.match(n))return{filename:o}}}function p(e){return e.replace(/^[A-Z]:/,"").replace(/\\/g,"/")}const g=n,m=function(...e){const n=e.sort(((e,n)=>e[0]-n[0])).map((e=>e[1]));return(e,t=0,o=0)=>{const r=[],u=e.split("\n");for(let e=t;e<u.length;e++){const t=u[e];if(t.length>1024)continue;const s=c.test(t)?t.replace(c,"$1"):t;if(!s.match(/\S*Error: /)){for(const e of n){const n=e(s);if(n){r.push(n);break}}if(r.length>=i+o)break}}return function(e){if(!e.length)return[];const n=Array.from(e);/sentryWrapped/.test(n[n.length-1].function||"")&&n.pop();n.reverse(),a.test(n[n.length-1].function||"")&&(n.pop(),a.test(n[n.length-1].function||"")&&n.pop());return n.slice(0,i).map((e=>({...e,filename:e.filename||n[n.length-1].filename,function:e.function||s})))}(r.slice(o))}}([90,d(function(e=(process.argv[1]?f(process.argv[1]):process.cwd()),n="\\"===r){const t=n?p(e):e;return e=>{if(!e)return;const r=n?p(e):e;let{dir:i,base:s,ext:c}=o.parse(r);".js"!==c&&".mjs"!==c&&".cjs"!==c||(s=s.slice(0,-1*c.length)),i||(i=".");const a=i.lastIndexOf("/node_modules");if(a>-1)return`${i.slice(a+14).replace(/\//g,".")}:${s}`;if(i.startsWith(t)){let e=i.slice(t.length+1).replace(/\//g,".");return e&&(e+=":"),e+=s,e}return s}}(g.basePath))]);function b(...e){g.debug&&console.log("[LocalVariables Worker]",...e)}async function v(e,n,t,o){const r=await e.post("Runtime.getProperties",{objectId:n,ownProperties:!0});o[t]=r.result.filter((e=>"length"!==e.name&&!isNaN(parseInt(e.name,10)))).sort(((e,n)=>parseInt(e.name,10)-parseInt(n.name,10))).map((e=>e.value?.value))}async function $(e,n,t,o){const r=await e.post("Runtime.getProperties",{objectId:n,ownProperties:!0});o[t]=r.result.map((e=>[e.name,e.value?.value])).reduce(((e,[n,t])=>(e[n]=t,e)),{})}function w(e,n){e.value&&("value"in e.value?void 0===e.value.value||null===e.value.value?n[e.name]=`<${e.value.value}>`:n[e.name]=e.value.value:"description"in e.value&&"function"!==e.value.type?n[e.name]=`<${e.value.description}>`:"undefined"===e.value.type&&(n[e.name]="<undefined>"))}async function y(e,n){const t=await e.post("Runtime.getProperties",{objectId:n,ownProperties:!0}),o={};for(const n of t.result)if(n?.value?.objectId&&"Array"===n?.value.className){const t=n.value.objectId;await v(e,t,n.name,o)}else if(n?.value?.objectId&&"Object"===n?.value?.className){const t=n.value.objectId;await $(e,t,n.name,o)}else n?.value&&w(n,o);return o}let h;(async function(){const n=new e;n.connectToMainThread(),b("Connected to main thread");let o=!1;n.on("Debugger.resumed",(()=>{o=!1})),n.on("Debugger.paused",(e=>{o=!0,async function(e,n,{reason:o,data:r,callFrames:i}){if("exception"!==o&&"promiseRejection"!==o)return;h?.();const s=function(e,n){if(void 0!==n)return function(e){if(void 0!==e)return e.slice(-10).reduce(((e,n)=>`${e},${n.function},${n.lineno},${n.colno}`),"")}(e(n,1))}(n,r?.description);if(null==s)return;const c=[];for(let n=0;n<i.length;n++){const{scopeChain:t,functionName:o,this:r}=i[n],s=t.find((e=>"local"===e.type)),a="global"!==r.className&&r.className?`${r.className}.${o}`:o;if(void 0===s?.object.objectId)c[n]={function:a};else{const t=await y(e,s.object.objectId);c[n]={function:a,vars:t}}}t?.postMessage({exceptionHash:s,frames:c})}(n,m,e.params).then((()=>o?n.post("Debugger.resume"):Promise.resolve()),(e=>{}))})),await n.post("Debugger.enable");const r=!1!==g.captureAllExceptions;if(await n.post("Debugger.setPauseOnExceptions",{state:r?"all":"uncaught"}),r){const e=g.maxExceptionsPerSecond||50;h=function(e,n,t){let o=0,r=5,i=0;return setInterval((()=>{0===i?o>e&&(r*=2,t(r),r>86400&&(r=86400),i=r):(i-=1,0===i&&n()),o=0}),1e3).unref(),()=>{o+=1}}(e,(async()=>{b("Rate-limit lifted."),await n.post("Debugger.setPauseOnExceptions",{state:"all"})}),(async e=>{b(`Rate-limit exceeded. Disabling capturing of caught exceptions for ${e} seconds.`),await n.post("Debugger.setPauseOnExceptions",{state:"uncaught"})}))}})().catch((e=>{b("Failed to start debugger",e)})),setInterval((()=>{}),1e4);
/*! @sentry/node 8.3.0 (8b99de7) | https://github.com/getsentry/sentry-javascript */
import{Session as e}from"node:inspector/promises";import{workerData as n,parentPort as t}from"node:worker_threads";import{posix as o,sep as r}from"node:path";const i=50,s="?",c=/\(error: (.*)\)/,a=/captureMessage|captureException/;const u=/^(\S+:\\|\/?)([\s\S]*?)((?:\.{1,2}|[^/\\]+?|)(\.[^./\\]*|))(?:[/\\]*)$/;function f(e){const n=function(e){const n=e.length>1024?`<truncated>${e.slice(-1024)}`:e,t=u.exec(n);return t?t.slice(1):[]}(e),t=n[0];let o=n[1];return t||o?(o&&(o=o.slice(0,o.length-1)),t+o):"."}function l(e,n=!1){return!(n||e&&!e.startsWith("/")&&!e.match(/^[A-Z]:/)&&!e.startsWith(".")&&!e.match(/^[a-zA-Z]([a-zA-Z0-9.\-+])*:\/\//))&&void 0!==e&&!e.includes("node_modules/")}function d(e){const n=/^\s*[-]{4,}$/,t=/at (?:async )?(?:(.+?)\s+\()?(?:(.+):(\d+):(\d+)?|([^)]+))\)?/;return o=>{const r=o.match(t);if(r){let n,t,o,i,c;if(r[1]){o=r[1];let e=o.lastIndexOf(".");if("."===o[e-1]&&e--,e>0){n=o.slice(0,e),t=o.slice(e+1);const r=n.indexOf(".Module");r>0&&(o=o.slice(r+1),n=n.slice(0,r))}i=void 0}t&&(i=n,c=t),"<anonymous>"===t&&(c=void 0,o=void 0),void 0===o&&(c=c||s,o=i?`${i}.${c}`:c);let a=r[2]&&r[2].startsWith("file://")?r[2].slice(7):r[2];const u="native"===r[5];return a&&a.match(/\/[A-Z]:/)&&(a=a.slice(1)),a||!r[5]||u||(a=r[5]),{filename:a,module:e?e(a):void 0,function:o,lineno:parseInt(r[3],10)||void 0,colno:parseInt(r[4],10)||void 0,in_app:l(a,u)}}if(o.match(n))return{filename:o}}}function p(e){return e.replace(/^[A-Z]:/,"").replace(/\\/g,"/")}const g=n,m=function(...e){const n=e.sort(((e,n)=>e[0]-n[0])).map((e=>e[1]));return(e,t=0,o=0)=>{const r=[],u=e.split("\n");for(let e=t;e<u.length;e++){const t=u[e];if(t.length>1024)continue;const s=c.test(t)?t.replace(c,"$1"):t;if(!s.match(/\S*Error: /)){for(const e of n){const n=e(s);if(n){r.push(n);break}}if(r.length>=i+o)break}}return function(e){if(!e.length)return[];const n=Array.from(e);/sentryWrapped/.test(n[n.length-1].function||"")&&n.pop();n.reverse(),a.test(n[n.length-1].function||"")&&(n.pop(),a.test(n[n.length-1].function||"")&&n.pop());return n.slice(0,i).map((e=>({...e,filename:e.filename||n[n.length-1].filename,function:e.function||s})))}(r.slice(o))}}([90,d(function(e=(process.argv[1]?f(process.argv[1]):process.cwd()),n="\\"===r){const t=n?p(e):e;return e=>{if(!e)return;const r=n?p(e):e;let{dir:i,base:s,ext:c}=o.parse(r);".js"!==c&&".mjs"!==c&&".cjs"!==c||(s=s.slice(0,-1*c.length)),i||(i=".");const a=i.lastIndexOf("/node_modules");if(a>-1)return`${i.slice(a+14).replace(/\//g,".")}:${s}`;if(i.startsWith(t)){let e=i.slice(t.length+1).replace(/\//g,".");return e&&(e+=":"),e+=s,e}return s}}(g.basePath))]);function b(...e){g.debug&&console.log("[LocalVariables Worker]",...e)}async function v(e,n,t,o){const r=await e.post("Runtime.getProperties",{objectId:n,ownProperties:!0});o[t]=r.result.filter((e=>"length"!==e.name&&!isNaN(parseInt(e.name,10)))).sort(((e,n)=>parseInt(e.name,10)-parseInt(n.name,10))).map((e=>e.value?.value))}async function $(e,n,t,o){const r=await e.post("Runtime.getProperties",{objectId:n,ownProperties:!0});o[t]=r.result.map((e=>[e.name,e.value?.value])).reduce(((e,[n,t])=>(e[n]=t,e)),{})}function w(e,n){e.value&&("value"in e.value?void 0===e.value.value||null===e.value.value?n[e.name]=`<${e.value.value}>`:n[e.name]=e.value.value:"description"in e.value&&"function"!==e.value.type?n[e.name]=`<${e.value.description}>`:"undefined"===e.value.type&&(n[e.name]="<undefined>"))}async function y(e,n){const t=await e.post("Runtime.getProperties",{objectId:n,ownProperties:!0}),o={};for(const n of t.result)if(n?.value?.objectId&&"Array"===n?.value.className){const t=n.value.objectId;await v(e,t,n.name,o)}else if(n?.value?.objectId&&"Object"===n?.value?.className){const t=n.value.objectId;await $(e,t,n.name,o)}else n?.value&&w(n,o);return o}let h;(async function(){const n=new e;n.connectToMainThread(),b("Connected to main thread");let o=!1;n.on("Debugger.resumed",(()=>{o=!1})),n.on("Debugger.paused",(e=>{o=!0,async function(e,n,{reason:o,data:r,callFrames:i}){if("exception"!==o&&"promiseRejection"!==o)return;h?.();const s=function(e,n){if(void 0!==n)return function(e){if(void 0!==e)return e.slice(-10).reduce(((e,n)=>`${e},${n.function},${n.lineno},${n.colno}`),"")}(e(n,1))}(n,r?.description);if(null==s)return;const c=[];for(let n=0;n<i.length;n++){const{scopeChain:t,functionName:o,this:r}=i[n],s=t.find((e=>"local"===e.type)),a="global"!==r.className&&r.className?`${r.className}.${o}`:o;if(void 0===s?.object.objectId)c[n]={function:a};else{const t=await y(e,s.object.objectId);c[n]={function:a,vars:t}}}t?.postMessage({exceptionHash:s,frames:c})}(n,m,e.params).then((()=>o?n.post("Debugger.resume"):Promise.resolve()),(e=>{}))})),await n.post("Debugger.enable");const r=!1!==g.captureAllExceptions;if(await n.post("Debugger.setPauseOnExceptions",{state:r?"all":"uncaught"}),r){const e=g.maxExceptionsPerSecond||50;h=function(e,n,t){let o=0,r=5,i=0;return setInterval((()=>{0===i?o>e&&(r*=2,t(r),r>86400&&(r=86400),i=r):(i-=1,0===i&&n()),o=0}),1e3).unref(),()=>{o+=1}}(e,(async()=>{b("Rate-limit lifted."),await n.post("Debugger.setPauseOnExceptions",{state:"all"})}),(async e=>{b(`Rate-limit exceeded. Disabling capturing of caught exceptions for ${e} seconds.`),await n.post("Debugger.setPauseOnExceptions",{state:"uncaught"})}))}})().catch((e=>{b("Failed to start debugger",e)})),setInterval((()=>{}),1e4);

@@ -1,3 +0,3 @@

import { existsSync, readFileSync } from 'fs';
import { dirname, join } from 'path';
import { existsSync, readFileSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { defineIntegration } from '@sentry/core';

@@ -4,0 +4,0 @@

@@ -1,5 +0,4 @@

import { SpanKind } from '@opentelemetry/api';
import { defineIntegration, addBreadcrumb } from '@sentry/core';
import { addOpenTelemetryInstrumentation, getSpanKind, getRequestSpanData } from '@sentry/opentelemetry';
import { logger } from '@sentry/utils';
import { addOpenTelemetryInstrumentation } from '@sentry/opentelemetry';
import { logger, parseUrl, getSanitizedUrlString } from '@sentry/utils';
import { DEBUG_BUILD } from '../debug-build.js';

@@ -22,3 +21,16 @@ import { NODE_MAJOR } from '../nodeVersion.js';

const pkg = await import('opentelemetry-instrumentation-fetch-node');
return new pkg.FetchInstrumentation({
const { FetchInstrumentation } = pkg;
class SentryNodeFetchInstrumentation extends FetchInstrumentation {
// We extend this method so we have access to request _and_ response for the breadcrumb
onHeaders({ request, response }) {
if (_breadcrumbs) {
_addRequestBreadcrumb(request, response);
}
return super.onHeaders({ request, response });
}
}
return new SentryNodeFetchInstrumentation({
ignoreRequestHook: (request) => {

@@ -30,6 +42,2 @@ const url = request.origin;

_updateSpan(span);
if (_breadcrumbs) {
_addRequestBreadcrumb(span);
}
},

@@ -65,18 +73,46 @@ // eslint-disable-next-line @typescript-eslint/no-explicit-any

/** Add a breadcrumb for outgoing requests. */
function _addRequestBreadcrumb(span) {
if (getSpanKind(span) !== SpanKind.CLIENT) {
return;
}
function _addRequestBreadcrumb(request, response) {
const data = getBreadcrumbData(request);
const data = getRequestSpanData(span);
addBreadcrumb({
category: 'http',
data: {
...data,
addBreadcrumb(
{
category: 'http',
data: {
status_code: response.statusCode,
...data,
},
type: 'http',
},
type: 'http',
});
{
event: 'response',
request,
response,
},
);
}
function getBreadcrumbData(request) {
try {
const url = new URL(request.path, request.origin);
const parsedUrl = parseUrl(url.toString());
const data = {
url: getSanitizedUrlString(parsedUrl),
'http.method': request.method || 'GET',
};
if (parsedUrl.search) {
data['http.query'] = parsedUrl.search;
}
if (parsedUrl.hash) {
data['http.fragment'] = parsedUrl.hash;
}
return data;
} catch (e) {
return {};
}
}
export { nativeNodeFetchIntegration };
//# sourceMappingURL=node-fetch.js.map

@@ -1,2 +0,2 @@

import * as http from 'http';
import * as http from 'node:http';
import { defineIntegration } from '@sentry/core';

@@ -3,0 +3,0 @@ import { logger, serializeEnvelope } from '@sentry/utils';

@@ -1,6 +0,5 @@

import { isWrapped } from '@opentelemetry/core';
import { ConnectInstrumentation } from '@opentelemetry/instrumentation-connect';
import { defineIntegration, isEnabled, captureException } from '@sentry/core';
import { defineIntegration, getClient, spanToJSON, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, captureException } from '@sentry/core';
import { addOpenTelemetryInstrumentation } from '@sentry/opentelemetry';
import { consoleSandbox } from '@sentry/utils';
import { ensureIsWrapped } from '../../utils/ensureIsWrapped.js';

@@ -27,13 +26,39 @@ const _connectIntegration = (() => {

if (!isWrapped(app.use) && isEnabled()) {
consoleSandbox(() => {
// eslint-disable-next-line no-console
console.warn(
'[Sentry] Connect is not instrumented. This is likely because you required/imported connect before calling `Sentry.init()`.',
);
// Sadly, ConnectInstrumentation has no requestHook, so we need to add the attributes here
// We register this hook in this method, because if we register it in the integration `setup`,
// it would always run even for users that are not even using connect
const client = getClient();
if (client) {
client.on('spanStart', span => {
addConnectSpanAttributes(span);
});
}
ensureIsWrapped(app.use, 'connect');
};
function addConnectSpanAttributes(span) {
const attributes = spanToJSON(span).data || {};
// this is one of: middleware, request_handler
const type = attributes['connect.type'];
// If this is already set, or we have no connect span, no need to process again...
if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] || !type) {
return;
}
span.setAttributes({
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.otel.connect',
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${type}.connect`,
});
// Also update the name, we don't need to "middleware - " prefix
const name = attributes['connect.name'];
if (typeof name === 'string') {
span.updateName(name);
}
}
export { connectIntegration, setupConnectErrorHandler };
//# sourceMappingURL=connect.js.map
import { _optionalChain } from '@sentry/utils';
import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express';
import { defineIntegration, getIsolationScope, getDefaultIsolationScope, getClient, captureException, isEnabled } from '@sentry/core';
import { defineIntegration, spanToJSON, SEMANTIC_ATTRIBUTE_SENTRY_OP, getIsolationScope, getDefaultIsolationScope, getClient, captureException } from '@sentry/core';
import { addOpenTelemetryInstrumentation } from '@sentry/opentelemetry';
import { isWrapped } from '@opentelemetry/core';
import { logger, consoleSandbox } from '@sentry/utils';
import { logger } from '@sentry/utils';
import { DEBUG_BUILD } from '../../debug-build.js';
import { addOriginToSpan } from '../../utils/addOriginToSpan.js';
import { ensureIsWrapped } from '../../utils/ensureIsWrapped.js';

@@ -18,2 +18,16 @@ const _expressIntegration = (() => {

addOriginToSpan(span, 'auto.http.otel.express');
const attributes = spanToJSON(span).data || {};
// this is one of: middleware, request_handler, router
const type = attributes['express.type'];
if (type) {
span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_OP, `${type}.express`);
}
// Also update the name, we don't need to "middleware - " prefix
const name = attributes['express.name'];
if (typeof name === 'string') {
span.updateName(name);
}
},

@@ -98,11 +112,3 @@ spanNameHook(info, defaultName) {

app.use(expressErrorHandler());
if (!isWrapped(app.use) && isEnabled()) {
consoleSandbox(() => {
// eslint-disable-next-line no-console
console.warn(
'[Sentry] Express is not instrumented. This is likely because you required/imported express before calling `Sentry.init()`.',
);
});
}
ensureIsWrapped(app.use, 'express');
}

@@ -109,0 +115,0 @@

import { _optionalChain } from '@sentry/utils';
import { isWrapped } from '@opentelemetry/core';
import { FastifyInstrumentation } from '@opentelemetry/instrumentation-fastify';
import { defineIntegration, captureException, getIsolationScope, isEnabled } from '@sentry/core';
import { defineIntegration, captureException, getIsolationScope, getClient, spanToJSON, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
import { addOpenTelemetryInstrumentation } from '@sentry/opentelemetry';
import { consoleSandbox } from '@sentry/utils';
import { addOriginToSpan } from '../../utils/addOriginToSpan.js';
import { ensureIsWrapped } from '../../utils/ensureIsWrapped.js';
// We inline the types we care about here
const _fastifyIntegration = (() => {

@@ -16,3 +16,3 @@ return {

requestHook(span) {
addOriginToSpan(span, 'auto.http.otel.fastify');
addFastifySpanAttributes(span);
},

@@ -32,4 +32,2 @@ }),

// We inline the types we care about here
/**

@@ -69,13 +67,40 @@ * Setup an error handler for Fastify.

if (!isWrapped(fastify.addHook) && isEnabled()) {
consoleSandbox(() => {
// eslint-disable-next-line no-console
console.warn(
'[Sentry] Fastify is not instrumented. This is likely because you required/imported fastify before calling `Sentry.init()`.',
);
// Sadly, middleware spans do not go through `requestHook`, so we handle those here
// We register this hook in this method, because if we register it in the integration `setup`,
// it would always run even for users that are not even using fastify
const client = getClient();
if (client) {
client.on('spanStart', span => {
addFastifySpanAttributes(span);
});
}
ensureIsWrapped(fastify.addHook, 'fastify');
}
function addFastifySpanAttributes(span) {
const attributes = spanToJSON(span).data || {};
// this is one of: middleware, request_handler
const type = attributes['fastify.type'];
// If this is already set, or we have no fastify span, no need to process again...
if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] || !type) {
return;
}
span.setAttributes({
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.otel.fastify',
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${type}.fastify`,
});
// Also update the name, we don't need to "middleware - " prefix
const name = attributes['fastify.name'] || attributes['plugin.name'] || attributes['hook.name'];
if (typeof name === 'string') {
// Also remove `fastify -> ` prefix
span.updateName(name.replace(/^fastify -> /, ''));
}
}
export { fastifyIntegration, setupFastifyErrorHandler };
//# sourceMappingURL=fastify.js.map

@@ -6,3 +6,9 @@ import { GraphQLInstrumentation } from '@opentelemetry/instrumentation-graphql';

const _graphqlIntegration = (() => {
const _graphqlIntegration = ((_options = {}) => {
const options = {
ignoreResolveSpans: true,
ignoreTrivialResolveSpans: true,
..._options,
};
return {

@@ -13,3 +19,3 @@ name: 'Graphql',

new GraphQLInstrumentation({
ignoreTrivialResolveSpans: true,
...options,
responseHook(span) {

@@ -16,0 +22,0 @@ addOriginToSpan(span, 'auto.graphql.otel.graphql');

import { _optionalChain } from '@sentry/utils';
import { isWrapped } from '@opentelemetry/core';
import { HapiInstrumentation } from '@opentelemetry/instrumentation-hapi';
import { defineIntegration, isEnabled, SDK_VERSION, getIsolationScope, getDefaultIsolationScope, getActiveSpan, getRootSpan, SPAN_STATUS_ERROR, captureException } from '@sentry/core';
import { defineIntegration, getClient, spanToJSON, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SDK_VERSION, getIsolationScope, getDefaultIsolationScope, getActiveSpan, getRootSpan, SPAN_STATUS_ERROR, captureException } from '@sentry/core';
import { addOpenTelemetryInstrumentation } from '@sentry/opentelemetry';
import { consoleSandbox, logger } from '@sentry/utils';
import { logger } from '@sentry/utils';
import { DEBUG_BUILD } from '../../../debug-build.js';
import { ensureIsWrapped } from '../../../utils/ensureIsWrapped.js';

@@ -87,14 +87,34 @@ const _hapiIntegration = (() => {

// eslint-disable-next-line @typescript-eslint/unbound-method
if (!isWrapped(server.register) && isEnabled()) {
consoleSandbox(() => {
// eslint-disable-next-line no-console
console.warn(
'[Sentry] Hapi is not instrumented. This is likely because you required/imported hapi before calling `Sentry.init()`.',
);
// Sadly, middleware spans do not go through `requestHook`, so we handle those here
// We register this hook in this method, because if we register it in the integration `setup`,
// it would always run even for users that are not even using hapi
const client = getClient();
if (client) {
client.on('spanStart', span => {
addHapiSpanAttributes(span);
});
}
// eslint-disable-next-line @typescript-eslint/unbound-method
ensureIsWrapped(server.register, 'hapi');
}
function addHapiSpanAttributes(span) {
const attributes = spanToJSON(span).data || {};
// this is one of: router, plugin, server.ext
const type = attributes['hapi.type'];
// If this is already set, or we have no Hapi span, no need to process again...
if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] || !type) {
return;
}
span.setAttributes({
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.otel.hapi',
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${type}.hapi`,
});
}
export { hapiErrorPlugin, hapiIntegration, setupHapiErrorHandler };
//# sourceMappingURL=index.js.map

@@ -1,9 +0,30 @@

import { isWrapped } from '@opentelemetry/core';
import { KoaInstrumentation } from '@opentelemetry/instrumentation-koa';
import { SEMATTRS_HTTP_ROUTE } from '@opentelemetry/semantic-conventions';
import { defineIntegration, getIsolationScope, getDefaultIsolationScope, spanToJSON, captureException, isEnabled } from '@sentry/core';
import { defineIntegration, getIsolationScope, getDefaultIsolationScope, spanToJSON, captureException, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_OP } from '@sentry/core';
import { addOpenTelemetryInstrumentation } from '@sentry/opentelemetry';
import { logger, consoleSandbox } from '@sentry/utils';
import { logger } from '@sentry/utils';
import { DEBUG_BUILD } from '../../debug-build.js';
import { ensureIsWrapped } from '../../utils/ensureIsWrapped.js';
function addKoaSpanAttributes(span) {
span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, 'auto.http.otel.koa');
const attributes = spanToJSON(span).data || {};
// this is one of: middleware, router
const type = attributes['koa.type'];
if (type) {
span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_OP, `${type}.koa`);
}
// Also update the name
const name = attributes['koa.name'];
if (typeof name === 'string') {
// Somehow, name is sometimes `''` for middleware spans
// See: https://github.com/open-telemetry/opentelemetry-js-contrib/issues/2220
span.updateName(name || '< unknown >');
}
}
const _koaIntegration = (() => {

@@ -16,2 +37,4 @@ return {

requestHook(span, info) {
addKoaSpanAttributes(span);
if (getIsolationScope() === getDefaultIsolationScope()) {

@@ -47,10 +70,3 @@ DEBUG_BUILD &&

if (!isWrapped(app.use) && isEnabled()) {
consoleSandbox(() => {
// eslint-disable-next-line no-console
console.warn(
'[Sentry] Koa is not instrumented. This is likely because you required/imported koa before calling `Sentry.init()`.',
);
});
}
ensureIsWrapped(app.use, 'koa');
};

@@ -57,0 +73,0 @@

import { _optionalChain } from '@sentry/utils';
import { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core';
import { defineIntegration, getIsolationScope, getDefaultIsolationScope, captureException } from '@sentry/core';
import { defineIntegration, getClient, getIsolationScope, getDefaultIsolationScope, captureException, spanToJSON, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
import { addOpenTelemetryInstrumentation } from '@sentry/opentelemetry';

@@ -27,2 +27,12 @@ import { logger } from '@sentry/utils';

function setupNestErrorHandler(app, baseFilter) {
// Sadly, NestInstrumentation has no requestHook, so we need to add the attributes here
// We register this hook in this method, because if we register it in the integration `setup`,
// it would always run even for users that are not even using Nest.js
const client = getClient();
if (client) {
client.on('spanStart', span => {
addNestSpanAttributes(span);
});
}
app.useGlobalInterceptors({

@@ -63,3 +73,20 @@ intercept(context, next) {

function addNestSpanAttributes(span) {
const attributes = spanToJSON(span).data || {};
// this is one of: app_creation, request_context, handler
const type = attributes['nestjs.type'];
// If this is already set, or we have no nest.js span, no need to process again...
if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] || !type) {
return;
}
span.setAttributes({
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.otel.nestjs',
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${type}.nestjs`,
});
}
export { nestIntegration, setupNestErrorHandler };
//# sourceMappingURL=nest.js.map
import { _nullishCoalesce } from '@sentry/utils';
import * as http from 'http';
import 'node:http';
import * as http from 'node:http';
import 'node:https';

@@ -5,0 +4,0 @@

import { _nullishCoalesce, _optionalChain } from '@sentry/utils';
import * as net from 'net';
import * as tls from 'tls';
import * as net from 'node:net';
import * as tls from 'node:tls';
import { logger } from '@sentry/utils';

@@ -5,0 +5,0 @@ import { Agent } from './base.js';

import { _optionalChain } from '@sentry/utils';
import * as os from 'os';
import * as os from 'node:os';
import { trace } from '@opentelemetry/api';

@@ -4,0 +4,0 @@ import { ServerRuntimeClient, applySdkMetadata, SDK_VERSION } from '@sentry/core';

@@ -18,2 +18,3 @@ import { inboundFiltersIntegration, functionToStringIntegration, linkedErrorsIntegration, requestDataIntegration, hasTracingEnabled, getCurrentScope, getIntegrationsToSetup, getClient, startSession, getIsolationScope, endSession } from '@sentry/core';

import { makeNodeTransport } from '../transports/http.js';
import { isCjs } from '../utils/commonjs.js';
import { defaultStackParser, getSentryRelease } from './api.js';

@@ -23,6 +24,2 @@ import { NodeClient } from './client.js';

function isCjs() {
return typeof require !== 'undefined';
}
function getCjsOnlyIntegrations() {

@@ -123,5 +120,9 @@ return isCjs() ? [modulesIntegration()] : [];

if (!GLOBAL_OBJ._sentryEsmLoaderHookRegistered && importMetaUrl) {
// @ts-expect-error register is available in these versions
moduleModule.register('@opentelemetry/instrumentation/hook.mjs', importMetaUrl);
GLOBAL_OBJ._sentryEsmLoaderHookRegistered = true;
try {
// @ts-expect-error register is available in these versions
moduleModule.register('@opentelemetry/instrumentation/hook.mjs', importMetaUrl);
GLOBAL_OBJ._sentryEsmLoaderHookRegistered = true;
} catch (error) {
logger.warn('Failed to register ESM hook', error);
}
}

@@ -151,2 +152,4 @@ } else {

logger.log(`Running in ${isCjs() ? 'CommonJS' : 'ESM'} mode.`);
if (options.autoSessionTracking) {

@@ -153,0 +156,0 @@ startSessionTracking();

import { _nullishCoalesce } from '@sentry/utils';
import * as http from 'node:http';
import * as https from 'node:https';
import { Readable } from 'stream';
import { createGzip } from 'zlib';
import { Readable } from 'node:stream';
import { createGzip } from 'node:zlib';
import { createTransport, suppressTracing } from '@sentry/core';

@@ -56,3 +56,3 @@ import { consoleSandbox } from '@sentry/utils';

// TODO(v7): Evaluate if we can set keepAlive to true. This would involve testing for memory leaks in older node
// TODO(v9): Evaluate if we can set keepAlive to true. This would involve testing for memory leaks in older node
// versions(>= 8) as they had memory leaks when using it: #2555

@@ -59,0 +59,0 @@ const agent = proxy

@@ -1,2 +0,2 @@

import { posix, sep } from 'path';
import { posix, sep } from 'node:path';
import { dirname } from '@sentry/utils';

@@ -3,0 +3,0 @@

{
"name": "@sentry/node",
"version": "8.2.1",
"version": "8.3.0",
"description": "Sentry Node SDK using OpenTelemetry for performance instrumentation",

@@ -44,2 +44,10 @@ "repository": "git://github.com/getsentry/sentry-javascript.git",

}
},
"./init": {
"import": {
"default": "./esm/init.js"
},
"require": {
"default": "./cjs/init.js"
}
}

@@ -63,3 +71,3 @@ },

"@opentelemetry/instrumentation-connect": "0.36.0",
"@opentelemetry/instrumentation-express": "0.38.0",
"@opentelemetry/instrumentation-express": "0.39.0",
"@opentelemetry/instrumentation-fastify": "0.36.1",

@@ -80,7 +88,7 @@ "@opentelemetry/instrumentation-graphql": "0.40.0",

"@opentelemetry/semantic-conventions": "^1.23.0",
"@prisma/instrumentation": "5.13.0",
"@sentry/core": "8.2.1",
"@sentry/opentelemetry": "8.2.1",
"@sentry/types": "8.2.1",
"@sentry/utils": "8.2.1"
"@prisma/instrumentation": "5.14.0",
"@sentry/core": "8.3.0",
"@sentry/opentelemetry": "8.3.0",
"@sentry/types": "8.3.0",
"@sentry/utils": "8.3.0"
},

@@ -87,0 +95,0 @@ "devDependencies": {

/// <reference types="node" />
import { readFile, readdir } from 'fs';
import { DeviceContext } from '@sentry/types';
import { readFile, readdir } from 'node:fs';
import { AppContext, DeviceContext } from '@sentry/types';
export declare const readFileAsync: typeof readFile.__promisify__;

@@ -22,2 +22,6 @@ export declare const readDirAsync: typeof readdir.__promisify__;

/**
* Get app context information from process
*/
export declare function getAppContext(): AppContext;
/**
* Gets device information from os

@@ -24,0 +28,0 @@ */

/// <reference types="node" />
import { Debugger } from 'node:inspector';
import { StackFrame, StackParser } from '@sentry/types';
import { Debugger } from 'inspector';
export type Variables = Record<string, unknown>;

@@ -5,0 +5,0 @@ export type RateLimitIncrement = () => void;

/// <reference types="node" />
import { Debugger, InspectorNotification } from 'inspector';
import { Debugger, InspectorNotification } from 'node:inspector';
import { LocalVariablesIntegrationOptions, Variables } from './common';

@@ -4,0 +4,0 @@ type OnPauseEvent = InspectorNotification<Debugger.PausedEventDataType>;

@@ -1,2 +0,2 @@

import * as http from 'http';
import * as http from 'node:http';
type SpotlightConnectionOptions = {

@@ -3,0 +3,0 @@ /**

/// <reference types="node" />
import * as http from 'http';
import * as http from 'node:http';
/**

@@ -4,0 +4,0 @@ * Express integration

@@ -0,1 +1,5 @@

interface Fastify {
register: (plugin: any) => void;
addHook: (hook: string, handler: (request: any, reply: any, error: Error) => void) => void;
}
/**

@@ -7,6 +11,2 @@ * Express integration

export declare const fastifyIntegration: () => import("@sentry/types").Integration;
interface Fastify {
register: (plugin: any) => void;
addHook: (hook: string, handler: (request: any, reply: any, error: Error) => void) => void;
}
/**

@@ -13,0 +13,0 @@ * Setup an error handler for Fastify.

@@ -0,1 +1,14 @@

interface GraphqlOptions {
/** Do not create spans for resolvers. */
ignoreResolveSpans?: boolean;
/**
* Don't create spans for the execution of the default resolver on object properties.
*
* When a resolver function is not defined on the schema for a field, graphql will
* use the default resolver which just looks for a property with that name on the object.
* If the property is not a function, it's not very interesting to trace.
* This option can reduce noise and number of spans created.
*/
ignoreTrivalResolveSpans?: boolean;
}
/**

@@ -6,3 +19,4 @@ * GraphQL integration

*/
export declare const graphqlIntegration: () => import("@sentry/types").Integration;
export declare const graphqlIntegration: (_options?: GraphqlOptions | undefined) => import("@sentry/types").Integration;
export {};
//# sourceMappingURL=graphql.d.ts.map

@@ -29,6 +29,6 @@ /// <reference types="node" />

*/
import * as http from 'http';
import * as net from 'net';
import { Duplex } from 'stream';
import * as tls from 'tls';
import * as http from 'node:http';
import * as net from 'node:net';
import { Duplex } from 'node:stream';
import * as tls from 'node:tls';
export * from './helpers';

@@ -35,0 +35,0 @@ interface HttpConnectOpts extends net.TcpNetConnectOpts {

@@ -31,3 +31,3 @@ /// <reference types="node" />

import * as https from 'node:https';
import { Readable } from 'stream';
import { Readable } from 'node:stream';
export type ThenableRequest = http.ClientRequest & {

@@ -34,0 +34,0 @@ then: Promise<http.IncomingMessage>['then'];

@@ -29,6 +29,6 @@ /// <reference types="node" />

*/
import * as http from 'http';
import { OutgoingHttpHeaders } from 'http';
import * as net from 'net';
import * as tls from 'tls';
import * as http from 'node:http';
import { OutgoingHttpHeaders } from 'node:http';
import * as net from 'node:net';
import * as tls from 'node:tls';
import { Agent } from './base';

@@ -35,0 +35,0 @@ import { AgentConnectOpts } from './base';

@@ -29,4 +29,4 @@ /// <reference types="node" />

*/
import { IncomingHttpHeaders } from 'http';
import { Readable } from 'stream';
import { IncomingHttpHeaders } from 'node:http';
import { Readable } from 'node:stream';
export interface ConnectResponse {

@@ -33,0 +33,0 @@ statusCode: number;

/// <reference types="node" />
import { RequestOptions } from 'http';
import { RequestOptions } from 'node:http';
/** Build a full URL from request options. */
export declare function getRequestUrl(requestOptions: RequestOptions): string;
//# sourceMappingURL=getRequestUrl.d.ts.map
/// <reference types="node" />
import { readFile, readdir } from 'fs';
import type { DeviceContext } from '@sentry/types';
import { readFile, readdir } from 'node:fs';
import type { AppContext, DeviceContext } from '@sentry/types';
export declare const readFileAsync: typeof readFile.__promisify__;

@@ -22,2 +22,6 @@ export declare const readDirAsync: typeof readdir.__promisify__;

/**
* Get app context information from process
*/
export declare function getAppContext(): AppContext;
/**
* Gets device information from os

@@ -24,0 +28,0 @@ */

/// <reference types="node" />
import type { Debugger } from 'node:inspector';
import type { StackFrame, StackParser } from '@sentry/types';
import type { Debugger } from 'inspector';
export type Variables = Record<string, unknown>;

@@ -5,0 +5,0 @@ export type RateLimitIncrement = () => void;

/// <reference types="node" />
import type { Debugger, InspectorNotification } from 'inspector';
import type { Debugger, InspectorNotification } from 'node:inspector';
import type { LocalVariablesIntegrationOptions, Variables } from './common';

@@ -4,0 +4,0 @@ type OnPauseEvent = InspectorNotification<Debugger.PausedEventDataType>;

@@ -1,2 +0,2 @@

import * as http from 'http';
import * as http from 'node:http';
type SpotlightConnectionOptions = {

@@ -3,0 +3,0 @@ /**

/// <reference types="node" />
import type * as http from 'http';
import type * as http from 'node:http';
/**

@@ -4,0 +4,0 @@ * Express integration

@@ -0,1 +1,5 @@

interface Fastify {
register: (plugin: any) => void;
addHook: (hook: string, handler: (request: any, reply: any, error: Error) => void) => void;
}
/**

@@ -7,6 +11,2 @@ * Express integration

export declare const fastifyIntegration: () => import("@sentry/types").Integration;
interface Fastify {
register: (plugin: any) => void;
addHook: (hook: string, handler: (request: any, reply: any, error: Error) => void) => void;
}
/**

@@ -13,0 +13,0 @@ * Setup an error handler for Fastify.

@@ -0,1 +1,14 @@

interface GraphqlOptions {
/** Do not create spans for resolvers. */
ignoreResolveSpans?: boolean;
/**
* Don't create spans for the execution of the default resolver on object properties.
*
* When a resolver function is not defined on the schema for a field, graphql will
* use the default resolver which just looks for a property with that name on the object.
* If the property is not a function, it's not very interesting to trace.
* This option can reduce noise and number of spans created.
*/
ignoreTrivalResolveSpans?: boolean;
}
/**

@@ -6,3 +19,4 @@ * GraphQL integration

*/
export declare const graphqlIntegration: () => import("@sentry/types").Integration;
export declare const graphqlIntegration: (_options?: GraphqlOptions | undefined) => import("@sentry/types").Integration;
export {};
//# sourceMappingURL=graphql.d.ts.map

@@ -32,6 +32,6 @@ /**

/// <reference types="node" />
import * as http from 'http';
import type * as net from 'net';
import type { Duplex } from 'stream';
import type * as tls from 'tls';
import * as http from 'node:http';
import type * as net from 'node:net';
import type { Duplex } from 'node:stream';
import type * as tls from 'node:tls';
export * from './helpers';

@@ -38,0 +38,0 @@ interface HttpConnectOpts extends net.TcpNetConnectOpts {

@@ -34,3 +34,3 @@ /**

import * as https from 'node:https';
import type { Readable } from 'stream';
import type { Readable } from 'node:stream';
export type ThenableRequest = http.ClientRequest & {

@@ -37,0 +37,0 @@ then: Promise<http.IncomingMessage>['then'];

@@ -31,6 +31,6 @@ /**

/// <reference types="node" />
import type * as http from 'http';
import type { OutgoingHttpHeaders } from 'http';
import * as net from 'net';
import * as tls from 'tls';
import type * as http from 'node:http';
import type { OutgoingHttpHeaders } from 'node:http';
import * as net from 'node:net';
import * as tls from 'node:tls';
import { Agent } from './base';

@@ -37,0 +37,0 @@ import type { AgentConnectOpts } from './base';

@@ -31,4 +31,4 @@ /**

/// <reference types="node" />
import type { IncomingHttpHeaders } from 'http';
import type { Readable } from 'stream';
import type { IncomingHttpHeaders } from 'node:http';
import type { Readable } from 'node:stream';
export interface ConnectResponse {

@@ -35,0 +35,0 @@ statusCode: number;

/// <reference types="node" />
import type { RequestOptions } from 'http';
import type { RequestOptions } from 'node:http';
/** Build a full URL from request options. */
export declare function getRequestUrl(requestOptions: RequestOptions): string;
//# sourceMappingURL=getRequestUrl.d.ts.map

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc