@veryfront/ext-react-ssr 0.1.1189-bootstrap.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Extension-owned offline React SSR renderer bundle.
3
+ *
4
+ * AUTO-GENERATED by extensions/ext-react-ssr/scripts/prebundle.ts.
5
+ * Do not edit manually.
6
+ */
7
+ // deno-fmt-ignore - preserve the generated JavaScript as one base64 string.
8
+ export const REACT_SSR_RENDERER_BUNDLE_BASE64 = "dmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7CiAgZm9yICh2YXIgbmFtZSBpbiBhbGwpCiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pOwp9OwoKLy8gZGVubzpodHRwczovL2VzbS5zaC9yZWFjdEAxOS4yLjQvWC1aR056YzNSNWNHVkFNeTR5TGpNL2VzMjAyMi9yZWFjdC5tanMKdmFyIFUgPSBPYmplY3QuY3JlYXRlOwp2YXIgZCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwp2YXIgayA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzOwp2YXIgYiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKdmFyIHEgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5Owp2YXIgQSA9IChlLCB0KSA9PiAoKSA9PiAodCB8fCBlKCh0ID0gewogIGV4cG9ydHM6IHt9Cn0pLmV4cG9ydHMsIHQpLCB0LmV4cG9ydHMpOwp2YXIgeiA9IChlLCB0LCBuMiwgcikgPT4gewogIGlmICh0ICYmIHR5cGVvZiB0ID09ICJvYmplY3QiIHx8IHR5cGVvZiB0ID09ICJmdW5jdGlvbiIpIGZvciAobGV0IG8gb2Ygayh0KSkgIXEuY2FsbChlLCBvKSAmJiBvICE9PSBuMiAmJiBkKGUsIG8sIHsKICAgIGdldDogKCkgPT4gdFtvXSwKICAgIGVudW1lcmFibGU6ICEociA9IEQodCwgbykpIHx8IHIuZW51bWVyYWJsZQogIH0pOwogIHJldHVybiBlOwp9Owp2YXIgRyA9IChlLCB0LCBuMikgPT4gKG4yID0gZSAhPSBudWxsID8gVShiKGUpKSA6IHt9LCB6KHQgfHwgIWUgfHwgIWUuX19lc01vZHVsZSA/IGQobjIsICJkZWZhdWx0IiwgewogIHZhbHVlOiBlLAogIGVudW1lcmFibGU6IHRydWUKfSkgOiBuMiwgZSkpOwp2YXIgJCA9IEEoKHUyKSA9PiB7CiAgInVzZSBzdHJpY3QiOwogIHZhciBSMyA9IFN5bWJvbC5mb3IoInJlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50IiksIEsyID0gU3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksIFcgPSBTeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLCBCMiA9IFN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIiksIFEgPSBTeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLCBWMiA9IFN5bWJvbC5mb3IoInJlYWN0LmNvbnN1bWVyIiksIFggPSBTeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksIFogPSBTeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLCBKID0gU3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSwgRjIgPSBTeW1ib2wuZm9yKCJyZWFjdC5tZW1vIiksIFAgPSBTeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksIGVlID0gU3ltYm9sLmZvcigicmVhY3QuYWN0aXZpdHkiKSwgaCA9IFN5bWJvbC5pdGVyYXRvcjsKICBmdW5jdGlvbiB0ZShlKSB7CiAgICByZXR1cm4gZSA9PT0gbnVsbCB8fCB0eXBlb2YgZSAhPSAib2JqZWN0IiA/IG51bGwgOiAoZSA9IGggJiYgZVtoXSB8fCBlWyJAQGl0ZXJhdG9yIl0sIHR5cGVvZiBlID09ICJmdW5jdGlvbiIgPyBlIDogbnVsbCk7CiAgfQogIHZhciBOMiA9IHsKICAgIGlzTW91bnRlZDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0sCiAgICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgfSwKICAgIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uKCkgewogICAgfSwKICAgIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICB9CiAgfSwgajMgPSBPYmplY3QuYXNzaWduLCBIMiA9IHt9OwogIGZ1bmN0aW9uIGEoZSwgdCwgbjIpIHsKICAgIHRoaXMucHJvcHMgPSBlLCB0aGlzLmNvbnRleHQgPSB0LCB0aGlzLnJlZnMgPSBIMiwgdGhpcy51cGRhdGVyID0gbjIgfHwgTjI7CiAgfQogIGEucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTsKICBhLnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uKGUsIHQpIHsKICAgIGlmICh0eXBlb2YgZSAhPSAib2JqZWN0IiAmJiB0eXBlb2YgZSAhPSAiZnVuY3Rpb24iICYmIGUgIT0gbnVsbCkgdGhyb3cgRXJyb3IoInRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpOwogICAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBlLCB0LCAic2V0U3RhdGUiKTsKICB9OwogIGEucHJvdG90eXBlLmZvcmNlVXBkYXRlID0gZnVuY3Rpb24oZSkgewogICAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBlLCAiZm9yY2VVcGRhdGUiKTsKICB9OwogIGZ1bmN0aW9uIEkyKCkgewogIH0KICBJMi5wcm90b3R5cGUgPSBhLnByb3RvdHlwZTsKICBmdW5jdGlvbiBtMihlLCB0LCBuMikgewogICAgdGhpcy5wcm9wcyA9IGUsIHRoaXMuY29udGV4dCA9IHQsIHRoaXMucmVmcyA9IEgyLCB0aGlzLnVwZGF0ZXIgPSBuMiB8fCBOMjsKICB9CiAgdmFyIFQzID0gbTIucHJvdG90eXBlID0gbmV3IEkyKCk7CiAgVDMuY29uc3RydWN0b3IgPSBtMjsKICBqMyhUMywgYS5wcm90b3R5cGUpOwogIFQzLmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gdHJ1ZTsKICB2YXIgTyA9IEFycmF5LmlzQXJyYXk7CiAgZnVuY3Rpb24gdjMoKSB7CiAgfQogIHZhciBpID0gewogICAgSDogbnVsbCwKICAgIEE6IG51bGwsCiAgICBUOiBudWxsLAogICAgUzogbnVsbAogIH0sIE0yID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICBmdW5jdGlvbiBDKGUsIHQsIG4yKSB7CiAgICB2YXIgciA9IG4yLnJlZjsKICAgIHJldHVybiB7CiAgICAgICQkdHlwZW9mOiBSMywKICAgICAgdHlwZTogZSwKICAgICAga2V5OiB0LAogICAgICByZWY6IHIgIT09IHZvaWQgMCA/IHIgOiBudWxsLAogICAgICBwcm9wczogbjIKICAgIH07CiAgfQogIGZ1bmN0aW9uIG5lKGUsIHQpIHsKICAgIHJldHVybiBDKGUudHlwZSwgdCwgZS5wcm9wcyk7CiAgfQogIGZ1bmN0aW9uIFMzKGUpIHsKICAgIHJldHVybiB0eXBlb2YgZSA9PSAib2JqZWN0IiAmJiBlICE9PSBudWxsICYmIGUuJCR0eXBlb2YgPT09IFIzOwogIH0KICBmdW5jdGlvbiByZShlKSB7CiAgICB2YXIgdCA9IHsKICAgICAgIj0iOiAiPTAiLAogICAgICAiOiI6ICI9MiIKICAgIH07CiAgICByZXR1cm4gIiQiICsgZS5yZXBsYWNlKC9bPTpdL2csIGZ1bmN0aW9uKG4yKSB7CiAgICAgIHJldHVybiB0W24yXTsKICAgIH0pOwogIH0KICB2YXIgZyA9IC9cLysvZzsKICBmdW5jdGlvbiB5MihlLCB0KSB7CiAgICByZXR1cm4gdHlwZW9mIGUgPT0gIm9iamVjdCIgJiYgZSAhPT0gbnVsbCAmJiBlLmtleSAhPSBudWxsID8gcmUoIiIgKyBlLmtleSkgOiB0LnRvU3RyaW5nKDM2KTsKICB9CiAgZnVuY3Rpb24gdWUoZSkgewogICAgc3dpdGNoIChlLnN0YXR1cykgewogICAgICBjYXNlICJmdWxmaWxsZWQiOgogICAgICAgIHJldHVybiBlLnZhbHVlOwogICAgICBjYXNlICJyZWplY3RlZCI6CiAgICAgICAgdGhyb3cgZS5yZWFzb247CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgc3dpdGNoICh0eXBlb2YgZS5zdGF0dXMgPT0gInN0cmluZyIgPyBlLnRoZW4odjMsIHYzKSA6IChlLnN0YXR1cyA9ICJwZW5kaW5nIiwgZS50aGVuKGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIGUuc3RhdHVzID09PSAicGVuZGluZyIgJiYgKGUuc3RhdHVzID0gImZ1bGZpbGxlZCIsIGUudmFsdWUgPSB0KTsKICAgICAgICB9LCBmdW5jdGlvbih0KSB7CiAgICAgICAgICBlLnN0YXR1cyA9PT0gInBlbmRpbmciICYmIChlLnN0YXR1cyA9ICJyZWplY3RlZCIsIGUucmVhc29uID0gdCk7CiAgICAgICAgfSkpLCBlLnN0YXR1cykgewogICAgICAgICAgY2FzZSAiZnVsZmlsbGVkIjoKICAgICAgICAgICAgcmV0dXJuIGUudmFsdWU7CiAgICAgICAgICBjYXNlICJyZWplY3RlZCI6CiAgICAgICAgICAgIHRocm93IGUucmVhc29uOwogICAgICAgIH0KICAgIH0KICAgIHRocm93IGU7CiAgfQogIGZ1bmN0aW9uIGwzKGUsIHQsIG4yLCByLCBvKSB7CiAgICB2YXIgcyA9IHR5cGVvZiBlOwogICAgKHMgPT09ICJ1bmRlZmluZWQiIHx8IHMgPT09ICJib29sZWFuIikgJiYgKGUgPSBudWxsKTsKICAgIHZhciBmMiA9IGZhbHNlOwogICAgaWYgKGUgPT09IG51bGwpIGYyID0gdHJ1ZTsKICAgIGVsc2Ugc3dpdGNoIChzKSB7CiAgICAgIGNhc2UgImJpZ2ludCI6CiAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgIGNhc2UgIm51bWJlciI6CiAgICAgICAgZjIgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJvYmplY3QiOgogICAgICAgIHN3aXRjaCAoZS4kJHR5cGVvZikgewogICAgICAgICAgY2FzZSBSMzoKICAgICAgICAgIGNhc2UgSzI6CiAgICAgICAgICAgIGYyID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFA6CiAgICAgICAgICAgIHJldHVybiBmMiA9IGUuX2luaXQsIGwzKGYyKGUuX3BheWxvYWQpLCB0LCBuMiwgciwgbyk7CiAgICAgICAgfQogICAgfQogICAgaWYgKGYyKSByZXR1cm4gbyA9IG8oZSksIGYyID0gciA9PT0gIiIgPyAiLiIgKyB5MihlLCAwKSA6IHIsIE8obykgPyAobjIgPSAiIiwgZjIgIT0gbnVsbCAmJiAobjIgPSBmMi5yZXBsYWNlKGcsICIkJi8iKSArICIvIiksIGwzKG8sIHQsIG4yLCAiIiwgZnVuY3Rpb24oeDMpIHsKICAgICAgcmV0dXJuIHgzOwogICAgfSkpIDogbyAhPSBudWxsICYmIChTMyhvKSAmJiAobyA9IG5lKG8sIG4yICsgKG8ua2V5ID09IG51bGwgfHwgZSAmJiBlLmtleSA9PT0gby5rZXkgPyAiIiA6ICgiIiArIG8ua2V5KS5yZXBsYWNlKGcsICIkJi8iKSArICIvIikgKyBmMikpLCB0LnB1c2gobykpLCAxOwogICAgZjIgPSAwOwogICAgdmFyIHAzID0gciA9PT0gIiIgPyAiLiIgOiByICsgIjoiOwogICAgaWYgKE8oZSkpIGZvciAodmFyIGMyID0gMDsgYzIgPCBlLmxlbmd0aDsgYzIrKykgciA9IGVbYzJdLCBzID0gcDMgKyB5MihyLCBjMiksIGYyICs9IGwzKHIsIHQsIG4yLCBzLCBvKTsKICAgIGVsc2UgaWYgKGMyID0gdGUoZSksIHR5cGVvZiBjMiA9PSAiZnVuY3Rpb24iKSBmb3IgKGUgPSBjMi5jYWxsKGUpLCBjMiA9IDA7ICEociA9IGUubmV4dCgpKS5kb25lOyApIHIgPSByLnZhbHVlLCBzID0gcDMgKyB5MihyLCBjMisrKSwgZjIgKz0gbDMociwgdCwgbjIsIHMsIG8pOwogICAgZWxzZSBpZiAocyA9PT0gIm9iamVjdCIpIHsKICAgICAgaWYgKHR5cGVvZiBlLnRoZW4gPT0gImZ1bmN0aW9uIikgcmV0dXJuIGwzKHVlKGUpLCB0LCBuMiwgciwgbyk7CiAgICAgIHRocm93IHQgPSBTdHJpbmcoZSksIEVycm9yKCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICIgKyAodCA9PT0gIltvYmplY3QgT2JqZWN0XSIgPyAib2JqZWN0IHdpdGgga2V5cyB7IiArIE9iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikgKyAifSIgOiB0KSArICIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7CiAgICB9CiAgICByZXR1cm4gZjI7CiAgfQogIGZ1bmN0aW9uIF8yKGUsIHQsIG4yKSB7CiAgICBpZiAoZSA9PSBudWxsKSByZXR1cm4gZTsKICAgIHZhciByID0gW10sIG8gPSAwOwogICAgcmV0dXJuIGwzKGUsIHIsICIiLCAiIiwgZnVuY3Rpb24ocykgewogICAgICByZXR1cm4gdC5jYWxsKG4yLCBzLCBvKyspOwogICAgfSksIHI7CiAgfQogIGZ1bmN0aW9uIG9lKGUpIHsKICAgIGlmIChlLl9zdGF0dXMgPT09IC0xKSB7CiAgICAgIHZhciB0ID0gZS5fcmVzdWx0OwogICAgICB0ID0gdCgpLCB0LnRoZW4oZnVuY3Rpb24objIpIHsKICAgICAgICAoZS5fc3RhdHVzID09PSAwIHx8IGUuX3N0YXR1cyA9PT0gLTEpICYmIChlLl9zdGF0dXMgPSAxLCBlLl9yZXN1bHQgPSBuMik7CiAgICAgIH0sIGZ1bmN0aW9uKG4yKSB7CiAgICAgICAgKGUuX3N0YXR1cyA9PT0gMCB8fCBlLl9zdGF0dXMgPT09IC0xKSAmJiAoZS5fc3RhdHVzID0gMiwgZS5fcmVzdWx0ID0gbjIpOwogICAgICB9KSwgZS5fc3RhdHVzID09PSAtMSAmJiAoZS5fc3RhdHVzID0gMCwgZS5fcmVzdWx0ID0gdCk7CiAgICB9CiAgICBpZiAoZS5fc3RhdHVzID09PSAxKSByZXR1cm4gZS5fcmVzdWx0LmRlZmF1bHQ7CiAgICB0aHJvdyBlLl9yZXN1bHQ7CiAgfQogIHZhciB3MyA9IHR5cGVvZiByZXBvcnRFcnJvciA9PSAiZnVuY3Rpb24iID8gcmVwb3J0RXJyb3IgOiBmdW5jdGlvbihlKSB7CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAib2JqZWN0IiAmJiB0eXBlb2Ygd2luZG93LkVycm9yRXZlbnQgPT0gImZ1bmN0aW9uIikgewogICAgICB2YXIgdCA9IG5ldyB3aW5kb3cuRXJyb3JFdmVudCgiZXJyb3IiLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLAogICAgICAgIG1lc3NhZ2U6IHR5cGVvZiBlID09ICJvYmplY3QiICYmIGUgIT09IG51bGwgJiYgdHlwZW9mIGUubWVzc2FnZSA9PSAic3RyaW5nIiA/IFN0cmluZyhlLm1lc3NhZ2UpIDogU3RyaW5nKGUpLAogICAgICAgIGVycm9yOiBlCiAgICAgIH0pOwogICAgICBpZiAoIXdpbmRvdy5kaXNwYXRjaEV2ZW50KHQpKSByZXR1cm47CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzID09ICJvYmplY3QiICYmIHR5cGVvZiBwcm9jZXNzLmVtaXQgPT0gImZ1bmN0aW9uIikgewogICAgICBwcm9jZXNzLmVtaXQoInVuY2F1Z2h0RXhjZXB0aW9uIiwgZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgfSwgc2UgPSB7CiAgICBtYXA6IF8yLAogICAgZm9yRWFjaDogZnVuY3Rpb24oZSwgdCwgbjIpIHsKICAgICAgXzIoZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9LCBuMik7CiAgICB9LAogICAgY291bnQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHQgPSAwOwogICAgICByZXR1cm4gXzIoZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgdCsrOwogICAgICB9KSwgdDsKICAgIH0sCiAgICB0b0FycmF5OiBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBfMihlLCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIHQ7CiAgICAgIH0pIHx8IFtdOwogICAgfSwKICAgIG9ubHk6IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFTMyhlKSkgdGhyb3cgRXJyb3IoIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLiIpOwogICAgICByZXR1cm4gZTsKICAgIH0KICB9OwogIHUyLkFjdGl2aXR5ID0gZWU7CiAgdTIuQ2hpbGRyZW4gPSBzZTsKICB1Mi5Db21wb25lbnQgPSBhOwogIHUyLkZyYWdtZW50ID0gVzsKICB1Mi5Qcm9maWxlciA9IFE7CiAgdTIuUHVyZUNvbXBvbmVudCA9IG0yOwogIHUyLlN0cmljdE1vZGUgPSBCMjsKICB1Mi5TdXNwZW5zZSA9IEo7CiAgdTIuX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFID0gaTsKICB1Mi5fX0NPTVBJTEVSX1JVTlRJTUUgPSB7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBjOiBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBpLkgudXNlTWVtb0NhY2hlKGUpOwogICAgfQogIH07CiAgdTIuY2FjaGUgPSBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB9OwogIH07CiAgdTIuY2FjaGVTaWduYWwgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBudWxsOwogIH07CiAgdTIuY2xvbmVFbGVtZW50ID0gZnVuY3Rpb24oZSwgdCwgbjIpIHsKICAgIGlmIChlID09IG51bGwpIHRocm93IEVycm9yKCJUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkICIgKyBlICsgIi4iKTsKICAgIHZhciByID0gajMoe30sIGUucHJvcHMpLCBvID0gZS5rZXk7CiAgICBpZiAodCAhPSBudWxsKSBmb3IgKHMgaW4gdC5rZXkgIT09IHZvaWQgMCAmJiAobyA9ICIiICsgdC5rZXkpLCB0KSAhTTIuY2FsbCh0LCBzKSB8fCBzID09PSAia2V5IiB8fCBzID09PSAiX19zZWxmIiB8fCBzID09PSAiX19zb3VyY2UiIHx8IHMgPT09ICJyZWYiICYmIHQucmVmID09PSB2b2lkIDAgfHwgKHJbc10gPSB0W3NdKTsKICAgIHZhciBzID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7CiAgICBpZiAocyA9PT0gMSkgci5jaGlsZHJlbiA9IG4yOwogICAgZWxzZSBpZiAoMSA8IHMpIHsKICAgICAgZm9yICh2YXIgZjIgPSBBcnJheShzKSwgcDMgPSAwOyBwMyA8IHM7IHAzKyspIGYyW3AzXSA9IGFyZ3VtZW50c1twMyArIDJdOwogICAgICByLmNoaWxkcmVuID0gZjI7CiAgICB9CiAgICByZXR1cm4gQyhlLnR5cGUsIG8sIHIpOwogIH07CiAgdTIuY3JlYXRlQ29udGV4dCA9IGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiBlID0gewogICAgICAkJHR5cGVvZjogWCwKICAgICAgX2N1cnJlbnRWYWx1ZTogZSwKICAgICAgX2N1cnJlbnRWYWx1ZTI6IGUsCiAgICAgIF90aHJlYWRDb3VudDogMCwKICAgICAgUHJvdmlkZXI6IG51bGwsCiAgICAgIENvbnN1bWVyOiBudWxsCiAgICB9LCBlLlByb3ZpZGVyID0gZSwgZS5Db25zdW1lciA9IHsKICAgICAgJCR0eXBlb2Y6IFYyLAogICAgICBfY29udGV4dDogZQogICAgfSwgZTsKICB9OwogIHUyLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbihlLCB0LCBuMikgewogICAgdmFyIHIsIG8gPSB7fSwgcyA9IG51bGw7CiAgICBpZiAodCAhPSBudWxsKSBmb3IgKHIgaW4gdC5rZXkgIT09IHZvaWQgMCAmJiAocyA9ICIiICsgdC5rZXkpLCB0KSBNMi5jYWxsKHQsIHIpICYmIHIgIT09ICJrZXkiICYmIHIgIT09ICJfX3NlbGYiICYmIHIgIT09ICJfX3NvdXJjZSIgJiYgKG9bcl0gPSB0W3JdKTsKICAgIHZhciBmMiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyOwogICAgaWYgKGYyID09PSAxKSBvLmNoaWxkcmVuID0gbjI7CiAgICBlbHNlIGlmICgxIDwgZjIpIHsKICAgICAgZm9yICh2YXIgcDMgPSBBcnJheShmMiksIGMyID0gMDsgYzIgPCBmMjsgYzIrKykgcDNbYzJdID0gYXJndW1lbnRzW2MyICsgMl07CiAgICAgIG8uY2hpbGRyZW4gPSBwMzsKICAgIH0KICAgIGlmIChlICYmIGUuZGVmYXVsdFByb3BzKSBmb3IgKHIgaW4gZjIgPSBlLmRlZmF1bHRQcm9wcywgZjIpIG9bcl0gPT09IHZvaWQgMCAmJiAob1tyXSA9IGYyW3JdKTsKICAgIHJldHVybiBDKGUsIHMsIG8pOwogIH07CiAgdTIuY3JlYXRlUmVmID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gewogICAgICBjdXJyZW50OiBudWxsCiAgICB9OwogIH07CiAgdTIuZm9yd2FyZFJlZiA9IGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiB7CiAgICAgICQkdHlwZW9mOiBaLAogICAgICByZW5kZXI6IGUKICAgIH07CiAgfTsKICB1Mi5pc1ZhbGlkRWxlbWVudCA9IFMzOwogIHUyLmxhenkgPSBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gewogICAgICAkJHR5cGVvZjogUCwKICAgICAgX3BheWxvYWQ6IHsKICAgICAgICBfc3RhdHVzOiAtMSwKICAgICAgICBfcmVzdWx0OiBlCiAgICAgIH0sCiAgICAgIF9pbml0OiBvZQogICAgfTsKICB9OwogIHUyLm1lbW8gPSBmdW5jdGlvbihlLCB0KSB7CiAgICByZXR1cm4gewogICAgICAkJHR5cGVvZjogRjIsCiAgICAgIHR5cGU6IGUsCiAgICAgIGNvbXBhcmU6IHQgPT09IHZvaWQgMCA/IG51bGwgOiB0CiAgICB9OwogIH07CiAgdTIuc3RhcnRUcmFuc2l0aW9uID0gZnVuY3Rpb24oZSkgewogICAgdmFyIHQgPSBpLlQsIG4yID0ge307CiAgICBpLlQgPSBuMjsKICAgIHRyeSB7CiAgICAgIHZhciByID0gZSgpLCBvID0gaS5TOwogICAgICBvICE9PSBudWxsICYmIG8objIsIHIpLCB0eXBlb2YgciA9PSAib2JqZWN0IiAmJiByICE9PSBudWxsICYmIHR5cGVvZiByLnRoZW4gPT0gImZ1bmN0aW9uIiAmJiByLnRoZW4odjMsIHczKTsKICAgIH0gY2F0Y2ggKHMpIHsKICAgICAgdzMocyk7CiAgICB9IGZpbmFsbHkgewogICAgICB0ICE9PSBudWxsICYmIG4yLnR5cGVzICE9PSBudWxsICYmICh0LnR5cGVzID0gbjIudHlwZXMpLCBpLlQgPSB0OwogICAgfQogIH07CiAgdTIudW5zdGFibGVfdXNlQ2FjaGVSZWZyZXNoID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gaS5ILnVzZUNhY2hlUmVmcmVzaCgpOwogIH07CiAgdTIudXNlID0gZnVuY3Rpb24oZSkgewogICAgcmV0dXJuIGkuSC51c2UoZSk7CiAgfTsKICB1Mi51c2VBY3Rpb25TdGF0ZSA9IGZ1bmN0aW9uKGUsIHQsIG4yKSB7CiAgICByZXR1cm4gaS5ILnVzZUFjdGlvblN0YXRlKGUsIHQsIG4yKTsKICB9OwogIHUyLnVzZUNhbGxiYWNrID0gZnVuY3Rpb24oZSwgdCkgewogICAgcmV0dXJuIGkuSC51c2VDYWxsYmFjayhlLCB0KTsKICB9OwogIHUyLnVzZUNvbnRleHQgPSBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gaS5ILnVzZUNvbnRleHQoZSk7CiAgfTsKICB1Mi51c2VEZWJ1Z1ZhbHVlID0gZnVuY3Rpb24oKSB7CiAgfTsKICB1Mi51c2VEZWZlcnJlZFZhbHVlID0gZnVuY3Rpb24oZSwgdCkgewogICAgcmV0dXJuIGkuSC51c2VEZWZlcnJlZFZhbHVlKGUsIHQpOwogIH07CiAgdTIudXNlRWZmZWN0ID0gZnVuY3Rpb24oZSwgdCkgewogICAgcmV0dXJuIGkuSC51c2VFZmZlY3QoZSwgdCk7CiAgfTsKICB1Mi51c2VFZmZlY3RFdmVudCA9IGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiBpLkgudXNlRWZmZWN0RXZlbnQoZSk7CiAgfTsKICB1Mi51c2VJZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGkuSC51c2VJZCgpOwogIH07CiAgdTIudXNlSW1wZXJhdGl2ZUhhbmRsZSA9IGZ1bmN0aW9uKGUsIHQsIG4yKSB7CiAgICByZXR1cm4gaS5ILnVzZUltcGVyYXRpdmVIYW5kbGUoZSwgdCwgbjIpOwogIH07CiAgdTIudXNlSW5zZXJ0aW9uRWZmZWN0ID0gZnVuY3Rpb24oZSwgdCkgewogICAgcmV0dXJuIGkuSC51c2VJbnNlcnRpb25FZmZlY3QoZSwgdCk7CiAgfTsKICB1Mi51c2VMYXlvdXRFZmZlY3QgPSBmdW5jdGlvbihlLCB0KSB7CiAgICByZXR1cm4gaS5ILnVzZUxheW91dEVmZmVjdChlLCB0KTsKICB9OwogIHUyLnVzZU1lbW8gPSBmdW5jdGlvbihlLCB0KSB7CiAgICByZXR1cm4gaS5ILnVzZU1lbW8oZSwgdCk7CiAgfTsKICB1Mi51c2VPcHRpbWlzdGljID0gZnVuY3Rpb24oZSwgdCkgewogICAgcmV0dXJuIGkuSC51c2VPcHRpbWlzdGljKGUsIHQpOwogIH07CiAgdTIudXNlUmVkdWNlciA9IGZ1bmN0aW9uKGUsIHQsIG4yKSB7CiAgICByZXR1cm4gaS5ILnVzZVJlZHVjZXIoZSwgdCwgbjIpOwogIH07CiAgdTIudXNlUmVmID0gZnVuY3Rpb24oZSkgewogICAgcmV0dXJuIGkuSC51c2VSZWYoZSk7CiAgfTsKICB1Mi51c2VTdGF0ZSA9IGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiBpLkgudXNlU3RhdGUoZSk7CiAgfTsKICB1Mi51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IGZ1bmN0aW9uKGUsIHQsIG4yKSB7CiAgICByZXR1cm4gaS5ILnVzZVN5bmNFeHRlcm5hbFN0b3JlKGUsIHQsIG4yKTsKICB9OwogIHUyLnVzZVRyYW5zaXRpb24gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBpLkgudXNlVHJhbnNpdGlvbigpOwogIH07CiAgdTIudmVyc2lvbiA9ICIxOS4yLjQiOwp9KTsKdmFyIEwgPSBBKChjZSwgWTIpID0+IHsKICAidXNlIHN0cmljdCI7CiAgWTIuZXhwb3J0cyA9ICQoKTsKfSk7CnZhciBFID0gRyhMKCkpOwp2YXIgeyBBY3Rpdml0eTogcGUsIENoaWxkcmVuOiBsZSwgQ29tcG9uZW50OiBhZSwgRnJhZ21lbnQ6IF9lLCBQcm9maWxlcjogRWUsIFB1cmVDb21wb25lbnQ6IHllLCBTdHJpY3RNb2RlOiB2ZSwgU3VzcGVuc2U6IFJlLCBfX0NMSUVOVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREU6IG1lLCBfX0NPTVBJTEVSX1JVTlRJTUU6IFRlLCBjYWNoZTogQ2UsIGNhY2hlU2lnbmFsOiBTZSwgY2xvbmVFbGVtZW50OiBkZSwgY3JlYXRlQ29udGV4dDogQWUsIGNyZWF0ZUVsZW1lbnQ6IGhlLCBjcmVhdGVSZWY6IE9lLCBmb3J3YXJkUmVmOiBnZSwgaXNWYWxpZEVsZW1lbnQ6IHdlLCBsYXp5OiBQZSwgbWVtbzogTmUsIHN0YXJ0VHJhbnNpdGlvbjogamUsIHVuc3RhYmxlX3VzZUNhY2hlUmVmcmVzaDogSGUsIHVzZTogSWUsIHVzZUFjdGlvblN0YXRlOiBNZSwgdXNlQ2FsbGJhY2s6ICRlLCB1c2VDb250ZXh0OiBZZSwgdXNlRGVidWdWYWx1ZTogTGUsIHVzZURlZmVycmVkVmFsdWU6IHhlLCB1c2VFZmZlY3Q6IFVlLCB1c2VFZmZlY3RFdmVudDogRGUsIHVzZUlkOiBrZSwgdXNlSW1wZXJhdGl2ZUhhbmRsZTogYmUsIHVzZUluc2VydGlvbkVmZmVjdDogcWUsIHVzZUxheW91dEVmZmVjdDogemUsIHVzZU1lbW86IEdlLCB1c2VPcHRpbWlzdGljOiBLZSwgdXNlUmVkdWNlcjogV2UsIHVzZVJlZjogQmUsIHVzZVN0YXRlOiBRZSwgdXNlU3luY0V4dGVybmFsU3RvcmU6IFZlLCB1c2VUcmFuc2l0aW9uOiBYZSwgdmVyc2lvbjogWmUgfSA9IEU7CnZhciBKZSA9IEUuZGVmYXVsdCA/PyBFOwoKLy8gZGVubzpodHRwczovL2VzbS5zaC9yZWFjdC1kb21AMTkuMi40L1gtWkdOemMzUjVjR1ZBTXk0eUxqTUtaWEpsWVdOMC9lczIwMjIvY2pzL3JlYWN0LWRvbS1zZXJ2ZXItbGVnYWN5LmJyb3dzZXIucHJvZHVjdGlvbi5tanMKdmFyIHJlYWN0X2RvbV9zZXJ2ZXJfbGVnYWN5X2Jyb3dzZXJfcHJvZHVjdGlvbl9leHBvcnRzID0ge307Cl9fZXhwb3J0KHJlYWN0X2RvbV9zZXJ2ZXJfbGVnYWN5X2Jyb3dzZXJfcHJvZHVjdGlvbl9leHBvcnRzLCB7CiAgZGVmYXVsdDogKCkgPT4gTGEsCiAgcmVuZGVyVG9TdGF0aWNNYXJrdXA6ICgpID0+IFNhLAogIHJlbmRlclRvU3RyaW5nOiAoKSA9PiBPYSwKICB2ZXJzaW9uOiAoKSA9PiBrYQp9KTsKCi8vIHJlYWN0L3JlYWN0LnRzCnZhciByZWFjdF9leHBvcnRzID0ge307Cl9fZXhwb3J0KHJlYWN0X2V4cG9ydHMsIHsKICBBY3Rpdml0eTogKCkgPT4gcGUsCiAgQ2hpbGRyZW46ICgpID0+IGxlLAogIENvbXBvbmVudDogKCkgPT4gYWUsCiAgRnJhZ21lbnQ6ICgpID0+IF9lLAogIFByb2ZpbGVyOiAoKSA9PiBFZSwKICBQdXJlQ29tcG9uZW50OiAoKSA9PiB5ZSwKICBTdHJpY3RNb2RlOiAoKSA9PiB2ZSwKICBTdXNwZW5zZTogKCkgPT4gUmUsCiAgX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFOiAoKSA9PiBfX0NMSUVOVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREUsCiAgX19DT01QSUxFUl9SVU5USU1FOiAoKSA9PiBfX0NPTVBJTEVSX1JVTlRJTUUsCiAgY2FjaGU6ICgpID0+IENlLAogIGNhY2hlU2lnbmFsOiAoKSA9PiBTZSwKICBjbG9uZUVsZW1lbnQ6ICgpID0+IGRlLAogIGNyZWF0ZUNvbnRleHQ6ICgpID0+IEFlLAogIGNyZWF0ZUVsZW1lbnQ6ICgpID0+IGhlLAogIGNyZWF0ZVJlZjogKCkgPT4gT2UsCiAgZGVmYXVsdDogKCkgPT4gSmUsCiAgZm9yd2FyZFJlZjogKCkgPT4gZ2UsCiAgaXNWYWxpZEVsZW1lbnQ6ICgpID0+IHdlLAogIGxhenk6ICgpID0+IFBlLAogIG1lbW86ICgpID0+IE5lLAogIHN0YXJ0VHJhbnNpdGlvbjogKCkgPT4gamUsCiAgdW5zdGFibGVfdXNlQ2FjaGVSZWZyZXNoOiAoKSA9PiB1bnN0YWJsZV91c2VDYWNoZVJlZnJlc2gsCiAgdXNlOiAoKSA9PiBJZSwKICB1c2VBY3Rpb25TdGF0ZTogKCkgPT4gTWUsCiAgdXNlQ2FsbGJhY2s6ICgpID0+ICRlLAogIHVzZUNvbnRleHQ6ICgpID0+IFllLAogIHVzZURlYnVnVmFsdWU6ICgpID0+IExlLAogIHVzZURlZmVycmVkVmFsdWU6ICgpID0+IHhlLAogIHVzZUVmZmVjdDogKCkgPT4gVWUsCiAgdXNlRWZmZWN0RXZlbnQ6ICgpID0+IERlLAogIHVzZUlkOiAoKSA9PiBrZSwKICB1c2VJbXBlcmF0aXZlSGFuZGxlOiAoKSA9PiBiZSwKICB1c2VJbnNlcnRpb25FZmZlY3Q6ICgpID0+IHFlLAogIHVzZUxheW91dEVmZmVjdDogKCkgPT4gemUsCiAgdXNlTWVtbzogKCkgPT4gR2UsCiAgdXNlT3B0aW1pc3RpYzogKCkgPT4gS2UsCiAgdXNlUmVkdWNlcjogKCkgPT4gV2UsCiAgdXNlUmVmOiAoKSA9PiBCZSwKICB1c2VTdGF0ZTogKCkgPT4gUWUsCiAgdXNlU3luY0V4dGVybmFsU3RvcmU6ICgpID0+IFZlLAogIHVzZVRyYW5zaXRpb246ICgpID0+IFhlLAogIHZlcnNpb246ICgpID0+IFplCn0pOwp2YXIgX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFID0gSmUuX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFOwp2YXIgX19DT01QSUxFUl9SVU5USU1FID0gSmUuX19DT01QSUxFUl9SVU5USU1FOwp2YXIgdW5zdGFibGVfdXNlQ2FjaGVSZWZyZXNoID0gSmUudW5zdGFibGVfdXNlQ2FjaGVSZWZyZXNoOwoKLy8gZGVubzpodHRwczovL2VzbS5zaC9yZWFjdC1kb21AMTkuMi40L1gtWkdOemMzUjVjR1ZBTXk0eUxqTUtaWEpsWVdOMC9lczIwMjIvcmVhY3QtZG9tLm1qcwp2YXIgcmVhY3RfZG9tX2V4cG9ydHMgPSB7fTsKX19leHBvcnQocmVhY3RfZG9tX2V4cG9ydHMsIHsKICBfX0RPTV9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREU6ICgpID0+IEgsCiAgY3JlYXRlUG9ydGFsOiAoKSA9PiBJLAogIGRlZmF1bHQ6ICgpID0+IEssCiAgZmx1c2hTeW5jOiAoKSA9PiBiMiwKICBwcmVjb25uZWN0OiAoKSA9PiBGLAogIHByZWZldGNoRE5TOiAoKSA9PiBqLAogIHByZWluaXQ6ICgpID0+IGsyLAogIHByZWluaXRNb2R1bGU6ICgpID0+IEcyLAogIHByZWxvYWQ6ICgpID0+IHEyLAogIHByZWxvYWRNb2R1bGU6ICgpID0+IHcsCiAgcmVxdWVzdEZvcm1SZXNldDogKCkgPT4gViwKICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlczogKCkgPT4geCwKICB1c2VGb3JtU3RhdGU6ICgpID0+IFksCiAgdXNlRm9ybVN0YXR1czogKCkgPT4gejIsCiAgdmVyc2lvbjogKCkgPT4gQgp9KTsKdmFyIHJlcXVpcmUyID0gKG4yKSA9PiB7CiAgY29uc3QgZSA9IChtMikgPT4gdHlwZW9mIG0yLmRlZmF1bHQgPCAidSIgPyBtMi5kZWZhdWx0IDogbTIsIGMyID0gKG0yKSA9PiBPYmplY3QuYXNzaWduKHsKICAgIF9fZXNNb2R1bGU6IHRydWUKICB9LCBtMik7CiAgc3dpdGNoIChuMikgewogICAgY2FzZSAicmVhY3QiOgogICAgICByZXR1cm4gZShyZWFjdF9leHBvcnRzKTsKICAgIGRlZmF1bHQ6CiAgICAgIGNvbnNvbGUuZXJyb3IoJ21vZHVsZSAiJyArIG4yICsgJyIgbm90IGZvdW5kJyk7CiAgICAgIHJldHVybiBudWxsOwogIH0KfTsKdmFyIFMgPSBPYmplY3QuY3JlYXRlOwp2YXIgbCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIEUyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKdmFyIFQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczsKdmFyIFIgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7CnZhciBOID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKdmFyIHAgPSAoKHIpID0+IHR5cGVvZiByZXF1aXJlMiA8ICJ1IiA/IHJlcXVpcmUyIDogdHlwZW9mIFByb3h5IDwgInUiID8gbmV3IFByb3h5KHIsIHsKICBnZXQ6IChlLCB0KSA9PiAodHlwZW9mIHJlcXVpcmUyIDwgInUiID8gcmVxdWlyZTIgOiBlKVt0XQp9KSA6IHIpKGZ1bmN0aW9uKHIpIHsKICBpZiAodHlwZW9mIHJlcXVpcmUyIDwgInUiKSByZXR1cm4gcmVxdWlyZTIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB0aHJvdyBFcnJvcignRHluYW1pYyByZXF1aXJlIG9mICInICsgciArICciIGlzIG5vdCBzdXBwb3J0ZWQnKTsKfSk7CnZhciB5ID0gKHIsIGUpID0+ICgpID0+IChlIHx8IHIoKGUgPSB7CiAgZXhwb3J0czoge30KfSkuZXhwb3J0cywgZSksIGUuZXhwb3J0cyk7CnZhciBBMiA9IChyLCBlLCB0LCBjMikgPT4gewogIGlmIChlICYmIHR5cGVvZiBlID09ICJvYmplY3QiIHx8IHR5cGVvZiBlID09ICJmdW5jdGlvbiIpIGZvciAobGV0IGEgb2YgVChlKSkgIU4uY2FsbChyLCBhKSAmJiBhICE9PSB0ICYmIGwociwgYSwgewogICAgZ2V0OiAoKSA9PiBlW2FdLAogICAgZW51bWVyYWJsZTogIShjMiA9IEUyKGUsIGEpKSB8fCBjMi5lbnVtZXJhYmxlCiAgfSk7CiAgcmV0dXJuIHI7Cn07CnZhciBEMiA9IChyLCBlLCB0KSA9PiAodCA9IHIgIT0gbnVsbCA/IFMoUihyKSkgOiB7fSwgQTIoZSB8fCAhciB8fCAhci5fX2VzTW9kdWxlID8gbCh0LCAiZGVmYXVsdCIsIHsKICB2YWx1ZTogciwKICBlbnVtZXJhYmxlOiB0cnVlCn0pIDogdCwgcikpOwp2YXIgXyA9IHkoKGkpID0+IHsKICAidXNlIHN0cmljdCI7CiAgdmFyIGggPSBwKCJyZWFjdCIpOwogIGZ1bmN0aW9uIG8ocikgewogICAgdmFyIGUgPSAiaHR0cHM6Ly9yZWFjdC5kZXYvZXJyb3JzLyIgKyByOwogICAgaWYgKDEgPCBhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIGUgKz0gIj9hcmdzW109IiArIGVuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbMV0pOwogICAgICBmb3IgKHZhciB0ID0gMjsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgZSArPSAiJmFyZ3NbXT0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1t0XSk7CiAgICB9CiAgICByZXR1cm4gIk1pbmlmaWVkIFJlYWN0IGVycm9yICMiICsgciArICI7IHZpc2l0ICIgKyBlICsgIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIjsKICB9CiAgZnVuY3Rpb24gZjIoKSB7CiAgfQogIHZhciBuMiA9IHsKICAgIGQ6IHsKICAgICAgZjogZjIsCiAgICAgIHI6IGZ1bmN0aW9uKCkgewogICAgICAgIHRocm93IEVycm9yKG8oNTIyKSk7CiAgICAgIH0sCiAgICAgIEQ6IGYyLAogICAgICBDOiBmMiwKICAgICAgTDogZjIsCiAgICAgIG06IGYyLAogICAgICBYOiBmMiwKICAgICAgUzogZjIsCiAgICAgIE06IGYyCiAgICB9LAogICAgcDogMCwKICAgIGZpbmRET01Ob2RlOiBudWxsCiAgfSwgUCA9IFN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpOwogIGZ1bmN0aW9uIEMociwgZSwgdCkgewogICAgdmFyIGMyID0gMyA8IGFyZ3VtZW50cy5sZW5ndGggJiYgYXJndW1lbnRzWzNdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbM10gOiBudWxsOwogICAgcmV0dXJuIHsKICAgICAgJCR0eXBlb2Y6IFAsCiAgICAgIGtleTogYzIgPT0gbnVsbCA/IG51bGwgOiAiIiArIGMyLAogICAgICBjaGlsZHJlbjogciwKICAgICAgY29udGFpbmVySW5mbzogZSwKICAgICAgaW1wbGVtZW50YXRpb246IHQKICAgIH07CiAgfQogIHZhciB1MiA9IGguX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFOwogIGZ1bmN0aW9uIHMociwgZSkgewogICAgaWYgKHIgPT09ICJmb250IikgcmV0dXJuICIiOwogICAgaWYgKHR5cGVvZiBlID09ICJzdHJpbmciKSByZXR1cm4gZSA9PT0gInVzZS1jcmVkZW50aWFscyIgPyBlIDogIiI7CiAgfQogIGkuX19ET01fSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFID0gbjI7CiAgaS5jcmVhdGVQb3J0YWwgPSBmdW5jdGlvbihyLCBlKSB7CiAgICB2YXIgdCA9IDIgPCBhcmd1bWVudHMubGVuZ3RoICYmIGFyZ3VtZW50c1syXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzJdIDogbnVsbDsKICAgIGlmICghZSB8fCBlLm5vZGVUeXBlICE9PSAxICYmIGUubm9kZVR5cGUgIT09IDkgJiYgZS5ub2RlVHlwZSAhPT0gMTEpIHRocm93IEVycm9yKG8oMjk5KSk7CiAgICByZXR1cm4gQyhyLCBlLCBudWxsLCB0KTsKICB9OwogIGkuZmx1c2hTeW5jID0gZnVuY3Rpb24ocikgewogICAgdmFyIGUgPSB1Mi5ULCB0ID0gbjIucDsKICAgIHRyeSB7CiAgICAgIGlmICh1Mi5UID0gbnVsbCwgbjIucCA9IDIsIHIpIHJldHVybiByKCk7CiAgICB9IGZpbmFsbHkgewogICAgICB1Mi5UID0gZSwgbjIucCA9IHQsIG4yLmQuZigpOwogICAgfQogIH07CiAgaS5wcmVjb25uZWN0ID0gZnVuY3Rpb24ociwgZSkgewogICAgdHlwZW9mIHIgPT0gInN0cmluZyIgJiYgKGUgPyAoZSA9IGUuY3Jvc3NPcmlnaW4sIGUgPSB0eXBlb2YgZSA9PSAic3RyaW5nIiA/IGUgPT09ICJ1c2UtY3JlZGVudGlhbHMiID8gZSA6ICIiIDogdm9pZCAwKSA6IGUgPSBudWxsLCBuMi5kLkMociwgZSkpOwogIH07CiAgaS5wcmVmZXRjaEROUyA9IGZ1bmN0aW9uKHIpIHsKICAgIHR5cGVvZiByID09ICJzdHJpbmciICYmIG4yLmQuRChyKTsKICB9OwogIGkucHJlaW5pdCA9IGZ1bmN0aW9uKHIsIGUpIHsKICAgIGlmICh0eXBlb2YgciA9PSAic3RyaW5nIiAmJiBlICYmIHR5cGVvZiBlLmFzID09ICJzdHJpbmciKSB7CiAgICAgIHZhciB0ID0gZS5hcywgYzIgPSBzKHQsIGUuY3Jvc3NPcmlnaW4pLCBhID0gdHlwZW9mIGUuaW50ZWdyaXR5ID09ICJzdHJpbmciID8gZS5pbnRlZ3JpdHkgOiB2b2lkIDAsIGcgPSB0eXBlb2YgZS5mZXRjaFByaW9yaXR5ID09ICJzdHJpbmciID8gZS5mZXRjaFByaW9yaXR5IDogdm9pZCAwOwogICAgICB0ID09PSAic3R5bGUiID8gbjIuZC5TKHIsIHR5cGVvZiBlLnByZWNlZGVuY2UgPT0gInN0cmluZyIgPyBlLnByZWNlZGVuY2UgOiB2b2lkIDAsIHsKICAgICAgICBjcm9zc09yaWdpbjogYzIsCiAgICAgICAgaW50ZWdyaXR5OiBhLAogICAgICAgIGZldGNoUHJpb3JpdHk6IGcKICAgICAgfSkgOiB0ID09PSAic2NyaXB0IiAmJiBuMi5kLlgociwgewogICAgICAgIGNyb3NzT3JpZ2luOiBjMiwKICAgICAgICBpbnRlZ3JpdHk6IGEsCiAgICAgICAgZmV0Y2hQcmlvcml0eTogZywKICAgICAgICBub25jZTogdHlwZW9mIGUubm9uY2UgPT0gInN0cmluZyIgPyBlLm5vbmNlIDogdm9pZCAwCiAgICAgIH0pOwogICAgfQogIH07CiAgaS5wcmVpbml0TW9kdWxlID0gZnVuY3Rpb24ociwgZSkgewogICAgaWYgKHR5cGVvZiByID09ICJzdHJpbmciKSBpZiAodHlwZW9mIGUgPT0gIm9iamVjdCIgJiYgZSAhPT0gbnVsbCkgewogICAgICBpZiAoZS5hcyA9PSBudWxsIHx8IGUuYXMgPT09ICJzY3JpcHQiKSB7CiAgICAgICAgdmFyIHQgPSBzKGUuYXMsIGUuY3Jvc3NPcmlnaW4pOwogICAgICAgIG4yLmQuTShyLCB7CiAgICAgICAgICBjcm9zc09yaWdpbjogdCwKICAgICAgICAgIGludGVncml0eTogdHlwZW9mIGUuaW50ZWdyaXR5ID09ICJzdHJpbmciID8gZS5pbnRlZ3JpdHkgOiB2b2lkIDAsCiAgICAgICAgICBub25jZTogdHlwZW9mIGUubm9uY2UgPT0gInN0cmluZyIgPyBlLm5vbmNlIDogdm9pZCAwCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0gZWxzZSBlID09IG51bGwgJiYgbjIuZC5NKHIpOwogIH07CiAgaS5wcmVsb2FkID0gZnVuY3Rpb24ociwgZSkgewogICAgaWYgKHR5cGVvZiByID09ICJzdHJpbmciICYmIHR5cGVvZiBlID09ICJvYmplY3QiICYmIGUgIT09IG51bGwgJiYgdHlwZW9mIGUuYXMgPT0gInN0cmluZyIpIHsKICAgICAgdmFyIHQgPSBlLmFzLCBjMiA9IHModCwgZS5jcm9zc09yaWdpbik7CiAgICAgIG4yLmQuTChyLCB0LCB7CiAgICAgICAgY3Jvc3NPcmlnaW46IGMyLAogICAgICAgIGludGVncml0eTogdHlwZW9mIGUuaW50ZWdyaXR5ID09ICJzdHJpbmciID8gZS5pbnRlZ3JpdHkgOiB2b2lkIDAsCiAgICAgICAgbm9uY2U6IHR5cGVvZiBlLm5vbmNlID09ICJzdHJpbmciID8gZS5ub25jZSA6IHZvaWQgMCwKICAgICAgICB0eXBlOiB0eXBlb2YgZS50eXBlID09ICJzdHJpbmciID8gZS50eXBlIDogdm9pZCAwLAogICAgICAgIGZldGNoUHJpb3JpdHk6IHR5cGVvZiBlLmZldGNoUHJpb3JpdHkgPT0gInN0cmluZyIgPyBlLmZldGNoUHJpb3JpdHkgOiB2b2lkIDAsCiAgICAgICAgcmVmZXJyZXJQb2xpY3k6IHR5cGVvZiBlLnJlZmVycmVyUG9saWN5ID09ICJzdHJpbmciID8gZS5yZWZlcnJlclBvbGljeSA6IHZvaWQgMCwKICAgICAgICBpbWFnZVNyY1NldDogdHlwZW9mIGUuaW1hZ2VTcmNTZXQgPT0gInN0cmluZyIgPyBlLmltYWdlU3JjU2V0IDogdm9pZCAwLAogICAgICAgIGltYWdlU2l6ZXM6IHR5cGVvZiBlLmltYWdlU2l6ZXMgPT0gInN0cmluZyIgPyBlLmltYWdlU2l6ZXMgOiB2b2lkIDAsCiAgICAgICAgbWVkaWE6IHR5cGVvZiBlLm1lZGlhID09ICJzdHJpbmciID8gZS5tZWRpYSA6IHZvaWQgMAogICAgICB9KTsKICAgIH0KICB9OwogIGkucHJlbG9hZE1vZHVsZSA9IGZ1bmN0aW9uKHIsIGUpIHsKICAgIGlmICh0eXBlb2YgciA9PSAic3RyaW5nIikgaWYgKGUpIHsKICAgICAgdmFyIHQgPSBzKGUuYXMsIGUuY3Jvc3NPcmlnaW4pOwogICAgICBuMi5kLm0ociwgewogICAgICAgIGFzOiB0eXBlb2YgZS5hcyA9PSAic3RyaW5nIiAmJiBlLmFzICE9PSAic2NyaXB0IiA/IGUuYXMgOiB2b2lkIDAsCiAgICAgICAgY3Jvc3NPcmlnaW46IHQsCiAgICAgICAgaW50ZWdyaXR5OiB0eXBlb2YgZS5pbnRlZ3JpdHkgPT0gInN0cmluZyIgPyBlLmludGVncml0eSA6IHZvaWQgMAogICAgICB9KTsKICAgIH0gZWxzZSBuMi5kLm0ocik7CiAgfTsKICBpLnJlcXVlc3RGb3JtUmVzZXQgPSBmdW5jdGlvbihyKSB7CiAgICBuMi5kLnIocik7CiAgfTsKICBpLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzID0gZnVuY3Rpb24ociwgZSkgewogICAgcmV0dXJuIHIoZSk7CiAgfTsKICBpLnVzZUZvcm1TdGF0ZSA9IGZ1bmN0aW9uKHIsIGUsIHQpIHsKICAgIHJldHVybiB1Mi5ILnVzZUZvcm1TdGF0ZShyLCBlLCB0KTsKICB9OwogIGkudXNlRm9ybVN0YXR1cyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHUyLkgudXNlSG9zdFRyYW5zaXRpb25TdGF0dXMoKTsKICB9OwogIGkudmVyc2lvbiA9ICIxOS4yLjQiOwp9KTsKdmFyIHYgPSB5KChNMiwgTykgPT4gewogICJ1c2Ugc3RyaWN0IjsKICBmdW5jdGlvbiBtMigpIHsKICAgIGlmICghKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPiAidSIgfHwgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSAhPSAiZnVuY3Rpb24iKSkgdHJ5IHsKICAgICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKG0yKTsKICAgIH0gY2F0Y2ggKHIpIHsKICAgICAgY29uc29sZS5lcnJvcihyKTsKICAgIH0KICB9CiAgbTIoKSwgTy5leHBvcnRzID0gXygpOwp9KTsKdmFyIGQyID0gRDIodigpKTsKdmFyIHsgX19ET01fSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFOiBILCBjcmVhdGVQb3J0YWw6IEksIGZsdXNoU3luYzogYjIsIHByZWNvbm5lY3Q6IEYsIHByZWZldGNoRE5TOiBqLCBwcmVpbml0OiBrMiwgcHJlaW5pdE1vZHVsZTogRzIsIHByZWxvYWQ6IHEyLCBwcmVsb2FkTW9kdWxlOiB3LCByZXF1ZXN0Rm9ybVJlc2V0OiBWLCB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlczogeCwgdXNlRm9ybVN0YXRlOiBZLCB1c2VGb3JtU3RhdHVzOiB6MiwgdmVyc2lvbjogQiB9ID0gZDI7CnZhciBLID0gZDIuZGVmYXVsdCA/PyBkMjsKCi8vIGRlbm86aHR0cHM6Ly9lc20uc2gvcmVhY3QtZG9tQDE5LjIuNC9YLVpHTnpjM1I1Y0dWQU15NHlMak1LWlhKbFlXTjAvZXMyMDIyL2Nqcy9yZWFjdC1kb20tc2VydmVyLWxlZ2FjeS5icm93c2VyLnByb2R1Y3Rpb24ubWpzCnZhciByZXF1aXJlMyA9IChuMikgPT4gewogIGNvbnN0IGUgPSAobTIpID0+IHR5cGVvZiBtMi5kZWZhdWx0IDwgInUiID8gbTIuZGVmYXVsdCA6IG0yLCBjMiA9IChtMikgPT4gT2JqZWN0LmFzc2lnbih7CiAgICBfX2VzTW9kdWxlOiB0cnVlCiAgfSwgbTIpOwogIHN3aXRjaCAobjIpIHsKICAgIGNhc2UgInJlYWN0IjoKICAgICAgcmV0dXJuIGUocmVhY3RfZXhwb3J0cyk7CiAgICBjYXNlICJyZWFjdC1kb20iOgogICAgICByZXR1cm4gZShyZWFjdF9kb21fZXhwb3J0cyk7CiAgICBkZWZhdWx0OgogICAgICBjb25zb2xlLmVycm9yKCdtb2R1bGUgIicgKyBuMiArICciIG5vdCBmb3VuZCcpOwogICAgICByZXR1cm4gbnVsbDsKICB9Cn07CnZhciBkciA9IE9iamVjdC5jcmVhdGU7CnZhciBYZTIgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CnZhciBzciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CnZhciBnciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzOwp2YXIgdnIgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7CnZhciBiciA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CnZhciBaZTIgPSAoKG4yKSA9PiB0eXBlb2YgcmVxdWlyZTMgPCAidSIgPyByZXF1aXJlMyA6IHR5cGVvZiBQcm94eSA8ICJ1IiA/IG5ldyBQcm94eShuMiwgewogIGdldDogKGwzLCBpKSA9PiAodHlwZW9mIHJlcXVpcmUzIDwgInUiID8gcmVxdWlyZTMgOiBsMylbaV0KfSkgOiBuMikoZnVuY3Rpb24objIpIHsKICBpZiAodHlwZW9mIHJlcXVpcmUzIDwgInUiKSByZXR1cm4gcmVxdWlyZTMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB0aHJvdyBFcnJvcignRHluYW1pYyByZXF1aXJlIG9mICInICsgbjIgKyAnIiBpcyBub3Qgc3VwcG9ydGVkJyk7Cn0pOwp2YXIgeXIgPSAobjIsIGwzKSA9PiAoKSA9PiAobDMgfHwgbjIoKGwzID0gewogIGV4cG9ydHM6IHt9Cn0pLmV4cG9ydHMsIGwzKSwgbDMuZXhwb3J0cyk7CnZhciBUciA9IChuMiwgbDMsIGksIGUpID0+IHsKICBpZiAobDMgJiYgdHlwZW9mIGwzID09ICJvYmplY3QiIHx8IHR5cGVvZiBsMyA9PSAiZnVuY3Rpb24iKSBmb3IgKGxldCB0IG9mIGdyKGwzKSkgIWJyLmNhbGwobjIsIHQpICYmIHQgIT09IGkgJiYgWGUyKG4yLCB0LCB7CiAgICBnZXQ6ICgpID0+IGwzW3RdLAogICAgZW51bWVyYWJsZTogIShlID0gc3IobDMsIHQpKSB8fCBlLmVudW1lcmFibGUKICB9KTsKICByZXR1cm4gbjI7Cn07CnZhciBFciA9IChuMiwgbDMsIGkpID0+IChpID0gbjIgIT0gbnVsbCA/IGRyKHZyKG4yKSkgOiB7fSwgVHIobDMgfHwgIW4yIHx8ICFuMi5fX2VzTW9kdWxlID8gWGUyKGksICJkZWZhdWx0IiwgewogIHZhbHVlOiBuMiwKICBlbnVtZXJhYmxlOiB0cnVlCn0pIDogaSwgbjIpKTsKdmFyIG5yID0geXIoKGJpKSA9PiB7CiAgInVzZSBzdHJpY3QiOwogIHZhciB4dCA9IFplMigicmVhY3QiKSwgeHIyID0gWmUyKCJyZWFjdC1kb20iKTsKICBmdW5jdGlvbiBzKG4yKSB7CiAgICB2YXIgbDMgPSAiaHR0cHM6Ly9yZWFjdC5kZXYvZXJyb3JzLyIgKyBuMjsKICAgIGlmICgxIDwgYXJndW1lbnRzLmxlbmd0aCkgewogICAgICBsMyArPSAiP2FyZ3NbXT0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1sxXSk7CiAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBsMyArPSAiJmFyZ3NbXT0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tpXSk7CiAgICB9CiAgICByZXR1cm4gIk1pbmlmaWVkIFJlYWN0IGVycm9yICMiICsgbjIgKyAiOyB2aXNpdCAiICsgbDMgKyAiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4iOwogIH0KICB2YXIgUnQgPSBTeW1ib2wuZm9yKCJyZWFjdC50cmFuc2l0aW9uYWwuZWxlbWVudCIpLCB3dCA9IFN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLCBDdCA9IFN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksIEZ0ID0gU3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSwgX3QgPSBTeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLCBBdCA9IFN5bWJvbC5mb3IoInJlYWN0LmNvbnN1bWVyIiksIGNpID0gU3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLCBwaSA9IFN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksIGZpID0gU3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSwgcWkyID0gU3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLCBqaSA9IFN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSwgb2kgPSBTeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksIFJyID0gU3ltYm9sLmZvcigicmVhY3Quc2NvcGUiKSwgSXQgPSBTeW1ib2wuZm9yKCJyZWFjdC5hY3Rpdml0eSIpLCB3cjIgPSBTeW1ib2wuZm9yKCJyZWFjdC5sZWdhY3lfaGlkZGVuIiksIENyID0gU3ltYm9sLmZvcigicmVhY3QubWVtb19jYWNoZV9zZW50aW5lbCIpLCBGciA9IFN5bWJvbC5mb3IoInJlYWN0LnZpZXdfdHJhbnNpdGlvbiIpLCBKZTIgPSBTeW1ib2wuaXRlcmF0b3I7CiAgZnVuY3Rpb24gTXQobjIpIHsKICAgIHJldHVybiBuMiA9PT0gbnVsbCB8fCB0eXBlb2YgbjIgIT0gIm9iamVjdCIgPyBudWxsIDogKG4yID0gSmUyICYmIG4yW0plMl0gfHwgbjJbIkBAaXRlcmF0b3IiXSwgdHlwZW9mIG4yID09ICJmdW5jdGlvbiIgPyBuMiA6IG51bGwpOwogIH0KICB2YXIgcWwgPSBBcnJheS5pc0FycmF5OwogIGZ1bmN0aW9uIFFlMihuMiwgbDMpIHsKICAgIHZhciBpID0gbjIubGVuZ3RoICYgMywgZSA9IG4yLmxlbmd0aCAtIGksIHQgPSBsMzsKICAgIGZvciAobDMgPSAwOyBsMyA8IGU7ICkgewogICAgICB2YXIgciA9IG4yLmNoYXJDb2RlQXQobDMpICYgMjU1IHwgKG4yLmNoYXJDb2RlQXQoKytsMykgJiAyNTUpIDw8IDggfCAobjIuY2hhckNvZGVBdCgrK2wzKSAmIDI1NSkgPDwgMTYgfCAobjIuY2hhckNvZGVBdCgrK2wzKSAmIDI1NSkgPDwgMjQ7CiAgICAgICsrbDMsIHIgPSAzNDMyOTE4MzUzICogKHIgJiA2NTUzNSkgKyAoKDM0MzI5MTgzNTMgKiAociA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSAmIDQyOTQ5NjcyOTUsIHIgPSByIDw8IDE1IHwgciA+Pj4gMTcsIHIgPSA0NjE4NDU5MDcgKiAociAmIDY1NTM1KSArICgoNDYxODQ1OTA3ICogKHIgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNikgJiA0Mjk0OTY3Mjk1LCB0IF49IHIsIHQgPSB0IDw8IDEzIHwgdCA+Pj4gMTksIHQgPSA1ICogKHQgJiA2NTUzNSkgKyAoKDUgKiAodCA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSAmIDQyOTQ5NjcyOTUsIHQgPSAodCAmIDY1NTM1KSArIDI3NDkyICsgKCgodCA+Pj4gMTYpICsgNTg5NjQgJiA2NTUzNSkgPDwgMTYpOwogICAgfQogICAgc3dpdGNoIChyID0gMCwgaSkgewogICAgICBjYXNlIDM6CiAgICAgICAgciBePSAobjIuY2hhckNvZGVBdChsMyArIDIpICYgMjU1KSA8PCAxNjsKICAgICAgY2FzZSAyOgogICAgICAgIHIgXj0gKG4yLmNoYXJDb2RlQXQobDMgKyAxKSAmIDI1NSkgPDwgODsKICAgICAgY2FzZSAxOgogICAgICAgIHIgXj0gbjIuY2hhckNvZGVBdChsMykgJiAyNTUsIHIgPSAzNDMyOTE4MzUzICogKHIgJiA2NTUzNSkgKyAoKDM0MzI5MTgzNTMgKiAociA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSAmIDQyOTQ5NjcyOTUsIHIgPSByIDw8IDE1IHwgciA+Pj4gMTcsIHQgXj0gNDYxODQ1OTA3ICogKHIgJiA2NTUzNSkgKyAoKDQ2MTg0NTkwNyAqIChyID4+PiAxNikgJiA2NTUzNSkgPDwgMTYpICYgNDI5NDk2NzI5NTsKICAgIH0KICAgIHJldHVybiB0IF49IG4yLmxlbmd0aCwgdCBePSB0ID4+PiAxNiwgdCA9IDIyNDY4MjI1MDcgKiAodCAmIDY1NTM1KSArICgoMjI0NjgyMjUwNyAqICh0ID4+PiAxNikgJiA2NTUzNSkgPDwgMTYpICYgNDI5NDk2NzI5NSwgdCBePSB0ID4+PiAxMywgdCA9IDMyNjY0ODk5MDkgKiAodCAmIDY1NTM1KSArICgoMzI2NjQ4OTkwOSAqICh0ID4+PiAxNikgJiA2NTUzNSkgPDwgMTYpICYgNDI5NDk2NzI5NSwgKHQgXiB0ID4+PiAxNikgPj4+IDA7CiAgfQogIHZhciBKID0gT2JqZWN0LmFzc2lnbiwgSTIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LCBfciA9IFJlZ0V4cCgiXls6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRF1bOkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXC0uMC05XFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MF0qJCIpLCBWZTIgPSB7fSwgS2UyID0ge307CiAgZnVuY3Rpb24gJGkobjIpIHsKICAgIHJldHVybiBJMi5jYWxsKEtlMiwgbjIpID8gdHJ1ZSA6IEkyLmNhbGwoVmUyLCBuMikgPyBmYWxzZSA6IF9yLnRlc3QobjIpID8gS2UyW24yXSA9IHRydWUgOiAoVmUyW24yXSA9IHRydWUsIGZhbHNlKTsKICB9CiAgdmFyIEFyID0gbmV3IFNldCgiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQgYXNwZWN0UmF0aW8gYm9yZGVySW1hZ2VPdXRzZXQgYm9yZGVySW1hZ2VTbGljZSBib3JkZXJJbWFnZVdpZHRoIGJveEZsZXggYm94RmxleEdyb3VwIGJveE9yZGluYWxHcm91cCBjb2x1bW5Db3VudCBjb2x1bW5zIGZsZXggZmxleEdyb3cgZmxleFBvc2l0aXZlIGZsZXhTaHJpbmsgZmxleE5lZ2F0aXZlIGZsZXhPcmRlciBncmlkQXJlYSBncmlkUm93IGdyaWRSb3dFbmQgZ3JpZFJvd1NwYW4gZ3JpZFJvd1N0YXJ0IGdyaWRDb2x1bW4gZ3JpZENvbHVtbkVuZCBncmlkQ29sdW1uU3BhbiBncmlkQ29sdW1uU3RhcnQgZm9udFdlaWdodCBsaW5lQ2xhbXAgbGluZUhlaWdodCBvcGFjaXR5IG9yZGVyIG9ycGhhbnMgc2NhbGUgdGFiU2l6ZSB3aWRvd3MgekluZGV4IHpvb20gZmlsbE9wYWNpdHkgZmxvb2RPcGFjaXR5IHN0b3BPcGFjaXR5IHN0cm9rZURhc2hhcnJheSBzdHJva2VEYXNob2Zmc2V0IHN0cm9rZU1pdGVybGltaXQgc3Ryb2tlT3BhY2l0eSBzdHJva2VXaWR0aCBNb3pBbmltYXRpb25JdGVyYXRpb25Db3VudCBNb3pCb3hGbGV4IE1vekJveEZsZXhHcm91cCBNb3pMaW5lQ2xhbXAgbXNBbmltYXRpb25JdGVyYXRpb25Db3VudCBtc0ZsZXggbXNab29tIG1zRmxleEdyb3cgbXNGbGV4TmVnYXRpdmUgbXNGbGV4T3JkZXIgbXNGbGV4UG9zaXRpdmUgbXNGbGV4U2hyaW5rIG1zR3JpZENvbHVtbiBtc0dyaWRDb2x1bW5TcGFuIG1zR3JpZFJvdyBtc0dyaWRSb3dTcGFuIFdlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50IFdlYmtpdEJveEZsZXggV2ViS2l0Qm94RmxleEdyb3VwIFdlYmtpdEJveE9yZGluYWxHcm91cCBXZWJraXRDb2x1bW5Db3VudCBXZWJraXRDb2x1bW5zIFdlYmtpdEZsZXggV2Via2l0RmxleEdyb3cgV2Via2l0RmxleFBvc2l0aXZlIFdlYmtpdEZsZXhTaHJpbmsgV2Via2l0TGluZUNsYW1wIi5zcGxpdCgiICIpKSwgSXIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcChbCiAgICBbCiAgICAgICJhY2NlcHRDaGFyc2V0IiwKICAgICAgImFjY2VwdC1jaGFyc2V0IgogICAgXSwKICAgIFsKICAgICAgImh0bWxGb3IiLAogICAgICAiZm9yIgogICAgXSwKICAgIFsKICAgICAgImh0dHBFcXVpdiIsCiAgICAgICJodHRwLWVxdWl2IgogICAgXSwKICAgIFsKICAgICAgImNyb3NzT3JpZ2luIiwKICAgICAgImNyb3Nzb3JpZ2luIgogICAgXSwKICAgIFsKICAgICAgImFjY2VudEhlaWdodCIsCiAgICAgICJhY2NlbnQtaGVpZ2h0IgogICAgXSwKICAgIFsKICAgICAgImFsaWdubWVudEJhc2VsaW5lIiwKICAgICAgImFsaWdubWVudC1iYXNlbGluZSIKICAgIF0sCiAgICBbCiAgICAgICJhcmFiaWNGb3JtIiwKICAgICAgImFyYWJpYy1mb3JtIgogICAgXSwKICAgIFsKICAgICAgImJhc2VsaW5lU2hpZnQiLAogICAgICAiYmFzZWxpbmUtc2hpZnQiCiAgICBdLAogICAgWwogICAgICAiY2FwSGVpZ2h0IiwKICAgICAgImNhcC1oZWlnaHQiCiAgICBdLAogICAgWwogICAgICAiY2xpcFBhdGgiLAogICAgICAiY2xpcC1wYXRoIgogICAgXSwKICAgIFsKICAgICAgImNsaXBSdWxlIiwKICAgICAgImNsaXAtcnVsZSIKICAgIF0sCiAgICBbCiAgICAgICJjb2xvckludGVycG9sYXRpb24iLAogICAgICAiY29sb3ItaW50ZXJwb2xhdGlvbiIKICAgIF0sCiAgICBbCiAgICAgICJjb2xvckludGVycG9sYXRpb25GaWx0ZXJzIiwKICAgICAgImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyIKICAgIF0sCiAgICBbCiAgICAgICJjb2xvclByb2ZpbGUiLAogICAgICAiY29sb3ItcHJvZmlsZSIKICAgIF0sCiAgICBbCiAgICAgICJjb2xvclJlbmRlcmluZyIsCiAgICAgICJjb2xvci1yZW5kZXJpbmciCiAgICBdLAogICAgWwogICAgICAiZG9taW5hbnRCYXNlbGluZSIsCiAgICAgICJkb21pbmFudC1iYXNlbGluZSIKICAgIF0sCiAgICBbCiAgICAgICJlbmFibGVCYWNrZ3JvdW5kIiwKICAgICAgImVuYWJsZS1iYWNrZ3JvdW5kIgogICAgXSwKICAgIFsKICAgICAgImZpbGxPcGFjaXR5IiwKICAgICAgImZpbGwtb3BhY2l0eSIKICAgIF0sCiAgICBbCiAgICAgICJmaWxsUnVsZSIsCiAgICAgICJmaWxsLXJ1bGUiCiAgICBdLAogICAgWwogICAgICAiZmxvb2RDb2xvciIsCiAgICAgICJmbG9vZC1jb2xvciIKICAgIF0sCiAgICBbCiAgICAgICJmbG9vZE9wYWNpdHkiLAogICAgICAiZmxvb2Qtb3BhY2l0eSIKICAgIF0sCiAgICBbCiAgICAgICJmb250RmFtaWx5IiwKICAgICAgImZvbnQtZmFtaWx5IgogICAgXSwKICAgIFsKICAgICAgImZvbnRTaXplIiwKICAgICAgImZvbnQtc2l6ZSIKICAgIF0sCiAgICBbCiAgICAgICJmb250U2l6ZUFkanVzdCIsCiAgICAgICJmb250LXNpemUtYWRqdXN0IgogICAgXSwKICAgIFsKICAgICAgImZvbnRTdHJldGNoIiwKICAgICAgImZvbnQtc3RyZXRjaCIKICAgIF0sCiAgICBbCiAgICAgICJmb250U3R5bGUiLAogICAgICAiZm9udC1zdHlsZSIKICAgIF0sCiAgICBbCiAgICAgICJmb250VmFyaWFudCIsCiAgICAgICJmb250LXZhcmlhbnQiCiAgICBdLAogICAgWwogICAgICAiZm9udFdlaWdodCIsCiAgICAgICJmb250LXdlaWdodCIKICAgIF0sCiAgICBbCiAgICAgICJnbHlwaE5hbWUiLAogICAgICAiZ2x5cGgtbmFtZSIKICAgIF0sCiAgICBbCiAgICAgICJnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCIsCiAgICAgICJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIgogICAgXSwKICAgIFsKICAgICAgImdseXBoT3JpZW50YXRpb25WZXJ0aWNhbCIsCiAgICAgICJnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCIKICAgIF0sCiAgICBbCiAgICAgICJob3JpekFkdlgiLAogICAgICAiaG9yaXotYWR2LXgiCiAgICBdLAogICAgWwogICAgICAiaG9yaXpPcmlnaW5YIiwKICAgICAgImhvcml6LW9yaWdpbi14IgogICAgXSwKICAgIFsKICAgICAgImltYWdlUmVuZGVyaW5nIiwKICAgICAgImltYWdlLXJlbmRlcmluZyIKICAgIF0sCiAgICBbCiAgICAgICJsZXR0ZXJTcGFjaW5nIiwKICAgICAgImxldHRlci1zcGFjaW5nIgogICAgXSwKICAgIFsKICAgICAgImxpZ2h0aW5nQ29sb3IiLAogICAgICAibGlnaHRpbmctY29sb3IiCiAgICBdLAogICAgWwogICAgICAibWFya2VyRW5kIiwKICAgICAgIm1hcmtlci1lbmQiCiAgICBdLAogICAgWwogICAgICAibWFya2VyTWlkIiwKICAgICAgIm1hcmtlci1taWQiCiAgICBdLAogICAgWwogICAgICAibWFya2VyU3RhcnQiLAogICAgICAibWFya2VyLXN0YXJ0IgogICAgXSwKICAgIFsKICAgICAgIm92ZXJsaW5lUG9zaXRpb24iLAogICAgICAib3ZlcmxpbmUtcG9zaXRpb24iCiAgICBdLAogICAgWwogICAgICAib3ZlcmxpbmVUaGlja25lc3MiLAogICAgICAib3ZlcmxpbmUtdGhpY2tuZXNzIgogICAgXSwKICAgIFsKICAgICAgInBhaW50T3JkZXIiLAogICAgICAicGFpbnQtb3JkZXIiCiAgICBdLAogICAgWwogICAgICAicGFub3NlLTEiLAogICAgICAicGFub3NlLTEiCiAgICBdLAogICAgWwogICAgICAicG9pbnRlckV2ZW50cyIsCiAgICAgICJwb2ludGVyLWV2ZW50cyIKICAgIF0sCiAgICBbCiAgICAgICJyZW5kZXJpbmdJbnRlbnQiLAogICAgICAicmVuZGVyaW5nLWludGVudCIKICAgIF0sCiAgICBbCiAgICAgICJzaGFwZVJlbmRlcmluZyIsCiAgICAgICJzaGFwZS1yZW5kZXJpbmciCiAgICBdLAogICAgWwogICAgICAic3RvcENvbG9yIiwKICAgICAgInN0b3AtY29sb3IiCiAgICBdLAogICAgWwogICAgICAic3RvcE9wYWNpdHkiLAogICAgICAic3RvcC1vcGFjaXR5IgogICAgXSwKICAgIFsKICAgICAgInN0cmlrZXRocm91Z2hQb3NpdGlvbiIsCiAgICAgICJzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIgogICAgXSwKICAgIFsKICAgICAgInN0cmlrZXRocm91Z2hUaGlja25lc3MiLAogICAgICAic3RyaWtldGhyb3VnaC10aGlja25lc3MiCiAgICBdLAogICAgWwogICAgICAic3Ryb2tlRGFzaGFycmF5IiwKICAgICAgInN0cm9rZS1kYXNoYXJyYXkiCiAgICBdLAogICAgWwogICAgICAic3Ryb2tlRGFzaG9mZnNldCIsCiAgICAgICJzdHJva2UtZGFzaG9mZnNldCIKICAgIF0sCiAgICBbCiAgICAgICJzdHJva2VMaW5lY2FwIiwKICAgICAgInN0cm9rZS1saW5lY2FwIgogICAgXSwKICAgIFsKICAgICAgInN0cm9rZUxpbmVqb2luIiwKICAgICAgInN0cm9rZS1saW5lam9pbiIKICAgIF0sCiAgICBbCiAgICAgICJzdHJva2VNaXRlcmxpbWl0IiwKICAgICAgInN0cm9rZS1taXRlcmxpbWl0IgogICAgXSwKICAgIFsKICAgICAgInN0cm9rZU9wYWNpdHkiLAogICAgICAic3Ryb2tlLW9wYWNpdHkiCiAgICBdLAogICAgWwogICAgICAic3Ryb2tlV2lkdGgiLAogICAgICAic3Ryb2tlLXdpZHRoIgogICAgXSwKICAgIFsKICAgICAgInRleHRBbmNob3IiLAogICAgICAidGV4dC1hbmNob3IiCiAgICBdLAogICAgWwogICAgICAidGV4dERlY29yYXRpb24iLAogICAgICAidGV4dC1kZWNvcmF0aW9uIgogICAgXSwKICAgIFsKICAgICAgInRleHRSZW5kZXJpbmciLAogICAgICAidGV4dC1yZW5kZXJpbmciCiAgICBdLAogICAgWwogICAgICAidHJhbnNmb3JtT3JpZ2luIiwKICAgICAgInRyYW5zZm9ybS1vcmlnaW4iCiAgICBdLAogICAgWwogICAgICAidW5kZXJsaW5lUG9zaXRpb24iLAogICAgICAidW5kZXJsaW5lLXBvc2l0aW9uIgogICAgXSwKICAgIFsKICAgICAgInVuZGVybGluZVRoaWNrbmVzcyIsCiAgICAgICJ1bmRlcmxpbmUtdGhpY2tuZXNzIgogICAgXSwKICAgIFsKICAgICAgInVuaWNvZGVCaWRpIiwKICAgICAgInVuaWNvZGUtYmlkaSIKICAgIF0sCiAgICBbCiAgICAgICJ1bmljb2RlUmFuZ2UiLAogICAgICAidW5pY29kZS1yYW5nZSIKICAgIF0sCiAgICBbCiAgICAgICJ1bml0c1BlckVtIiwKICAgICAgInVuaXRzLXBlci1lbSIKICAgIF0sCiAgICBbCiAgICAgICJ2QWxwaGFiZXRpYyIsCiAgICAgICJ2LWFscGhhYmV0aWMiCiAgICBdLAogICAgWwogICAgICAidkhhbmdpbmciLAogICAgICAidi1oYW5naW5nIgogICAgXSwKICAgIFsKICAgICAgInZJZGVvZ3JhcGhpYyIsCiAgICAgICJ2LWlkZW9ncmFwaGljIgogICAgXSwKICAgIFsKICAgICAgInZNYXRoZW1hdGljYWwiLAogICAgICAidi1tYXRoZW1hdGljYWwiCiAgICBdLAogICAgWwogICAgICAidmVjdG9yRWZmZWN0IiwKICAgICAgInZlY3Rvci1lZmZlY3QiCiAgICBdLAogICAgWwogICAgICAidmVydEFkdlkiLAogICAgICAidmVydC1hZHYteSIKICAgIF0sCiAgICBbCiAgICAgICJ2ZXJ0T3JpZ2luWCIsCiAgICAgICJ2ZXJ0LW9yaWdpbi14IgogICAgXSwKICAgIFsKICAgICAgInZlcnRPcmlnaW5ZIiwKICAgICAgInZlcnQtb3JpZ2luLXkiCiAgICBdLAogICAgWwogICAgICAid29yZFNwYWNpbmciLAogICAgICAid29yZC1zcGFjaW5nIgogICAgXSwKICAgIFsKICAgICAgIndyaXRpbmdNb2RlIiwKICAgICAgIndyaXRpbmctbW9kZSIKICAgIF0sCiAgICBbCiAgICAgICJ4bWxuc1hsaW5rIiwKICAgICAgInhtbG5zOnhsaW5rIgogICAgXSwKICAgIFsKICAgICAgInhIZWlnaHQiLAogICAgICAieC1oZWlnaHQiCiAgICBdCiAgXSksIE1yID0gL1siJyY8Pl0vOwogIGZ1bmN0aW9uIFQzKG4yKSB7CiAgICBpZiAodHlwZW9mIG4yID09ICJib29sZWFuIiB8fCB0eXBlb2YgbjIgPT0gIm51bWJlciIgfHwgdHlwZW9mIG4yID09ICJiaWdpbnQiKSByZXR1cm4gIiIgKyBuMjsKICAgIG4yID0gIiIgKyBuMjsKICAgIHZhciBsMyA9IE1yLmV4ZWMobjIpOwogICAgaWYgKGwzKSB7CiAgICAgIHZhciBpID0gIiIsIGUsIHQgPSAwOwogICAgICBmb3IgKGUgPSBsMy5pbmRleDsgZSA8IG4yLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgc3dpdGNoIChuMi5jaGFyQ29kZUF0KGUpKSB7CiAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICBsMyA9ICImcXVvdDsiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgIGwzID0gIiZhbXA7IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM5OgogICAgICAgICAgICBsMyA9ICImI3gyNzsiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNjA6CiAgICAgICAgICAgIGwzID0gIiZsdDsiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNjI6CiAgICAgICAgICAgIGwzID0gIiZndDsiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0ICE9PSBlICYmIChpICs9IG4yLnNsaWNlKHQsIGUpKSwgdCA9IGUgKyAxLCBpICs9IGwzOwogICAgICB9CiAgICAgIG4yID0gdCAhPT0gZSA/IGkgKyBuMi5zbGljZSh0LCBlKSA6IGk7CiAgICB9CiAgICByZXR1cm4gbjI7CiAgfQogIHZhciBQciA9IC8oW0EtWl0pL2csIFNyID0gL15tcy0vLCBPciA9IC9eW1x1MDAwMC1cdTAwMUYgXSpqW1xyXG5cdF0qYVtcclxuXHRdKnZbXHJcblx0XSphW1xyXG5cdF0qc1tcclxuXHRdKmNbXHJcblx0XSpyW1xyXG5cdF0qaVtcclxuXHRdKnBbXHJcblx0XSp0W1xyXG5cdF0qOi9pOwogIGZ1bmN0aW9uIGdsKG4yKSB7CiAgICByZXR1cm4gT3IudGVzdCgiIiArIG4yKSA/ICJqYXZhc2NyaXB0OnRocm93IG5ldyBFcnJvcignUmVhY3QgaGFzIGJsb2NrZWQgYSBqYXZhc2NyaXB0OiBVUkwgYXMgYSBzZWN1cml0eSBwcmVjYXV0aW9uLicpIiA6IG4yOwogIH0KICB2YXIgSG4gPSB4dC5fX0NMSUVOVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREUsIFB0ID0geHIyLl9fRE9NX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1dBUk5fVVNFUlNfVEhFWV9DQU5OT1RfVVBHUkFERSwga3IgPSB7CiAgICBwZW5kaW5nOiBmYWxzZSwKICAgIGRhdGE6IG51bGwsCiAgICBtZXRob2Q6IG51bGwsCiAgICBhY3Rpb246IG51bGwKICB9LCB1biA9IFB0LmQ7CiAgUHQuZCA9IHsKICAgIGY6IHVuLmYsCiAgICByOiB1bi5yLAogICAgRDogcHIsCiAgICBDOiBxciwKICAgIEw6IGpyLAogICAgbTogJHIsCiAgICBYOiBsYSwKICAgIFM6IG5hLAogICAgTTogaWEKICB9OwogIHZhciBLMiA9IFtdLCBYbiA9IG51bGwsIFN0ID0gLyg8XC98PCkocykoY3JpcHQpL2dpOwogIGZ1bmN0aW9uIE90KG4yLCBsMywgaSwgZSkgewogICAgcmV0dXJuICIiICsgbDMgKyAoaSA9PT0gInMiID8gIlxcdTAwNzMiIDogIlxcdTAwNTMiKSArIGU7CiAgfQogIGZ1bmN0aW9uIExyKG4yLCBsMywgaSwgZSwgdCkgewogICAgcmV0dXJuIHsKICAgICAgaWRQcmVmaXg6IG4yID09PSB2b2lkIDAgPyAiIiA6IG4yLAogICAgICBuZXh0Rm9ybUlEOiAwLAogICAgICBzdHJlYW1pbmdGb3JtYXQ6IDAsCiAgICAgIGJvb3RzdHJhcFNjcmlwdENvbnRlbnQ6IGksCiAgICAgIGJvb3RzdHJhcFNjcmlwdHM6IGUsCiAgICAgIGJvb3RzdHJhcE1vZHVsZXM6IHQsCiAgICAgIGluc3RydWN0aW9uczogMCwKICAgICAgaGFzQm9keTogZmFsc2UsCiAgICAgIGhhc0h0bWw6IGZhbHNlLAogICAgICB1bmtub3duUmVzb3VyY2VzOiB7fSwKICAgICAgZG5zUmVzb3VyY2VzOiB7fSwKICAgICAgY29ubmVjdFJlc291cmNlczogewogICAgICAgIGRlZmF1bHQ6IHt9LAogICAgICAgIGFub255bW91czoge30sCiAgICAgICAgY3JlZGVudGlhbHM6IHt9CiAgICAgIH0sCiAgICAgIGltYWdlUmVzb3VyY2VzOiB7fSwKICAgICAgc3R5bGVSZXNvdXJjZXM6IHt9LAogICAgICBzY3JpcHRSZXNvdXJjZXM6IHt9LAogICAgICBtb2R1bGVVbmtub3duUmVzb3VyY2VzOiB7fSwKICAgICAgbW9kdWxlU2NyaXB0UmVzb3VyY2VzOiB7fQogICAgfTsKICB9CiAgZnVuY3Rpb24gTjIobjIsIGwzLCBpLCBlKSB7CiAgICByZXR1cm4gewogICAgICBpbnNlcnRpb25Nb2RlOiBuMiwKICAgICAgc2VsZWN0ZWRWYWx1ZTogbDMsCiAgICAgIHRhZ1Njb3BlOiBpLAogICAgICB2aWV3VHJhbnNpdGlvbjogZQogICAgfTsKICB9CiAgZnVuY3Rpb24gbWUyKG4yLCBsMywgaSkgewogICAgdmFyIGUgPSBuMi50YWdTY29wZSAmIC0yNTsKICAgIHN3aXRjaCAobDMpIHsKICAgICAgY2FzZSAibm9zY3JpcHQiOgogICAgICAgIHJldHVybiBOMigyLCBudWxsLCBlIHwgMSwgbnVsbCk7CiAgICAgIGNhc2UgInNlbGVjdCI6CiAgICAgICAgcmV0dXJuIE4yKDIsIGkudmFsdWUgIT0gbnVsbCA/IGkudmFsdWUgOiBpLmRlZmF1bHRWYWx1ZSwgZSwgbnVsbCk7CiAgICAgIGNhc2UgInN2ZyI6CiAgICAgICAgcmV0dXJuIE4yKDQsIG51bGwsIGUsIG51bGwpOwogICAgICBjYXNlICJwaWN0dXJlIjoKICAgICAgICByZXR1cm4gTjIoMiwgbnVsbCwgZSB8IDIsIG51bGwpOwogICAgICBjYXNlICJtYXRoIjoKICAgICAgICByZXR1cm4gTjIoNSwgbnVsbCwgZSwgbnVsbCk7CiAgICAgIGNhc2UgImZvcmVpZ25PYmplY3QiOgogICAgICAgIHJldHVybiBOMigyLCBudWxsLCBlLCBudWxsKTsKICAgICAgY2FzZSAidGFibGUiOgogICAgICAgIHJldHVybiBOMig2LCBudWxsLCBlLCBudWxsKTsKICAgICAgY2FzZSAidGhlYWQiOgogICAgICBjYXNlICJ0Ym9keSI6CiAgICAgIGNhc2UgInRmb290IjoKICAgICAgICByZXR1cm4gTjIoNywgbnVsbCwgZSwgbnVsbCk7CiAgICAgIGNhc2UgImNvbGdyb3VwIjoKICAgICAgICByZXR1cm4gTjIoOSwgbnVsbCwgZSwgbnVsbCk7CiAgICAgIGNhc2UgInRyIjoKICAgICAgICByZXR1cm4gTjIoOCwgbnVsbCwgZSwgbnVsbCk7CiAgICAgIGNhc2UgImhlYWQiOgogICAgICAgIGlmICgyID4gbjIuaW5zZXJ0aW9uTW9kZSkgcmV0dXJuIE4yKDMsIG51bGwsIGUsIG51bGwpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJodG1sIjoKICAgICAgICBpZiAobjIuaW5zZXJ0aW9uTW9kZSA9PT0gMCkgcmV0dXJuIE4yKDEsIG51bGwsIGUsIG51bGwpOwogICAgfQogICAgcmV0dXJuIDYgPD0gbjIuaW5zZXJ0aW9uTW9kZSB8fCAyID4gbjIuaW5zZXJ0aW9uTW9kZSA/IE4yKDIsIG51bGwsIGUsIG51bGwpIDogbjIudGFnU2NvcGUgIT09IGUgPyBOMihuMi5pbnNlcnRpb25Nb2RlLCBuMi5zZWxlY3RlZFZhbHVlLCBlLCBudWxsKSA6IG4yOwogIH0KICBmdW5jdGlvbiBrdChuMikgewogICAgcmV0dXJuIG4yID09PSBudWxsID8gbnVsbCA6IHsKICAgICAgdXBkYXRlOiBuMi51cGRhdGUsCiAgICAgIGVudGVyOiAibm9uZSIsCiAgICAgIGV4aXQ6ICJub25lIiwKICAgICAgc2hhcmU6IG4yLnVwZGF0ZSwKICAgICAgbmFtZTogbjIuYXV0b05hbWUsCiAgICAgIGF1dG9OYW1lOiBuMi5hdXRvTmFtZSwKICAgICAgbmFtZUlkeDogMAogICAgfTsKICB9CiAgZnVuY3Rpb24gSGkobjIsIGwzKSB7CiAgICByZXR1cm4gbDMudGFnU2NvcGUgJiAzMiAmJiAobjIuaW5zdHJ1Y3Rpb25zIHw9IDEyOCksIE4yKGwzLmluc2VydGlvbk1vZGUsIGwzLnNlbGVjdGVkVmFsdWUsIGwzLnRhZ1Njb3BlIHwgMTIsIGt0KGwzLnZpZXdUcmFuc2l0aW9uKSk7CiAgfQogIGZ1bmN0aW9uIFpsKG4yLCBsMykgewogICAgbjIgPSBrdChsMy52aWV3VHJhbnNpdGlvbik7CiAgICB2YXIgaSA9IGwzLnRhZ1Njb3BlIHwgMTY7CiAgICByZXR1cm4gbjIgIT09IG51bGwgJiYgbjIuc2hhcmUgIT09ICJub25lIiAmJiAoaSB8PSA2NCksIE4yKGwzLmluc2VydGlvbk1vZGUsIGwzLnNlbGVjdGVkVmFsdWUsIGksIG4yKTsKICB9CiAgdmFyIHBlMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgZnVuY3Rpb24gTHQobjIsIGwzKSB7CiAgICBpZiAodHlwZW9mIGwzICE9ICJvYmplY3QiKSB0aHJvdyBFcnJvcihzKDYyKSk7CiAgICB2YXIgaSA9IHRydWUsIGU7CiAgICBmb3IgKGUgaW4gbDMpIGlmIChJMi5jYWxsKGwzLCBlKSkgewogICAgICB2YXIgdCA9IGwzW2VdOwogICAgICBpZiAodCAhPSBudWxsICYmIHR5cGVvZiB0ICE9ICJib29sZWFuIiAmJiB0ICE9PSAiIikgewogICAgICAgIGlmIChlLmluZGV4T2YoIi0tIikgPT09IDApIHsKICAgICAgICAgIHZhciByID0gVDMoZSk7CiAgICAgICAgICB0ID0gVDMoKCIiICsgdCkudHJpbSgpKTsKICAgICAgICB9IGVsc2UgciA9IHBlMi5nZXQoZSksIHIgPT09IHZvaWQgMCAmJiAociA9IFQzKGUucmVwbGFjZShQciwgIi0kMSIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZShTciwgIi1tcy0iKSksIHBlMi5zZXQoZSwgcikpLCB0ID0gdHlwZW9mIHQgPT0gIm51bWJlciIgPyB0ID09PSAwIHx8IEFyLmhhcyhlKSA/ICIiICsgdCA6IHQgKyAicHgiIDogVDMoKCIiICsgdCkudHJpbSgpKTsKICAgICAgICBpID8gKGkgPSBmYWxzZSwgbjIucHVzaCgnIHN0eWxlPSInLCByLCAiOiIsIHQpKSA6IG4yLnB1c2goIjsiLCByLCAiOiIsIHQpOwogICAgICB9CiAgICB9CiAgICBpIHx8IG4yLnB1c2goJyInKTsKICB9CiAgZnVuY3Rpb24gV2kobjIsIGwzLCBpKSB7CiAgICBpICYmIHR5cGVvZiBpICE9ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGkgIT0gInN5bWJvbCIgJiYgbjIucHVzaCgiICIsIGwzLCAnPSIiJyk7CiAgfQogIGZ1bmN0aW9uIFUyKG4yLCBsMywgaSkgewogICAgdHlwZW9mIGkgIT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgaSAhPSAic3ltYm9sIiAmJiB0eXBlb2YgaSAhPSAiYm9vbGVhbiIgJiYgbjIucHVzaCgiICIsIGwzLCAnPSInLCBUMyhpKSwgJyInKTsKICB9CiAgdmFyIER0ID0gVDMoImphdmFzY3JpcHQ6dGhyb3cgbmV3IEVycm9yKCdSZWFjdCBmb3JtIHVuZXhwZWN0ZWRseSBzdWJtaXR0ZWQuJykiKTsKICBmdW5jdGlvbiBraShuMiwgbDMpIHsKICAgIHRoaXMucHVzaCgnPGlucHV0IHR5cGU9ImhpZGRlbiInKSwgTnQobjIpLCBVMih0aGlzLCAibmFtZSIsIGwzKSwgVTIodGhpcywgInZhbHVlIiwgbjIpLCB0aGlzLnB1c2goIi8+Iik7CiAgfQogIGZ1bmN0aW9uIE50KG4yKSB7CiAgICBpZiAodHlwZW9mIG4yICE9ICJzdHJpbmciKSB0aHJvdyBFcnJvcihzKDQ4MCkpOwogIH0KICBmdW5jdGlvbiB6dChuMiwgbDMpIHsKICAgIGlmICh0eXBlb2YgbDMuJCRGT1JNX0FDVElPTiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgIHZhciBpID0gbjIubmV4dEZvcm1JRCsrOwogICAgICBuMiA9IG4yLmlkUHJlZml4ICsgaTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgZSA9IGwzLiQkRk9STV9BQ1RJT04objIpOwogICAgICAgIGlmIChlKSB7CiAgICAgICAgICB2YXIgdCA9IGUuZGF0YTsKICAgICAgICAgIHQ/LmZvckVhY2goTnQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTsKICAgICAgfSBjYXRjaCAocikgewogICAgICAgIGlmICh0eXBlb2YgciA9PSAib2JqZWN0IiAmJiByICE9PSBudWxsICYmIHR5cGVvZiByLnRoZW4gPT0gImZ1bmN0aW9uIikgdGhyb3cgcjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGZ1bmN0aW9uIHFlMihuMiwgbDMsIGksIGUsIHQsIHIsIGEsIGMyKSB7CiAgICB2YXIgdTIgPSBudWxsOwogICAgaWYgKHR5cGVvZiBlID09ICJmdW5jdGlvbiIpIHsKICAgICAgdmFyIGggPSB6dChsMywgZSk7CiAgICAgIGggIT09IG51bGwgPyAoYzIgPSBoLm5hbWUsIGUgPSBoLmFjdGlvbiB8fCAiIiwgdCA9IGguZW5jVHlwZSwgciA9IGgubWV0aG9kLCBhID0gaC50YXJnZXQsIHUyID0gaC5kYXRhKSA6IChuMi5wdXNoKCIgIiwgImZvcm1BY3Rpb24iLCAnPSInLCBEdCwgJyInKSwgYSA9IHIgPSB0ID0gZSA9IGMyID0gbnVsbCwgQnQobDMsIGkpKTsKICAgIH0KICAgIHJldHVybiBjMiAhPSBudWxsICYmIEMobjIsICJuYW1lIiwgYzIpLCBlICE9IG51bGwgJiYgQyhuMiwgImZvcm1BY3Rpb24iLCBlKSwgdCAhPSBudWxsICYmIEMobjIsICJmb3JtRW5jVHlwZSIsIHQpLCByICE9IG51bGwgJiYgQyhuMiwgImZvcm1NZXRob2QiLCByKSwgYSAhPSBudWxsICYmIEMobjIsICJmb3JtVGFyZ2V0IiwgYSksIHUyOwogIH0KICBmdW5jdGlvbiBDKG4yLCBsMywgaSkgewogICAgc3dpdGNoIChsMykgewogICAgICBjYXNlICJjbGFzc05hbWUiOgogICAgICAgIFUyKG4yLCAiY2xhc3MiLCBpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidGFiSW5kZXgiOgogICAgICAgIFUyKG4yLCAidGFiaW5kZXgiLCBpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiZGlyIjoKICAgICAgY2FzZSAicm9sZSI6CiAgICAgIGNhc2UgInZpZXdCb3giOgogICAgICBjYXNlICJ3aWR0aCI6CiAgICAgIGNhc2UgImhlaWdodCI6CiAgICAgICAgVTIobjIsIGwzLCBpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAic3R5bGUiOgogICAgICAgIEx0KG4yLCBpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAic3JjIjoKICAgICAgY2FzZSAiaHJlZiI6CiAgICAgICAgaWYgKGkgPT09ICIiKSBicmVhazsKICAgICAgY2FzZSAiYWN0aW9uIjoKICAgICAgY2FzZSAiZm9ybUFjdGlvbiI6CiAgICAgICAgaWYgKGkgPT0gbnVsbCB8fCB0eXBlb2YgaSA9PSAiZnVuY3Rpb24iIHx8IHR5cGVvZiBpID09ICJzeW1ib2wiIHx8IHR5cGVvZiBpID09ICJib29sZWFuIikgYnJlYWs7CiAgICAgICAgaSA9IGdsKCIiICsgaSksIG4yLnB1c2goIiAiLCBsMywgJz0iJywgVDMoaSksICciJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImRlZmF1bHRWYWx1ZSI6CiAgICAgIGNhc2UgImRlZmF1bHRDaGVja2VkIjoKICAgICAgY2FzZSAiaW5uZXJIVE1MIjoKICAgICAgY2FzZSAic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIjoKICAgICAgY2FzZSAic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIjoKICAgICAgY2FzZSAicmVmIjoKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiYXV0b0ZvY3VzIjoKICAgICAgY2FzZSAibXVsdGlwbGUiOgogICAgICBjYXNlICJtdXRlZCI6CiAgICAgICAgV2kobjIsIGwzLnRvTG93ZXJDYXNlKCksIGkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ4bGlua0hyZWYiOgogICAgICAgIGlmICh0eXBlb2YgaSA9PSAiZnVuY3Rpb24iIHx8IHR5cGVvZiBpID09ICJzeW1ib2wiIHx8IHR5cGVvZiBpID09ICJib29sZWFuIikgYnJlYWs7CiAgICAgICAgaSA9IGdsKCIiICsgaSksIG4yLnB1c2goIiAiLCAieGxpbms6aHJlZiIsICc9IicsIFQzKGkpLCAnIicpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJjb250ZW50RWRpdGFibGUiOgogICAgICBjYXNlICJzcGVsbENoZWNrIjoKICAgICAgY2FzZSAiZHJhZ2dhYmxlIjoKICAgICAgY2FzZSAidmFsdWUiOgogICAgICBjYXNlICJhdXRvUmV2ZXJzZSI6CiAgICAgIGNhc2UgImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiOgogICAgICBjYXNlICJmb2N1c2FibGUiOgogICAgICBjYXNlICJwcmVzZXJ2ZUFscGhhIjoKICAgICAgICB0eXBlb2YgaSAhPSAiZnVuY3Rpb24iICYmIHR5cGVvZiBpICE9ICJzeW1ib2wiICYmIG4yLnB1c2goIiAiLCBsMywgJz0iJywgVDMoaSksICciJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImluZXJ0IjoKICAgICAgY2FzZSAiYWxsb3dGdWxsU2NyZWVuIjoKICAgICAgY2FzZSAiYXN5bmMiOgogICAgICBjYXNlICJhdXRvUGxheSI6CiAgICAgIGNhc2UgImNvbnRyb2xzIjoKICAgICAgY2FzZSAiZGVmYXVsdCI6CiAgICAgIGNhc2UgImRlZmVyIjoKICAgICAgY2FzZSAiZGlzYWJsZWQiOgogICAgICBjYXNlICJkaXNhYmxlUGljdHVyZUluUGljdHVyZSI6CiAgICAgIGNhc2UgImRpc2FibGVSZW1vdGVQbGF5YmFjayI6CiAgICAgIGNhc2UgImZvcm1Ob1ZhbGlkYXRlIjoKICAgICAgY2FzZSAiaGlkZGVuIjoKICAgICAgY2FzZSAibG9vcCI6CiAgICAgIGNhc2UgIm5vTW9kdWxlIjoKICAgICAgY2FzZSAibm9WYWxpZGF0ZSI6CiAgICAgIGNhc2UgIm9wZW4iOgogICAgICBjYXNlICJwbGF5c0lubGluZSI6CiAgICAgIGNhc2UgInJlYWRPbmx5IjoKICAgICAgY2FzZSAicmVxdWlyZWQiOgogICAgICBjYXNlICJyZXZlcnNlZCI6CiAgICAgIGNhc2UgInNjb3BlZCI6CiAgICAgIGNhc2UgInNlYW1sZXNzIjoKICAgICAgY2FzZSAiaXRlbVNjb3BlIjoKICAgICAgICBpICYmIHR5cGVvZiBpICE9ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGkgIT0gInN5bWJvbCIgJiYgbjIucHVzaCgiICIsIGwzLCAnPSIiJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImNhcHR1cmUiOgogICAgICBjYXNlICJkb3dubG9hZCI6CiAgICAgICAgaSA9PT0gdHJ1ZSA/IG4yLnB1c2goIiAiLCBsMywgJz0iIicpIDogaSAhPT0gZmFsc2UgJiYgdHlwZW9mIGkgIT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgaSAhPSAic3ltYm9sIiAmJiBuMi5wdXNoKCIgIiwgbDMsICc9IicsIFQzKGkpLCAnIicpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJjb2xzIjoKICAgICAgY2FzZSAicm93cyI6CiAgICAgIGNhc2UgInNpemUiOgogICAgICBjYXNlICJzcGFuIjoKICAgICAgICB0eXBlb2YgaSAhPSAiZnVuY3Rpb24iICYmIHR5cGVvZiBpICE9ICJzeW1ib2wiICYmICFpc05hTihpKSAmJiAxIDw9IGkgJiYgbjIucHVzaCgiICIsIGwzLCAnPSInLCBUMyhpKSwgJyInKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAicm93U3BhbiI6CiAgICAgIGNhc2UgInN0YXJ0IjoKICAgICAgICB0eXBlb2YgaSA9PSAiZnVuY3Rpb24iIHx8IHR5cGVvZiBpID09ICJzeW1ib2wiIHx8IGlzTmFOKGkpIHx8IG4yLnB1c2goIiAiLCBsMywgJz0iJywgVDMoaSksICciJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInhsaW5rQWN0dWF0ZSI6CiAgICAgICAgVTIobjIsICJ4bGluazphY3R1YXRlIiwgaSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInhsaW5rQXJjcm9sZSI6CiAgICAgICAgVTIobjIsICJ4bGluazphcmNyb2xlIiwgaSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInhsaW5rUm9sZSI6CiAgICAgICAgVTIobjIsICJ4bGluazpyb2xlIiwgaSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInhsaW5rU2hvdyI6CiAgICAgICAgVTIobjIsICJ4bGluazpzaG93IiwgaSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInhsaW5rVGl0bGUiOgogICAgICAgIFUyKG4yLCAieGxpbms6dGl0bGUiLCBpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAieGxpbmtUeXBlIjoKICAgICAgICBVMihuMiwgInhsaW5rOnR5cGUiLCBpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAieG1sQmFzZSI6CiAgICAgICAgVTIobjIsICJ4bWw6YmFzZSIsIGkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ4bWxMYW5nIjoKICAgICAgICBVMihuMiwgInhtbDpsYW5nIiwgaSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInhtbFNwYWNlIjoKICAgICAgICBVMihuMiwgInhtbDpzcGFjZSIsIGkpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGlmICgoISgyIDwgbDMubGVuZ3RoKSB8fCBsM1swXSAhPT0gIm8iICYmIGwzWzBdICE9PSAiTyIgfHwgbDNbMV0gIT09ICJuIiAmJiBsM1sxXSAhPT0gIk4iKSAmJiAobDMgPSBJci5nZXQobDMpIHx8IGwzLCAkaShsMykpKSB7CiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBpKSB7CiAgICAgICAgICAgIGNhc2UgImZ1bmN0aW9uIjoKICAgICAgICAgICAgY2FzZSAic3ltYm9sIjoKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgICAgICAgIHZhciBlID0gbDMudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTsKICAgICAgICAgICAgICBpZiAoZSAhPT0gImRhdGEtIiAmJiBlICE9PSAiYXJpYS0iKSByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBuMi5wdXNoKCIgIiwgbDMsICc9IicsIFQzKGkpLCAnIicpOwogICAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gUShuMiwgbDMsIGkpIHsKICAgIGlmIChsMyAhPSBudWxsKSB7CiAgICAgIGlmIChpICE9IG51bGwpIHRocm93IEVycm9yKHMoNjApKTsKICAgICAgaWYgKHR5cGVvZiBsMyAhPSAib2JqZWN0IiB8fCAhKCJfX2h0bWwiIGluIGwzKSkgdGhyb3cgRXJyb3Iocyg2MSkpOwogICAgICBsMyA9IGwzLl9faHRtbCwgbDMgIT0gbnVsbCAmJiBuMi5wdXNoKCIiICsgbDMpOwogICAgfQogIH0KICBmdW5jdGlvbiBEcihuMikgewogICAgdmFyIGwzID0gIiI7CiAgICByZXR1cm4geHQuQ2hpbGRyZW4uZm9yRWFjaChuMiwgZnVuY3Rpb24oaSkgewogICAgICBpICE9IG51bGwgJiYgKGwzICs9IGkpOwogICAgfSksIGwzOwogIH0KICBmdW5jdGlvbiBCdChuMiwgbDMpIHsKICAgIGlmICgobjIuaW5zdHJ1Y3Rpb25zICYgMTYpID09PSAwKSB7CiAgICAgIG4yLmluc3RydWN0aW9ucyB8PSAxNjsKICAgICAgdmFyIGkgPSBsMy5wcmVhbWJsZSwgZSA9IGwzLmJvb3RzdHJhcENodW5rczsKICAgICAgKGkuaHRtbENodW5rcyB8fCBpLmhlYWRDaHVua3MpICYmIGUubGVuZ3RoID09PSAwID8gKGUucHVzaChsMy5zdGFydElubGluZVNjcmlwdCksIEpsKGUsIG4yKSwgZS5wdXNoKCI+IiwgYGFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsZnVuY3Rpb24oYSl7aWYoIWEuZGVmYXVsdFByZXZlbnRlZCl7dmFyIGM9YS50YXJnZXQsZD1hLnN1Ym1pdHRlcixlPWMuYWN0aW9uLGI9ZDtpZihkKXt2YXIgZj1kLmdldEF0dHJpYnV0ZSgiZm9ybUFjdGlvbiIpO251bGwhPWYmJihlPWYsYj1udWxsKX0iamF2YXNjcmlwdDp0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IGZvcm0gdW5leHBlY3RlZGx5IHN1Ym1pdHRlZC4nKSI9PT1lJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGI/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLm5hbWU9Yi5uYW1lLGEudmFsdWU9Yi52YWx1ZSxiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsYiksYj1uZXcgRm9ybURhdGEoYyksYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpKTpiPW5ldyBGb3JtRGF0YShjKSxhPWMub3duZXJEb2N1bWVudHx8YywoYS4kJHJlYWN0Rm9ybVJlcGxheT1hLiQkcmVhY3RGb3JtUmVwbGF5fHxbXSkucHVzaChjLGQsYikpfX0pO2AsICI8XC9zY3JpcHQ+IikpIDogZS51bnNoaWZ0KGwzLnN0YXJ0SW5saW5lU2NyaXB0LCAiPiIsIGBhZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLGZ1bmN0aW9uKGEpe2lmKCFhLmRlZmF1bHRQcmV2ZW50ZWQpe3ZhciBjPWEudGFyZ2V0LGQ9YS5zdWJtaXR0ZXIsZT1jLmFjdGlvbixiPWQ7aWYoZCl7dmFyIGY9ZC5nZXRBdHRyaWJ1dGUoImZvcm1BY3Rpb24iKTtudWxsIT1mJiYoZT1mLGI9bnVsbCl9ImphdmFzY3JpcHQ6dGhyb3cgbmV3IEVycm9yKCdSZWFjdCBmb3JtIHVuZXhwZWN0ZWRseSBzdWJtaXR0ZWQuJykiPT09ZSYmKGEucHJldmVudERlZmF1bHQoKSxiPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYS5uYW1lPWIubmFtZSxhLnZhbHVlPWIudmFsdWUsYi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLGIpLGI9bmV3IEZvcm1EYXRhKGMpLGEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKSk6Yj1uZXcgRm9ybURhdGEoYyksYT1jLm93bmVyRG9jdW1lbnR8fGMsKGEuJCRyZWFjdEZvcm1SZXBsYXk9YS4kJHJlYWN0Rm9ybVJlcGxheXx8W10pLnB1c2goYyxkLGIpKX19KTtgLCAiPFwvc2NyaXB0PiIpOwogICAgfQogIH0KICBmdW5jdGlvbiBZMihuMiwgbDMpIHsKICAgIG4yLnB1c2goTygibGluayIpKTsKICAgIGZvciAodmFyIGkgaW4gbDMpIGlmIChJMi5jYWxsKGwzLCBpKSkgewogICAgICB2YXIgZSA9IGwzW2ldOwogICAgICBpZiAoZSAhPSBudWxsKSBzd2l0Y2ggKGkpIHsKICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgdGhyb3cgRXJyb3IocygzOTksICJsaW5rIikpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBDKG4yLCBpLCBlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG4yLnB1c2goIi8+IiksIG51bGw7CiAgfQogIHZhciBqZTIgPSAvKDxcL3w8KShzKSh0eWxlKS9naTsKICBmdW5jdGlvbiAkZTIobjIsIGwzLCBpLCBlKSB7CiAgICByZXR1cm4gIiIgKyBsMyArIChpID09PSAicyIgPyAiXFw3MyAiIDogIlxcNTMgIikgKyBlOwogIH0KICBmdW5jdGlvbiBXbihuMiwgbDMsIGkpIHsKICAgIG4yLnB1c2goTyhpKSk7CiAgICBmb3IgKHZhciBlIGluIGwzKSBpZiAoSTIuY2FsbChsMywgZSkpIHsKICAgICAgdmFyIHQgPSBsM1tlXTsKICAgICAgaWYgKHQgIT0gbnVsbCkgc3dpdGNoIChlKSB7CiAgICAgICAgY2FzZSAiY2hpbGRyZW4iOgogICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgIHRocm93IEVycm9yKHMoMzk5LCBpKSk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIEMobjIsIGUsIHQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbjIucHVzaCgiLz4iKSwgbnVsbDsKICB9CiAgZnVuY3Rpb24gbnQobjIsIGwzKSB7CiAgICBuMi5wdXNoKE8oInRpdGxlIikpOwogICAgdmFyIGkgPSBudWxsLCBlID0gbnVsbCwgdDsKICAgIGZvciAodCBpbiBsMykgaWYgKEkyLmNhbGwobDMsIHQpKSB7CiAgICAgIHZhciByID0gbDNbdF07CiAgICAgIGlmIChyICE9IG51bGwpIHN3aXRjaCAodCkgewogICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgIGkgPSByOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgZSA9IHI7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgQyhuMiwgdCwgcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuMi5wdXNoKCI+IiksIGwzID0gQXJyYXkuaXNBcnJheShpKSA/IDIgPiBpLmxlbmd0aCA/IGlbMF0gOiBudWxsIDogaSwgdHlwZW9mIGwzICE9ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGwzICE9ICJzeW1ib2wiICYmIGwzICE9PSBudWxsICYmIGwzICE9PSB2b2lkIDAgJiYgbjIucHVzaChUMygiIiArIGwzKSksIFEobjIsIGUsIGkpLCBuMi5wdXNoKFBuKCJ0aXRsZSIpKSwgbnVsbDsKICB9CiAgZnVuY3Rpb24gamwobjIsIGwzKSB7CiAgICBuMi5wdXNoKE8oInNjcmlwdCIpKTsKICAgIHZhciBpID0gbnVsbCwgZSA9IG51bGwsIHQ7CiAgICBmb3IgKHQgaW4gbDMpIGlmIChJMi5jYWxsKGwzLCB0KSkgewogICAgICB2YXIgciA9IGwzW3RdOwogICAgICBpZiAociAhPSBudWxsKSBzd2l0Y2ggKHQpIHsKICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICBpID0gcjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgIGUgPSByOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIEMobjIsIHQsIHIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbjIucHVzaCgiPiIpLCBRKG4yLCBlLCBpKSwgdHlwZW9mIGkgPT0gInN0cmluZyIgJiYgbjIucHVzaCgoIiIgKyBpKS5yZXBsYWNlKFN0LCBPdCkpLCBuMi5wdXNoKFBuKCJzY3JpcHQiKSksIG51bGw7CiAgfQogIGZ1bmN0aW9uIExpKG4yLCBsMywgaSkgewogICAgbjIucHVzaChPKGkpKTsKICAgIHZhciBlID0gaSA9IG51bGwsIHQ7CiAgICBmb3IgKHQgaW4gbDMpIGlmIChJMi5jYWxsKGwzLCB0KSkgewogICAgICB2YXIgciA9IGwzW3RdOwogICAgICBpZiAociAhPSBudWxsKSBzd2l0Y2ggKHQpIHsKICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICBpID0gcjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgIGUgPSByOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIEMobjIsIHQsIHIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbjIucHVzaCgiPiIpLCBRKG4yLCBlLCBpKSwgaTsKICB9CiAgZnVuY3Rpb24gWWwobjIsIGwzLCBpKSB7CiAgICBuMi5wdXNoKE8oaSkpOwogICAgdmFyIGUgPSBpID0gbnVsbCwgdDsKICAgIGZvciAodCBpbiBsMykgaWYgKEkyLmNhbGwobDMsIHQpKSB7CiAgICAgIHZhciByID0gbDNbdF07CiAgICAgIGlmIChyICE9IG51bGwpIHN3aXRjaCAodCkgewogICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgIGkgPSByOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgZSA9IHI7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgQyhuMiwgdCwgcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuMi5wdXNoKCI+IiksIFEobjIsIGUsIGkpLCB0eXBlb2YgaSA9PSAic3RyaW5nIiA/IChuMi5wdXNoKFQzKGkpKSwgbnVsbCkgOiBpOwogIH0KICB2YXIgTnIgPSAvXlthLXpBLVpdW2EtekEtWjpfXC5cLVxkXSokLywgbHQgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIGZ1bmN0aW9uIE8objIpIHsKICAgIHZhciBsMyA9IGx0LmdldChuMik7CiAgICBpZiAobDMgPT09IHZvaWQgMCkgewogICAgICBpZiAoIU5yLnRlc3QobjIpKSB0aHJvdyBFcnJvcihzKDY1LCBuMikpOwogICAgICBsMyA9ICI8IiArIG4yLCBsdC5zZXQobjIsIGwzKTsKICAgIH0KICAgIHJldHVybiBsMzsKICB9CiAgZnVuY3Rpb24genIobjIsIGwzLCBpLCBlLCB0LCByLCBhLCBjMiwgdTIpIHsKICAgIHN3aXRjaCAobDMpIHsKICAgICAgY2FzZSAiZGl2IjoKICAgICAgY2FzZSAic3BhbiI6CiAgICAgIGNhc2UgInN2ZyI6CiAgICAgIGNhc2UgInBhdGgiOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJhIjoKICAgICAgICBuMi5wdXNoKE8oImEiKSk7CiAgICAgICAgdmFyIGggPSBudWxsLCBmMiA9IG51bGwsIG87CiAgICAgICAgZm9yIChvIGluIGkpIGlmIChJMi5jYWxsKGksIG8pKSB7CiAgICAgICAgICB2YXIgZDMgPSBpW29dOwogICAgICAgICAgaWYgKGQzICE9IG51bGwpIHN3aXRjaCAobykgewogICAgICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICAgICAgaCA9IGQzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICAgICAgZjIgPSBkMzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiaHJlZiI6CiAgICAgICAgICAgICAgZDMgPT09ICIiID8gVTIobjIsICJocmVmIiwgIiIpIDogQyhuMiwgbywgZDMpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIEMobjIsIG8sIGQzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG4yLnB1c2goIj4iKSwgUShuMiwgZjIsIGgpLCB0eXBlb2YgaCA9PSAic3RyaW5nIikgewogICAgICAgICAgbjIucHVzaChUMyhoKSk7CiAgICAgICAgICB2YXIgZyA9IG51bGw7CiAgICAgICAgfSBlbHNlIGcgPSBoOwogICAgICAgIHJldHVybiBnOwogICAgICBjYXNlICJnIjoKICAgICAgY2FzZSAicCI6CiAgICAgIGNhc2UgImxpIjoKICAgICAgICBicmVhazsKICAgICAgY2FzZSAic2VsZWN0IjoKICAgICAgICBuMi5wdXNoKE8oInNlbGVjdCIpKTsKICAgICAgICB2YXIgRTQgPSBudWxsLCB5MiA9IG51bGwsIGI0OwogICAgICAgIGZvciAoYjQgaW4gaSkgaWYgKEkyLmNhbGwoaSwgYjQpKSB7CiAgICAgICAgICB2YXIgdjMgPSBpW2I0XTsKICAgICAgICAgIGlmICh2MyAhPSBudWxsKSBzd2l0Y2ggKGI0KSB7CiAgICAgICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgICAgICBFNCA9IHYzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICAgICAgeTIgPSB2MzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZGVmYXVsdFZhbHVlIjoKICAgICAgICAgICAgY2FzZSAidmFsdWUiOgogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIEMobjIsIGI0LCB2Myk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBuMi5wdXNoKCI+IiksIFEobjIsIHkyLCBFNCksIEU0OwogICAgICBjYXNlICJvcHRpb24iOgogICAgICAgIHZhciB4MyA9IGMyLnNlbGVjdGVkVmFsdWU7CiAgICAgICAgbjIucHVzaChPKCJvcHRpb24iKSk7CiAgICAgICAgdmFyIE0yID0gbnVsbCwgUCA9IG51bGwsIFIzID0gbnVsbCwgRjIgPSBudWxsLCBlbjsKICAgICAgICBmb3IgKGVuIGluIGkpIGlmIChJMi5jYWxsKGksIGVuKSkgewogICAgICAgICAgdmFyICQyID0gaVtlbl07CiAgICAgICAgICBpZiAoJDIgIT0gbnVsbCkgc3dpdGNoIChlbikgewogICAgICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICAgICAgTTIgPSAkMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAic2VsZWN0ZWQiOgogICAgICAgICAgICAgIFIzID0gJDI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgICAgICBGMiA9ICQyOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJ2YWx1ZSI6CiAgICAgICAgICAgICAgUCA9ICQyOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIEMobjIsIGVuLCAkMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh4MyAhPSBudWxsKSB7CiAgICAgICAgICB2YXIgdzMgPSBQICE9PSBudWxsID8gIiIgKyBQIDogRHIoTTIpOwogICAgICAgICAgaWYgKHFsKHgzKSkgewogICAgICAgICAgICBmb3IgKHZhciB0biA9IDA7IHRuIDwgeDMubGVuZ3RoOyB0bisrKSBpZiAoIiIgKyB4M1t0bl0gPT09IHczKSB7CiAgICAgICAgICAgICAgbjIucHVzaCgnIHNlbGVjdGVkPSIiJyk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSAiIiArIHgzID09PSB3MyAmJiBuMi5wdXNoKCcgc2VsZWN0ZWQ9IiInKTsKICAgICAgICB9IGVsc2UgUjMgJiYgbjIucHVzaCgnIHNlbGVjdGVkPSIiJyk7CiAgICAgICAgcmV0dXJuIG4yLnB1c2goIj4iKSwgUShuMiwgRjIsIE0yKSwgTTI7CiAgICAgIGNhc2UgInRleHRhcmVhIjoKICAgICAgICBuMi5wdXNoKE8oInRleHRhcmVhIikpOwogICAgICAgIHZhciBBMyA9IG51bGwsIEIyID0gbnVsbCwgSDIgPSBudWxsLCBTMzsKICAgICAgICBmb3IgKFMzIGluIGkpIGlmIChJMi5jYWxsKGksIFMzKSkgewogICAgICAgICAgdmFyIGNuID0gaVtTM107CiAgICAgICAgICBpZiAoY24gIT0gbnVsbCkgc3dpdGNoIChTMykgewogICAgICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICAgICAgSDIgPSBjbjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAidmFsdWUiOgogICAgICAgICAgICAgIEEzID0gY247CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRlZmF1bHRWYWx1ZSI6CiAgICAgICAgICAgICAgQjIgPSBjbjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgICAgIHRocm93IEVycm9yKHMoOTEpKTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBDKG4yLCBTMywgY24pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoQTMgPT09IG51bGwgJiYgQjIgIT09IG51bGwgJiYgKEEzID0gQjIpLCBuMi5wdXNoKCI+IiksIEgyICE9IG51bGwpIHsKICAgICAgICAgIGlmIChBMyAhPSBudWxsKSB0aHJvdyBFcnJvcihzKDkyKSk7CiAgICAgICAgICBpZiAocWwoSDIpKSB7CiAgICAgICAgICAgIGlmICgxIDwgSDIubGVuZ3RoKSB0aHJvdyBFcnJvcihzKDkzKSk7CiAgICAgICAgICAgIEEzID0gIiIgKyBIMlswXTsKICAgICAgICAgIH0KICAgICAgICAgIEEzID0gIiIgKyBIMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHR5cGVvZiBBMyA9PSAic3RyaW5nIiAmJiBBM1swXSA9PT0gYApgICYmIG4yLnB1c2goYApgKSwgQTMgIT09IG51bGwgJiYgbjIucHVzaChUMygiIiArIEEzKSksIG51bGw7CiAgICAgIGNhc2UgImlucHV0IjoKICAgICAgICBuMi5wdXNoKE8oImlucHV0IikpOwogICAgICAgIHZhciBJbCA9IG51bGwsIFFuID0gbnVsbCwgTWwgPSBudWxsLCBQbCA9IG51bGwsIHAzID0gbnVsbCwgZm4gPSBudWxsLCBubiA9IG51bGwsIGxuID0gbnVsbCwgb24gPSBudWxsLCBkbjsKICAgICAgICBmb3IgKGRuIGluIGkpIGlmIChJMi5jYWxsKGksIGRuKSkgewogICAgICAgICAgdmFyIGs0ID0gaVtkbl07CiAgICAgICAgICBpZiAoazQgIT0gbnVsbCkgc3dpdGNoIChkbikgewogICAgICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgICAgICB0aHJvdyBFcnJvcihzKDM5OSwgImlucHV0IikpOwogICAgICAgICAgICBjYXNlICJuYW1lIjoKICAgICAgICAgICAgICBJbCA9IGs0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJmb3JtQWN0aW9uIjoKICAgICAgICAgICAgICBRbiA9IGs0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJmb3JtRW5jVHlwZSI6CiAgICAgICAgICAgICAgTWwgPSBrNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZm9ybU1ldGhvZCI6CiAgICAgICAgICAgICAgUGwgPSBrNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZm9ybVRhcmdldCI6CiAgICAgICAgICAgICAgcDMgPSBrNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZGVmYXVsdENoZWNrZWQiOgogICAgICAgICAgICAgIG9uID0gazQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRlZmF1bHRWYWx1ZSI6CiAgICAgICAgICAgICAgbm4gPSBrNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiY2hlY2tlZCI6CiAgICAgICAgICAgICAgbG4gPSBrNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAidmFsdWUiOgogICAgICAgICAgICAgIGZuID0gazQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgQyhuMiwgZG4sIGs0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHhuID0gcWUyKG4yLCBlLCB0LCBRbiwgTWwsIFBsLCBwMywgSWwpOwogICAgICAgIHJldHVybiBsbiAhPT0gbnVsbCA/IFdpKG4yLCAiY2hlY2tlZCIsIGxuKSA6IG9uICE9PSBudWxsICYmIFdpKG4yLCAiY2hlY2tlZCIsIG9uKSwgZm4gIT09IG51bGwgPyBDKG4yLCAidmFsdWUiLCBmbikgOiBubiAhPT0gbnVsbCAmJiBDKG4yLCAidmFsdWUiLCBubiksIG4yLnB1c2goIi8+IiksIHhuPy5mb3JFYWNoKGtpLCBuMiksIG51bGw7CiAgICAgIGNhc2UgImJ1dHRvbiI6CiAgICAgICAgbjIucHVzaChPKCJidXR0b24iKSk7CiAgICAgICAgdmFyIFZuID0gbnVsbCwgb2UgPSBudWxsLCBkZTIgPSBudWxsLCBzZSA9IG51bGwsIGdlMiA9IG51bGwsIHZlMiA9IG51bGwsIGJlMiA9IG51bGwsIEtuOwogICAgICAgIGZvciAoS24gaW4gaSkgaWYgKEkyLmNhbGwoaSwgS24pKSB7CiAgICAgICAgICB2YXIgcm4gPSBpW0tuXTsKICAgICAgICAgIGlmIChybiAhPSBudWxsKSBzd2l0Y2ggKEtuKSB7CiAgICAgICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgICAgICBWbiA9IHJuOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICAgICAgb2UgPSBybjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAibmFtZSI6CiAgICAgICAgICAgICAgZGUyID0gcm47CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImZvcm1BY3Rpb24iOgogICAgICAgICAgICAgIHNlID0gcm47CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImZvcm1FbmNUeXBlIjoKICAgICAgICAgICAgICBnZTIgPSBybjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZm9ybU1ldGhvZCI6CiAgICAgICAgICAgICAgdmUyID0gcm47CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImZvcm1UYXJnZXQiOgogICAgICAgICAgICAgIGJlMiA9IHJuOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIEMobjIsIEtuLCBybik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciB5ZTIgPSBxZTIobjIsIGUsIHQsIHNlLCBnZTIsIHZlMiwgYmUyLCBkZTIpOwogICAgICAgIGlmIChuMi5wdXNoKCI+IiksIHllMj8uZm9yRWFjaChraSwgbjIpLCBRKG4yLCBvZSwgVm4pLCB0eXBlb2YgVm4gPT0gInN0cmluZyIpIHsKICAgICAgICAgIG4yLnB1c2goVDMoVm4pKTsKICAgICAgICAgIHZhciBUZTIgPSBudWxsOwogICAgICAgIH0gZWxzZSBUZTIgPSBWbjsKICAgICAgICByZXR1cm4gVGUyOwogICAgICBjYXNlICJmb3JtIjoKICAgICAgICBuMi5wdXNoKE8oImZvcm0iKSk7CiAgICAgICAgdmFyIG1uID0gbnVsbCwgRWUyID0gbnVsbCwgUm4gPSBudWxsLCBwbiA9IG51bGwsIHFuID0gbnVsbCwgam4gPSBudWxsLCAkbjsKICAgICAgICBmb3IgKCRuIGluIGkpIGlmIChJMi5jYWxsKGksICRuKSkgewogICAgICAgICAgdmFyIHNuID0gaVskbl07CiAgICAgICAgICBpZiAoc24gIT0gbnVsbCkgc3dpdGNoICgkbikgewogICAgICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICAgICAgbW4gPSBzbjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgICAgIEVlMiA9IHNuOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJhY3Rpb24iOgogICAgICAgICAgICAgIFJuID0gc247CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImVuY1R5cGUiOgogICAgICAgICAgICAgIHBuID0gc247CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIm1ldGhvZCI6CiAgICAgICAgICAgICAgcW4gPSBzbjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAidGFyZ2V0IjoKICAgICAgICAgICAgICBqbiA9IHNuOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIEMobjIsICRuLCBzbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBUaSA9IG51bGwsIEVpID0gbnVsbDsKICAgICAgICBpZiAodHlwZW9mIFJuID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHZhciB3biA9IHp0KGUsIFJuKTsKICAgICAgICAgIHduICE9PSBudWxsID8gKFJuID0gd24uYWN0aW9uIHx8ICIiLCBwbiA9IHduLmVuY1R5cGUsIHFuID0gd24ubWV0aG9kLCBqbiA9IHduLnRhcmdldCwgVGkgPSB3bi5kYXRhLCBFaSA9IHduLm5hbWUpIDogKG4yLnB1c2goIiAiLCAiYWN0aW9uIiwgJz0iJywgRHQsICciJyksIGpuID0gcW4gPSBwbiA9IFJuID0gbnVsbCwgQnQoZSwgdCkpOwogICAgICAgIH0KICAgICAgICBpZiAoUm4gIT0gbnVsbCAmJiBDKG4yLCAiYWN0aW9uIiwgUm4pLCBwbiAhPSBudWxsICYmIEMobjIsICJlbmNUeXBlIiwgcG4pLCBxbiAhPSBudWxsICYmIEMobjIsICJtZXRob2QiLCBxbiksIGpuICE9IG51bGwgJiYgQyhuMiwgInRhcmdldCIsIGpuKSwgbjIucHVzaCgiPiIpLCBFaSAhPT0gbnVsbCAmJiAobjIucHVzaCgnPGlucHV0IHR5cGU9ImhpZGRlbiInKSwgVTIobjIsICJuYW1lIiwgRWkpLCBuMi5wdXNoKCIvPiIpLCBUaT8uZm9yRWFjaChraSwgbjIpKSwgUShuMiwgRWUyLCBtbiksIHR5cGVvZiBtbiA9PSAic3RyaW5nIikgewogICAgICAgICAgbjIucHVzaChUMyhtbikpOwogICAgICAgICAgdmFyIHhlMiA9IG51bGw7CiAgICAgICAgfSBlbHNlIHhlMiA9IG1uOwogICAgICAgIHJldHVybiB4ZTI7CiAgICAgIGNhc2UgIm1lbnVpdGVtIjoKICAgICAgICBuMi5wdXNoKE8oIm1lbnVpdGVtIikpOwogICAgICAgIGZvciAodmFyIFNsIGluIGkpIGlmIChJMi5jYWxsKGksIFNsKSkgewogICAgICAgICAgdmFyIFJlMiA9IGlbU2xdOwogICAgICAgICAgaWYgKFJlMiAhPSBudWxsKSBzd2l0Y2ggKFNsKSB7CiAgICAgICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgICAgIHRocm93IEVycm9yKHMoNDAwKSk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgQyhuMiwgU2wsIFJlMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBuMi5wdXNoKCI+IiksIG51bGw7CiAgICAgIGNhc2UgIm9iamVjdCI6CiAgICAgICAgbjIucHVzaChPKCJvYmplY3QiKSk7CiAgICAgICAgdmFyIG5sID0gbnVsbCwgd2UyID0gbnVsbCwgbGw7CiAgICAgICAgZm9yIChsbCBpbiBpKSBpZiAoSTIuY2FsbChpLCBsbCkpIHsKICAgICAgICAgIHZhciBpbCA9IGlbbGxdOwogICAgICAgICAgaWYgKGlsICE9IG51bGwpIHN3aXRjaCAobGwpIHsKICAgICAgICAgICAgY2FzZSAiY2hpbGRyZW4iOgogICAgICAgICAgICAgIG5sID0gaWw7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgICAgICB3ZTIgPSBpbDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZGF0YSI6CiAgICAgICAgICAgICAgdmFyIENlMiA9IGdsKCIiICsgaWwpOwogICAgICAgICAgICAgIGlmIChDZTIgPT09ICIiKSBicmVhazsKICAgICAgICAgICAgICBuMi5wdXNoKCIgIiwgImRhdGEiLCAnPSInLCBUMyhDZTIpLCAnIicpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIEMobjIsIGxsLCBpbCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChuMi5wdXNoKCI+IiksIFEobjIsIHdlMiwgbmwpLCB0eXBlb2YgbmwgPT0gInN0cmluZyIpIHsKICAgICAgICAgIG4yLnB1c2goVDMobmwpKTsKICAgICAgICAgIHZhciBGZSA9IG51bGw7CiAgICAgICAgfSBlbHNlIEZlID0gbmw7CiAgICAgICAgcmV0dXJuIEZlOwogICAgICBjYXNlICJ0aXRsZSI6CiAgICAgICAgdmFyIGxyID0gYzIudGFnU2NvcGUgJiAxLCBpciA9IGMyLnRhZ1Njb3BlICYgNDsKICAgICAgICBpZiAoYzIuaW5zZXJ0aW9uTW9kZSA9PT0gNCB8fCBsciB8fCBpLml0ZW1Qcm9wICE9IG51bGwpIHZhciB4aSA9IG50KG4yLCBpKTsKICAgICAgICBlbHNlIGlyID8geGkgPSBudWxsIDogKG50KHQuaG9pc3RhYmxlQ2h1bmtzLCBpKSwgeGkgPSB2b2lkIDApOwogICAgICAgIHJldHVybiB4aTsKICAgICAgY2FzZSAibGluayI6CiAgICAgICAgdmFyIGVyID0gYzIudGFnU2NvcGUgJiAxLCB0ciA9IGMyLnRhZ1Njb3BlICYgNCwgcnIgPSBpLnJlbCwgZ24gPSBpLmhyZWYsIE9sID0gaS5wcmVjZWRlbmNlOwogICAgICAgIGlmIChjMi5pbnNlcnRpb25Nb2RlID09PSA0IHx8IGVyIHx8IGkuaXRlbVByb3AgIT0gbnVsbCB8fCB0eXBlb2YgcnIgIT0gInN0cmluZyIgfHwgdHlwZW9mIGduICE9ICJzdHJpbmciIHx8IGduID09PSAiIikgewogICAgICAgICAgWTIobjIsIGkpOwogICAgICAgICAgdmFyIGVsID0gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKGkucmVsID09PSAic3R5bGVzaGVldCIpIGlmICh0eXBlb2YgT2wgIT0gInN0cmluZyIgfHwgaS5kaXNhYmxlZCAhPSBudWxsIHx8IGkub25Mb2FkIHx8IGkub25FcnJvcikgZWwgPSBZMihuMiwgaSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIga24gPSB0LnN0eWxlcy5nZXQoT2wpLCBrbCA9IGUuc3R5bGVSZXNvdXJjZXMuaGFzT3duUHJvcGVydHkoZ24pID8gZS5zdHlsZVJlc291cmNlc1tnbl0gOiB2b2lkIDA7CiAgICAgICAgICBpZiAoa2wgIT09IG51bGwpIHsKICAgICAgICAgICAgZS5zdHlsZVJlc291cmNlc1tnbl0gPSBudWxsLCBrbiB8fCAoa24gPSB7CiAgICAgICAgICAgICAgcHJlY2VkZW5jZTogVDMoT2wpLAogICAgICAgICAgICAgIHJ1bGVzOiBbXSwKICAgICAgICAgICAgICBocmVmczogW10sCiAgICAgICAgICAgICAgc2hlZXRzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpCiAgICAgICAgICAgIH0sIHQuc3R5bGVzLnNldChPbCwga24pKTsKICAgICAgICAgICAgdmFyIExsID0gewogICAgICAgICAgICAgIHN0YXRlOiAwLAogICAgICAgICAgICAgIHByb3BzOiBKKHt9LCBpLCB7CiAgICAgICAgICAgICAgICAiZGF0YS1wcmVjZWRlbmNlIjogaS5wcmVjZWRlbmNlLAogICAgICAgICAgICAgICAgcHJlY2VkZW5jZTogbnVsbAogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChrbCkgewogICAgICAgICAgICAgIGtsLmxlbmd0aCA9PT0gMiAmJiB2bChMbC5wcm9wcywga2wpOwogICAgICAgICAgICAgIHZhciBSaSA9IHQucHJlbG9hZHMuc3R5bGVzaGVldHMuZ2V0KGduKTsKICAgICAgICAgICAgICBSaSAmJiAwIDwgUmkubGVuZ3RoID8gUmkubGVuZ3RoID0gMCA6IExsLnN0YXRlID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBrbi5zaGVldHMuc2V0KGduLCBMbCksIGEgJiYgYS5zdHlsZXNoZWV0cy5hZGQoTGwpOwogICAgICAgICAgfSBlbHNlIGlmIChrbikgewogICAgICAgICAgICB2YXIgX2UyID0ga24uc2hlZXRzLmdldChnbik7CiAgICAgICAgICAgIF9lMiAmJiBhICYmIGEuc3R5bGVzaGVldHMuYWRkKF9lMik7CiAgICAgICAgICB9CiAgICAgICAgICB1MiAmJiBuMi5wdXNoKCI8IS0tIC0tPiIpLCBlbCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGVsc2UgaS5vbkxvYWQgfHwgaS5vbkVycm9yID8gZWwgPSBZMihuMiwgaSkgOiAodTIgJiYgbjIucHVzaCgiPCEtLSAtLT4iKSwgZWwgPSB0ciA/IG51bGwgOiBZMih0LmhvaXN0YWJsZUNodW5rcywgaSkpOwogICAgICAgIHJldHVybiBlbDsKICAgICAgY2FzZSAic2NyaXB0IjoKICAgICAgICB2YXIgYXIgPSBjMi50YWdTY29wZSAmIDEsIHdpID0gaS5hc3luYzsKICAgICAgICBpZiAodHlwZW9mIGkuc3JjICE9ICJzdHJpbmciIHx8ICFpLnNyYyB8fCAhd2kgfHwgdHlwZW9mIHdpID09ICJmdW5jdGlvbiIgfHwgdHlwZW9mIHdpID09ICJzeW1ib2wiIHx8IGkub25Mb2FkIHx8IGkub25FcnJvciB8fCBjMi5pbnNlcnRpb25Nb2RlID09PSA0IHx8IGFyIHx8IGkuaXRlbVByb3AgIT0gbnVsbCkgdmFyIEFlMiA9IGpsKG4yLCBpKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBEbCA9IGkuc3JjOwogICAgICAgICAgaWYgKGkudHlwZSA9PT0gIm1vZHVsZSIpIHZhciBObCA9IGUubW9kdWxlU2NyaXB0UmVzb3VyY2VzLCBJZTIgPSB0LnByZWxvYWRzLm1vZHVsZVNjcmlwdHM7CiAgICAgICAgICBlbHNlIE5sID0gZS5zY3JpcHRSZXNvdXJjZXMsIEllMiA9IHQucHJlbG9hZHMuc2NyaXB0czsKICAgICAgICAgIHZhciB6bCA9IE5sLmhhc093blByb3BlcnR5KERsKSA/IE5sW0RsXSA6IHZvaWQgMDsKICAgICAgICAgIGlmICh6bCAhPT0gbnVsbCkgewogICAgICAgICAgICBObFtEbF0gPSBudWxsOwogICAgICAgICAgICB2YXIgQ2kgPSBpOwogICAgICAgICAgICBpZiAoemwpIHsKICAgICAgICAgICAgICB6bC5sZW5ndGggPT09IDIgJiYgKENpID0gSih7fSwgaSksIHZsKENpLCB6bCkpOwogICAgICAgICAgICAgIHZhciBNZTIgPSBJZTIuZ2V0KERsKTsKICAgICAgICAgICAgICBNZTIgJiYgKE1lMi5sZW5ndGggPSAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgUGUyID0gW107CiAgICAgICAgICAgIHQuc2NyaXB0cy5hZGQoUGUyKSwgamwoUGUyLCBDaSk7CiAgICAgICAgICB9CiAgICAgICAgICB1MiAmJiBuMi5wdXNoKCI8IS0tIC0tPiIpLCBBZTIgPSBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQWUyOwogICAgICBjYXNlICJzdHlsZSI6CiAgICAgICAgdmFyIHVyID0gYzIudGFnU2NvcGUgJiAxLCBCbCA9IGkucHJlY2VkZW5jZSwgTG4gPSBpLmhyZWYsIGhyID0gaS5ub25jZTsKICAgICAgICBpZiAoYzIuaW5zZXJ0aW9uTW9kZSA9PT0gNCB8fCB1ciB8fCBpLml0ZW1Qcm9wICE9IG51bGwgfHwgdHlwZW9mIEJsICE9ICJzdHJpbmciIHx8IHR5cGVvZiBMbiAhPSAic3RyaW5nIiB8fCBMbiA9PT0gIiIpIHsKICAgICAgICAgIG4yLnB1c2goTygic3R5bGUiKSk7CiAgICAgICAgICB2YXIgRG4gPSBudWxsLCBTZTIgPSBudWxsLCB0bDsKICAgICAgICAgIGZvciAodGwgaW4gaSkgaWYgKEkyLmNhbGwoaSwgdGwpKSB7CiAgICAgICAgICAgIHZhciBIbCA9IGlbdGxdOwogICAgICAgICAgICBpZiAoSGwgIT0gbnVsbCkgc3dpdGNoICh0bCkgewogICAgICAgICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgICAgICAgIERuID0gSGw7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICAgICAgICBTZTIgPSBIbDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBDKG4yLCB0bCwgSGwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBuMi5wdXNoKCI+Iik7CiAgICAgICAgICB2YXIgcmwgPSBBcnJheS5pc0FycmF5KERuKSA/IDIgPiBEbi5sZW5ndGggPyBEblswXSA6IG51bGwgOiBEbjsKICAgICAgICAgIHR5cGVvZiBybCAhPSAiZnVuY3Rpb24iICYmIHR5cGVvZiBybCAhPSAic3ltYm9sIiAmJiBybCAhPT0gbnVsbCAmJiBybCAhPT0gdm9pZCAwICYmIG4yLnB1c2goKCIiICsgcmwpLnJlcGxhY2UoamUyLCAkZTIpKSwgUShuMiwgU2UyLCBEbiksIG4yLnB1c2goUG4oInN0eWxlIikpOwogICAgICAgICAgdmFyIE9lMiA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBDbiA9IHQuc3R5bGVzLmdldChCbCk7CiAgICAgICAgICBpZiAoKGUuc3R5bGVSZXNvdXJjZXMuaGFzT3duUHJvcGVydHkoTG4pID8gZS5zdHlsZVJlc291cmNlc1tMbl0gOiB2b2lkIDApICE9PSBudWxsKSB7CiAgICAgICAgICAgIGUuc3R5bGVSZXNvdXJjZXNbTG5dID0gbnVsbCwgQ24gfHwgKENuID0gewogICAgICAgICAgICAgIHByZWNlZGVuY2U6IFQzKEJsKSwKICAgICAgICAgICAgICBydWxlczogW10sCiAgICAgICAgICAgICAgaHJlZnM6IFtdLAogICAgICAgICAgICAgIHNoZWV0czogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKQogICAgICAgICAgICB9LCB0LnN0eWxlcy5zZXQoQmwsIENuKSk7CiAgICAgICAgICAgIHZhciBrZTIgPSB0Lm5vbmNlLnN0eWxlOwogICAgICAgICAgICBpZiAoIWtlMiB8fCBrZTIgPT09IGhyKSB7CiAgICAgICAgICAgICAgQ24uaHJlZnMucHVzaChUMyhMbikpOwogICAgICAgICAgICAgIHZhciBMZTMgPSBDbi5ydWxlcywgTm4gPSBudWxsLCBEZTIgPSBudWxsLCBXbDsKICAgICAgICAgICAgICBmb3IgKFdsIGluIGkpIGlmIChJMi5jYWxsKGksIFdsKSkgewogICAgICAgICAgICAgICAgdmFyIEZpID0gaVtXbF07CiAgICAgICAgICAgICAgICBpZiAoRmkgIT0gbnVsbCkgc3dpdGNoIChXbCkgewogICAgICAgICAgICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICAgICAgICAgICAgTm4gPSBGaTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgICAgICAgICAgIERlMiA9IEZpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgYWwgPSBBcnJheS5pc0FycmF5KE5uKSA/IDIgPiBObi5sZW5ndGggPyBOblswXSA6IG51bGwgOiBObjsKICAgICAgICAgICAgICB0eXBlb2YgYWwgIT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgYWwgIT0gInN5bWJvbCIgJiYgYWwgIT09IG51bGwgJiYgYWwgIT09IHZvaWQgMCAmJiBMZTMucHVzaCgoIiIgKyBhbCkucmVwbGFjZShqZTIsICRlMikpLCBRKExlMywgRGUyLCBObik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIENuICYmIGEgJiYgYS5zdHlsZXMuYWRkKENuKSwgdTIgJiYgbjIucHVzaCgiPCEtLSAtLT4iKSwgT2UyID0gdm9pZCAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2UyOwogICAgICBjYXNlICJtZXRhIjoKICAgICAgICB2YXIgY3IgPSBjMi50YWdTY29wZSAmIDEsIGZyID0gYzIudGFnU2NvcGUgJiA0OwogICAgICAgIGlmIChjMi5pbnNlcnRpb25Nb2RlID09PSA0IHx8IGNyIHx8IGkuaXRlbVByb3AgIT0gbnVsbCkgdmFyIE5lMiA9IFduKG4yLCBpLCAibWV0YSIpOwogICAgICAgIGVsc2UgdTIgJiYgbjIucHVzaCgiPCEtLSAtLT4iKSwgTmUyID0gZnIgPyBudWxsIDogdHlwZW9mIGkuY2hhclNldCA9PSAic3RyaW5nIiA/IFduKHQuY2hhcnNldENodW5rcywgaSwgIm1ldGEiKSA6IGkubmFtZSA9PT0gInZpZXdwb3J0IiA/IFduKHQudmlld3BvcnRDaHVua3MsIGksICJtZXRhIikgOiBXbih0LmhvaXN0YWJsZUNodW5rcywgaSwgIm1ldGEiKTsKICAgICAgICByZXR1cm4gTmUyOwogICAgICBjYXNlICJsaXN0aW5nIjoKICAgICAgY2FzZSAicHJlIjoKICAgICAgICBuMi5wdXNoKE8obDMpKTsKICAgICAgICB2YXIgdWwgPSBudWxsLCBobCA9IG51bGwsIGNsOwogICAgICAgIGZvciAoY2wgaW4gaSkgaWYgKEkyLmNhbGwoaSwgY2wpKSB7CiAgICAgICAgICB2YXIgVWwgPSBpW2NsXTsKICAgICAgICAgIGlmIChVbCAhPSBudWxsKSBzd2l0Y2ggKGNsKSB7CiAgICAgICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgICAgICB1bCA9IFVsOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICAgICAgaGwgPSBVbDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBDKG4yLCBjbCwgVWwpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobjIucHVzaCgiPiIpLCBobCAhPSBudWxsKSB7CiAgICAgICAgICBpZiAodWwgIT0gbnVsbCkgdGhyb3cgRXJyb3Iocyg2MCkpOwogICAgICAgICAgaWYgKHR5cGVvZiBobCAhPSAib2JqZWN0IiB8fCAhKCJfX2h0bWwiIGluIGhsKSkgdGhyb3cgRXJyb3Iocyg2MSkpOwogICAgICAgICAgdmFyIEZuID0gaGwuX19odG1sOwogICAgICAgICAgRm4gIT0gbnVsbCAmJiAodHlwZW9mIEZuID09ICJzdHJpbmciICYmIDAgPCBGbi5sZW5ndGggJiYgRm5bMF0gPT09IGAKYCA/IG4yLnB1c2goYApgLCBGbikgOiBuMi5wdXNoKCIiICsgRm4pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHR5cGVvZiB1bCA9PSAic3RyaW5nIiAmJiB1bFswXSA9PT0gYApgICYmIG4yLnB1c2goYApgKSwgdWw7CiAgICAgIGNhc2UgImltZyI6CiAgICAgICAgdmFyIG9yID0gYzIudGFnU2NvcGUgJiAzLCBXID0gaS5zcmMsIEQzID0gaS5zcmNTZXQ7CiAgICAgICAgaWYgKCEoaS5sb2FkaW5nID09PSAibGF6eSIgfHwgIVcgJiYgIUQzIHx8IHR5cGVvZiBXICE9ICJzdHJpbmciICYmIFcgIT0gbnVsbCB8fCB0eXBlb2YgRDMgIT0gInN0cmluZyIgJiYgRDMgIT0gbnVsbCB8fCBpLmZldGNoUHJpb3JpdHkgPT09ICJsb3ciIHx8IG9yKSAmJiAodHlwZW9mIFcgIT0gInN0cmluZyIgfHwgV1s0XSAhPT0gIjoiIHx8IFdbMF0gIT09ICJkIiAmJiBXWzBdICE9PSAiRCIgfHwgV1sxXSAhPT0gImEiICYmIFdbMV0gIT09ICJBIiB8fCBXWzJdICE9PSAidCIgJiYgV1syXSAhPT0gIlQiIHx8IFdbM10gIT09ICJhIiAmJiBXWzNdICE9PSAiQSIpICYmICh0eXBlb2YgRDMgIT0gInN0cmluZyIgfHwgRDNbNF0gIT09ICI6IiB8fCBEM1swXSAhPT0gImQiICYmIEQzWzBdICE9PSAiRCIgfHwgRDNbMV0gIT09ICJhIiAmJiBEM1sxXSAhPT0gIkEiIHx8IEQzWzJdICE9PSAidCIgJiYgRDNbMl0gIT09ICJUIiB8fCBEM1szXSAhPT0gImEiICYmIEQzWzNdICE9PSAiQSIpKSB7CiAgICAgICAgICBhICE9PSBudWxsICYmIGMyLnRhZ1Njb3BlICYgNjQgJiYgKGEuc3VzcGVuc2V5SW1hZ2VzID0gdHJ1ZSk7CiAgICAgICAgICB2YXIgemUyID0gdHlwZW9mIGkuc2l6ZXMgPT0gInN0cmluZyIgPyBpLnNpemVzIDogdm9pZCAwLCB6biA9IEQzID8gRDMgKyBgCmAgKyAoemUyIHx8ICIiKSA6IFcsIF9pID0gdC5wcmVsb2Fkcy5pbWFnZXMsIF9uID0gX2kuZ2V0KHpuKTsKICAgICAgICAgIGlmIChfbikgKGkuZmV0Y2hQcmlvcml0eSA9PT0gImhpZ2giIHx8IDEwID4gdC5oaWdoSW1hZ2VQcmVsb2Fkcy5zaXplKSAmJiAoX2kuZGVsZXRlKHpuKSwgdC5oaWdoSW1hZ2VQcmVsb2Fkcy5hZGQoX24pKTsKICAgICAgICAgIGVsc2UgaWYgKCFlLmltYWdlUmVzb3VyY2VzLmhhc093blByb3BlcnR5KHpuKSkgewogICAgICAgICAgICBlLmltYWdlUmVzb3VyY2VzW3puXSA9IEsyOwogICAgICAgICAgICB2YXIgQWkgPSBpLmNyb3NzT3JpZ2luLCBCZTIgPSB0eXBlb2YgQWkgPT0gInN0cmluZyIgPyBBaSA9PT0gInVzZS1jcmVkZW50aWFscyIgPyBBaSA6ICIiIDogdm9pZCAwLCBBbiA9IHQuaGVhZGVycywgSWk7CiAgICAgICAgICAgIEFuICYmIDAgPCBBbi5yZW1haW5pbmdDYXBhY2l0eSAmJiB0eXBlb2YgaS5zcmNTZXQgIT0gInN0cmluZyIgJiYgKGkuZmV0Y2hQcmlvcml0eSA9PT0gImhpZ2giIHx8IDUwMCA+IEFuLmhpZ2hJbWFnZVByZWxvYWRzLmxlbmd0aCkgJiYgKElpID0gbmkoVywgImltYWdlIiwgewogICAgICAgICAgICAgIGltYWdlU3JjU2V0OiBpLnNyY1NldCwKICAgICAgICAgICAgICBpbWFnZVNpemVzOiBpLnNpemVzLAogICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiBCZTIsCiAgICAgICAgICAgICAgaW50ZWdyaXR5OiBpLmludGVncml0eSwKICAgICAgICAgICAgICBub25jZTogaS5ub25jZSwKICAgICAgICAgICAgICB0eXBlOiBpLnR5cGUsCiAgICAgICAgICAgICAgZmV0Y2hQcmlvcml0eTogaS5mZXRjaFByaW9yaXR5LAogICAgICAgICAgICAgIHJlZmVycmVyUG9saWN5OiBpLnJlZmVyZXJQb2xpY3kKICAgICAgICAgICAgfSksIDAgPD0gKEFuLnJlbWFpbmluZ0NhcGFjaXR5IC09IElpLmxlbmd0aCArIDIpKSA/ICh0LnJlc2V0cy5pbWFnZVt6bl0gPSBLMiwgQW4uaGlnaEltYWdlUHJlbG9hZHMgJiYgKEFuLmhpZ2hJbWFnZVByZWxvYWRzICs9ICIsICIpLCBBbi5oaWdoSW1hZ2VQcmVsb2FkcyArPSBJaSkgOiAoX24gPSBbXSwgWTIoX24sIHsKICAgICAgICAgICAgICByZWw6ICJwcmVsb2FkIiwKICAgICAgICAgICAgICBhczogImltYWdlIiwKICAgICAgICAgICAgICBocmVmOiBEMyA/IHZvaWQgMCA6IFcsCiAgICAgICAgICAgICAgaW1hZ2VTcmNTZXQ6IEQzLAogICAgICAgICAgICAgIGltYWdlU2l6ZXM6IHplMiwKICAgICAgICAgICAgICBjcm9zc09yaWdpbjogQmUyLAogICAgICAgICAgICAgIGludGVncml0eTogaS5pbnRlZ3JpdHksCiAgICAgICAgICAgICAgdHlwZTogaS50eXBlLAogICAgICAgICAgICAgIGZldGNoUHJpb3JpdHk6IGkuZmV0Y2hQcmlvcml0eSwKICAgICAgICAgICAgICByZWZlcnJlclBvbGljeTogaS5yZWZlcnJlclBvbGljeQogICAgICAgICAgICB9KSwgaS5mZXRjaFByaW9yaXR5ID09PSAiaGlnaCIgfHwgMTAgPiB0LmhpZ2hJbWFnZVByZWxvYWRzLnNpemUgPyB0LmhpZ2hJbWFnZVByZWxvYWRzLmFkZChfbikgOiAodC5idWxrUHJlbG9hZHMuYWRkKF9uKSwgX2kuc2V0KHpuLCBfbikpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIFduKG4yLCBpLCAiaW1nIik7CiAgICAgIGNhc2UgImJhc2UiOgogICAgICBjYXNlICJhcmVhIjoKICAgICAgY2FzZSAiYnIiOgogICAgICBjYXNlICJjb2wiOgogICAgICBjYXNlICJlbWJlZCI6CiAgICAgIGNhc2UgImhyIjoKICAgICAgY2FzZSAia2V5Z2VuIjoKICAgICAgY2FzZSAicGFyYW0iOgogICAgICBjYXNlICJzb3VyY2UiOgogICAgICBjYXNlICJ0cmFjayI6CiAgICAgIGNhc2UgIndiciI6CiAgICAgICAgcmV0dXJuIFduKG4yLCBpLCBsMyk7CiAgICAgIGNhc2UgImFubm90YXRpb24teG1sIjoKICAgICAgY2FzZSAiY29sb3ItcHJvZmlsZSI6CiAgICAgIGNhc2UgImZvbnQtZmFjZSI6CiAgICAgIGNhc2UgImZvbnQtZmFjZS1zcmMiOgogICAgICBjYXNlICJmb250LWZhY2UtdXJpIjoKICAgICAgY2FzZSAiZm9udC1mYWNlLWZvcm1hdCI6CiAgICAgIGNhc2UgImZvbnQtZmFjZS1uYW1lIjoKICAgICAgY2FzZSAibWlzc2luZy1nbHlwaCI6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImhlYWQiOgogICAgICAgIGlmICgyID4gYzIuaW5zZXJ0aW9uTW9kZSkgewogICAgICAgICAgdmFyIE1pID0gciB8fCB0LnByZWFtYmxlOwogICAgICAgICAgaWYgKE1pLmhlYWRDaHVua3MpIHRocm93IEVycm9yKHMoNTQ1LCAiYDxoZWFkPmAiKSk7CiAgICAgICAgICByICE9PSBudWxsICYmIG4yLnB1c2goIjwhLS1oZWFkLS0+IiksIE1pLmhlYWRDaHVua3MgPSBbXTsKICAgICAgICAgIHZhciBIZTIgPSBMaShNaS5oZWFkQ2h1bmtzLCBpLCAiaGVhZCIpOwogICAgICAgIH0gZWxzZSBIZTIgPSBZbChuMiwgaSwgImhlYWQiKTsKICAgICAgICByZXR1cm4gSGUyOwogICAgICBjYXNlICJib2R5IjoKICAgICAgICBpZiAoMiA+IGMyLmluc2VydGlvbk1vZGUpIHsKICAgICAgICAgIHZhciBQaSA9IHIgfHwgdC5wcmVhbWJsZTsKICAgICAgICAgIGlmIChQaS5ib2R5Q2h1bmtzKSB0aHJvdyBFcnJvcihzKDU0NSwgImA8Ym9keT5gIikpOwogICAgICAgICAgciAhPT0gbnVsbCAmJiBuMi5wdXNoKCI8IS0tYm9keS0tPiIpLCBQaS5ib2R5Q2h1bmtzID0gW107CiAgICAgICAgICB2YXIgV2UyID0gTGkoUGkuYm9keUNodW5rcywgaSwgImJvZHkiKTsKICAgICAgICB9IGVsc2UgV2UyID0gWWwobjIsIGksICJib2R5Iik7CiAgICAgICAgcmV0dXJuIFdlMjsKICAgICAgY2FzZSAiaHRtbCI6CiAgICAgICAgaWYgKGMyLmluc2VydGlvbk1vZGUgPT09IDApIHsKICAgICAgICAgIHZhciBTaSA9IHIgfHwgdC5wcmVhbWJsZTsKICAgICAgICAgIGlmIChTaS5odG1sQ2h1bmtzKSB0aHJvdyBFcnJvcihzKDU0NSwgImA8aHRtbD5gIikpOwogICAgICAgICAgciAhPT0gbnVsbCAmJiBuMi5wdXNoKCI8IS0taHRtbC0tPiIpLCBTaS5odG1sQ2h1bmtzID0gWwogICAgICAgICAgICAiIgogICAgICAgICAgXTsKICAgICAgICAgIHZhciBVZTIgPSBMaShTaS5odG1sQ2h1bmtzLCBpLCAiaHRtbCIpOwogICAgICAgIH0gZWxzZSBVZTIgPSBZbChuMiwgaSwgImh0bWwiKTsKICAgICAgICByZXR1cm4gVWUyOwogICAgICBkZWZhdWx0OgogICAgICAgIGlmIChsMy5pbmRleE9mKCItIikgIT09IC0xKSB7CiAgICAgICAgICBuMi5wdXNoKE8obDMpKTsKICAgICAgICAgIHZhciBPaSA9IG51bGwsIFllMiA9IG51bGwsIEJuOwogICAgICAgICAgZm9yIChCbiBpbiBpKSBpZiAoSTIuY2FsbChpLCBCbikpIHsKICAgICAgICAgICAgdmFyIHEzID0gaVtCbl07CiAgICAgICAgICAgIGlmIChxMyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgdmFyIEdlMiA9IEJuOwogICAgICAgICAgICAgIHN3aXRjaCAoQm4pIHsKICAgICAgICAgICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgICAgICAgICAgT2kgPSBxMzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICAgICAgICAgIFllMiA9IHEzOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInN0eWxlIjoKICAgICAgICAgICAgICAgICAgTHQobjIsIHEzKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciOgogICAgICAgICAgICAgICAgY2FzZSAic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIjoKICAgICAgICAgICAgICAgIGNhc2UgInJlZiI6CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiY2xhc3NOYW1lIjoKICAgICAgICAgICAgICAgICAgR2UyID0gImNsYXNzIjsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgIGlmICgkaShCbikgJiYgdHlwZW9mIHEzICE9ICJmdW5jdGlvbiIgJiYgdHlwZW9mIHEzICE9ICJzeW1ib2wiICYmIHEzICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChxMyA9PT0gdHJ1ZSkgcTMgPSAiIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcTMgPT0gIm9iamVjdCIpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIG4yLnB1c2goIiAiLCBHZTIsICc9IicsIFQzKHEzKSwgJyInKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG4yLnB1c2goIj4iKSwgUShuMiwgWWUyLCBPaSksIE9pOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBZbChuMiwgaSwgbDMpOwogIH0KICB2YXIgaXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIGZ1bmN0aW9uIFBuKG4yKSB7CiAgICB2YXIgbDMgPSBpdC5nZXQobjIpOwogICAgcmV0dXJuIGwzID09PSB2b2lkIDAgJiYgKGwzID0gIjwvIiArIG4yICsgIj4iLCBpdC5zZXQobjIsIGwzKSksIGwzOwogIH0KICBmdW5jdGlvbiBldChuMiwgbDMpIHsKICAgIG4yID0gbjIucHJlYW1ibGUsIG4yLmh0bWxDaHVua3MgPT09IG51bGwgJiYgbDMuaHRtbENodW5rcyAmJiAobjIuaHRtbENodW5rcyA9IGwzLmh0bWxDaHVua3MpLCBuMi5oZWFkQ2h1bmtzID09PSBudWxsICYmIGwzLmhlYWRDaHVua3MgJiYgKG4yLmhlYWRDaHVua3MgPSBsMy5oZWFkQ2h1bmtzKSwgbjIuYm9keUNodW5rcyA9PT0gbnVsbCAmJiBsMy5ib2R5Q2h1bmtzICYmIChuMi5ib2R5Q2h1bmtzID0gbDMuYm9keUNodW5rcyk7CiAgfQogIGZ1bmN0aW9uIEh0KG4yLCBsMykgewogICAgbDMgPSBsMy5ib290c3RyYXBDaHVua3M7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGwzLmxlbmd0aCAtIDE7IGkrKykgbjIucHVzaChsM1tpXSk7CiAgICByZXR1cm4gaSA8IGwzLmxlbmd0aCA/IChpID0gbDNbaV0sIGwzLmxlbmd0aCA9IDAsIG4yLnB1c2goaSkpIDogdHJ1ZTsKICB9CiAgZnVuY3Rpb24gdHQobjIsIGwzLCBpKSB7CiAgICBpZiAobjIucHVzaCgnPCEtLSQ/LS0+PHRlbXBsYXRlIGlkPSInKSwgaSA9PT0gbnVsbCkgdGhyb3cgRXJyb3IocygzOTUpKTsKICAgIHJldHVybiBuMi5wdXNoKGwzLmJvdW5kYXJ5UHJlZml4KSwgbDMgPSBpLnRvU3RyaW5nKDE2KSwgbjIucHVzaChsMyksIG4yLnB1c2goJyI+PC90ZW1wbGF0ZT4nKTsKICB9CiAgZnVuY3Rpb24gQnIobjIsIGwzLCBpLCBlKSB7CiAgICBzd2l0Y2ggKGkuaW5zZXJ0aW9uTW9kZSkgewogICAgICBjYXNlIDA6CiAgICAgIGNhc2UgMToKICAgICAgY2FzZSAzOgogICAgICBjYXNlIDI6CiAgICAgICAgcmV0dXJuIG4yLnB1c2goJzxkaXYgaGlkZGVuIGlkPSInKSwgbjIucHVzaChsMy5zZWdtZW50UHJlZml4KSwgbDMgPSBlLnRvU3RyaW5nKDE2KSwgbjIucHVzaChsMyksIG4yLnB1c2goJyI+Jyk7CiAgICAgIGNhc2UgNDoKICAgICAgICByZXR1cm4gbjIucHVzaCgnPHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSIgaWQ9IicpLCBuMi5wdXNoKGwzLnNlZ21lbnRQcmVmaXgpLCBsMyA9IGUudG9TdHJpbmcoMTYpLCBuMi5wdXNoKGwzKSwgbjIucHVzaCgnIj4nKTsKICAgICAgY2FzZSA1OgogICAgICAgIHJldHVybiBuMi5wdXNoKCc8bWF0aCBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSIgaWQ9IicpLCBuMi5wdXNoKGwzLnNlZ21lbnRQcmVmaXgpLCBsMyA9IGUudG9TdHJpbmcoMTYpLCBuMi5wdXNoKGwzKSwgbjIucHVzaCgnIj4nKTsKICAgICAgY2FzZSA2OgogICAgICAgIHJldHVybiBuMi5wdXNoKCc8dGFibGUgaGlkZGVuIGlkPSInKSwgbjIucHVzaChsMy5zZWdtZW50UHJlZml4KSwgbDMgPSBlLnRvU3RyaW5nKDE2KSwgbjIucHVzaChsMyksIG4yLnB1c2goJyI+Jyk7CiAgICAgIGNhc2UgNzoKICAgICAgICByZXR1cm4gbjIucHVzaCgnPHRhYmxlIGhpZGRlbj48dGJvZHkgaWQ9IicpLCBuMi5wdXNoKGwzLnNlZ21lbnRQcmVmaXgpLCBsMyA9IGUudG9TdHJpbmcoMTYpLCBuMi5wdXNoKGwzKSwgbjIucHVzaCgnIj4nKTsKICAgICAgY2FzZSA4OgogICAgICAgIHJldHVybiBuMi5wdXNoKCc8dGFibGUgaGlkZGVuPjx0ciBpZD0iJyksIG4yLnB1c2gobDMuc2VnbWVudFByZWZpeCksIGwzID0gZS50b1N0cmluZygxNiksIG4yLnB1c2gobDMpLCBuMi5wdXNoKCciPicpOwogICAgICBjYXNlIDk6CiAgICAgICAgcmV0dXJuIG4yLnB1c2goJzx0YWJsZSBoaWRkZW4+PGNvbGdyb3VwIGlkPSInKSwgbjIucHVzaChsMy5zZWdtZW50UHJlZml4KSwgbDMgPSBlLnRvU3RyaW5nKDE2KSwgbjIucHVzaChsMyksIG4yLnB1c2goJyI+Jyk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgRXJyb3IocygzOTcpKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gSHIobjIsIGwzKSB7CiAgICBzd2l0Y2ggKGwzLmluc2VydGlvbk1vZGUpIHsKICAgICAgY2FzZSAwOgogICAgICBjYXNlIDE6CiAgICAgIGNhc2UgMzoKICAgICAgY2FzZSAyOgogICAgICAgIHJldHVybiBuMi5wdXNoKCI8L2Rpdj4iKTsKICAgICAgY2FzZSA0OgogICAgICAgIHJldHVybiBuMi5wdXNoKCI8L3N2Zz4iKTsKICAgICAgY2FzZSA1OgogICAgICAgIHJldHVybiBuMi5wdXNoKCI8L21hdGg+Iik7CiAgICAgIGNhc2UgNjoKICAgICAgICByZXR1cm4gbjIucHVzaCgiPC90YWJsZT4iKTsKICAgICAgY2FzZSA3OgogICAgICAgIHJldHVybiBuMi5wdXNoKCI8L3Rib2R5PjwvdGFibGU+Iik7CiAgICAgIGNhc2UgODoKICAgICAgICByZXR1cm4gbjIucHVzaCgiPC90cj48L3RhYmxlPiIpOwogICAgICBjYXNlIDk6CiAgICAgICAgcmV0dXJuIG4yLnB1c2goIjwvY29sZ3JvdXA+PC90YWJsZT4iKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBFcnJvcihzKDM5NykpOwogICAgfQogIH0KICB2YXIgV3IgPSAvWzxcdTIwMjhcdTIwMjldL2c7CiAgZnVuY3Rpb24gVXIobjIpIHsKICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuMikucmVwbGFjZShXciwgZnVuY3Rpb24obDMpIHsKICAgICAgc3dpdGNoIChsMykgewogICAgICAgIGNhc2UgIjwiOgogICAgICAgICAgcmV0dXJuICJcXHUwMDNjIjsKICAgICAgICBjYXNlICJcdTIwMjgiOgogICAgICAgICAgcmV0dXJuICJcXHUyMDI4IjsKICAgICAgICBjYXNlICJcdTIwMjkiOgogICAgICAgICAgcmV0dXJuICJcXHUyMDI5IjsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgRXJyb3IoImVzY2FwZUpTU3RyaW5nc0Zvckluc3RydWN0aW9uU2NyaXB0cyBlbmNvdW50ZXJlZCBhIG1hdGNoIGl0IGRvZXMgbm90IGtub3cgaG93IHRvIHJlcGxhY2UuIHRoaXMgbWVhbnMgdGhlIG1hdGNoIHJlZ2V4IGFuZCB0aGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVycyBhcmUgbm8gbG9uZ2VyIGluIHN5bmMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QiKTsKICAgICAgfQogICAgfSk7CiAgfQogIHZhciBZciA9IC9bJj48XHUyMDI4XHUyMDI5XS9nOwogIGZ1bmN0aW9uIGRsKG4yKSB7CiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobjIpLnJlcGxhY2UoWXIsIGZ1bmN0aW9uKGwzKSB7CiAgICAgIHN3aXRjaCAobDMpIHsKICAgICAgICBjYXNlICImIjoKICAgICAgICAgIHJldHVybiAiXFx1MDAyNiI7CiAgICAgICAgY2FzZSAiPiI6CiAgICAgICAgICByZXR1cm4gIlxcdTAwM2UiOwogICAgICAgIGNhc2UgIjwiOgogICAgICAgICAgcmV0dXJuICJcXHUwMDNjIjsKICAgICAgICBjYXNlICJcdTIwMjgiOgogICAgICAgICAgcmV0dXJuICJcXHUyMDI4IjsKICAgICAgICBjYXNlICJcdTIwMjkiOgogICAgICAgICAgcmV0dXJuICJcXHUyMDI5IjsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgRXJyb3IoImVzY2FwZUpTT2JqZWN0Rm9ySW5zdHJ1Y3Rpb25TY3JpcHRzIGVuY291bnRlcmVkIGEgbWF0Y2ggaXQgZG9lcyBub3Qga25vdyBob3cgdG8gcmVwbGFjZS4gdGhpcyBtZWFucyB0aGUgbWF0Y2ggcmVnZXggYW5kIHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGFyZSBubyBsb25nZXIgaW4gc3luYy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdCIpOwogICAgICB9CiAgICB9KTsKICB9CiAgdmFyICRsID0gZmFsc2UsIFVpID0gdHJ1ZTsKICBmdW5jdGlvbiBHcihuMikgewogICAgdmFyIGwzID0gbjIucnVsZXMsIGkgPSBuMi5ocmVmcywgZSA9IDA7CiAgICBpZiAoaS5sZW5ndGgpIHsKICAgICAgZm9yICh0aGlzLnB1c2goWG4uc3RhcnRJbmxpbmVTdHlsZSksIHRoaXMucHVzaCgnIG1lZGlhPSJub3QgYWxsIiBkYXRhLXByZWNlZGVuY2U9IicpLCB0aGlzLnB1c2gobjIucHJlY2VkZW5jZSksIHRoaXMucHVzaCgnIiBkYXRhLWhyZWY9IicpOyBlIDwgaS5sZW5ndGggLSAxOyBlKyspIHRoaXMucHVzaChpW2VdKSwgdGhpcy5wdXNoKCIgIik7CiAgICAgIGZvciAodGhpcy5wdXNoKGlbZV0pLCB0aGlzLnB1c2goJyI+JyksIGUgPSAwOyBlIDwgbDMubGVuZ3RoOyBlKyspIHRoaXMucHVzaChsM1tlXSk7CiAgICAgIFVpID0gdGhpcy5wdXNoKCI8L3N0eWxlPiIpLCAkbCA9IHRydWUsIGwzLmxlbmd0aCA9IDAsIGkubGVuZ3RoID0gMDsKICAgIH0KICB9CiAgZnVuY3Rpb24gWHIobjIpIHsKICAgIHJldHVybiBuMi5zdGF0ZSAhPT0gMiA/ICRsID0gdHJ1ZSA6IGZhbHNlOwogIH0KICBmdW5jdGlvbiBXdChuMiwgbDMsIGkpIHsKICAgIHJldHVybiAkbCA9IGZhbHNlLCBVaSA9IHRydWUsIFhuID0gaSwgbDMuc3R5bGVzLmZvckVhY2goR3IsIG4yKSwgWG4gPSBudWxsLCBsMy5zdHlsZXNoZWV0cy5mb3JFYWNoKFhyKSwgJGwgJiYgKGkuc3R5bGVzVG9Ib2lzdCA9IHRydWUpLCBVaTsKICB9CiAgZnVuY3Rpb24gajMobjIpIHsKICAgIGZvciAodmFyIGwzID0gMDsgbDMgPCBuMi5sZW5ndGg7IGwzKyspIHRoaXMucHVzaChuMltsM10pOwogICAgbjIubGVuZ3RoID0gMDsKICB9CiAgdmFyIGJuID0gW107CiAgZnVuY3Rpb24gWnIobjIpIHsKICAgIFkyKGJuLCBuMi5wcm9wcyk7CiAgICBmb3IgKHZhciBsMyA9IDA7IGwzIDwgYm4ubGVuZ3RoOyBsMysrKSB0aGlzLnB1c2goYm5bbDNdKTsKICAgIGJuLmxlbmd0aCA9IDAsIG4yLnN0YXRlID0gMjsKICB9CiAgZnVuY3Rpb24gSnIobjIpIHsKICAgIHZhciBsMyA9IDAgPCBuMi5zaGVldHMuc2l6ZTsKICAgIG4yLnNoZWV0cy5mb3JFYWNoKFpyLCB0aGlzKSwgbjIuc2hlZXRzLmNsZWFyKCk7CiAgICB2YXIgaSA9IG4yLnJ1bGVzLCBlID0gbjIuaHJlZnM7CiAgICBpZiAoIWwzIHx8IGUubGVuZ3RoKSB7CiAgICAgIGlmICh0aGlzLnB1c2goWG4uc3RhcnRJbmxpbmVTdHlsZSksIHRoaXMucHVzaCgnIGRhdGEtcHJlY2VkZW5jZT0iJyksIHRoaXMucHVzaChuMi5wcmVjZWRlbmNlKSwgbjIgPSAwLCBlLmxlbmd0aCkgewogICAgICAgIGZvciAodGhpcy5wdXNoKCciIGRhdGEtaHJlZj0iJyk7IG4yIDwgZS5sZW5ndGggLSAxOyBuMisrKSB0aGlzLnB1c2goZVtuMl0pLCB0aGlzLnB1c2goIiAiKTsKICAgICAgICB0aGlzLnB1c2goZVtuMl0pOwogICAgICB9CiAgICAgIGZvciAodGhpcy5wdXNoKCciPicpLCBuMiA9IDA7IG4yIDwgaS5sZW5ndGg7IG4yKyspIHRoaXMucHVzaChpW24yXSk7CiAgICAgIHRoaXMucHVzaCgiPC9zdHlsZT4iKSwgaS5sZW5ndGggPSAwLCBlLmxlbmd0aCA9IDA7CiAgICB9CiAgfQogIGZ1bmN0aW9uIFFyKG4yKSB7CiAgICBpZiAobjIuc3RhdGUgPT09IDApIHsKICAgICAgbjIuc3RhdGUgPSAxOwogICAgICB2YXIgbDMgPSBuMi5wcm9wczsKICAgICAgZm9yIChZMihibiwgewogICAgICAgIHJlbDogInByZWxvYWQiLAogICAgICAgIGFzOiAic3R5bGUiLAogICAgICAgIGhyZWY6IG4yLnByb3BzLmhyZWYsCiAgICAgICAgY3Jvc3NPcmlnaW46IGwzLmNyb3NzT3JpZ2luLAogICAgICAgIGZldGNoUHJpb3JpdHk6IGwzLmZldGNoUHJpb3JpdHksCiAgICAgICAgaW50ZWdyaXR5OiBsMy5pbnRlZ3JpdHksCiAgICAgICAgbWVkaWE6IGwzLm1lZGlhLAogICAgICAgIGhyZWZMYW5nOiBsMy5ocmVmTGFuZywKICAgICAgICByZWZlcnJlclBvbGljeTogbDMucmVmZXJyZXJQb2xpY3kKICAgICAgfSksIG4yID0gMDsgbjIgPCBibi5sZW5ndGg7IG4yKyspIHRoaXMucHVzaChibltuMl0pOwogICAgICBibi5sZW5ndGggPSAwOwogICAgfQogIH0KICBmdW5jdGlvbiBWcihuMikgewogICAgbjIuc2hlZXRzLmZvckVhY2goUXIsIHRoaXMpLCBuMi5zaGVldHMuY2xlYXIoKTsKICB9CiAgZnVuY3Rpb24gSmwobjIsIGwzKSB7CiAgICAobDMuaW5zdHJ1Y3Rpb25zICYgMzIpID09PSAwICYmIChsMy5pbnN0cnVjdGlvbnMgfD0gMzIsIG4yLnB1c2goJyBpZD0iJywgVDMoIl8iICsgbDMuaWRQcmVmaXggKyAiUl8iKSwgJyInKSk7CiAgfQogIGZ1bmN0aW9uIEtyKG4yLCBsMykgewogICAgbjIucHVzaCgiWyIpOwogICAgdmFyIGkgPSAiWyI7CiAgICBsMy5zdHlsZXNoZWV0cy5mb3JFYWNoKGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGUuc3RhdGUgIT09IDIpIGlmIChlLnN0YXRlID09PSAzKSBuMi5wdXNoKGkpLCBlID0gZGwoIiIgKyBlLnByb3BzLmhyZWYpLCBuMi5wdXNoKGUpLCBuMi5wdXNoKCJdIiksIGkgPSAiLFsiOwogICAgICBlbHNlIHsKICAgICAgICBuMi5wdXNoKGkpOwogICAgICAgIHZhciB0ID0gZS5wcm9wc1siZGF0YS1wcmVjZWRlbmNlIl0sIHIgPSBlLnByb3BzLCBhID0gZ2woIiIgKyBlLnByb3BzLmhyZWYpOwogICAgICAgIGEgPSBkbChhKSwgbjIucHVzaChhKSwgdCA9ICIiICsgdCwgbjIucHVzaCgiLCIpLCB0ID0gZGwodCksIG4yLnB1c2godCk7CiAgICAgICAgZm9yICh2YXIgYzIgaW4gcikgaWYgKEkyLmNhbGwociwgYzIpICYmICh0ID0gcltjMl0sIHQgIT0gbnVsbCkpIHN3aXRjaCAoYzIpIHsKICAgICAgICAgIGNhc2UgImhyZWYiOgogICAgICAgICAgY2FzZSAicmVsIjoKICAgICAgICAgIGNhc2UgInByZWNlZGVuY2UiOgogICAgICAgICAgY2FzZSAiZGF0YS1wcmVjZWRlbmNlIjoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICAgIHRocm93IEVycm9yKHMoMzk5LCAibGluayIpKTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG1yKG4yLCBjMiwgdCk7CiAgICAgICAgfQogICAgICAgIG4yLnB1c2goIl0iKSwgaSA9ICIsWyIsIGUuc3RhdGUgPSAzOwogICAgICB9CiAgICB9KSwgbjIucHVzaCgiXSIpOwogIH0KICBmdW5jdGlvbiBtcihuMiwgbDMsIGkpIHsKICAgIHZhciBlID0gbDMudG9Mb3dlckNhc2UoKTsKICAgIHN3aXRjaCAodHlwZW9mIGkpIHsKICAgICAgY2FzZSAiZnVuY3Rpb24iOgogICAgICBjYXNlICJzeW1ib2wiOgogICAgICAgIHJldHVybjsKICAgIH0KICAgIHN3aXRjaCAobDMpIHsKICAgICAgY2FzZSAiaW5uZXJIVE1MIjoKICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICBjYXNlICJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciOgogICAgICBjYXNlICJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciOgogICAgICBjYXNlICJzdHlsZSI6CiAgICAgIGNhc2UgInJlZiI6CiAgICAgICAgcmV0dXJuOwogICAgICBjYXNlICJjbGFzc05hbWUiOgogICAgICAgIGUgPSAiY2xhc3MiLCBsMyA9ICIiICsgaTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiaGlkZGVuIjoKICAgICAgICBpZiAoaSA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICBsMyA9ICIiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJzcmMiOgogICAgICBjYXNlICJocmVmIjoKICAgICAgICBpID0gZ2woaSksIGwzID0gIiIgKyBpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGlmICgyIDwgbDMubGVuZ3RoICYmIChsM1swXSA9PT0gIm8iIHx8IGwzWzBdID09PSAiTyIpICYmIChsM1sxXSA9PT0gIm4iIHx8IGwzWzFdID09PSAiTiIpIHx8ICEkaShsMykpIHJldHVybjsKICAgICAgICBsMyA9ICIiICsgaTsKICAgIH0KICAgIG4yLnB1c2goIiwiKSwgZSA9IGRsKGUpLCBuMi5wdXNoKGUpLCBuMi5wdXNoKCIsIiksIGUgPSBkbChsMyksIG4yLnB1c2goZSk7CiAgfQogIGZ1bmN0aW9uIFlpKCkgewogICAgcmV0dXJuIHsKICAgICAgc3R5bGVzOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLAogICAgICBzdHlsZXNoZWV0czogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwKICAgICAgc3VzcGVuc2V5SW1hZ2VzOiBmYWxzZQogICAgfTsKICB9CiAgZnVuY3Rpb24gcHIobjIpIHsKICAgIHZhciBsMyA9IHozIHx8IG51bGw7CiAgICBpZiAobDMpIHsKICAgICAgdmFyIGkgPSBsMy5yZXN1bWFibGVTdGF0ZSwgZSA9IGwzLnJlbmRlclN0YXRlOwogICAgICBpZiAodHlwZW9mIG4yID09ICJzdHJpbmciICYmIG4yKSB7CiAgICAgICAgaWYgKCFpLmRuc1Jlc291cmNlcy5oYXNPd25Qcm9wZXJ0eShuMikpIHsKICAgICAgICAgIGkuZG5zUmVzb3VyY2VzW24yXSA9IG51bGwsIGkgPSBlLmhlYWRlcnM7CiAgICAgICAgICB2YXIgdCwgcjsKICAgICAgICAgIChyID0gaSAmJiAwIDwgaS5yZW1haW5pbmdDYXBhY2l0eSkgJiYgKHIgPSAodCA9ICI8IiArICgiIiArIG4yKS5yZXBsYWNlKG5lLCBsZTIpICsgIj47IHJlbD1kbnMtcHJlZmV0Y2giLCAwIDw9IChpLnJlbWFpbmluZ0NhcGFjaXR5IC09IHQubGVuZ3RoICsgMikpKSwgciA/IChlLnJlc2V0cy5kbnNbbjJdID0gbnVsbCwgaS5wcmVjb25uZWN0cyAmJiAoaS5wcmVjb25uZWN0cyArPSAiLCAiKSwgaS5wcmVjb25uZWN0cyArPSB0KSA6ICh0ID0gW10sIFkyKHQsIHsKICAgICAgICAgICAgaHJlZjogbjIsCiAgICAgICAgICAgIHJlbDogImRucy1wcmVmZXRjaCIKICAgICAgICAgIH0pLCBlLnByZWNvbm5lY3RzLmFkZCh0KSk7CiAgICAgICAgfQogICAgICAgIE9uKGwzKTsKICAgICAgfQogICAgfSBlbHNlIHVuLkQobjIpOwogIH0KICBmdW5jdGlvbiBxcihuMiwgbDMpIHsKICAgIHZhciBpID0gejMgfHwgbnVsbDsKICAgIGlmIChpKSB7CiAgICAgIHZhciBlID0gaS5yZXN1bWFibGVTdGF0ZSwgdCA9IGkucmVuZGVyU3RhdGU7CiAgICAgIGlmICh0eXBlb2YgbjIgPT0gInN0cmluZyIgJiYgbjIpIHsKICAgICAgICB2YXIgciA9IGwzID09PSAidXNlLWNyZWRlbnRpYWxzIiA/ICJjcmVkZW50aWFscyIgOiB0eXBlb2YgbDMgPT0gInN0cmluZyIgPyAiYW5vbnltb3VzIiA6ICJkZWZhdWx0IjsKICAgICAgICBpZiAoIWUuY29ubmVjdFJlc291cmNlc1tyXS5oYXNPd25Qcm9wZXJ0eShuMikpIHsKICAgICAgICAgIGUuY29ubmVjdFJlc291cmNlc1tyXVtuMl0gPSBudWxsLCBlID0gdC5oZWFkZXJzOwogICAgICAgICAgdmFyIGEsIGMyOwogICAgICAgICAgaWYgKGMyID0gZSAmJiAwIDwgZS5yZW1haW5pbmdDYXBhY2l0eSkgewogICAgICAgICAgICBpZiAoYzIgPSAiPCIgKyAoIiIgKyBuMikucmVwbGFjZShuZSwgbGUyKSArICI+OyByZWw9cHJlY29ubmVjdCIsIHR5cGVvZiBsMyA9PSAic3RyaW5nIikgewogICAgICAgICAgICAgIHZhciB1MiA9ICgiIiArIGwzKS5yZXBsYWNlKEdpLCBYaSk7CiAgICAgICAgICAgICAgYzIgKz0gJzsgY3Jvc3NvcmlnaW49IicgKyB1MiArICciJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjMiA9IChhID0gYzIsIDAgPD0gKGUucmVtYWluaW5nQ2FwYWNpdHkgLT0gYS5sZW5ndGggKyAyKSk7CiAgICAgICAgICB9CiAgICAgICAgICBjMiA/ICh0LnJlc2V0cy5jb25uZWN0W3JdW24yXSA9IG51bGwsIGUucHJlY29ubmVjdHMgJiYgKGUucHJlY29ubmVjdHMgKz0gIiwgIiksIGUucHJlY29ubmVjdHMgKz0gYSkgOiAociA9IFtdLCBZMihyLCB7CiAgICAgICAgICAgIHJlbDogInByZWNvbm5lY3QiLAogICAgICAgICAgICBocmVmOiBuMiwKICAgICAgICAgICAgY3Jvc3NPcmlnaW46IGwzCiAgICAgICAgICB9KSwgdC5wcmVjb25uZWN0cy5hZGQocikpOwogICAgICAgIH0KICAgICAgICBPbihpKTsKICAgICAgfQogICAgfSBlbHNlIHVuLkMobjIsIGwzKTsKICB9CiAgZnVuY3Rpb24ganIobjIsIGwzLCBpKSB7CiAgICB2YXIgZSA9IHozIHx8IG51bGw7CiAgICBpZiAoZSkgewogICAgICB2YXIgdCA9IGUucmVzdW1hYmxlU3RhdGUsIHIgPSBlLnJlbmRlclN0YXRlOwogICAgICBpZiAobDMgJiYgbjIpIHsKICAgICAgICBzd2l0Y2ggKGwzKSB7CiAgICAgICAgICBjYXNlICJpbWFnZSI6CiAgICAgICAgICAgIGlmIChpKSB2YXIgYSA9IGkuaW1hZ2VTcmNTZXQsIGMyID0gaS5pbWFnZVNpemVzLCB1MiA9IGkuZmV0Y2hQcmlvcml0eTsKICAgICAgICAgICAgdmFyIGggPSBhID8gYSArIGAKYCArIChjMiB8fCAiIikgOiBuMjsKICAgICAgICAgICAgaWYgKHQuaW1hZ2VSZXNvdXJjZXMuaGFzT3duUHJvcGVydHkoaCkpIHJldHVybjsKICAgICAgICAgICAgdC5pbWFnZVJlc291cmNlc1toXSA9IEsyLCB0ID0gci5oZWFkZXJzOwogICAgICAgICAgICB2YXIgZjI7CiAgICAgICAgICAgIHQgJiYgMCA8IHQucmVtYWluaW5nQ2FwYWNpdHkgJiYgdHlwZW9mIGEgIT0gInN0cmluZyIgJiYgdTIgPT09ICJoaWdoIiAmJiAoZjIgPSBuaShuMiwgbDMsIGkpLCAwIDw9ICh0LnJlbWFpbmluZ0NhcGFjaXR5IC09IGYyLmxlbmd0aCArIDIpKSA/IChyLnJlc2V0cy5pbWFnZVtoXSA9IEsyLCB0LmhpZ2hJbWFnZVByZWxvYWRzICYmICh0LmhpZ2hJbWFnZVByZWxvYWRzICs9ICIsICIpLCB0LmhpZ2hJbWFnZVByZWxvYWRzICs9IGYyKSA6ICh0ID0gW10sIFkyKHQsIEooewogICAgICAgICAgICAgIHJlbDogInByZWxvYWQiLAogICAgICAgICAgICAgIGhyZWY6IGEgPyB2b2lkIDAgOiBuMiwKICAgICAgICAgICAgICBhczogbDMKICAgICAgICAgICAgfSwgaSkpLCB1MiA9PT0gImhpZ2giID8gci5oaWdoSW1hZ2VQcmVsb2Fkcy5hZGQodCkgOiAoci5idWxrUHJlbG9hZHMuYWRkKHQpLCByLnByZWxvYWRzLmltYWdlcy5zZXQoaCwgdCkpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJzdHlsZSI6CiAgICAgICAgICAgIGlmICh0LnN0eWxlUmVzb3VyY2VzLmhhc093blByb3BlcnR5KG4yKSkgcmV0dXJuOwogICAgICAgICAgICBhID0gW10sIFkyKGEsIEooewogICAgICAgICAgICAgIHJlbDogInByZWxvYWQiLAogICAgICAgICAgICAgIGhyZWY6IG4yLAogICAgICAgICAgICAgIGFzOiBsMwogICAgICAgICAgICB9LCBpKSksIHQuc3R5bGVSZXNvdXJjZXNbbjJdID0gIWkgfHwgdHlwZW9mIGkuY3Jvc3NPcmlnaW4gIT0gInN0cmluZyIgJiYgdHlwZW9mIGkuaW50ZWdyaXR5ICE9ICJzdHJpbmciID8gSzIgOiBbCiAgICAgICAgICAgICAgaS5jcm9zc09yaWdpbiwKICAgICAgICAgICAgICBpLmludGVncml0eQogICAgICAgICAgICBdLCByLnByZWxvYWRzLnN0eWxlc2hlZXRzLnNldChuMiwgYSksIHIuYnVsa1ByZWxvYWRzLmFkZChhKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJzY3JpcHQiOgogICAgICAgICAgICBpZiAodC5zY3JpcHRSZXNvdXJjZXMuaGFzT3duUHJvcGVydHkobjIpKSByZXR1cm47CiAgICAgICAgICAgIGEgPSBbXSwgci5wcmVsb2Fkcy5zY3JpcHRzLnNldChuMiwgYSksIHIuYnVsa1ByZWxvYWRzLmFkZChhKSwgWTIoYSwgSih7CiAgICAgICAgICAgICAgcmVsOiAicHJlbG9hZCIsCiAgICAgICAgICAgICAgaHJlZjogbjIsCiAgICAgICAgICAgICAgYXM6IGwzCiAgICAgICAgICAgIH0sIGkpKSwgdC5zY3JpcHRSZXNvdXJjZXNbbjJdID0gIWkgfHwgdHlwZW9mIGkuY3Jvc3NPcmlnaW4gIT0gInN0cmluZyIgJiYgdHlwZW9mIGkuaW50ZWdyaXR5ICE9ICJzdHJpbmciID8gSzIgOiBbCiAgICAgICAgICAgICAgaS5jcm9zc09yaWdpbiwKICAgICAgICAgICAgICBpLmludGVncml0eQogICAgICAgICAgICBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGlmICh0LnVua25vd25SZXNvdXJjZXMuaGFzT3duUHJvcGVydHkobDMpKSB7CiAgICAgICAgICAgICAgaWYgKGEgPSB0LnVua25vd25SZXNvdXJjZXNbbDNdLCBhLmhhc093blByb3BlcnR5KG4yKSkgcmV0dXJuOwogICAgICAgICAgICB9IGVsc2UgYSA9IHt9LCB0LnVua25vd25SZXNvdXJjZXNbbDNdID0gYTsKICAgICAgICAgICAgYVtuMl0gPSBLMiwgKHQgPSByLmhlYWRlcnMpICYmIDAgPCB0LnJlbWFpbmluZ0NhcGFjaXR5ICYmIGwzID09PSAiZm9udCIgJiYgKGggPSBuaShuMiwgbDMsIGkpLCAwIDw9ICh0LnJlbWFpbmluZ0NhcGFjaXR5IC09IGgubGVuZ3RoICsgMikpID8gKHIucmVzZXRzLmZvbnRbbjJdID0gSzIsIHQuZm9udFByZWxvYWRzICYmICh0LmZvbnRQcmVsb2FkcyArPSAiLCAiKSwgdC5mb250UHJlbG9hZHMgKz0gaCkgOiAodCA9IFtdLCBuMiA9IEooewogICAgICAgICAgICAgIHJlbDogInByZWxvYWQiLAogICAgICAgICAgICAgIGhyZWY6IG4yLAogICAgICAgICAgICAgIGFzOiBsMwogICAgICAgICAgICB9LCBpKSwgWTIodCwgbjIpLCBsMykgPT09ICJmb250IiA/IHIuZm9udFByZWxvYWRzLmFkZCh0KSA6IHIuYnVsa1ByZWxvYWRzLmFkZCh0KTsKICAgICAgICB9CiAgICAgICAgT24oZSk7CiAgICAgIH0KICAgIH0gZWxzZSB1bi5MKG4yLCBsMywgaSk7CiAgfQogIGZ1bmN0aW9uICRyKG4yLCBsMykgewogICAgdmFyIGkgPSB6MyB8fCBudWxsOwogICAgaWYgKGkpIHsKICAgICAgdmFyIGUgPSBpLnJlc3VtYWJsZVN0YXRlLCB0ID0gaS5yZW5kZXJTdGF0ZTsKICAgICAgaWYgKG4yKSB7CiAgICAgICAgdmFyIHIgPSBsMyAmJiB0eXBlb2YgbDMuYXMgPT0gInN0cmluZyIgPyBsMy5hcyA6ICJzY3JpcHQiOwogICAgICAgIHN3aXRjaCAocikgewogICAgICAgICAgY2FzZSAic2NyaXB0IjoKICAgICAgICAgICAgaWYgKGUubW9kdWxlU2NyaXB0UmVzb3VyY2VzLmhhc093blByb3BlcnR5KG4yKSkgcmV0dXJuOwogICAgICAgICAgICByID0gW10sIGUubW9kdWxlU2NyaXB0UmVzb3VyY2VzW24yXSA9ICFsMyB8fCB0eXBlb2YgbDMuY3Jvc3NPcmlnaW4gIT0gInN0cmluZyIgJiYgdHlwZW9mIGwzLmludGVncml0eSAhPSAic3RyaW5nIiA/IEsyIDogWwogICAgICAgICAgICAgIGwzLmNyb3NzT3JpZ2luLAogICAgICAgICAgICAgIGwzLmludGVncml0eQogICAgICAgICAgICBdLCB0LnByZWxvYWRzLm1vZHVsZVNjcmlwdHMuc2V0KG4yLCByKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAoZS5tb2R1bGVVbmtub3duUmVzb3VyY2VzLmhhc093blByb3BlcnR5KHIpKSB7CiAgICAgICAgICAgICAgdmFyIGEgPSBlLnVua25vd25SZXNvdXJjZXNbcl07CiAgICAgICAgICAgICAgaWYgKGEuaGFzT3duUHJvcGVydHkobjIpKSByZXR1cm47CiAgICAgICAgICAgIH0gZWxzZSBhID0ge30sIGUubW9kdWxlVW5rbm93blJlc291cmNlc1tyXSA9IGE7CiAgICAgICAgICAgIHIgPSBbXSwgYVtuMl0gPSBLMjsKICAgICAgICB9CiAgICAgICAgWTIociwgSih7CiAgICAgICAgICByZWw6ICJtb2R1bGVwcmVsb2FkIiwKICAgICAgICAgIGhyZWY6IG4yCiAgICAgICAgfSwgbDMpKSwgdC5idWxrUHJlbG9hZHMuYWRkKHIpLCBPbihpKTsKICAgICAgfQogICAgfSBlbHNlIHVuLm0objIsIGwzKTsKICB9CiAgZnVuY3Rpb24gbmEobjIsIGwzLCBpKSB7CiAgICB2YXIgZSA9IHozIHx8IG51bGw7CiAgICBpZiAoZSkgewogICAgICB2YXIgdCA9IGUucmVzdW1hYmxlU3RhdGUsIHIgPSBlLnJlbmRlclN0YXRlOwogICAgICBpZiAobjIpIHsKICAgICAgICBsMyA9IGwzIHx8ICJkZWZhdWx0IjsKICAgICAgICB2YXIgYSA9IHIuc3R5bGVzLmdldChsMyksIGMyID0gdC5zdHlsZVJlc291cmNlcy5oYXNPd25Qcm9wZXJ0eShuMikgPyB0LnN0eWxlUmVzb3VyY2VzW24yXSA6IHZvaWQgMDsKICAgICAgICBjMiAhPT0gbnVsbCAmJiAodC5zdHlsZVJlc291cmNlc1tuMl0gPSBudWxsLCBhIHx8IChhID0gewogICAgICAgICAgcHJlY2VkZW5jZTogVDMobDMpLAogICAgICAgICAgcnVsZXM6IFtdLAogICAgICAgICAgaHJlZnM6IFtdLAogICAgICAgICAgc2hlZXRzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpCiAgICAgICAgfSwgci5zdHlsZXMuc2V0KGwzLCBhKSksIGwzID0gewogICAgICAgICAgc3RhdGU6IDAsCiAgICAgICAgICBwcm9wczogSih7CiAgICAgICAgICAgIHJlbDogInN0eWxlc2hlZXQiLAogICAgICAgICAgICBocmVmOiBuMiwKICAgICAgICAgICAgImRhdGEtcHJlY2VkZW5jZSI6IGwzCiAgICAgICAgICB9LCBpKQogICAgICAgIH0sIGMyICYmIChjMi5sZW5ndGggPT09IDIgJiYgdmwobDMucHJvcHMsIGMyKSwgKHIgPSByLnByZWxvYWRzLnN0eWxlc2hlZXRzLmdldChuMikpICYmIDAgPCByLmxlbmd0aCA/IHIubGVuZ3RoID0gMCA6IGwzLnN0YXRlID0gMSksIGEuc2hlZXRzLnNldChuMiwgbDMpLCBPbihlKSk7CiAgICAgIH0KICAgIH0gZWxzZSB1bi5TKG4yLCBsMywgaSk7CiAgfQogIGZ1bmN0aW9uIGxhKG4yLCBsMykgewogICAgdmFyIGkgPSB6MyB8fCBudWxsOwogICAgaWYgKGkpIHsKICAgICAgdmFyIGUgPSBpLnJlc3VtYWJsZVN0YXRlLCB0ID0gaS5yZW5kZXJTdGF0ZTsKICAgICAgaWYgKG4yKSB7CiAgICAgICAgdmFyIHIgPSBlLnNjcmlwdFJlc291cmNlcy5oYXNPd25Qcm9wZXJ0eShuMikgPyBlLnNjcmlwdFJlc291cmNlc1tuMl0gOiB2b2lkIDA7CiAgICAgICAgciAhPT0gbnVsbCAmJiAoZS5zY3JpcHRSZXNvdXJjZXNbbjJdID0gbnVsbCwgbDMgPSBKKHsKICAgICAgICAgIHNyYzogbjIsCiAgICAgICAgICBhc3luYzogdHJ1ZQogICAgICAgIH0sIGwzKSwgciAmJiAoci5sZW5ndGggPT09IDIgJiYgdmwobDMsIHIpLCBuMiA9IHQucHJlbG9hZHMuc2NyaXB0cy5nZXQobjIpKSAmJiAobjIubGVuZ3RoID0gMCksIG4yID0gW10sIHQuc2NyaXB0cy5hZGQobjIpLCBqbChuMiwgbDMpLCBPbihpKSk7CiAgICAgIH0KICAgIH0gZWxzZSB1bi5YKG4yLCBsMyk7CiAgfQogIGZ1bmN0aW9uIGlhKG4yLCBsMykgewogICAgdmFyIGkgPSB6MyB8fCBudWxsOwogICAgaWYgKGkpIHsKICAgICAgdmFyIGUgPSBpLnJlc3VtYWJsZVN0YXRlLCB0ID0gaS5yZW5kZXJTdGF0ZTsKICAgICAgaWYgKG4yKSB7CiAgICAgICAgdmFyIHIgPSBlLm1vZHVsZVNjcmlwdFJlc291cmNlcy5oYXNPd25Qcm9wZXJ0eShuMikgPyBlLm1vZHVsZVNjcmlwdFJlc291cmNlc1tuMl0gOiB2b2lkIDA7CiAgICAgICAgciAhPT0gbnVsbCAmJiAoZS5tb2R1bGVTY3JpcHRSZXNvdXJjZXNbbjJdID0gbnVsbCwgbDMgPSBKKHsKICAgICAgICAgIHNyYzogbjIsCiAgICAgICAgICB0eXBlOiAibW9kdWxlIiwKICAgICAgICAgIGFzeW5jOiB0cnVlCiAgICAgICAgfSwgbDMpLCByICYmIChyLmxlbmd0aCA9PT0gMiAmJiB2bChsMywgciksIG4yID0gdC5wcmVsb2Fkcy5tb2R1bGVTY3JpcHRzLmdldChuMikpICYmIChuMi5sZW5ndGggPSAwKSwgbjIgPSBbXSwgdC5zY3JpcHRzLmFkZChuMiksIGpsKG4yLCBsMyksIE9uKGkpKTsKICAgICAgfQogICAgfSBlbHNlIHVuLk0objIsIGwzKTsKICB9CiAgZnVuY3Rpb24gdmwobjIsIGwzKSB7CiAgICBuMi5jcm9zc09yaWdpbiA9PSBudWxsICYmIChuMi5jcm9zc09yaWdpbiA9IGwzWzBdKSwgbjIuaW50ZWdyaXR5ID09IG51bGwgJiYgKG4yLmludGVncml0eSA9IGwzWzFdKTsKICB9CiAgZnVuY3Rpb24gbmkobjIsIGwzLCBpKSB7CiAgICBuMiA9ICgiIiArIG4yKS5yZXBsYWNlKG5lLCBsZTIpLCBsMyA9ICgiIiArIGwzKS5yZXBsYWNlKEdpLCBYaSksIGwzID0gIjwiICsgbjIgKyAnPjsgcmVsPXByZWxvYWQ7IGFzPSInICsgbDMgKyAnIic7CiAgICBmb3IgKHZhciBlIGluIGkpIEkyLmNhbGwoaSwgZSkgJiYgKG4yID0gaVtlXSwgdHlwZW9mIG4yID09ICJzdHJpbmciICYmIChsMyArPSAiOyAiICsgZS50b0xvd2VyQ2FzZSgpICsgJz0iJyArICgiIiArIG4yKS5yZXBsYWNlKEdpLCBYaSkgKyAnIicpKTsKICAgIHJldHVybiBsMzsKICB9CiAgdmFyIG5lID0gL1s8PlxyXG5dL2c7CiAgZnVuY3Rpb24gbGUyKG4yKSB7CiAgICBzd2l0Y2ggKG4yKSB7CiAgICAgIGNhc2UgIjwiOgogICAgICAgIHJldHVybiAiJTNDIjsKICAgICAgY2FzZSAiPiI6CiAgICAgICAgcmV0dXJuICIlM0UiOwogICAgICBjYXNlIGAKYDoKICAgICAgICByZXR1cm4gIiUwQSI7CiAgICAgIGNhc2UgIlxyIjoKICAgICAgICByZXR1cm4gIiUwRCI7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgRXJyb3IoImVzY2FwZUxpbmtIcmVmRm9ySGVhZGVyQ29udGV4dFJlcGxhY2VyIGVuY291bnRlcmVkIGEgbWF0Y2ggaXQgZG9lcyBub3Qga25vdyBob3cgdG8gcmVwbGFjZS4gdGhpcyBtZWFucyB0aGUgbWF0Y2ggcmVnZXggYW5kIHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGFyZSBubyBsb25nZXIgaW4gc3luYy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdCIpOwogICAgfQogIH0KICB2YXIgR2kgPSAvWyInOyxcclxuXS9nOwogIGZ1bmN0aW9uIFhpKG4yKSB7CiAgICBzd2l0Y2ggKG4yKSB7CiAgICAgIGNhc2UgJyInOgogICAgICAgIHJldHVybiAiJTIyIjsKICAgICAgY2FzZSAiJyI6CiAgICAgICAgcmV0dXJuICIlMjciOwogICAgICBjYXNlICI7IjoKICAgICAgICByZXR1cm4gIiUzQiI7CiAgICAgIGNhc2UgIiwiOgogICAgICAgIHJldHVybiAiJTJDIjsKICAgICAgY2FzZSBgCmA6CiAgICAgICAgcmV0dXJuICIlMEEiOwogICAgICBjYXNlICJcciI6CiAgICAgICAgcmV0dXJuICIlMEQiOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IEVycm9yKCJlc2NhcGVTdHJpbmdGb3JMaW5rSGVhZGVyUXVvdGVkUGFyYW1WYWx1ZUNvbnRleHRSZXBsYWNlciBlbmNvdW50ZXJlZCBhIG1hdGNoIGl0IGRvZXMgbm90IGtub3cgaG93IHRvIHJlcGxhY2UuIHRoaXMgbWVhbnMgdGhlIG1hdGNoIHJlZ2V4IGFuZCB0aGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVycyBhcmUgbm8gbG9uZ2VyIGluIHN5bmMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QiKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZWEobjIpIHsKICAgIHRoaXMuc3R5bGVzLmFkZChuMik7CiAgfQogIGZ1bmN0aW9uIHRhKG4yKSB7CiAgICB0aGlzLnN0eWxlc2hlZXRzLmFkZChuMik7CiAgfQogIGZ1bmN0aW9uIFpuKG4yLCBsMykgewogICAgbDMuc3R5bGVzLmZvckVhY2goZWEsIG4yKSwgbDMuc3R5bGVzaGVldHMuZm9yRWFjaCh0YSwgbjIpLCBsMy5zdXNwZW5zZXlJbWFnZXMgJiYgKG4yLnN1c3BlbnNleUltYWdlcyA9IHRydWUpOwogIH0KICBmdW5jdGlvbiByYShuMiwgbDMpIHsKICAgIHZhciBpID0gbjIuaWRQcmVmaXgsIGUgPSBbXSwgdCA9IG4yLmJvb3RzdHJhcFNjcmlwdENvbnRlbnQsIHIgPSBuMi5ib290c3RyYXBTY3JpcHRzLCBhID0gbjIuYm9vdHN0cmFwTW9kdWxlczsKICAgIHQgIT09IHZvaWQgMCAmJiAoZS5wdXNoKCI8c2NyaXB0IiksIEpsKGUsIG4yKSwgZS5wdXNoKCI+IiwgKCIiICsgdCkucmVwbGFjZShTdCwgT3QpLCAiPFwvc2NyaXB0PiIpKSwgdCA9IGkgKyAiUDoiOwogICAgdmFyIGMyID0gaSArICJTOiI7CiAgICBpICs9ICJCOiI7CiAgICB2YXIgdTIgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCBoID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgZjIgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCBvID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgZDMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCBnID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgRTQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCB5MiA9IHsKICAgICAgaW1hZ2VzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLAogICAgICBzdHlsZXNoZWV0czogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwKICAgICAgc2NyaXB0czogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwKICAgICAgbW9kdWxlU2NyaXB0czogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKQogICAgfTsKICAgIGlmIChyICE9PSB2b2lkIDApIGZvciAodmFyIGI0ID0gMDsgYjQgPCByLmxlbmd0aDsgYjQrKykgewogICAgICB2YXIgdjMgPSByW2I0XSwgeDMsIE0yID0gdm9pZCAwLCBQID0gdm9pZCAwLCBSMyA9IHsKICAgICAgICByZWw6ICJwcmVsb2FkIiwKICAgICAgICBhczogInNjcmlwdCIsCiAgICAgICAgZmV0Y2hQcmlvcml0eTogImxvdyIsCiAgICAgICAgbm9uY2U6IHZvaWQgMAogICAgICB9OwogICAgICB0eXBlb2YgdjMgPT0gInN0cmluZyIgPyBSMy5ocmVmID0geDMgPSB2MyA6IChSMy5ocmVmID0geDMgPSB2My5zcmMsIFIzLmludGVncml0eSA9IFAgPSB0eXBlb2YgdjMuaW50ZWdyaXR5ID09ICJzdHJpbmciID8gdjMuaW50ZWdyaXR5IDogdm9pZCAwLCBSMy5jcm9zc09yaWdpbiA9IE0yID0gdHlwZW9mIHYzID09ICJzdHJpbmciIHx8IHYzLmNyb3NzT3JpZ2luID09IG51bGwgPyB2b2lkIDAgOiB2My5jcm9zc09yaWdpbiA9PT0gInVzZS1jcmVkZW50aWFscyIgPyAidXNlLWNyZWRlbnRpYWxzIiA6ICIiKSwgdjMgPSBuMjsKICAgICAgdmFyIEYyID0geDM7CiAgICAgIHYzLnNjcmlwdFJlc291cmNlc1tGMl0gPSBudWxsLCB2My5tb2R1bGVTY3JpcHRSZXNvdXJjZXNbRjJdID0gbnVsbCwgdjMgPSBbXSwgWTIodjMsIFIzKSwgZDMuYWRkKHYzKSwgZS5wdXNoKCc8c2NyaXB0IHNyYz0iJywgVDMoeDMpLCAnIicpLCB0eXBlb2YgUCA9PSAic3RyaW5nIiAmJiBlLnB1c2goJyBpbnRlZ3JpdHk9IicsIFQzKFApLCAnIicpLCB0eXBlb2YgTTIgPT0gInN0cmluZyIgJiYgZS5wdXNoKCcgY3Jvc3NvcmlnaW49IicsIFQzKE0yKSwgJyInKSwgSmwoZSwgbjIpLCBlLnB1c2goJyBhc3luYz0iIj48XC9zY3JpcHQ+Jyk7CiAgICB9CiAgICBpZiAoYSAhPT0gdm9pZCAwKSBmb3IgKHIgPSAwOyByIDwgYS5sZW5ndGg7IHIrKykgUjMgPSBhW3JdLCBNMiA9IHgzID0gdm9pZCAwLCBQID0gewogICAgICByZWw6ICJtb2R1bGVwcmVsb2FkIiwKICAgICAgZmV0Y2hQcmlvcml0eTogImxvdyIsCiAgICAgIG5vbmNlOiB2b2lkIDAKICAgIH0sIHR5cGVvZiBSMyA9PSAic3RyaW5nIiA/IFAuaHJlZiA9IGI0ID0gUjMgOiAoUC5ocmVmID0gYjQgPSBSMy5zcmMsIFAuaW50ZWdyaXR5ID0gTTIgPSB0eXBlb2YgUjMuaW50ZWdyaXR5ID09ICJzdHJpbmciID8gUjMuaW50ZWdyaXR5IDogdm9pZCAwLCBQLmNyb3NzT3JpZ2luID0geDMgPSB0eXBlb2YgUjMgPT0gInN0cmluZyIgfHwgUjMuY3Jvc3NPcmlnaW4gPT0gbnVsbCA/IHZvaWQgMCA6IFIzLmNyb3NzT3JpZ2luID09PSAidXNlLWNyZWRlbnRpYWxzIiA/ICJ1c2UtY3JlZGVudGlhbHMiIDogIiIpLCBSMyA9IG4yLCB2MyA9IGI0LCBSMy5zY3JpcHRSZXNvdXJjZXNbdjNdID0gbnVsbCwgUjMubW9kdWxlU2NyaXB0UmVzb3VyY2VzW3YzXSA9IG51bGwsIFIzID0gW10sIFkyKFIzLCBQKSwgZDMuYWRkKFIzKSwgZS5wdXNoKCc8c2NyaXB0IHR5cGU9Im1vZHVsZSIgc3JjPSInLCBUMyhiNCksICciJyksIHR5cGVvZiBNMiA9PSAic3RyaW5nIiAmJiBlLnB1c2goJyBpbnRlZ3JpdHk9IicsIFQzKE0yKSwgJyInKSwgdHlwZW9mIHgzID09ICJzdHJpbmciICYmIGUucHVzaCgnIGNyb3Nzb3JpZ2luPSInLCBUMyh4MyksICciJyksIEpsKGUsIG4yKSwgZS5wdXNoKCcgYXN5bmM9IiI+PFwvc2NyaXB0PicpOwogICAgcmV0dXJuIHsKICAgICAgcGxhY2Vob2xkZXJQcmVmaXg6IHQsCiAgICAgIHNlZ21lbnRQcmVmaXg6IGMyLAogICAgICBib3VuZGFyeVByZWZpeDogaSwKICAgICAgc3RhcnRJbmxpbmVTY3JpcHQ6ICI8c2NyaXB0IiwKICAgICAgc3RhcnRJbmxpbmVTdHlsZTogIjxzdHlsZSIsCiAgICAgIHByZWFtYmxlOiB7CiAgICAgICAgaHRtbENodW5rczogbnVsbCwKICAgICAgICBoZWFkQ2h1bmtzOiBudWxsLAogICAgICAgIGJvZHlDaHVua3M6IG51bGwKICAgICAgfSwKICAgICAgZXh0ZXJuYWxSdW50aW1lU2NyaXB0OiBudWxsLAogICAgICBib290c3RyYXBDaHVua3M6IGUsCiAgICAgIGltcG9ydE1hcENodW5rczogW10sCiAgICAgIG9uSGVhZGVyczogdm9pZCAwLAogICAgICBoZWFkZXJzOiBudWxsLAogICAgICByZXNldHM6IHsKICAgICAgICBmb250OiB7fSwKICAgICAgICBkbnM6IHt9LAogICAgICAgIGNvbm5lY3Q6IHsKICAgICAgICAgIGRlZmF1bHQ6IHt9LAogICAgICAgICAgYW5vbnltb3VzOiB7fSwKICAgICAgICAgIGNyZWRlbnRpYWxzOiB7fQogICAgICAgIH0sCiAgICAgICAgaW1hZ2U6IHt9LAogICAgICAgIHN0eWxlOiB7fQogICAgICB9LAogICAgICBjaGFyc2V0Q2h1bmtzOiBbXSwKICAgICAgdmlld3BvcnRDaHVua3M6IFtdLAogICAgICBob2lzdGFibGVDaHVua3M6IFtdLAogICAgICBwcmVjb25uZWN0czogdTIsCiAgICAgIGZvbnRQcmVsb2FkczogaCwKICAgICAgaGlnaEltYWdlUHJlbG9hZHM6IGYyLAogICAgICBzdHlsZXM6IG8sCiAgICAgIGJvb3RzdHJhcFNjcmlwdHM6IGQzLAogICAgICBzY3JpcHRzOiBnLAogICAgICBidWxrUHJlbG9hZHM6IEU0LAogICAgICBwcmVsb2FkczogeTIsCiAgICAgIG5vbmNlOiB7CiAgICAgICAgc2NyaXB0OiB2b2lkIDAsCiAgICAgICAgc3R5bGU6IHZvaWQgMAogICAgICB9LAogICAgICBzdHlsZXNUb0hvaXN0OiBmYWxzZSwKICAgICAgZ2VuZXJhdGVTdGF0aWNNYXJrdXA6IGwzCiAgICB9OwogIH0KICBmdW5jdGlvbiBydChuMiwgbDMsIGksIGUpIHsKICAgIHJldHVybiBpLmdlbmVyYXRlU3RhdGljTWFya3VwID8gKG4yLnB1c2goVDMobDMpKSwgZmFsc2UpIDogKGwzID09PSAiIiA/IG4yID0gZSA6IChlICYmIG4yLnB1c2goIjwhLS0gLS0+IiksIG4yLnB1c2goVDMobDMpKSwgbjIgPSB0cnVlKSwgbjIpOwogIH0KICBmdW5jdGlvbiBzbChuMiwgbDMsIGksIGUpIHsKICAgIGwzLmdlbmVyYXRlU3RhdGljTWFya3VwIHx8IGkgJiYgZSAmJiBuMi5wdXNoKCI8IS0tIC0tPiIpOwogIH0KICB2YXIgYWEgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgdWEyID0gU3ltYm9sLmZvcigicmVhY3QuY2xpZW50LnJlZmVyZW5jZSIpOwogIGZ1bmN0aW9uIGxpKG4yKSB7CiAgICBpZiAobjIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAodHlwZW9mIG4yID09ICJmdW5jdGlvbiIpIHJldHVybiBuMi4kJHR5cGVvZiA9PT0gdWEyID8gbnVsbCA6IG4yLmRpc3BsYXlOYW1lIHx8IG4yLm5hbWUgfHwgbnVsbDsKICAgIGlmICh0eXBlb2YgbjIgPT0gInN0cmluZyIpIHJldHVybiBuMjsKICAgIHN3aXRjaCAobjIpIHsKICAgICAgY2FzZSBDdDoKICAgICAgICByZXR1cm4gIkZyYWdtZW50IjsKICAgICAgY2FzZSBfdDoKICAgICAgICByZXR1cm4gIlByb2ZpbGVyIjsKICAgICAgY2FzZSBGdDoKICAgICAgICByZXR1cm4gIlN0cmljdE1vZGUiOwogICAgICBjYXNlIGZpOgogICAgICAgIHJldHVybiAiU3VzcGVuc2UiOwogICAgICBjYXNlIHFpMjoKICAgICAgICByZXR1cm4gIlN1c3BlbnNlTGlzdCI7CiAgICAgIGNhc2UgSXQ6CiAgICAgICAgcmV0dXJuICJBY3Rpdml0eSI7CiAgICB9CiAgICBpZiAodHlwZW9mIG4yID09ICJvYmplY3QiKSBzd2l0Y2ggKG4yLiQkdHlwZW9mKSB7CiAgICAgIGNhc2Ugd3Q6CiAgICAgICAgcmV0dXJuICJQb3J0YWwiOwogICAgICBjYXNlIGNpOgogICAgICAgIHJldHVybiBuMi5kaXNwbGF5TmFtZSB8fCAiQ29udGV4dCI7CiAgICAgIGNhc2UgQXQ6CiAgICAgICAgcmV0dXJuIChuMi5fY29udGV4dC5kaXNwbGF5TmFtZSB8fCAiQ29udGV4dCIpICsgIi5Db25zdW1lciI7CiAgICAgIGNhc2UgcGk6CiAgICAgICAgdmFyIGwzID0gbjIucmVuZGVyOwogICAgICAgIHJldHVybiBuMiA9IG4yLmRpc3BsYXlOYW1lLCBuMiB8fCAobjIgPSBsMy5kaXNwbGF5TmFtZSB8fCBsMy5uYW1lIHx8ICIiLCBuMiA9IG4yICE9PSAiIiA/ICJGb3J3YXJkUmVmKCIgKyBuMiArICIpIiA6ICJGb3J3YXJkUmVmIiksIG4yOwogICAgICBjYXNlIGppOgogICAgICAgIHJldHVybiBsMyA9IG4yLmRpc3BsYXlOYW1lIHx8IG51bGwsIGwzICE9PSBudWxsID8gbDMgOiBsaShuMi50eXBlKSB8fCAiTWVtbyI7CiAgICAgIGNhc2Ugb2k6CiAgICAgICAgbDMgPSBuMi5fcGF5bG9hZCwgbjIgPSBuMi5faW5pdDsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIGxpKG4yKGwzKSk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHZhciBhdCA9IHt9LCBJbiA9IG51bGw7CiAgZnVuY3Rpb24gZGkobjIsIGwzKSB7CiAgICBpZiAobjIgIT09IGwzKSB7CiAgICAgIG4yLmNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBuMi5wYXJlbnRWYWx1ZSwgbjIgPSBuMi5wYXJlbnQ7CiAgICAgIHZhciBpID0gbDMucGFyZW50OwogICAgICBpZiAobjIgPT09IG51bGwpIHsKICAgICAgICBpZiAoaSAhPT0gbnVsbCkgdGhyb3cgRXJyb3Iocyg0MDEpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaSA9PT0gbnVsbCkgdGhyb3cgRXJyb3Iocyg0MDEpKTsKICAgICAgICBkaShuMiwgaSk7CiAgICAgIH0KICAgICAgbDMuY29udGV4dC5fY3VycmVudFZhbHVlMiA9IGwzLnZhbHVlOwogICAgfQogIH0KICBmdW5jdGlvbiBVdChuMikgewogICAgbjIuY29udGV4dC5fY3VycmVudFZhbHVlMiA9IG4yLnBhcmVudFZhbHVlLCBuMiA9IG4yLnBhcmVudCwgbjIgIT09IG51bGwgJiYgVXQobjIpOwogIH0KICBmdW5jdGlvbiBZdChuMikgewogICAgdmFyIGwzID0gbjIucGFyZW50OwogICAgbDMgIT09IG51bGwgJiYgWXQobDMpLCBuMi5jb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gbjIudmFsdWU7CiAgfQogIGZ1bmN0aW9uIEd0KG4yLCBsMykgewogICAgaWYgKG4yLmNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBuMi5wYXJlbnRWYWx1ZSwgbjIgPSBuMi5wYXJlbnQsIG4yID09PSBudWxsKSB0aHJvdyBFcnJvcihzKDQwMikpOwogICAgbjIuZGVwdGggPT09IGwzLmRlcHRoID8gZGkobjIsIGwzKSA6IEd0KG4yLCBsMyk7CiAgfQogIGZ1bmN0aW9uIFh0KG4yLCBsMykgewogICAgdmFyIGkgPSBsMy5wYXJlbnQ7CiAgICBpZiAoaSA9PT0gbnVsbCkgdGhyb3cgRXJyb3Iocyg0MDIpKTsKICAgIG4yLmRlcHRoID09PSBpLmRlcHRoID8gZGkobjIsIGkpIDogWHQobjIsIGkpLCBsMy5jb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gbDMudmFsdWU7CiAgfQogIGZ1bmN0aW9uIHZuKG4yKSB7CiAgICB2YXIgbDMgPSBJbjsKICAgIGwzICE9PSBuMiAmJiAobDMgPT09IG51bGwgPyBZdChuMikgOiBuMiA9PT0gbnVsbCA/IFV0KGwzKSA6IGwzLmRlcHRoID09PSBuMi5kZXB0aCA/IGRpKGwzLCBuMikgOiBsMy5kZXB0aCA+IG4yLmRlcHRoID8gR3QobDMsIG4yKSA6IFh0KGwzLCBuMiksIEluID0gbjIpOwogIH0KICB2YXIgdXQgPSB7CiAgICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uKG4yLCBsMykgewogICAgICBuMiA9IG4yLl9yZWFjdEludGVybmFscywgbjIucXVldWUgIT09IG51bGwgJiYgbjIucXVldWUucHVzaChsMyk7CiAgICB9LAogICAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24objIsIGwzKSB7CiAgICAgIG4yID0gbjIuX3JlYWN0SW50ZXJuYWxzLCBuMi5yZXBsYWNlID0gdHJ1ZSwgbjIucXVldWUgPSBbCiAgICAgICAgbDMKICAgICAgXTsKICAgIH0sCiAgICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgfQogIH0sIGhhMiA9IHsKICAgIGlkOiAxLAogICAgb3ZlcmZsb3c6ICIiCiAgfTsKICBmdW5jdGlvbiBNbihuMiwgbDMsIGkpIHsKICAgIHZhciBlID0gbjIuaWQ7CiAgICBuMiA9IG4yLm92ZXJmbG93OwogICAgdmFyIHQgPSAzMiAtIFFsKGUpIC0gMTsKICAgIGUgJj0gfigxIDw8IHQpLCBpICs9IDE7CiAgICB2YXIgciA9IDMyIC0gUWwobDMpICsgdDsKICAgIGlmICgzMCA8IHIpIHsKICAgICAgdmFyIGEgPSB0IC0gdCAlIDU7CiAgICAgIHJldHVybiByID0gKGUgJiAoMSA8PCBhKSAtIDEpLnRvU3RyaW5nKDMyKSwgZSA+Pj0gYSwgdCAtPSBhLCB7CiAgICAgICAgaWQ6IDEgPDwgMzIgLSBRbChsMykgKyB0IHwgaSA8PCB0IHwgZSwKICAgICAgICBvdmVyZmxvdzogciArIG4yCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICBpZDogMSA8PCByIHwgaSA8PCB0IHwgZSwKICAgICAgb3ZlcmZsb3c6IG4yCiAgICB9OwogIH0KICB2YXIgUWwgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IG9hMiwgY2EgPSBNYXRoLmxvZywgZmEyID0gTWF0aC5MTjI7CiAgZnVuY3Rpb24gb2EyKG4yKSB7CiAgICByZXR1cm4gbjIgPj4+PSAwLCBuMiA9PT0gMCA/IDMyIDogMzEgLSAoY2EobjIpIC8gZmEyIHwgMCkgfCAwOwogIH0KICBmdW5jdGlvbiBaKCkgewogIH0KICB2YXIgVjIgPSBFcnJvcihzKDQ2MCkpOwogIGZ1bmN0aW9uIGRhMihuMiwgbDMsIGkpIHsKICAgIHN3aXRjaCAoaSA9IG4yW2ldLCBpID09PSB2b2lkIDAgPyBuMi5wdXNoKGwzKSA6IGkgIT09IGwzICYmIChsMy50aGVuKFosIFopLCBsMyA9IGkpLCBsMy5zdGF0dXMpIHsKICAgICAgY2FzZSAiZnVsZmlsbGVkIjoKICAgICAgICByZXR1cm4gbDMudmFsdWU7CiAgICAgIGNhc2UgInJlamVjdGVkIjoKICAgICAgICB0aHJvdyBsMy5yZWFzb247CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgc3dpdGNoICh0eXBlb2YgbDMuc3RhdHVzID09ICJzdHJpbmciID8gbDMudGhlbihaLCBaKSA6IChuMiA9IGwzLCBuMi5zdGF0dXMgPSAicGVuZGluZyIsIG4yLnRoZW4oZnVuY3Rpb24oZSkgewogICAgICAgICAgaWYgKGwzLnN0YXR1cyA9PT0gInBlbmRpbmciKSB7CiAgICAgICAgICAgIHZhciB0ID0gbDM7CiAgICAgICAgICAgIHQuc3RhdHVzID0gImZ1bGZpbGxlZCIsIHQudmFsdWUgPSBlOwogICAgICAgICAgfQogICAgICAgIH0sIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIGlmIChsMy5zdGF0dXMgPT09ICJwZW5kaW5nIikgewogICAgICAgICAgICB2YXIgdCA9IGwzOwogICAgICAgICAgICB0LnN0YXR1cyA9ICJyZWplY3RlZCIsIHQucmVhc29uID0gZTsKICAgICAgICAgIH0KICAgICAgICB9KSksIGwzLnN0YXR1cykgewogICAgICAgICAgY2FzZSAiZnVsZmlsbGVkIjoKICAgICAgICAgICAgcmV0dXJuIGwzLnZhbHVlOwogICAgICAgICAgY2FzZSAicmVqZWN0ZWQiOgogICAgICAgICAgICB0aHJvdyBsMy5yZWFzb247CiAgICAgICAgfQogICAgICAgIHRocm93IFZsID0gbDMsIFYyOwogICAgfQogIH0KICB2YXIgVmwgPSBudWxsOwogIGZ1bmN0aW9uIGlpKCkgewogICAgaWYgKFZsID09PSBudWxsKSB0aHJvdyBFcnJvcihzKDQ1OSkpOwogICAgdmFyIG4yID0gVmw7CiAgICByZXR1cm4gVmwgPSBudWxsLCBuMjsKICB9CiAgZnVuY3Rpb24gc2EyKG4yLCBsMykgewogICAgcmV0dXJuIG4yID09PSBsMyAmJiAobjIgIT09IDAgfHwgMSAvIG4yID09PSAxIC8gbDMpIHx8IG4yICE9PSBuMiAmJiBsMyAhPT0gbDM7CiAgfQogIHZhciBnYTIgPSB0eXBlb2YgT2JqZWN0LmlzID09ICJmdW5jdGlvbiIgPyBPYmplY3QuaXMgOiBzYTIsIGhuID0gbnVsbCwgaWUgPSBudWxsLCBlZSA9IG51bGwsIHRlID0gbnVsbCwgS2wgPSBudWxsLCBfMiA9IG51bGwsIGZsID0gZmFsc2UsIGVpID0gZmFsc2UsIGJsID0gMCwgeWwgPSAwLCBUbCA9IC0xLCB0aSA9IDAsIEduID0gbnVsbCwgeW4gPSBudWxsLCBzaSA9IDA7CiAgZnVuY3Rpb24gYW4oKSB7CiAgICBpZiAoaG4gPT09IG51bGwpIHRocm93IEVycm9yKHMoMzIxKSk7CiAgICByZXR1cm4gaG47CiAgfQogIGZ1bmN0aW9uIGh0KCkgewogICAgaWYgKDAgPCBzaSkgdGhyb3cgRXJyb3IocygzMTIpKTsKICAgIHJldHVybiB7CiAgICAgIG1lbW9pemVkU3RhdGU6IG51bGwsCiAgICAgIHF1ZXVlOiBudWxsLAogICAgICBuZXh0OiBudWxsCiAgICB9OwogIH0KICBmdW5jdGlvbiByZSgpIHsKICAgIHJldHVybiBfMiA9PT0gbnVsbCA/IEtsID09PSBudWxsID8gKGZsID0gZmFsc2UsIEtsID0gXzIgPSBodCgpKSA6IChmbCA9IHRydWUsIF8yID0gS2wpIDogXzIubmV4dCA9PT0gbnVsbCA/IChmbCA9IGZhbHNlLCBfMiA9IF8yLm5leHQgPSBodCgpKSA6IChmbCA9IHRydWUsIF8yID0gXzIubmV4dCksIF8yOwogIH0KICBmdW5jdGlvbiBZbigpIHsKICAgIHZhciBuMiA9IEduOwogICAgcmV0dXJuIEduID0gbnVsbCwgbjI7CiAgfQogIGZ1bmN0aW9uIEVsKCkgewogICAgdGUgPSBlZSA9IGllID0gaG4gPSBudWxsLCBlaSA9IGZhbHNlLCBLbCA9IG51bGwsIHNpID0gMCwgXzIgPSB5biA9IG51bGw7CiAgfQogIGZ1bmN0aW9uIFp0KG4yLCBsMykgewogICAgcmV0dXJuIHR5cGVvZiBsMyA9PSAiZnVuY3Rpb24iID8gbDMobjIpIDogbDM7CiAgfQogIGZ1bmN0aW9uIGN0KG4yLCBsMywgaSkgewogICAgaWYgKGhuID0gYW4oKSwgXzIgPSByZSgpLCBmbCkgewogICAgICB2YXIgZSA9IF8yLnF1ZXVlOwogICAgICBpZiAobDMgPSBlLmRpc3BhdGNoLCB5biAhPT0gbnVsbCAmJiAoaSA9IHluLmdldChlKSwgaSAhPT0gdm9pZCAwKSkgewogICAgICAgIHluLmRlbGV0ZShlKSwgZSA9IF8yLm1lbW9pemVkU3RhdGU7CiAgICAgICAgZG8KICAgICAgICAgIGUgPSBuMihlLCBpLmFjdGlvbiksIGkgPSBpLm5leHQ7CiAgICAgICAgd2hpbGUgKGkgIT09IG51bGwpOwogICAgICAgIHJldHVybiBfMi5tZW1vaXplZFN0YXRlID0gZSwgWwogICAgICAgICAgZSwKICAgICAgICAgIGwzCiAgICAgICAgXTsKICAgICAgfQogICAgICByZXR1cm4gWwogICAgICAgIF8yLm1lbW9pemVkU3RhdGUsCiAgICAgICAgbDMKICAgICAgXTsKICAgIH0KICAgIHJldHVybiBuMiA9IG4yID09PSBadCA/IHR5cGVvZiBsMyA9PSAiZnVuY3Rpb24iID8gbDMoKSA6IGwzIDogaSAhPT0gdm9pZCAwID8gaShsMykgOiBsMywgXzIubWVtb2l6ZWRTdGF0ZSA9IG4yLCBuMiA9IF8yLnF1ZXVlID0gewogICAgICBsYXN0OiBudWxsLAogICAgICBkaXNwYXRjaDogbnVsbAogICAgfSwgbjIgPSBuMi5kaXNwYXRjaCA9IHZhMi5iaW5kKG51bGwsIGhuLCBuMiksIFsKICAgICAgXzIubWVtb2l6ZWRTdGF0ZSwKICAgICAgbjIKICAgIF07CiAgfQogIGZ1bmN0aW9uIGZ0KG4yLCBsMykgewogICAgaWYgKGhuID0gYW4oKSwgXzIgPSByZSgpLCBsMyA9IGwzID09PSB2b2lkIDAgPyBudWxsIDogbDMsIF8yICE9PSBudWxsKSB7CiAgICAgIHZhciBpID0gXzIubWVtb2l6ZWRTdGF0ZTsKICAgICAgaWYgKGkgIT09IG51bGwgJiYgbDMgIT09IG51bGwpIHsKICAgICAgICB2YXIgZSA9IGlbMV07CiAgICAgICAgbjogaWYgKGUgPT09IG51bGwpIGUgPSBmYWxzZTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5sZW5ndGggJiYgdCA8IGwzLmxlbmd0aDsgdCsrKSBpZiAoIWdhMihsM1t0XSwgZVt0XSkpIHsKICAgICAgICAgICAgZSA9IGZhbHNlOwogICAgICAgICAgICBicmVhayBuOwogICAgICAgICAgfQogICAgICAgICAgZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChlKSByZXR1cm4gaVswXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG4yID0gbjIoKSwgXzIubWVtb2l6ZWRTdGF0ZSA9IFsKICAgICAgbjIsCiAgICAgIGwzCiAgICBdLCBuMjsKICB9CiAgZnVuY3Rpb24gdmEyKG4yLCBsMywgaSkgewogICAgaWYgKDI1IDw9IHNpKSB0aHJvdyBFcnJvcihzKDMwMSkpOwogICAgaWYgKG4yID09PSBobikgaWYgKGVpID0gdHJ1ZSwgbjIgPSB7CiAgICAgIGFjdGlvbjogaSwKICAgICAgbmV4dDogbnVsbAogICAgfSwgeW4gPT09IG51bGwgJiYgKHluID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSksIGkgPSB5bi5nZXQobDMpLCBpID09PSB2b2lkIDApIHluLnNldChsMywgbjIpOwogICAgZWxzZSB7CiAgICAgIGZvciAobDMgPSBpOyBsMy5uZXh0ICE9PSBudWxsOyApIGwzID0gbDMubmV4dDsKICAgICAgbDMubmV4dCA9IG4yOwogICAgfQogIH0KICBmdW5jdGlvbiBiYSgpIHsKICAgIHRocm93IEVycm9yKHMoNDQwKSk7CiAgfQogIGZ1bmN0aW9uIHlhKCkgewogICAgdGhyb3cgRXJyb3IocygzOTQpKTsKICB9CiAgZnVuY3Rpb24gVGEoKSB7CiAgICB0aHJvdyBFcnJvcihzKDQ3OSkpOwogIH0KICBmdW5jdGlvbiBvdChuMiwgbDMsIGkpIHsKICAgIGFuKCk7CiAgICB2YXIgZSA9IHlsKyssIHQgPSBlZTsKICAgIGlmICh0eXBlb2YgbjIuJCRGT1JNX0FDVElPTiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgIHZhciByID0gbnVsbCwgYSA9IHRlOwogICAgICB0ID0gdC5mb3JtU3RhdGU7CiAgICAgIHZhciBjMiA9IG4yLiQkSVNfU0lHTkFUVVJFX0VRVUFMOwogICAgICBpZiAodCAhPT0gbnVsbCAmJiB0eXBlb2YgYzIgPT0gImZ1bmN0aW9uIikgewogICAgICAgIHZhciB1MiA9IHRbMV07CiAgICAgICAgYzIuY2FsbChuMiwgdFsyXSwgdFszXSkgJiYgKHIgPSBpICE9PSB2b2lkIDAgPyAicCIgKyBpIDogImsiICsgUWUyKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgIGEsCiAgICAgICAgICBudWxsLAogICAgICAgICAgZQogICAgICAgIF0pLCAwKSwgdTIgPT09IHIgJiYgKFRsID0gZSwgbDMgPSB0WzBdKSk7CiAgICAgIH0KICAgICAgdmFyIGggPSBuMi5iaW5kKG51bGwsIGwzKTsKICAgICAgcmV0dXJuIG4yID0gZnVuY3Rpb24obykgewogICAgICAgIGgobyk7CiAgICAgIH0sIHR5cGVvZiBoLiQkRk9STV9BQ1RJT04gPT0gImZ1bmN0aW9uIiAmJiAobjIuJCRGT1JNX0FDVElPTiA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICBvID0gaC4kJEZPUk1fQUNUSU9OKG8pLCBpICE9PSB2b2lkIDAgJiYgKGkgKz0gIiIsIG8uYWN0aW9uID0gaSk7CiAgICAgICAgdmFyIGQzID0gby5kYXRhOwogICAgICAgIHJldHVybiBkMyAmJiAociA9PT0gbnVsbCAmJiAociA9IGkgIT09IHZvaWQgMCA/ICJwIiArIGkgOiAiayIgKyBRZTIoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgYSwKICAgICAgICAgIG51bGwsCiAgICAgICAgICBlCiAgICAgICAgXSksIDApKSwgZDMuYXBwZW5kKCIkQUNUSU9OX0tFWSIsIHIpKSwgbzsKICAgICAgfSksIFsKICAgICAgICBsMywKICAgICAgICBuMiwKICAgICAgICBmYWxzZQogICAgICBdOwogICAgfQogICAgdmFyIGYyID0gbjIuYmluZChudWxsLCBsMyk7CiAgICByZXR1cm4gWwogICAgICBsMywKICAgICAgZnVuY3Rpb24obykgewogICAgICAgIGYyKG8pOwogICAgICB9LAogICAgICBmYWxzZQogICAgXTsKICB9CiAgZnVuY3Rpb24gSnQobjIpIHsKICAgIHZhciBsMyA9IHRpOwogICAgcmV0dXJuIHRpICs9IDEsIEduID09PSBudWxsICYmIChHbiA9IFtdKSwgZGEyKEduLCBuMiwgbDMpOwogIH0KICBmdW5jdGlvbiBFYSgpIHsKICAgIHRocm93IEVycm9yKHMoMzkzKSk7CiAgfQogIHZhciBkdCA9IHsKICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbihuMikgewogICAgICByZXR1cm4gbjIuX2N1cnJlbnRWYWx1ZTI7CiAgICB9LAogICAgdXNlOiBmdW5jdGlvbihuMikgewogICAgICBpZiAobjIgIT09IG51bGwgJiYgdHlwZW9mIG4yID09ICJvYmplY3QiKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuMi50aGVuID09ICJmdW5jdGlvbiIpIHJldHVybiBKdChuMik7CiAgICAgICAgaWYgKG4yLiQkdHlwZW9mID09PSBjaSkgcmV0dXJuIG4yLl9jdXJyZW50VmFsdWUyOwogICAgICB9CiAgICAgIHRocm93IEVycm9yKHMoNDM4LCBTdHJpbmcobjIpKSk7CiAgICB9LAogICAgdXNlQ29udGV4dDogZnVuY3Rpb24objIpIHsKICAgICAgcmV0dXJuIGFuKCksIG4yLl9jdXJyZW50VmFsdWUyOwogICAgfSwKICAgIHVzZU1lbW86IGZ0LAogICAgdXNlUmVkdWNlcjogY3QsCiAgICB1c2VSZWY6IGZ1bmN0aW9uKG4yKSB7CiAgICAgIGhuID0gYW4oKSwgXzIgPSByZSgpOwogICAgICB2YXIgbDMgPSBfMi5tZW1vaXplZFN0YXRlOwogICAgICByZXR1cm4gbDMgPT09IG51bGwgPyAobjIgPSB7CiAgICAgICAgY3VycmVudDogbjIKICAgICAgfSwgXzIubWVtb2l6ZWRTdGF0ZSA9IG4yKSA6IGwzOwogICAgfSwKICAgIHVzZVN0YXRlOiBmdW5jdGlvbihuMikgewogICAgICByZXR1cm4gY3QoWnQsIG4yKTsKICAgIH0sCiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IFosCiAgICB1c2VMYXlvdXRFZmZlY3Q6IFosCiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24objIsIGwzKSB7CiAgICAgIHJldHVybiBmdChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gbjI7CiAgICAgIH0sIGwzKTsKICAgIH0sCiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBaLAogICAgdXNlRWZmZWN0OiBaLAogICAgdXNlRGVidWdWYWx1ZTogWiwKICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uKG4yLCBsMykgewogICAgICByZXR1cm4gYW4oKSwgbDMgIT09IHZvaWQgMCA/IGwzIDogbjI7CiAgICB9LAogICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBhbigpLCBbCiAgICAgICAgZmFsc2UsCiAgICAgICAgeWEKICAgICAgXTsKICAgIH0sCiAgICB1c2VJZDogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBuMiA9IGllLnRyZWVDb250ZXh0LCBsMyA9IG4yLm92ZXJmbG93OwogICAgICBuMiA9IG4yLmlkLCBuMiA9IChuMiAmIH4oMSA8PCAzMiAtIFFsKG4yKSAtIDEpKS50b1N0cmluZygzMikgKyBsMzsKICAgICAgdmFyIGkgPSBtbDsKICAgICAgaWYgKGkgPT09IG51bGwpIHRocm93IEVycm9yKHMoNDA0KSk7CiAgICAgIHJldHVybiBsMyA9IGJsKyssIG4yID0gIl8iICsgaS5pZFByZWZpeCArICJSXyIgKyBuMiwgMCA8IGwzICYmIChuMiArPSAiSCIgKyBsMy50b1N0cmluZygzMikpLCBuMiArICJfIjsKICAgIH0sCiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24objIsIGwzLCBpKSB7CiAgICAgIGlmIChpID09PSB2b2lkIDApIHRocm93IEVycm9yKHMoNDA3KSk7CiAgICAgIHJldHVybiBpKCk7CiAgICB9LAogICAgdXNlT3B0aW1pc3RpYzogZnVuY3Rpb24objIpIHsKICAgICAgcmV0dXJuIGFuKCksIFsKICAgICAgICBuMiwKICAgICAgICBUYQogICAgICBdOwogICAgfSwKICAgIHVzZUFjdGlvblN0YXRlOiBvdCwKICAgIHVzZUZvcm1TdGF0ZTogb3QsCiAgICB1c2VIb3N0VHJhbnNpdGlvblN0YXR1czogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBhbigpLCBrcjsKICAgIH0sCiAgICB1c2VNZW1vQ2FjaGU6IGZ1bmN0aW9uKG4yKSB7CiAgICAgIGZvciAodmFyIGwzID0gQXJyYXkobjIpLCBpID0gMDsgaSA8IG4yOyBpKyspIGwzW2ldID0gQ3I7CiAgICAgIHJldHVybiBsMzsKICAgIH0sCiAgICB1c2VDYWNoZVJlZnJlc2g6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gRWE7CiAgICB9LAogICAgdXNlRWZmZWN0RXZlbnQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYmE7CiAgICB9CiAgfSwgbWwgPSBudWxsLCB4YSA9IHsKICAgIGdldENhY2hlRm9yVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IEVycm9yKHMoMjQ4KSk7CiAgICB9LAogICAgY2FjaGVTaWduYWw6IGZ1bmN0aW9uKCkgewogICAgICB0aHJvdyBFcnJvcihzKDI0OCkpOwogICAgfQogIH0sIERpLCBzdDsKICBmdW5jdGlvbiBVbihuMikgewogICAgaWYgKERpID09PSB2b2lkIDApIHRyeSB7CiAgICAgIHRocm93IEVycm9yKCk7CiAgICB9IGNhdGNoIChpKSB7CiAgICAgIHZhciBsMyA9IGkuc3RhY2sudHJpbSgpLm1hdGNoKC9cbiggKihhdCApPykvKTsKICAgICAgRGkgPSBsMyAmJiBsM1sxXSB8fCAiIiwgc3QgPSAtMSA8IGkuc3RhY2suaW5kZXhPZihgCiAgICBhdGApID8gIiAoPGFub255bW91cz4pIiA6IC0xIDwgaS5zdGFjay5pbmRleE9mKCJAIikgPyAiQHVua25vd246MDowIiA6ICIiOwogICAgfQogICAgcmV0dXJuIGAKYCArIERpICsgbjIgKyBzdDsKICB9CiAgdmFyIE5pID0gZmFsc2U7CiAgZnVuY3Rpb24gR2wobjIsIGwzKSB7CiAgICBpZiAoIW4yIHx8IE5pKSByZXR1cm4gIiI7CiAgICBOaSA9IHRydWU7CiAgICB2YXIgaSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOwogICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB2b2lkIDA7CiAgICB0cnkgewogICAgICB2YXIgZSA9IHsKICAgICAgICBEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3Q6IGZ1bmN0aW9uKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKGwzKSB7CiAgICAgICAgICAgICAgdmFyIG8gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KG8ucHJvdG90eXBlLCAicHJvcHMiLCB7CiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pLCB0eXBlb2YgUmVmbGVjdCA9PSAib2JqZWN0IiAmJiBSZWZsZWN0LmNvbnN0cnVjdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QobywgW10pOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZykgewogICAgICAgICAgICAgICAgICB2YXIgZDMgPSBnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QobjIsIFtdLCBvKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgby5jYWxsKCk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChnKSB7CiAgICAgICAgICAgICAgICAgIGQzID0gZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG4yLmNhbGwoby5wcm90b3R5cGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTsKICAgICAgICAgICAgICB9IGNhdGNoIChnKSB7CiAgICAgICAgICAgICAgICBkMyA9IGc7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIChvID0gbjIoKSkgJiYgdHlwZW9mIG8uY2F0Y2ggPT0gImZ1bmN0aW9uIiAmJiBvLmNhdGNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChnKSB7CiAgICAgICAgICAgIGlmIChnICYmIGQzICYmIHR5cGVvZiBnLnN0YWNrID09ICJzdHJpbmciKSByZXR1cm4gWwogICAgICAgICAgICAgIGcuc3RhY2ssCiAgICAgICAgICAgICAgZDMuc3RhY2sKICAgICAgICAgICAgXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIG51bGwKICAgICAgICAgIF07CiAgICAgICAgfQogICAgICB9OwogICAgICBlLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdC5kaXNwbGF5TmFtZSA9ICJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QiOwogICAgICB2YXIgdCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QsICJuYW1lIik7CiAgICAgIHQgJiYgdC5jb25maWd1cmFibGUgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LCAibmFtZSIsIHsKICAgICAgICB2YWx1ZTogIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCIKICAgICAgfSk7CiAgICAgIHZhciByID0gZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QoKSwgYSA9IHJbMF0sIGMyID0gclsxXTsKICAgICAgaWYgKGEgJiYgYzIpIHsKICAgICAgICB2YXIgdTIgPSBhLnNwbGl0KGAKYCksIGggPSBjMi5zcGxpdChgCmApOwogICAgICAgIGZvciAodCA9IGUgPSAwOyBlIDwgdTIubGVuZ3RoICYmICF1MltlXS5pbmNsdWRlcygiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290Iik7ICkgZSsrOwogICAgICAgIGZvciAoOyB0IDwgaC5sZW5ndGggJiYgIWhbdF0uaW5jbHVkZXMoIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCIpOyApIHQrKzsKICAgICAgICBpZiAoZSA9PT0gdTIubGVuZ3RoIHx8IHQgPT09IGgubGVuZ3RoKSBmb3IgKGUgPSB1Mi5sZW5ndGggLSAxLCB0ID0gaC5sZW5ndGggLSAxOyAxIDw9IGUgJiYgMCA8PSB0ICYmIHUyW2VdICE9PSBoW3RdOyApIHQtLTsKICAgICAgICBmb3IgKDsgMSA8PSBlICYmIDAgPD0gdDsgZS0tLCB0LS0pIGlmICh1MltlXSAhPT0gaFt0XSkgewogICAgICAgICAgaWYgKGUgIT09IDEgfHwgdCAhPT0gMSkgZG8KICAgICAgICAgICAgaWYgKGUtLSwgdC0tLCAwID4gdCB8fCB1MltlXSAhPT0gaFt0XSkgewogICAgICAgICAgICAgIHZhciBmMiA9IGAKYCArIHUyW2VdLnJlcGxhY2UoIiBhdCBuZXcgIiwgIiBhdCAiKTsKICAgICAgICAgICAgICByZXR1cm4gbjIuZGlzcGxheU5hbWUgJiYgZjIuaW5jbHVkZXMoIjxhbm9ueW1vdXM+IikgJiYgKGYyID0gZjIucmVwbGFjZSgiPGFub255bW91cz4iLCBuMi5kaXNwbGF5TmFtZSkpLCBmMjsKICAgICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKDEgPD0gZSAmJiAwIDw9IHQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9IGZpbmFsbHkgewogICAgICBOaSA9IGZhbHNlLCBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IGk7CiAgICB9CiAgICByZXR1cm4gKGkgPSBuMiA/IG4yLmRpc3BsYXlOYW1lIHx8IG4yLm5hbWUgOiAiIikgPyBVbihpKSA6ICIiOwogIH0KICBmdW5jdGlvbiBRdChuMikgewogICAgaWYgKHR5cGVvZiBuMiA9PSAic3RyaW5nIikgcmV0dXJuIFVuKG4yKTsKICAgIGlmICh0eXBlb2YgbjIgPT0gImZ1bmN0aW9uIikgcmV0dXJuIG4yLnByb3RvdHlwZSAmJiBuMi5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA/IEdsKG4yLCB0cnVlKSA6IEdsKG4yLCBmYWxzZSk7CiAgICBpZiAodHlwZW9mIG4yID09ICJvYmplY3QiICYmIG4yICE9PSBudWxsKSB7CiAgICAgIHN3aXRjaCAobjIuJCR0eXBlb2YpIHsKICAgICAgICBjYXNlIHBpOgogICAgICAgICAgcmV0dXJuIEdsKG4yLnJlbmRlciwgZmFsc2UpOwogICAgICAgIGNhc2Ugamk6CiAgICAgICAgICByZXR1cm4gR2wobjIudHlwZSwgZmFsc2UpOwogICAgICAgIGNhc2Ugb2k6CiAgICAgICAgICB2YXIgbDMgPSBuMiwgaSA9IGwzLl9wYXlsb2FkOwogICAgICAgICAgbDMgPSBsMy5faW5pdDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIG4yID0gbDMoaSk7CiAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgcmV0dXJuIFVuKCJMYXp5Iik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gUXQobjIpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgbjIubmFtZSA9PSAic3RyaW5nIikgewogICAgICAgIG46IHsKICAgICAgICAgIGkgPSBuMi5uYW1lLCBsMyA9IG4yLmVudjsKICAgICAgICAgIHZhciBlID0gbjIuZGVidWdMb2NhdGlvbjsKICAgICAgICAgIGlmIChlICE9IG51bGwgJiYgKG4yID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UsIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdm9pZCAwLCBlID0gZS5zdGFjaywgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBuMiwgZS5zdGFydHNXaXRoKGBFcnJvcjogcmVhY3Qtc3RhY2stdG9wLWZyYW1lCmApICYmIChlID0gZS5zbGljZSgyOSkpLCBuMiA9IGUuaW5kZXhPZihgCmApLCBuMiAhPT0gLTEgJiYgKGUgPSBlLnNsaWNlKG4yICsgMSkpLCBuMiA9IGUuaW5kZXhPZigicmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lIiksIG4yICE9PSAtMSAmJiAobjIgPSBlLmxhc3RJbmRleE9mKGAKYCwgbjIpKSwgbjIgPSBuMiAhPT0gLTEgPyBlID0gZS5zbGljZSgwLCBuMikgOiAiIiwgZSA9IG4yLmxhc3RJbmRleE9mKGAKYCksIG4yID0gZSA9PT0gLTEgPyBuMiA6IG4yLnNsaWNlKGUgKyAxKSwgbjIuaW5kZXhPZihpKSAhPT0gLTEpKSB7CiAgICAgICAgICAgIGkgPSBgCmAgKyBuMjsKICAgICAgICAgICAgYnJlYWsgbjsKICAgICAgICAgIH0KICAgICAgICAgIGkgPSBVbihpICsgKGwzID8gIiBbIiArIGwzICsgIl0iIDogIiIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0KICAgIH0KICAgIHN3aXRjaCAobjIpIHsKICAgICAgY2FzZSBxaTI6CiAgICAgICAgcmV0dXJuIFVuKCJTdXNwZW5zZUxpc3QiKTsKICAgICAgY2FzZSBmaToKICAgICAgICByZXR1cm4gVW4oIlN1c3BlbnNlIik7CiAgICB9CiAgICByZXR1cm4gIiI7CiAgfQogIGZ1bmN0aW9uIEpuKG4yLCBsMykgewogICAgcmV0dXJuICg1MDAgPCBsMy5ieXRlU2l6ZSB8fCBmYWxzZSkgJiYgbDMuY29udGVudFByZWFtYmxlID09PSBudWxsOwogIH0KICBmdW5jdGlvbiBSYShuMikgewogICAgaWYgKHR5cGVvZiBuMiA9PSAib2JqZWN0IiAmJiBuMiAhPT0gbnVsbCAmJiB0eXBlb2YgbjIuZW52aXJvbm1lbnROYW1lID09ICJzdHJpbmciKSB7CiAgICAgIHZhciBsMyA9IG4yLmVudmlyb25tZW50TmFtZTsKICAgICAgbjIgPSBbCiAgICAgICAgbjIKICAgICAgXS5zbGljZSgwKSwgdHlwZW9mIG4yWzBdID09ICJzdHJpbmciID8gbjIuc3BsaWNlKDAsIDEsICJbJXNdICIgKyBuMlswXSwgIiAiICsgbDMgKyAiICIpIDogbjIuc3BsaWNlKDAsIDAsICJbJXNdIiwgIiAiICsgbDMgKyAiICIpLCBuMi51bnNoaWZ0KGNvbnNvbGUpLCBsMyA9IGFhLmFwcGx5KGNvbnNvbGUuZXJyb3IsIG4yKSwgbDMoKTsKICAgIH0gZWxzZSBjb25zb2xlLmVycm9yKG4yKTsKICAgIHJldHVybiBudWxsOwogIH0KICBmdW5jdGlvbiB3YShuMiwgbDMsIGksIGUsIHQsIHIsIGEsIGMyLCB1MiwgaCwgZjIpIHsKICAgIHZhciBvID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgIHRoaXMuZGVzdGluYXRpb24gPSBudWxsLCB0aGlzLmZsdXNoU2NoZWR1bGVkID0gZmFsc2UsIHRoaXMucmVzdW1hYmxlU3RhdGUgPSBuMiwgdGhpcy5yZW5kZXJTdGF0ZSA9IGwzLCB0aGlzLnJvb3RGb3JtYXRDb250ZXh0ID0gaSwgdGhpcy5wcm9ncmVzc2l2ZUNodW5rU2l6ZSA9IGUgPT09IHZvaWQgMCA/IDEyODAwIDogZSwgdGhpcy5zdGF0dXMgPSAxMCwgdGhpcy5mYXRhbEVycm9yID0gbnVsbCwgdGhpcy5wZW5kaW5nUm9vdFRhc2tzID0gdGhpcy5hbGxQZW5kaW5nVGFza3MgPSB0aGlzLm5leHRTZWdtZW50SWQgPSAwLCB0aGlzLmNvbXBsZXRlZFByZWFtYmxlU2VnbWVudHMgPSB0aGlzLmNvbXBsZXRlZFJvb3RTZWdtZW50ID0gbnVsbCwgdGhpcy5ieXRlU2l6ZSA9IDAsIHRoaXMuYWJvcnRhYmxlVGFza3MgPSBvLCB0aGlzLnBpbmdlZFRhc2tzID0gW10sIHRoaXMuY2xpZW50UmVuZGVyZWRCb3VuZGFyaWVzID0gW10sIHRoaXMuY29tcGxldGVkQm91bmRhcmllcyA9IFtdLCB0aGlzLnBhcnRpYWxCb3VuZGFyaWVzID0gW10sIHRoaXMudHJhY2tlZFBvc3Rwb25lcyA9IG51bGwsIHRoaXMub25FcnJvciA9IHQgPT09IHZvaWQgMCA/IFJhIDogdCwgdGhpcy5vblBvc3Rwb25lID0gaCA9PT0gdm9pZCAwID8gWiA6IGgsIHRoaXMub25BbGxSZWFkeSA9IHIgPT09IHZvaWQgMCA/IFogOiByLCB0aGlzLm9uU2hlbGxSZWFkeSA9IGEgPT09IHZvaWQgMCA/IFogOiBhLCB0aGlzLm9uU2hlbGxFcnJvciA9IGMyID09PSB2b2lkIDAgPyBaIDogYzIsIHRoaXMub25GYXRhbEVycm9yID0gdTIgPT09IHZvaWQgMCA/IFogOiB1MiwgdGhpcy5mb3JtU3RhdGUgPSBmMiA9PT0gdm9pZCAwID8gbnVsbCA6IGYyOwogIH0KICBmdW5jdGlvbiBDYShuMiwgbDMsIGksIGUsIHQsIHIsIGEsIGMyLCB1MiwgaCwgZjIsIG8pIHsKICAgIHJldHVybiBsMyA9IG5ldyB3YShsMywgaSwgZSwgdCwgciwgYSwgYzIsIHUyLCBoLCBmMiwgbyksIGkgPSBTbihsMywgMCwgbnVsbCwgZSwgZmFsc2UsIGZhbHNlKSwgaS5wYXJlbnRGbHVzaGVkID0gdHJ1ZSwgbjIgPSByaShsMywgbnVsbCwgbjIsIC0xLCBudWxsLCBpLCBudWxsLCBudWxsLCBsMy5hYm9ydGFibGVUYXNrcywgbnVsbCwgZSwgbnVsbCwgaGEyLCBudWxsLCBudWxsKSwgeGwobjIpLCBsMy5waW5nZWRUYXNrcy5wdXNoKG4yKSwgbDM7CiAgfQogIHZhciB6MyA9IG51bGw7CiAgZnVuY3Rpb24gVnQobjIsIGwzKSB7CiAgICBuMi5waW5nZWRUYXNrcy5wdXNoKGwzKSwgbjIucGluZ2VkVGFza3MubGVuZ3RoID09PSAxICYmIChuMi5mbHVzaFNjaGVkdWxlZCA9IG4yLmRlc3RpbmF0aW9uICE9PSBudWxsLCBwdChuMikpOwogIH0KICBmdW5jdGlvbiBhZTIobjIsIGwzLCBpLCBlLCB0KSB7CiAgICByZXR1cm4gaSA9IHsKICAgICAgc3RhdHVzOiAwLAogICAgICByb290U2VnbWVudElEOiAtMSwKICAgICAgcGFyZW50Rmx1c2hlZDogZmFsc2UsCiAgICAgIHBlbmRpbmdUYXNrczogMCwKICAgICAgcm93OiBsMywKICAgICAgY29tcGxldGVkU2VnbWVudHM6IFtdLAogICAgICBieXRlU2l6ZTogMCwKICAgICAgZmFsbGJhY2tBYm9ydGFibGVUYXNrczogaSwKICAgICAgZXJyb3JEaWdlc3Q6IG51bGwsCiAgICAgIGNvbnRlbnRTdGF0ZTogWWkoKSwKICAgICAgZmFsbGJhY2tTdGF0ZTogWWkoKSwKICAgICAgY29udGVudFByZWFtYmxlOiBlLAogICAgICBmYWxsYmFja1ByZWFtYmxlOiB0LAogICAgICB0cmFja2VkQ29udGVudEtleVBhdGg6IG51bGwsCiAgICAgIHRyYWNrZWRGYWxsYmFja05vZGU6IG51bGwKICAgIH0sIGwzICE9PSBudWxsICYmIChsMy5wZW5kaW5nVGFza3MrKywgZSA9IGwzLmJvdW5kYXJpZXMsIGUgIT09IG51bGwgJiYgKG4yLmFsbFBlbmRpbmdUYXNrcysrLCBpLnBlbmRpbmdUYXNrcysrLCBlLnB1c2goaSkpLCBuMiA9IGwzLmluaGVyaXRlZEhvaXN0YWJsZXMsIG4yICE9PSBudWxsICYmIFpuKGkuY29udGVudFN0YXRlLCBuMikpLCBpOwogIH0KICBmdW5jdGlvbiByaShuMiwgbDMsIGksIGUsIHQsIHIsIGEsIGMyLCB1MiwgaCwgZjIsIG8sIGQzLCBnLCBFNCkgewogICAgbjIuYWxsUGVuZGluZ1Rhc2tzKyssIHQgPT09IG51bGwgPyBuMi5wZW5kaW5nUm9vdFRhc2tzKysgOiB0LnBlbmRpbmdUYXNrcysrLCBnICE9PSBudWxsICYmIGcucGVuZGluZ1Rhc2tzKys7CiAgICB2YXIgeTIgPSB7CiAgICAgIHJlcGxheTogbnVsbCwKICAgICAgbm9kZTogaSwKICAgICAgY2hpbGRJbmRleDogZSwKICAgICAgcGluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIFZ0KG4yLCB5Mik7CiAgICAgIH0sCiAgICAgIGJsb2NrZWRCb3VuZGFyeTogdCwKICAgICAgYmxvY2tlZFNlZ21lbnQ6IHIsCiAgICAgIGJsb2NrZWRQcmVhbWJsZTogYSwKICAgICAgaG9pc3RhYmxlU3RhdGU6IGMyLAogICAgICBhYm9ydFNldDogdTIsCiAgICAgIGtleVBhdGg6IGgsCiAgICAgIGZvcm1hdENvbnRleHQ6IGYyLAogICAgICBjb250ZXh0OiBvLAogICAgICB0cmVlQ29udGV4dDogZDMsCiAgICAgIHJvdzogZywKICAgICAgY29tcG9uZW50U3RhY2s6IEU0LAogICAgICB0aGVuYWJsZVN0YXRlOiBsMwogICAgfTsKICAgIHJldHVybiB1Mi5hZGQoeTIpLCB5MjsKICB9CiAgZnVuY3Rpb24gS3QobjIsIGwzLCBpLCBlLCB0LCByLCBhLCBjMiwgdTIsIGgsIGYyLCBvLCBkMywgZykgewogICAgbjIuYWxsUGVuZGluZ1Rhc2tzKyssIHIgPT09IG51bGwgPyBuMi5wZW5kaW5nUm9vdFRhc2tzKysgOiByLnBlbmRpbmdUYXNrcysrLCBkMyAhPT0gbnVsbCAmJiBkMy5wZW5kaW5nVGFza3MrKywgaS5wZW5kaW5nVGFza3MrKzsKICAgIHZhciBFNCA9IHsKICAgICAgcmVwbGF5OiBpLAogICAgICBub2RlOiBlLAogICAgICBjaGlsZEluZGV4OiB0LAogICAgICBwaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gVnQobjIsIEU0KTsKICAgICAgfSwKICAgICAgYmxvY2tlZEJvdW5kYXJ5OiByLAogICAgICBibG9ja2VkU2VnbWVudDogbnVsbCwKICAgICAgYmxvY2tlZFByZWFtYmxlOiBudWxsLAogICAgICBob2lzdGFibGVTdGF0ZTogYSwKICAgICAgYWJvcnRTZXQ6IGMyLAogICAgICBrZXlQYXRoOiB1MiwKICAgICAgZm9ybWF0Q29udGV4dDogaCwKICAgICAgY29udGV4dDogZjIsCiAgICAgIHRyZWVDb250ZXh0OiBvLAogICAgICByb3c6IGQzLAogICAgICBjb21wb25lbnRTdGFjazogZywKICAgICAgdGhlbmFibGVTdGF0ZTogbDMKICAgIH07CiAgICByZXR1cm4gYzIuYWRkKEU0KSwgRTQ7CiAgfQogIGZ1bmN0aW9uIFNuKG4yLCBsMywgaSwgZSwgdCwgcikgewogICAgcmV0dXJuIHsKICAgICAgc3RhdHVzOiAwLAogICAgICBwYXJlbnRGbHVzaGVkOiBmYWxzZSwKICAgICAgaWQ6IC0xLAogICAgICBpbmRleDogbDMsCiAgICAgIGNodW5rczogW10sCiAgICAgIGNoaWxkcmVuOiBbXSwKICAgICAgcHJlYW1ibGVDaGlsZHJlbjogW10sCiAgICAgIHBhcmVudEZvcm1hdENvbnRleHQ6IGUsCiAgICAgIGJvdW5kYXJ5OiBpLAogICAgICBsYXN0UHVzaGVkVGV4dDogdCwKICAgICAgdGV4dEVtYmVkZGVkOiByCiAgICB9OwogIH0KICBmdW5jdGlvbiB4bChuMikgewogICAgdmFyIGwzID0gbjIubm9kZTsKICAgIHR5cGVvZiBsMyA9PSAib2JqZWN0IiAmJiBsMyAhPT0gbnVsbCAmJiBsMy4kJHR5cGVvZiA9PT0gUnQgJiYgKG4yLmNvbXBvbmVudFN0YWNrID0gewogICAgICBwYXJlbnQ6IG4yLmNvbXBvbmVudFN0YWNrLAogICAgICB0eXBlOiBsMy50eXBlCiAgICB9KTsKICB9CiAgZnVuY3Rpb24gWmkobjIpIHsKICAgIHJldHVybiBuMiA9PT0gbnVsbCA/IG51bGwgOiB7CiAgICAgIHBhcmVudDogbjIucGFyZW50LAogICAgICB0eXBlOiAiU3VzcGVuc2UgRmFsbGJhY2siCiAgICB9OwogIH0KICBmdW5jdGlvbiBUbihuMikgewogICAgdmFyIGwzID0ge307CiAgICByZXR1cm4gbjIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KGwzLCAiY29tcG9uZW50U3RhY2siLCB7CiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIGkgPSAiIiwgZSA9IG4yOwogICAgICAgICAgZG8KICAgICAgICAgICAgaSArPSBRdChlLnR5cGUpLCBlID0gZS5wYXJlbnQ7CiAgICAgICAgICB3aGlsZSAoZSk7CiAgICAgICAgICB2YXIgdCA9IGk7CiAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgdCA9IGAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCArIHIubWVzc2FnZSArIGAKYCArIHIuc3RhY2s7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkobDMsICJjb21wb25lbnRTdGFjayIsIHsKICAgICAgICAgIHZhbHVlOiB0CiAgICAgICAgfSksIHQ7CiAgICAgIH0KICAgIH0pLCBsMzsKICB9CiAgZnVuY3Rpb24gRzMobjIsIGwzLCBpKSB7CiAgICBpZiAobjIgPSBuMi5vbkVycm9yLCBsMyA9IG4yKGwzLCBpKSwgbDMgPT0gbnVsbCB8fCB0eXBlb2YgbDMgPT0gInN0cmluZyIpIHJldHVybiBsMzsKICB9CiAgZnVuY3Rpb24gUmwobjIsIGwzKSB7CiAgICB2YXIgaSA9IG4yLm9uU2hlbGxFcnJvciwgZSA9IG4yLm9uRmF0YWxFcnJvcjsKICAgIGkobDMpLCBlKGwzKSwgbjIuZGVzdGluYXRpb24gIT09IG51bGwgPyAobjIuc3RhdHVzID0gMTQsIG4yLmRlc3RpbmF0aW9uLmRlc3Ryb3kobDMpKSA6IChuMi5zdGF0dXMgPSAxMywgbjIuZmF0YWxFcnJvciA9IGwzKTsKICB9CiAgZnVuY3Rpb24gWChuMiwgbDMpIHsKICAgIHVlKG4yLCBsMy5uZXh0LCBsMy5ob2lzdGFibGVzKTsKICB9CiAgZnVuY3Rpb24gdWUobjIsIGwzLCBpKSB7CiAgICBmb3IgKDsgbDMgIT09IG51bGw7ICkgewogICAgICBpICE9PSBudWxsICYmIChabihsMy5ob2lzdGFibGVzLCBpKSwgbDMuaW5oZXJpdGVkSG9pc3RhYmxlcyA9IGkpOwogICAgICB2YXIgZSA9IGwzLmJvdW5kYXJpZXM7CiAgICAgIGlmIChlICE9PSBudWxsKSB7CiAgICAgICAgbDMuYm91bmRhcmllcyA9IG51bGw7CiAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBlLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICB2YXIgciA9IGVbdF07CiAgICAgICAgICBpICE9PSBudWxsICYmIFpuKHIuY29udGVudFN0YXRlLCBpKSwgRW4objIsIHIsIG51bGwsIG51bGwpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobDMucGVuZGluZ1Rhc2tzLS0sIDAgPCBsMy5wZW5kaW5nVGFza3MpIGJyZWFrOwogICAgICBpID0gbDMuaG9pc3RhYmxlcywgbDMgPSBsMy5uZXh0OwogICAgfQogIH0KICBmdW5jdGlvbiBKaShuMiwgbDMpIHsKICAgIHZhciBpID0gbDMuYm91bmRhcmllczsKICAgIGlmIChpICE9PSBudWxsICYmIGwzLnBlbmRpbmdUYXNrcyA9PT0gaS5sZW5ndGgpIHsKICAgICAgZm9yICh2YXIgZSA9IHRydWUsIHQgPSAwOyB0IDwgaS5sZW5ndGg7IHQrKykgewogICAgICAgIHZhciByID0gaVt0XTsKICAgICAgICBpZiAoci5wZW5kaW5nVGFza3MgIT09IDEgfHwgci5wYXJlbnRGbHVzaGVkIHx8IEpuKG4yLCByKSkgewogICAgICAgICAgZSA9IGZhbHNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGUgJiYgdWUobjIsIGwzLCBsMy5ob2lzdGFibGVzKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gb2wobjIpIHsKICAgIHZhciBsMyA9IHsKICAgICAgcGVuZGluZ1Rhc2tzOiAxLAogICAgICBib3VuZGFyaWVzOiBudWxsLAogICAgICBob2lzdGFibGVzOiBZaSgpLAogICAgICBpbmhlcml0ZWRIb2lzdGFibGVzOiBudWxsLAogICAgICB0b2dldGhlcjogZmFsc2UsCiAgICAgIG5leHQ6IG51bGwKICAgIH07CiAgICByZXR1cm4gbjIgIT09IG51bGwgJiYgMCA8IG4yLnBlbmRpbmdUYXNrcyAmJiAobDMucGVuZGluZ1Rhc2tzKyssIGwzLmJvdW5kYXJpZXMgPSBbXSwgbjIubmV4dCA9IGwzKSwgbDM7CiAgfQogIGZ1bmN0aW9uIGd0KG4yLCBsMywgaSwgZSwgdCkgewogICAgdmFyIHIgPSBsMy5rZXlQYXRoLCBhID0gbDMudHJlZUNvbnRleHQsIGMyID0gbDMucm93OwogICAgbDMua2V5UGF0aCA9IGksIGkgPSBlLmxlbmd0aDsKICAgIHZhciB1MiA9IG51bGw7CiAgICBpZiAobDMucmVwbGF5ICE9PSBudWxsKSB7CiAgICAgIHZhciBoID0gbDMucmVwbGF5LnNsb3RzOwogICAgICBpZiAoaCAhPT0gbnVsbCAmJiB0eXBlb2YgaCA9PSAib2JqZWN0IikgZm9yICh2YXIgZjIgPSAwOyBmMiA8IGk7IGYyKyspIHsKICAgICAgICB2YXIgbyA9IHQgIT09ICJiYWNrd2FyZHMiICYmIHQgIT09ICJ1bnN0YWJsZV9sZWdhY3ktYmFja3dhcmRzIiA/IGYyIDogaSAtIDEgLSBmMiwgZDMgPSBlW29dOwogICAgICAgIGwzLnJvdyA9IHUyID0gb2wodTIpLCBsMy50cmVlQ29udGV4dCA9IE1uKGEsIGksIG8pOwogICAgICAgIHZhciBnID0gaFtvXTsKICAgICAgICB0eXBlb2YgZyA9PSAibnVtYmVyIiA/IChnaShuMiwgbDMsIGcsIGQzLCBvKSwgZGVsZXRlIGhbb10pIDogTDIobjIsIGwzLCBkMywgbyksIC0tdTIucGVuZGluZ1Rhc2tzID09PSAwICYmIFgobjIsIHUyKTsKICAgICAgfQogICAgICBlbHNlIGZvciAoaCA9IDA7IGggPCBpOyBoKyspIGYyID0gdCAhPT0gImJhY2t3YXJkcyIgJiYgdCAhPT0gInVuc3RhYmxlX2xlZ2FjeS1iYWNrd2FyZHMiID8gaCA6IGkgLSAxIC0gaCwgbyA9IGVbZjJdLCBsMy5yb3cgPSB1MiA9IG9sKHUyKSwgbDMudHJlZUNvbnRleHQgPSBNbihhLCBpLCBmMiksIEwyKG4yLCBsMywgbywgZjIpLCAtLXUyLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBYKG4yLCB1Mik7CiAgICB9IGVsc2UgaWYgKHQgIT09ICJiYWNrd2FyZHMiICYmIHQgIT09ICJ1bnN0YWJsZV9sZWdhY3ktYmFja3dhcmRzIikgZm9yICh0ID0gMDsgdCA8IGk7IHQrKykgaCA9IGVbdF0sIGwzLnJvdyA9IHUyID0gb2wodTIpLCBsMy50cmVlQ29udGV4dCA9IE1uKGEsIGksIHQpLCBMMihuMiwgbDMsIGgsIHQpLCAtLXUyLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBYKG4yLCB1Mik7CiAgICBlbHNlIHsKICAgICAgZm9yICh0ID0gbDMuYmxvY2tlZFNlZ21lbnQsIGggPSB0LmNoaWxkcmVuLmxlbmd0aCwgZjIgPSB0LmNodW5rcy5sZW5ndGgsIG8gPSBpIC0gMTsgMCA8PSBvOyBvLS0pIHsKICAgICAgICBkMyA9IGVbb10sIGwzLnJvdyA9IHUyID0gb2wodTIpLCBsMy50cmVlQ29udGV4dCA9IE1uKGEsIGksIG8pLCBnID0gU24objIsIGYyLCBudWxsLCBsMy5mb3JtYXRDb250ZXh0LCBvID09PSAwID8gdC5sYXN0UHVzaGVkVGV4dCA6IHRydWUsIHRydWUpLCB0LmNoaWxkcmVuLnNwbGljZShoLCAwLCBnKSwgbDMuYmxvY2tlZFNlZ21lbnQgPSBnOwogICAgICAgIHRyeSB7CiAgICAgICAgICBMMihuMiwgbDMsIGQzLCBvKSwgc2woZy5jaHVua3MsIG4yLnJlbmRlclN0YXRlLCBnLmxhc3RQdXNoZWRUZXh0LCBnLnRleHRFbWJlZGRlZCksIGcuc3RhdHVzID0gMSwgLS11Mi5wZW5kaW5nVGFza3MgPT09IDAgJiYgWChuMiwgdTIpOwogICAgICAgIH0gY2F0Y2ggKEU0KSB7CiAgICAgICAgICB0aHJvdyBnLnN0YXR1cyA9IG4yLnN0YXR1cyA9PT0gMTIgPyAzIDogNCwgRTQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGwzLmJsb2NrZWRTZWdtZW50ID0gdCwgdC5sYXN0UHVzaGVkVGV4dCA9IGZhbHNlOwogICAgfQogICAgYzIgIT09IG51bGwgJiYgdTIgIT09IG51bGwgJiYgMCA8IHUyLnBlbmRpbmdUYXNrcyAmJiAoYzIucGVuZGluZ1Rhc2tzKyssIHUyLm5leHQgPSBjMiksIGwzLnRyZWVDb250ZXh0ID0gYSwgbDMucm93ID0gYzIsIGwzLmtleVBhdGggPSByOwogIH0KICBmdW5jdGlvbiB2dChuMiwgbDMsIGksIGUsIHQsIHIpIHsKICAgIHZhciBhID0gbDMudGhlbmFibGVTdGF0ZTsKICAgIGZvciAobDMudGhlbmFibGVTdGF0ZSA9IG51bGwsIGhuID0ge30sIGllID0gbDMsIGVlID0gbjIsIHRlID0gaSwgeWwgPSBibCA9IDAsIFRsID0gLTEsIHRpID0gMCwgR24gPSBhLCBuMiA9IGUodCwgcik7IGVpOyApIGVpID0gZmFsc2UsIHlsID0gYmwgPSAwLCBUbCA9IC0xLCB0aSA9IDAsIHNpICs9IDEsIF8yID0gbnVsbCwgbjIgPSBlKHQsIHIpOwogICAgcmV0dXJuIEVsKCksIG4yOwogIH0KICBmdW5jdGlvbiBidChuMiwgbDMsIGksIGUsIHQsIHIsIGEpIHsKICAgIHZhciBjMiA9IGZhbHNlOwogICAgaWYgKHIgIT09IDAgJiYgbjIuZm9ybVN0YXRlICE9PSBudWxsKSB7CiAgICAgIHZhciB1MiA9IGwzLmJsb2NrZWRTZWdtZW50OwogICAgICBpZiAodTIgIT09IG51bGwpIHsKICAgICAgICBjMiA9IHRydWUsIHUyID0gdTIuY2h1bmtzOwogICAgICAgIGZvciAodmFyIGggPSAwOyBoIDwgcjsgaCsrKSBoID09PSBhID8gdTIucHVzaCgiPCEtLUYhLS0+IikgOiB1Mi5wdXNoKCI8IS0tRi0tPiIpOwogICAgICB9CiAgICB9CiAgICByID0gbDMua2V5UGF0aCwgbDMua2V5UGF0aCA9IGksIHQgPyAoaSA9IGwzLnRyZWVDb250ZXh0LCBsMy50cmVlQ29udGV4dCA9IE1uKGksIDEsIDApLCBMMihuMiwgbDMsIGUsIC0xKSwgbDMudHJlZUNvbnRleHQgPSBpKSA6IGMyID8gTDIobjIsIGwzLCBlLCAtMSkgOiBtMihuMiwgbDMsIGUsIC0xKSwgbDMua2V5UGF0aCA9IHI7CiAgfQogIGZ1bmN0aW9uIGFpKG4yLCBsMywgaSwgZSwgdCwgcikgewogICAgaWYgKHR5cGVvZiBlID09ICJmdW5jdGlvbiIpIGlmIChlLnByb3RvdHlwZSAmJiBlLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KSB7CiAgICAgIHZhciBhID0gdDsKICAgICAgaWYgKCJyZWYiIGluIHQpIHsKICAgICAgICBhID0ge307CiAgICAgICAgZm9yICh2YXIgYzIgaW4gdCkgYzIgIT09ICJyZWYiICYmIChhW2MyXSA9IHRbYzJdKTsKICAgICAgfQogICAgICB2YXIgdTIgPSBlLmRlZmF1bHRQcm9wczsKICAgICAgaWYgKHUyKSB7CiAgICAgICAgYSA9PT0gdCAmJiAoYSA9IEooe30sIGEsIHQpKTsKICAgICAgICBmb3IgKHZhciBoIGluIHUyKSBhW2hdID09PSB2b2lkIDAgJiYgKGFbaF0gPSB1MltoXSk7CiAgICAgIH0KICAgICAgdCA9IGEsIGEgPSBhdCwgdTIgPSBlLmNvbnRleHRUeXBlLCB0eXBlb2YgdTIgPT0gIm9iamVjdCIgJiYgdTIgIT09IG51bGwgJiYgKGEgPSB1Mi5fY3VycmVudFZhbHVlMiksIGEgPSBuZXcgZSh0LCBhKTsKICAgICAgdmFyIGYyID0gYS5zdGF0ZSAhPT0gdm9pZCAwID8gYS5zdGF0ZSA6IG51bGw7CiAgICAgIGlmIChhLnVwZGF0ZXIgPSB1dCwgYS5wcm9wcyA9IHQsIGEuc3RhdGUgPSBmMiwgdTIgPSB7CiAgICAgICAgcXVldWU6IFtdLAogICAgICAgIHJlcGxhY2U6IGZhbHNlCiAgICAgIH0sIGEuX3JlYWN0SW50ZXJuYWxzID0gdTIsIHIgPSBlLmNvbnRleHRUeXBlLCBhLmNvbnRleHQgPSB0eXBlb2YgciA9PSAib2JqZWN0IiAmJiByICE9PSBudWxsID8gci5fY3VycmVudFZhbHVlMiA6IGF0LCByID0gZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIHR5cGVvZiByID09ICJmdW5jdGlvbiIgJiYgKHIgPSByKHQsIGYyKSwgZjIgPSByID09IG51bGwgPyBmMiA6IEooe30sIGYyLCByKSwgYS5zdGF0ZSA9IGYyKSwgdHlwZW9mIGUuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICE9ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGEuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgIT0gImZ1bmN0aW9uIiAmJiAodHlwZW9mIGEuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PSAiZnVuY3Rpb24iIHx8IHR5cGVvZiBhLmNvbXBvbmVudFdpbGxNb3VudCA9PSAiZnVuY3Rpb24iKSkgaWYgKGUgPSBhLnN0YXRlLCB0eXBlb2YgYS5jb21wb25lbnRXaWxsTW91bnQgPT0gImZ1bmN0aW9uIiAmJiBhLmNvbXBvbmVudFdpbGxNb3VudCgpLCB0eXBlb2YgYS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09ICJmdW5jdGlvbiIgJiYgYS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksIGUgIT09IGEuc3RhdGUgJiYgdXQuZW5xdWV1ZVJlcGxhY2VTdGF0ZShhLCBhLnN0YXRlLCBudWxsKSwgdTIucXVldWUgIT09IG51bGwgJiYgMCA8IHUyLnF1ZXVlLmxlbmd0aCkgaWYgKGUgPSB1Mi5xdWV1ZSwgciA9IHUyLnJlcGxhY2UsIHUyLnF1ZXVlID0gbnVsbCwgdTIucmVwbGFjZSA9IGZhbHNlLCByICYmIGUubGVuZ3RoID09PSAxKSBhLnN0YXRlID0gZVswXTsKICAgICAgZWxzZSB7CiAgICAgICAgZm9yICh1MiA9IHIgPyBlWzBdIDogYS5zdGF0ZSwgZjIgPSB0cnVlLCByID0gciA/IDEgOiAwOyByIDwgZS5sZW5ndGg7IHIrKykgaCA9IGVbcl0sIGggPSB0eXBlb2YgaCA9PSAiZnVuY3Rpb24iID8gaC5jYWxsKGEsIHUyLCB0LCB2b2lkIDApIDogaCwgaCAhPSBudWxsICYmIChmMiA/IChmMiA9IGZhbHNlLCB1MiA9IEooe30sIHUyLCBoKSkgOiBKKHUyLCBoKSk7CiAgICAgICAgYS5zdGF0ZSA9IHUyOwogICAgICB9CiAgICAgIGVsc2UgdTIucXVldWUgPSBudWxsOwogICAgICBpZiAoZSA9IGEucmVuZGVyKCksIG4yLnN0YXR1cyA9PT0gMTIpIHRocm93IG51bGw7CiAgICAgIHQgPSBsMy5rZXlQYXRoLCBsMy5rZXlQYXRoID0gaSwgbTIobjIsIGwzLCBlLCAtMSksIGwzLmtleVBhdGggPSB0OwogICAgfSBlbHNlIHsKICAgICAgaWYgKGUgPSB2dChuMiwgbDMsIGksIGUsIHQsIHZvaWQgMCksIG4yLnN0YXR1cyA9PT0gMTIpIHRocm93IG51bGw7CiAgICAgIGJ0KG4yLCBsMywgaSwgZSwgYmwgIT09IDAsIHlsLCBUbCk7CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2YgZSA9PSAic3RyaW5nIikgaWYgKGEgPSBsMy5ibG9ja2VkU2VnbWVudCwgYSA9PT0gbnVsbCkgYSA9IHQuY2hpbGRyZW4sIHUyID0gbDMuZm9ybWF0Q29udGV4dCwgZjIgPSBsMy5rZXlQYXRoLCBsMy5mb3JtYXRDb250ZXh0ID0gbWUyKHUyLCBlLCB0KSwgbDMua2V5UGF0aCA9IGksIEwyKG4yLCBsMywgYSwgLTEpLCBsMy5mb3JtYXRDb250ZXh0ID0gdTIsIGwzLmtleVBhdGggPSBmMjsKICAgIGVsc2UgewogICAgICBpZiAoZjIgPSB6cihhLmNodW5rcywgZSwgdCwgbjIucmVzdW1hYmxlU3RhdGUsIG4yLnJlbmRlclN0YXRlLCBsMy5ibG9ja2VkUHJlYW1ibGUsIGwzLmhvaXN0YWJsZVN0YXRlLCBsMy5mb3JtYXRDb250ZXh0LCBhLmxhc3RQdXNoZWRUZXh0KSwgYS5sYXN0UHVzaGVkVGV4dCA9IGZhbHNlLCB1MiA9IGwzLmZvcm1hdENvbnRleHQsIHIgPSBsMy5rZXlQYXRoLCBsMy5rZXlQYXRoID0gaSwgKGwzLmZvcm1hdENvbnRleHQgPSBtZTIodTIsIGUsIHQpKS5pbnNlcnRpb25Nb2RlID09PSAzKSB7CiAgICAgICAgaSA9IFNuKG4yLCAwLCBudWxsLCBsMy5mb3JtYXRDb250ZXh0LCBmYWxzZSwgZmFsc2UpLCBhLnByZWFtYmxlQ2hpbGRyZW4ucHVzaChpKSwgbDMuYmxvY2tlZFNlZ21lbnQgPSBpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBpLnN0YXR1cyA9IDYsIEwyKG4yLCBsMywgZjIsIC0xKSwgc2woaS5jaHVua3MsIG4yLnJlbmRlclN0YXRlLCBpLmxhc3RQdXNoZWRUZXh0LCBpLnRleHRFbWJlZGRlZCksIGkuc3RhdHVzID0gMTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgbDMuYmxvY2tlZFNlZ21lbnQgPSBhOwogICAgICAgIH0KICAgICAgfSBlbHNlIEwyKG4yLCBsMywgZjIsIC0xKTsKICAgICAgbDMuZm9ybWF0Q29udGV4dCA9IHUyLCBsMy5rZXlQYXRoID0gcjsKICAgICAgbjogewogICAgICAgIHN3aXRjaCAobDMgPSBhLmNodW5rcywgbjIgPSBuMi5yZXN1bWFibGVTdGF0ZSwgZSkgewogICAgICAgICAgY2FzZSAidGl0bGUiOgogICAgICAgICAgY2FzZSAic3R5bGUiOgogICAgICAgICAgY2FzZSAic2NyaXB0IjoKICAgICAgICAgIGNhc2UgImFyZWEiOgogICAgICAgICAgY2FzZSAiYmFzZSI6CiAgICAgICAgICBjYXNlICJiciI6CiAgICAgICAgICBjYXNlICJjb2wiOgogICAgICAgICAgY2FzZSAiZW1iZWQiOgogICAgICAgICAgY2FzZSAiaHIiOgogICAgICAgICAgY2FzZSAiaW1nIjoKICAgICAgICAgIGNhc2UgImlucHV0IjoKICAgICAgICAgIGNhc2UgImtleWdlbiI6CiAgICAgICAgICBjYXNlICJsaW5rIjoKICAgICAgICAgIGNhc2UgIm1ldGEiOgogICAgICAgICAgY2FzZSAicGFyYW0iOgogICAgICAgICAgY2FzZSAic291cmNlIjoKICAgICAgICAgIGNhc2UgInRyYWNrIjoKICAgICAgICAgIGNhc2UgIndiciI6CiAgICAgICAgICAgIGJyZWFrIG47CiAgICAgICAgICBjYXNlICJib2R5IjoKICAgICAgICAgICAgaWYgKDEgPj0gdTIuaW5zZXJ0aW9uTW9kZSkgewogICAgICAgICAgICAgIG4yLmhhc0JvZHkgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrIG47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJodG1sIjoKICAgICAgICAgICAgaWYgKHUyLmluc2VydGlvbk1vZGUgPT09IDApIHsKICAgICAgICAgICAgICBuMi5oYXNIdG1sID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhayBuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiaGVhZCI6CiAgICAgICAgICAgIGlmICgxID49IHUyLmluc2VydGlvbk1vZGUpIGJyZWFrIG47CiAgICAgICAgfQogICAgICAgIGwzLnB1c2goUG4oZSkpOwogICAgICB9CiAgICAgIGEubGFzdFB1c2hlZFRleHQgPSBmYWxzZTsKICAgIH0KICAgIGVsc2UgewogICAgICBzd2l0Y2ggKGUpIHsKICAgICAgICBjYXNlIHdyMjoKICAgICAgICBjYXNlIEZ0OgogICAgICAgIGNhc2UgX3Q6CiAgICAgICAgY2FzZSBDdDoKICAgICAgICAgIGUgPSBsMy5rZXlQYXRoLCBsMy5rZXlQYXRoID0gaSwgbTIobjIsIGwzLCB0LmNoaWxkcmVuLCAtMSksIGwzLmtleVBhdGggPSBlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2UgSXQ6CiAgICAgICAgICBlID0gbDMuYmxvY2tlZFNlZ21lbnQsIGUgPT09IG51bGwgPyB0Lm1vZGUgIT09ICJoaWRkZW4iICYmIChlID0gbDMua2V5UGF0aCwgbDMua2V5UGF0aCA9IGksIEwyKG4yLCBsMywgdC5jaGlsZHJlbiwgLTEpLCBsMy5rZXlQYXRoID0gZSkgOiB0Lm1vZGUgIT09ICJoaWRkZW4iICYmIChuMi5yZW5kZXJTdGF0ZS5nZW5lcmF0ZVN0YXRpY01hcmt1cCB8fCBlLmNodW5rcy5wdXNoKCI8IS0tJi0tPiIpLCBlLmxhc3RQdXNoZWRUZXh0ID0gZmFsc2UsIGEgPSBsMy5rZXlQYXRoLCBsMy5rZXlQYXRoID0gaSwgTDIobjIsIGwzLCB0LmNoaWxkcmVuLCAtMSksIGwzLmtleVBhdGggPSBhLCBuMi5yZW5kZXJTdGF0ZS5nZW5lcmF0ZVN0YXRpY01hcmt1cCB8fCBlLmNodW5rcy5wdXNoKCI8IS0tLyYtLT4iKSwgZS5sYXN0UHVzaGVkVGV4dCA9IGZhbHNlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICBjYXNlIHFpMjoKICAgICAgICAgIG46IHsKICAgICAgICAgICAgaWYgKGUgPSB0LmNoaWxkcmVuLCB0ID0gdC5yZXZlYWxPcmRlciwgdCA9PT0gImZvcndhcmRzIiB8fCB0ID09PSAiYmFja3dhcmRzIiB8fCB0ID09PSAidW5zdGFibGVfbGVnYWN5LWJhY2t3YXJkcyIpIHsKICAgICAgICAgICAgICBpZiAocWwoZSkpIHsKICAgICAgICAgICAgICAgIGd0KG4yLCBsMywgaSwgZSwgdCk7CiAgICAgICAgICAgICAgICBicmVhayBuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoKGEgPSBNdChlKSkgJiYgKGEgPSBhLmNhbGwoZSkpKSB7CiAgICAgICAgICAgICAgICBpZiAodTIgPSBhLm5leHQoKSwgIXUyLmRvbmUpIHsKICAgICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgICAgICB1MiA9IGEubmV4dCgpOwogICAgICAgICAgICAgICAgICB3aGlsZSAoIXUyLmRvbmUpOwogICAgICAgICAgICAgICAgICBndChuMiwgbDMsIGksIGUsIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWsgbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdCA9PT0gInRvZ2V0aGVyIiA/ICh0ID0gbDMua2V5UGF0aCwgYSA9IGwzLnJvdywgdTIgPSBsMy5yb3cgPSBvbChudWxsKSwgdTIuYm91bmRhcmllcyA9IFtdLCB1Mi50b2dldGhlciA9IHRydWUsIGwzLmtleVBhdGggPSBpLCBtMihuMiwgbDMsIGUsIC0xKSwgLS11Mi5wZW5kaW5nVGFza3MgPT09IDAgJiYgWChuMiwgdTIpLCBsMy5rZXlQYXRoID0gdCwgbDMucm93ID0gYSwgYSAhPT0gbnVsbCAmJiAwIDwgdTIucGVuZGluZ1Rhc2tzICYmIChhLnBlbmRpbmdUYXNrcysrLCB1Mi5uZXh0ID0gYSkpIDogKHQgPSBsMy5rZXlQYXRoLCBsMy5rZXlQYXRoID0gaSwgbTIobjIsIGwzLCBlLCAtMSksIGwzLmtleVBhdGggPSB0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICBjYXNlIEZyOgogICAgICAgIGNhc2UgUnI6CiAgICAgICAgICB0aHJvdyBFcnJvcihzKDM0MykpOwogICAgICAgIGNhc2UgZmk6CiAgICAgICAgICBuOiBpZiAobDMucmVwbGF5ICE9PSBudWxsKSB7CiAgICAgICAgICAgIGUgPSBsMy5rZXlQYXRoLCBhID0gbDMuZm9ybWF0Q29udGV4dCwgdTIgPSBsMy5yb3csIGwzLmtleVBhdGggPSBpLCBsMy5mb3JtYXRDb250ZXh0ID0gWmwobjIucmVzdW1hYmxlU3RhdGUsIGEpLCBsMy5yb3cgPSBudWxsLCBpID0gdC5jaGlsZHJlbjsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBMMihuMiwgbDMsIGksIC0xKTsKICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICBsMy5rZXlQYXRoID0gZSwgbDMuZm9ybWF0Q29udGV4dCA9IGEsIGwzLnJvdyA9IHUyOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlID0gbDMua2V5UGF0aCwgciA9IGwzLmZvcm1hdENvbnRleHQ7CiAgICAgICAgICAgIHZhciBvID0gbDMucm93LCBkMyA9IGwzLmJsb2NrZWRCb3VuZGFyeTsKICAgICAgICAgICAgaCA9IGwzLmJsb2NrZWRQcmVhbWJsZTsKICAgICAgICAgICAgdmFyIGcgPSBsMy5ob2lzdGFibGVTdGF0ZTsKICAgICAgICAgICAgYzIgPSBsMy5ibG9ja2VkU2VnbWVudDsKICAgICAgICAgICAgdmFyIEU0ID0gdC5mYWxsYmFjazsKICAgICAgICAgICAgdCA9IHQuY2hpbGRyZW47CiAgICAgICAgICAgIHZhciB5MiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksIGI0ID0gYWUyKG4yLCBsMy5yb3csIHkyLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgbjIudHJhY2tlZFBvc3Rwb25lcyAhPT0gbnVsbCAmJiAoYjQudHJhY2tlZENvbnRlbnRLZXlQYXRoID0gaSk7CiAgICAgICAgICAgIHZhciB2MyA9IFNuKG4yLCBjMi5jaHVua3MubGVuZ3RoLCBiNCwgbDMuZm9ybWF0Q29udGV4dCwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgYzIuY2hpbGRyZW4ucHVzaCh2MyksIGMyLmxhc3RQdXNoZWRUZXh0ID0gZmFsc2U7CiAgICAgICAgICAgIHZhciB4MyA9IFNuKG4yLCAwLCBudWxsLCBsMy5mb3JtYXRDb250ZXh0LCBmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICBpZiAoeDMucGFyZW50Rmx1c2hlZCA9IHRydWUsIG4yLnRyYWNrZWRQb3N0cG9uZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICBhID0gbDMuY29tcG9uZW50U3RhY2ssIHUyID0gWwogICAgICAgICAgICAgICAgaVswXSwKICAgICAgICAgICAgICAgICJTdXNwZW5zZSBGYWxsYmFjayIsCiAgICAgICAgICAgICAgICBpWzJdCiAgICAgICAgICAgICAgXSwgZjIgPSBbCiAgICAgICAgICAgICAgICB1MlsxXSwKICAgICAgICAgICAgICAgIHUyWzJdLAogICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICBudWxsCiAgICAgICAgICAgICAgXSwgbjIudHJhY2tlZFBvc3Rwb25lcy53b3JraW5nTWFwLnNldCh1MiwgZjIpLCBiNC50cmFja2VkRmFsbGJhY2tOb2RlID0gZjIsIGwzLmJsb2NrZWRTZWdtZW50ID0gdjMsIGwzLmJsb2NrZWRQcmVhbWJsZSA9IGI0LmZhbGxiYWNrUHJlYW1ibGUsIGwzLmtleVBhdGggPSB1MiwgbDMuZm9ybWF0Q29udGV4dCA9IEhpKG4yLnJlc3VtYWJsZVN0YXRlLCByKSwgbDMuY29tcG9uZW50U3RhY2sgPSBaaShhKSwgdjMuc3RhdHVzID0gNjsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgTDIobjIsIGwzLCBFNCwgLTEpLCBzbCh2My5jaHVua3MsIG4yLnJlbmRlclN0YXRlLCB2My5sYXN0UHVzaGVkVGV4dCwgdjMudGV4dEVtYmVkZGVkKSwgdjMuc3RhdHVzID0gMTsKICAgICAgICAgICAgICB9IGNhdGNoIChNMikgewogICAgICAgICAgICAgICAgdGhyb3cgdjMuc3RhdHVzID0gbjIuc3RhdHVzID09PSAxMiA/IDMgOiA0LCBNMjsKICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgbDMuYmxvY2tlZFNlZ21lbnQgPSBjMiwgbDMuYmxvY2tlZFByZWFtYmxlID0gaCwgbDMua2V5UGF0aCA9IGUsIGwzLmZvcm1hdENvbnRleHQgPSByOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsMyA9IHJpKG4yLCBudWxsLCB0LCAtMSwgYjQsIHgzLCBiNC5jb250ZW50UHJlYW1ibGUsIGI0LmNvbnRlbnRTdGF0ZSwgbDMuYWJvcnRTZXQsIGksIFpsKG4yLnJlc3VtYWJsZVN0YXRlLCBsMy5mb3JtYXRDb250ZXh0KSwgbDMuY29udGV4dCwgbDMudHJlZUNvbnRleHQsIG51bGwsIGEpLCB4bChsMyksIG4yLnBpbmdlZFRhc2tzLnB1c2gobDMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGwzLmJsb2NrZWRCb3VuZGFyeSA9IGI0LCBsMy5ibG9ja2VkUHJlYW1ibGUgPSBiNC5jb250ZW50UHJlYW1ibGUsIGwzLmhvaXN0YWJsZVN0YXRlID0gYjQuY29udGVudFN0YXRlLCBsMy5ibG9ja2VkU2VnbWVudCA9IHgzLCBsMy5rZXlQYXRoID0gaSwgbDMuZm9ybWF0Q29udGV4dCA9IFpsKG4yLnJlc3VtYWJsZVN0YXRlLCByKSwgbDMucm93ID0gbnVsbCwgeDMuc3RhdHVzID0gNjsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKEwyKG4yLCBsMywgdCwgLTEpLCBzbCh4My5jaHVua3MsIG4yLnJlbmRlclN0YXRlLCB4My5sYXN0UHVzaGVkVGV4dCwgeDMudGV4dEVtYmVkZGVkKSwgeDMuc3RhdHVzID0gMSwgd2woYjQsIHgzKSwgYjQucGVuZGluZ1Rhc2tzID09PSAwICYmIGI0LnN0YXR1cyA9PT0gMCkgewogICAgICAgICAgICAgICAgICBpZiAoYjQuc3RhdHVzID0gMSwgIUpuKG4yLCBiNCkpIHsKICAgICAgICAgICAgICAgICAgICBvICE9PSBudWxsICYmIC0tby5wZW5kaW5nVGFza3MgPT09IDAgJiYgWChuMiwgbyksIG4yLnBlbmRpbmdSb290VGFza3MgPT09IDAgJiYgbDMuYmxvY2tlZFByZWFtYmxlICYmIEFsKG4yKTsKICAgICAgICAgICAgICAgICAgICBicmVhayBuOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgbyAhPT0gbnVsbCAmJiBvLnRvZ2V0aGVyICYmIEppKG4yLCBvKTsKICAgICAgICAgICAgICB9IGNhdGNoIChNMikgewogICAgICAgICAgICAgICAgYjQuc3RhdHVzID0gNCwgbjIuc3RhdHVzID09PSAxMiA/ICh4My5zdGF0dXMgPSAzLCBhID0gbjIuZmF0YWxFcnJvcikgOiAoeDMuc3RhdHVzID0gNCwgYSA9IE0yKSwgdTIgPSBUbihsMy5jb21wb25lbnRTdGFjayksIGYyID0gRzMobjIsIGEsIHUyKSwgYjQuZXJyb3JEaWdlc3QgPSBmMiwgaGUyKG4yLCBiNCk7CiAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIGwzLmJsb2NrZWRCb3VuZGFyeSA9IGQzLCBsMy5ibG9ja2VkUHJlYW1ibGUgPSBoLCBsMy5ob2lzdGFibGVTdGF0ZSA9IGcsIGwzLmJsb2NrZWRTZWdtZW50ID0gYzIsIGwzLmtleVBhdGggPSBlLCBsMy5mb3JtYXRDb250ZXh0ID0gciwgbDMucm93ID0gbzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbDMgPSByaShuMiwgbnVsbCwgRTQsIC0xLCBkMywgdjMsIGI0LmZhbGxiYWNrUHJlYW1ibGUsIGI0LmZhbGxiYWNrU3RhdGUsIHkyLCBbCiAgICAgICAgICAgICAgICBpWzBdLAogICAgICAgICAgICAgICAgIlN1c3BlbnNlIEZhbGxiYWNrIiwKICAgICAgICAgICAgICAgIGlbMl0KICAgICAgICAgICAgICBdLCBIaShuMi5yZXN1bWFibGVTdGF0ZSwgbDMuZm9ybWF0Q29udGV4dCksIGwzLmNvbnRleHQsIGwzLnRyZWVDb250ZXh0LCBsMy5yb3csIFppKGwzLmNvbXBvbmVudFN0YWNrKSksIHhsKGwzKSwgbjIucGluZ2VkVGFza3MucHVzaChsMyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGUgPT0gIm9iamVjdCIgJiYgZSAhPT0gbnVsbCkgc3dpdGNoIChlLiQkdHlwZW9mKSB7CiAgICAgICAgY2FzZSBwaToKICAgICAgICAgIGlmICgicmVmIiBpbiB0KSBmb3IgKEU0IGluIGEgPSB7fSwgdCkgRTQgIT09ICJyZWYiICYmIChhW0U0XSA9IHRbRTRdKTsKICAgICAgICAgIGVsc2UgYSA9IHQ7CiAgICAgICAgICBlID0gdnQobjIsIGwzLCBpLCBlLnJlbmRlciwgYSwgciksIGJ0KG4yLCBsMywgaSwgZSwgYmwgIT09IDAsIHlsLCBUbCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FzZSBqaToKICAgICAgICAgIGFpKG4yLCBsMywgaSwgZS50eXBlLCB0LCByKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICBjYXNlIGNpOgogICAgICAgICAgaWYgKHUyID0gdC5jaGlsZHJlbiwgYSA9IGwzLmtleVBhdGgsIHQgPSB0LnZhbHVlLCBmMiA9IGUuX2N1cnJlbnRWYWx1ZTIsIGUuX2N1cnJlbnRWYWx1ZTIgPSB0LCByID0gSW4sIEluID0gZSA9IHsKICAgICAgICAgICAgcGFyZW50OiByLAogICAgICAgICAgICBkZXB0aDogciA9PT0gbnVsbCA/IDAgOiByLmRlcHRoICsgMSwKICAgICAgICAgICAgY29udGV4dDogZSwKICAgICAgICAgICAgcGFyZW50VmFsdWU6IGYyLAogICAgICAgICAgICB2YWx1ZTogdAogICAgICAgICAgfSwgbDMuY29udGV4dCA9IGUsIGwzLmtleVBhdGggPSBpLCBtMihuMiwgbDMsIHUyLCAtMSksIG4yID0gSW4sIG4yID09PSBudWxsKSB0aHJvdyBFcnJvcihzKDQwMykpOwogICAgICAgICAgbjIuY29udGV4dC5fY3VycmVudFZhbHVlMiA9IG4yLnBhcmVudFZhbHVlLCBuMiA9IEluID0gbjIucGFyZW50LCBsMy5jb250ZXh0ID0gbjIsIGwzLmtleVBhdGggPSBhOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2UgQXQ6CiAgICAgICAgICB0ID0gdC5jaGlsZHJlbiwgZSA9IHQoZS5fY29udGV4dC5fY3VycmVudFZhbHVlMiksIHQgPSBsMy5rZXlQYXRoLCBsMy5rZXlQYXRoID0gaSwgbTIobjIsIGwzLCBlLCAtMSksIGwzLmtleVBhdGggPSB0OwogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2Ugb2k6CiAgICAgICAgICBpZiAoYSA9IGUuX2luaXQsIGUgPSBhKGUuX3BheWxvYWQpLCBuMi5zdGF0dXMgPT09IDEyKSB0aHJvdyBudWxsOwogICAgICAgICAgYWkobjIsIGwzLCBpLCBlLCB0LCByKTsKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyBFcnJvcihzKDEzMCwgZSA9PSBudWxsID8gZSA6IHR5cGVvZiBlLCAiIikpOwogICAgfQogIH0KICBmdW5jdGlvbiBnaShuMiwgbDMsIGksIGUsIHQpIHsKICAgIHZhciByID0gbDMucmVwbGF5LCBhID0gbDMuYmxvY2tlZEJvdW5kYXJ5LCBjMiA9IFNuKG4yLCAwLCBudWxsLCBsMy5mb3JtYXRDb250ZXh0LCBmYWxzZSwgZmFsc2UpOwogICAgYzIuaWQgPSBpLCBjMi5wYXJlbnRGbHVzaGVkID0gdHJ1ZTsKICAgIHRyeSB7CiAgICAgIGwzLnJlcGxheSA9IG51bGwsIGwzLmJsb2NrZWRTZWdtZW50ID0gYzIsIEwyKG4yLCBsMywgZSwgdCksIGMyLnN0YXR1cyA9IDEsIGEgPT09IG51bGwgPyBuMi5jb21wbGV0ZWRSb290U2VnbWVudCA9IGMyIDogKHdsKGEsIGMyKSwgYS5wYXJlbnRGbHVzaGVkICYmIG4yLnBhcnRpYWxCb3VuZGFyaWVzLnB1c2goYSkpOwogICAgfSBmaW5hbGx5IHsKICAgICAgbDMucmVwbGF5ID0gciwgbDMuYmxvY2tlZFNlZ21lbnQgPSBudWxsOwogICAgfQogIH0KICBmdW5jdGlvbiBtMihuMiwgbDMsIGksIGUpIHsKICAgIGwzLnJlcGxheSAhPT0gbnVsbCAmJiB0eXBlb2YgbDMucmVwbGF5LnNsb3RzID09ICJudW1iZXIiID8gZ2kobjIsIGwzLCBsMy5yZXBsYXkuc2xvdHMsIGksIGUpIDogKGwzLm5vZGUgPSBpLCBsMy5jaGlsZEluZGV4ID0gZSwgaSA9IGwzLmNvbXBvbmVudFN0YWNrLCB4bChsMyksIFFpKG4yLCBsMyksIGwzLmNvbXBvbmVudFN0YWNrID0gaSk7CiAgfQogIGZ1bmN0aW9uIFFpKG4yLCBsMykgewogICAgdmFyIGkgPSBsMy5ub2RlLCBlID0gbDMuY2hpbGRJbmRleDsKICAgIGlmIChpICE9PSBudWxsKSB7CiAgICAgIGlmICh0eXBlb2YgaSA9PSAib2JqZWN0IikgewogICAgICAgIHN3aXRjaCAoaS4kJHR5cGVvZikgewogICAgICAgICAgY2FzZSBSdDoKICAgICAgICAgICAgdmFyIHQgPSBpLnR5cGUsIHIgPSBpLmtleSwgYSA9IGkucHJvcHM7CiAgICAgICAgICAgIGkgPSBhLnJlZjsKICAgICAgICAgICAgdmFyIGMyID0gaSAhPT0gdm9pZCAwID8gaSA6IG51bGwsIHUyID0gbGkodCksIGggPSByID8/IChlID09PSAtMSA/IDAgOiBlKTsKICAgICAgICAgICAgaWYgKHIgPSBbCiAgICAgICAgICAgICAgbDMua2V5UGF0aCwKICAgICAgICAgICAgICB1MiwKICAgICAgICAgICAgICBoCiAgICAgICAgICAgIF0sIGwzLnJlcGxheSAhPT0gbnVsbCkgbjogewogICAgICAgICAgICAgIHZhciBmMiA9IGwzLnJlcGxheTsKICAgICAgICAgICAgICBmb3IgKGUgPSBmMi5ub2RlcywgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgbyA9IGVbaV07CiAgICAgICAgICAgICAgICBpZiAoaCA9PT0gb1sxXSkgewogICAgICAgICAgICAgICAgICBpZiAoby5sZW5ndGggPT09IDQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodTIgIT09IG51bGwgJiYgdTIgIT09IG9bMF0pIHRocm93IEVycm9yKHMoNDkwLCBvWzBdLCB1MikpOwogICAgICAgICAgICAgICAgICAgIHZhciBkMyA9IG9bMl07CiAgICAgICAgICAgICAgICAgICAgdTIgPSBvWzNdLCBoID0gbDMubm9kZSwgbDMucmVwbGF5ID0gewogICAgICAgICAgICAgICAgICAgICAgbm9kZXM6IGQzLAogICAgICAgICAgICAgICAgICAgICAgc2xvdHM6IHUyLAogICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1Rhc2tzOiAxCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgaWYgKGFpKG4yLCBsMywgciwgdCwgYSwgYzIpLCBsMy5yZXBsYXkucGVuZGluZ1Rhc2tzID09PSAxICYmIDAgPCBsMy5yZXBsYXkubm9kZXMubGVuZ3RoKSB0aHJvdyBFcnJvcihzKDQ4OCkpOwogICAgICAgICAgICAgICAgICAgICAgbDMucmVwbGF5LnBlbmRpbmdUYXNrcy0tOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEYyKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEYyID09ICJvYmplY3QiICYmIEYyICE9PSBudWxsICYmIChGMiA9PT0gVjIgfHwgdHlwZW9mIEYyLnRoZW4gPT0gImZ1bmN0aW9uIikpIHRocm93IGwzLm5vZGUgPT09IGggPyBsMy5yZXBsYXkgPSBmMiA6IGUuc3BsaWNlKGksIDEpLCBGMjsKICAgICAgICAgICAgICAgICAgICAgIGwzLnJlcGxheS5wZW5kaW5nVGFza3MtLSwgYSA9IFRuKGwzLmNvbXBvbmVudFN0YWNrKSwgciA9IG4yLCBuMiA9IGwzLmJsb2NrZWRCb3VuZGFyeSwgdCA9IEYyLCBhID0gRzMociwgdCwgYSksIF9sKHIsIG4yLCBkMywgdTIsIHQsIGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsMy5yZXBsYXkgPSBmMjsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAodCAhPT0gZmkpIHRocm93IEVycm9yKHMoNDkwLCAiU3VzcGVuc2UiLCBsaSh0KSB8fCAiVW5rbm93biIpKTsKICAgICAgICAgICAgICAgICAgICBsOiB7CiAgICAgICAgICAgICAgICAgICAgICBmMiA9IHZvaWQgMCwgdCA9IG9bNV0sIGMyID0gb1syXSwgdTIgPSBvWzNdLCBoID0gb1s0XSA9PT0gbnVsbCA/IFtdIDogb1s0XVsyXSwgbyA9IG9bNF0gPT09IG51bGwgPyBudWxsIDogb1s0XVszXTsKICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gbDMua2V5UGF0aCwgRTQgPSBsMy5mb3JtYXRDb250ZXh0LCB5MiA9IGwzLnJvdywgYjQgPSBsMy5yZXBsYXksIHYzID0gbDMuYmxvY2tlZEJvdW5kYXJ5LCB4MyA9IGwzLmhvaXN0YWJsZVN0YXRlLCBNMiA9IGEuY2hpbGRyZW4sIFAgPSBhLmZhbGxiYWNrLCBSMyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICBhID0gYWUyKG4yLCBsMy5yb3csIFIzLCBudWxsLCBudWxsKSwgYS5wYXJlbnRGbHVzaGVkID0gdHJ1ZSwgYS5yb290U2VnbWVudElEID0gdCwgbDMuYmxvY2tlZEJvdW5kYXJ5ID0gYSwgbDMuaG9pc3RhYmxlU3RhdGUgPSBhLmNvbnRlbnRTdGF0ZSwgbDMua2V5UGF0aCA9IHIsIGwzLmZvcm1hdENvbnRleHQgPSBabChuMi5yZXN1bWFibGVTdGF0ZSwgRTQpLCBsMy5yb3cgPSBudWxsLCBsMy5yZXBsYXkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzOiBjMiwKICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHM6IHUyLAogICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nVGFza3M6IDEKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoTDIobjIsIGwzLCBNMiwgLTEpLCBsMy5yZXBsYXkucGVuZGluZ1Rhc2tzID09PSAxICYmIDAgPCBsMy5yZXBsYXkubm9kZXMubGVuZ3RoKSB0aHJvdyBFcnJvcihzKDQ4OCkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobDMucmVwbGF5LnBlbmRpbmdUYXNrcy0tLCBhLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBhLnN0YXR1cyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGEuc3RhdHVzID0gMSwgbjIuY29tcGxldGVkQm91bmRhcmllcy5wdXNoKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEYyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuc3RhdHVzID0gNCwgZDMgPSBUbihsMy5jb21wb25lbnRTdGFjayksIGYyID0gRzMobjIsIEYyLCBkMyksIGEuZXJyb3JEaWdlc3QgPSBmMiwgbDMucmVwbGF5LnBlbmRpbmdUYXNrcy0tLCBuMi5jbGllbnRSZW5kZXJlZEJvdW5kYXJpZXMucHVzaChhKTsKICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGwzLmJsb2NrZWRCb3VuZGFyeSA9IHYzLCBsMy5ob2lzdGFibGVTdGF0ZSA9IHgzLCBsMy5yZXBsYXkgPSBiNCwgbDMua2V5UGF0aCA9IGcsIGwzLmZvcm1hdENvbnRleHQgPSBFNCwgbDMucm93ID0geTI7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBkMyA9IEt0KG4yLCBudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzOiBoLAogICAgICAgICAgICAgICAgICAgICAgICBzbG90czogbywKICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1Rhc2tzOiAwCiAgICAgICAgICAgICAgICAgICAgICB9LCBQLCAtMSwgdjMsIGEuZmFsbGJhY2tTdGF0ZSwgUjMsIFsKICAgICAgICAgICAgICAgICAgICAgICAgclswXSwKICAgICAgICAgICAgICAgICAgICAgICAgIlN1c3BlbnNlIEZhbGxiYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgclsyXQogICAgICAgICAgICAgICAgICAgICAgXSwgSGkobjIucmVzdW1hYmxlU3RhdGUsIGwzLmZvcm1hdENvbnRleHQpLCBsMy5jb250ZXh0LCBsMy50cmVlQ29udGV4dCwgbDMucm93LCBaaShsMy5jb21wb25lbnRTdGFjaykpLCB4bChkMyksIG4yLnBpbmdlZFRhc2tzLnB1c2goZDMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgYnJlYWsgbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBhaShuMiwgbDMsIHIsIHQsIGEsIGMyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSB3dDoKICAgICAgICAgICAgdGhyb3cgRXJyb3IocygyNTcpKTsKICAgICAgICAgIGNhc2Ugb2k6CiAgICAgICAgICAgIGlmIChkMyA9IGkuX2luaXQsIGkgPSBkMyhpLl9wYXlsb2FkKSwgbjIuc3RhdHVzID09PSAxMikgdGhyb3cgbnVsbDsKICAgICAgICAgICAgbTIobjIsIGwzLCBpLCBlKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAocWwoaSkpIHsKICAgICAgICAgIFZpKG4yLCBsMywgaSwgZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICgoZDMgPSBNdChpKSkgJiYgKGQzID0gZDMuY2FsbChpKSkpIHsKICAgICAgICAgIGlmIChpID0gZDMubmV4dCgpLCAhaS5kb25lKSB7CiAgICAgICAgICAgIGEgPSBbXTsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgICBhLnB1c2goaS52YWx1ZSksIGkgPSBkMy5uZXh0KCk7CiAgICAgICAgICAgIHdoaWxlICghaS5kb25lKTsKICAgICAgICAgICAgVmkobjIsIGwzLCBhLCBlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBpLnRoZW4gPT0gImZ1bmN0aW9uIikgcmV0dXJuIGwzLnRoZW5hYmxlU3RhdGUgPSBudWxsLCBtMihuMiwgbDMsIEp0KGkpLCBlKTsKICAgICAgICBpZiAoaS4kJHR5cGVvZiA9PT0gY2kpIHJldHVybiBtMihuMiwgbDMsIGkuX2N1cnJlbnRWYWx1ZTIsIGUpOwogICAgICAgIHRocm93IGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaSksIEVycm9yKHMoMzEsIGUgPT09ICJbb2JqZWN0IE9iamVjdF0iID8gIm9iamVjdCB3aXRoIGtleXMgeyIgKyBPYmplY3Qua2V5cyhpKS5qb2luKCIsICIpICsgIn0iIDogZSkpOwogICAgICB9CiAgICAgIHR5cGVvZiBpID09ICJzdHJpbmciID8gKGUgPSBsMy5ibG9ja2VkU2VnbWVudCwgZSAhPT0gbnVsbCAmJiAoZS5sYXN0UHVzaGVkVGV4dCA9IHJ0KGUuY2h1bmtzLCBpLCBuMi5yZW5kZXJTdGF0ZSwgZS5sYXN0UHVzaGVkVGV4dCkpKSA6ICh0eXBlb2YgaSA9PSAibnVtYmVyIiB8fCB0eXBlb2YgaSA9PSAiYmlnaW50IikgJiYgKGUgPSBsMy5ibG9ja2VkU2VnbWVudCwgZSAhPT0gbnVsbCAmJiAoZS5sYXN0UHVzaGVkVGV4dCA9IHJ0KGUuY2h1bmtzLCAiIiArIGksIG4yLnJlbmRlclN0YXRlLCBlLmxhc3RQdXNoZWRUZXh0KSkpOwogICAgfQogIH0KICBmdW5jdGlvbiBWaShuMiwgbDMsIGksIGUpIHsKICAgIHZhciB0ID0gbDMua2V5UGF0aDsKICAgIGlmIChlICE9PSAtMSAmJiAobDMua2V5UGF0aCA9IFsKICAgICAgbDMua2V5UGF0aCwKICAgICAgIkZyYWdtZW50IiwKICAgICAgZQogICAgXSwgbDMucmVwbGF5ICE9PSBudWxsKSkgewogICAgICBmb3IgKHZhciByID0gbDMucmVwbGF5LCBhID0gci5ub2RlcywgYzIgPSAwOyBjMiA8IGEubGVuZ3RoOyBjMisrKSB7CiAgICAgICAgdmFyIHUyID0gYVtjMl07CiAgICAgICAgaWYgKHUyWzFdID09PSBlKSB7CiAgICAgICAgICBlID0gdTJbMl0sIHUyID0gdTJbM10sIGwzLnJlcGxheSA9IHsKICAgICAgICAgICAgbm9kZXM6IGUsCiAgICAgICAgICAgIHNsb3RzOiB1MiwKICAgICAgICAgICAgcGVuZGluZ1Rhc2tzOiAxCiAgICAgICAgICB9OwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKFZpKG4yLCBsMywgaSwgLTEpLCBsMy5yZXBsYXkucGVuZGluZ1Rhc2tzID09PSAxICYmIDAgPCBsMy5yZXBsYXkubm9kZXMubGVuZ3RoKSB0aHJvdyBFcnJvcihzKDQ4OCkpOwogICAgICAgICAgICBsMy5yZXBsYXkucGVuZGluZ1Rhc2tzLS07CiAgICAgICAgICB9IGNhdGNoIChvKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgbyA9PSAib2JqZWN0IiAmJiBvICE9PSBudWxsICYmIChvID09PSBWMiB8fCB0eXBlb2Ygby50aGVuID09ICJmdW5jdGlvbiIpKSB0aHJvdyBvOwogICAgICAgICAgICBsMy5yZXBsYXkucGVuZGluZ1Rhc2tzLS0sIGkgPSBUbihsMy5jb21wb25lbnRTdGFjayk7CiAgICAgICAgICAgIHZhciBoID0gbDMuYmxvY2tlZEJvdW5kYXJ5LCBmMiA9IG87CiAgICAgICAgICAgIGkgPSBHMyhuMiwgZjIsIGkpLCBfbChuMiwgaCwgZSwgdTIsIGYyLCBpKTsKICAgICAgICAgIH0KICAgICAgICAgIGwzLnJlcGxheSA9IHIsIGEuc3BsaWNlKGMyLCAxKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBsMy5rZXlQYXRoID0gdDsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHIgPSBsMy50cmVlQ29udGV4dCwgYSA9IGkubGVuZ3RoLCBsMy5yZXBsYXkgIT09IG51bGwgJiYgKGMyID0gbDMucmVwbGF5LnNsb3RzLCBjMiAhPT0gbnVsbCAmJiB0eXBlb2YgYzIgPT0gIm9iamVjdCIpKSB7CiAgICAgIGZvciAoZSA9IDA7IGUgPCBhOyBlKyspIHUyID0gaVtlXSwgbDMudHJlZUNvbnRleHQgPSBNbihyLCBhLCBlKSwgaCA9IGMyW2VdLCB0eXBlb2YgaCA9PSAibnVtYmVyIiA/IChnaShuMiwgbDMsIGgsIHUyLCBlKSwgZGVsZXRlIGMyW2VdKSA6IEwyKG4yLCBsMywgdTIsIGUpOwogICAgICBsMy50cmVlQ29udGV4dCA9IHIsIGwzLmtleVBhdGggPSB0OwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGMyID0gMDsgYzIgPCBhOyBjMisrKSBlID0gaVtjMl0sIGwzLnRyZWVDb250ZXh0ID0gTW4ociwgYSwgYzIpLCBMMihuMiwgbDMsIGUsIGMyKTsKICAgIGwzLnRyZWVDb250ZXh0ID0gciwgbDMua2V5UGF0aCA9IHQ7CiAgfQogIGZ1bmN0aW9uIG10KG4yLCBsMywgaSkgewogICAgaWYgKGkuc3RhdHVzID0gNSwgaS5yb290U2VnbWVudElEID0gbjIubmV4dFNlZ21lbnRJZCsrLCBuMiA9IGkudHJhY2tlZENvbnRlbnRLZXlQYXRoLCBuMiA9PT0gbnVsbCkgdGhyb3cgRXJyb3Iocyg0ODYpKTsKICAgIHZhciBlID0gaS50cmFja2VkRmFsbGJhY2tOb2RlLCB0ID0gW10sIHIgPSBsMy53b3JraW5nTWFwLmdldChuMik7CiAgICByZXR1cm4gciA9PT0gdm9pZCAwID8gKGkgPSBbCiAgICAgIG4yWzFdLAogICAgICBuMlsyXSwKICAgICAgdCwKICAgICAgbnVsbCwKICAgICAgZSwKICAgICAgaS5yb290U2VnbWVudElECiAgICBdLCBsMy53b3JraW5nTWFwLnNldChuMiwgaSksIGhpKGksIG4yWzBdLCBsMyksIGkpIDogKHJbNF0gPSBlLCByWzVdID0gaS5yb290U2VnbWVudElELCByKTsKICB9CiAgZnVuY3Rpb24gS2kobjIsIGwzLCBpLCBlKSB7CiAgICBlLnN0YXR1cyA9IDU7CiAgICB2YXIgdCA9IGkua2V5UGF0aCwgciA9IGkuYmxvY2tlZEJvdW5kYXJ5OwogICAgaWYgKHIgPT09IG51bGwpIGUuaWQgPSBuMi5uZXh0U2VnbWVudElkKyssIGwzLnJvb3RTbG90cyA9IGUuaWQsIG4yLmNvbXBsZXRlZFJvb3RTZWdtZW50ICE9PSBudWxsICYmIChuMi5jb21wbGV0ZWRSb290U2VnbWVudC5zdGF0dXMgPSA1KTsKICAgIGVsc2UgewogICAgICBpZiAociAhPT0gbnVsbCAmJiByLnN0YXR1cyA9PT0gMCkgewogICAgICAgIHZhciBhID0gbXQobjIsIGwzLCByKTsKICAgICAgICBpZiAoci50cmFja2VkQ29udGVudEtleVBhdGggPT09IHQgJiYgaS5jaGlsZEluZGV4ID09PSAtMSkgewogICAgICAgICAgZS5pZCA9PT0gLTEgJiYgKGUuaWQgPSBlLnBhcmVudEZsdXNoZWQgPyByLnJvb3RTZWdtZW50SUQgOiBuMi5uZXh0U2VnbWVudElkKyspLCBhWzNdID0gZS5pZDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGUuaWQgPT09IC0xICYmIChlLmlkID0gZS5wYXJlbnRGbHVzaGVkICYmIHIgIT09IG51bGwgPyByLnJvb3RTZWdtZW50SUQgOiBuMi5uZXh0U2VnbWVudElkKyspLCBpLmNoaWxkSW5kZXggPT09IC0xKSB0ID09PSBudWxsID8gbDMucm9vdFNsb3RzID0gZS5pZCA6IChpID0gbDMud29ya2luZ01hcC5nZXQodCksIGkgPT09IHZvaWQgMCA/IChpID0gWwogICAgICAgIHRbMV0sCiAgICAgICAgdFsyXSwKICAgICAgICBbXSwKICAgICAgICBlLmlkCiAgICAgIF0sIGhpKGksIHRbMF0sIGwzKSkgOiBpWzNdID0gZS5pZCk7CiAgICAgIGVsc2UgewogICAgICAgIGlmICh0ID09PSBudWxsKSB7CiAgICAgICAgICBpZiAobjIgPSBsMy5yb290U2xvdHMsIG4yID09PSBudWxsKSBuMiA9IGwzLnJvb3RTbG90cyA9IHt9OwogICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG4yID09ICJudW1iZXIiKSB0aHJvdyBFcnJvcihzKDQ5MSkpOwogICAgICAgIH0gZWxzZSBpZiAociA9IGwzLndvcmtpbmdNYXAsIGEgPSByLmdldCh0KSwgYSA9PT0gdm9pZCAwKSBuMiA9IHt9LCBhID0gWwogICAgICAgICAgdFsxXSwKICAgICAgICAgIHRbMl0sCiAgICAgICAgICBbXSwKICAgICAgICAgIG4yCiAgICAgICAgXSwgci5zZXQodCwgYSksIGhpKGEsIHRbMF0sIGwzKTsKICAgICAgICBlbHNlIGlmIChuMiA9IGFbM10sIG4yID09PSBudWxsKSBuMiA9IGFbM10gPSB7fTsKICAgICAgICBlbHNlIGlmICh0eXBlb2YgbjIgPT0gIm51bWJlciIpIHRocm93IEVycm9yKHMoNDkxKSk7CiAgICAgICAgbjJbaS5jaGlsZEluZGV4XSA9IGUuaWQ7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gaGUyKG4yLCBsMykgewogICAgbjIgPSBuMi50cmFja2VkUG9zdHBvbmVzLCBuMiAhPT0gbnVsbCAmJiAobDMgPSBsMy50cmFja2VkQ29udGVudEtleVBhdGgsIGwzICE9PSBudWxsICYmIChsMyA9IG4yLndvcmtpbmdNYXAuZ2V0KGwzKSwgbDMgIT09IHZvaWQgMCAmJiAobDMubGVuZ3RoID0gNCwgbDNbMl0gPSBbXSwgbDNbM10gPSBudWxsKSkpOwogIH0KICBmdW5jdGlvbiB5dChuMiwgbDMsIGkpIHsKICAgIHJldHVybiBLdChuMiwgaSwgbDMucmVwbGF5LCBsMy5ub2RlLCBsMy5jaGlsZEluZGV4LCBsMy5ibG9ja2VkQm91bmRhcnksIGwzLmhvaXN0YWJsZVN0YXRlLCBsMy5hYm9ydFNldCwgbDMua2V5UGF0aCwgbDMuZm9ybWF0Q29udGV4dCwgbDMuY29udGV4dCwgbDMudHJlZUNvbnRleHQsIGwzLnJvdywgbDMuY29tcG9uZW50U3RhY2spOwogIH0KICBmdW5jdGlvbiBUdChuMiwgbDMsIGkpIHsKICAgIHZhciBlID0gbDMuYmxvY2tlZFNlZ21lbnQsIHQgPSBTbihuMiwgZS5jaHVua3MubGVuZ3RoLCBudWxsLCBsMy5mb3JtYXRDb250ZXh0LCBlLmxhc3RQdXNoZWRUZXh0LCB0cnVlKTsKICAgIHJldHVybiBlLmNoaWxkcmVuLnB1c2godCksIGUubGFzdFB1c2hlZFRleHQgPSBmYWxzZSwgcmkobjIsIGksIGwzLm5vZGUsIGwzLmNoaWxkSW5kZXgsIGwzLmJsb2NrZWRCb3VuZGFyeSwgdCwgbDMuYmxvY2tlZFByZWFtYmxlLCBsMy5ob2lzdGFibGVTdGF0ZSwgbDMuYWJvcnRTZXQsIGwzLmtleVBhdGgsIGwzLmZvcm1hdENvbnRleHQsIGwzLmNvbnRleHQsIGwzLnRyZWVDb250ZXh0LCBsMy5yb3csIGwzLmNvbXBvbmVudFN0YWNrKTsKICB9CiAgZnVuY3Rpb24gTDIobjIsIGwzLCBpLCBlKSB7CiAgICB2YXIgdCA9IGwzLmZvcm1hdENvbnRleHQsIHIgPSBsMy5jb250ZXh0LCBhID0gbDMua2V5UGF0aCwgYzIgPSBsMy50cmVlQ29udGV4dCwgdTIgPSBsMy5jb21wb25lbnRTdGFjaywgaCA9IGwzLmJsb2NrZWRTZWdtZW50OwogICAgaWYgKGggPT09IG51bGwpIHsKICAgICAgaCA9IGwzLnJlcGxheTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gbTIobjIsIGwzLCBpLCBlKTsKICAgICAgfSBjYXRjaCAoZDMpIHsKICAgICAgICBpZiAoRWwoKSwgaSA9IGQzID09PSBWMiA/IGlpKCkgOiBkMywgbjIuc3RhdHVzICE9PSAxMiAmJiB0eXBlb2YgaSA9PSAib2JqZWN0IiAmJiBpICE9PSBudWxsKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGkudGhlbiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGUgPSBkMyA9PT0gVjIgPyBZbigpIDogbnVsbCwgbjIgPSB5dChuMiwgbDMsIGUpLnBpbmcsIGkudGhlbihuMiwgbjIpLCBsMy5mb3JtYXRDb250ZXh0ID0gdCwgbDMuY29udGV4dCA9IHIsIGwzLmtleVBhdGggPSBhLCBsMy50cmVlQ29udGV4dCA9IGMyLCBsMy5jb21wb25lbnRTdGFjayA9IHUyLCBsMy5yZXBsYXkgPSBoLCB2bihyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGkubWVzc2FnZSA9PT0gIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkIikgewogICAgICAgICAgICBpID0gZDMgPT09IFYyID8gWW4oKSA6IG51bGwsIGkgPSB5dChuMiwgbDMsIGkpLCBuMi5waW5nZWRUYXNrcy5wdXNoKGkpLCBsMy5mb3JtYXRDb250ZXh0ID0gdCwgbDMuY29udGV4dCA9IHIsIGwzLmtleVBhdGggPSBhLCBsMy50cmVlQ29udGV4dCA9IGMyLCBsMy5jb21wb25lbnRTdGFjayA9IHUyLCBsMy5yZXBsYXkgPSBoLCB2bihyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGYyID0gaC5jaGlsZHJlbi5sZW5ndGgsIG8gPSBoLmNodW5rcy5sZW5ndGg7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIG0yKG4yLCBsMywgaSwgZSk7CiAgICAgIH0gY2F0Y2ggKGQzKSB7CiAgICAgICAgaWYgKEVsKCksIGguY2hpbGRyZW4ubGVuZ3RoID0gZjIsIGguY2h1bmtzLmxlbmd0aCA9IG8sIGkgPSBkMyA9PT0gVjIgPyBpaSgpIDogZDMsIG4yLnN0YXR1cyAhPT0gMTIgJiYgdHlwZW9mIGkgPT0gIm9iamVjdCIgJiYgaSAhPT0gbnVsbCkgewogICAgICAgICAgaWYgKHR5cGVvZiBpLnRoZW4gPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBoID0gaSwgaSA9IGQzID09PSBWMiA/IFluKCkgOiBudWxsLCBuMiA9IFR0KG4yLCBsMywgaSkucGluZywgaC50aGVuKG4yLCBuMiksIGwzLmZvcm1hdENvbnRleHQgPSB0LCBsMy5jb250ZXh0ID0gciwgbDMua2V5UGF0aCA9IGEsIGwzLnRyZWVDb250ZXh0ID0gYzIsIGwzLmNvbXBvbmVudFN0YWNrID0gdTIsIHZuKHIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaS5tZXNzYWdlID09PSAiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWQiKSB7CiAgICAgICAgICAgIGggPSBkMyA9PT0gVjIgPyBZbigpIDogbnVsbCwgaCA9IFR0KG4yLCBsMywgaCksIG4yLnBpbmdlZFRhc2tzLnB1c2goaCksIGwzLmZvcm1hdENvbnRleHQgPSB0LCBsMy5jb250ZXh0ID0gciwgbDMua2V5UGF0aCA9IGEsIGwzLnRyZWVDb250ZXh0ID0gYzIsIGwzLmNvbXBvbmVudFN0YWNrID0gdTIsIHZuKHIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aHJvdyBsMy5mb3JtYXRDb250ZXh0ID0gdCwgbDMuY29udGV4dCA9IHIsIGwzLmtleVBhdGggPSBhLCBsMy50cmVlQ29udGV4dCA9IGMyLCB2bihyKSwgaTsKICB9CiAgZnVuY3Rpb24gRmEobjIpIHsKICAgIHZhciBsMyA9IG4yLmJsb2NrZWRCb3VuZGFyeSwgaSA9IG4yLmJsb2NrZWRTZWdtZW50OwogICAgaSAhPT0gbnVsbCAmJiAoaS5zdGF0dXMgPSAzLCBFbih0aGlzLCBsMywgbjIucm93LCBpKSk7CiAgfQogIGZ1bmN0aW9uIF9sKG4yLCBsMywgaSwgZSwgdCwgcikgewogICAgZm9yICh2YXIgYSA9IDA7IGEgPCBpLmxlbmd0aDsgYSsrKSB7CiAgICAgIHZhciBjMiA9IGlbYV07CiAgICAgIGlmIChjMi5sZW5ndGggPT09IDQpIF9sKG4yLCBsMywgYzJbMl0sIGMyWzNdLCB0LCByKTsKICAgICAgZWxzZSB7CiAgICAgICAgYzIgPSBjMls1XTsKICAgICAgICB2YXIgdTIgPSBuMiwgaCA9IHIsIGYyID0gYWUyKHUyLCBudWxsLCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCBudWxsLCBudWxsKTsKICAgICAgICBmMi5wYXJlbnRGbHVzaGVkID0gdHJ1ZSwgZjIucm9vdFNlZ21lbnRJRCA9IGMyLCBmMi5zdGF0dXMgPSA0LCBmMi5lcnJvckRpZ2VzdCA9IGgsIGYyLnBhcmVudEZsdXNoZWQgJiYgdTIuY2xpZW50UmVuZGVyZWRCb3VuZGFyaWVzLnB1c2goZjIpOwogICAgICB9CiAgICB9CiAgICBpZiAoaS5sZW5ndGggPSAwLCBlICE9PSBudWxsKSB7CiAgICAgIGlmIChsMyA9PT0gbnVsbCkgdGhyb3cgRXJyb3Iocyg0ODcpKTsKICAgICAgaWYgKGwzLnN0YXR1cyAhPT0gNCAmJiAobDMuc3RhdHVzID0gNCwgbDMuZXJyb3JEaWdlc3QgPSByLCBsMy5wYXJlbnRGbHVzaGVkICYmIG4yLmNsaWVudFJlbmRlcmVkQm91bmRhcmllcy5wdXNoKGwzKSksIHR5cGVvZiBlID09ICJvYmplY3QiKSBmb3IgKHZhciBvIGluIGUpIGRlbGV0ZSBlW29dOwogICAgfQogIH0KICBmdW5jdGlvbiBtaShuMiwgbDMsIGkpIHsKICAgIHZhciBlID0gbjIuYmxvY2tlZEJvdW5kYXJ5LCB0ID0gbjIuYmxvY2tlZFNlZ21lbnQ7CiAgICBpZiAodCAhPT0gbnVsbCkgewogICAgICBpZiAodC5zdGF0dXMgPT09IDYpIHJldHVybjsKICAgICAgdC5zdGF0dXMgPSAzOwogICAgfQogICAgdmFyIHIgPSBUbihuMi5jb21wb25lbnRTdGFjayk7CiAgICBpZiAoZSA9PT0gbnVsbCkgewogICAgICBpZiAobDMuc3RhdHVzICE9PSAxMyAmJiBsMy5zdGF0dXMgIT09IDE0KSB7CiAgICAgICAgaWYgKGUgPSBuMi5yZXBsYXksIGUgPT09IG51bGwpIHsKICAgICAgICAgIGwzLnRyYWNrZWRQb3N0cG9uZXMgIT09IG51bGwgJiYgdCAhPT0gbnVsbCA/IChlID0gbDMudHJhY2tlZFBvc3Rwb25lcywgRzMobDMsIGksIHIpLCBLaShsMywgZSwgbjIsIHQpLCBFbihsMywgbnVsbCwgbjIucm93LCB0KSkgOiAoRzMobDMsIGksIHIpLCBSbChsMywgaSkpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlLnBlbmRpbmdUYXNrcy0tLCBlLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiAwIDwgZS5ub2Rlcy5sZW5ndGggJiYgKHQgPSBHMyhsMywgaSwgciksIF9sKGwzLCBudWxsLCBlLm5vZGVzLCBlLnNsb3RzLCBpLCB0KSksIGwzLnBlbmRpbmdSb290VGFza3MtLSwgbDMucGVuZGluZ1Jvb3RUYXNrcyA9PT0gMCAmJiBmZShsMyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBhID0gbDMudHJhY2tlZFBvc3Rwb25lczsKICAgICAgaWYgKGUuc3RhdHVzICE9PSA0KSB7CiAgICAgICAgaWYgKGEgIT09IG51bGwgJiYgdCAhPT0gbnVsbCkgcmV0dXJuIEczKGwzLCBpLCByKSwgS2kobDMsIGEsIG4yLCB0KSwgZS5mYWxsYmFja0Fib3J0YWJsZVRhc2tzLmZvckVhY2goZnVuY3Rpb24oYzIpIHsKICAgICAgICAgIHJldHVybiBtaShjMiwgbDMsIGkpOwogICAgICAgIH0pLCBlLmZhbGxiYWNrQWJvcnRhYmxlVGFza3MuY2xlYXIoKSwgRW4obDMsIGUsIG4yLnJvdywgdCk7CiAgICAgICAgZS5zdGF0dXMgPSA0LCB0ID0gRzMobDMsIGksIHIpLCBlLnN0YXR1cyA9IDQsIGUuZXJyb3JEaWdlc3QgPSB0LCBoZTIobDMsIGUpLCBlLnBhcmVudEZsdXNoZWQgJiYgbDMuY2xpZW50UmVuZGVyZWRCb3VuZGFyaWVzLnB1c2goZSk7CiAgICAgIH0KICAgICAgZS5wZW5kaW5nVGFza3MtLSwgdCA9IGUucm93LCB0ICE9PSBudWxsICYmIC0tdC5wZW5kaW5nVGFza3MgPT09IDAgJiYgWChsMywgdCksIGUuZmFsbGJhY2tBYm9ydGFibGVUYXNrcy5mb3JFYWNoKGZ1bmN0aW9uKGMyKSB7CiAgICAgICAgcmV0dXJuIG1pKGMyLCBsMywgaSk7CiAgICAgIH0pLCBlLmZhbGxiYWNrQWJvcnRhYmxlVGFza3MuY2xlYXIoKTsKICAgIH0KICAgIG4yID0gbjIucm93LCBuMiAhPT0gbnVsbCAmJiAtLW4yLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBYKGwzLCBuMiksIGwzLmFsbFBlbmRpbmdUYXNrcy0tLCBsMy5hbGxQZW5kaW5nVGFza3MgPT09IDAgJiYgdWkobDMpOwogIH0KICBmdW5jdGlvbiBjZShuMiwgbDMpIHsKICAgIHRyeSB7CiAgICAgIHZhciBpID0gbjIucmVuZGVyU3RhdGUsIGUgPSBpLm9uSGVhZGVyczsKICAgICAgaWYgKGUpIHsKICAgICAgICB2YXIgdCA9IGkuaGVhZGVyczsKICAgICAgICBpZiAodCkgewogICAgICAgICAgaS5oZWFkZXJzID0gbnVsbDsKICAgICAgICAgIHZhciByID0gdC5wcmVjb25uZWN0czsKICAgICAgICAgIGlmICh0LmZvbnRQcmVsb2FkcyAmJiAociAmJiAociArPSAiLCAiKSwgciArPSB0LmZvbnRQcmVsb2FkcyksIHQuaGlnaEltYWdlUHJlbG9hZHMgJiYgKHIgJiYgKHIgKz0gIiwgIiksIHIgKz0gdC5oaWdoSW1hZ2VQcmVsb2FkcyksICFsMykgewogICAgICAgICAgICB2YXIgYSA9IGkuc3R5bGVzLnZhbHVlcygpLCBjMiA9IGEubmV4dCgpOwogICAgICAgICAgICBuOiBmb3IgKDsgMCA8IHQucmVtYWluaW5nQ2FwYWNpdHkgJiYgIWMyLmRvbmU7IGMyID0gYS5uZXh0KCkpIGZvciAodmFyIHUyID0gYzIudmFsdWUuc2hlZXRzLnZhbHVlcygpLCBoID0gdTIubmV4dCgpOyAwIDwgdC5yZW1haW5pbmdDYXBhY2l0eSAmJiAhaC5kb25lOyBoID0gdTIubmV4dCgpKSB7CiAgICAgICAgICAgICAgdmFyIGYyID0gaC52YWx1ZSwgbyA9IGYyLnByb3BzLCBkMyA9IG8uaHJlZiwgZyA9IGYyLnByb3BzLCBFNCA9IG5pKGcuaHJlZiwgInN0eWxlIiwgewogICAgICAgICAgICAgICAgY3Jvc3NPcmlnaW46IGcuY3Jvc3NPcmlnaW4sCiAgICAgICAgICAgICAgICBpbnRlZ3JpdHk6IGcuaW50ZWdyaXR5LAogICAgICAgICAgICAgICAgbm9uY2U6IGcubm9uY2UsCiAgICAgICAgICAgICAgICB0eXBlOiBnLnR5cGUsCiAgICAgICAgICAgICAgICBmZXRjaFByaW9yaXR5OiBnLmZldGNoUHJpb3JpdHksCiAgICAgICAgICAgICAgICByZWZlcnJlclBvbGljeTogZy5yZWZlcnJlclBvbGljeSwKICAgICAgICAgICAgICAgIG1lZGlhOiBnLm1lZGlhCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgaWYgKDAgPD0gKHQucmVtYWluaW5nQ2FwYWNpdHkgLT0gRTQubGVuZ3RoICsgMikpIGkucmVzZXRzLnN0eWxlW2QzXSA9IEsyLCByICYmIChyICs9ICIsICIpLCByICs9IEU0LCBpLnJlc2V0cy5zdHlsZVtkM10gPSB0eXBlb2Ygby5jcm9zc09yaWdpbiA9PSAic3RyaW5nIiB8fCB0eXBlb2Ygby5pbnRlZ3JpdHkgPT0gInN0cmluZyIgPyBbCiAgICAgICAgICAgICAgICBvLmNyb3NzT3JpZ2luLAogICAgICAgICAgICAgICAgby5pbnRlZ3JpdHkKICAgICAgICAgICAgICBdIDogSzI7CiAgICAgICAgICAgICAgZWxzZSBicmVhayBuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlKHIgPyB7CiAgICAgICAgICAgIExpbms6IHIKICAgICAgICAgIH0gOiB7fSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoICh5MikgewogICAgICBHMyhuMiwgeTIsIHt9KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZmUobjIpIHsKICAgIG4yLnRyYWNrZWRQb3N0cG9uZXMgPT09IG51bGwgJiYgY2UobjIsIHRydWUpLCBuMi50cmFja2VkUG9zdHBvbmVzID09PSBudWxsICYmIEFsKG4yKSwgbjIub25TaGVsbEVycm9yID0gWiwgbjIgPSBuMi5vblNoZWxsUmVhZHksIG4yKCk7CiAgfQogIGZ1bmN0aW9uIHVpKG4yKSB7CiAgICBjZShuMiwgbjIudHJhY2tlZFBvc3Rwb25lcyA9PT0gbnVsbCA/IHRydWUgOiBuMi5jb21wbGV0ZWRSb290U2VnbWVudCA9PT0gbnVsbCB8fCBuMi5jb21wbGV0ZWRSb290U2VnbWVudC5zdGF0dXMgIT09IDUpLCBBbChuMiksIG4yID0gbjIub25BbGxSZWFkeSwgbjIoKTsKICB9CiAgZnVuY3Rpb24gd2wobjIsIGwzKSB7CiAgICBpZiAobDMuY2h1bmtzLmxlbmd0aCA9PT0gMCAmJiBsMy5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgbDMuY2hpbGRyZW5bMF0uYm91bmRhcnkgPT09IG51bGwgJiYgbDMuY2hpbGRyZW5bMF0uaWQgPT09IC0xKSB7CiAgICAgIHZhciBpID0gbDMuY2hpbGRyZW5bMF07CiAgICAgIGkuaWQgPSBsMy5pZCwgaS5wYXJlbnRGbHVzaGVkID0gdHJ1ZSwgaS5zdGF0dXMgIT09IDEgJiYgaS5zdGF0dXMgIT09IDMgJiYgaS5zdGF0dXMgIT09IDQgfHwgd2wobjIsIGkpOwogICAgfSBlbHNlIG4yLmNvbXBsZXRlZFNlZ21lbnRzLnB1c2gobDMpOwogIH0KICBmdW5jdGlvbiBFbihuMiwgbDMsIGksIGUpIHsKICAgIGlmIChpICE9PSBudWxsICYmICgtLWkucGVuZGluZ1Rhc2tzID09PSAwID8gWChuMiwgaSkgOiBpLnRvZ2V0aGVyICYmIEppKG4yLCBpKSksIG4yLmFsbFBlbmRpbmdUYXNrcy0tLCBsMyA9PT0gbnVsbCkgewogICAgICBpZiAoZSAhPT0gbnVsbCAmJiBlLnBhcmVudEZsdXNoZWQpIHsKICAgICAgICBpZiAobjIuY29tcGxldGVkUm9vdFNlZ21lbnQgIT09IG51bGwpIHRocm93IEVycm9yKHMoMzg5KSk7CiAgICAgICAgbjIuY29tcGxldGVkUm9vdFNlZ21lbnQgPSBlOwogICAgICB9CiAgICAgIG4yLnBlbmRpbmdSb290VGFza3MtLSwgbjIucGVuZGluZ1Jvb3RUYXNrcyA9PT0gMCAmJiBmZShuMik7CiAgICB9IGVsc2UgaWYgKGwzLnBlbmRpbmdUYXNrcy0tLCBsMy5zdGF0dXMgIT09IDQpIGlmIChsMy5wZW5kaW5nVGFza3MgPT09IDApIHsKICAgICAgaWYgKGwzLnN0YXR1cyA9PT0gMCAmJiAobDMuc3RhdHVzID0gMSksIGUgIT09IG51bGwgJiYgZS5wYXJlbnRGbHVzaGVkICYmIChlLnN0YXR1cyA9PT0gMSB8fCBlLnN0YXR1cyA9PT0gMykgJiYgd2wobDMsIGUpLCBsMy5wYXJlbnRGbHVzaGVkICYmIG4yLmNvbXBsZXRlZEJvdW5kYXJpZXMucHVzaChsMyksIGwzLnN0YXR1cyA9PT0gMSkgaSA9IGwzLnJvdywgaSAhPT0gbnVsbCAmJiBabihpLmhvaXN0YWJsZXMsIGwzLmNvbnRlbnRTdGF0ZSksIEpuKG4yLCBsMykgfHwgKGwzLmZhbGxiYWNrQWJvcnRhYmxlVGFza3MuZm9yRWFjaChGYSwgbjIpLCBsMy5mYWxsYmFja0Fib3J0YWJsZVRhc2tzLmNsZWFyKCksIGkgIT09IG51bGwgJiYgLS1pLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBYKG4yLCBpKSksIG4yLnBlbmRpbmdSb290VGFza3MgPT09IDAgJiYgbjIudHJhY2tlZFBvc3Rwb25lcyA9PT0gbnVsbCAmJiBsMy5jb250ZW50UHJlYW1ibGUgIT09IG51bGwgJiYgQWwobjIpOwogICAgICBlbHNlIGlmIChsMy5zdGF0dXMgPT09IDUgJiYgKGwzID0gbDMucm93LCBsMyAhPT0gbnVsbCkpIHsKICAgICAgICBpZiAobjIudHJhY2tlZFBvc3Rwb25lcyAhPT0gbnVsbCkgewogICAgICAgICAgaSA9IG4yLnRyYWNrZWRQb3N0cG9uZXM7CiAgICAgICAgICB2YXIgdCA9IGwzLm5leHQ7CiAgICAgICAgICBpZiAodCAhPT0gbnVsbCAmJiAoZSA9IHQuYm91bmRhcmllcywgZSAhPT0gbnVsbCkpIGZvciAodC5ib3VuZGFyaWVzID0gbnVsbCwgdCA9IDA7IHQgPCBlLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgIHZhciByID0gZVt0XTsKICAgICAgICAgICAgbXQobjIsIGksIHIpLCBFbihuMiwgciwgbnVsbCwgbnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC0tbDMucGVuZGluZ1Rhc2tzID09PSAwICYmIFgobjIsIGwzKTsKICAgICAgfQogICAgfSBlbHNlIGUgPT09IG51bGwgfHwgIWUucGFyZW50Rmx1c2hlZCB8fCBlLnN0YXR1cyAhPT0gMSAmJiBlLnN0YXR1cyAhPT0gMyB8fCAod2wobDMsIGUpLCBsMy5jb21wbGV0ZWRTZWdtZW50cy5sZW5ndGggPT09IDEgJiYgbDMucGFyZW50Rmx1c2hlZCAmJiBuMi5wYXJ0aWFsQm91bmRhcmllcy5wdXNoKGwzKSksIGwzID0gbDMucm93LCBsMyAhPT0gbnVsbCAmJiBsMy50b2dldGhlciAmJiBKaShuMiwgbDMpOwogICAgbjIuYWxsUGVuZGluZ1Rhc2tzID09PSAwICYmIHVpKG4yKTsKICB9CiAgZnVuY3Rpb24gcHQobjIpIHsKICAgIGlmIChuMi5zdGF0dXMgIT09IDE0ICYmIG4yLnN0YXR1cyAhPT0gMTMpIHsKICAgICAgdmFyIGwzID0gSW4sIGkgPSBIbi5IOwogICAgICBIbi5IID0gZHQ7CiAgICAgIHZhciBlID0gSG4uQTsKICAgICAgSG4uQSA9IHhhOwogICAgICB2YXIgdCA9IHozOwogICAgICB6MyA9IG4yOwogICAgICB2YXIgciA9IG1sOwogICAgICBtbCA9IG4yLnJlc3VtYWJsZVN0YXRlOwogICAgICB0cnkgewogICAgICAgIHZhciBhID0gbjIucGluZ2VkVGFza3MsIGMyOwogICAgICAgIGZvciAoYzIgPSAwOyBjMiA8IGEubGVuZ3RoOyBjMisrKSB7CiAgICAgICAgICB2YXIgdTIgPSBhW2MyXSwgaCA9IG4yLCBmMiA9IHUyLmJsb2NrZWRTZWdtZW50OwogICAgICAgICAgaWYgKGYyID09PSBudWxsKSB7CiAgICAgICAgICAgIHZhciBvID0gaDsKICAgICAgICAgICAgaWYgKHUyLnJlcGxheS5wZW5kaW5nVGFza3MgIT09IDApIHsKICAgICAgICAgICAgICB2bih1Mi5jb250ZXh0KTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1Mi5yZXBsYXkuc2xvdHMgPT0gIm51bWJlciIgPyBnaShvLCB1MiwgdTIucmVwbGF5LnNsb3RzLCB1Mi5ub2RlLCB1Mi5jaGlsZEluZGV4KSA6IFFpKG8sIHUyKSwgdTIucmVwbGF5LnBlbmRpbmdUYXNrcyA9PT0gMSAmJiAwIDwgdTIucmVwbGF5Lm5vZGVzLmxlbmd0aCkgdGhyb3cgRXJyb3Iocyg0ODgpKTsKICAgICAgICAgICAgICAgIHUyLnJlcGxheS5wZW5kaW5nVGFza3MtLSwgdTIuYWJvcnRTZXQuZGVsZXRlKHUyKSwgRW4obywgdTIuYmxvY2tlZEJvdW5kYXJ5LCB1Mi5yb3csIG51bGwpOwogICAgICAgICAgICAgIH0gY2F0Y2ggKFMzKSB7CiAgICAgICAgICAgICAgICBFbCgpOwogICAgICAgICAgICAgICAgdmFyIGQzID0gUzMgPT09IFYyID8gaWkoKSA6IFMzOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkMyA9PSAib2JqZWN0IiAmJiBkMyAhPT0gbnVsbCAmJiB0eXBlb2YgZDMudGhlbiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgIHZhciBnID0gdTIucGluZzsKICAgICAgICAgICAgICAgICAgZDMudGhlbihnLCBnKSwgdTIudGhlbmFibGVTdGF0ZSA9IFMzID09PSBWMiA/IFluKCkgOiBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdTIucmVwbGF5LnBlbmRpbmdUYXNrcy0tLCB1Mi5hYm9ydFNldC5kZWxldGUodTIpOwogICAgICAgICAgICAgICAgICB2YXIgRTQgPSBUbih1Mi5jb21wb25lbnRTdGFjayk7CiAgICAgICAgICAgICAgICAgIGggPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgIHZhciB5MiA9IG8sIGI0ID0gdTIuYmxvY2tlZEJvdW5kYXJ5LCB2MyA9IG8uc3RhdHVzID09PSAxMiA/IG8uZmF0YWxFcnJvciA6IGQzLCB4MyA9IHUyLnJlcGxheS5ub2RlcywgTTIgPSB1Mi5yZXBsYXkuc2xvdHM7CiAgICAgICAgICAgICAgICAgIGggPSBHMyh5MiwgdjMsIEU0KSwgX2woeTIsIGI0LCB4MywgTTIsIHYzLCBoKSwgby5wZW5kaW5nUm9vdFRhc2tzLS0sIG8ucGVuZGluZ1Jvb3RUYXNrcyA9PT0gMCAmJiBmZShvKSwgby5hbGxQZW5kaW5nVGFza3MtLSwgby5hbGxQZW5kaW5nVGFza3MgPT09IDAgJiYgdWkobyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKG8gPSB2b2lkIDAsIHkyID0gZjIsIHkyLnN0YXR1cyA9PT0gMCkgewogICAgICAgICAgICB5Mi5zdGF0dXMgPSA2LCB2bih1Mi5jb250ZXh0KTsKICAgICAgICAgICAgdmFyIFAgPSB5Mi5jaGlsZHJlbi5sZW5ndGgsIFIzID0geTIuY2h1bmtzLmxlbmd0aDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBRaShoLCB1MiksIHNsKHkyLmNodW5rcywgaC5yZW5kZXJTdGF0ZSwgeTIubGFzdFB1c2hlZFRleHQsIHkyLnRleHRFbWJlZGRlZCksIHUyLmFib3J0U2V0LmRlbGV0ZSh1MiksIHkyLnN0YXR1cyA9IDEsIEVuKGgsIHUyLmJsb2NrZWRCb3VuZGFyeSwgdTIucm93LCB5Mik7CiAgICAgICAgICAgIH0gY2F0Y2ggKFMzKSB7CiAgICAgICAgICAgICAgRWwoKSwgeTIuY2hpbGRyZW4ubGVuZ3RoID0gUCwgeTIuY2h1bmtzLmxlbmd0aCA9IFIzOwogICAgICAgICAgICAgIHZhciBGMiA9IFMzID09PSBWMiA/IGlpKCkgOiBoLnN0YXR1cyA9PT0gMTIgPyBoLmZhdGFsRXJyb3IgOiBTMzsKICAgICAgICAgICAgICBpZiAoaC5zdGF0dXMgPT09IDEyICYmIGgudHJhY2tlZFBvc3Rwb25lcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIGVuID0gaC50cmFja2VkUG9zdHBvbmVzLCAkMiA9IFRuKHUyLmNvbXBvbmVudFN0YWNrKTsKICAgICAgICAgICAgICAgIHUyLmFib3J0U2V0LmRlbGV0ZSh1MiksIEczKGgsIEYyLCAkMiksIEtpKGgsIGVuLCB1MiwgeTIpLCBFbihoLCB1Mi5ibG9ja2VkQm91bmRhcnksIHUyLnJvdywgeTIpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEYyID09ICJvYmplY3QiICYmIEYyICE9PSBudWxsICYmIHR5cGVvZiBGMi50aGVuID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIHkyLnN0YXR1cyA9IDAsIHUyLnRoZW5hYmxlU3RhdGUgPSBTMyA9PT0gVjIgPyBZbigpIDogbnVsbDsKICAgICAgICAgICAgICAgIHZhciB3MyA9IHUyLnBpbmc7CiAgICAgICAgICAgICAgICBGMi50aGVuKHczLCB3Myk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciB0biA9IFRuKHUyLmNvbXBvbmVudFN0YWNrKTsKICAgICAgICAgICAgICAgIHUyLmFib3J0U2V0LmRlbGV0ZSh1MiksIHkyLnN0YXR1cyA9IDQ7CiAgICAgICAgICAgICAgICB2YXIgQTMgPSB1Mi5ibG9ja2VkQm91bmRhcnksIEIyID0gdTIucm93OwogICAgICAgICAgICAgICAgaWYgKEIyICE9PSBudWxsICYmIC0tQjIucGVuZGluZ1Rhc2tzID09PSAwICYmIFgoaCwgQjIpLCBoLmFsbFBlbmRpbmdUYXNrcy0tLCBvID0gRzMoaCwgRjIsIHRuKSwgQTMgPT09IG51bGwpIFJsKGgsIEYyKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKEEzLnBlbmRpbmdUYXNrcy0tLCBBMy5zdGF0dXMgIT09IDQpIHsKICAgICAgICAgICAgICAgICAgQTMuc3RhdHVzID0gNCwgQTMuZXJyb3JEaWdlc3QgPSBvLCBoZTIoaCwgQTMpOwogICAgICAgICAgICAgICAgICB2YXIgSDIgPSBBMy5yb3c7CiAgICAgICAgICAgICAgICAgIEgyICE9PSBudWxsICYmIC0tSDIucGVuZGluZ1Rhc2tzID09PSAwICYmIFgoaCwgSDIpLCBBMy5wYXJlbnRGbHVzaGVkICYmIGguY2xpZW50UmVuZGVyZWRCb3VuZGFyaWVzLnB1c2goQTMpLCBoLnBlbmRpbmdSb290VGFza3MgPT09IDAgJiYgaC50cmFja2VkUG9zdHBvbmVzID09PSBudWxsICYmIEEzLmNvbnRlbnRQcmVhbWJsZSAhPT0gbnVsbCAmJiBBbChoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGguYWxsUGVuZGluZ1Rhc2tzID09PSAwICYmIHVpKGgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhLnNwbGljZSgwLCBjMiksIG4yLmRlc3RpbmF0aW9uICE9PSBudWxsICYmIHZpKG4yLCBuMi5kZXN0aW5hdGlvbik7CiAgICAgIH0gY2F0Y2ggKFMzKSB7CiAgICAgICAgRzMobjIsIFMzLCB7fSksIFJsKG4yLCBTMyk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgbWwgPSByLCBIbi5IID0gaSwgSG4uQSA9IGUsIGkgPT09IGR0ICYmIHZuKGwzKSwgejMgPSB0OwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIHppKG4yLCBsMywgaSkgewogICAgbDMucHJlYW1ibGVDaGlsZHJlbi5sZW5ndGggJiYgaS5wdXNoKGwzLnByZWFtYmxlQ2hpbGRyZW4pOwogICAgZm9yICh2YXIgZSA9IGZhbHNlLCB0ID0gMDsgdCA8IGwzLmNoaWxkcmVuLmxlbmd0aDsgdCsrKSBlID0gcXQobjIsIGwzLmNoaWxkcmVuW3RdLCBpKSB8fCBlOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHF0KG4yLCBsMywgaSkgewogICAgdmFyIGUgPSBsMy5ib3VuZGFyeTsKICAgIGlmIChlID09PSBudWxsKSByZXR1cm4gemkobjIsIGwzLCBpKTsKICAgIHZhciB0ID0gZS5jb250ZW50UHJlYW1ibGUsIHIgPSBlLmZhbGxiYWNrUHJlYW1ibGU7CiAgICBpZiAodCA9PT0gbnVsbCB8fCByID09PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBzd2l0Y2ggKGUuc3RhdHVzKSB7CiAgICAgIGNhc2UgMToKICAgICAgICBpZiAoZXQobjIucmVuZGVyU3RhdGUsIHQpLCBuMi5ieXRlU2l6ZSArPSBlLmJ5dGVTaXplLCBsMyA9IGUuY29tcGxldGVkU2VnbWVudHNbMF0sICFsMykgdGhyb3cgRXJyb3IocygzOTEpKTsKICAgICAgICByZXR1cm4gemkobjIsIGwzLCBpKTsKICAgICAgY2FzZSA1OgogICAgICAgIGlmIChuMi50cmFja2VkUG9zdHBvbmVzICE9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgY2FzZSA0OgogICAgICAgIGlmIChsMy5zdGF0dXMgPT09IDEpIHJldHVybiBldChuMi5yZW5kZXJTdGF0ZSwgciksIHppKG4yLCBsMywgaSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIGZ1bmN0aW9uIEFsKG4yKSB7CiAgICBpZiAobjIuY29tcGxldGVkUm9vdFNlZ21lbnQgJiYgbjIuY29tcGxldGVkUHJlYW1ibGVTZWdtZW50cyA9PT0gbnVsbCkgewogICAgICB2YXIgbDMgPSBbXSwgaSA9IG4yLmJ5dGVTaXplLCBlID0gcXQobjIsIG4yLmNvbXBsZXRlZFJvb3RTZWdtZW50LCBsMyksIHQgPSBuMi5yZW5kZXJTdGF0ZS5wcmVhbWJsZTsKICAgICAgZSA9PT0gZmFsc2UgfHwgdC5oZWFkQ2h1bmtzICYmIHQuYm9keUNodW5rcyA/IG4yLmNvbXBsZXRlZFByZWFtYmxlU2VnbWVudHMgPSBsMyA6IG4yLmJ5dGVTaXplID0gaTsKICAgIH0KICB9CiAgZnVuY3Rpb24gWGwobjIsIGwzLCBpLCBlKSB7CiAgICBzd2l0Y2ggKGkucGFyZW50Rmx1c2hlZCA9IHRydWUsIGkuc3RhdHVzKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBpLmlkID0gbjIubmV4dFNlZ21lbnRJZCsrOwogICAgICBjYXNlIDU6CiAgICAgICAgcmV0dXJuIGUgPSBpLmlkLCBpLmxhc3RQdXNoZWRUZXh0ID0gZmFsc2UsIGkudGV4dEVtYmVkZGVkID0gZmFsc2UsIG4yID0gbjIucmVuZGVyU3RhdGUsIGwzLnB1c2goJzx0ZW1wbGF0ZSBpZD0iJyksIGwzLnB1c2gobjIucGxhY2Vob2xkZXJQcmVmaXgpLCBuMiA9IGUudG9TdHJpbmcoMTYpLCBsMy5wdXNoKG4yKSwgbDMucHVzaCgnIj48L3RlbXBsYXRlPicpOwogICAgICBjYXNlIDE6CiAgICAgICAgaS5zdGF0dXMgPSAyOwogICAgICAgIHZhciB0ID0gdHJ1ZSwgciA9IGkuY2h1bmtzLCBhID0gMDsKICAgICAgICBpID0gaS5jaGlsZHJlbjsKICAgICAgICBmb3IgKHZhciBjMiA9IDA7IGMyIDwgaS5sZW5ndGg7IGMyKyspIHsKICAgICAgICAgIGZvciAodCA9IGlbYzJdOyBhIDwgdC5pbmRleDsgYSsrKSBsMy5wdXNoKHJbYV0pOwogICAgICAgICAgdCA9IEZsKG4yLCBsMywgdCwgZSk7CiAgICAgICAgfQogICAgICAgIGZvciAoOyBhIDwgci5sZW5ndGggLSAxOyBhKyspIGwzLnB1c2goclthXSk7CiAgICAgICAgcmV0dXJuIGEgPCByLmxlbmd0aCAmJiAodCA9IGwzLnB1c2goclthXSkpLCB0OwogICAgICBjYXNlIDM6CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgRXJyb3IocygzOTApKTsKICAgIH0KICB9CiAgdmFyIENsID0gMDsKICBmdW5jdGlvbiBGbChuMiwgbDMsIGksIGUpIHsKICAgIHZhciB0ID0gaS5ib3VuZGFyeTsKICAgIGlmICh0ID09PSBudWxsKSByZXR1cm4gWGwobjIsIGwzLCBpLCBlKTsKICAgIGlmICh0LnBhcmVudEZsdXNoZWQgPSB0cnVlLCB0LnN0YXR1cyA9PT0gNCkgewogICAgICB2YXIgciA9IHQucm93OwogICAgICByZXR1cm4gciAhPT0gbnVsbCAmJiAtLXIucGVuZGluZ1Rhc2tzID09PSAwICYmIFgobjIsIHIpLCBuMi5yZW5kZXJTdGF0ZS5nZW5lcmF0ZVN0YXRpY01hcmt1cCB8fCAodCA9IHQuZXJyb3JEaWdlc3QsIGwzLnB1c2goIjwhLS0kIS0tPiIpLCBsMy5wdXNoKCI8dGVtcGxhdGUiKSwgdCAmJiAobDMucHVzaCgnIGRhdGEtZGdzdD0iJyksIHQgPSBUMyh0KSwgbDMucHVzaCh0KSwgbDMucHVzaCgnIicpKSwgbDMucHVzaCgiPjwvdGVtcGxhdGU+IikpLCBYbChuMiwgbDMsIGksIGUpLCBuMiA9IG4yLnJlbmRlclN0YXRlLmdlbmVyYXRlU3RhdGljTWFya3VwID8gdHJ1ZSA6IGwzLnB1c2goIjwhLS0vJC0tPiIpLCBuMjsKICAgIH0KICAgIGlmICh0LnN0YXR1cyAhPT0gMSkgcmV0dXJuIHQuc3RhdHVzID09PSAwICYmICh0LnJvb3RTZWdtZW50SUQgPSBuMi5uZXh0U2VnbWVudElkKyspLCAwIDwgdC5jb21wbGV0ZWRTZWdtZW50cy5sZW5ndGggJiYgbjIucGFydGlhbEJvdW5kYXJpZXMucHVzaCh0KSwgdHQobDMsIG4yLnJlbmRlclN0YXRlLCB0LnJvb3RTZWdtZW50SUQpLCBlICYmIFpuKGUsIHQuZmFsbGJhY2tTdGF0ZSksIFhsKG4yLCBsMywgaSwgZSksIGwzLnB1c2goIjwhLS0vJC0tPiIpOwogICAgaWYgKCFwbCAmJiBKbihuMiwgdCkgJiYgQ2wgKyB0LmJ5dGVTaXplID4gbjIucHJvZ3Jlc3NpdmVDaHVua1NpemUpIHJldHVybiB0LnJvb3RTZWdtZW50SUQgPSBuMi5uZXh0U2VnbWVudElkKyssIG4yLmNvbXBsZXRlZEJvdW5kYXJpZXMucHVzaCh0KSwgdHQobDMsIG4yLnJlbmRlclN0YXRlLCB0LnJvb3RTZWdtZW50SUQpLCBYbChuMiwgbDMsIGksIGUpLCBsMy5wdXNoKCI8IS0tLyQtLT4iKTsKICAgIGlmIChDbCArPSB0LmJ5dGVTaXplLCBlICYmIFpuKGUsIHQuY29udGVudFN0YXRlKSwgaSA9IHQucm93LCBpICE9PSBudWxsICYmIEpuKG4yLCB0KSAmJiAtLWkucGVuZGluZ1Rhc2tzID09PSAwICYmIFgobjIsIGkpLCBuMi5yZW5kZXJTdGF0ZS5nZW5lcmF0ZVN0YXRpY01hcmt1cCB8fCBsMy5wdXNoKCI8IS0tJC0tPiIpLCBpID0gdC5jb21wbGV0ZWRTZWdtZW50cywgaS5sZW5ndGggIT09IDEpIHRocm93IEVycm9yKHMoMzkxKSk7CiAgICByZXR1cm4gRmwobjIsIGwzLCBpWzBdLCBlKSwgbjIgPSBuMi5yZW5kZXJTdGF0ZS5nZW5lcmF0ZVN0YXRpY01hcmt1cCA/IHRydWUgOiBsMy5wdXNoKCI8IS0tLyQtLT4iKSwgbjI7CiAgfQogIGZ1bmN0aW9uIEJpKG4yLCBsMywgaSwgZSkgewogICAgcmV0dXJuIEJyKGwzLCBuMi5yZW5kZXJTdGF0ZSwgaS5wYXJlbnRGb3JtYXRDb250ZXh0LCBpLmlkKSwgRmwobjIsIGwzLCBpLCBlKSwgSHIobDMsIGkucGFyZW50Rm9ybWF0Q29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIEV0KG4yLCBsMywgaSkgewogICAgQ2wgPSBpLmJ5dGVTaXplOwogICAgZm9yICh2YXIgZSA9IGkuY29tcGxldGVkU2VnbWVudHMsIHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykganQobjIsIGwzLCBpLCBlW3RdKTsKICAgIGUubGVuZ3RoID0gMCwgZSA9IGkucm93LCBlICE9PSBudWxsICYmIEpuKG4yLCBpKSAmJiAtLWUucGVuZGluZ1Rhc2tzID09PSAwICYmIFgobjIsIGUpLCBXdChsMywgaS5jb250ZW50U3RhdGUsIG4yLnJlbmRlclN0YXRlKSwgZSA9IG4yLnJlc3VtYWJsZVN0YXRlLCBuMiA9IG4yLnJlbmRlclN0YXRlLCB0ID0gaS5yb290U2VnbWVudElELCBpID0gaS5jb250ZW50U3RhdGU7CiAgICB2YXIgciA9IG4yLnN0eWxlc1RvSG9pc3Q7CiAgICByZXR1cm4gbjIuc3R5bGVzVG9Ib2lzdCA9IGZhbHNlLCBsMy5wdXNoKG4yLnN0YXJ0SW5saW5lU2NyaXB0KSwgbDMucHVzaCgiPiIpLCByID8gKChlLmluc3RydWN0aW9ucyAmIDQpID09PSAwICYmIChlLmluc3RydWN0aW9ucyB8PSA0LCBsMy5wdXNoKCckUlg9ZnVuY3Rpb24oYixjLGQsZSxmKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthJiYoYj1hLnByZXZpb3VzU2libGluZyxiLmRhdGE9IiQhIixhPWEuZGF0YXNldCxjJiYoYS5kZ3N0PWMpLGQmJihhLm1zZz1kKSxlJiYoYS5zdGNrPWUpLGYmJihhLmNzdGNrPWYpLGIuX3JlYWN0UmV0cnkmJmIuX3JlYWN0UmV0cnkoKSl9OycpKSwgKGUuaW5zdHJ1Y3Rpb25zICYgMikgPT09IDAgJiYgKGUuaW5zdHJ1Y3Rpb25zIHw9IDIsIGwzLnB1c2goYCRSQj1bXTskUlY9ZnVuY3Rpb24oYSl7JFJUPXBlcmZvcm1hbmNlLm5vdygpO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7Yis9Mil7dmFyIGM9YVtiXSxlPWFbYisxXTtudWxsIT09ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7dmFyIGY9Yy5wYXJlbnROb2RlO2lmKGYpe3ZhciBnPWMucHJldmlvdXNTaWJsaW5nLGg9MDtkb3tpZihjJiY4PT09Yy5ub2RlVHlwZSl7dmFyIGQ9Yy5kYXRhO2lmKCIvJCI9PT1kfHwiLyYiPT09ZClpZigwPT09aClicmVhaztlbHNlIGgtLTtlbHNlIiQiIT09ZCYmIiQ/IiE9PWQmJiIkfiIhPT1kJiYiJCEiIT09ZCYmIiYiIT09ZHx8aCsrfWQ9Yy5uZXh0U2libGluZztmLnJlbW92ZUNoaWxkKGMpO2M9ZH13aGlsZShjKTtmb3IoO2UuZmlyc3RDaGlsZDspZi5pbnNlcnRCZWZvcmUoZS5maXJzdENoaWxkLGMpO2cuZGF0YT0iJCI7Zy5fcmVhY3RSZXRyeSYmcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGcuX3JlYWN0UmV0cnkpfX1hLmxlbmd0aD0wfTsKJFJDPWZ1bmN0aW9uKGEsYil7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSkoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk/KGEucHJldmlvdXNTaWJsaW5nLmRhdGE9IiR+IiwkUkIucHVzaChhLGIpLDI9PT0kUkIubGVuZ3RoJiYoIm51bWJlciIhPT10eXBlb2YgJFJUP3JlcXVlc3RBbmltYXRpb25GcmFtZSgkUlYuYmluZChudWxsLCRSQikpOihhPXBlcmZvcm1hbmNlLm5vdygpLHNldFRpbWVvdXQoJFJWLmJpbmQobnVsbCwkUkIpLDIzMDA+YSYmMkUzPGE/MjMwMC1hOiRSVCszMDAtYSkpKSk6Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpfTtgKSksIChlLmluc3RydWN0aW9ucyAmIDgpID09PSAwID8gKGUuaW5zdHJ1Y3Rpb25zIHw9IDgsIGwzLnB1c2goYCRSTT1uZXcgTWFwOyRSUj1mdW5jdGlvbihuLHcscCl7ZnVuY3Rpb24gdShxKXt0aGlzLl9wPW51bGw7cSgpfWZvcih2YXIgcj1uZXcgTWFwLHQ9ZG9jdW1lbnQsaCxiLGU9dC5xdWVyeVNlbGVjdG9yQWxsKCJsaW5rW2RhdGEtcHJlY2VkZW5jZV0sc3R5bGVbZGF0YS1wcmVjZWRlbmNlXSIpLHY9W10saz0wO2I9ZVtrKytdOykibm90IGFsbCI9PT1iLmdldEF0dHJpYnV0ZSgibWVkaWEiKT92LnB1c2goYik6KCJMSU5LIj09PWIudGFnTmFtZSYmJFJNLnNldChiLmdldEF0dHJpYnV0ZSgiaHJlZiIpLGIpLHIuc2V0KGIuZGF0YXNldC5wcmVjZWRlbmNlLGg9YikpO2U9MDtiPVtdO3ZhciBsLGE7Zm9yKGs9ITA7Oyl7aWYoayl7dmFyIGY9cFtlKytdO2lmKCFmKXtrPSExO2U9MDtjb250aW51ZX12YXIgYz0hMSxtPTA7dmFyIGQ9ZlttKytdO2lmKGE9JFJNLmdldChkKSl7dmFyIGc9YS5fcDtjPSEwfWVsc2V7YT10LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTthLmhyZWY9ZDthLnJlbD0KInN0eWxlc2hlZXQiO2ZvcihhLmRhdGFzZXQucHJlY2VkZW5jZT1sPWZbbSsrXTtnPWZbbSsrXTspYS5zZXRBdHRyaWJ1dGUoZyxmW20rK10pO2c9YS5fcD1uZXcgUHJvbWlzZShmdW5jdGlvbihxLHgpe2Eub25sb2FkPXUuYmluZChhLHEpO2Eub25lcnJvcj11LmJpbmQoYSx4KX0pOyRSTS5zZXQoZCxhKX1kPWEuZ2V0QXR0cmlidXRlKCJtZWRpYSIpOyFnfHxkJiYhbWF0Y2hNZWRpYShkKS5tYXRjaGVzfHxiLnB1c2goZyk7aWYoYyljb250aW51ZX1lbHNle2E9dltlKytdO2lmKCFhKWJyZWFrO2w9YS5nZXRBdHRyaWJ1dGUoImRhdGEtcHJlY2VkZW5jZSIpO2EucmVtb3ZlQXR0cmlidXRlKCJtZWRpYSIpfWM9ci5nZXQobCl8fGg7Yz09PWgmJihoPWEpO3Iuc2V0KGwsYSk7Yz9jLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsYy5uZXh0U2libGluZyk6KGM9dC5oZWFkLGMuaW5zZXJ0QmVmb3JlKGEsYy5maXJzdENoaWxkKSl9aWYocD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChuKSlwLnByZXZpb3VzU2libGluZy5kYXRhPQoiJH4iO1Byb21pc2UuYWxsKGIpLnRoZW4oJFJDLmJpbmQobnVsbCxuLHcpLCRSWC5iaW5kKG51bGwsbiwiQ1NTIGZhaWxlZCB0byBsb2FkIikpfTskUlIoImApKSA6IGwzLnB1c2goJyRSUigiJykpIDogKChlLmluc3RydWN0aW9ucyAmIDIpID09PSAwICYmIChlLmluc3RydWN0aW9ucyB8PSAyLCBsMy5wdXNoKGAkUkI9W107JFJWPWZ1bmN0aW9uKGEpeyRSVD1wZXJmb3JtYW5jZS5ub3coKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrPTIpe3ZhciBjPWFbYl0sZT1hW2IrMV07bnVsbCE9PWUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO3ZhciBmPWMucGFyZW50Tm9kZTtpZihmKXt2YXIgZz1jLnByZXZpb3VzU2libGluZyxoPTA7ZG97aWYoYyYmOD09PWMubm9kZVR5cGUpe3ZhciBkPWMuZGF0YTtpZigiLyQiPT09ZHx8Ii8mIj09PWQpaWYoMD09PWgpYnJlYWs7ZWxzZSBoLS07ZWxzZSIkIiE9PWQmJiIkPyIhPT1kJiYiJH4iIT09ZCYmIiQhIiE9PWQmJiImIiE9PWR8fGgrK31kPWMubmV4dFNpYmxpbmc7Zi5yZW1vdmVDaGlsZChjKTtjPWR9d2hpbGUoYyk7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWYuaW5zZXJ0QmVmb3JlKGUuZmlyc3RDaGlsZCxjKTtnLmRhdGE9IiQiO2cuX3JlYWN0UmV0cnkmJnJlcXVlc3RBbmltYXRpb25GcmFtZShnLl9yZWFjdFJldHJ5KX19YS5sZW5ndGg9MH07CiRSQz1mdW5jdGlvbihhLGIpe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpPyhhLnByZXZpb3VzU2libGluZy5kYXRhPSIkfiIsJFJCLnB1c2goYSxiKSwyPT09JFJCLmxlbmd0aCYmKCJudW1iZXIiIT09dHlwZW9mICRSVD9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoJFJWLmJpbmQobnVsbCwkUkIpKTooYT1wZXJmb3JtYW5jZS5ub3coKSxzZXRUaW1lb3V0KCRSVi5iaW5kKG51bGwsJFJCKSwyMzAwPmEmJjJFMzxhPzIzMDAtYTokUlQrMzAwLWEpKSkpOmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX07YCkpLCBsMy5wdXNoKCckUkMoIicpKSwgZSA9IHQudG9TdHJpbmcoMTYpLCBsMy5wdXNoKG4yLmJvdW5kYXJ5UHJlZml4KSwgbDMucHVzaChlKSwgbDMucHVzaCgnIiwiJyksIGwzLnB1c2gobjIuc2VnbWVudFByZWZpeCksIGwzLnB1c2goZSksIHIgPyAobDMucHVzaCgnIiwnKSwgS3IobDMsIGkpKSA6IGwzLnB1c2goJyInKSwgaSA9IGwzLnB1c2goIik8XC9zY3JpcHQ+IiksIEh0KGwzLCBuMikgJiYgaTsKICB9CiAgZnVuY3Rpb24ganQobjIsIGwzLCBpLCBlKSB7CiAgICBpZiAoZS5zdGF0dXMgPT09IDIpIHJldHVybiB0cnVlOwogICAgdmFyIHQgPSBpLmNvbnRlbnRTdGF0ZSwgciA9IGUuaWQ7CiAgICBpZiAociA9PT0gLTEpIHsKICAgICAgaWYgKChlLmlkID0gaS5yb290U2VnbWVudElEKSA9PT0gLTEpIHRocm93IEVycm9yKHMoMzkyKSk7CiAgICAgIHJldHVybiBCaShuMiwgbDMsIGUsIHQpOwogICAgfQogICAgcmV0dXJuIHIgPT09IGkucm9vdFNlZ21lbnRJRCA/IEJpKG4yLCBsMywgZSwgdCkgOiAoQmkobjIsIGwzLCBlLCB0KSwgaSA9IG4yLnJlc3VtYWJsZVN0YXRlLCBuMiA9IG4yLnJlbmRlclN0YXRlLCBsMy5wdXNoKG4yLnN0YXJ0SW5saW5lU2NyaXB0KSwgbDMucHVzaCgiPiIpLCAoaS5pbnN0cnVjdGlvbnMgJiAxKSA9PT0gMCA/IChpLmluc3RydWN0aW9ucyB8PSAxLCBsMy5wdXNoKCckUlM9ZnVuY3Rpb24oYSxiKXthPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7Zm9yKGEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKTthLmZpcnN0Q2hpbGQ7KWIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYS5maXJzdENoaWxkLGIpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX07JFJTKCInKSkgOiBsMy5wdXNoKCckUlMoIicpLCBsMy5wdXNoKG4yLnNlZ21lbnRQcmVmaXgpLCByID0gci50b1N0cmluZygxNiksIGwzLnB1c2gociksIGwzLnB1c2goJyIsIicpLCBsMy5wdXNoKG4yLnBsYWNlaG9sZGVyUHJlZml4KSwgbDMucHVzaChyKSwgbDMgPSBsMy5wdXNoKCciKTxcL3NjcmlwdD4nKSwgbDMpOwogIH0KICB2YXIgcGwgPSBmYWxzZTsKICBmdW5jdGlvbiB2aShuMiwgbDMpIHsKICAgIHRyeSB7CiAgICAgIGlmICghKDAgPCBuMi5wZW5kaW5nUm9vdFRhc2tzKSkgewogICAgICAgIHZhciBpLCBlID0gbjIuY29tcGxldGVkUm9vdFNlZ21lbnQ7CiAgICAgICAgaWYgKGUgIT09IG51bGwpIHsKICAgICAgICAgIGlmIChlLnN0YXR1cyA9PT0gNSkgcmV0dXJuOwogICAgICAgICAgdmFyIHQgPSBuMi5jb21wbGV0ZWRQcmVhbWJsZVNlZ21lbnRzOwogICAgICAgICAgaWYgKHQgPT09IG51bGwpIHJldHVybjsKICAgICAgICAgIENsID0gbjIuYnl0ZVNpemU7CiAgICAgICAgICB2YXIgciA9IG4yLnJlc3VtYWJsZVN0YXRlLCBhID0gbjIucmVuZGVyU3RhdGUsIGMyID0gYS5wcmVhbWJsZSwgdTIgPSBjMi5odG1sQ2h1bmtzLCBoID0gYzIuaGVhZENodW5rcywgZjI7CiAgICAgICAgICBpZiAodTIpIHsKICAgICAgICAgICAgZm9yIChmMiA9IDA7IGYyIDwgdTIubGVuZ3RoOyBmMisrKSBsMy5wdXNoKHUyW2YyXSk7CiAgICAgICAgICAgIGlmIChoKSBmb3IgKGYyID0gMDsgZjIgPCBoLmxlbmd0aDsgZjIrKykgbDMucHVzaChoW2YyXSk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIHZhciBvID0gTygiaGVhZCIpOwogICAgICAgICAgICAgIGwzLnB1c2gobyksIGwzLnB1c2goIj4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChoKSBmb3IgKGYyID0gMDsgZjIgPCBoLmxlbmd0aDsgZjIrKykgbDMucHVzaChoW2YyXSk7CiAgICAgICAgICB2YXIgZDMgPSBhLmNoYXJzZXRDaHVua3M7CiAgICAgICAgICBmb3IgKGYyID0gMDsgZjIgPCBkMy5sZW5ndGg7IGYyKyspIGwzLnB1c2goZDNbZjJdKTsKICAgICAgICAgIGQzLmxlbmd0aCA9IDAsIGEucHJlY29ubmVjdHMuZm9yRWFjaChqMywgbDMpLCBhLnByZWNvbm5lY3RzLmNsZWFyKCk7CiAgICAgICAgICB2YXIgZyA9IGEudmlld3BvcnRDaHVua3M7CiAgICAgICAgICBmb3IgKGYyID0gMDsgZjIgPCBnLmxlbmd0aDsgZjIrKykgbDMucHVzaChnW2YyXSk7CiAgICAgICAgICBnLmxlbmd0aCA9IDAsIGEuZm9udFByZWxvYWRzLmZvckVhY2goajMsIGwzKSwgYS5mb250UHJlbG9hZHMuY2xlYXIoKSwgYS5oaWdoSW1hZ2VQcmVsb2Fkcy5mb3JFYWNoKGozLCBsMyksIGEuaGlnaEltYWdlUHJlbG9hZHMuY2xlYXIoKSwgWG4gPSBhLCBhLnN0eWxlcy5mb3JFYWNoKEpyLCBsMyksIFhuID0gbnVsbDsKICAgICAgICAgIHZhciBFNCA9IGEuaW1wb3J0TWFwQ2h1bmtzOwogICAgICAgICAgZm9yIChmMiA9IDA7IGYyIDwgRTQubGVuZ3RoOyBmMisrKSBsMy5wdXNoKEU0W2YyXSk7CiAgICAgICAgICBFNC5sZW5ndGggPSAwLCBhLmJvb3RzdHJhcFNjcmlwdHMuZm9yRWFjaChqMywgbDMpLCBhLnNjcmlwdHMuZm9yRWFjaChqMywgbDMpLCBhLnNjcmlwdHMuY2xlYXIoKSwgYS5idWxrUHJlbG9hZHMuZm9yRWFjaChqMywgbDMpLCBhLmJ1bGtQcmVsb2Fkcy5jbGVhcigpLCByLmluc3RydWN0aW9ucyB8PSAzMjsKICAgICAgICAgIHZhciB5MiA9IGEuaG9pc3RhYmxlQ2h1bmtzOwogICAgICAgICAgZm9yIChmMiA9IDA7IGYyIDwgeTIubGVuZ3RoOyBmMisrKSBsMy5wdXNoKHkyW2YyXSk7CiAgICAgICAgICBmb3IgKHIgPSB5Mi5sZW5ndGggPSAwOyByIDwgdC5sZW5ndGg7IHIrKykgewogICAgICAgICAgICB2YXIgYjQgPSB0W3JdOwogICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgYjQubGVuZ3RoOyBhKyspIEZsKG4yLCBsMywgYjRbYV0sIG51bGwpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHYzID0gbjIucmVuZGVyU3RhdGUucHJlYW1ibGUsIHgzID0gdjMuaGVhZENodW5rczsKICAgICAgICAgIGlmICh2My5odG1sQ2h1bmtzIHx8IHgzKSB7CiAgICAgICAgICAgIHZhciBNMiA9IFBuKCJoZWFkIik7CiAgICAgICAgICAgIGwzLnB1c2goTTIpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIFAgPSB2My5ib2R5Q2h1bmtzOwogICAgICAgICAgaWYgKFApIGZvciAodCA9IDA7IHQgPCBQLmxlbmd0aDsgdCsrKSBsMy5wdXNoKFBbdF0pOwogICAgICAgICAgRmwobjIsIGwzLCBlLCBudWxsKSwgbjIuY29tcGxldGVkUm9vdFNlZ21lbnQgPSBudWxsOwogICAgICAgICAgdmFyIFIzID0gbjIucmVuZGVyU3RhdGU7CiAgICAgICAgICBpZiAobjIuYWxsUGVuZGluZ1Rhc2tzICE9PSAwIHx8IG4yLmNsaWVudFJlbmRlcmVkQm91bmRhcmllcy5sZW5ndGggIT09IDAgfHwgbjIuY29tcGxldGVkQm91bmRhcmllcy5sZW5ndGggIT09IDAgfHwgbjIudHJhY2tlZFBvc3Rwb25lcyAhPT0gbnVsbCAmJiAobjIudHJhY2tlZFBvc3Rwb25lcy5yb290Tm9kZXMubGVuZ3RoICE9PSAwIHx8IG4yLnRyYWNrZWRQb3N0cG9uZXMucm9vdFNsb3RzICE9PSBudWxsKSkgewogICAgICAgICAgICB2YXIgRjIgPSBuMi5yZXN1bWFibGVTdGF0ZTsKICAgICAgICAgICAgaWYgKChGMi5pbnN0cnVjdGlvbnMgJiA2NCkgPT09IDApIHsKICAgICAgICAgICAgICBpZiAoRjIuaW5zdHJ1Y3Rpb25zIHw9IDY0LCBsMy5wdXNoKFIzLnN0YXJ0SW5saW5lU2NyaXB0KSwgKEYyLmluc3RydWN0aW9ucyAmIDMyKSA9PT0gMCkgewogICAgICAgICAgICAgICAgRjIuaW5zdHJ1Y3Rpb25zIHw9IDMyOwogICAgICAgICAgICAgICAgdmFyIGVuID0gIl8iICsgRjIuaWRQcmVmaXggKyAiUl8iOwogICAgICAgICAgICAgICAgbDMucHVzaCgnIGlkPSInKTsKICAgICAgICAgICAgICAgIHZhciAkMiA9IFQzKGVuKTsKICAgICAgICAgICAgICAgIGwzLnB1c2goJDIpLCBsMy5wdXNoKCciJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGwzLnB1c2goIj4iKSwgbDMucHVzaCgicmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7JFJUPXBlcmZvcm1hbmNlLm5vdygpfSk7IiksIGwzLnB1c2goIjxcL3NjcmlwdD4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgSHQobDMsIFIzKTsKICAgICAgICB9CiAgICAgICAgdmFyIHczID0gbjIucmVuZGVyU3RhdGU7CiAgICAgICAgZSA9IDA7CiAgICAgICAgdmFyIHRuID0gdzMudmlld3BvcnRDaHVua3M7CiAgICAgICAgZm9yIChlID0gMDsgZSA8IHRuLmxlbmd0aDsgZSsrKSBsMy5wdXNoKHRuW2VdKTsKICAgICAgICB0bi5sZW5ndGggPSAwLCB3My5wcmVjb25uZWN0cy5mb3JFYWNoKGozLCBsMyksIHczLnByZWNvbm5lY3RzLmNsZWFyKCksIHczLmZvbnRQcmVsb2Fkcy5mb3JFYWNoKGozLCBsMyksIHczLmZvbnRQcmVsb2Fkcy5jbGVhcigpLCB3My5oaWdoSW1hZ2VQcmVsb2Fkcy5mb3JFYWNoKGozLCBsMyksIHczLmhpZ2hJbWFnZVByZWxvYWRzLmNsZWFyKCksIHczLnN0eWxlcy5mb3JFYWNoKFZyLCBsMyksIHczLnNjcmlwdHMuZm9yRWFjaChqMywgbDMpLCB3My5zY3JpcHRzLmNsZWFyKCksIHczLmJ1bGtQcmVsb2Fkcy5mb3JFYWNoKGozLCBsMyksIHczLmJ1bGtQcmVsb2Fkcy5jbGVhcigpOwogICAgICAgIHZhciBBMyA9IHczLmhvaXN0YWJsZUNodW5rczsKICAgICAgICBmb3IgKGUgPSAwOyBlIDwgQTMubGVuZ3RoOyBlKyspIGwzLnB1c2goQTNbZV0pOwogICAgICAgIEEzLmxlbmd0aCA9IDA7CiAgICAgICAgdmFyIEIyID0gbjIuY2xpZW50UmVuZGVyZWRCb3VuZGFyaWVzOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBCMi5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIEgyID0gQjJbaV07CiAgICAgICAgICB3MyA9IGwzOwogICAgICAgICAgdmFyIFMzID0gbjIucmVzdW1hYmxlU3RhdGUsIGNuID0gbjIucmVuZGVyU3RhdGUsIElsID0gSDIucm9vdFNlZ21lbnRJRCwgUW4gPSBIMi5lcnJvckRpZ2VzdDsKICAgICAgICAgIHczLnB1c2goY24uc3RhcnRJbmxpbmVTY3JpcHQpLCB3My5wdXNoKCI+IiksIChTMy5pbnN0cnVjdGlvbnMgJiA0KSA9PT0gMCA/IChTMy5pbnN0cnVjdGlvbnMgfD0gNCwgdzMucHVzaCgnJFJYPWZ1bmN0aW9uKGIsYyxkLGUsZil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YSYmKGI9YS5wcmV2aW91c1NpYmxpbmcsYi5kYXRhPSIkISIsYT1hLmRhdGFzZXQsYyYmKGEuZGdzdD1jKSxkJiYoYS5tc2c9ZCksZSYmKGEuc3Rjaz1lKSxmJiYoYS5jc3Rjaz1mKSxiLl9yZWFjdFJldHJ5JiZiLl9yZWFjdFJldHJ5KCkpfTs7JFJYKCInKSkgOiB3My5wdXNoKCckUlgoIicpLCB3My5wdXNoKGNuLmJvdW5kYXJ5UHJlZml4KTsKICAgICAgICAgIHZhciBNbCA9IElsLnRvU3RyaW5nKDE2KTsKICAgICAgICAgIGlmICh3My5wdXNoKE1sKSwgdzMucHVzaCgnIicpLCBRbikgewogICAgICAgICAgICB3My5wdXNoKCIsIik7CiAgICAgICAgICAgIHZhciBQbCA9IFVyKFFuIHx8ICIiKTsKICAgICAgICAgICAgdzMucHVzaChQbCk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcDMgPSB3My5wdXNoKCIpPFwvc2NyaXB0PiIpOwogICAgICAgICAgaWYgKCFwMykgewogICAgICAgICAgICBuMi5kZXN0aW5hdGlvbiA9IG51bGwsIGkrKywgQjIuc3BsaWNlKDAsIGkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEIyLnNwbGljZSgwLCBpKTsKICAgICAgICB2YXIgZm4gPSBuMi5jb21wbGV0ZWRCb3VuZGFyaWVzOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBmbi5sZW5ndGg7IGkrKykgaWYgKCFFdChuMiwgbDMsIGZuW2ldKSkgewogICAgICAgICAgbjIuZGVzdGluYXRpb24gPSBudWxsLCBpKyssIGZuLnNwbGljZSgwLCBpKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm4uc3BsaWNlKDAsIGkpLCBwbCA9IHRydWU7CiAgICAgICAgdmFyIG5uID0gbjIucGFydGlhbEJvdW5kYXJpZXM7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG5uLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgbG4gPSBubltpXTsKICAgICAgICAgIG46IHsKICAgICAgICAgICAgQjIgPSBuMiwgSDIgPSBsMywgQ2wgPSBsbi5ieXRlU2l6ZTsKICAgICAgICAgICAgdmFyIG9uID0gbG4uY29tcGxldGVkU2VnbWVudHM7CiAgICAgICAgICAgIGZvciAocDMgPSAwOyBwMyA8IG9uLmxlbmd0aDsgcDMrKykgaWYgKCFqdChCMiwgSDIsIGxuLCBvbltwM10pKSB7CiAgICAgICAgICAgICAgcDMrKywgb24uc3BsaWNlKDAsIHAzKTsKICAgICAgICAgICAgICB2YXIgZG4gPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhayBuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9uLnNwbGljZSgwLCBwMyk7CiAgICAgICAgICAgIHZhciBrNCA9IGxuLnJvdzsKICAgICAgICAgICAgazQgIT09IG51bGwgJiYgazQudG9nZXRoZXIgJiYgbG4ucGVuZGluZ1Rhc2tzID09PSAxICYmIChrNC5wZW5kaW5nVGFza3MgPT09IDEgPyB1ZShCMiwgazQsIGs0LmhvaXN0YWJsZXMpIDogazQucGVuZGluZ1Rhc2tzLS0pLCBkbiA9IFd0KEgyLCBsbi5jb250ZW50U3RhdGUsIEIyLnJlbmRlclN0YXRlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghZG4pIHsKICAgICAgICAgICAgbjIuZGVzdGluYXRpb24gPSBudWxsLCBpKyssIG5uLnNwbGljZSgwLCBpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBubi5zcGxpY2UoMCwgaSksIHBsID0gZmFsc2U7CiAgICAgICAgdmFyIHhuID0gbjIuY29tcGxldGVkQm91bmRhcmllczsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgeG4ubGVuZ3RoOyBpKyspIGlmICghRXQobjIsIGwzLCB4bltpXSkpIHsKICAgICAgICAgIG4yLmRlc3RpbmF0aW9uID0gbnVsbCwgaSsrLCB4bi5zcGxpY2UoMCwgaSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHhuLnNwbGljZSgwLCBpKTsKICAgICAgfQogICAgfSBmaW5hbGx5IHsKICAgICAgcGwgPSBmYWxzZSwgbjIuYWxsUGVuZGluZ1Rhc2tzID09PSAwICYmIG4yLmNsaWVudFJlbmRlcmVkQm91bmRhcmllcy5sZW5ndGggPT09IDAgJiYgbjIuY29tcGxldGVkQm91bmRhcmllcy5sZW5ndGggPT09IDAgJiYgKG4yLmZsdXNoU2NoZWR1bGVkID0gZmFsc2UsIGkgPSBuMi5yZXN1bWFibGVTdGF0ZSwgaS5oYXNCb2R5ICYmIChubiA9IFBuKCJib2R5IiksIGwzLnB1c2gobm4pKSwgaS5oYXNIdG1sICYmIChpID0gUG4oImh0bWwiKSwgbDMucHVzaChpKSksIG4yLnN0YXR1cyA9IDE0LCBsMy5wdXNoKG51bGwpLCBuMi5kZXN0aW5hdGlvbiA9IG51bGwpOwogICAgfQogIH0KICBmdW5jdGlvbiBPbihuMikgewogICAgaWYgKG4yLmZsdXNoU2NoZWR1bGVkID09PSBmYWxzZSAmJiBuMi5waW5nZWRUYXNrcy5sZW5ndGggPT09IDAgJiYgbjIuZGVzdGluYXRpb24gIT09IG51bGwpIHsKICAgICAgbjIuZmx1c2hTY2hlZHVsZWQgPSB0cnVlOwogICAgICB2YXIgbDMgPSBuMi5kZXN0aW5hdGlvbjsKICAgICAgbDMgPyB2aShuMiwgbDMpIDogbjIuZmx1c2hTY2hlZHVsZWQgPSBmYWxzZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gX2EobjIsIGwzKSB7CiAgICBpZiAobjIuc3RhdHVzID09PSAxMykgbjIuc3RhdHVzID0gMTQsIGwzLmRlc3Ryb3kobjIuZmF0YWxFcnJvcik7CiAgICBlbHNlIGlmIChuMi5zdGF0dXMgIT09IDE0ICYmIG4yLmRlc3RpbmF0aW9uID09PSBudWxsKSB7CiAgICAgIG4yLmRlc3RpbmF0aW9uID0gbDM7CiAgICAgIHRyeSB7CiAgICAgICAgdmkobjIsIGwzKTsKICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgIEczKG4yLCBpLCB7fSksIFJsKG4yLCBpKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBBYShuMiwgbDMpIHsKICAgIChuMi5zdGF0dXMgPT09IDExIHx8IG4yLnN0YXR1cyA9PT0gMTApICYmIChuMi5zdGF0dXMgPSAxMik7CiAgICB0cnkgewogICAgICB2YXIgaSA9IG4yLmFib3J0YWJsZVRhc2tzOwogICAgICBpZiAoMCA8IGkuc2l6ZSkgewogICAgICAgIHZhciBlID0gbDMgPT09IHZvaWQgMCA/IEVycm9yKHMoNDMyKSkgOiB0eXBlb2YgbDMgPT0gIm9iamVjdCIgJiYgbDMgIT09IG51bGwgJiYgdHlwZW9mIGwzLnRoZW4gPT0gImZ1bmN0aW9uIiA/IEVycm9yKHMoNTMwKSkgOiBsMzsKICAgICAgICBuMi5mYXRhbEVycm9yID0gZSwgaS5mb3JFYWNoKGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHJldHVybiBtaSh0LCBuMiwgZSk7CiAgICAgICAgfSksIGkuY2xlYXIoKTsKICAgICAgfQogICAgICBuMi5kZXN0aW5hdGlvbiAhPT0gbnVsbCAmJiB2aShuMiwgbjIuZGVzdGluYXRpb24pOwogICAgfSBjYXRjaCAodCkgewogICAgICBHMyhuMiwgdCwge30pLCBSbChuMiwgdCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGhpKG4yLCBsMywgaSkgewogICAgaWYgKGwzID09PSBudWxsKSBpLnJvb3ROb2Rlcy5wdXNoKG4yKTsKICAgIGVsc2UgewogICAgICB2YXIgZSA9IGkud29ya2luZ01hcCwgdCA9IGUuZ2V0KGwzKTsKICAgICAgdCA9PT0gdm9pZCAwICYmICh0ID0gWwogICAgICAgIGwzWzFdLAogICAgICAgIGwzWzJdLAogICAgICAgIFtdLAogICAgICAgIG51bGwKICAgICAgXSwgZS5zZXQobDMsIHQpLCBoaSh0LCBsM1swXSwgaSkpLCB0WzJdLnB1c2gobjIpOwogICAgfQogIH0KICBmdW5jdGlvbiBJYSgpIHsKICB9CiAgZnVuY3Rpb24gJHQobjIsIGwzLCBpLCBlKSB7CiAgICB2YXIgdCA9IGZhbHNlLCByID0gbnVsbCwgYSA9ICIiLCBjMiA9IGZhbHNlOwogICAgaWYgKGwzID0gTHIobDMgPyBsMy5pZGVudGlmaWVyUHJlZml4IDogdm9pZCAwKSwgbjIgPSBDYShuMiwgbDMsIHJhKGwzLCBpKSwgTjIoMCwgbnVsbCwgMCwgbnVsbCksIDEgLyAwLCBJYSwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgYzIgPSB0cnVlOwogICAgfSwgdm9pZCAwLCB2b2lkIDAsIHZvaWQgMCksIG4yLmZsdXNoU2NoZWR1bGVkID0gbjIuZGVzdGluYXRpb24gIT09IG51bGwsIHB0KG4yKSwgbjIuc3RhdHVzID09PSAxMCAmJiAobjIuc3RhdHVzID0gMTEpLCBuMi50cmFja2VkUG9zdHBvbmVzID09PSBudWxsICYmIGNlKG4yLCBuMi5wZW5kaW5nUm9vdFRhc2tzID09PSAwKSwgQWEobjIsIGUpLCBfYShuMiwgewogICAgICBwdXNoOiBmdW5jdGlvbih1MikgewogICAgICAgIHJldHVybiB1MiAhPT0gbnVsbCAmJiAoYSArPSB1MiksIHRydWU7CiAgICAgIH0sCiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKHUyKSB7CiAgICAgICAgdCA9IHRydWUsIHIgPSB1MjsKICAgICAgfQogICAgfSksIHQgJiYgciAhPT0gZSkgdGhyb3cgcjsKICAgIGlmICghYzIpIHRocm93IEVycm9yKHMoNDI2KSk7CiAgICByZXR1cm4gYTsKICB9CiAgYmkucmVuZGVyVG9TdGF0aWNNYXJrdXAgPSBmdW5jdGlvbihuMiwgbDMpIHsKICAgIHJldHVybiAkdChuMiwgbDMsIHRydWUsICdUaGUgc2VydmVyIHVzZWQgInJlbmRlclRvU3RhdGljTWFya3VwIiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IFN1c3BlbnNlLiBJZiB5b3UgaW50ZW5kZWQgdG8gaGF2ZSB0aGUgc2VydmVyIHdhaXQgZm9yIHRoZSBzdXNwZW5kZWQgY29tcG9uZW50IHBsZWFzZSBzd2l0Y2ggdG8gInJlbmRlclRvUmVhZGFibGVTdHJlYW0iIHdoaWNoIHN1cHBvcnRzIFN1c3BlbnNlIG9uIHRoZSBzZXJ2ZXInKTsKICB9OwogIGJpLnJlbmRlclRvU3RyaW5nID0gZnVuY3Rpb24objIsIGwzKSB7CiAgICByZXR1cm4gJHQobjIsIGwzLCBmYWxzZSwgJ1RoZSBzZXJ2ZXIgdXNlZCAicmVuZGVyVG9TdHJpbmciIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgU3VzcGVuc2UuIElmIHlvdSBpbnRlbmRlZCBmb3IgdGhpcyBTdXNwZW5zZSBib3VuZGFyeSB0byByZW5kZXIgdGhlIGZhbGxiYWNrIGNvbnRlbnQgb24gdGhlIHNlcnZlciBjb25zaWRlciB0aHJvd2luZyBhbiBFcnJvciBzb21ld2hlcmUgd2l0aGluIHRoZSBTdXNwZW5zZSBib3VuZGFyeS4gSWYgeW91IGludGVuZGVkIHRvIGhhdmUgdGhlIHNlcnZlciB3YWl0IGZvciB0aGUgc3VzcGVuZGVkIGNvbXBvbmVudCBwbGVhc2Ugc3dpdGNoIHRvICJyZW5kZXJUb1JlYWRhYmxlU3RyZWFtIiB3aGljaCBzdXBwb3J0cyBTdXNwZW5zZSBvbiB0aGUgc2VydmVyJyk7CiAgfTsKICBiaS52ZXJzaW9uID0gIjE5LjIuNCI7Cn0pOwp2YXIgeWkgPSBFcihucigpKTsKdmFyIHsgcmVuZGVyVG9TdGF0aWNNYXJrdXA6IFNhLCByZW5kZXJUb1N0cmluZzogT2EsIHZlcnNpb246IGthIH0gPSB5aTsKdmFyIExhID0geWkuZGVmYXVsdCA/PyB5aTsKCi8vIGRlbm86aHR0cHM6Ly9lc20uc2gvcmVhY3QtZG9tQDE5LjIuNC9YLVpHTnpjM1I1Y0dWQU15NHlMak1LWlhKbFlXTjAvZXMyMDIyL2Nqcy9yZWFjdC1kb20tc2VydmVyLmJyb3dzZXIucHJvZHVjdGlvbi5tanMKdmFyIHJlYWN0X2RvbV9zZXJ2ZXJfYnJvd3Nlcl9wcm9kdWN0aW9uX2V4cG9ydHMgPSB7fTsKX19leHBvcnQocmVhY3RfZG9tX3NlcnZlcl9icm93c2VyX3Byb2R1Y3Rpb25fZXhwb3J0cywgewogIGRlZmF1bHQ6ICgpID0+IEt1LAogIHByZXJlbmRlcjogKCkgPT4gWHUsCiAgcmVuZGVyVG9SZWFkYWJsZVN0cmVhbTogKCkgPT4gWnUsCiAgcmVzdW1lOiAoKSA9PiBKdSwKICByZXN1bWVBbmRQcmVyZW5kZXI6ICgpID0+IFF1LAogIHZlcnNpb246ICgpID0+IFZ1Cn0pOwp2YXIgcmVxdWlyZTQgPSAobjIpID0+IHsKICBjb25zdCBlID0gKG0yKSA9PiB0eXBlb2YgbTIuZGVmYXVsdCA8ICJ1IiA/IG0yLmRlZmF1bHQgOiBtMiwgYzIgPSAobTIpID0+IE9iamVjdC5hc3NpZ24oewogICAgX19lc01vZHVsZTogdHJ1ZQogIH0sIG0yKTsKICBzd2l0Y2ggKG4yKSB7CiAgICBjYXNlICJyZWFjdCI6CiAgICAgIHJldHVybiBlKHJlYWN0X2V4cG9ydHMpOwogICAgY2FzZSAicmVhY3QtZG9tIjoKICAgICAgcmV0dXJuIGUocmVhY3RfZG9tX2V4cG9ydHMpOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5lcnJvcignbW9kdWxlICInICsgbjIgKyAnIiBub3QgZm91bmQnKTsKICAgICAgcmV0dXJuIG51bGw7CiAgfQp9Owp2YXIgdWEgPSBPYmplY3QuY3JlYXRlOwp2YXIgd3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CnZhciBmYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CnZhciBvYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzOwp2YXIgaGEgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7CnZhciBkYSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CnZhciB4ciA9ICgobjIpID0+IHR5cGVvZiByZXF1aXJlNCA8ICJ1IiA/IHJlcXVpcmU0IDogdHlwZW9mIFByb3h5IDwgInUiID8gbmV3IFByb3h5KG4yLCB7CiAgZ2V0OiAobDMsIGUpID0+ICh0eXBlb2YgcmVxdWlyZTQgPCAidSIgPyByZXF1aXJlNCA6IGwzKVtlXQp9KSA6IG4yKShmdW5jdGlvbihuMikgewogIGlmICh0eXBlb2YgcmVxdWlyZTQgPCAidSIpIHJldHVybiByZXF1aXJlNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIHRocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicgKyBuMiArICciIGlzIG5vdCBzdXBwb3J0ZWQnKTsKfSk7CnZhciBnYSA9IChuMiwgbDMpID0+ICgpID0+IChsMyB8fCBuMigobDMgPSB7CiAgZXhwb3J0czoge30KfSkuZXhwb3J0cywgbDMpLCBsMy5leHBvcnRzKTsKdmFyIHZhID0gKG4yLCBsMywgZSwgdCkgPT4gewogIGlmIChsMyAmJiB0eXBlb2YgbDMgPT0gIm9iamVjdCIgfHwgdHlwZW9mIGwzID09ICJmdW5jdGlvbiIpIGZvciAobGV0IHIgb2Ygb2EobDMpKSAhZGEuY2FsbChuMiwgcikgJiYgciAhPT0gZSAmJiB3cihuMiwgciwgewogICAgZ2V0OiAoKSA9PiBsM1tyXSwKICAgIGVudW1lcmFibGU6ICEodCA9IGZhKGwzLCByKSkgfHwgdC5lbnVtZXJhYmxlCiAgfSk7CiAgcmV0dXJuIG4yOwp9Owp2YXIgc2EgPSAobjIsIGwzLCBlKSA9PiAoZSA9IG4yICE9IG51bGwgPyB1YShoYShuMikpIDoge30sIHZhKGwzIHx8ICFuMiB8fCAhbjIuX19lc01vZHVsZSA/IHdyKGUsICJkZWZhdWx0IiwgewogIHZhbHVlOiBuMiwKICBlbnVtZXJhYmxlOiB0cnVlCn0pIDogZSwgbjIpKTsKdmFyIHFpID0gZ2EoKGlsKSA9PiB7CiAgInVzZSBzdHJpY3QiOwogIHZhciBTdCA9IHhyKCJyZWFjdCIpLCBiYSA9IHhyKCJyZWFjdC1kb20iKTsKICBmdW5jdGlvbiB5MihuMikgewogICAgdmFyIGwzID0gImh0dHBzOi8vcmVhY3QuZGV2L2Vycm9ycy8iICsgbjI7CiAgICBpZiAoMSA8IGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgbDMgKz0gIj9hcmdzW109IiArIGVuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbMV0pOwogICAgICBmb3IgKHZhciBlID0gMjsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgbDMgKz0gIiZhcmdzW109IiArIGVuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbZV0pOwogICAgfQogICAgcmV0dXJuICJNaW5pZmllZCBSZWFjdCBlcnJvciAjIiArIG4yICsgIjsgdmlzaXQgIiArIGwzICsgIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIjsKICB9CiAgdmFyIGFpID0gU3ltYm9sLmZvcigicmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnQiKSwgY2kgPSBTeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKSwgdWkgPSBTeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLCBmaSA9IFN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIiksIG9pID0gU3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSwgaGkgPSBTeW1ib2wuZm9yKCJyZWFjdC5jb25zdW1lciIpLCBSZTIgPSBTeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksIEZ0ID0gU3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSwgU2UyID0gU3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSwgUHQgPSBTeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZV9saXN0IiksIEF0ID0gU3ltYm9sLmZvcigicmVhY3QubWVtbyIpLCBGZSA9IFN5bWJvbC5mb3IoInJlYWN0LmxhenkiKSwgeWEgPSBTeW1ib2wuZm9yKCJyZWFjdC5zY29wZSIpLCBkaSA9IFN5bWJvbC5mb3IoInJlYWN0LmFjdGl2aXR5IiksIFRhID0gU3ltYm9sLmZvcigicmVhY3QubGVnYWN5X2hpZGRlbiIpLCBFYSA9IFN5bWJvbC5mb3IoInJlYWN0Lm1lbW9fY2FjaGVfc2VudGluZWwiKSwgd2EgPSBTeW1ib2wuZm9yKCJyZWFjdC52aWV3X3RyYW5zaXRpb24iKSwgQ3IgPSBTeW1ib2wuaXRlcmF0b3I7CiAgZnVuY3Rpb24gZ2kobjIpIHsKICAgIHJldHVybiBuMiA9PT0gbnVsbCB8fCB0eXBlb2YgbjIgIT0gIm9iamVjdCIgPyBudWxsIDogKG4yID0gQ3IgJiYgbjJbQ3JdIHx8IG4yWyJAQGl0ZXJhdG9yIl0sIHR5cGVvZiBuMiA9PSAiZnVuY3Rpb24iID8gbjIgOiBudWxsKTsKICB9CiAgdmFyIGhlMiA9IEFycmF5LmlzQXJyYXk7CiAgZnVuY3Rpb24gUnIobjIsIGwzKSB7CiAgICB2YXIgZSA9IG4yLmxlbmd0aCAmIDMsIHQgPSBuMi5sZW5ndGggLSBlLCByID0gbDM7CiAgICBmb3IgKGwzID0gMDsgbDMgPCB0OyApIHsKICAgICAgdmFyIGkgPSBuMi5jaGFyQ29kZUF0KGwzKSAmIDI1NSB8IChuMi5jaGFyQ29kZUF0KCsrbDMpICYgMjU1KSA8PCA4IHwgKG4yLmNoYXJDb2RlQXQoKytsMykgJiAyNTUpIDw8IDE2IHwgKG4yLmNoYXJDb2RlQXQoKytsMykgJiAyNTUpIDw8IDI0OwogICAgICArK2wzLCBpID0gMzQzMjkxODM1MyAqIChpICYgNjU1MzUpICsgKCgzNDMyOTE4MzUzICogKGkgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNikgJiA0Mjk0OTY3Mjk1LCBpID0gaSA8PCAxNSB8IGkgPj4+IDE3LCBpID0gNDYxODQ1OTA3ICogKGkgJiA2NTUzNSkgKyAoKDQ2MTg0NTkwNyAqIChpID4+PiAxNikgJiA2NTUzNSkgPDwgMTYpICYgNDI5NDk2NzI5NSwgciBePSBpLCByID0gciA8PCAxMyB8IHIgPj4+IDE5LCByID0gNSAqIChyICYgNjU1MzUpICsgKCg1ICogKHIgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNikgJiA0Mjk0OTY3Mjk1LCByID0gKHIgJiA2NTUzNSkgKyAyNzQ5MiArICgoKHIgPj4+IDE2KSArIDU4OTY0ICYgNjU1MzUpIDw8IDE2KTsKICAgIH0KICAgIHN3aXRjaCAoaSA9IDAsIGUpIHsKICAgICAgY2FzZSAzOgogICAgICAgIGkgXj0gKG4yLmNoYXJDb2RlQXQobDMgKyAyKSAmIDI1NSkgPDwgMTY7CiAgICAgIGNhc2UgMjoKICAgICAgICBpIF49IChuMi5jaGFyQ29kZUF0KGwzICsgMSkgJiAyNTUpIDw8IDg7CiAgICAgIGNhc2UgMToKICAgICAgICBpIF49IG4yLmNoYXJDb2RlQXQobDMpICYgMjU1LCBpID0gMzQzMjkxODM1MyAqIChpICYgNjU1MzUpICsgKCgzNDMyOTE4MzUzICogKGkgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNikgJiA0Mjk0OTY3Mjk1LCBpID0gaSA8PCAxNSB8IGkgPj4+IDE3LCByIF49IDQ2MTg0NTkwNyAqIChpICYgNjU1MzUpICsgKCg0NjE4NDU5MDcgKiAoaSA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSAmIDQyOTQ5NjcyOTU7CiAgICB9CiAgICByZXR1cm4gciBePSBuMi5sZW5ndGgsIHIgXj0gciA+Pj4gMTYsIHIgPSAyMjQ2ODIyNTA3ICogKHIgJiA2NTUzNSkgKyAoKDIyNDY4MjI1MDcgKiAociA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSAmIDQyOTQ5NjcyOTUsIHIgXj0gciA+Pj4gMTMsIHIgPSAzMjY2NDg5OTA5ICogKHIgJiA2NTUzNSkgKyAoKDMyNjY0ODk5MDkgKiAociA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSAmIDQyOTQ5NjcyOTUsIChyIF4gciA+Pj4gMTYpID4+PiAwOwogIH0KICB2YXIgdmkgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKSwgc2kgPSBbXTsKICB2aS5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHsKICAgIHZhciBuMiA9IHNpLnNoaWZ0KCk7CiAgICBuMiAmJiBuMigpOwogIH07CiAgZnVuY3Rpb24ga3QobjIpIHsKICAgIHNpLnB1c2gobjIpLCB2aS5wb3J0Mi5wb3N0TWVzc2FnZShudWxsKTsKICB9CiAgZnVuY3Rpb24geGEobjIpIHsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG4yOwogICAgfSk7CiAgfQogIHZhciBDYSA9IFByb21pc2UsIGJpID0gdHlwZW9mIHF1ZXVlTWljcm90YXNrID09ICJmdW5jdGlvbiIgPyBxdWV1ZU1pY3JvdGFzayA6IGZ1bmN0aW9uKG4yKSB7CiAgICBDYS5yZXNvbHZlKG51bGwpLnRoZW4objIpLmNhdGNoKHhhKTsKICB9LCBqMyA9IG51bGwsIHAzID0gMDsKICBmdW5jdGlvbiBkMyhuMiwgbDMpIHsKICAgIGlmIChsMy5ieXRlTGVuZ3RoICE9PSAwKSBpZiAoMjA0OCA8IGwzLmJ5dGVMZW5ndGgpIDAgPCBwMyAmJiAobjIuZW5xdWV1ZShuZXcgVWludDhBcnJheShqMy5idWZmZXIsIDAsIHAzKSksIGozID0gbmV3IFVpbnQ4QXJyYXkoMjA0OCksIHAzID0gMCksIG4yLmVucXVldWUobDMpOwogICAgZWxzZSB7CiAgICAgIHZhciBlID0gajMubGVuZ3RoIC0gcDM7CiAgICAgIGUgPCBsMy5ieXRlTGVuZ3RoICYmIChlID09PSAwID8gbjIuZW5xdWV1ZShqMykgOiAoajMuc2V0KGwzLnN1YmFycmF5KDAsIGUpLCBwMyksIG4yLmVucXVldWUoajMpLCBsMyA9IGwzLnN1YmFycmF5KGUpKSwgajMgPSBuZXcgVWludDhBcnJheSgyMDQ4KSwgcDMgPSAwKSwgajMuc2V0KGwzLCBwMyksIHAzICs9IGwzLmJ5dGVMZW5ndGg7CiAgICB9CiAgfQogIGZ1bmN0aW9uIFMzKG4yLCBsMykgewogICAgcmV0dXJuIGQzKG4yLCBsMyksIHRydWU7CiAgfQogIGZ1bmN0aW9uIHFlMihuMikgewogICAgajMgJiYgMCA8IHAzICYmIChuMi5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KGozLmJ1ZmZlciwgMCwgcDMpKSwgajMgPSBudWxsLCBwMyA9IDApOwogIH0KICB2YXIgeWkyID0gbmV3IFRleHRFbmNvZGVyKCk7CiAgZnVuY3Rpb24gcyhuMikgewogICAgcmV0dXJuIHlpMi5lbmNvZGUobjIpOwogIH0KICBmdW5jdGlvbiBnKG4yKSB7CiAgICByZXR1cm4geWkyLmVuY29kZShuMik7CiAgfQogIGZ1bmN0aW9uIFJhKG4yKSB7CiAgICByZXR1cm4gbjIuYnl0ZUxlbmd0aDsKICB9CiAgZnVuY3Rpb24gVGkobjIsIGwzKSB7CiAgICB0eXBlb2YgbjIuZXJyb3IgPT0gImZ1bmN0aW9uIiA/IG4yLmVycm9yKGwzKSA6IG4yLmNsb3NlKCk7CiAgfQogIHZhciBLMiA9IE9iamVjdC5hc3NpZ24sIGs0ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwgU2EyID0gUmVnRXhwKCJeWzpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXVs6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwXSokIiksIFNyID0ge30sIEZyID0ge307CiAgZnVuY3Rpb24gTXQobjIpIHsKICAgIHJldHVybiBrNC5jYWxsKEZyLCBuMikgPyB0cnVlIDogazQuY2FsbChTciwgbjIpID8gZmFsc2UgOiBTYTIudGVzdChuMikgPyBGcltuMl0gPSB0cnVlIDogKFNyW24yXSA9IHRydWUsIGZhbHNlKTsKICB9CiAgdmFyIEZhID0gbmV3IFNldCgiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQgYXNwZWN0UmF0aW8gYm9yZGVySW1hZ2VPdXRzZXQgYm9yZGVySW1hZ2VTbGljZSBib3JkZXJJbWFnZVdpZHRoIGJveEZsZXggYm94RmxleEdyb3VwIGJveE9yZGluYWxHcm91cCBjb2x1bW5Db3VudCBjb2x1bW5zIGZsZXggZmxleEdyb3cgZmxleFBvc2l0aXZlIGZsZXhTaHJpbmsgZmxleE5lZ2F0aXZlIGZsZXhPcmRlciBncmlkQXJlYSBncmlkUm93IGdyaWRSb3dFbmQgZ3JpZFJvd1NwYW4gZ3JpZFJvd1N0YXJ0IGdyaWRDb2x1bW4gZ3JpZENvbHVtbkVuZCBncmlkQ29sdW1uU3BhbiBncmlkQ29sdW1uU3RhcnQgZm9udFdlaWdodCBsaW5lQ2xhbXAgbGluZUhlaWdodCBvcGFjaXR5IG9yZGVyIG9ycGhhbnMgc2NhbGUgdGFiU2l6ZSB3aWRvd3MgekluZGV4IHpvb20gZmlsbE9wYWNpdHkgZmxvb2RPcGFjaXR5IHN0b3BPcGFjaXR5IHN0cm9rZURhc2hhcnJheSBzdHJva2VEYXNob2Zmc2V0IHN0cm9rZU1pdGVybGltaXQgc3Ryb2tlT3BhY2l0eSBzdHJva2VXaWR0aCBNb3pBbmltYXRpb25JdGVyYXRpb25Db3VudCBNb3pCb3hGbGV4IE1vekJveEZsZXhHcm91cCBNb3pMaW5lQ2xhbXAgbXNBbmltYXRpb25JdGVyYXRpb25Db3VudCBtc0ZsZXggbXNab29tIG1zRmxleEdyb3cgbXNGbGV4TmVnYXRpdmUgbXNGbGV4T3JkZXIgbXNGbGV4UG9zaXRpdmUgbXNGbGV4U2hyaW5rIG1zR3JpZENvbHVtbiBtc0dyaWRDb2x1bW5TcGFuIG1zR3JpZFJvdyBtc0dyaWRSb3dTcGFuIFdlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50IFdlYmtpdEJveEZsZXggV2ViS2l0Qm94RmxleEdyb3VwIFdlYmtpdEJveE9yZGluYWxHcm91cCBXZWJraXRDb2x1bW5Db3VudCBXZWJraXRDb2x1bW5zIFdlYmtpdEZsZXggV2Via2l0RmxleEdyb3cgV2Via2l0RmxleFBvc2l0aXZlIFdlYmtpdEZsZXhTaHJpbmsgV2Via2l0TGluZUNsYW1wIi5zcGxpdCgiICIpKSwgUGEgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcChbCiAgICBbCiAgICAgICJhY2NlcHRDaGFyc2V0IiwKICAgICAgImFjY2VwdC1jaGFyc2V0IgogICAgXSwKICAgIFsKICAgICAgImh0bWxGb3IiLAogICAgICAiZm9yIgogICAgXSwKICAgIFsKICAgICAgImh0dHBFcXVpdiIsCiAgICAgICJodHRwLWVxdWl2IgogICAgXSwKICAgIFsKICAgICAgImNyb3NzT3JpZ2luIiwKICAgICAgImNyb3Nzb3JpZ2luIgogICAgXSwKICAgIFsKICAgICAgImFjY2VudEhlaWdodCIsCiAgICAgICJhY2NlbnQtaGVpZ2h0IgogICAgXSwKICAgIFsKICAgICAgImFsaWdubWVudEJhc2VsaW5lIiwKICAgICAgImFsaWdubWVudC1iYXNlbGluZSIKICAgIF0sCiAgICBbCiAgICAgICJhcmFiaWNGb3JtIiwKICAgICAgImFyYWJpYy1mb3JtIgogICAgXSwKICAgIFsKICAgICAgImJhc2VsaW5lU2hpZnQiLAogICAgICAiYmFzZWxpbmUtc2hpZnQiCiAgICBdLAogICAgWwogICAgICAiY2FwSGVpZ2h0IiwKICAgICAgImNhcC1oZWlnaHQiCiAgICBdLAogICAgWwogICAgICAiY2xpcFBhdGgiLAogICAgICAiY2xpcC1wYXRoIgogICAgXSwKICAgIFsKICAgICAgImNsaXBSdWxlIiwKICAgICAgImNsaXAtcnVsZSIKICAgIF0sCiAgICBbCiAgICAgICJjb2xvckludGVycG9sYXRpb24iLAogICAgICAiY29sb3ItaW50ZXJwb2xhdGlvbiIKICAgIF0sCiAgICBbCiAgICAgICJjb2xvckludGVycG9sYXRpb25GaWx0ZXJzIiwKICAgICAgImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyIKICAgIF0sCiAgICBbCiAgICAgICJjb2xvclByb2ZpbGUiLAogICAgICAiY29sb3ItcHJvZmlsZSIKICAgIF0sCiAgICBbCiAgICAgICJjb2xvclJlbmRlcmluZyIsCiAgICAgICJjb2xvci1yZW5kZXJpbmciCiAgICBdLAogICAgWwogICAgICAiZG9taW5hbnRCYXNlbGluZSIsCiAgICAgICJkb21pbmFudC1iYXNlbGluZSIKICAgIF0sCiAgICBbCiAgICAgICJlbmFibGVCYWNrZ3JvdW5kIiwKICAgICAgImVuYWJsZS1iYWNrZ3JvdW5kIgogICAgXSwKICAgIFsKICAgICAgImZpbGxPcGFjaXR5IiwKICAgICAgImZpbGwtb3BhY2l0eSIKICAgIF0sCiAgICBbCiAgICAgICJmaWxsUnVsZSIsCiAgICAgICJmaWxsLXJ1bGUiCiAgICBdLAogICAgWwogICAgICAiZmxvb2RDb2xvciIsCiAgICAgICJmbG9vZC1jb2xvciIKICAgIF0sCiAgICBbCiAgICAgICJmbG9vZE9wYWNpdHkiLAogICAgICAiZmxvb2Qtb3BhY2l0eSIKICAgIF0sCiAgICBbCiAgICAgICJmb250RmFtaWx5IiwKICAgICAgImZvbnQtZmFtaWx5IgogICAgXSwKICAgIFsKICAgICAgImZvbnRTaXplIiwKICAgICAgImZvbnQtc2l6ZSIKICAgIF0sCiAgICBbCiAgICAgICJmb250U2l6ZUFkanVzdCIsCiAgICAgICJmb250LXNpemUtYWRqdXN0IgogICAgXSwKICAgIFsKICAgICAgImZvbnRTdHJldGNoIiwKICAgICAgImZvbnQtc3RyZXRjaCIKICAgIF0sCiAgICBbCiAgICAgICJmb250U3R5bGUiLAogICAgICAiZm9udC1zdHlsZSIKICAgIF0sCiAgICBbCiAgICAgICJmb250VmFyaWFudCIsCiAgICAgICJmb250LXZhcmlhbnQiCiAgICBdLAogICAgWwogICAgICAiZm9udFdlaWdodCIsCiAgICAgICJmb250LXdlaWdodCIKICAgIF0sCiAgICBbCiAgICAgICJnbHlwaE5hbWUiLAogICAgICAiZ2x5cGgtbmFtZSIKICAgIF0sCiAgICBbCiAgICAgICJnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCIsCiAgICAgICJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIgogICAgXSwKICAgIFsKICAgICAgImdseXBoT3JpZW50YXRpb25WZXJ0aWNhbCIsCiAgICAgICJnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCIKICAgIF0sCiAgICBbCiAgICAgICJob3JpekFkdlgiLAogICAgICAiaG9yaXotYWR2LXgiCiAgICBdLAogICAgWwogICAgICAiaG9yaXpPcmlnaW5YIiwKICAgICAgImhvcml6LW9yaWdpbi14IgogICAgXSwKICAgIFsKICAgICAgImltYWdlUmVuZGVyaW5nIiwKICAgICAgImltYWdlLXJlbmRlcmluZyIKICAgIF0sCiAgICBbCiAgICAgICJsZXR0ZXJTcGFjaW5nIiwKICAgICAgImxldHRlci1zcGFjaW5nIgogICAgXSwKICAgIFsKICAgICAgImxpZ2h0aW5nQ29sb3IiLAogICAgICAibGlnaHRpbmctY29sb3IiCiAgICBdLAogICAgWwogICAgICAibWFya2VyRW5kIiwKICAgICAgIm1hcmtlci1lbmQiCiAgICBdLAogICAgWwogICAgICAibWFya2VyTWlkIiwKICAgICAgIm1hcmtlci1taWQiCiAgICBdLAogICAgWwogICAgICAibWFya2VyU3RhcnQiLAogICAgICAibWFya2VyLXN0YXJ0IgogICAgXSwKICAgIFsKICAgICAgIm92ZXJsaW5lUG9zaXRpb24iLAogICAgICAib3ZlcmxpbmUtcG9zaXRpb24iCiAgICBdLAogICAgWwogICAgICAib3ZlcmxpbmVUaGlja25lc3MiLAogICAgICAib3ZlcmxpbmUtdGhpY2tuZXNzIgogICAgXSwKICAgIFsKICAgICAgInBhaW50T3JkZXIiLAogICAgICAicGFpbnQtb3JkZXIiCiAgICBdLAogICAgWwogICAgICAicGFub3NlLTEiLAogICAgICAicGFub3NlLTEiCiAgICBdLAogICAgWwogICAgICAicG9pbnRlckV2ZW50cyIsCiAgICAgICJwb2ludGVyLWV2ZW50cyIKICAgIF0sCiAgICBbCiAgICAgICJyZW5kZXJpbmdJbnRlbnQiLAogICAgICAicmVuZGVyaW5nLWludGVudCIKICAgIF0sCiAgICBbCiAgICAgICJzaGFwZVJlbmRlcmluZyIsCiAgICAgICJzaGFwZS1yZW5kZXJpbmciCiAgICBdLAogICAgWwogICAgICAic3RvcENvbG9yIiwKICAgICAgInN0b3AtY29sb3IiCiAgICBdLAogICAgWwogICAgICAic3RvcE9wYWNpdHkiLAogICAgICAic3RvcC1vcGFjaXR5IgogICAgXSwKICAgIFsKICAgICAgInN0cmlrZXRocm91Z2hQb3NpdGlvbiIsCiAgICAgICJzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIgogICAgXSwKICAgIFsKICAgICAgInN0cmlrZXRocm91Z2hUaGlja25lc3MiLAogICAgICAic3RyaWtldGhyb3VnaC10aGlja25lc3MiCiAgICBdLAogICAgWwogICAgICAic3Ryb2tlRGFzaGFycmF5IiwKICAgICAgInN0cm9rZS1kYXNoYXJyYXkiCiAgICBdLAogICAgWwogICAgICAic3Ryb2tlRGFzaG9mZnNldCIsCiAgICAgICJzdHJva2UtZGFzaG9mZnNldCIKICAgIF0sCiAgICBbCiAgICAgICJzdHJva2VMaW5lY2FwIiwKICAgICAgInN0cm9rZS1saW5lY2FwIgogICAgXSwKICAgIFsKICAgICAgInN0cm9rZUxpbmVqb2luIiwKICAgICAgInN0cm9rZS1saW5lam9pbiIKICAgIF0sCiAgICBbCiAgICAgICJzdHJva2VNaXRlcmxpbWl0IiwKICAgICAgInN0cm9rZS1taXRlcmxpbWl0IgogICAgXSwKICAgIFsKICAgICAgInN0cm9rZU9wYWNpdHkiLAogICAgICAic3Ryb2tlLW9wYWNpdHkiCiAgICBdLAogICAgWwogICAgICAic3Ryb2tlV2lkdGgiLAogICAgICAic3Ryb2tlLXdpZHRoIgogICAgXSwKICAgIFsKICAgICAgInRleHRBbmNob3IiLAogICAgICAidGV4dC1hbmNob3IiCiAgICBdLAogICAgWwogICAgICAidGV4dERlY29yYXRpb24iLAogICAgICAidGV4dC1kZWNvcmF0aW9uIgogICAgXSwKICAgIFsKICAgICAgInRleHRSZW5kZXJpbmciLAogICAgICAidGV4dC1yZW5kZXJpbmciCiAgICBdLAogICAgWwogICAgICAidHJhbnNmb3JtT3JpZ2luIiwKICAgICAgInRyYW5zZm9ybS1vcmlnaW4iCiAgICBdLAogICAgWwogICAgICAidW5kZXJsaW5lUG9zaXRpb24iLAogICAgICAidW5kZXJsaW5lLXBvc2l0aW9uIgogICAgXSwKICAgIFsKICAgICAgInVuZGVybGluZVRoaWNrbmVzcyIsCiAgICAgICJ1bmRlcmxpbmUtdGhpY2tuZXNzIgogICAgXSwKICAgIFsKICAgICAgInVuaWNvZGVCaWRpIiwKICAgICAgInVuaWNvZGUtYmlkaSIKICAgIF0sCiAgICBbCiAgICAgICJ1bmljb2RlUmFuZ2UiLAogICAgICAidW5pY29kZS1yYW5nZSIKICAgIF0sCiAgICBbCiAgICAgICJ1bml0c1BlckVtIiwKICAgICAgInVuaXRzLXBlci1lbSIKICAgIF0sCiAgICBbCiAgICAgICJ2QWxwaGFiZXRpYyIsCiAgICAgICJ2LWFscGhhYmV0aWMiCiAgICBdLAogICAgWwogICAgICAidkhhbmdpbmciLAogICAgICAidi1oYW5naW5nIgogICAgXSwKICAgIFsKICAgICAgInZJZGVvZ3JhcGhpYyIsCiAgICAgICJ2LWlkZW9ncmFwaGljIgogICAgXSwKICAgIFsKICAgICAgInZNYXRoZW1hdGljYWwiLAogICAgICAidi1tYXRoZW1hdGljYWwiCiAgICBdLAogICAgWwogICAgICAidmVjdG9yRWZmZWN0IiwKICAgICAgInZlY3Rvci1lZmZlY3QiCiAgICBdLAogICAgWwogICAgICAidmVydEFkdlkiLAogICAgICAidmVydC1hZHYteSIKICAgIF0sCiAgICBbCiAgICAgICJ2ZXJ0T3JpZ2luWCIsCiAgICAgICJ2ZXJ0LW9yaWdpbi14IgogICAgXSwKICAgIFsKICAgICAgInZlcnRPcmlnaW5ZIiwKICAgICAgInZlcnQtb3JpZ2luLXkiCiAgICBdLAogICAgWwogICAgICAid29yZFNwYWNpbmciLAogICAgICAid29yZC1zcGFjaW5nIgogICAgXSwKICAgIFsKICAgICAgIndyaXRpbmdNb2RlIiwKICAgICAgIndyaXRpbmctbW9kZSIKICAgIF0sCiAgICBbCiAgICAgICJ4bWxuc1hsaW5rIiwKICAgICAgInhtbG5zOnhsaW5rIgogICAgXSwKICAgIFsKICAgICAgInhIZWlnaHQiLAogICAgICAieC1oZWlnaHQiCiAgICBdCiAgXSksIEFhID0gL1siJyY8Pl0vOwogIGZ1bmN0aW9uIEU0KG4yKSB7CiAgICBpZiAodHlwZW9mIG4yID09ICJib29sZWFuIiB8fCB0eXBlb2YgbjIgPT0gIm51bWJlciIgfHwgdHlwZW9mIG4yID09ICJiaWdpbnQiKSByZXR1cm4gIiIgKyBuMjsKICAgIG4yID0gIiIgKyBuMjsKICAgIHZhciBsMyA9IEFhLmV4ZWMobjIpOwogICAgaWYgKGwzKSB7CiAgICAgIHZhciBlID0gIiIsIHQsIHIgPSAwOwogICAgICBmb3IgKHQgPSBsMy5pbmRleDsgdCA8IG4yLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgc3dpdGNoIChuMi5jaGFyQ29kZUF0KHQpKSB7CiAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICBsMyA9ICImcXVvdDsiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgIGwzID0gIiZhbXA7IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM5OgogICAgICAgICAgICBsMyA9ICImI3gyNzsiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNjA6CiAgICAgICAgICAgIGwzID0gIiZsdDsiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNjI6CiAgICAgICAgICAgIGwzID0gIiZndDsiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICByICE9PSB0ICYmIChlICs9IG4yLnNsaWNlKHIsIHQpKSwgciA9IHQgKyAxLCBlICs9IGwzOwogICAgICB9CiAgICAgIG4yID0gciAhPT0gdCA/IGUgKyBuMi5zbGljZShyLCB0KSA6IGU7CiAgICB9CiAgICByZXR1cm4gbjI7CiAgfQogIHZhciBrYTIgPSAvKFtBLVpdKS9nLCBNYSA9IC9ebXMtLywgSWEgPSAvXltcdTAwMDAtXHUwMDFGIF0qaltcclxuXHRdKmFbXHJcblx0XSp2W1xyXG5cdF0qYVtcclxuXHRdKnNbXHJcblx0XSpjW1xyXG5cdF0qcltcclxuXHRdKmlbXHJcblx0XSpwW1xyXG5cdF0qdFtcclxuXHRdKjovaTsKICBmdW5jdGlvbiBrbChuMikgewogICAgcmV0dXJuIElhLnRlc3QoIiIgKyBuMikgPyAiamF2YXNjcmlwdDp0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IGhhcyBibG9ja2VkIGEgamF2YXNjcmlwdDogVVJMIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4nKSIgOiBuMjsKICB9CiAgdmFyIHFuID0gU3QuX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFLCBFaSA9IGJhLl9fRE9NX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1dBUk5fVVNFUlNfVEhFWV9DQU5OT1RfVVBHUkFERSwgT2EyID0gewogICAgcGVuZGluZzogZmFsc2UsCiAgICBkYXRhOiBudWxsLAogICAgbWV0aG9kOiBudWxsLAogICAgYWN0aW9uOiBudWxsCiAgfSwgRW4gPSBFaS5kOwogIEVpLmQgPSB7CiAgICBmOiBFbi5mLAogICAgcjogRW4uciwKICAgIEQ6IHZ1LAogICAgQzogc3UsCiAgICBMOiBidSwKICAgIG06IHl1LAogICAgWDogRXUsCiAgICBTOiBUdSwKICAgIE06IHd1CiAgfTsKICB2YXIgdG4gPSBbXSwgZWwgPSBudWxsOwogIGcoJyI+PC90ZW1wbGF0ZT4nKTsKICB2YXIgX2EgPSBnKCI8c2NyaXB0IiksIGRlMiA9IGcoIjxcL3NjcmlwdD4iKSwgTGEyID0gZygnPHNjcmlwdCBzcmM9IicpLCBCYSA9IGcoJzxzY3JpcHQgdHlwZT0ibW9kdWxlIiBzcmM9IicpLCBQciA9IGcoJyBub25jZT0iJyksIEFyID0gZygnIGludGVncml0eT0iJyksIGtyID0gZygnIGNyb3Nzb3JpZ2luPSInKSwgTXIgPSBnKCcgYXN5bmM9IiI+PFwvc2NyaXB0PicpLCBOYSA9IGcoIjxzdHlsZSIpLCBhdCA9IC8oPFwvfDwpKHMpKGNyaXB0KS9naTsKICBmdW5jdGlvbiBjdChuMiwgbDMsIGUsIHQpIHsKICAgIHJldHVybiAiIiArIGwzICsgKGUgPT09ICJzIiA/ICJcXHUwMDczIiA6ICJcXHUwMDUzIikgKyB0OwogIH0KICB2YXIgemEgPSBnKCc8c2NyaXB0IHR5cGU9ImltcG9ydG1hcCI+JyksIERhID0gZygiPFwvc2NyaXB0PiIpOwogIGZ1bmN0aW9uIFBlMihuMiwgbDMsIGUsIHQsIHIsIGkpIHsKICAgIGUgPSB0eXBlb2YgbDMgPT0gInN0cmluZyIgPyBsMyA6IGwzICYmIGwzLnNjcmlwdDsKICAgIHZhciBhID0gZSA9PT0gdm9pZCAwID8gX2EgOiBnKCc8c2NyaXB0IG5vbmNlPSInICsgRTQoZSkgKyAnIicpLCB1MiA9IHR5cGVvZiBsMyA9PSAic3RyaW5nIiA/IHZvaWQgMCA6IGwzICYmIGwzLnN0eWxlLCBjMiA9IHUyID09PSB2b2lkIDAgPyBOYSA6IGcoJzxzdHlsZSBub25jZT0iJyArIEU0KHUyKSArICciJyksIGYyID0gbjIuaWRQcmVmaXgsIG8gPSBbXSwgaCA9IG4yLmJvb3RzdHJhcFNjcmlwdENvbnRlbnQsIHYzID0gbjIuYm9vdHN0cmFwU2NyaXB0cywgYjQgPSBuMi5ib290c3RyYXBNb2R1bGVzOwogICAgaWYgKGggIT09IHZvaWQgMCAmJiAoby5wdXNoKGEpLCBpZShvLCBuMiksIG8ucHVzaChJMiwgcygoIiIgKyBoKS5yZXBsYWNlKGF0LCBjdCkpLCBkZTIpKSwgaCA9IFtdLCB0ICE9PSB2b2lkIDAgJiYgKGgucHVzaCh6YSksIGgucHVzaChzKCgiIiArIEpTT04uc3RyaW5naWZ5KHQpKS5yZXBsYWNlKGF0LCBjdCkpKSwgaC5wdXNoKERhKSksIHQgPSByID8gewogICAgICBwcmVjb25uZWN0czogIiIsCiAgICAgIGZvbnRQcmVsb2FkczogIiIsCiAgICAgIGhpZ2hJbWFnZVByZWxvYWRzOiAiIiwKICAgICAgcmVtYWluaW5nQ2FwYWNpdHk6IDIgKyAodHlwZW9mIGkgPT0gIm51bWJlciIgPyBpIDogMmUzKQogICAgfSA6IG51bGwsIHIgPSB7CiAgICAgIHBsYWNlaG9sZGVyUHJlZml4OiBnKGYyICsgIlA6IiksCiAgICAgIHNlZ21lbnRQcmVmaXg6IGcoZjIgKyAiUzoiKSwKICAgICAgYm91bmRhcnlQcmVmaXg6IGcoZjIgKyAiQjoiKSwKICAgICAgc3RhcnRJbmxpbmVTY3JpcHQ6IGEsCiAgICAgIHN0YXJ0SW5saW5lU3R5bGU6IGMyLAogICAgICBwcmVhbWJsZTogTWwoKSwKICAgICAgZXh0ZXJuYWxSdW50aW1lU2NyaXB0OiBudWxsLAogICAgICBib290c3RyYXBDaHVua3M6IG8sCiAgICAgIGltcG9ydE1hcENodW5rczogaCwKICAgICAgb25IZWFkZXJzOiByLAogICAgICBoZWFkZXJzOiB0LAogICAgICByZXNldHM6IHsKICAgICAgICBmb250OiB7fSwKICAgICAgICBkbnM6IHt9LAogICAgICAgIGNvbm5lY3Q6IHsKICAgICAgICAgIGRlZmF1bHQ6IHt9LAogICAgICAgICAgYW5vbnltb3VzOiB7fSwKICAgICAgICAgIGNyZWRlbnRpYWxzOiB7fQogICAgICAgIH0sCiAgICAgICAgaW1hZ2U6IHt9LAogICAgICAgIHN0eWxlOiB7fQogICAgICB9LAogICAgICBjaGFyc2V0Q2h1bmtzOiBbXSwKICAgICAgdmlld3BvcnRDaHVua3M6IFtdLAogICAgICBob2lzdGFibGVDaHVua3M6IFtdLAogICAgICBwcmVjb25uZWN0czogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwKICAgICAgZm9udFByZWxvYWRzOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLAogICAgICBoaWdoSW1hZ2VQcmVsb2FkczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwKICAgICAgc3R5bGVzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLAogICAgICBib290c3RyYXBTY3JpcHRzOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLAogICAgICBzY3JpcHRzOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLAogICAgICBidWxrUHJlbG9hZHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksCiAgICAgIHByZWxvYWRzOiB7CiAgICAgICAgaW1hZ2VzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLAogICAgICAgIHN0eWxlc2hlZXRzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLAogICAgICAgIHNjcmlwdHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksCiAgICAgICAgbW9kdWxlU2NyaXB0czogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKQogICAgICB9LAogICAgICBub25jZTogewogICAgICAgIHNjcmlwdDogZSwKICAgICAgICBzdHlsZTogdTIKICAgICAgfSwKICAgICAgaG9pc3RhYmxlU3RhdGU6IG51bGwsCiAgICAgIHN0eWxlc1RvSG9pc3Q6IGZhbHNlCiAgICB9LCB2MyAhPT0gdm9pZCAwKSBmb3IgKHQgPSAwOyB0IDwgdjMubGVuZ3RoOyB0KyspIGYyID0gdjNbdF0sIHUyID0gYSA9IHZvaWQgMCwgYzIgPSB7CiAgICAgIHJlbDogInByZWxvYWQiLAogICAgICBhczogInNjcmlwdCIsCiAgICAgIGZldGNoUHJpb3JpdHk6ICJsb3ciLAogICAgICBub25jZTogbDMKICAgIH0sIHR5cGVvZiBmMiA9PSAic3RyaW5nIiA/IGMyLmhyZWYgPSBpID0gZjIgOiAoYzIuaHJlZiA9IGkgPSBmMi5zcmMsIGMyLmludGVncml0eSA9IHUyID0gdHlwZW9mIGYyLmludGVncml0eSA9PSAic3RyaW5nIiA/IGYyLmludGVncml0eSA6IHZvaWQgMCwgYzIuY3Jvc3NPcmlnaW4gPSBhID0gdHlwZW9mIGYyID09ICJzdHJpbmciIHx8IGYyLmNyb3NzT3JpZ2luID09IG51bGwgPyB2b2lkIDAgOiBmMi5jcm9zc09yaWdpbiA9PT0gInVzZS1jcmVkZW50aWFscyIgPyAidXNlLWNyZWRlbnRpYWxzIiA6ICIiKSwgZjIgPSBuMiwgaCA9IGksIGYyLnNjcmlwdFJlc291cmNlc1toXSA9IG51bGwsIGYyLm1vZHVsZVNjcmlwdFJlc291cmNlc1toXSA9IG51bGwsIGYyID0gW10sIFUyKGYyLCBjMiksIHIuYm9vdHN0cmFwU2NyaXB0cy5hZGQoZjIpLCBvLnB1c2goTGEyLCBzKEU0KGkpKSwgTyksIGUgJiYgby5wdXNoKFByLCBzKEU0KGUpKSwgTyksIHR5cGVvZiB1MiA9PSAic3RyaW5nIiAmJiBvLnB1c2goQXIsIHMoRTQodTIpKSwgTyksIHR5cGVvZiBhID09ICJzdHJpbmciICYmIG8ucHVzaChrciwgcyhFNChhKSksIE8pLCBpZShvLCBuMiksIG8ucHVzaChNcik7CiAgICBpZiAoYjQgIT09IHZvaWQgMCkgZm9yIChsMyA9IDA7IGwzIDwgYjQubGVuZ3RoOyBsMysrKSB1MiA9IGI0W2wzXSwgaSA9IHQgPSB2b2lkIDAsIGEgPSB7CiAgICAgIHJlbDogIm1vZHVsZXByZWxvYWQiLAogICAgICBmZXRjaFByaW9yaXR5OiAibG93IiwKICAgICAgbm9uY2U6IGUKICAgIH0sIHR5cGVvZiB1MiA9PSAic3RyaW5nIiA/IGEuaHJlZiA9IHYzID0gdTIgOiAoYS5ocmVmID0gdjMgPSB1Mi5zcmMsIGEuaW50ZWdyaXR5ID0gaSA9IHR5cGVvZiB1Mi5pbnRlZ3JpdHkgPT0gInN0cmluZyIgPyB1Mi5pbnRlZ3JpdHkgOiB2b2lkIDAsIGEuY3Jvc3NPcmlnaW4gPSB0ID0gdHlwZW9mIHUyID09ICJzdHJpbmciIHx8IHUyLmNyb3NzT3JpZ2luID09IG51bGwgPyB2b2lkIDAgOiB1Mi5jcm9zc09yaWdpbiA9PT0gInVzZS1jcmVkZW50aWFscyIgPyAidXNlLWNyZWRlbnRpYWxzIiA6ICIiKSwgdTIgPSBuMiwgYzIgPSB2MywgdTIuc2NyaXB0UmVzb3VyY2VzW2MyXSA9IG51bGwsIHUyLm1vZHVsZVNjcmlwdFJlc291cmNlc1tjMl0gPSBudWxsLCB1MiA9IFtdLCBVMih1MiwgYSksIHIuYm9vdHN0cmFwU2NyaXB0cy5hZGQodTIpLCBvLnB1c2goQmEsIHMoRTQodjMpKSwgTyksIGUgJiYgby5wdXNoKFByLCBzKEU0KGUpKSwgTyksIHR5cGVvZiBpID09ICJzdHJpbmciICYmIG8ucHVzaChBciwgcyhFNChpKSksIE8pLCB0eXBlb2YgdCA9PSAic3RyaW5nIiAmJiBvLnB1c2goa3IsIHMoRTQodCkpLCBPKSwgaWUobywgbjIpLCBvLnB1c2goTXIpOwogICAgcmV0dXJuIHI7CiAgfQogIGZ1bmN0aW9uIHdpKG4yLCBsMywgZSwgdCwgcikgewogICAgcmV0dXJuIHsKICAgICAgaWRQcmVmaXg6IG4yID09PSB2b2lkIDAgPyAiIiA6IG4yLAogICAgICBuZXh0Rm9ybUlEOiAwLAogICAgICBzdHJlYW1pbmdGb3JtYXQ6IDAsCiAgICAgIGJvb3RzdHJhcFNjcmlwdENvbnRlbnQ6IGUsCiAgICAgIGJvb3RzdHJhcFNjcmlwdHM6IHQsCiAgICAgIGJvb3RzdHJhcE1vZHVsZXM6IHIsCiAgICAgIGluc3RydWN0aW9uczogMCwKICAgICAgaGFzQm9keTogZmFsc2UsCiAgICAgIGhhc0h0bWw6IGZhbHNlLAogICAgICB1bmtub3duUmVzb3VyY2VzOiB7fSwKICAgICAgZG5zUmVzb3VyY2VzOiB7fSwKICAgICAgY29ubmVjdFJlc291cmNlczogewogICAgICAgIGRlZmF1bHQ6IHt9LAogICAgICAgIGFub255bW91czoge30sCiAgICAgICAgY3JlZGVudGlhbHM6IHt9CiAgICAgIH0sCiAgICAgIGltYWdlUmVzb3VyY2VzOiB7fSwKICAgICAgc3R5bGVSZXNvdXJjZXM6IHt9LAogICAgICBzY3JpcHRSZXNvdXJjZXM6IHt9LAogICAgICBtb2R1bGVVbmtub3duUmVzb3VyY2VzOiB7fSwKICAgICAgbW9kdWxlU2NyaXB0UmVzb3VyY2VzOiB7fQogICAgfTsKICB9CiAgZnVuY3Rpb24gTWwoKSB7CiAgICByZXR1cm4gewogICAgICBodG1sQ2h1bmtzOiBudWxsLAogICAgICBoZWFkQ2h1bmtzOiBudWxsLAogICAgICBib2R5Q2h1bmtzOiBudWxsCiAgICB9OwogIH0KICBmdW5jdGlvbiB6MyhuMiwgbDMsIGUsIHQpIHsKICAgIHJldHVybiB7CiAgICAgIGluc2VydGlvbk1vZGU6IG4yLAogICAgICBzZWxlY3RlZFZhbHVlOiBsMywKICAgICAgdGFnU2NvcGU6IGUsCiAgICAgIHZpZXdUcmFuc2l0aW9uOiB0CiAgICB9OwogIH0KICBmdW5jdGlvbiB4aShuMikgewogICAgcmV0dXJuIHozKG4yID09PSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciID8gNCA6IG4yID09PSAiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCIgPyA1IDogMCwgbnVsbCwgMCwgbnVsbCk7CiAgfQogIGZ1bmN0aW9uIElyKG4yLCBsMywgZSkgewogICAgdmFyIHQgPSBuMi50YWdTY29wZSAmIC0yNTsKICAgIHN3aXRjaCAobDMpIHsKICAgICAgY2FzZSAibm9zY3JpcHQiOgogICAgICAgIHJldHVybiB6MygyLCBudWxsLCB0IHwgMSwgbnVsbCk7CiAgICAgIGNhc2UgInNlbGVjdCI6CiAgICAgICAgcmV0dXJuIHozKDIsIGUudmFsdWUgIT0gbnVsbCA/IGUudmFsdWUgOiBlLmRlZmF1bHRWYWx1ZSwgdCwgbnVsbCk7CiAgICAgIGNhc2UgInN2ZyI6CiAgICAgICAgcmV0dXJuIHozKDQsIG51bGwsIHQsIG51bGwpOwogICAgICBjYXNlICJwaWN0dXJlIjoKICAgICAgICByZXR1cm4gejMoMiwgbnVsbCwgdCB8IDIsIG51bGwpOwogICAgICBjYXNlICJtYXRoIjoKICAgICAgICByZXR1cm4gejMoNSwgbnVsbCwgdCwgbnVsbCk7CiAgICAgIGNhc2UgImZvcmVpZ25PYmplY3QiOgogICAgICAgIHJldHVybiB6MygyLCBudWxsLCB0LCBudWxsKTsKICAgICAgY2FzZSAidGFibGUiOgogICAgICAgIHJldHVybiB6Myg2LCBudWxsLCB0LCBudWxsKTsKICAgICAgY2FzZSAidGhlYWQiOgogICAgICBjYXNlICJ0Ym9keSI6CiAgICAgIGNhc2UgInRmb290IjoKICAgICAgICByZXR1cm4gejMoNywgbnVsbCwgdCwgbnVsbCk7CiAgICAgIGNhc2UgImNvbGdyb3VwIjoKICAgICAgICByZXR1cm4gejMoOSwgbnVsbCwgdCwgbnVsbCk7CiAgICAgIGNhc2UgInRyIjoKICAgICAgICByZXR1cm4gejMoOCwgbnVsbCwgdCwgbnVsbCk7CiAgICAgIGNhc2UgImhlYWQiOgogICAgICAgIGlmICgyID4gbjIuaW5zZXJ0aW9uTW9kZSkgcmV0dXJuIHozKDMsIG51bGwsIHQsIG51bGwpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJodG1sIjoKICAgICAgICBpZiAobjIuaW5zZXJ0aW9uTW9kZSA9PT0gMCkgcmV0dXJuIHozKDEsIG51bGwsIHQsIG51bGwpOwogICAgfQogICAgcmV0dXJuIDYgPD0gbjIuaW5zZXJ0aW9uTW9kZSB8fCAyID4gbjIuaW5zZXJ0aW9uTW9kZSA/IHozKDIsIG51bGwsIHQsIG51bGwpIDogbjIudGFnU2NvcGUgIT09IHQgPyB6MyhuMi5pbnNlcnRpb25Nb2RlLCBuMi5zZWxlY3RlZFZhbHVlLCB0LCBudWxsKSA6IG4yOwogIH0KICBmdW5jdGlvbiBDaShuMikgewogICAgcmV0dXJuIG4yID09PSBudWxsID8gbnVsbCA6IHsKICAgICAgdXBkYXRlOiBuMi51cGRhdGUsCiAgICAgIGVudGVyOiAibm9uZSIsCiAgICAgIGV4aXQ6ICJub25lIiwKICAgICAgc2hhcmU6IG4yLnVwZGF0ZSwKICAgICAgbmFtZTogbjIuYXV0b05hbWUsCiAgICAgIGF1dG9OYW1lOiBuMi5hdXRvTmFtZSwKICAgICAgbmFtZUlkeDogMAogICAgfTsKICB9CiAgZnVuY3Rpb24gdXQobjIsIGwzKSB7CiAgICByZXR1cm4gbDMudGFnU2NvcGUgJiAzMiAmJiAobjIuaW5zdHJ1Y3Rpb25zIHw9IDEyOCksIHozKGwzLmluc2VydGlvbk1vZGUsIGwzLnNlbGVjdGVkVmFsdWUsIGwzLnRhZ1Njb3BlIHwgMTIsIENpKGwzLnZpZXdUcmFuc2l0aW9uKSk7CiAgfQogIGZ1bmN0aW9uIHJlKG4yLCBsMykgewogICAgbjIgPSBDaShsMy52aWV3VHJhbnNpdGlvbik7CiAgICB2YXIgZSA9IGwzLnRhZ1Njb3BlIHwgMTY7CiAgICByZXR1cm4gbjIgIT09IG51bGwgJiYgbjIuc2hhcmUgIT09ICJub25lIiAmJiAoZSB8PSA2NCksIHozKGwzLmluc2VydGlvbk1vZGUsIGwzLnNlbGVjdGVkVmFsdWUsIGUsIG4yKTsKICB9CiAgdmFyIGRuID0gZygiPCEtLSAtLT4iKTsKICBmdW5jdGlvbiBPcihuMiwgbDMsIGUsIHQpIHsKICAgIHJldHVybiBsMyA9PT0gIiIgPyB0IDogKHQgJiYgbjIucHVzaChkbiksIG4yLnB1c2gocyhFNChsMykpKSwgdHJ1ZSk7CiAgfQogIHZhciBfciA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIEhhID0gZygnIHN0eWxlPSInKSwgTHIgPSBnKCI6IiksIFdhID0gZygiOyIpOwogIGZ1bmN0aW9uIFJpKG4yLCBsMykgewogICAgaWYgKHR5cGVvZiBsMyAhPSAib2JqZWN0IikgdGhyb3cgRXJyb3IoeTIoNjIpKTsKICAgIHZhciBlID0gdHJ1ZSwgdDsKICAgIGZvciAodCBpbiBsMykgaWYgKGs0LmNhbGwobDMsIHQpKSB7CiAgICAgIHZhciByID0gbDNbdF07CiAgICAgIGlmIChyICE9IG51bGwgJiYgdHlwZW9mIHIgIT0gImJvb2xlYW4iICYmIHIgIT09ICIiKSB7CiAgICAgICAgaWYgKHQuaW5kZXhPZigiLS0iKSA9PT0gMCkgewogICAgICAgICAgdmFyIGkgPSBzKEU0KHQpKTsKICAgICAgICAgIHIgPSBzKEU0KCgiIiArIHIpLnRyaW0oKSkpOwogICAgICAgIH0gZWxzZSBpID0gX3IuZ2V0KHQpLCBpID09PSB2b2lkIDAgJiYgKGkgPSBnKEU0KHQucmVwbGFjZShrYTIsICItJDEiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoTWEsICItbXMtIikpKSwgX3Iuc2V0KHQsIGkpKSwgciA9IHR5cGVvZiByID09ICJudW1iZXIiID8gciA9PT0gMCB8fCBGYS5oYXModCkgPyBzKCIiICsgcikgOiBzKHIgKyAicHgiKSA6IHMoRTQoKCIiICsgcikudHJpbSgpKSk7CiAgICAgICAgZSA/IChlID0gZmFsc2UsIG4yLnB1c2goSGEsIGksIExyLCByKSkgOiBuMi5wdXNoKFdhLCBpLCBMciwgcik7CiAgICAgIH0KICAgIH0KICAgIGUgfHwgbjIucHVzaChPKTsKICB9CiAgdmFyIFogPSBnKCIgIiksIGVuID0gZygnPSInKSwgTyA9IGcoJyInKSwgZnQgPSBnKCc9IiInKTsKICBmdW5jdGlvbiBvdChuMiwgbDMsIGUpIHsKICAgIGUgJiYgdHlwZW9mIGUgIT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgZSAhPSAic3ltYm9sIiAmJiBuMi5wdXNoKFosIHMobDMpLCBmdCk7CiAgfQogIGZ1bmN0aW9uIFcobjIsIGwzLCBlKSB7CiAgICB0eXBlb2YgZSAhPSAiZnVuY3Rpb24iICYmIHR5cGVvZiBlICE9ICJzeW1ib2wiICYmIHR5cGVvZiBlICE9ICJib29sZWFuIiAmJiBuMi5wdXNoKFosIHMobDMpLCBlbiwgcyhFNChlKSksIE8pOwogIH0KICB2YXIgU2kgPSBnKEU0KCJqYXZhc2NyaXB0OnRocm93IG5ldyBFcnJvcignUmVhY3QgZm9ybSB1bmV4cGVjdGVkbHkgc3VibWl0dGVkLicpIikpLCBGaSA9IGcoJzxpbnB1dCB0eXBlPSJoaWRkZW4iJyk7CiAgZnVuY3Rpb24gamUyKG4yLCBsMykgewogICAgdGhpcy5wdXNoKEZpKSwgUGkobjIpLCBXKHRoaXMsICJuYW1lIiwgbDMpLCBXKHRoaXMsICJ2YWx1ZSIsIG4yKSwgdGhpcy5wdXNoKElsKTsKICB9CiAgZnVuY3Rpb24gUGkobjIpIHsKICAgIGlmICh0eXBlb2YgbjIgIT0gInN0cmluZyIpIHRocm93IEVycm9yKHkyKDQ4MCkpOwogIH0KICBmdW5jdGlvbiBBaShuMiwgbDMpIHsKICAgIGlmICh0eXBlb2YgbDMuJCRGT1JNX0FDVElPTiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgIHZhciBlID0gbjIubmV4dEZvcm1JRCsrOwogICAgICBuMiA9IG4yLmlkUHJlZml4ICsgZTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgdCA9IGwzLiQkRk9STV9BQ1RJT04objIpOwogICAgICAgIGlmICh0KSB7CiAgICAgICAgICB2YXIgciA9IHQuZGF0YTsKICAgICAgICAgIHI/LmZvckVhY2goUGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdDsKICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgIGlmICh0eXBlb2YgaSA9PSAib2JqZWN0IiAmJiBpICE9PSBudWxsICYmIHR5cGVvZiBpLnRoZW4gPT0gImZ1bmN0aW9uIikgdGhyb3cgaTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGZ1bmN0aW9uIEJyKG4yLCBsMywgZSwgdCwgciwgaSwgYSwgdTIpIHsKICAgIHZhciBjMiA9IG51bGw7CiAgICBpZiAodHlwZW9mIHQgPT0gImZ1bmN0aW9uIikgewogICAgICB2YXIgZjIgPSBBaShsMywgdCk7CiAgICAgIGYyICE9PSBudWxsID8gKHUyID0gZjIubmFtZSwgdCA9IGYyLmFjdGlvbiB8fCAiIiwgciA9IGYyLmVuY1R5cGUsIGkgPSBmMi5tZXRob2QsIGEgPSBmMi50YXJnZXQsIGMyID0gZjIuZGF0YSkgOiAobjIucHVzaChaLCBzKCJmb3JtQWN0aW9uIiksIGVuLCBTaSwgTyksIGEgPSBpID0gciA9IHQgPSB1MiA9IG51bGwsIGtpKGwzLCBlKSk7CiAgICB9CiAgICByZXR1cm4gdTIgIT0gbnVsbCAmJiBSMyhuMiwgIm5hbWUiLCB1MiksIHQgIT0gbnVsbCAmJiBSMyhuMiwgImZvcm1BY3Rpb24iLCB0KSwgciAhPSBudWxsICYmIFIzKG4yLCAiZm9ybUVuY1R5cGUiLCByKSwgaSAhPSBudWxsICYmIFIzKG4yLCAiZm9ybU1ldGhvZCIsIGkpLCBhICE9IG51bGwgJiYgUjMobjIsICJmb3JtVGFyZ2V0IiwgYSksIGMyOwogIH0KICBmdW5jdGlvbiBSMyhuMiwgbDMsIGUpIHsKICAgIHN3aXRjaCAobDMpIHsKICAgICAgY2FzZSAiY2xhc3NOYW1lIjoKICAgICAgICBXKG4yLCAiY2xhc3MiLCBlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidGFiSW5kZXgiOgogICAgICAgIFcobjIsICJ0YWJpbmRleCIsIGUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJkaXIiOgogICAgICBjYXNlICJyb2xlIjoKICAgICAgY2FzZSAidmlld0JveCI6CiAgICAgIGNhc2UgIndpZHRoIjoKICAgICAgY2FzZSAiaGVpZ2h0IjoKICAgICAgICBXKG4yLCBsMywgZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInN0eWxlIjoKICAgICAgICBSaShuMiwgZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInNyYyI6CiAgICAgIGNhc2UgImhyZWYiOgogICAgICAgIGlmIChlID09PSAiIikgYnJlYWs7CiAgICAgIGNhc2UgImFjdGlvbiI6CiAgICAgIGNhc2UgImZvcm1BY3Rpb24iOgogICAgICAgIGlmIChlID09IG51bGwgfHwgdHlwZW9mIGUgPT0gImZ1bmN0aW9uIiB8fCB0eXBlb2YgZSA9PSAic3ltYm9sIiB8fCB0eXBlb2YgZSA9PSAiYm9vbGVhbiIpIGJyZWFrOwogICAgICAgIGUgPSBrbCgiIiArIGUpLCBuMi5wdXNoKFosIHMobDMpLCBlbiwgcyhFNChlKSksIE8pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJkZWZhdWx0VmFsdWUiOgogICAgICBjYXNlICJkZWZhdWx0Q2hlY2tlZCI6CiAgICAgIGNhc2UgImlubmVySFRNTCI6CiAgICAgIGNhc2UgInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyI6CiAgICAgIGNhc2UgInN1cHByZXNzSHlkcmF0aW9uV2FybmluZyI6CiAgICAgIGNhc2UgInJlZiI6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImF1dG9Gb2N1cyI6CiAgICAgIGNhc2UgIm11bHRpcGxlIjoKICAgICAgY2FzZSAibXV0ZWQiOgogICAgICAgIG90KG4yLCBsMy50b0xvd2VyQ2FzZSgpLCBlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAieGxpbmtIcmVmIjoKICAgICAgICBpZiAodHlwZW9mIGUgPT0gImZ1bmN0aW9uIiB8fCB0eXBlb2YgZSA9PSAic3ltYm9sIiB8fCB0eXBlb2YgZSA9PSAiYm9vbGVhbiIpIGJyZWFrOwogICAgICAgIGUgPSBrbCgiIiArIGUpLCBuMi5wdXNoKFosIHMoInhsaW5rOmhyZWYiKSwgZW4sIHMoRTQoZSkpLCBPKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiY29udGVudEVkaXRhYmxlIjoKICAgICAgY2FzZSAic3BlbGxDaGVjayI6CiAgICAgIGNhc2UgImRyYWdnYWJsZSI6CiAgICAgIGNhc2UgInZhbHVlIjoKICAgICAgY2FzZSAiYXV0b1JldmVyc2UiOgogICAgICBjYXNlICJleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkIjoKICAgICAgY2FzZSAiZm9jdXNhYmxlIjoKICAgICAgY2FzZSAicHJlc2VydmVBbHBoYSI6CiAgICAgICAgdHlwZW9mIGUgIT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgZSAhPSAic3ltYm9sIiAmJiBuMi5wdXNoKFosIHMobDMpLCBlbiwgcyhFNChlKSksIE8pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJpbmVydCI6CiAgICAgIGNhc2UgImFsbG93RnVsbFNjcmVlbiI6CiAgICAgIGNhc2UgImFzeW5jIjoKICAgICAgY2FzZSAiYXV0b1BsYXkiOgogICAgICBjYXNlICJjb250cm9scyI6CiAgICAgIGNhc2UgImRlZmF1bHQiOgogICAgICBjYXNlICJkZWZlciI6CiAgICAgIGNhc2UgImRpc2FibGVkIjoKICAgICAgY2FzZSAiZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUiOgogICAgICBjYXNlICJkaXNhYmxlUmVtb3RlUGxheWJhY2siOgogICAgICBjYXNlICJmb3JtTm9WYWxpZGF0ZSI6CiAgICAgIGNhc2UgImhpZGRlbiI6CiAgICAgIGNhc2UgImxvb3AiOgogICAgICBjYXNlICJub01vZHVsZSI6CiAgICAgIGNhc2UgIm5vVmFsaWRhdGUiOgogICAgICBjYXNlICJvcGVuIjoKICAgICAgY2FzZSAicGxheXNJbmxpbmUiOgogICAgICBjYXNlICJyZWFkT25seSI6CiAgICAgIGNhc2UgInJlcXVpcmVkIjoKICAgICAgY2FzZSAicmV2ZXJzZWQiOgogICAgICBjYXNlICJzY29wZWQiOgogICAgICBjYXNlICJzZWFtbGVzcyI6CiAgICAgIGNhc2UgIml0ZW1TY29wZSI6CiAgICAgICAgZSAmJiB0eXBlb2YgZSAhPSAiZnVuY3Rpb24iICYmIHR5cGVvZiBlICE9ICJzeW1ib2wiICYmIG4yLnB1c2goWiwgcyhsMyksIGZ0KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiY2FwdHVyZSI6CiAgICAgIGNhc2UgImRvd25sb2FkIjoKICAgICAgICBlID09PSB0cnVlID8gbjIucHVzaChaLCBzKGwzKSwgZnQpIDogZSAhPT0gZmFsc2UgJiYgdHlwZW9mIGUgIT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgZSAhPSAic3ltYm9sIiAmJiBuMi5wdXNoKFosIHMobDMpLCBlbiwgcyhFNChlKSksIE8pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJjb2xzIjoKICAgICAgY2FzZSAicm93cyI6CiAgICAgIGNhc2UgInNpemUiOgogICAgICBjYXNlICJzcGFuIjoKICAgICAgICB0eXBlb2YgZSAhPSAiZnVuY3Rpb24iICYmIHR5cGVvZiBlICE9ICJzeW1ib2wiICYmICFpc05hTihlKSAmJiAxIDw9IGUgJiYgbjIucHVzaChaLCBzKGwzKSwgZW4sIHMoRTQoZSkpLCBPKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAicm93U3BhbiI6CiAgICAgIGNhc2UgInN0YXJ0IjoKICAgICAgICB0eXBlb2YgZSA9PSAiZnVuY3Rpb24iIHx8IHR5cGVvZiBlID09ICJzeW1ib2wiIHx8IGlzTmFOKGUpIHx8IG4yLnB1c2goWiwgcyhsMyksIGVuLCBzKEU0KGUpKSwgTyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInhsaW5rQWN0dWF0ZSI6CiAgICAgICAgVyhuMiwgInhsaW5rOmFjdHVhdGUiLCBlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAieGxpbmtBcmNyb2xlIjoKICAgICAgICBXKG4yLCAieGxpbms6YXJjcm9sZSIsIGUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ4bGlua1JvbGUiOgogICAgICAgIFcobjIsICJ4bGluazpyb2xlIiwgZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInhsaW5rU2hvdyI6CiAgICAgICAgVyhuMiwgInhsaW5rOnNob3ciLCBlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAieGxpbmtUaXRsZSI6CiAgICAgICAgVyhuMiwgInhsaW5rOnRpdGxlIiwgZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInhsaW5rVHlwZSI6CiAgICAgICAgVyhuMiwgInhsaW5rOnR5cGUiLCBlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAieG1sQmFzZSI6CiAgICAgICAgVyhuMiwgInhtbDpiYXNlIiwgZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInhtbExhbmciOgogICAgICAgIFcobjIsICJ4bWw6bGFuZyIsIGUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ4bWxTcGFjZSI6CiAgICAgICAgVyhuMiwgInhtbDpzcGFjZSIsIGUpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGlmICgoISgyIDwgbDMubGVuZ3RoKSB8fCBsM1swXSAhPT0gIm8iICYmIGwzWzBdICE9PSAiTyIgfHwgbDNbMV0gIT09ICJuIiAmJiBsM1sxXSAhPT0gIk4iKSAmJiAobDMgPSBQYS5nZXQobDMpIHx8IGwzLCBNdChsMykpKSB7CiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBlKSB7CiAgICAgICAgICAgIGNhc2UgImZ1bmN0aW9uIjoKICAgICAgICAgICAgY2FzZSAic3ltYm9sIjoKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgICAgICAgIHZhciB0ID0gbDMudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTsKICAgICAgICAgICAgICBpZiAodCAhPT0gImRhdGEtIiAmJiB0ICE9PSAiYXJpYS0iKSByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBuMi5wdXNoKFosIHMobDMpLCBlbiwgcyhFNChlKSksIE8pOwogICAgICAgIH0KICAgIH0KICB9CiAgdmFyIEkyID0gZygiPiIpLCBJbCA9IGcoIi8+Iik7CiAgZnVuY3Rpb24gcTMobjIsIGwzLCBlKSB7CiAgICBpZiAobDMgIT0gbnVsbCkgewogICAgICBpZiAoZSAhPSBudWxsKSB0aHJvdyBFcnJvcih5Mig2MCkpOwogICAgICBpZiAodHlwZW9mIGwzICE9ICJvYmplY3QiIHx8ICEoIl9faHRtbCIgaW4gbDMpKSB0aHJvdyBFcnJvcih5Mig2MSkpOwogICAgICBsMyA9IGwzLl9faHRtbCwgbDMgIT0gbnVsbCAmJiBuMi5wdXNoKHMoIiIgKyBsMykpOwogICAgfQogIH0KICBmdW5jdGlvbiBVYShuMikgewogICAgdmFyIGwzID0gIiI7CiAgICByZXR1cm4gU3QuQ2hpbGRyZW4uZm9yRWFjaChuMiwgZnVuY3Rpb24oZSkgewogICAgICBlICE9IG51bGwgJiYgKGwzICs9IGUpOwogICAgfSksIGwzOwogIH0KICB2YXIgcGUyID0gZygnIHNlbGVjdGVkPSIiJyksIE5yID0gZyhgYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IixmdW5jdGlvbihhKXtpZighYS5kZWZhdWx0UHJldmVudGVkKXt2YXIgYz1hLnRhcmdldCxkPWEuc3VibWl0dGVyLGU9Yy5hY3Rpb24sYj1kO2lmKGQpe3ZhciBmPWQuZ2V0QXR0cmlidXRlKCJmb3JtQWN0aW9uIik7bnVsbCE9ZiYmKGU9ZixiPW51bGwpfSJqYXZhc2NyaXB0OnRocm93IG5ldyBFcnJvcignUmVhY3QgZm9ybSB1bmV4cGVjdGVkbHkgc3VibWl0dGVkLicpIj09PWUmJihhLnByZXZlbnREZWZhdWx0KCksYj8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGEubmFtZT1iLm5hbWUsYS52YWx1ZT1iLnZhbHVlLGIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxiKSxiPW5ldyBGb3JtRGF0YShjKSxhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSkpOmI9bmV3IEZvcm1EYXRhKGMpLGE9Yy5vd25lckRvY3VtZW50fHxjLChhLiQkcmVhY3RGb3JtUmVwbGF5PWEuJCRyZWFjdEZvcm1SZXBsYXl8fFtdKS5wdXNoKGMsZCxiKSl9fSk7YCk7CiAgZnVuY3Rpb24ga2kobjIsIGwzKSB7CiAgICBpZiAoKG4yLmluc3RydWN0aW9ucyAmIDE2KSA9PT0gMCkgewogICAgICBuMi5pbnN0cnVjdGlvbnMgfD0gMTY7CiAgICAgIHZhciBlID0gbDMucHJlYW1ibGUsIHQgPSBsMy5ib290c3RyYXBDaHVua3M7CiAgICAgIChlLmh0bWxDaHVua3MgfHwgZS5oZWFkQ2h1bmtzKSAmJiB0Lmxlbmd0aCA9PT0gMCA/ICh0LnB1c2gobDMuc3RhcnRJbmxpbmVTY3JpcHQpLCBpZSh0LCBuMiksIHQucHVzaChJMiwgTnIsIGRlMikpIDogdC51bnNoaWZ0KGwzLnN0YXJ0SW5saW5lU2NyaXB0LCBJMiwgTnIsIGRlMik7CiAgICB9CiAgfQogIHZhciBHYSA9IGcoIjwhLS1GIS0tPiIpLCBZYSA9IGcoIjwhLS1GLS0+Iik7CiAgZnVuY3Rpb24gVTIobjIsIGwzKSB7CiAgICBuMi5wdXNoKEwyKCJsaW5rIikpOwogICAgZm9yICh2YXIgZSBpbiBsMykgaWYgKGs0LmNhbGwobDMsIGUpKSB7CiAgICAgIHZhciB0ID0gbDNbZV07CiAgICAgIGlmICh0ICE9IG51bGwpIHN3aXRjaCAoZSkgewogICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICB0aHJvdyBFcnJvcih5MigzOTksICJsaW5rIikpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBSMyhuMiwgZSwgdCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuMi5wdXNoKElsKSwgbnVsbDsKICB9CiAgdmFyIHpyID0gLyg8XC98PCkocykodHlsZSkvZ2k7CiAgZnVuY3Rpb24gRHIobjIsIGwzLCBlLCB0KSB7CiAgICByZXR1cm4gIiIgKyBsMyArIChlID09PSAicyIgPyAiXFw3MyAiIDogIlxcNTMgIikgKyB0OwogIH0KICBmdW5jdGlvbiBqbihuMiwgbDMsIGUpIHsKICAgIG4yLnB1c2goTDIoZSkpOwogICAgZm9yICh2YXIgdCBpbiBsMykgaWYgKGs0LmNhbGwobDMsIHQpKSB7CiAgICAgIHZhciByID0gbDNbdF07CiAgICAgIGlmIChyICE9IG51bGwpIHN3aXRjaCAodCkgewogICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICB0aHJvdyBFcnJvcih5MigzOTksIGUpKTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgUjMobjIsIHQsIHIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbjIucHVzaChJbCksIG51bGw7CiAgfQogIGZ1bmN0aW9uIEhyKG4yLCBsMykgewogICAgbjIucHVzaChMMigidGl0bGUiKSk7CiAgICB2YXIgZSA9IG51bGwsIHQgPSBudWxsLCByOwogICAgZm9yIChyIGluIGwzKSBpZiAoazQuY2FsbChsMywgcikpIHsKICAgICAgdmFyIGkgPSBsM1tyXTsKICAgICAgaWYgKGkgIT0gbnVsbCkgc3dpdGNoIChyKSB7CiAgICAgICAgY2FzZSAiY2hpbGRyZW4iOgogICAgICAgICAgZSA9IGk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICB0ID0gaTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBSMyhuMiwgciwgaSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuMi5wdXNoKEkyKSwgbDMgPSBBcnJheS5pc0FycmF5KGUpID8gMiA+IGUubGVuZ3RoID8gZVswXSA6IG51bGwgOiBlLCB0eXBlb2YgbDMgIT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgbDMgIT0gInN5bWJvbCIgJiYgbDMgIT09IG51bGwgJiYgbDMgIT09IHZvaWQgMCAmJiBuMi5wdXNoKHMoRTQoIiIgKyBsMykpKSwgcTMobjIsIHQsIGUpLCBuMi5wdXNoKEduKCJ0aXRsZSIpKSwgbnVsbDsKICB9CiAgdmFyIFhhID0gZygiPCEtLWhlYWQtLT4iKSwgWmEgPSBnKCI8IS0tYm9keS0tPiIpLCBKYSA9IGcoIjwhLS1odG1sLS0+Iik7CiAgZnVuY3Rpb24gZ2UyKG4yLCBsMykgewogICAgbjIucHVzaChMMigic2NyaXB0IikpOwogICAgdmFyIGUgPSBudWxsLCB0ID0gbnVsbCwgcjsKICAgIGZvciAociBpbiBsMykgaWYgKGs0LmNhbGwobDMsIHIpKSB7CiAgICAgIHZhciBpID0gbDNbcl07CiAgICAgIGlmIChpICE9IG51bGwpIHN3aXRjaCAocikgewogICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgIGUgPSBpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgdCA9IGk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgUjMobjIsIHIsIGkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbjIucHVzaChJMiksIHEzKG4yLCB0LCBlKSwgdHlwZW9mIGUgPT0gInN0cmluZyIgJiYgbjIucHVzaChzKCgiIiArIGUpLnJlcGxhY2UoYXQsIGN0KSkpLCBuMi5wdXNoKEduKCJzY3JpcHQiKSksIG51bGw7CiAgfQogIGZ1bmN0aW9uICRlMihuMiwgbDMsIGUpIHsKICAgIG4yLnB1c2goTDIoZSkpOwogICAgdmFyIHQgPSBlID0gbnVsbCwgcjsKICAgIGZvciAociBpbiBsMykgaWYgKGs0LmNhbGwobDMsIHIpKSB7CiAgICAgIHZhciBpID0gbDNbcl07CiAgICAgIGlmIChpICE9IG51bGwpIHN3aXRjaCAocikgewogICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgIGUgPSBpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgdCA9IGk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgUjMobjIsIHIsIGkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbjIucHVzaChJMiksIHEzKG4yLCB0LCBlKSwgZTsKICB9CiAgZnVuY3Rpb24gbGUyKG4yLCBsMywgZSkgewogICAgbjIucHVzaChMMihlKSk7CiAgICB2YXIgdCA9IGUgPSBudWxsLCByOwogICAgZm9yIChyIGluIGwzKSBpZiAoazQuY2FsbChsMywgcikpIHsKICAgICAgdmFyIGkgPSBsM1tyXTsKICAgICAgaWYgKGkgIT0gbnVsbCkgc3dpdGNoIChyKSB7CiAgICAgICAgY2FzZSAiY2hpbGRyZW4iOgogICAgICAgICAgZSA9IGk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICB0ID0gaTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBSMyhuMiwgciwgaSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuMi5wdXNoKEkyKSwgcTMobjIsIHQsIGUpLCB0eXBlb2YgZSA9PSAic3RyaW5nIiA/IChuMi5wdXNoKHMoRTQoZSkpKSwgbnVsbCkgOiBlOwogIH0KICB2YXIgbnQgPSBnKGAKYCksIFFhID0gL15bYS16QS1aXVthLXpBLVo6X1wuXC1cZF0qJC8sIFdyID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBmdW5jdGlvbiBMMihuMikgewogICAgdmFyIGwzID0gV3IuZ2V0KG4yKTsKICAgIGlmIChsMyA9PT0gdm9pZCAwKSB7CiAgICAgIGlmICghUWEudGVzdChuMikpIHRocm93IEVycm9yKHkyKDY1LCBuMikpOwogICAgICBsMyA9IGcoIjwiICsgbjIpLCBXci5zZXQobjIsIGwzKTsKICAgIH0KICAgIHJldHVybiBsMzsKICB9CiAgdmFyIFZhID0gZygiPCFET0NUWVBFIGh0bWw+Iik7CiAgZnVuY3Rpb24gS2EobjIsIGwzLCBlLCB0LCByLCBpLCBhLCB1MiwgYzIpIHsKICAgIHN3aXRjaCAobDMpIHsKICAgICAgY2FzZSAiZGl2IjoKICAgICAgY2FzZSAic3BhbiI6CiAgICAgIGNhc2UgInN2ZyI6CiAgICAgIGNhc2UgInBhdGgiOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJhIjoKICAgICAgICBuMi5wdXNoKEwyKCJhIikpOwogICAgICAgIHZhciBmMiA9IG51bGwsIG8gPSBudWxsLCBoOwogICAgICAgIGZvciAoaCBpbiBlKSBpZiAoazQuY2FsbChlLCBoKSkgewogICAgICAgICAgdmFyIHYzID0gZVtoXTsKICAgICAgICAgIGlmICh2MyAhPSBudWxsKSBzd2l0Y2ggKGgpIHsKICAgICAgICAgICAgY2FzZSAiY2hpbGRyZW4iOgogICAgICAgICAgICAgIGYyID0gdjM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgICAgICBvID0gdjM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImhyZWYiOgogICAgICAgICAgICAgIHYzID09PSAiIiA/IFcobjIsICJocmVmIiwgIiIpIDogUjMobjIsIGgsIHYzKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBSMyhuMiwgaCwgdjMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobjIucHVzaChJMiksIHEzKG4yLCBvLCBmMiksIHR5cGVvZiBmMiA9PSAic3RyaW5nIikgewogICAgICAgICAgbjIucHVzaChzKEU0KGYyKSkpOwogICAgICAgICAgdmFyIGI0ID0gbnVsbDsKICAgICAgICB9IGVsc2UgYjQgPSBmMjsKICAgICAgICByZXR1cm4gYjQ7CiAgICAgIGNhc2UgImciOgogICAgICBjYXNlICJwIjoKICAgICAgY2FzZSAibGkiOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJzZWxlY3QiOgogICAgICAgIG4yLnB1c2goTDIoInNlbGVjdCIpKTsKICAgICAgICB2YXIgQyA9IG51bGwsIHczID0gbnVsbCwgeDM7CiAgICAgICAgZm9yICh4MyBpbiBlKSBpZiAoazQuY2FsbChlLCB4MykpIHsKICAgICAgICAgIHZhciBNMiA9IGVbeDNdOwogICAgICAgICAgaWYgKE0yICE9IG51bGwpIHN3aXRjaCAoeDMpIHsKICAgICAgICAgICAgY2FzZSAiY2hpbGRyZW4iOgogICAgICAgICAgICAgIEMgPSBNMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgICAgIHczID0gTTI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRlZmF1bHRWYWx1ZSI6CiAgICAgICAgICAgIGNhc2UgInZhbHVlIjoKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBSMyhuMiwgeDMsIE0yKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG4yLnB1c2goSTIpLCBxMyhuMiwgdzMsIEMpLCBDOwogICAgICBjYXNlICJvcHRpb24iOgogICAgICAgIHZhciBGMiA9IHUyLnNlbGVjdGVkVmFsdWU7CiAgICAgICAgbjIucHVzaChMMigib3B0aW9uIikpOwogICAgICAgIHZhciBYID0gbnVsbCwgbTIgPSBudWxsLCBnbiA9IG51bGwsIFQzID0gbnVsbCwgY247CiAgICAgICAgZm9yIChjbiBpbiBlKSBpZiAoazQuY2FsbChlLCBjbikpIHsKICAgICAgICAgIHZhciBubiA9IGVbY25dOwogICAgICAgICAgaWYgKG5uICE9IG51bGwpIHN3aXRjaCAoY24pIHsKICAgICAgICAgICAgY2FzZSAiY2hpbGRyZW4iOgogICAgICAgICAgICAgIFggPSBubjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAic2VsZWN0ZWQiOgogICAgICAgICAgICAgIGduID0gbm47CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgICAgICBUMyA9IG5uOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJ2YWx1ZSI6CiAgICAgICAgICAgICAgbTIgPSBubjsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBSMyhuMiwgY24sIG5uKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKEYyICE9IG51bGwpIHsKICAgICAgICAgIHZhciBRID0gbTIgIT09IG51bGwgPyAiIiArIG0yIDogVWEoWCk7CiAgICAgICAgICBpZiAoaGUyKEYyKSkgewogICAgICAgICAgICBmb3IgKHZhciB1biA9IDA7IHVuIDwgRjIubGVuZ3RoOyB1bisrKSBpZiAoIiIgKyBGMlt1bl0gPT09IFEpIHsKICAgICAgICAgICAgICBuMi5wdXNoKHBlMik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSAiIiArIEYyID09PSBRICYmIG4yLnB1c2gocGUyKTsKICAgICAgICB9IGVsc2UgZ24gJiYgbjIucHVzaChwZTIpOwogICAgICAgIHJldHVybiBuMi5wdXNoKEkyKSwgcTMobjIsIFQzLCBYKSwgWDsKICAgICAgY2FzZSAidGV4dGFyZWEiOgogICAgICAgIG4yLnB1c2goTDIoInRleHRhcmVhIikpOwogICAgICAgIHZhciBBMyA9IG51bGwsIHZuID0gbnVsbCwgbG4gPSBudWxsLCBfMjsKICAgICAgICBmb3IgKF8yIGluIGUpIGlmIChrNC5jYWxsKGUsIF8yKSkgewogICAgICAgICAgdmFyIFYyID0gZVtfMl07CiAgICAgICAgICBpZiAoVjIgIT0gbnVsbCkgc3dpdGNoIChfMikgewogICAgICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICAgICAgbG4gPSBWMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAidmFsdWUiOgogICAgICAgICAgICAgIEEzID0gVjI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRlZmF1bHRWYWx1ZSI6CiAgICAgICAgICAgICAgdm4gPSBWMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgICAgIHRocm93IEVycm9yKHkyKDkxKSk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgUjMobjIsIF8yLCBWMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChBMyA9PT0gbnVsbCAmJiB2biAhPT0gbnVsbCAmJiAoQTMgPSB2biksIG4yLnB1c2goSTIpLCBsbiAhPSBudWxsKSB7CiAgICAgICAgICBpZiAoQTMgIT0gbnVsbCkgdGhyb3cgRXJyb3IoeTIoOTIpKTsKICAgICAgICAgIGlmIChoZTIobG4pKSB7CiAgICAgICAgICAgIGlmICgxIDwgbG4ubGVuZ3RoKSB0aHJvdyBFcnJvcih5Mig5MykpOwogICAgICAgICAgICBBMyA9ICIiICsgbG5bMF07CiAgICAgICAgICB9CiAgICAgICAgICBBMyA9ICIiICsgbG47CiAgICAgICAgfQogICAgICAgIHJldHVybiB0eXBlb2YgQTMgPT0gInN0cmluZyIgJiYgQTNbMF0gPT09IGAKYCAmJiBuMi5wdXNoKG50KSwgQTMgIT09IG51bGwgJiYgbjIucHVzaChzKEU0KCIiICsgQTMpKSksIG51bGw7CiAgICAgIGNhc2UgImlucHV0IjoKICAgICAgICBuMi5wdXNoKEwyKCJpbnB1dCIpKTsKICAgICAgICB2YXIgSW4gPSBudWxsLCBPbiA9IG51bGwsIGJuID0gbnVsbCwgX24gPSBudWxsLCBhbCA9IG51bGwsIHNuID0gbnVsbCwgeG4gPSBudWxsLCBCZTIgPSBudWxsLCBOZTIgPSBudWxsLCBjbDsKICAgICAgICBmb3IgKGNsIGluIGUpIGlmIChrNC5jYWxsKGUsIGNsKSkgewogICAgICAgICAgdmFyIGZuID0gZVtjbF07CiAgICAgICAgICBpZiAoZm4gIT0gbnVsbCkgc3dpdGNoIChjbCkgewogICAgICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgICAgICB0aHJvdyBFcnJvcih5MigzOTksICJpbnB1dCIpKTsKICAgICAgICAgICAgY2FzZSAibmFtZSI6CiAgICAgICAgICAgICAgSW4gPSBmbjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZm9ybUFjdGlvbiI6CiAgICAgICAgICAgICAgT24gPSBmbjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZm9ybUVuY1R5cGUiOgogICAgICAgICAgICAgIGJuID0gZm47CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImZvcm1NZXRob2QiOgogICAgICAgICAgICAgIF9uID0gZm47CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImZvcm1UYXJnZXQiOgogICAgICAgICAgICAgIGFsID0gZm47CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRlZmF1bHRDaGVja2VkIjoKICAgICAgICAgICAgICBOZTIgPSBmbjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZGVmYXVsdFZhbHVlIjoKICAgICAgICAgICAgICB4biA9IGZuOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJjaGVja2VkIjoKICAgICAgICAgICAgICBCZTIgPSBmbjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAidmFsdWUiOgogICAgICAgICAgICAgIHNuID0gZm47CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgUjMobjIsIGNsLCBmbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBHdCA9IEJyKG4yLCB0LCByLCBPbiwgYm4sIF9uLCBhbCwgSW4pOwogICAgICAgIHJldHVybiBCZTIgIT09IG51bGwgPyBvdChuMiwgImNoZWNrZWQiLCBCZTIpIDogTmUyICE9PSBudWxsICYmIG90KG4yLCAiY2hlY2tlZCIsIE5lMiksIHNuICE9PSBudWxsID8gUjMobjIsICJ2YWx1ZSIsIHNuKSA6IHhuICE9PSBudWxsICYmIFIzKG4yLCAidmFsdWUiLCB4biksIG4yLnB1c2goSWwpLCBHdD8uZm9yRWFjaChqZTIsIG4yKSwgbnVsbDsKICAgICAgY2FzZSAiYnV0dG9uIjoKICAgICAgICBuMi5wdXNoKEwyKCJidXR0b24iKSk7CiAgICAgICAgdmFyIHVsID0gbnVsbCwgWXQgPSBudWxsLCBYdCA9IG51bGwsIFp0ID0gbnVsbCwgSnQgPSBudWxsLCBRdCA9IG51bGwsIFZ0ID0gbnVsbCwgZmw7CiAgICAgICAgZm9yIChmbCBpbiBlKSBpZiAoazQuY2FsbChlLCBmbCkpIHsKICAgICAgICAgIHZhciB5biA9IGVbZmxdOwogICAgICAgICAgaWYgKHluICE9IG51bGwpIHN3aXRjaCAoZmwpIHsKICAgICAgICAgICAgY2FzZSAiY2hpbGRyZW4iOgogICAgICAgICAgICAgIHVsID0geW47CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgICAgICBZdCA9IHluOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJuYW1lIjoKICAgICAgICAgICAgICBYdCA9IHluOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJmb3JtQWN0aW9uIjoKICAgICAgICAgICAgICBadCA9IHluOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJmb3JtRW5jVHlwZSI6CiAgICAgICAgICAgICAgSnQgPSB5bjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZm9ybU1ldGhvZCI6CiAgICAgICAgICAgICAgUXQgPSB5bjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZm9ybVRhcmdldCI6CiAgICAgICAgICAgICAgVnQgPSB5bjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBSMyhuMiwgZmwsIHluKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIEt0ID0gQnIobjIsIHQsIHIsIFp0LCBKdCwgUXQsIFZ0LCBYdCk7CiAgICAgICAgaWYgKG4yLnB1c2goSTIpLCBLdD8uZm9yRWFjaChqZTIsIG4yKSwgcTMobjIsIFl0LCB1bCksIHR5cGVvZiB1bCA9PSAic3RyaW5nIikgewogICAgICAgICAgbjIucHVzaChzKEU0KHVsKSkpOwogICAgICAgICAgdmFyIG10ID0gbnVsbDsKICAgICAgICB9IGVsc2UgbXQgPSB1bDsKICAgICAgICByZXR1cm4gbXQ7CiAgICAgIGNhc2UgImZvcm0iOgogICAgICAgIG4yLnB1c2goTDIoImZvcm0iKSk7CiAgICAgICAgdmFyIG9sID0gbnVsbCwgcXQgPSBudWxsLCBMbiA9IG51bGwsIGhsID0gbnVsbCwgZGwgPSBudWxsLCBnbCA9IG51bGwsIHZsOwogICAgICAgIGZvciAodmwgaW4gZSkgaWYgKGs0LmNhbGwoZSwgdmwpKSB7CiAgICAgICAgICB2YXIgQ24gPSBlW3ZsXTsKICAgICAgICAgIGlmIChDbiAhPSBudWxsKSBzd2l0Y2ggKHZsKSB7CiAgICAgICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgICAgICBvbCA9IENuOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICAgICAgcXQgPSBDbjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiYWN0aW9uIjoKICAgICAgICAgICAgICBMbiA9IENuOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJlbmNUeXBlIjoKICAgICAgICAgICAgICBobCA9IENuOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJtZXRob2QiOgogICAgICAgICAgICAgIGRsID0gQ247CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInRhcmdldCI6CiAgICAgICAgICAgICAgZ2wgPSBDbjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBSMyhuMiwgdmwsIENuKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHplMiA9IG51bGwsIERlMiA9IG51bGw7CiAgICAgICAgaWYgKHR5cGVvZiBMbiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICB2YXIgQm4gPSBBaSh0LCBMbik7CiAgICAgICAgICBCbiAhPT0gbnVsbCA/IChMbiA9IEJuLmFjdGlvbiB8fCAiIiwgaGwgPSBCbi5lbmNUeXBlLCBkbCA9IEJuLm1ldGhvZCwgZ2wgPSBCbi50YXJnZXQsIHplMiA9IEJuLmRhdGEsIERlMiA9IEJuLm5hbWUpIDogKG4yLnB1c2goWiwgcygiYWN0aW9uIiksIGVuLCBTaSwgTyksIGdsID0gZGwgPSBobCA9IExuID0gbnVsbCwga2kodCwgcikpOwogICAgICAgIH0KICAgICAgICBpZiAoTG4gIT0gbnVsbCAmJiBSMyhuMiwgImFjdGlvbiIsIExuKSwgaGwgIT0gbnVsbCAmJiBSMyhuMiwgImVuY1R5cGUiLCBobCksIGRsICE9IG51bGwgJiYgUjMobjIsICJtZXRob2QiLCBkbCksIGdsICE9IG51bGwgJiYgUjMobjIsICJ0YXJnZXQiLCBnbCksIG4yLnB1c2goSTIpLCBEZTIgIT09IG51bGwgJiYgKG4yLnB1c2goRmkpLCBXKG4yLCAibmFtZSIsIERlMiksIG4yLnB1c2goSWwpLCB6ZTI/LmZvckVhY2goamUyLCBuMikpLCBxMyhuMiwgcXQsIG9sKSwgdHlwZW9mIG9sID09ICJzdHJpbmciKSB7CiAgICAgICAgICBuMi5wdXNoKHMoRTQob2wpKSk7CiAgICAgICAgICB2YXIganQgPSBudWxsOwogICAgICAgIH0gZWxzZSBqdCA9IG9sOwogICAgICAgIHJldHVybiBqdDsKICAgICAgY2FzZSAibWVudWl0ZW0iOgogICAgICAgIG4yLnB1c2goTDIoIm1lbnVpdGVtIikpOwogICAgICAgIGZvciAodmFyIFpsIGluIGUpIGlmIChrNC5jYWxsKGUsIFpsKSkgewogICAgICAgICAgdmFyIHB0ID0gZVtabF07CiAgICAgICAgICBpZiAocHQgIT0gbnVsbCkgc3dpdGNoIChabCkgewogICAgICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgICAgICB0aHJvdyBFcnJvcih5Mig0MDApKTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBSMyhuMiwgWmwsIHB0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG4yLnB1c2goSTIpLCBudWxsOwogICAgICBjYXNlICJvYmplY3QiOgogICAgICAgIG4yLnB1c2goTDIoIm9iamVjdCIpKTsKICAgICAgICB2YXIgc2wgPSBudWxsLCAkdCA9IG51bGwsIGJsOwogICAgICAgIGZvciAoYmwgaW4gZSkgaWYgKGs0LmNhbGwoZSwgYmwpKSB7CiAgICAgICAgICB2YXIgeWwgPSBlW2JsXTsKICAgICAgICAgIGlmICh5bCAhPSBudWxsKSBzd2l0Y2ggKGJsKSB7CiAgICAgICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgICAgICBzbCA9IHlsOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICAgICAgJHQgPSB5bDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZGF0YSI6CiAgICAgICAgICAgICAgdmFyIG5yMiA9IGtsKCIiICsgeWwpOwogICAgICAgICAgICAgIGlmIChucjIgPT09ICIiKSBicmVhazsKICAgICAgICAgICAgICBuMi5wdXNoKFosIHMoImRhdGEiKSwgZW4sIHMoRTQobnIyKSksIE8pOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIFIzKG4yLCBibCwgeWwpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobjIucHVzaChJMiksIHEzKG4yLCAkdCwgc2wpLCB0eXBlb2Ygc2wgPT0gInN0cmluZyIpIHsKICAgICAgICAgIG4yLnB1c2gocyhFNChzbCkpKTsKICAgICAgICAgIHZhciBsciA9IG51bGw7CiAgICAgICAgfSBlbHNlIGxyID0gc2w7CiAgICAgICAgcmV0dXJuIGxyOwogICAgICBjYXNlICJ0aXRsZSI6CiAgICAgICAgdmFyIGppID0gdTIudGFnU2NvcGUgJiAxLCBwaSA9IHUyLnRhZ1Njb3BlICYgNDsKICAgICAgICBpZiAodTIuaW5zZXJ0aW9uTW9kZSA9PT0gNCB8fCBqaSB8fCBlLml0ZW1Qcm9wICE9IG51bGwpIHZhciBIZTIgPSBIcihuMiwgZSk7CiAgICAgICAgZWxzZSBwaSA/IEhlMiA9IG51bGwgOiAoSHIoci5ob2lzdGFibGVDaHVua3MsIGUpLCBIZTIgPSB2b2lkIDApOwogICAgICAgIHJldHVybiBIZTI7CiAgICAgIGNhc2UgImxpbmsiOgogICAgICAgIHZhciAkaSA9IHUyLnRhZ1Njb3BlICYgMSwgbmEgPSB1Mi50YWdTY29wZSAmIDQsIGxhID0gZS5yZWwsIFJuID0gZS5ocmVmLCBKbCA9IGUucHJlY2VkZW5jZTsKICAgICAgICBpZiAodTIuaW5zZXJ0aW9uTW9kZSA9PT0gNCB8fCAkaSB8fCBlLml0ZW1Qcm9wICE9IG51bGwgfHwgdHlwZW9mIGxhICE9ICJzdHJpbmciIHx8IHR5cGVvZiBSbiAhPSAic3RyaW5nIiB8fCBSbiA9PT0gIiIpIHsKICAgICAgICAgIFUyKG4yLCBlKTsKICAgICAgICAgIHZhciBUbCA9IG51bGw7CiAgICAgICAgfSBlbHNlIGlmIChlLnJlbCA9PT0gInN0eWxlc2hlZXQiKSBpZiAodHlwZW9mIEpsICE9ICJzdHJpbmciIHx8IGUuZGlzYWJsZWQgIT0gbnVsbCB8fCBlLm9uTG9hZCB8fCBlLm9uRXJyb3IpIFRsID0gVTIobjIsIGUpOwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIFpuID0gci5zdHlsZXMuZ2V0KEpsKSwgUWwgPSB0LnN0eWxlUmVzb3VyY2VzLmhhc093blByb3BlcnR5KFJuKSA/IHQuc3R5bGVSZXNvdXJjZXNbUm5dIDogdm9pZCAwOwogICAgICAgICAgaWYgKFFsICE9PSBudWxsKSB7CiAgICAgICAgICAgIHQuc3R5bGVSZXNvdXJjZXNbUm5dID0gbnVsbCwgWm4gfHwgKFpuID0gewogICAgICAgICAgICAgIHByZWNlZGVuY2U6IHMoRTQoSmwpKSwKICAgICAgICAgICAgICBydWxlczogW10sCiAgICAgICAgICAgICAgaHJlZnM6IFtdLAogICAgICAgICAgICAgIHNoZWV0czogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKQogICAgICAgICAgICB9LCByLnN0eWxlcy5zZXQoSmwsIFpuKSk7CiAgICAgICAgICAgIHZhciBWbCA9IHsKICAgICAgICAgICAgICBzdGF0ZTogMCwKICAgICAgICAgICAgICBwcm9wczogSzIoe30sIGUsIHsKICAgICAgICAgICAgICAgICJkYXRhLXByZWNlZGVuY2UiOiBlLnByZWNlZGVuY2UsCiAgICAgICAgICAgICAgICBwcmVjZWRlbmNlOiBudWxsCiAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKFFsKSB7CiAgICAgICAgICAgICAgUWwubGVuZ3RoID09PSAyICYmIE9sKFZsLnByb3BzLCBRbCk7CiAgICAgICAgICAgICAgdmFyIFdlMiA9IHIucHJlbG9hZHMuc3R5bGVzaGVldHMuZ2V0KFJuKTsKICAgICAgICAgICAgICBXZTIgJiYgMCA8IFdlMi5sZW5ndGggPyBXZTIubGVuZ3RoID0gMCA6IFZsLnN0YXRlID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBabi5zaGVldHMuc2V0KFJuLCBWbCksIGEgJiYgYS5zdHlsZXNoZWV0cy5hZGQoVmwpOwogICAgICAgICAgfSBlbHNlIGlmIChabikgewogICAgICAgICAgICB2YXIgZXIgPSBabi5zaGVldHMuZ2V0KFJuKTsKICAgICAgICAgICAgZXIgJiYgYSAmJiBhLnN0eWxlc2hlZXRzLmFkZChlcik7CiAgICAgICAgICB9CiAgICAgICAgICBjMiAmJiBuMi5wdXNoKGRuKSwgVGwgPSBudWxsOwogICAgICAgIH0KICAgICAgICBlbHNlIGUub25Mb2FkIHx8IGUub25FcnJvciA/IFRsID0gVTIobjIsIGUpIDogKGMyICYmIG4yLnB1c2goZG4pLCBUbCA9IG5hID8gbnVsbCA6IFUyKHIuaG9pc3RhYmxlQ2h1bmtzLCBlKSk7CiAgICAgICAgcmV0dXJuIFRsOwogICAgICBjYXNlICJzY3JpcHQiOgogICAgICAgIHZhciBlYSA9IHUyLnRhZ1Njb3BlICYgMSwgVWUyID0gZS5hc3luYzsKICAgICAgICBpZiAodHlwZW9mIGUuc3JjICE9ICJzdHJpbmciIHx8ICFlLnNyYyB8fCAhVWUyIHx8IHR5cGVvZiBVZTIgPT0gImZ1bmN0aW9uIiB8fCB0eXBlb2YgVWUyID09ICJzeW1ib2wiIHx8IGUub25Mb2FkIHx8IGUub25FcnJvciB8fCB1Mi5pbnNlcnRpb25Nb2RlID09PSA0IHx8IGVhIHx8IGUuaXRlbVByb3AgIT0gbnVsbCkgdmFyIHRyID0gZ2UyKG4yLCBlKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBLbCA9IGUuc3JjOwogICAgICAgICAgaWYgKGUudHlwZSA9PT0gIm1vZHVsZSIpIHZhciBtbCA9IHQubW9kdWxlU2NyaXB0UmVzb3VyY2VzLCByciA9IHIucHJlbG9hZHMubW9kdWxlU2NyaXB0czsKICAgICAgICAgIGVsc2UgbWwgPSB0LnNjcmlwdFJlc291cmNlcywgcnIgPSByLnByZWxvYWRzLnNjcmlwdHM7CiAgICAgICAgICB2YXIgcWwgPSBtbC5oYXNPd25Qcm9wZXJ0eShLbCkgPyBtbFtLbF0gOiB2b2lkIDA7CiAgICAgICAgICBpZiAocWwgIT09IG51bGwpIHsKICAgICAgICAgICAgbWxbS2xdID0gbnVsbDsKICAgICAgICAgICAgdmFyIEdlMiA9IGU7CiAgICAgICAgICAgIGlmIChxbCkgewogICAgICAgICAgICAgIHFsLmxlbmd0aCA9PT0gMiAmJiAoR2UyID0gSzIoe30sIGUpLCBPbChHZTIsIHFsKSk7CiAgICAgICAgICAgICAgdmFyIGlyID0gcnIuZ2V0KEtsKTsKICAgICAgICAgICAgICBpciAmJiAoaXIubGVuZ3RoID0gMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFyID0gW107CiAgICAgICAgICAgIHIuc2NyaXB0cy5hZGQoYXIpLCBnZTIoYXIsIEdlMik7CiAgICAgICAgICB9CiAgICAgICAgICBjMiAmJiBuMi5wdXNoKGRuKSwgdHIgPSBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHI7CiAgICAgIGNhc2UgInN0eWxlIjoKICAgICAgICB2YXIgdGEgPSB1Mi50YWdTY29wZSAmIDEsIGpsID0gZS5wcmVjZWRlbmNlLCBKbiA9IGUuaHJlZiwgcmEgPSBlLm5vbmNlOwogICAgICAgIGlmICh1Mi5pbnNlcnRpb25Nb2RlID09PSA0IHx8IHRhIHx8IGUuaXRlbVByb3AgIT0gbnVsbCB8fCB0eXBlb2YgamwgIT0gInN0cmluZyIgfHwgdHlwZW9mIEpuICE9ICJzdHJpbmciIHx8IEpuID09PSAiIikgewogICAgICAgICAgbjIucHVzaChMMigic3R5bGUiKSk7CiAgICAgICAgICB2YXIgUW4gPSBudWxsLCBjciA9IG51bGwsIEVsOwogICAgICAgICAgZm9yIChFbCBpbiBlKSBpZiAoazQuY2FsbChlLCBFbCkpIHsKICAgICAgICAgICAgdmFyIHBsID0gZVtFbF07CiAgICAgICAgICAgIGlmIChwbCAhPSBudWxsKSBzd2l0Y2ggKEVsKSB7CiAgICAgICAgICAgICAgY2FzZSAiY2hpbGRyZW4iOgogICAgICAgICAgICAgICAgUW4gPSBwbDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgICAgICAgIGNyID0gcGw7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgUjMobjIsIEVsLCBwbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG4yLnB1c2goSTIpOwogICAgICAgICAgdmFyIHdsID0gQXJyYXkuaXNBcnJheShRbikgPyAyID4gUW4ubGVuZ3RoID8gUW5bMF0gOiBudWxsIDogUW47CiAgICAgICAgICB0eXBlb2Ygd2wgIT0gImZ1bmN0aW9uIiAmJiB0eXBlb2Ygd2wgIT0gInN5bWJvbCIgJiYgd2wgIT09IG51bGwgJiYgd2wgIT09IHZvaWQgMCAmJiBuMi5wdXNoKHMoKCIiICsgd2wpLnJlcGxhY2UoenIsIERyKSkpLCBxMyhuMiwgY3IsIFFuKSwgbjIucHVzaChHbigic3R5bGUiKSk7CiAgICAgICAgICB2YXIgdXIgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgTm4gPSByLnN0eWxlcy5nZXQoamwpOwogICAgICAgICAgaWYgKCh0LnN0eWxlUmVzb3VyY2VzLmhhc093blByb3BlcnR5KEpuKSA/IHQuc3R5bGVSZXNvdXJjZXNbSm5dIDogdm9pZCAwKSAhPT0gbnVsbCkgewogICAgICAgICAgICB0LnN0eWxlUmVzb3VyY2VzW0puXSA9IG51bGwsIE5uIHx8IChObiA9IHsKICAgICAgICAgICAgICBwcmVjZWRlbmNlOiBzKEU0KGpsKSksCiAgICAgICAgICAgICAgcnVsZXM6IFtdLAogICAgICAgICAgICAgIGhyZWZzOiBbXSwKICAgICAgICAgICAgICBzaGVldHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkKICAgICAgICAgICAgfSwgci5zdHlsZXMuc2V0KGpsLCBObikpOwogICAgICAgICAgICB2YXIgZnIgPSByLm5vbmNlLnN0eWxlOwogICAgICAgICAgICBpZiAoIWZyIHx8IGZyID09PSByYSkgewogICAgICAgICAgICAgIE5uLmhyZWZzLnB1c2gocyhFNChKbikpKTsKICAgICAgICAgICAgICB2YXIgb3IgPSBObi5ydWxlcywgVm4gPSBudWxsLCBociA9IG51bGwsICRsOwogICAgICAgICAgICAgIGZvciAoJGwgaW4gZSkgaWYgKGs0LmNhbGwoZSwgJGwpKSB7CiAgICAgICAgICAgICAgICB2YXIgWWUyID0gZVskbF07CiAgICAgICAgICAgICAgICBpZiAoWWUyICE9IG51bGwpIHN3aXRjaCAoJGwpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAiY2hpbGRyZW4iOgogICAgICAgICAgICAgICAgICAgIFZuID0gWWUyOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICAgICAgICAgICAgaHIgPSBZZTI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciB4bCA9IEFycmF5LmlzQXJyYXkoVm4pID8gMiA+IFZuLmxlbmd0aCA/IFZuWzBdIDogbnVsbCA6IFZuOwogICAgICAgICAgICAgIHR5cGVvZiB4bCAhPSAiZnVuY3Rpb24iICYmIHR5cGVvZiB4bCAhPSAic3ltYm9sIiAmJiB4bCAhPT0gbnVsbCAmJiB4bCAhPT0gdm9pZCAwICYmIG9yLnB1c2gocygoIiIgKyB4bCkucmVwbGFjZSh6ciwgRHIpKSksIHEzKG9yLCBociwgVm4pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBObiAmJiBhICYmIGEuc3R5bGVzLmFkZChObiksIGMyICYmIG4yLnB1c2goZG4pLCB1ciA9IHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHVyOwogICAgICBjYXNlICJtZXRhIjoKICAgICAgICB2YXIgaWEgPSB1Mi50YWdTY29wZSAmIDEsIGFhID0gdTIudGFnU2NvcGUgJiA0OwogICAgICAgIGlmICh1Mi5pbnNlcnRpb25Nb2RlID09PSA0IHx8IGlhIHx8IGUuaXRlbVByb3AgIT0gbnVsbCkgdmFyIGRyMiA9IGpuKG4yLCBlLCAibWV0YSIpOwogICAgICAgIGVsc2UgYzIgJiYgbjIucHVzaChkbiksIGRyMiA9IGFhID8gbnVsbCA6IHR5cGVvZiBlLmNoYXJTZXQgPT0gInN0cmluZyIgPyBqbihyLmNoYXJzZXRDaHVua3MsIGUsICJtZXRhIikgOiBlLm5hbWUgPT09ICJ2aWV3cG9ydCIgPyBqbihyLnZpZXdwb3J0Q2h1bmtzLCBlLCAibWV0YSIpIDogam4oci5ob2lzdGFibGVDaHVua3MsIGUsICJtZXRhIik7CiAgICAgICAgcmV0dXJuIGRyMjsKICAgICAgY2FzZSAibGlzdGluZyI6CiAgICAgIGNhc2UgInByZSI6CiAgICAgICAgbjIucHVzaChMMihsMykpOwogICAgICAgIHZhciBDbCA9IG51bGwsIFJsID0gbnVsbCwgU2w7CiAgICAgICAgZm9yIChTbCBpbiBlKSBpZiAoazQuY2FsbChlLCBTbCkpIHsKICAgICAgICAgIHZhciBuZSA9IGVbU2xdOwogICAgICAgICAgaWYgKG5lICE9IG51bGwpIHN3aXRjaCAoU2wpIHsKICAgICAgICAgICAgY2FzZSAiY2hpbGRyZW4iOgogICAgICAgICAgICAgIENsID0gbmU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgICAgICAgICBSbCA9IG5lOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIFIzKG4yLCBTbCwgbmUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobjIucHVzaChJMiksIFJsICE9IG51bGwpIHsKICAgICAgICAgIGlmIChDbCAhPSBudWxsKSB0aHJvdyBFcnJvcih5Mig2MCkpOwogICAgICAgICAgaWYgKHR5cGVvZiBSbCAhPSAib2JqZWN0IiB8fCAhKCJfX2h0bWwiIGluIFJsKSkgdGhyb3cgRXJyb3IoeTIoNjEpKTsKICAgICAgICAgIHZhciB6biA9IFJsLl9faHRtbDsKICAgICAgICAgIHpuICE9IG51bGwgJiYgKHR5cGVvZiB6biA9PSAic3RyaW5nIiAmJiAwIDwgem4ubGVuZ3RoICYmIHpuWzBdID09PSBgCmAgPyBuMi5wdXNoKG50LCBzKHpuKSkgOiBuMi5wdXNoKHMoIiIgKyB6bikpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHR5cGVvZiBDbCA9PSAic3RyaW5nIiAmJiBDbFswXSA9PT0gYApgICYmIG4yLnB1c2gobnQpLCBDbDsKICAgICAgY2FzZSAiaW1nIjoKICAgICAgICB2YXIgY2EgPSB1Mi50YWdTY29wZSAmIDMsIEgyID0gZS5zcmMsIE4yID0gZS5zcmNTZXQ7CiAgICAgICAgaWYgKCEoZS5sb2FkaW5nID09PSAibGF6eSIgfHwgIUgyICYmICFOMiB8fCB0eXBlb2YgSDIgIT0gInN0cmluZyIgJiYgSDIgIT0gbnVsbCB8fCB0eXBlb2YgTjIgIT0gInN0cmluZyIgJiYgTjIgIT0gbnVsbCB8fCBlLmZldGNoUHJpb3JpdHkgPT09ICJsb3ciIHx8IGNhKSAmJiAodHlwZW9mIEgyICE9ICJzdHJpbmciIHx8IEgyWzRdICE9PSAiOiIgfHwgSDJbMF0gIT09ICJkIiAmJiBIMlswXSAhPT0gIkQiIHx8IEgyWzFdICE9PSAiYSIgJiYgSDJbMV0gIT09ICJBIiB8fCBIMlsyXSAhPT0gInQiICYmIEgyWzJdICE9PSAiVCIgfHwgSDJbM10gIT09ICJhIiAmJiBIMlszXSAhPT0gIkEiKSAmJiAodHlwZW9mIE4yICE9ICJzdHJpbmciIHx8IE4yWzRdICE9PSAiOiIgfHwgTjJbMF0gIT09ICJkIiAmJiBOMlswXSAhPT0gIkQiIHx8IE4yWzFdICE9PSAiYSIgJiYgTjJbMV0gIT09ICJBIiB8fCBOMlsyXSAhPT0gInQiICYmIE4yWzJdICE9PSAiVCIgfHwgTjJbM10gIT09ICJhIiAmJiBOMlszXSAhPT0gIkEiKSkgewogICAgICAgICAgYSAhPT0gbnVsbCAmJiB1Mi50YWdTY29wZSAmIDY0ICYmIChhLnN1c3BlbnNleUltYWdlcyA9IHRydWUpOwogICAgICAgICAgdmFyIGdyMiA9IHR5cGVvZiBlLnNpemVzID09ICJzdHJpbmciID8gZS5zaXplcyA6IHZvaWQgMCwgS24gPSBOMiA/IE4yICsgYApgICsgKGdyMiB8fCAiIikgOiBIMiwgWGUzID0gci5wcmVsb2Fkcy5pbWFnZXMsIERuID0gWGUzLmdldChLbik7CiAgICAgICAgICBpZiAoRG4pIChlLmZldGNoUHJpb3JpdHkgPT09ICJoaWdoIiB8fCAxMCA+IHIuaGlnaEltYWdlUHJlbG9hZHMuc2l6ZSkgJiYgKFhlMy5kZWxldGUoS24pLCByLmhpZ2hJbWFnZVByZWxvYWRzLmFkZChEbikpOwogICAgICAgICAgZWxzZSBpZiAoIXQuaW1hZ2VSZXNvdXJjZXMuaGFzT3duUHJvcGVydHkoS24pKSB7CiAgICAgICAgICAgIHQuaW1hZ2VSZXNvdXJjZXNbS25dID0gdG47CiAgICAgICAgICAgIHZhciBaZTMgPSBlLmNyb3NzT3JpZ2luLCB2cjIgPSB0eXBlb2YgWmUzID09ICJzdHJpbmciID8gWmUzID09PSAidXNlLWNyZWRlbnRpYWxzIiA/IFplMyA6ICIiIDogdm9pZCAwLCBIbiA9IHIuaGVhZGVycywgSmUyOwogICAgICAgICAgICBIbiAmJiAwIDwgSG4ucmVtYWluaW5nQ2FwYWNpdHkgJiYgdHlwZW9mIGUuc3JjU2V0ICE9ICJzdHJpbmciICYmIChlLmZldGNoUHJpb3JpdHkgPT09ICJoaWdoIiB8fCA1MDAgPiBIbi5oaWdoSW1hZ2VQcmVsb2Fkcy5sZW5ndGgpICYmIChKZTIgPSBzZShIMiwgImltYWdlIiwgewogICAgICAgICAgICAgIGltYWdlU3JjU2V0OiBlLnNyY1NldCwKICAgICAgICAgICAgICBpbWFnZVNpemVzOiBlLnNpemVzLAogICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiB2cjIsCiAgICAgICAgICAgICAgaW50ZWdyaXR5OiBlLmludGVncml0eSwKICAgICAgICAgICAgICBub25jZTogZS5ub25jZSwKICAgICAgICAgICAgICB0eXBlOiBlLnR5cGUsCiAgICAgICAgICAgICAgZmV0Y2hQcmlvcml0eTogZS5mZXRjaFByaW9yaXR5LAogICAgICAgICAgICAgIHJlZmVycmVyUG9saWN5OiBlLnJlZmVyZXJQb2xpY3kKICAgICAgICAgICAgfSksIDAgPD0gKEhuLnJlbWFpbmluZ0NhcGFjaXR5IC09IEplMi5sZW5ndGggKyAyKSkgPyAoci5yZXNldHMuaW1hZ2VbS25dID0gdG4sIEhuLmhpZ2hJbWFnZVByZWxvYWRzICYmIChIbi5oaWdoSW1hZ2VQcmVsb2FkcyArPSAiLCAiKSwgSG4uaGlnaEltYWdlUHJlbG9hZHMgKz0gSmUyKSA6IChEbiA9IFtdLCBVMihEbiwgewogICAgICAgICAgICAgIHJlbDogInByZWxvYWQiLAogICAgICAgICAgICAgIGFzOiAiaW1hZ2UiLAogICAgICAgICAgICAgIGhyZWY6IE4yID8gdm9pZCAwIDogSDIsCiAgICAgICAgICAgICAgaW1hZ2VTcmNTZXQ6IE4yLAogICAgICAgICAgICAgIGltYWdlU2l6ZXM6IGdyMiwKICAgICAgICAgICAgICBjcm9zc09yaWdpbjogdnIyLAogICAgICAgICAgICAgIGludGVncml0eTogZS5pbnRlZ3JpdHksCiAgICAgICAgICAgICAgdHlwZTogZS50eXBlLAogICAgICAgICAgICAgIGZldGNoUHJpb3JpdHk6IGUuZmV0Y2hQcmlvcml0eSwKICAgICAgICAgICAgICByZWZlcnJlclBvbGljeTogZS5yZWZlcnJlclBvbGljeQogICAgICAgICAgICB9KSwgZS5mZXRjaFByaW9yaXR5ID09PSAiaGlnaCIgfHwgMTAgPiByLmhpZ2hJbWFnZVByZWxvYWRzLnNpemUgPyByLmhpZ2hJbWFnZVByZWxvYWRzLmFkZChEbikgOiAoci5idWxrUHJlbG9hZHMuYWRkKERuKSwgWGUzLnNldChLbiwgRG4pKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBqbihuMiwgZSwgImltZyIpOwogICAgICBjYXNlICJiYXNlIjoKICAgICAgY2FzZSAiYXJlYSI6CiAgICAgIGNhc2UgImJyIjoKICAgICAgY2FzZSAiY29sIjoKICAgICAgY2FzZSAiZW1iZWQiOgogICAgICBjYXNlICJociI6CiAgICAgIGNhc2UgImtleWdlbiI6CiAgICAgIGNhc2UgInBhcmFtIjoKICAgICAgY2FzZSAic291cmNlIjoKICAgICAgY2FzZSAidHJhY2siOgogICAgICBjYXNlICJ3YnIiOgogICAgICAgIHJldHVybiBqbihuMiwgZSwgbDMpOwogICAgICBjYXNlICJhbm5vdGF0aW9uLXhtbCI6CiAgICAgIGNhc2UgImNvbG9yLXByb2ZpbGUiOgogICAgICBjYXNlICJmb250LWZhY2UiOgogICAgICBjYXNlICJmb250LWZhY2Utc3JjIjoKICAgICAgY2FzZSAiZm9udC1mYWNlLXVyaSI6CiAgICAgIGNhc2UgImZvbnQtZmFjZS1mb3JtYXQiOgogICAgICBjYXNlICJmb250LWZhY2UtbmFtZSI6CiAgICAgIGNhc2UgIm1pc3NpbmctZ2x5cGgiOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJoZWFkIjoKICAgICAgICBpZiAoMiA+IHUyLmluc2VydGlvbk1vZGUpIHsKICAgICAgICAgIHZhciBRZTIgPSBpIHx8IHIucHJlYW1ibGU7CiAgICAgICAgICBpZiAoUWUyLmhlYWRDaHVua3MpIHRocm93IEVycm9yKHkyKDU0NSwgImA8aGVhZD5gIikpOwogICAgICAgICAgaSAhPT0gbnVsbCAmJiBuMi5wdXNoKFhhKSwgUWUyLmhlYWRDaHVua3MgPSBbXTsKICAgICAgICAgIHZhciBzcjIgPSAkZTIoUWUyLmhlYWRDaHVua3MsIGUsICJoZWFkIik7CiAgICAgICAgfSBlbHNlIHNyMiA9IGxlMihuMiwgZSwgImhlYWQiKTsKICAgICAgICByZXR1cm4gc3IyOwogICAgICBjYXNlICJib2R5IjoKICAgICAgICBpZiAoMiA+IHUyLmluc2VydGlvbk1vZGUpIHsKICAgICAgICAgIHZhciBWZTIgPSBpIHx8IHIucHJlYW1ibGU7CiAgICAgICAgICBpZiAoVmUyLmJvZHlDaHVua3MpIHRocm93IEVycm9yKHkyKDU0NSwgImA8Ym9keT5gIikpOwogICAgICAgICAgaSAhPT0gbnVsbCAmJiBuMi5wdXNoKFphKSwgVmUyLmJvZHlDaHVua3MgPSBbXTsKICAgICAgICAgIHZhciBicjIgPSAkZTIoVmUyLmJvZHlDaHVua3MsIGUsICJib2R5Iik7CiAgICAgICAgfSBlbHNlIGJyMiA9IGxlMihuMiwgZSwgImJvZHkiKTsKICAgICAgICByZXR1cm4gYnIyOwogICAgICBjYXNlICJodG1sIjoKICAgICAgICBpZiAodTIuaW5zZXJ0aW9uTW9kZSA9PT0gMCkgewogICAgICAgICAgdmFyIEtlMiA9IGkgfHwgci5wcmVhbWJsZTsKICAgICAgICAgIGlmIChLZTIuaHRtbENodW5rcykgdGhyb3cgRXJyb3IoeTIoNTQ1LCAiYDxodG1sPmAiKSk7CiAgICAgICAgICBpICE9PSBudWxsICYmIG4yLnB1c2goSmEpLCBLZTIuaHRtbENodW5rcyA9IFsKICAgICAgICAgICAgVmEKICAgICAgICAgIF07CiAgICAgICAgICB2YXIgeXIyID0gJGUyKEtlMi5odG1sQ2h1bmtzLCBlLCAiaHRtbCIpOwogICAgICAgIH0gZWxzZSB5cjIgPSBsZTIobjIsIGUsICJodG1sIik7CiAgICAgICAgcmV0dXJuIHlyMjsKICAgICAgZGVmYXVsdDoKICAgICAgICBpZiAobDMuaW5kZXhPZigiLSIpICE9PSAtMSkgewogICAgICAgICAgbjIucHVzaChMMihsMykpOwogICAgICAgICAgdmFyIG1lMiA9IG51bGwsIFRyMiA9IG51bGwsIG1uOwogICAgICAgICAgZm9yIChtbiBpbiBlKSBpZiAoazQuY2FsbChlLCBtbikpIHsKICAgICAgICAgICAgdmFyIG9uID0gZVttbl07CiAgICAgICAgICAgIGlmIChvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgdmFyIEVyMiA9IG1uOwogICAgICAgICAgICAgIHN3aXRjaCAobW4pIHsKICAgICAgICAgICAgICAgIGNhc2UgImNoaWxkcmVuIjoKICAgICAgICAgICAgICAgICAgbWUyID0gb247CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOgogICAgICAgICAgICAgICAgICBUcjIgPSBvbjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJzdHlsZSI6CiAgICAgICAgICAgICAgICAgIFJpKG4yLCBvbik7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIjoKICAgICAgICAgICAgICAgIGNhc2UgInN1cHByZXNzSHlkcmF0aW9uV2FybmluZyI6CiAgICAgICAgICAgICAgICBjYXNlICJyZWYiOgogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImNsYXNzTmFtZSI6CiAgICAgICAgICAgICAgICAgIEVyMiA9ICJjbGFzcyI7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICBpZiAoTXQobW4pICYmIHR5cGVvZiBvbiAhPSAiZnVuY3Rpb24iICYmIHR5cGVvZiBvbiAhPSAic3ltYm9sIiAmJiBvbiAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAob24gPT09IHRydWUpIG9uID0gIiI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9uID09ICJvYmplY3QiKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBuMi5wdXNoKFosIHMoRXIyKSwgZW4sIHMoRTQob24pKSwgTyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBuMi5wdXNoKEkyKSwgcTMobjIsIFRyMiwgbWUyKSwgbWUyOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBsZTIobjIsIGUsIGwzKTsKICB9CiAgdmFyIFVyID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBmdW5jdGlvbiBHbihuMikgewogICAgdmFyIGwzID0gVXIuZ2V0KG4yKTsKICAgIHJldHVybiBsMyA9PT0gdm9pZCAwICYmIChsMyA9IGcoIjwvIiArIG4yICsgIj4iKSwgVXIuc2V0KG4yLCBsMykpLCBsMzsKICB9CiAgZnVuY3Rpb24gR3IobjIsIGwzKSB7CiAgICBuMiA9IG4yLnByZWFtYmxlLCBuMi5odG1sQ2h1bmtzID09PSBudWxsICYmIGwzLmh0bWxDaHVua3MgJiYgKG4yLmh0bWxDaHVua3MgPSBsMy5odG1sQ2h1bmtzKSwgbjIuaGVhZENodW5rcyA9PT0gbnVsbCAmJiBsMy5oZWFkQ2h1bmtzICYmIChuMi5oZWFkQ2h1bmtzID0gbDMuaGVhZENodW5rcyksIG4yLmJvZHlDaHVua3MgPT09IG51bGwgJiYgbDMuYm9keUNodW5rcyAmJiAobjIuYm9keUNodW5rcyA9IGwzLmJvZHlDaHVua3MpOwogIH0KICBmdW5jdGlvbiBNaShuMiwgbDMpIHsKICAgIGwzID0gbDMuYm9vdHN0cmFwQ2h1bmtzOwogICAgZm9yICh2YXIgZSA9IDA7IGUgPCBsMy5sZW5ndGggLSAxOyBlKyspIGQzKG4yLCBsM1tlXSk7CiAgICByZXR1cm4gZSA8IGwzLmxlbmd0aCA/IChlID0gbDNbZV0sIGwzLmxlbmd0aCA9IDAsIFMzKG4yLCBlKSkgOiB0cnVlOwogIH0KICB2YXIgbWEgPSBnKCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXskUlQ9cGVyZm9ybWFuY2Uubm93KCl9KTsiKSwgcWEgPSBnKCc8dGVtcGxhdGUgaWQ9IicpLCBqYSA9IGcoJyI+PC90ZW1wbGF0ZT4nKSwgcGEgPSBnKCI8IS0tJi0tPiIpLCAkYSA9IGcoIjwhLS0vJi0tPiIpLCBuYyA9IGcoIjwhLS0kLS0+IiksIGxjID0gZygnPCEtLSQ/LS0+PHRlbXBsYXRlIGlkPSInKSwgZWMgPSBnKCciPjwvdGVtcGxhdGU+JyksIHRjID0gZygiPCEtLSQhLS0+IiksIHJjID0gZygiPCEtLS8kLS0+IiksIGljID0gZygiPHRlbXBsYXRlIiksIGFjID0gZygnIicpLCBjYyA9IGcoJyBkYXRhLWRnc3Q9IicpOwogIGcoJyBkYXRhLW1zZz0iJyk7CiAgZygnIGRhdGEtc3Rjaz0iJyk7CiAgZygnIGRhdGEtY3N0Y2s9IicpOwogIHZhciB1YyA9IGcoIj48L3RlbXBsYXRlPiIpOwogIGZ1bmN0aW9uIFlyKG4yLCBsMywgZSkgewogICAgaWYgKGQzKG4yLCBsYyksIGUgPT09IG51bGwpIHRocm93IEVycm9yKHkyKDM5NSkpOwogICAgcmV0dXJuIGQzKG4yLCBsMy5ib3VuZGFyeVByZWZpeCksIGQzKG4yLCBzKGUudG9TdHJpbmcoMTYpKSksIFMzKG4yLCBlYyk7CiAgfQogIHZhciBmYyA9IGcoJzxkaXYgaGlkZGVuIGlkPSInKSwgb2MgPSBnKCciPicpLCBoYyA9IGcoIjwvZGl2PiIpLCBkYyA9IGcoJzxzdmcgYXJpYS1oaWRkZW49InRydWUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGlkPSInKSwgZ2MgPSBnKCciPicpLCB2YyA9IGcoIjwvc3ZnPiIpLCBzYyA9IGcoJzxtYXRoIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTpub25lIiBpZD0iJyksIGJjID0gZygnIj4nKSwgeWMgPSBnKCI8L21hdGg+IiksIFRjID0gZygnPHRhYmxlIGhpZGRlbiBpZD0iJyksIEVjID0gZygnIj4nKSwgd2MgPSBnKCI8L3RhYmxlPiIpLCB4YyA9IGcoJzx0YWJsZSBoaWRkZW4+PHRib2R5IGlkPSInKSwgQ2MgPSBnKCciPicpLCBSYyA9IGcoIjwvdGJvZHk+PC90YWJsZT4iKSwgU2MgPSBnKCc8dGFibGUgaGlkZGVuPjx0ciBpZD0iJyksIEZjID0gZygnIj4nKSwgUGMgPSBnKCI8L3RyPjwvdGFibGU+IiksIEFjID0gZygnPHRhYmxlIGhpZGRlbj48Y29sZ3JvdXAgaWQ9IicpLCBrYyA9IGcoJyI+JyksIE1jID0gZygiPC9jb2xncm91cD48L3RhYmxlPiIpOwogIGZ1bmN0aW9uIEljKG4yLCBsMywgZSwgdCkgewogICAgc3dpdGNoIChlLmluc2VydGlvbk1vZGUpIHsKICAgICAgY2FzZSAwOgogICAgICBjYXNlIDE6CiAgICAgIGNhc2UgMzoKICAgICAgY2FzZSAyOgogICAgICAgIHJldHVybiBkMyhuMiwgZmMpLCBkMyhuMiwgbDMuc2VnbWVudFByZWZpeCksIGQzKG4yLCBzKHQudG9TdHJpbmcoMTYpKSksIFMzKG4yLCBvYyk7CiAgICAgIGNhc2UgNDoKICAgICAgICByZXR1cm4gZDMobjIsIGRjKSwgZDMobjIsIGwzLnNlZ21lbnRQcmVmaXgpLCBkMyhuMiwgcyh0LnRvU3RyaW5nKDE2KSkpLCBTMyhuMiwgZ2MpOwogICAgICBjYXNlIDU6CiAgICAgICAgcmV0dXJuIGQzKG4yLCBzYyksIGQzKG4yLCBsMy5zZWdtZW50UHJlZml4KSwgZDMobjIsIHModC50b1N0cmluZygxNikpKSwgUzMobjIsIGJjKTsKICAgICAgY2FzZSA2OgogICAgICAgIHJldHVybiBkMyhuMiwgVGMpLCBkMyhuMiwgbDMuc2VnbWVudFByZWZpeCksIGQzKG4yLCBzKHQudG9TdHJpbmcoMTYpKSksIFMzKG4yLCBFYyk7CiAgICAgIGNhc2UgNzoKICAgICAgICByZXR1cm4gZDMobjIsIHhjKSwgZDMobjIsIGwzLnNlZ21lbnRQcmVmaXgpLCBkMyhuMiwgcyh0LnRvU3RyaW5nKDE2KSkpLCBTMyhuMiwgQ2MpOwogICAgICBjYXNlIDg6CiAgICAgICAgcmV0dXJuIGQzKG4yLCBTYyksIGQzKG4yLCBsMy5zZWdtZW50UHJlZml4KSwgZDMobjIsIHModC50b1N0cmluZygxNikpKSwgUzMobjIsIEZjKTsKICAgICAgY2FzZSA5OgogICAgICAgIHJldHVybiBkMyhuMiwgQWMpLCBkMyhuMiwgbDMuc2VnbWVudFByZWZpeCksIGQzKG4yLCBzKHQudG9TdHJpbmcoMTYpKSksIFMzKG4yLCBrYyk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgRXJyb3IoeTIoMzk3KSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIE9jKG4yLCBsMykgewogICAgc3dpdGNoIChsMy5pbnNlcnRpb25Nb2RlKSB7CiAgICAgIGNhc2UgMDoKICAgICAgY2FzZSAxOgogICAgICBjYXNlIDM6CiAgICAgIGNhc2UgMjoKICAgICAgICByZXR1cm4gUzMobjIsIGhjKTsKICAgICAgY2FzZSA0OgogICAgICAgIHJldHVybiBTMyhuMiwgdmMpOwogICAgICBjYXNlIDU6CiAgICAgICAgcmV0dXJuIFMzKG4yLCB5Yyk7CiAgICAgIGNhc2UgNjoKICAgICAgICByZXR1cm4gUzMobjIsIHdjKTsKICAgICAgY2FzZSA3OgogICAgICAgIHJldHVybiBTMyhuMiwgUmMpOwogICAgICBjYXNlIDg6CiAgICAgICAgcmV0dXJuIFMzKG4yLCBQYyk7CiAgICAgIGNhc2UgOToKICAgICAgICByZXR1cm4gUzMobjIsIE1jKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBFcnJvcih5MigzOTcpKTsKICAgIH0KICB9CiAgdmFyIF9jID0gZygnJFJTPWZ1bmN0aW9uKGEsYil7YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2ZvcihhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk7YS5maXJzdENoaWxkOyliLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEuZmlyc3RDaGlsZCxiKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYil9OyRSUygiJyksIExjID0gZygnJFJTKCInKSwgQmMgPSBnKCciLCInKSwgTmMgPSBnKCciKTxcL3NjcmlwdD4nKTsKICBnKCc8dGVtcGxhdGUgZGF0YS1yc2k9IiIgZGF0YS1zaWQ9IicpOwogIGcoJyIgZGF0YS1waWQ9IicpOwogIHZhciBYciA9IGcoYCRSQj1bXTskUlY9ZnVuY3Rpb24oYSl7JFJUPXBlcmZvcm1hbmNlLm5vdygpO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7Yis9Mil7dmFyIGM9YVtiXSxlPWFbYisxXTtudWxsIT09ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7dmFyIGY9Yy5wYXJlbnROb2RlO2lmKGYpe3ZhciBnPWMucHJldmlvdXNTaWJsaW5nLGg9MDtkb3tpZihjJiY4PT09Yy5ub2RlVHlwZSl7dmFyIGQ9Yy5kYXRhO2lmKCIvJCI9PT1kfHwiLyYiPT09ZClpZigwPT09aClicmVhaztlbHNlIGgtLTtlbHNlIiQiIT09ZCYmIiQ/IiE9PWQmJiIkfiIhPT1kJiYiJCEiIT09ZCYmIiYiIT09ZHx8aCsrfWQ9Yy5uZXh0U2libGluZztmLnJlbW92ZUNoaWxkKGMpO2M9ZH13aGlsZShjKTtmb3IoO2UuZmlyc3RDaGlsZDspZi5pbnNlcnRCZWZvcmUoZS5maXJzdENoaWxkLGMpO2cuZGF0YT0iJCI7Zy5fcmVhY3RSZXRyeSYmcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGcuX3JlYWN0UmV0cnkpfX1hLmxlbmd0aD0wfTsKJFJDPWZ1bmN0aW9uKGEsYil7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSkoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk/KGEucHJldmlvdXNTaWJsaW5nLmRhdGE9IiR+IiwkUkIucHVzaChhLGIpLDI9PT0kUkIubGVuZ3RoJiYoIm51bWJlciIhPT10eXBlb2YgJFJUP3JlcXVlc3RBbmltYXRpb25GcmFtZSgkUlYuYmluZChudWxsLCRSQikpOihhPXBlcmZvcm1hbmNlLm5vdygpLHNldFRpbWVvdXQoJFJWLmJpbmQobnVsbCwkUkIpLDIzMDA+YSYmMkUzPGE/MjMwMC1hOiRSVCszMDAtYSkpKSk6Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpfTtgKTsKICBzKGAkUlY9ZnVuY3Rpb24oQSxnKXtmdW5jdGlvbiBrKGEsYil7dmFyIGU9YS5nZXRBdHRyaWJ1dGUoYik7ZSYmKGI9YS5zdHlsZSxsLnB1c2goYSxiLnZpZXdUcmFuc2l0aW9uTmFtZSxiLnZpZXdUcmFuc2l0aW9uQ2xhc3MpLCJhdXRvIiE9PWUmJihiLnZpZXdUcmFuc2l0aW9uQ2xhc3M9ZSksKGE9YS5nZXRBdHRyaWJ1dGUoInZ0LW5hbWUiKSl8fChhPSJfVF8iK0srKyArIl8iKSxiLnZpZXdUcmFuc2l0aW9uTmFtZT1hLEI9ITApfXZhciBCPSExLEs9MCxsPVtdO3RyeXt2YXIgZj1kb2N1bWVudC5fX3JlYWN0Vmlld1RyYW5zaXRpb247aWYoZil7Zi5maW5pc2hlZC5maW5hbGx5KCRSVi5iaW5kKG51bGwsZykpO3JldHVybn12YXIgbT1uZXcgTWFwO2ZvcihmPTE7ZjxnLmxlbmd0aDtmKz0yKWZvcih2YXIgaD1nW2ZdLnF1ZXJ5U2VsZWN0b3JBbGwoIlt2dC1zaGFyZV0iKSxkPTA7ZDxoLmxlbmd0aDtkKyspe3ZhciBjPWhbZF07bS5zZXQoYy5nZXRBdHRyaWJ1dGUoInZ0LW5hbWUiKSxjKX12YXIgdT1bXTtmb3IoaD0wO2g8Zy5sZW5ndGg7aCs9Mil7dmFyIEM9Z1toXSx4PUMucGFyZW50Tm9kZTtpZih4KXt2YXIgdj14LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKHYubGVmdHx8di50b3B8fHYud2lkdGh8fHYuaGVpZ2h0KXtjPUM7Zm9yKGY9MDtjOyl7aWYoOD09PWMubm9kZVR5cGUpe3ZhciByPWMuZGF0YTtpZigiLyQiPT09cilpZigwPT09ZilicmVhaztlbHNlIGYtLTtlbHNlIiQiIT09ciYmIiQ/IiE9PXImJiIkfiIhPT1yJiYiJCEiIT09cnx8ZisrfWVsc2UgaWYoMT09PWMubm9kZVR5cGUpe2Q9Yzt2YXIgRD1kLmdldEF0dHJpYnV0ZSgidnQtbmFtZSIpLHk9bS5nZXQoRCk7ayhkLHk/InZ0LXNoYXJlIjoidnQtZXhpdCIpO3kmJihrKHksInZ0LXNoYXJlIiksbS5zZXQoRCxudWxsKSk7dmFyIEU9ZC5xdWVyeVNlbGVjdG9yQWxsKCJbdnQtc2hhcmVdIik7Zm9yKGQ9MDtkPEUubGVuZ3RoO2QrKyl7dmFyIEY9RVtkXSxHPUYuZ2V0QXR0cmlidXRlKCJ2dC1uYW1lIiksCkg9bS5nZXQoRyk7SCYmKGsoRiwidnQtc2hhcmUiKSxrKEgsInZ0LXNoYXJlIiksbS5zZXQoRyxudWxsKSl9fWM9Yy5uZXh0U2libGluZ31mb3IodmFyIEk9Z1toKzFdLHQ9SS5maXJzdEVsZW1lbnRDaGlsZDt0OyludWxsIT09bS5nZXQodC5nZXRBdHRyaWJ1dGUoInZ0LW5hbWUiKSkmJmsodCwidnQtZW50ZXIiKSx0PXQubmV4dEVsZW1lbnRTaWJsaW5nO2M9eDtkbyBmb3IodmFyIG49Yy5maXJzdEVsZW1lbnRDaGlsZDtuOyl7dmFyIEo9bi5nZXRBdHRyaWJ1dGUoInZ0LXVwZGF0ZSIpO0omJiJub25lIiE9PUomJiFsLmluY2x1ZGVzKG4pJiZrKG4sInZ0LXVwZGF0ZSIpO249bi5uZXh0RWxlbWVudFNpYmxpbmd9d2hpbGUoKGM9Yy5wYXJlbnROb2RlKSYmMT09PWMubm9kZVR5cGUmJiJub25lIiE9PWMuZ2V0QXR0cmlidXRlKCJ2dC11cGRhdGUiKSk7dS5wdXNoLmFwcGx5KHUsSS5xdWVyeVNlbGVjdG9yQWxsKCdpbWdbc3JjXTpub3QoW2xvYWRpbmc9ImxhenkiXSknKSl9fX1pZihCKXt2YXIgej0KZG9jdW1lbnQuX19yZWFjdFZpZXdUcmFuc2l0aW9uPWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oe3VwZGF0ZTpmdW5jdGlvbigpe0EoZyk7Zm9yKHZhciBhPVtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGRvY3VtZW50LmZvbnRzLnJlYWR5XSxiPXt9LGU9MDtlPHUubGVuZ3RoO2I9e2c6Yi5nfSxlKyspaWYoYi5nPXVbZV0sIWIuZy5jb21wbGV0ZSl7dmFyIHA9Yi5nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOzA8cC5ib3R0b20mJjA8cC5yaWdodCYmcC50b3A8d2luZG93LmlubmVySGVpZ2h0JiZwLmxlZnQ8d2luZG93LmlubmVyV2lkdGgmJihwPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHcpe3JldHVybiBmdW5jdGlvbihxKXt3LmcuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIscSk7dy5nLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixxKX19KGIpKSxhLnB1c2gocCkpfXJldHVybiBQcm9taXNlLnJhY2UoW1Byb21pc2UuYWxsKGEpLG5ldyBQcm9taXNlKGZ1bmN0aW9uKHcpe3ZhciBxPQpwZXJmb3JtYW5jZS5ub3coKTtzZXRUaW1lb3V0KHcsMjMwMD5xJiYyRTM8cT8yMzAwLXE6NTAwKX0pXSl9LHR5cGVzOltdfSk7ei5yZWFkeS5maW5hbGx5KGZ1bmN0aW9uKCl7Zm9yKHZhciBhPWwubGVuZ3RoLTM7MDw9YTthLT0zKXt2YXIgYj1sW2FdLGU9Yi5zdHlsZTtlLnZpZXdUcmFuc2l0aW9uTmFtZT1sW2ErMV07ZS52aWV3VHJhbnNpdGlvbkNsYXNzPWxbYSsxXTsiIj09PWIuZ2V0QXR0cmlidXRlKCJzdHlsZSIpJiZiLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKX19KTt6LmZpbmlzaGVkLmZpbmFsbHkoZnVuY3Rpb24oKXtkb2N1bWVudC5fX3JlYWN0Vmlld1RyYW5zaXRpb249PT16JiYoZG9jdW1lbnQuX19yZWFjdFZpZXdUcmFuc2l0aW9uPW51bGwpfSk7JFJCPVtdO3JldHVybn19Y2F0Y2goYSl7fUEoZyl9LmJpbmQobnVsbCwkUlYpO2ApOwogIHZhciB6YyA9IGcoJyRSQygiJyksIERjID0gZyhgJFJNPW5ldyBNYXA7JFJSPWZ1bmN0aW9uKG4sdyxwKXtmdW5jdGlvbiB1KHEpe3RoaXMuX3A9bnVsbDtxKCl9Zm9yKHZhciByPW5ldyBNYXAsdD1kb2N1bWVudCxoLGIsZT10LnF1ZXJ5U2VsZWN0b3JBbGwoImxpbmtbZGF0YS1wcmVjZWRlbmNlXSxzdHlsZVtkYXRhLXByZWNlZGVuY2VdIiksdj1bXSxrPTA7Yj1lW2srK107KSJub3QgYWxsIj09PWIuZ2V0QXR0cmlidXRlKCJtZWRpYSIpP3YucHVzaChiKTooIkxJTksiPT09Yi50YWdOYW1lJiYkUk0uc2V0KGIuZ2V0QXR0cmlidXRlKCJocmVmIiksYiksci5zZXQoYi5kYXRhc2V0LnByZWNlZGVuY2UsaD1iKSk7ZT0wO2I9W107dmFyIGwsYTtmb3Ioaz0hMDs7KXtpZihrKXt2YXIgZj1wW2UrK107aWYoIWYpe2s9ITE7ZT0wO2NvbnRpbnVlfXZhciBjPSExLG09MDt2YXIgZD1mW20rK107aWYoYT0kUk0uZ2V0KGQpKXt2YXIgZz1hLl9wO2M9ITB9ZWxzZXthPXQuY3JlYXRlRWxlbWVudCgibGluayIpO2EuaHJlZj1kO2EucmVsPQoic3R5bGVzaGVldCI7Zm9yKGEuZGF0YXNldC5wcmVjZWRlbmNlPWw9ZlttKytdO2c9ZlttKytdOylhLnNldEF0dHJpYnV0ZShnLGZbbSsrXSk7Zz1hLl9wPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHEseCl7YS5vbmxvYWQ9dS5iaW5kKGEscSk7YS5vbmVycm9yPXUuYmluZChhLHgpfSk7JFJNLnNldChkLGEpfWQ9YS5nZXRBdHRyaWJ1dGUoIm1lZGlhIik7IWd8fGQmJiFtYXRjaE1lZGlhKGQpLm1hdGNoZXN8fGIucHVzaChnKTtpZihjKWNvbnRpbnVlfWVsc2V7YT12W2UrK107aWYoIWEpYnJlYWs7bD1hLmdldEF0dHJpYnV0ZSgiZGF0YS1wcmVjZWRlbmNlIik7YS5yZW1vdmVBdHRyaWJ1dGUoIm1lZGlhIil9Yz1yLmdldChsKXx8aDtjPT09aCYmKGg9YSk7ci5zZXQobCxhKTtjP2MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxjLm5leHRTaWJsaW5nKTooYz10LmhlYWQsYy5pbnNlcnRCZWZvcmUoYSxjLmZpcnN0Q2hpbGQpKX1pZihwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG4pKXAucHJldmlvdXNTaWJsaW5nLmRhdGE9CiIkfiI7UHJvbWlzZS5hbGwoYikudGhlbigkUkMuYmluZChudWxsLG4sdyksJFJYLmJpbmQobnVsbCxuLCJDU1MgZmFpbGVkIHRvIGxvYWQiKSl9OyRSUigiYCksIEhjID0gZygnJFJSKCInKSwgV2MgPSBnKCciLCInKSwgVWMgPSBnKCciLCcpLCBHYyA9IGcoJyInKSwgWWMgPSBnKCIpPFwvc2NyaXB0PiIpOwogIGcoJzx0ZW1wbGF0ZSBkYXRhLXJjaT0iIiBkYXRhLWJpZD0iJyk7CiAgZygnPHRlbXBsYXRlIGRhdGEtcnJpPSIiIGRhdGEtYmlkPSInKTsKICBnKCciIGRhdGEtc2lkPSInKTsKICBnKCciIGRhdGEtc3R5PSInKTsKICB2YXIgWGMgPSBnKCckUlg9ZnVuY3Rpb24oYixjLGQsZSxmKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthJiYoYj1hLnByZXZpb3VzU2libGluZyxiLmRhdGE9IiQhIixhPWEuZGF0YXNldCxjJiYoYS5kZ3N0PWMpLGQmJihhLm1zZz1kKSxlJiYoYS5zdGNrPWUpLGYmJihhLmNzdGNrPWYpLGIuX3JlYWN0UmV0cnkmJmIuX3JlYWN0UmV0cnkoKSl9OycpLCBaYyA9IGcoJyRSWD1mdW5jdGlvbihiLGMsZCxlLGYpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2EmJihiPWEucHJldmlvdXNTaWJsaW5nLGIuZGF0YT0iJCEiLGE9YS5kYXRhc2V0LGMmJihhLmRnc3Q9YyksZCYmKGEubXNnPWQpLGUmJihhLnN0Y2s9ZSksZiYmKGEuY3N0Y2s9ZiksYi5fcmVhY3RSZXRyeSYmYi5fcmVhY3RSZXRyeSgpKX07OyRSWCgiJyksIEpjID0gZygnJFJYKCInKSwgUWMgPSBnKCciJyksIFZjID0gZygiLCIpLCBLYyA9IGcoIik8XC9zY3JpcHQ+Iik7CiAgZygnPHRlbXBsYXRlIGRhdGEtcnhpPSIiIGRhdGEtYmlkPSInKTsKICBnKCciIGRhdGEtZGdzdD0iJyk7CiAgZygnIiBkYXRhLW1zZz0iJyk7CiAgZygnIiBkYXRhLXN0Y2s9IicpOwogIGcoJyIgZGF0YS1jc3Rjaz0iJyk7CiAgdmFyIG1jID0gL1s8XHUyMDI4XHUyMDI5XS9nOwogIGZ1bmN0aW9uIHFjKG4yKSB7CiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobjIpLnJlcGxhY2UobWMsIGZ1bmN0aW9uKGwzKSB7CiAgICAgIHN3aXRjaCAobDMpIHsKICAgICAgICBjYXNlICI8IjoKICAgICAgICAgIHJldHVybiAiXFx1MDAzYyI7CiAgICAgICAgY2FzZSAiXHUyMDI4IjoKICAgICAgICAgIHJldHVybiAiXFx1MjAyOCI7CiAgICAgICAgY2FzZSAiXHUyMDI5IjoKICAgICAgICAgIHJldHVybiAiXFx1MjAyOSI7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IEVycm9yKCJlc2NhcGVKU1N0cmluZ3NGb3JJbnN0cnVjdGlvblNjcmlwdHMgZW5jb3VudGVyZWQgYSBtYXRjaCBpdCBkb2VzIG5vdCBrbm93IGhvdyB0byByZXBsYWNlLiB0aGlzIG1lYW5zIHRoZSBtYXRjaCByZWdleCBhbmQgdGhlIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgYXJlIG5vIGxvbmdlciBpbiBzeW5jLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0Iik7CiAgICAgIH0KICAgIH0pOwogIH0KICB2YXIgamMgPSAvWyY+PFx1MjAyOFx1MjAyOV0vZzsKICBmdW5jdGlvbiBBbChuMikgewogICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG4yKS5yZXBsYWNlKGpjLCBmdW5jdGlvbihsMykgewogICAgICBzd2l0Y2ggKGwzKSB7CiAgICAgICAgY2FzZSAiJiI6CiAgICAgICAgICByZXR1cm4gIlxcdTAwMjYiOwogICAgICAgIGNhc2UgIj4iOgogICAgICAgICAgcmV0dXJuICJcXHUwMDNlIjsKICAgICAgICBjYXNlICI8IjoKICAgICAgICAgIHJldHVybiAiXFx1MDAzYyI7CiAgICAgICAgY2FzZSAiXHUyMDI4IjoKICAgICAgICAgIHJldHVybiAiXFx1MjAyOCI7CiAgICAgICAgY2FzZSAiXHUyMDI5IjoKICAgICAgICAgIHJldHVybiAiXFx1MjAyOSI7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IEVycm9yKCJlc2NhcGVKU09iamVjdEZvckluc3RydWN0aW9uU2NyaXB0cyBlbmNvdW50ZXJlZCBhIG1hdGNoIGl0IGRvZXMgbm90IGtub3cgaG93IHRvIHJlcGxhY2UuIHRoaXMgbWVhbnMgdGhlIG1hdGNoIHJlZ2V4IGFuZCB0aGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVycyBhcmUgbm8gbG9uZ2VyIGluIHN5bmMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QiKTsKICAgICAgfQogICAgfSk7CiAgfQogIHZhciBwYyA9IGcoJyBtZWRpYT0ibm90IGFsbCIgZGF0YS1wcmVjZWRlbmNlPSInKSwgJGMgPSBnKCciIGRhdGEtaHJlZj0iJyksIG51ID0gZygnIj4nKSwgbHUgPSBnKCI8L3N0eWxlPiIpLCB2ZTIgPSBmYWxzZSwgaHQgPSB0cnVlOwogIGZ1bmN0aW9uIGV1KG4yKSB7CiAgICB2YXIgbDMgPSBuMi5ydWxlcywgZSA9IG4yLmhyZWZzLCB0ID0gMDsKICAgIGlmIChlLmxlbmd0aCkgewogICAgICBmb3IgKGQzKHRoaXMsIGVsLnN0YXJ0SW5saW5lU3R5bGUpLCBkMyh0aGlzLCBwYyksIGQzKHRoaXMsIG4yLnByZWNlZGVuY2UpLCBkMyh0aGlzLCAkYyk7IHQgPCBlLmxlbmd0aCAtIDE7IHQrKykgZDModGhpcywgZVt0XSksIGQzKHRoaXMsIE9pKTsKICAgICAgZm9yIChkMyh0aGlzLCBlW3RdKSwgZDModGhpcywgbnUpLCB0ID0gMDsgdCA8IGwzLmxlbmd0aDsgdCsrKSBkMyh0aGlzLCBsM1t0XSk7CiAgICAgIGh0ID0gUzModGhpcywgbHUpLCB2ZTIgPSB0cnVlLCBsMy5sZW5ndGggPSAwLCBlLmxlbmd0aCA9IDA7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHR1KG4yKSB7CiAgICByZXR1cm4gbjIuc3RhdGUgIT09IDIgPyB2ZTIgPSB0cnVlIDogZmFsc2U7CiAgfQogIGZ1bmN0aW9uIElpKG4yLCBsMywgZSkgewogICAgcmV0dXJuIHZlMiA9IGZhbHNlLCBodCA9IHRydWUsIGVsID0gZSwgbDMuc3R5bGVzLmZvckVhY2goZXUsIG4yKSwgZWwgPSBudWxsLCBsMy5zdHlsZXNoZWV0cy5mb3JFYWNoKHR1KSwgdmUyICYmIChlLnN0eWxlc1RvSG9pc3QgPSB0cnVlKSwgaHQ7CiAgfQogIGZ1bmN0aW9uIGhuKG4yKSB7CiAgICBmb3IgKHZhciBsMyA9IDA7IGwzIDwgbjIubGVuZ3RoOyBsMysrKSBkMyh0aGlzLCBuMltsM10pOwogICAgbjIubGVuZ3RoID0gMDsKICB9CiAgdmFyIEZuID0gW107CiAgZnVuY3Rpb24gcnUobjIpIHsKICAgIFUyKEZuLCBuMi5wcm9wcyk7CiAgICBmb3IgKHZhciBsMyA9IDA7IGwzIDwgRm4ubGVuZ3RoOyBsMysrKSBkMyh0aGlzLCBGbltsM10pOwogICAgRm4ubGVuZ3RoID0gMCwgbjIuc3RhdGUgPSAyOwogIH0KICB2YXIgaXUgPSBnKCcgZGF0YS1wcmVjZWRlbmNlPSInKSwgYXUgPSBnKCciIGRhdGEtaHJlZj0iJyksIE9pID0gZygiICIpLCBjdSA9IGcoJyI+JyksIHV1ID0gZygiPC9zdHlsZT4iKTsKICBmdW5jdGlvbiBmdShuMikgewogICAgdmFyIGwzID0gMCA8IG4yLnNoZWV0cy5zaXplOwogICAgbjIuc2hlZXRzLmZvckVhY2gocnUsIHRoaXMpLCBuMi5zaGVldHMuY2xlYXIoKTsKICAgIHZhciBlID0gbjIucnVsZXMsIHQgPSBuMi5ocmVmczsKICAgIGlmICghbDMgfHwgdC5sZW5ndGgpIHsKICAgICAgaWYgKGQzKHRoaXMsIGVsLnN0YXJ0SW5saW5lU3R5bGUpLCBkMyh0aGlzLCBpdSksIGQzKHRoaXMsIG4yLnByZWNlZGVuY2UpLCBuMiA9IDAsIHQubGVuZ3RoKSB7CiAgICAgICAgZm9yIChkMyh0aGlzLCBhdSk7IG4yIDwgdC5sZW5ndGggLSAxOyBuMisrKSBkMyh0aGlzLCB0W24yXSksIGQzKHRoaXMsIE9pKTsKICAgICAgICBkMyh0aGlzLCB0W24yXSk7CiAgICAgIH0KICAgICAgZm9yIChkMyh0aGlzLCBjdSksIG4yID0gMDsgbjIgPCBlLmxlbmd0aDsgbjIrKykgZDModGhpcywgZVtuMl0pOwogICAgICBkMyh0aGlzLCB1dSksIGUubGVuZ3RoID0gMCwgdC5sZW5ndGggPSAwOwogICAgfQogIH0KICBmdW5jdGlvbiBvdShuMikgewogICAgaWYgKG4yLnN0YXRlID09PSAwKSB7CiAgICAgIG4yLnN0YXRlID0gMTsKICAgICAgdmFyIGwzID0gbjIucHJvcHM7CiAgICAgIGZvciAoVTIoRm4sIHsKICAgICAgICByZWw6ICJwcmVsb2FkIiwKICAgICAgICBhczogInN0eWxlIiwKICAgICAgICBocmVmOiBuMi5wcm9wcy5ocmVmLAogICAgICAgIGNyb3NzT3JpZ2luOiBsMy5jcm9zc09yaWdpbiwKICAgICAgICBmZXRjaFByaW9yaXR5OiBsMy5mZXRjaFByaW9yaXR5LAogICAgICAgIGludGVncml0eTogbDMuaW50ZWdyaXR5LAogICAgICAgIG1lZGlhOiBsMy5tZWRpYSwKICAgICAgICBocmVmTGFuZzogbDMuaHJlZkxhbmcsCiAgICAgICAgcmVmZXJyZXJQb2xpY3k6IGwzLnJlZmVycmVyUG9saWN5CiAgICAgIH0pLCBuMiA9IDA7IG4yIDwgRm4ubGVuZ3RoOyBuMisrKSBkMyh0aGlzLCBGbltuMl0pOwogICAgICBGbi5sZW5ndGggPSAwOwogICAgfQogIH0KICBmdW5jdGlvbiBodShuMikgewogICAgbjIuc2hlZXRzLmZvckVhY2gob3UsIHRoaXMpLCBuMi5zaGVldHMuY2xlYXIoKTsKICB9CiAgZygnPGxpbmsgcmVsPSJleHBlY3QiIGhyZWY9IiMnKTsKICBnKCciIGJsb2NraW5nPSJyZW5kZXIiLz4nKTsKICB2YXIgX2kgPSBnKCcgaWQ9IicpOwogIGZ1bmN0aW9uIGllKG4yLCBsMykgewogICAgKGwzLmluc3RydWN0aW9ucyAmIDMyKSA9PT0gMCAmJiAobDMuaW5zdHJ1Y3Rpb25zIHw9IDMyLCBuMi5wdXNoKF9pLCBzKEU0KCJfIiArIGwzLmlkUHJlZml4ICsgIlJfIikpLCBPKSk7CiAgfQogIHZhciBaciA9IGcoIlsiKSwgSnIgPSBnKCIsWyIpLCBkdCA9IGcoIiwiKSwgbHQgPSBnKCJdIik7CiAgZnVuY3Rpb24gZHUobjIsIGwzKSB7CiAgICBkMyhuMiwgWnIpOwogICAgdmFyIGUgPSBacjsKICAgIGwzLnN0eWxlc2hlZXRzLmZvckVhY2goZnVuY3Rpb24odCkgewogICAgICBpZiAodC5zdGF0ZSAhPT0gMikgaWYgKHQuc3RhdGUgPT09IDMpIGQzKG4yLCBlKSwgZDMobjIsIHMoQWwoIiIgKyB0LnByb3BzLmhyZWYpKSksIGQzKG4yLCBsdCksIGUgPSBKcjsKICAgICAgZWxzZSB7CiAgICAgICAgZDMobjIsIGUpOwogICAgICAgIHZhciByID0gdC5wcm9wc1siZGF0YS1wcmVjZWRlbmNlIl0sIGkgPSB0LnByb3BzLCBhID0ga2woIiIgKyB0LnByb3BzLmhyZWYpOwogICAgICAgIGQzKG4yLCBzKEFsKGEpKSksIHIgPSAiIiArIHIsIGQzKG4yLCBkdCksIGQzKG4yLCBzKEFsKHIpKSk7CiAgICAgICAgZm9yICh2YXIgdTIgaW4gaSkgaWYgKGs0LmNhbGwoaSwgdTIpICYmIChyID0gaVt1Ml0sIHIgIT0gbnVsbCkpIHN3aXRjaCAodTIpIHsKICAgICAgICAgIGNhc2UgImhyZWYiOgogICAgICAgICAgY2FzZSAicmVsIjoKICAgICAgICAgIGNhc2UgInByZWNlZGVuY2UiOgogICAgICAgICAgY2FzZSAiZGF0YS1wcmVjZWRlbmNlIjoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJjaGlsZHJlbiI6CiAgICAgICAgICBjYXNlICJkYW5nZXJvdXNseVNldElubmVySFRNTCI6CiAgICAgICAgICAgIHRocm93IEVycm9yKHkyKDM5OSwgImxpbmsiKSk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBndShuMiwgdTIsIHIpOwogICAgICAgIH0KICAgICAgICBkMyhuMiwgbHQpLCBlID0gSnIsIHQuc3RhdGUgPSAzOwogICAgICB9CiAgICB9KSwgZDMobjIsIGx0KTsKICB9CiAgZnVuY3Rpb24gZ3UobjIsIGwzLCBlKSB7CiAgICB2YXIgdCA9IGwzLnRvTG93ZXJDYXNlKCk7CiAgICBzd2l0Y2ggKHR5cGVvZiBlKSB7CiAgICAgIGNhc2UgImZ1bmN0aW9uIjoKICAgICAgY2FzZSAic3ltYm9sIjoKICAgICAgICByZXR1cm47CiAgICB9CiAgICBzd2l0Y2ggKGwzKSB7CiAgICAgIGNhc2UgImlubmVySFRNTCI6CiAgICAgIGNhc2UgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjoKICAgICAgY2FzZSAic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIjoKICAgICAgY2FzZSAic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIjoKICAgICAgY2FzZSAic3R5bGUiOgogICAgICBjYXNlICJyZWYiOgogICAgICAgIHJldHVybjsKICAgICAgY2FzZSAiY2xhc3NOYW1lIjoKICAgICAgICB0ID0gImNsYXNzIiwgbDMgPSAiIiArIGU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImhpZGRlbiI6CiAgICAgICAgaWYgKGUgPT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgbDMgPSAiIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAic3JjIjoKICAgICAgY2FzZSAiaHJlZiI6CiAgICAgICAgZSA9IGtsKGUpLCBsMyA9ICIiICsgZTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBpZiAoMiA8IGwzLmxlbmd0aCAmJiAobDNbMF0gPT09ICJvIiB8fCBsM1swXSA9PT0gIk8iKSAmJiAobDNbMV0gPT09ICJuIiB8fCBsM1sxXSA9PT0gIk4iKSB8fCAhTXQobDMpKSByZXR1cm47CiAgICAgICAgbDMgPSAiIiArIGU7CiAgICB9CiAgICBkMyhuMiwgZHQpLCBkMyhuMiwgcyhBbCh0KSkpLCBkMyhuMiwgZHQpLCBkMyhuMiwgcyhBbChsMykpKTsKICB9CiAgZnVuY3Rpb24gZ3QoKSB7CiAgICByZXR1cm4gewogICAgICBzdHlsZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksCiAgICAgIHN0eWxlc2hlZXRzOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLAogICAgICBzdXNwZW5zZXlJbWFnZXM6IGZhbHNlCiAgICB9OwogIH0KICBmdW5jdGlvbiB2dShuMikgewogICAgdmFyIGwzID0gRDMgfHwgbnVsbDsKICAgIGlmIChsMykgewogICAgICB2YXIgZSA9IGwzLnJlc3VtYWJsZVN0YXRlLCB0ID0gbDMucmVuZGVyU3RhdGU7CiAgICAgIGlmICh0eXBlb2YgbjIgPT0gInN0cmluZyIgJiYgbjIpIHsKICAgICAgICBpZiAoIWUuZG5zUmVzb3VyY2VzLmhhc093blByb3BlcnR5KG4yKSkgewogICAgICAgICAgZS5kbnNSZXNvdXJjZXNbbjJdID0gbnVsbCwgZSA9IHQuaGVhZGVyczsKICAgICAgICAgIHZhciByLCBpOwogICAgICAgICAgKGkgPSBlICYmIDAgPCBlLnJlbWFpbmluZ0NhcGFjaXR5KSAmJiAoaSA9IChyID0gIjwiICsgKCIiICsgbjIpLnJlcGxhY2UoSXQsIE90KSArICI+OyByZWw9ZG5zLXByZWZldGNoIiwgMCA8PSAoZS5yZW1haW5pbmdDYXBhY2l0eSAtPSByLmxlbmd0aCArIDIpKSksIGkgPyAodC5yZXNldHMuZG5zW24yXSA9IG51bGwsIGUucHJlY29ubmVjdHMgJiYgKGUucHJlY29ubmVjdHMgKz0gIiwgIiksIGUucHJlY29ubmVjdHMgKz0gcikgOiAociA9IFtdLCBVMihyLCB7CiAgICAgICAgICAgIGhyZWY6IG4yLAogICAgICAgICAgICByZWw6ICJkbnMtcHJlZmV0Y2giCiAgICAgICAgICB9KSwgdC5wcmVjb25uZWN0cy5hZGQocikpOwogICAgICAgIH0KICAgICAgICBYbihsMyk7CiAgICAgIH0KICAgIH0gZWxzZSBFbi5EKG4yKTsKICB9CiAgZnVuY3Rpb24gc3UobjIsIGwzKSB7CiAgICB2YXIgZSA9IEQzIHx8IG51bGw7CiAgICBpZiAoZSkgewogICAgICB2YXIgdCA9IGUucmVzdW1hYmxlU3RhdGUsIHIgPSBlLnJlbmRlclN0YXRlOwogICAgICBpZiAodHlwZW9mIG4yID09ICJzdHJpbmciICYmIG4yKSB7CiAgICAgICAgdmFyIGkgPSBsMyA9PT0gInVzZS1jcmVkZW50aWFscyIgPyAiY3JlZGVudGlhbHMiIDogdHlwZW9mIGwzID09ICJzdHJpbmciID8gImFub255bW91cyIgOiAiZGVmYXVsdCI7CiAgICAgICAgaWYgKCF0LmNvbm5lY3RSZXNvdXJjZXNbaV0uaGFzT3duUHJvcGVydHkobjIpKSB7CiAgICAgICAgICB0LmNvbm5lY3RSZXNvdXJjZXNbaV1bbjJdID0gbnVsbCwgdCA9IHIuaGVhZGVyczsKICAgICAgICAgIHZhciBhLCB1MjsKICAgICAgICAgIGlmICh1MiA9IHQgJiYgMCA8IHQucmVtYWluaW5nQ2FwYWNpdHkpIHsKICAgICAgICAgICAgaWYgKHUyID0gIjwiICsgKCIiICsgbjIpLnJlcGxhY2UoSXQsIE90KSArICI+OyByZWw9cHJlY29ubmVjdCIsIHR5cGVvZiBsMyA9PSAic3RyaW5nIikgewogICAgICAgICAgICAgIHZhciBjMiA9ICgiIiArIGwzKS5yZXBsYWNlKHZ0LCBzdCk7CiAgICAgICAgICAgICAgdTIgKz0gJzsgY3Jvc3NvcmlnaW49IicgKyBjMiArICciJzsKICAgICAgICAgICAgfQogICAgICAgICAgICB1MiA9IChhID0gdTIsIDAgPD0gKHQucmVtYWluaW5nQ2FwYWNpdHkgLT0gYS5sZW5ndGggKyAyKSk7CiAgICAgICAgICB9CiAgICAgICAgICB1MiA/IChyLnJlc2V0cy5jb25uZWN0W2ldW24yXSA9IG51bGwsIHQucHJlY29ubmVjdHMgJiYgKHQucHJlY29ubmVjdHMgKz0gIiwgIiksIHQucHJlY29ubmVjdHMgKz0gYSkgOiAoaSA9IFtdLCBVMihpLCB7CiAgICAgICAgICAgIHJlbDogInByZWNvbm5lY3QiLAogICAgICAgICAgICBocmVmOiBuMiwKICAgICAgICAgICAgY3Jvc3NPcmlnaW46IGwzCiAgICAgICAgICB9KSwgci5wcmVjb25uZWN0cy5hZGQoaSkpOwogICAgICAgIH0KICAgICAgICBYbihlKTsKICAgICAgfQogICAgfSBlbHNlIEVuLkMobjIsIGwzKTsKICB9CiAgZnVuY3Rpb24gYnUobjIsIGwzLCBlKSB7CiAgICB2YXIgdCA9IEQzIHx8IG51bGw7CiAgICBpZiAodCkgewogICAgICB2YXIgciA9IHQucmVzdW1hYmxlU3RhdGUsIGkgPSB0LnJlbmRlclN0YXRlOwogICAgICBpZiAobDMgJiYgbjIpIHsKICAgICAgICBzd2l0Y2ggKGwzKSB7CiAgICAgICAgICBjYXNlICJpbWFnZSI6CiAgICAgICAgICAgIGlmIChlKSB2YXIgYSA9IGUuaW1hZ2VTcmNTZXQsIHUyID0gZS5pbWFnZVNpemVzLCBjMiA9IGUuZmV0Y2hQcmlvcml0eTsKICAgICAgICAgICAgdmFyIGYyID0gYSA/IGEgKyBgCmAgKyAodTIgfHwgIiIpIDogbjI7CiAgICAgICAgICAgIGlmIChyLmltYWdlUmVzb3VyY2VzLmhhc093blByb3BlcnR5KGYyKSkgcmV0dXJuOwogICAgICAgICAgICByLmltYWdlUmVzb3VyY2VzW2YyXSA9IHRuLCByID0gaS5oZWFkZXJzOwogICAgICAgICAgICB2YXIgbzsKICAgICAgICAgICAgciAmJiAwIDwgci5yZW1haW5pbmdDYXBhY2l0eSAmJiB0eXBlb2YgYSAhPSAic3RyaW5nIiAmJiBjMiA9PT0gImhpZ2giICYmIChvID0gc2UobjIsIGwzLCBlKSwgMCA8PSAoci5yZW1haW5pbmdDYXBhY2l0eSAtPSBvLmxlbmd0aCArIDIpKSA/IChpLnJlc2V0cy5pbWFnZVtmMl0gPSB0biwgci5oaWdoSW1hZ2VQcmVsb2FkcyAmJiAoci5oaWdoSW1hZ2VQcmVsb2FkcyArPSAiLCAiKSwgci5oaWdoSW1hZ2VQcmVsb2FkcyArPSBvKSA6IChyID0gW10sIFUyKHIsIEsyKHsKICAgICAgICAgICAgICByZWw6ICJwcmVsb2FkIiwKICAgICAgICAgICAgICBocmVmOiBhID8gdm9pZCAwIDogbjIsCiAgICAgICAgICAgICAgYXM6IGwzCiAgICAgICAgICAgIH0sIGUpKSwgYzIgPT09ICJoaWdoIiA/IGkuaGlnaEltYWdlUHJlbG9hZHMuYWRkKHIpIDogKGkuYnVsa1ByZWxvYWRzLmFkZChyKSwgaS5wcmVsb2Fkcy5pbWFnZXMuc2V0KGYyLCByKSkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInN0eWxlIjoKICAgICAgICAgICAgaWYgKHIuc3R5bGVSZXNvdXJjZXMuaGFzT3duUHJvcGVydHkobjIpKSByZXR1cm47CiAgICAgICAgICAgIGEgPSBbXSwgVTIoYSwgSzIoewogICAgICAgICAgICAgIHJlbDogInByZWxvYWQiLAogICAgICAgICAgICAgIGhyZWY6IG4yLAogICAgICAgICAgICAgIGFzOiBsMwogICAgICAgICAgICB9LCBlKSksIHIuc3R5bGVSZXNvdXJjZXNbbjJdID0gIWUgfHwgdHlwZW9mIGUuY3Jvc3NPcmlnaW4gIT0gInN0cmluZyIgJiYgdHlwZW9mIGUuaW50ZWdyaXR5ICE9ICJzdHJpbmciID8gdG4gOiBbCiAgICAgICAgICAgICAgZS5jcm9zc09yaWdpbiwKICAgICAgICAgICAgICBlLmludGVncml0eQogICAgICAgICAgICBdLCBpLnByZWxvYWRzLnN0eWxlc2hlZXRzLnNldChuMiwgYSksIGkuYnVsa1ByZWxvYWRzLmFkZChhKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJzY3JpcHQiOgogICAgICAgICAgICBpZiAoci5zY3JpcHRSZXNvdXJjZXMuaGFzT3duUHJvcGVydHkobjIpKSByZXR1cm47CiAgICAgICAgICAgIGEgPSBbXSwgaS5wcmVsb2Fkcy5zY3JpcHRzLnNldChuMiwgYSksIGkuYnVsa1ByZWxvYWRzLmFkZChhKSwgVTIoYSwgSzIoewogICAgICAgICAgICAgIHJlbDogInByZWxvYWQiLAogICAgICAgICAgICAgIGhyZWY6IG4yLAogICAgICAgICAgICAgIGFzOiBsMwogICAgICAgICAgICB9LCBlKSksIHIuc2NyaXB0UmVzb3VyY2VzW24yXSA9ICFlIHx8IHR5cGVvZiBlLmNyb3NzT3JpZ2luICE9ICJzdHJpbmciICYmIHR5cGVvZiBlLmludGVncml0eSAhPSAic3RyaW5nIiA/IHRuIDogWwogICAgICAgICAgICAgIGUuY3Jvc3NPcmlnaW4sCiAgICAgICAgICAgICAgZS5pbnRlZ3JpdHkKICAgICAgICAgICAgXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAoci51bmtub3duUmVzb3VyY2VzLmhhc093blByb3BlcnR5KGwzKSkgewogICAgICAgICAgICAgIGlmIChhID0gci51bmtub3duUmVzb3VyY2VzW2wzXSwgYS5oYXNPd25Qcm9wZXJ0eShuMikpIHJldHVybjsKICAgICAgICAgICAgfSBlbHNlIGEgPSB7fSwgci51bmtub3duUmVzb3VyY2VzW2wzXSA9IGE7CiAgICAgICAgICAgIGFbbjJdID0gdG4sIChyID0gaS5oZWFkZXJzKSAmJiAwIDwgci5yZW1haW5pbmdDYXBhY2l0eSAmJiBsMyA9PT0gImZvbnQiICYmIChmMiA9IHNlKG4yLCBsMywgZSksIDAgPD0gKHIucmVtYWluaW5nQ2FwYWNpdHkgLT0gZjIubGVuZ3RoICsgMikpID8gKGkucmVzZXRzLmZvbnRbbjJdID0gdG4sIHIuZm9udFByZWxvYWRzICYmIChyLmZvbnRQcmVsb2FkcyArPSAiLCAiKSwgci5mb250UHJlbG9hZHMgKz0gZjIpIDogKHIgPSBbXSwgbjIgPSBLMih7CiAgICAgICAgICAgICAgcmVsOiAicHJlbG9hZCIsCiAgICAgICAgICAgICAgaHJlZjogbjIsCiAgICAgICAgICAgICAgYXM6IGwzCiAgICAgICAgICAgIH0sIGUpLCBVMihyLCBuMiksIGwzKSA9PT0gImZvbnQiID8gaS5mb250UHJlbG9hZHMuYWRkKHIpIDogaS5idWxrUHJlbG9hZHMuYWRkKHIpOwogICAgICAgIH0KICAgICAgICBYbih0KTsKICAgICAgfQogICAgfSBlbHNlIEVuLkwobjIsIGwzLCBlKTsKICB9CiAgZnVuY3Rpb24geXUobjIsIGwzKSB7CiAgICB2YXIgZSA9IEQzIHx8IG51bGw7CiAgICBpZiAoZSkgewogICAgICB2YXIgdCA9IGUucmVzdW1hYmxlU3RhdGUsIHIgPSBlLnJlbmRlclN0YXRlOwogICAgICBpZiAobjIpIHsKICAgICAgICB2YXIgaSA9IGwzICYmIHR5cGVvZiBsMy5hcyA9PSAic3RyaW5nIiA/IGwzLmFzIDogInNjcmlwdCI7CiAgICAgICAgc3dpdGNoIChpKSB7CiAgICAgICAgICBjYXNlICJzY3JpcHQiOgogICAgICAgICAgICBpZiAodC5tb2R1bGVTY3JpcHRSZXNvdXJjZXMuaGFzT3duUHJvcGVydHkobjIpKSByZXR1cm47CiAgICAgICAgICAgIGkgPSBbXSwgdC5tb2R1bGVTY3JpcHRSZXNvdXJjZXNbbjJdID0gIWwzIHx8IHR5cGVvZiBsMy5jcm9zc09yaWdpbiAhPSAic3RyaW5nIiAmJiB0eXBlb2YgbDMuaW50ZWdyaXR5ICE9ICJzdHJpbmciID8gdG4gOiBbCiAgICAgICAgICAgICAgbDMuY3Jvc3NPcmlnaW4sCiAgICAgICAgICAgICAgbDMuaW50ZWdyaXR5CiAgICAgICAgICAgIF0sIHIucHJlbG9hZHMubW9kdWxlU2NyaXB0cy5zZXQobjIsIGkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGlmICh0Lm1vZHVsZVVua25vd25SZXNvdXJjZXMuaGFzT3duUHJvcGVydHkoaSkpIHsKICAgICAgICAgICAgICB2YXIgYSA9IHQudW5rbm93blJlc291cmNlc1tpXTsKICAgICAgICAgICAgICBpZiAoYS5oYXNPd25Qcm9wZXJ0eShuMikpIHJldHVybjsKICAgICAgICAgICAgfSBlbHNlIGEgPSB7fSwgdC5tb2R1bGVVbmtub3duUmVzb3VyY2VzW2ldID0gYTsKICAgICAgICAgICAgaSA9IFtdLCBhW24yXSA9IHRuOwogICAgICAgIH0KICAgICAgICBVMihpLCBLMih7CiAgICAgICAgICByZWw6ICJtb2R1bGVwcmVsb2FkIiwKICAgICAgICAgIGhyZWY6IG4yCiAgICAgICAgfSwgbDMpKSwgci5idWxrUHJlbG9hZHMuYWRkKGkpLCBYbihlKTsKICAgICAgfQogICAgfSBlbHNlIEVuLm0objIsIGwzKTsKICB9CiAgZnVuY3Rpb24gVHUobjIsIGwzLCBlKSB7CiAgICB2YXIgdCA9IEQzIHx8IG51bGw7CiAgICBpZiAodCkgewogICAgICB2YXIgciA9IHQucmVzdW1hYmxlU3RhdGUsIGkgPSB0LnJlbmRlclN0YXRlOwogICAgICBpZiAobjIpIHsKICAgICAgICBsMyA9IGwzIHx8ICJkZWZhdWx0IjsKICAgICAgICB2YXIgYSA9IGkuc3R5bGVzLmdldChsMyksIHUyID0gci5zdHlsZVJlc291cmNlcy5oYXNPd25Qcm9wZXJ0eShuMikgPyByLnN0eWxlUmVzb3VyY2VzW24yXSA6IHZvaWQgMDsKICAgICAgICB1MiAhPT0gbnVsbCAmJiAoci5zdHlsZVJlc291cmNlc1tuMl0gPSBudWxsLCBhIHx8IChhID0gewogICAgICAgICAgcHJlY2VkZW5jZTogcyhFNChsMykpLAogICAgICAgICAgcnVsZXM6IFtdLAogICAgICAgICAgaHJlZnM6IFtdLAogICAgICAgICAgc2hlZXRzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpCiAgICAgICAgfSwgaS5zdHlsZXMuc2V0KGwzLCBhKSksIGwzID0gewogICAgICAgICAgc3RhdGU6IDAsCiAgICAgICAgICBwcm9wczogSzIoewogICAgICAgICAgICByZWw6ICJzdHlsZXNoZWV0IiwKICAgICAgICAgICAgaHJlZjogbjIsCiAgICAgICAgICAgICJkYXRhLXByZWNlZGVuY2UiOiBsMwogICAgICAgICAgfSwgZSkKICAgICAgICB9LCB1MiAmJiAodTIubGVuZ3RoID09PSAyICYmIE9sKGwzLnByb3BzLCB1MiksIChpID0gaS5wcmVsb2Fkcy5zdHlsZXNoZWV0cy5nZXQobjIpKSAmJiAwIDwgaS5sZW5ndGggPyBpLmxlbmd0aCA9IDAgOiBsMy5zdGF0ZSA9IDEpLCBhLnNoZWV0cy5zZXQobjIsIGwzKSwgWG4odCkpOwogICAgICB9CiAgICB9IGVsc2UgRW4uUyhuMiwgbDMsIGUpOwogIH0KICBmdW5jdGlvbiBFdShuMiwgbDMpIHsKICAgIHZhciBlID0gRDMgfHwgbnVsbDsKICAgIGlmIChlKSB7CiAgICAgIHZhciB0ID0gZS5yZXN1bWFibGVTdGF0ZSwgciA9IGUucmVuZGVyU3RhdGU7CiAgICAgIGlmIChuMikgewogICAgICAgIHZhciBpID0gdC5zY3JpcHRSZXNvdXJjZXMuaGFzT3duUHJvcGVydHkobjIpID8gdC5zY3JpcHRSZXNvdXJjZXNbbjJdIDogdm9pZCAwOwogICAgICAgIGkgIT09IG51bGwgJiYgKHQuc2NyaXB0UmVzb3VyY2VzW24yXSA9IG51bGwsIGwzID0gSzIoewogICAgICAgICAgc3JjOiBuMiwKICAgICAgICAgIGFzeW5jOiB0cnVlCiAgICAgICAgfSwgbDMpLCBpICYmIChpLmxlbmd0aCA9PT0gMiAmJiBPbChsMywgaSksIG4yID0gci5wcmVsb2Fkcy5zY3JpcHRzLmdldChuMikpICYmIChuMi5sZW5ndGggPSAwKSwgbjIgPSBbXSwgci5zY3JpcHRzLmFkZChuMiksIGdlMihuMiwgbDMpLCBYbihlKSk7CiAgICAgIH0KICAgIH0gZWxzZSBFbi5YKG4yLCBsMyk7CiAgfQogIGZ1bmN0aW9uIHd1KG4yLCBsMykgewogICAgdmFyIGUgPSBEMyB8fCBudWxsOwogICAgaWYgKGUpIHsKICAgICAgdmFyIHQgPSBlLnJlc3VtYWJsZVN0YXRlLCByID0gZS5yZW5kZXJTdGF0ZTsKICAgICAgaWYgKG4yKSB7CiAgICAgICAgdmFyIGkgPSB0Lm1vZHVsZVNjcmlwdFJlc291cmNlcy5oYXNPd25Qcm9wZXJ0eShuMikgPyB0Lm1vZHVsZVNjcmlwdFJlc291cmNlc1tuMl0gOiB2b2lkIDA7CiAgICAgICAgaSAhPT0gbnVsbCAmJiAodC5tb2R1bGVTY3JpcHRSZXNvdXJjZXNbbjJdID0gbnVsbCwgbDMgPSBLMih7CiAgICAgICAgICBzcmM6IG4yLAogICAgICAgICAgdHlwZTogIm1vZHVsZSIsCiAgICAgICAgICBhc3luYzogdHJ1ZQogICAgICAgIH0sIGwzKSwgaSAmJiAoaS5sZW5ndGggPT09IDIgJiYgT2wobDMsIGkpLCBuMiA9IHIucHJlbG9hZHMubW9kdWxlU2NyaXB0cy5nZXQobjIpKSAmJiAobjIubGVuZ3RoID0gMCksIG4yID0gW10sIHIuc2NyaXB0cy5hZGQobjIpLCBnZTIobjIsIGwzKSwgWG4oZSkpOwogICAgICB9CiAgICB9IGVsc2UgRW4uTShuMiwgbDMpOwogIH0KICBmdW5jdGlvbiBPbChuMiwgbDMpIHsKICAgIG4yLmNyb3NzT3JpZ2luID09IG51bGwgJiYgKG4yLmNyb3NzT3JpZ2luID0gbDNbMF0pLCBuMi5pbnRlZ3JpdHkgPT0gbnVsbCAmJiAobjIuaW50ZWdyaXR5ID0gbDNbMV0pOwogIH0KICBmdW5jdGlvbiBzZShuMiwgbDMsIGUpIHsKICAgIG4yID0gKCIiICsgbjIpLnJlcGxhY2UoSXQsIE90KSwgbDMgPSAoIiIgKyBsMykucmVwbGFjZSh2dCwgc3QpLCBsMyA9ICI8IiArIG4yICsgJz47IHJlbD1wcmVsb2FkOyBhcz0iJyArIGwzICsgJyInOwogICAgZm9yICh2YXIgdCBpbiBlKSBrNC5jYWxsKGUsIHQpICYmIChuMiA9IGVbdF0sIHR5cGVvZiBuMiA9PSAic3RyaW5nIiAmJiAobDMgKz0gIjsgIiArIHQudG9Mb3dlckNhc2UoKSArICc9IicgKyAoIiIgKyBuMikucmVwbGFjZSh2dCwgc3QpICsgJyInKSk7CiAgICByZXR1cm4gbDM7CiAgfQogIHZhciBJdCA9IC9bPD5cclxuXS9nOwogIGZ1bmN0aW9uIE90KG4yKSB7CiAgICBzd2l0Y2ggKG4yKSB7CiAgICAgIGNhc2UgIjwiOgogICAgICAgIHJldHVybiAiJTNDIjsKICAgICAgY2FzZSAiPiI6CiAgICAgICAgcmV0dXJuICIlM0UiOwogICAgICBjYXNlIGAKYDoKICAgICAgICByZXR1cm4gIiUwQSI7CiAgICAgIGNhc2UgIlxyIjoKICAgICAgICByZXR1cm4gIiUwRCI7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgRXJyb3IoImVzY2FwZUxpbmtIcmVmRm9ySGVhZGVyQ29udGV4dFJlcGxhY2VyIGVuY291bnRlcmVkIGEgbWF0Y2ggaXQgZG9lcyBub3Qga25vdyBob3cgdG8gcmVwbGFjZS4gdGhpcyBtZWFucyB0aGUgbWF0Y2ggcmVnZXggYW5kIHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGFyZSBubyBsb25nZXIgaW4gc3luYy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdCIpOwogICAgfQogIH0KICB2YXIgdnQgPSAvWyInOyxcclxuXS9nOwogIGZ1bmN0aW9uIHN0KG4yKSB7CiAgICBzd2l0Y2ggKG4yKSB7CiAgICAgIGNhc2UgJyInOgogICAgICAgIHJldHVybiAiJTIyIjsKICAgICAgY2FzZSAiJyI6CiAgICAgICAgcmV0dXJuICIlMjciOwogICAgICBjYXNlICI7IjoKICAgICAgICByZXR1cm4gIiUzQiI7CiAgICAgIGNhc2UgIiwiOgogICAgICAgIHJldHVybiAiJTJDIjsKICAgICAgY2FzZSBgCmA6CiAgICAgICAgcmV0dXJuICIlMEEiOwogICAgICBjYXNlICJcciI6CiAgICAgICAgcmV0dXJuICIlMEQiOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IEVycm9yKCJlc2NhcGVTdHJpbmdGb3JMaW5rSGVhZGVyUXVvdGVkUGFyYW1WYWx1ZUNvbnRleHRSZXBsYWNlciBlbmNvdW50ZXJlZCBhIG1hdGNoIGl0IGRvZXMgbm90IGtub3cgaG93IHRvIHJlcGxhY2UuIHRoaXMgbWVhbnMgdGhlIG1hdGNoIHJlZ2V4IGFuZCB0aGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVycyBhcmUgbm8gbG9uZ2VyIGluIHN5bmMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QiKTsKICAgIH0KICB9CiAgZnVuY3Rpb24geHUobjIpIHsKICAgIHRoaXMuc3R5bGVzLmFkZChuMik7CiAgfQogIGZ1bmN0aW9uIEN1KG4yKSB7CiAgICB0aGlzLnN0eWxlc2hlZXRzLmFkZChuMik7CiAgfQogIGZ1bmN0aW9uIHRsKG4yLCBsMykgewogICAgbDMuc3R5bGVzLmZvckVhY2goeHUsIG4yKSwgbDMuc3R5bGVzaGVldHMuZm9yRWFjaChDdSwgbjIpLCBsMy5zdXNwZW5zZXlJbWFnZXMgJiYgKG4yLnN1c3BlbnNleUltYWdlcyA9IHRydWUpOwogIH0KICBmdW5jdGlvbiBMaShuMikgewogICAgcmV0dXJuIDAgPCBuMi5zdHlsZXNoZWV0cy5zaXplIHx8IG4yLnN1c3BlbnNleUltYWdlczsKICB9CiAgdmFyIFJ1ID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQsIFN1ID0gU3ltYm9sLmZvcigicmVhY3QuY2xpZW50LnJlZmVyZW5jZSIpOwogIGZ1bmN0aW9uIGJlMihuMikgewogICAgaWYgKG4yID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKHR5cGVvZiBuMiA9PSAiZnVuY3Rpb24iKSByZXR1cm4gbjIuJCR0eXBlb2YgPT09IFN1ID8gbnVsbCA6IG4yLmRpc3BsYXlOYW1lIHx8IG4yLm5hbWUgfHwgbnVsbDsKICAgIGlmICh0eXBlb2YgbjIgPT0gInN0cmluZyIpIHJldHVybiBuMjsKICAgIHN3aXRjaCAobjIpIHsKICAgICAgY2FzZSB1aToKICAgICAgICByZXR1cm4gIkZyYWdtZW50IjsKICAgICAgY2FzZSBvaToKICAgICAgICByZXR1cm4gIlByb2ZpbGVyIjsKICAgICAgY2FzZSBmaToKICAgICAgICByZXR1cm4gIlN0cmljdE1vZGUiOwogICAgICBjYXNlIFNlMjoKICAgICAgICByZXR1cm4gIlN1c3BlbnNlIjsKICAgICAgY2FzZSBQdDoKICAgICAgICByZXR1cm4gIlN1c3BlbnNlTGlzdCI7CiAgICAgIGNhc2UgZGk6CiAgICAgICAgcmV0dXJuICJBY3Rpdml0eSI7CiAgICB9CiAgICBpZiAodHlwZW9mIG4yID09ICJvYmplY3QiKSBzd2l0Y2ggKG4yLiQkdHlwZW9mKSB7CiAgICAgIGNhc2UgY2k6CiAgICAgICAgcmV0dXJuICJQb3J0YWwiOwogICAgICBjYXNlIFJlMjoKICAgICAgICByZXR1cm4gbjIuZGlzcGxheU5hbWUgfHwgIkNvbnRleHQiOwogICAgICBjYXNlIGhpOgogICAgICAgIHJldHVybiAobjIuX2NvbnRleHQuZGlzcGxheU5hbWUgfHwgIkNvbnRleHQiKSArICIuQ29uc3VtZXIiOwogICAgICBjYXNlIEZ0OgogICAgICAgIHZhciBsMyA9IG4yLnJlbmRlcjsKICAgICAgICByZXR1cm4gbjIgPSBuMi5kaXNwbGF5TmFtZSwgbjIgfHwgKG4yID0gbDMuZGlzcGxheU5hbWUgfHwgbDMubmFtZSB8fCAiIiwgbjIgPSBuMiAhPT0gIiIgPyAiRm9yd2FyZFJlZigiICsgbjIgKyAiKSIgOiAiRm9yd2FyZFJlZiIpLCBuMjsKICAgICAgY2FzZSBBdDoKICAgICAgICByZXR1cm4gbDMgPSBuMi5kaXNwbGF5TmFtZSB8fCBudWxsLCBsMyAhPT0gbnVsbCA/IGwzIDogYmUyKG4yLnR5cGUpIHx8ICJNZW1vIjsKICAgICAgY2FzZSBGZToKICAgICAgICBsMyA9IG4yLl9wYXlsb2FkLCBuMiA9IG4yLl9pbml0OwogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gYmUyKG4yKGwzKSk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHZhciBRciA9IHt9LCBXbiA9IG51bGw7CiAgZnVuY3Rpb24gQWUyKG4yLCBsMykgewogICAgaWYgKG4yICE9PSBsMykgewogICAgICBuMi5jb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBuMi5wYXJlbnRWYWx1ZSwgbjIgPSBuMi5wYXJlbnQ7CiAgICAgIHZhciBlID0gbDMucGFyZW50OwogICAgICBpZiAobjIgPT09IG51bGwpIHsKICAgICAgICBpZiAoZSAhPT0gbnVsbCkgdGhyb3cgRXJyb3IoeTIoNDAxKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGUgPT09IG51bGwpIHRocm93IEVycm9yKHkyKDQwMSkpOwogICAgICAgIEFlMihuMiwgZSk7CiAgICAgIH0KICAgICAgbDMuY29udGV4dC5fY3VycmVudFZhbHVlID0gbDMudmFsdWU7CiAgICB9CiAgfQogIGZ1bmN0aW9uIEJpKG4yKSB7CiAgICBuMi5jb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBuMi5wYXJlbnRWYWx1ZSwgbjIgPSBuMi5wYXJlbnQsIG4yICE9PSBudWxsICYmIEJpKG4yKTsKICB9CiAgZnVuY3Rpb24gTmkobjIpIHsKICAgIHZhciBsMyA9IG4yLnBhcmVudDsKICAgIGwzICE9PSBudWxsICYmIE5pKGwzKSwgbjIuY29udGV4dC5fY3VycmVudFZhbHVlID0gbjIudmFsdWU7CiAgfQogIGZ1bmN0aW9uIHppKG4yLCBsMykgewogICAgaWYgKG4yLmNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IG4yLnBhcmVudFZhbHVlLCBuMiA9IG4yLnBhcmVudCwgbjIgPT09IG51bGwpIHRocm93IEVycm9yKHkyKDQwMikpOwogICAgbjIuZGVwdGggPT09IGwzLmRlcHRoID8gQWUyKG4yLCBsMykgOiB6aShuMiwgbDMpOwogIH0KICBmdW5jdGlvbiBEaShuMiwgbDMpIHsKICAgIHZhciBlID0gbDMucGFyZW50OwogICAgaWYgKGUgPT09IG51bGwpIHRocm93IEVycm9yKHkyKDQwMikpOwogICAgbjIuZGVwdGggPT09IGUuZGVwdGggPyBBZTIobjIsIGUpIDogRGkobjIsIGUpLCBsMy5jb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBsMy52YWx1ZTsKICB9CiAgZnVuY3Rpb24gU24objIpIHsKICAgIHZhciBsMyA9IFduOwogICAgbDMgIT09IG4yICYmIChsMyA9PT0gbnVsbCA/IE5pKG4yKSA6IG4yID09PSBudWxsID8gQmkobDMpIDogbDMuZGVwdGggPT09IG4yLmRlcHRoID8gQWUyKGwzLCBuMikgOiBsMy5kZXB0aCA+IG4yLmRlcHRoID8gemkobDMsIG4yKSA6IERpKGwzLCBuMiksIFduID0gbjIpOwogIH0KICB2YXIgVnIgPSB7CiAgICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uKG4yLCBsMykgewogICAgICBuMiA9IG4yLl9yZWFjdEludGVybmFscywgbjIucXVldWUgIT09IG51bGwgJiYgbjIucXVldWUucHVzaChsMyk7CiAgICB9LAogICAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24objIsIGwzKSB7CiAgICAgIG4yID0gbjIuX3JlYWN0SW50ZXJuYWxzLCBuMi5yZXBsYWNlID0gdHJ1ZSwgbjIucXVldWUgPSBbCiAgICAgICAgbDMKICAgICAgXTsKICAgIH0sCiAgICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgfQogIH0sIGJ0ID0gewogICAgaWQ6IDEsCiAgICBvdmVyZmxvdzogIiIKICB9OwogIGZ1bmN0aW9uIFVuKG4yLCBsMywgZSkgewogICAgdmFyIHQgPSBuMi5pZDsKICAgIG4yID0gbjIub3ZlcmZsb3c7CiAgICB2YXIgciA9IDMyIC0gYWUyKHQpIC0gMTsKICAgIHQgJj0gfigxIDw8IHIpLCBlICs9IDE7CiAgICB2YXIgaSA9IDMyIC0gYWUyKGwzKSArIHI7CiAgICBpZiAoMzAgPCBpKSB7CiAgICAgIHZhciBhID0gciAtIHIgJSA1OwogICAgICByZXR1cm4gaSA9ICh0ICYgKDEgPDwgYSkgLSAxKS50b1N0cmluZygzMiksIHQgPj49IGEsIHIgLT0gYSwgewogICAgICAgIGlkOiAxIDw8IDMyIC0gYWUyKGwzKSArIHIgfCBlIDw8IHIgfCB0LAogICAgICAgIG92ZXJmbG93OiBpICsgbjIKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGlkOiAxIDw8IGkgfCBlIDw8IHIgfCB0LAogICAgICBvdmVyZmxvdzogbjIKICAgIH07CiAgfQogIHZhciBhZTIgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IEF1LCBGdSA9IE1hdGgubG9nLCBQdSA9IE1hdGguTE4yOwogIGZ1bmN0aW9uIEF1KG4yKSB7CiAgICByZXR1cm4gbjIgPj4+PSAwLCBuMiA9PT0gMCA/IDMyIDogMzEgLSAoRnUobjIpIC8gUHUgfCAwKSB8IDA7CiAgfQogIGZ1bmN0aW9uIEooKSB7CiAgfQogIHZhciAkMiA9IEVycm9yKHkyKDQ2MCkpOwogIGZ1bmN0aW9uIGt1KG4yLCBsMywgZSkgewogICAgc3dpdGNoIChlID0gbjJbZV0sIGUgPT09IHZvaWQgMCA/IG4yLnB1c2gobDMpIDogZSAhPT0gbDMgJiYgKGwzLnRoZW4oSiwgSiksIGwzID0gZSksIGwzLnN0YXR1cykgewogICAgICBjYXNlICJmdWxmaWxsZWQiOgogICAgICAgIHJldHVybiBsMy52YWx1ZTsKICAgICAgY2FzZSAicmVqZWN0ZWQiOgogICAgICAgIHRocm93IGwzLnJlYXNvbjsKICAgICAgZGVmYXVsdDoKICAgICAgICBzd2l0Y2ggKHR5cGVvZiBsMy5zdGF0dXMgPT0gInN0cmluZyIgPyBsMy50aGVuKEosIEopIDogKG4yID0gbDMsIG4yLnN0YXR1cyA9ICJwZW5kaW5nIiwgbjIudGhlbihmdW5jdGlvbih0KSB7CiAgICAgICAgICBpZiAobDMuc3RhdHVzID09PSAicGVuZGluZyIpIHsKICAgICAgICAgICAgdmFyIHIgPSBsMzsKICAgICAgICAgICAgci5zdGF0dXMgPSAiZnVsZmlsbGVkIiwgci52YWx1ZSA9IHQ7CiAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24odCkgewogICAgICAgICAgaWYgKGwzLnN0YXR1cyA9PT0gInBlbmRpbmciKSB7CiAgICAgICAgICAgIHZhciByID0gbDM7CiAgICAgICAgICAgIHIuc3RhdHVzID0gInJlamVjdGVkIiwgci5yZWFzb24gPSB0OwogICAgICAgICAgfQogICAgICAgIH0pKSwgbDMuc3RhdHVzKSB7CiAgICAgICAgICBjYXNlICJmdWxmaWxsZWQiOgogICAgICAgICAgICByZXR1cm4gbDMudmFsdWU7CiAgICAgICAgICBjYXNlICJyZWplY3RlZCI6CiAgICAgICAgICAgIHRocm93IGwzLnJlYXNvbjsKICAgICAgICB9CiAgICAgICAgdGhyb3cgY2UgPSBsMywgJDI7CiAgICB9CiAgfQogIHZhciBjZSA9IG51bGw7CiAgZnVuY3Rpb24geWUyKCkgewogICAgaWYgKGNlID09PSBudWxsKSB0aHJvdyBFcnJvcih5Mig0NTkpKTsKICAgIHZhciBuMiA9IGNlOwogICAgcmV0dXJuIGNlID0gbnVsbCwgbjI7CiAgfQogIGZ1bmN0aW9uIE11KG4yLCBsMykgewogICAgcmV0dXJuIG4yID09PSBsMyAmJiAobjIgIT09IDAgfHwgMSAvIG4yID09PSAxIC8gbDMpIHx8IG4yICE9PSBuMiAmJiBsMyAhPT0gbDM7CiAgfQogIHZhciBJdSA9IHR5cGVvZiBPYmplY3QuaXMgPT0gImZ1bmN0aW9uIiA/IE9iamVjdC5pcyA6IE11LCB3biA9IG51bGwsIF90ID0gbnVsbCwgTHQgPSBudWxsLCBCdCA9IG51bGwsIHVlID0gbnVsbCwgUCA9IG51bGwsIEZsID0gZmFsc2UsIFRlMiA9IGZhbHNlLCBfbCA9IDAsIExsID0gMCwgQmwgPSAtMSwgRWUyID0gMCwgbmwgPSBudWxsLCBQbiA9IG51bGwsIGtlMiA9IDA7CiAgZnVuY3Rpb24gVG4oKSB7CiAgICBpZiAod24gPT09IG51bGwpIHRocm93IEVycm9yKHkyKDMyMSkpOwogICAgcmV0dXJuIHduOwogIH0KICBmdW5jdGlvbiBLcigpIHsKICAgIGlmICgwIDwga2UyKSB0aHJvdyBFcnJvcih5MigzMTIpKTsKICAgIHJldHVybiB7CiAgICAgIG1lbW9pemVkU3RhdGU6IG51bGwsCiAgICAgIHF1ZXVlOiBudWxsLAogICAgICBuZXh0OiBudWxsCiAgICB9OwogIH0KICBmdW5jdGlvbiBOdCgpIHsKICAgIHJldHVybiBQID09PSBudWxsID8gdWUgPT09IG51bGwgPyAoRmwgPSBmYWxzZSwgdWUgPSBQID0gS3IoKSkgOiAoRmwgPSB0cnVlLCBQID0gdWUpIDogUC5uZXh0ID09PSBudWxsID8gKEZsID0gZmFsc2UsIFAgPSBQLm5leHQgPSBLcigpKSA6IChGbCA9IHRydWUsIFAgPSBQLm5leHQpLCBQOwogIH0KICBmdW5jdGlvbiAkbigpIHsKICAgIHZhciBuMiA9IG5sOwogICAgcmV0dXJuIG5sID0gbnVsbCwgbjI7CiAgfQogIGZ1bmN0aW9uIE5sKCkgewogICAgQnQgPSBMdCA9IF90ID0gd24gPSBudWxsLCBUZTIgPSBmYWxzZSwgdWUgPSBudWxsLCBrZTIgPSAwLCBQID0gUG4gPSBudWxsOwogIH0KICBmdW5jdGlvbiBIaShuMiwgbDMpIHsKICAgIHJldHVybiB0eXBlb2YgbDMgPT0gImZ1bmN0aW9uIiA/IGwzKG4yKSA6IGwzOwogIH0KICBmdW5jdGlvbiBtcihuMiwgbDMsIGUpIHsKICAgIGlmICh3biA9IFRuKCksIFAgPSBOdCgpLCBGbCkgewogICAgICB2YXIgdCA9IFAucXVldWU7CiAgICAgIGlmIChsMyA9IHQuZGlzcGF0Y2gsIFBuICE9PSBudWxsICYmIChlID0gUG4uZ2V0KHQpLCBlICE9PSB2b2lkIDApKSB7CiAgICAgICAgUG4uZGVsZXRlKHQpLCB0ID0gUC5tZW1vaXplZFN0YXRlOwogICAgICAgIGRvCiAgICAgICAgICB0ID0gbjIodCwgZS5hY3Rpb24pLCBlID0gZS5uZXh0OwogICAgICAgIHdoaWxlIChlICE9PSBudWxsKTsKICAgICAgICByZXR1cm4gUC5tZW1vaXplZFN0YXRlID0gdCwgWwogICAgICAgICAgdCwKICAgICAgICAgIGwzCiAgICAgICAgXTsKICAgICAgfQogICAgICByZXR1cm4gWwogICAgICAgIFAubWVtb2l6ZWRTdGF0ZSwKICAgICAgICBsMwogICAgICBdOwogICAgfQogICAgcmV0dXJuIG4yID0gbjIgPT09IEhpID8gdHlwZW9mIGwzID09ICJmdW5jdGlvbiIgPyBsMygpIDogbDMgOiBlICE9PSB2b2lkIDAgPyBlKGwzKSA6IGwzLCBQLm1lbW9pemVkU3RhdGUgPSBuMiwgbjIgPSBQLnF1ZXVlID0gewogICAgICBsYXN0OiBudWxsLAogICAgICBkaXNwYXRjaDogbnVsbAogICAgfSwgbjIgPSBuMi5kaXNwYXRjaCA9IE91LmJpbmQobnVsbCwgd24sIG4yKSwgWwogICAgICBQLm1lbW9pemVkU3RhdGUsCiAgICAgIG4yCiAgICBdOwogIH0KICBmdW5jdGlvbiBxcihuMiwgbDMpIHsKICAgIGlmICh3biA9IFRuKCksIFAgPSBOdCgpLCBsMyA9IGwzID09PSB2b2lkIDAgPyBudWxsIDogbDMsIFAgIT09IG51bGwpIHsKICAgICAgdmFyIGUgPSBQLm1lbW9pemVkU3RhdGU7CiAgICAgIGlmIChlICE9PSBudWxsICYmIGwzICE9PSBudWxsKSB7CiAgICAgICAgdmFyIHQgPSBlWzFdOwogICAgICAgIG46IGlmICh0ID09PSBudWxsKSB0ID0gZmFsc2U7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoICYmIHIgPCBsMy5sZW5ndGg7IHIrKykgaWYgKCFJdShsM1tyXSwgdFtyXSkpIHsKICAgICAgICAgICAgdCA9IGZhbHNlOwogICAgICAgICAgICBicmVhayBuOwogICAgICAgICAgfQogICAgICAgICAgdCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICh0KSByZXR1cm4gZVswXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG4yID0gbjIoKSwgUC5tZW1vaXplZFN0YXRlID0gWwogICAgICBuMiwKICAgICAgbDMKICAgIF0sIG4yOwogIH0KICBmdW5jdGlvbiBPdShuMiwgbDMsIGUpIHsKICAgIGlmICgyNSA8PSBrZTIpIHRocm93IEVycm9yKHkyKDMwMSkpOwogICAgaWYgKG4yID09PSB3bikgaWYgKFRlMiA9IHRydWUsIG4yID0gewogICAgICBhY3Rpb246IGUsCiAgICAgIG5leHQ6IG51bGwKICAgIH0sIFBuID09PSBudWxsICYmIChQbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpLCBlID0gUG4uZ2V0KGwzKSwgZSA9PT0gdm9pZCAwKSBQbi5zZXQobDMsIG4yKTsKICAgIGVsc2UgewogICAgICBmb3IgKGwzID0gZTsgbDMubmV4dCAhPT0gbnVsbDsgKSBsMyA9IGwzLm5leHQ7CiAgICAgIGwzLm5leHQgPSBuMjsKICAgIH0KICB9CiAgZnVuY3Rpb24gX3UoKSB7CiAgICB0aHJvdyBFcnJvcih5Mig0NDApKTsKICB9CiAgZnVuY3Rpb24gTHUoKSB7CiAgICB0aHJvdyBFcnJvcih5MigzOTQpKTsKICB9CiAgZnVuY3Rpb24gQnUoKSB7CiAgICB0aHJvdyBFcnJvcih5Mig0NzkpKTsKICB9CiAgZnVuY3Rpb24ganIobjIsIGwzLCBlKSB7CiAgICBUbigpOwogICAgdmFyIHQgPSBMbCsrLCByID0gTHQ7CiAgICBpZiAodHlwZW9mIG4yLiQkRk9STV9BQ1RJT04gPT0gImZ1bmN0aW9uIikgewogICAgICB2YXIgaSA9IG51bGwsIGEgPSBCdDsKICAgICAgciA9IHIuZm9ybVN0YXRlOwogICAgICB2YXIgdTIgPSBuMi4kJElTX1NJR05BVFVSRV9FUVVBTDsKICAgICAgaWYgKHIgIT09IG51bGwgJiYgdHlwZW9mIHUyID09ICJmdW5jdGlvbiIpIHsKICAgICAgICB2YXIgYzIgPSByWzFdOwogICAgICAgIHUyLmNhbGwobjIsIHJbMl0sIHJbM10pICYmIChpID0gZSAhPT0gdm9pZCAwID8gInAiICsgZSA6ICJrIiArIFJyKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgIGEsCiAgICAgICAgICBudWxsLAogICAgICAgICAgdAogICAgICAgIF0pLCAwKSwgYzIgPT09IGkgJiYgKEJsID0gdCwgbDMgPSByWzBdKSk7CiAgICAgIH0KICAgICAgdmFyIGYyID0gbjIuYmluZChudWxsLCBsMyk7CiAgICAgIHJldHVybiBuMiA9IGZ1bmN0aW9uKGgpIHsKICAgICAgICBmMihoKTsKICAgICAgfSwgdHlwZW9mIGYyLiQkRk9STV9BQ1RJT04gPT0gImZ1bmN0aW9uIiAmJiAobjIuJCRGT1JNX0FDVElPTiA9IGZ1bmN0aW9uKGgpIHsKICAgICAgICBoID0gZjIuJCRGT1JNX0FDVElPTihoKSwgZSAhPT0gdm9pZCAwICYmIChlICs9ICIiLCBoLmFjdGlvbiA9IGUpOwogICAgICAgIHZhciB2MyA9IGguZGF0YTsKICAgICAgICByZXR1cm4gdjMgJiYgKGkgPT09IG51bGwgJiYgKGkgPSBlICE9PSB2b2lkIDAgPyAicCIgKyBlIDogImsiICsgUnIoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgYSwKICAgICAgICAgIG51bGwsCiAgICAgICAgICB0CiAgICAgICAgXSksIDApKSwgdjMuYXBwZW5kKCIkQUNUSU9OX0tFWSIsIGkpKSwgaDsKICAgICAgfSksIFsKICAgICAgICBsMywKICAgICAgICBuMiwKICAgICAgICBmYWxzZQogICAgICBdOwogICAgfQogICAgdmFyIG8gPSBuMi5iaW5kKG51bGwsIGwzKTsKICAgIHJldHVybiBbCiAgICAgIGwzLAogICAgICBmdW5jdGlvbihoKSB7CiAgICAgICAgbyhoKTsKICAgICAgfSwKICAgICAgZmFsc2UKICAgIF07CiAgfQogIGZ1bmN0aW9uIFdpKG4yKSB7CiAgICB2YXIgbDMgPSBFZTI7CiAgICByZXR1cm4gRWUyICs9IDEsIG5sID09PSBudWxsICYmIChubCA9IFtdKSwga3UobmwsIG4yLCBsMyk7CiAgfQogIGZ1bmN0aW9uIE51KCkgewogICAgdGhyb3cgRXJyb3IoeTIoMzkzKSk7CiAgfQogIHZhciBwciA9IHsKICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbihuMikgewogICAgICByZXR1cm4gbjIuX2N1cnJlbnRWYWx1ZTsKICAgIH0sCiAgICB1c2U6IGZ1bmN0aW9uKG4yKSB7CiAgICAgIGlmIChuMiAhPT0gbnVsbCAmJiB0eXBlb2YgbjIgPT0gIm9iamVjdCIpIHsKICAgICAgICBpZiAodHlwZW9mIG4yLnRoZW4gPT0gImZ1bmN0aW9uIikgcmV0dXJuIFdpKG4yKTsKICAgICAgICBpZiAobjIuJCR0eXBlb2YgPT09IFJlMikgcmV0dXJuIG4yLl9jdXJyZW50VmFsdWU7CiAgICAgIH0KICAgICAgdGhyb3cgRXJyb3IoeTIoNDM4LCBTdHJpbmcobjIpKSk7CiAgICB9LAogICAgdXNlQ29udGV4dDogZnVuY3Rpb24objIpIHsKICAgICAgcmV0dXJuIFRuKCksIG4yLl9jdXJyZW50VmFsdWU7CiAgICB9LAogICAgdXNlTWVtbzogcXIsCiAgICB1c2VSZWR1Y2VyOiBtciwKICAgIHVzZVJlZjogZnVuY3Rpb24objIpIHsKICAgICAgd24gPSBUbigpLCBQID0gTnQoKTsKICAgICAgdmFyIGwzID0gUC5tZW1vaXplZFN0YXRlOwogICAgICByZXR1cm4gbDMgPT09IG51bGwgPyAobjIgPSB7CiAgICAgICAgY3VycmVudDogbjIKICAgICAgfSwgUC5tZW1vaXplZFN0YXRlID0gbjIpIDogbDM7CiAgICB9LAogICAgdXNlU3RhdGU6IGZ1bmN0aW9uKG4yKSB7CiAgICAgIHJldHVybiBtcihIaSwgbjIpOwogICAgfSwKICAgIHVzZUluc2VydGlvbkVmZmVjdDogSiwKICAgIHVzZUxheW91dEVmZmVjdDogSiwKICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbihuMiwgbDMpIHsKICAgICAgcmV0dXJuIHFyKGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBuMjsKICAgICAgfSwgbDMpOwogICAgfSwKICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IEosCiAgICB1c2VFZmZlY3Q6IEosCiAgICB1c2VEZWJ1Z1ZhbHVlOiBKLAogICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24objIsIGwzKSB7CiAgICAgIHJldHVybiBUbigpLCBsMyAhPT0gdm9pZCAwID8gbDMgOiBuMjsKICAgIH0sCiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIFRuKCksIFsKICAgICAgICBmYWxzZSwKICAgICAgICBMdQogICAgICBdOwogICAgfSwKICAgIHVzZUlkOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIG4yID0gX3QudHJlZUNvbnRleHQsIGwzID0gbjIub3ZlcmZsb3c7CiAgICAgIG4yID0gbjIuaWQsIG4yID0gKG4yICYgfigxIDw8IDMyIC0gYWUyKG4yKSAtIDEpKS50b1N0cmluZygzMikgKyBsMzsKICAgICAgdmFyIGUgPSBmZTsKICAgICAgaWYgKGUgPT09IG51bGwpIHRocm93IEVycm9yKHkyKDQwNCkpOwogICAgICByZXR1cm4gbDMgPSBfbCsrLCBuMiA9ICJfIiArIGUuaWRQcmVmaXggKyAiUl8iICsgbjIsIDAgPCBsMyAmJiAobjIgKz0gIkgiICsgbDMudG9TdHJpbmcoMzIpKSwgbjIgKyAiXyI7CiAgICB9LAogICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uKG4yLCBsMywgZSkgewogICAgICBpZiAoZSA9PT0gdm9pZCAwKSB0aHJvdyBFcnJvcih5Mig0MDcpKTsKICAgICAgcmV0dXJuIGUoKTsKICAgIH0sCiAgICB1c2VPcHRpbWlzdGljOiBmdW5jdGlvbihuMikgewogICAgICByZXR1cm4gVG4oKSwgWwogICAgICAgIG4yLAogICAgICAgIEJ1CiAgICAgIF07CiAgICB9LAogICAgdXNlQWN0aW9uU3RhdGU6IGpyLAogICAgdXNlRm9ybVN0YXRlOiBqciwKICAgIHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIFRuKCksIE9hMjsKICAgIH0sCiAgICB1c2VNZW1vQ2FjaGU6IGZ1bmN0aW9uKG4yKSB7CiAgICAgIGZvciAodmFyIGwzID0gQXJyYXkobjIpLCBlID0gMDsgZSA8IG4yOyBlKyspIGwzW2VdID0gRWE7CiAgICAgIHJldHVybiBsMzsKICAgIH0sCiAgICB1c2VDYWNoZVJlZnJlc2g6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gTnU7CiAgICB9LAogICAgdXNlRWZmZWN0RXZlbnQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gX3U7CiAgICB9CiAgfSwgZmUgPSBudWxsLCB6dSA9IHsKICAgIGdldENhY2hlRm9yVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IEVycm9yKHkyKDI0OCkpOwogICAgfSwKICAgIGNhY2hlU2lnbmFsOiBmdW5jdGlvbigpIHsKICAgICAgdGhyb3cgRXJyb3IoeTIoMjQ4KSk7CiAgICB9CiAgfSwgZXQsICRyOwogIGZ1bmN0aW9uIHBuKG4yKSB7CiAgICBpZiAoZXQgPT09IHZvaWQgMCkgdHJ5IHsKICAgICAgdGhyb3cgRXJyb3IoKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdmFyIGwzID0gZS5zdGFjay50cmltKCkubWF0Y2goL1xuKCAqKGF0ICk/KS8pOwogICAgICBldCA9IGwzICYmIGwzWzFdIHx8ICIiLCAkciA9IC0xIDwgZS5zdGFjay5pbmRleE9mKGAKICAgIGF0YCkgPyAiICg8YW5vbnltb3VzPikiIDogLTEgPCBlLnN0YWNrLmluZGV4T2YoIkAiKSA/ICJAdW5rbm93bjowOjAiIDogIiI7CiAgICB9CiAgICByZXR1cm4gYApgICsgZXQgKyBuMiArICRyOwogIH0KICB2YXIgdHQgPSBmYWxzZTsKICBmdW5jdGlvbiBlZShuMiwgbDMpIHsKICAgIGlmICghbjIgfHwgdHQpIHJldHVybiAiIjsKICAgIHR0ID0gdHJ1ZTsKICAgIHZhciBlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7CiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHZvaWQgMDsKICAgIHRyeSB7CiAgICAgIHZhciB0ID0gewogICAgICAgIERldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdDogZnVuY3Rpb24oKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAobDMpIHsKICAgICAgICAgICAgICB2YXIgaCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkoaC5wcm90b3R5cGUsICJwcm9wcyIsIHsKICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSksIHR5cGVvZiBSZWZsZWN0ID09ICJvYmplY3QiICYmIFJlZmxlY3QuY29uc3RydWN0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChoLCBbXSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChiNCkgewogICAgICAgICAgICAgICAgICB2YXIgdjMgPSBiNDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KG4yLCBbXSwgaCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIGguY2FsbCgpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoYjQpIHsKICAgICAgICAgICAgICAgICAgdjMgPSBiNDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG4yLmNhbGwoaC5wcm90b3R5cGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTsKICAgICAgICAgICAgICB9IGNhdGNoIChiNCkgewogICAgICAgICAgICAgICAgdjMgPSBiNDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgKGggPSBuMigpKSAmJiB0eXBlb2YgaC5jYXRjaCA9PSAiZnVuY3Rpb24iICYmIGguY2F0Y2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGI0KSB7CiAgICAgICAgICAgIGlmIChiNCAmJiB2MyAmJiB0eXBlb2YgYjQuc3RhY2sgPT0gInN0cmluZyIpIHJldHVybiBbCiAgICAgICAgICAgICAgYjQuc3RhY2ssCiAgICAgICAgICAgICAgdjMuc3RhY2sKICAgICAgICAgICAgXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIG51bGwKICAgICAgICAgIF07CiAgICAgICAgfQogICAgICB9OwogICAgICB0LkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdC5kaXNwbGF5TmFtZSA9ICJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QiOwogICAgICB2YXIgciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodC5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QsICJuYW1lIik7CiAgICAgIHIgJiYgci5jb25maWd1cmFibGUgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LCAibmFtZSIsIHsKICAgICAgICB2YWx1ZTogIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCIKICAgICAgfSk7CiAgICAgIHZhciBpID0gdC5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QoKSwgYSA9IGlbMF0sIHUyID0gaVsxXTsKICAgICAgaWYgKGEgJiYgdTIpIHsKICAgICAgICB2YXIgYzIgPSBhLnNwbGl0KGAKYCksIGYyID0gdTIuc3BsaXQoYApgKTsKICAgICAgICBmb3IgKHIgPSB0ID0gMDsgdCA8IGMyLmxlbmd0aCAmJiAhYzJbdF0uaW5jbHVkZXMoIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCIpOyApIHQrKzsKICAgICAgICBmb3IgKDsgciA8IGYyLmxlbmd0aCAmJiAhZjJbcl0uaW5jbHVkZXMoIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCIpOyApIHIrKzsKICAgICAgICBpZiAodCA9PT0gYzIubGVuZ3RoIHx8IHIgPT09IGYyLmxlbmd0aCkgZm9yICh0ID0gYzIubGVuZ3RoIC0gMSwgciA9IGYyLmxlbmd0aCAtIDE7IDEgPD0gdCAmJiAwIDw9IHIgJiYgYzJbdF0gIT09IGYyW3JdOyApIHItLTsKICAgICAgICBmb3IgKDsgMSA8PSB0ICYmIDAgPD0gcjsgdC0tLCByLS0pIGlmIChjMlt0XSAhPT0gZjJbcl0pIHsKICAgICAgICAgIGlmICh0ICE9PSAxIHx8IHIgIT09IDEpIGRvCiAgICAgICAgICAgIGlmICh0LS0sIHItLSwgMCA+IHIgfHwgYzJbdF0gIT09IGYyW3JdKSB7CiAgICAgICAgICAgICAgdmFyIG8gPSBgCmAgKyBjMlt0XS5yZXBsYWNlKCIgYXQgbmV3ICIsICIgYXQgIik7CiAgICAgICAgICAgICAgcmV0dXJuIG4yLmRpc3BsYXlOYW1lICYmIG8uaW5jbHVkZXMoIjxhbm9ueW1vdXM+IikgJiYgKG8gPSBvLnJlcGxhY2UoIjxhbm9ueW1vdXM+IiwgbjIuZGlzcGxheU5hbWUpKSwgbzsKICAgICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKDEgPD0gdCAmJiAwIDw9IHIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9IGZpbmFsbHkgewogICAgICB0dCA9IGZhbHNlLCBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IGU7CiAgICB9CiAgICByZXR1cm4gKGUgPSBuMiA/IG4yLmRpc3BsYXlOYW1lIHx8IG4yLm5hbWUgOiAiIikgPyBwbihlKSA6ICIiOwogIH0KICBmdW5jdGlvbiBVaShuMikgewogICAgaWYgKHR5cGVvZiBuMiA9PSAic3RyaW5nIikgcmV0dXJuIHBuKG4yKTsKICAgIGlmICh0eXBlb2YgbjIgPT0gImZ1bmN0aW9uIikgcmV0dXJuIG4yLnByb3RvdHlwZSAmJiBuMi5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA/IGVlKG4yLCB0cnVlKSA6IGVlKG4yLCBmYWxzZSk7CiAgICBpZiAodHlwZW9mIG4yID09ICJvYmplY3QiICYmIG4yICE9PSBudWxsKSB7CiAgICAgIHN3aXRjaCAobjIuJCR0eXBlb2YpIHsKICAgICAgICBjYXNlIEZ0OgogICAgICAgICAgcmV0dXJuIGVlKG4yLnJlbmRlciwgZmFsc2UpOwogICAgICAgIGNhc2UgQXQ6CiAgICAgICAgICByZXR1cm4gZWUobjIudHlwZSwgZmFsc2UpOwogICAgICAgIGNhc2UgRmU6CiAgICAgICAgICB2YXIgbDMgPSBuMiwgZSA9IGwzLl9wYXlsb2FkOwogICAgICAgICAgbDMgPSBsMy5faW5pdDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIG4yID0gbDMoZSk7CiAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgcmV0dXJuIHBuKCJMYXp5Iik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gVWkobjIpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgbjIubmFtZSA9PSAic3RyaW5nIikgewogICAgICAgIG46IHsKICAgICAgICAgIGUgPSBuMi5uYW1lLCBsMyA9IG4yLmVudjsKICAgICAgICAgIHZhciB0ID0gbjIuZGVidWdMb2NhdGlvbjsKICAgICAgICAgIGlmICh0ICE9IG51bGwgJiYgKG4yID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UsIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdm9pZCAwLCB0ID0gdC5zdGFjaywgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBuMiwgdC5zdGFydHNXaXRoKGBFcnJvcjogcmVhY3Qtc3RhY2stdG9wLWZyYW1lCmApICYmICh0ID0gdC5zbGljZSgyOSkpLCBuMiA9IHQuaW5kZXhPZihgCmApLCBuMiAhPT0gLTEgJiYgKHQgPSB0LnNsaWNlKG4yICsgMSkpLCBuMiA9IHQuaW5kZXhPZigicmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lIiksIG4yICE9PSAtMSAmJiAobjIgPSB0Lmxhc3RJbmRleE9mKGAKYCwgbjIpKSwgbjIgPSBuMiAhPT0gLTEgPyB0ID0gdC5zbGljZSgwLCBuMikgOiAiIiwgdCA9IG4yLmxhc3RJbmRleE9mKGAKYCksIG4yID0gdCA9PT0gLTEgPyBuMiA6IG4yLnNsaWNlKHQgKyAxKSwgbjIuaW5kZXhPZihlKSAhPT0gLTEpKSB7CiAgICAgICAgICAgIGUgPSBgCmAgKyBuMjsKICAgICAgICAgICAgYnJlYWsgbjsKICAgICAgICAgIH0KICAgICAgICAgIGUgPSBwbihlICsgKGwzID8gIiBbIiArIGwzICsgIl0iIDogIiIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGU7CiAgICAgIH0KICAgIH0KICAgIHN3aXRjaCAobjIpIHsKICAgICAgY2FzZSBQdDoKICAgICAgICByZXR1cm4gcG4oIlN1c3BlbnNlTGlzdCIpOwogICAgICBjYXNlIFNlMjoKICAgICAgICByZXR1cm4gcG4oIlN1c3BlbnNlIik7CiAgICB9CiAgICByZXR1cm4gIiI7CiAgfQogIGZ1bmN0aW9uIHJsKG4yLCBsMykgewogICAgcmV0dXJuICg1MDAgPCBsMy5ieXRlU2l6ZSB8fCBMaShsMy5jb250ZW50U3RhdGUpKSAmJiBsMy5jb250ZW50UHJlYW1ibGUgPT09IG51bGw7CiAgfQogIGZ1bmN0aW9uIER1KG4yKSB7CiAgICBpZiAodHlwZW9mIG4yID09ICJvYmplY3QiICYmIG4yICE9PSBudWxsICYmIHR5cGVvZiBuMi5lbnZpcm9ubWVudE5hbWUgPT0gInN0cmluZyIpIHsKICAgICAgdmFyIGwzID0gbjIuZW52aXJvbm1lbnROYW1lOwogICAgICBuMiA9IFsKICAgICAgICBuMgogICAgICBdLnNsaWNlKDApLCB0eXBlb2YgbjJbMF0gPT0gInN0cmluZyIgPyBuMi5zcGxpY2UoMCwgMSwgIiVjJXMlYyAiICsgbjJbMF0sICJiYWNrZ3JvdW5kOiAjZTZlNmU2O2JhY2tncm91bmQ6IGxpZ2h0LWRhcmsocmdiYSgwLDAsMCwwLjEpLCByZ2JhKDI1NSwyNTUsMjU1LDAuMjUpKTtjb2xvcjogIzAwMDAwMDtjb2xvcjogbGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKTtib3JkZXItcmFkaXVzOiAycHgiLCAiICIgKyBsMyArICIgIiwgIiIpIDogbjIuc3BsaWNlKDAsIDAsICIlYyVzJWMiLCAiYmFja2dyb3VuZDogI2U2ZTZlNjtiYWNrZ3JvdW5kOiBsaWdodC1kYXJrKHJnYmEoMCwwLDAsMC4xKSwgcmdiYSgyNTUsMjU1LDI1NSwwLjI1KSk7Y29sb3I6ICMwMDAwMDA7Y29sb3I6IGxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZik7Ym9yZGVyLXJhZGl1czogMnB4IiwgIiAiICsgbDMgKyAiICIsICIiKSwgbjIudW5zaGlmdChjb25zb2xlKSwgbDMgPSBSdS5hcHBseShjb25zb2xlLmVycm9yLCBuMiksIGwzKCk7CiAgICB9IGVsc2UgY29uc29sZS5lcnJvcihuMik7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZnVuY3Rpb24gR2kobjIsIGwzLCBlLCB0LCByLCBpLCBhLCB1MiwgYzIsIGYyLCBvKSB7CiAgICB2YXIgaCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbCwgdGhpcy5mbHVzaFNjaGVkdWxlZCA9IGZhbHNlLCB0aGlzLnJlc3VtYWJsZVN0YXRlID0gbjIsIHRoaXMucmVuZGVyU3RhdGUgPSBsMywgdGhpcy5yb290Rm9ybWF0Q29udGV4dCA9IGUsIHRoaXMucHJvZ3Jlc3NpdmVDaHVua1NpemUgPSB0ID09PSB2b2lkIDAgPyAxMjgwMCA6IHQsIHRoaXMuc3RhdHVzID0gMTAsIHRoaXMuZmF0YWxFcnJvciA9IG51bGwsIHRoaXMucGVuZGluZ1Jvb3RUYXNrcyA9IHRoaXMuYWxsUGVuZGluZ1Rhc2tzID0gdGhpcy5uZXh0U2VnbWVudElkID0gMCwgdGhpcy5jb21wbGV0ZWRQcmVhbWJsZVNlZ21lbnRzID0gdGhpcy5jb21wbGV0ZWRSb290U2VnbWVudCA9IG51bGwsIHRoaXMuYnl0ZVNpemUgPSAwLCB0aGlzLmFib3J0YWJsZVRhc2tzID0gaCwgdGhpcy5waW5nZWRUYXNrcyA9IFtdLCB0aGlzLmNsaWVudFJlbmRlcmVkQm91bmRhcmllcyA9IFtdLCB0aGlzLmNvbXBsZXRlZEJvdW5kYXJpZXMgPSBbXSwgdGhpcy5wYXJ0aWFsQm91bmRhcmllcyA9IFtdLCB0aGlzLnRyYWNrZWRQb3N0cG9uZXMgPSBudWxsLCB0aGlzLm9uRXJyb3IgPSByID09PSB2b2lkIDAgPyBEdSA6IHIsIHRoaXMub25Qb3N0cG9uZSA9IGYyID09PSB2b2lkIDAgPyBKIDogZjIsIHRoaXMub25BbGxSZWFkeSA9IGkgPT09IHZvaWQgMCA/IEogOiBpLCB0aGlzLm9uU2hlbGxSZWFkeSA9IGEgPT09IHZvaWQgMCA/IEogOiBhLCB0aGlzLm9uU2hlbGxFcnJvciA9IHUyID09PSB2b2lkIDAgPyBKIDogdTIsIHRoaXMub25GYXRhbEVycm9yID0gYzIgPT09IHZvaWQgMCA/IEogOiBjMiwgdGhpcy5mb3JtU3RhdGUgPSBvID09PSB2b2lkIDAgPyBudWxsIDogbzsKICB9CiAgZnVuY3Rpb24gWWkobjIsIGwzLCBlLCB0LCByLCBpLCBhLCB1MiwgYzIsIGYyLCBvLCBoKSB7CiAgICByZXR1cm4gbDMgPSBuZXcgR2kobDMsIGUsIHQsIHIsIGksIGEsIHUyLCBjMiwgZjIsIG8sIGgpLCBlID0gQW4obDMsIDAsIG51bGwsIHQsIGZhbHNlLCBmYWxzZSksIGUucGFyZW50Rmx1c2hlZCA9IHRydWUsIG4yID0gRGwobDMsIG51bGwsIG4yLCAtMSwgbnVsbCwgZSwgbnVsbCwgbnVsbCwgbDMuYWJvcnRhYmxlVGFza3MsIG51bGwsIHQsIG51bGwsIGJ0LCBudWxsLCBudWxsKSwgWW4objIpLCBsMy5waW5nZWRUYXNrcy5wdXNoKG4yKSwgbDM7CiAgfQogIGZ1bmN0aW9uIEh1KG4yLCBsMywgZSwgdCwgciwgaSwgYSwgdTIsIGMyLCBmMiwgbykgewogICAgcmV0dXJuIG4yID0gWWkobjIsIGwzLCBlLCB0LCByLCBpLCBhLCB1MiwgYzIsIGYyLCBvLCB2b2lkIDApLCBuMi50cmFja2VkUG9zdHBvbmVzID0gewogICAgICB3b3JraW5nTWFwOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLAogICAgICByb290Tm9kZXM6IFtdLAogICAgICByb290U2xvdHM6IG51bGwKICAgIH0sIG4yOwogIH0KICBmdW5jdGlvbiBYaShuMiwgbDMsIGUsIHQsIHIsIGksIGEsIHUyLCBjMikgewogICAgcmV0dXJuIGUgPSBuZXcgR2kobDMucmVzdW1hYmxlU3RhdGUsIGUsIGwzLnJvb3RGb3JtYXRDb250ZXh0LCBsMy5wcm9ncmVzc2l2ZUNodW5rU2l6ZSwgdCwgciwgaSwgYSwgdTIsIGMyLCBudWxsKSwgZS5uZXh0U2VnbWVudElkID0gbDMubmV4dFNlZ21lbnRJZCwgdHlwZW9mIGwzLnJlcGxheVNsb3RzID09ICJudW1iZXIiID8gKHQgPSBBbihlLCAwLCBudWxsLCBsMy5yb290Rm9ybWF0Q29udGV4dCwgZmFsc2UsIGZhbHNlKSwgdC5wYXJlbnRGbHVzaGVkID0gdHJ1ZSwgbjIgPSBEbChlLCBudWxsLCBuMiwgLTEsIG51bGwsIHQsIG51bGwsIG51bGwsIGUuYWJvcnRhYmxlVGFza3MsIG51bGwsIGwzLnJvb3RGb3JtYXRDb250ZXh0LCBudWxsLCBidCwgbnVsbCwgbnVsbCksIFluKG4yKSwgZS5waW5nZWRUYXNrcy5wdXNoKG4yKSwgZSkgOiAobjIgPSB6dChlLCBudWxsLCB7CiAgICAgIG5vZGVzOiBsMy5yZXBsYXlOb2RlcywKICAgICAgc2xvdHM6IGwzLnJlcGxheVNsb3RzLAogICAgICBwZW5kaW5nVGFza3M6IDAKICAgIH0sIG4yLCAtMSwgbnVsbCwgbnVsbCwgZS5hYm9ydGFibGVUYXNrcywgbnVsbCwgbDMucm9vdEZvcm1hdENvbnRleHQsIG51bGwsIGJ0LCBudWxsLCBudWxsKSwgWW4objIpLCBlLnBpbmdlZFRhc2tzLnB1c2gobjIpLCBlKTsKICB9CiAgZnVuY3Rpb24gV3UobjIsIGwzLCBlLCB0LCByLCBpLCBhLCB1MiwgYzIpIHsKICAgIHJldHVybiBuMiA9IFhpKG4yLCBsMywgZSwgdCwgciwgaSwgYSwgdTIsIGMyKSwgbjIudHJhY2tlZFBvc3Rwb25lcyA9IHsKICAgICAgd29ya2luZ01hcDogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwKICAgICAgcm9vdE5vZGVzOiBbXSwKICAgICAgcm9vdFNsb3RzOiBudWxsCiAgICB9LCBuMjsKICB9CiAgdmFyIEQzID0gbnVsbDsKICBmdW5jdGlvbiBaaShuMiwgbDMpIHsKICAgIG4yLnBpbmdlZFRhc2tzLnB1c2gobDMpLCBuMi5waW5nZWRUYXNrcy5sZW5ndGggPT09IDEgJiYgKG4yLmZsdXNoU2NoZWR1bGVkID0gbjIuZGVzdGluYXRpb24gIT09IG51bGwsIG4yLnRyYWNrZWRQb3N0cG9uZXMgIT09IG51bGwgfHwgbjIuc3RhdHVzID09PSAxMCA/IGJpKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gUnQobjIpOwogICAgfSkgOiBrdChmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIFJ0KG4yKTsKICAgIH0pKTsKICB9CiAgZnVuY3Rpb24gemwobjIsIGwzLCBlLCB0LCByKSB7CiAgICByZXR1cm4gZSA9IHsKICAgICAgc3RhdHVzOiAwLAogICAgICByb290U2VnbWVudElEOiAtMSwKICAgICAgcGFyZW50Rmx1c2hlZDogZmFsc2UsCiAgICAgIHBlbmRpbmdUYXNrczogMCwKICAgICAgcm93OiBsMywKICAgICAgY29tcGxldGVkU2VnbWVudHM6IFtdLAogICAgICBieXRlU2l6ZTogMCwKICAgICAgZmFsbGJhY2tBYm9ydGFibGVUYXNrczogZSwKICAgICAgZXJyb3JEaWdlc3Q6IG51bGwsCiAgICAgIGNvbnRlbnRTdGF0ZTogZ3QoKSwKICAgICAgZmFsbGJhY2tTdGF0ZTogZ3QoKSwKICAgICAgY29udGVudFByZWFtYmxlOiB0LAogICAgICBmYWxsYmFja1ByZWFtYmxlOiByLAogICAgICB0cmFja2VkQ29udGVudEtleVBhdGg6IG51bGwsCiAgICAgIHRyYWNrZWRGYWxsYmFja05vZGU6IG51bGwKICAgIH0sIGwzICE9PSBudWxsICYmIChsMy5wZW5kaW5nVGFza3MrKywgdCA9IGwzLmJvdW5kYXJpZXMsIHQgIT09IG51bGwgJiYgKG4yLmFsbFBlbmRpbmdUYXNrcysrLCBlLnBlbmRpbmdUYXNrcysrLCB0LnB1c2goZSkpLCBuMiA9IGwzLmluaGVyaXRlZEhvaXN0YWJsZXMsIG4yICE9PSBudWxsICYmIHRsKGUuY29udGVudFN0YXRlLCBuMikpLCBlOwogIH0KICBmdW5jdGlvbiBEbChuMiwgbDMsIGUsIHQsIHIsIGksIGEsIHUyLCBjMiwgZjIsIG8sIGgsIHYzLCBiNCwgQykgewogICAgbjIuYWxsUGVuZGluZ1Rhc2tzKyssIHIgPT09IG51bGwgPyBuMi5wZW5kaW5nUm9vdFRhc2tzKysgOiByLnBlbmRpbmdUYXNrcysrLCBiNCAhPT0gbnVsbCAmJiBiNC5wZW5kaW5nVGFza3MrKzsKICAgIHZhciB3MyA9IHsKICAgICAgcmVwbGF5OiBudWxsLAogICAgICBub2RlOiBlLAogICAgICBjaGlsZEluZGV4OiB0LAogICAgICBwaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gWmkobjIsIHczKTsKICAgICAgfSwKICAgICAgYmxvY2tlZEJvdW5kYXJ5OiByLAogICAgICBibG9ja2VkU2VnbWVudDogaSwKICAgICAgYmxvY2tlZFByZWFtYmxlOiBhLAogICAgICBob2lzdGFibGVTdGF0ZTogdTIsCiAgICAgIGFib3J0U2V0OiBjMiwKICAgICAga2V5UGF0aDogZjIsCiAgICAgIGZvcm1hdENvbnRleHQ6IG8sCiAgICAgIGNvbnRleHQ6IGgsCiAgICAgIHRyZWVDb250ZXh0OiB2MywKICAgICAgcm93OiBiNCwKICAgICAgY29tcG9uZW50U3RhY2s6IEMsCiAgICAgIHRoZW5hYmxlU3RhdGU6IGwzCiAgICB9OwogICAgcmV0dXJuIGMyLmFkZCh3MyksIHczOwogIH0KICBmdW5jdGlvbiB6dChuMiwgbDMsIGUsIHQsIHIsIGksIGEsIHUyLCBjMiwgZjIsIG8sIGgsIHYzLCBiNCkgewogICAgbjIuYWxsUGVuZGluZ1Rhc2tzKyssIGkgPT09IG51bGwgPyBuMi5wZW5kaW5nUm9vdFRhc2tzKysgOiBpLnBlbmRpbmdUYXNrcysrLCB2MyAhPT0gbnVsbCAmJiB2My5wZW5kaW5nVGFza3MrKywgZS5wZW5kaW5nVGFza3MrKzsKICAgIHZhciBDID0gewogICAgICByZXBsYXk6IGUsCiAgICAgIG5vZGU6IHQsCiAgICAgIGNoaWxkSW5kZXg6IHIsCiAgICAgIHBpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBaaShuMiwgQyk7CiAgICAgIH0sCiAgICAgIGJsb2NrZWRCb3VuZGFyeTogaSwKICAgICAgYmxvY2tlZFNlZ21lbnQ6IG51bGwsCiAgICAgIGJsb2NrZWRQcmVhbWJsZTogbnVsbCwKICAgICAgaG9pc3RhYmxlU3RhdGU6IGEsCiAgICAgIGFib3J0U2V0OiB1MiwKICAgICAga2V5UGF0aDogYzIsCiAgICAgIGZvcm1hdENvbnRleHQ6IGYyLAogICAgICBjb250ZXh0OiBvLAogICAgICB0cmVlQ29udGV4dDogaCwKICAgICAgcm93OiB2MywKICAgICAgY29tcG9uZW50U3RhY2s6IGI0LAogICAgICB0aGVuYWJsZVN0YXRlOiBsMwogICAgfTsKICAgIHJldHVybiB1Mi5hZGQoQyksIEM7CiAgfQogIGZ1bmN0aW9uIEFuKG4yLCBsMywgZSwgdCwgciwgaSkgewogICAgcmV0dXJuIHsKICAgICAgc3RhdHVzOiAwLAogICAgICBwYXJlbnRGbHVzaGVkOiBmYWxzZSwKICAgICAgaWQ6IC0xLAogICAgICBpbmRleDogbDMsCiAgICAgIGNodW5rczogW10sCiAgICAgIGNoaWxkcmVuOiBbXSwKICAgICAgcHJlYW1ibGVDaGlsZHJlbjogW10sCiAgICAgIHBhcmVudEZvcm1hdENvbnRleHQ6IHQsCiAgICAgIGJvdW5kYXJ5OiBlLAogICAgICBsYXN0UHVzaGVkVGV4dDogciwKICAgICAgdGV4dEVtYmVkZGVkOiBpCiAgICB9OwogIH0KICBmdW5jdGlvbiBZbihuMikgewogICAgdmFyIGwzID0gbjIubm9kZTsKICAgIHR5cGVvZiBsMyA9PSAib2JqZWN0IiAmJiBsMyAhPT0gbnVsbCAmJiBsMy4kJHR5cGVvZiA9PT0gYWkgJiYgKG4yLmNvbXBvbmVudFN0YWNrID0gewogICAgICBwYXJlbnQ6IG4yLmNvbXBvbmVudFN0YWNrLAogICAgICB0eXBlOiBsMy50eXBlCiAgICB9KTsKICB9CiAgZnVuY3Rpb24geXQobjIpIHsKICAgIHJldHVybiBuMiA9PT0gbnVsbCA/IG51bGwgOiB7CiAgICAgIHBhcmVudDogbjIucGFyZW50LAogICAgICB0eXBlOiAiU3VzcGVuc2UgRmFsbGJhY2siCiAgICB9OwogIH0KICBmdW5jdGlvbiBrbihuMikgewogICAgdmFyIGwzID0ge307CiAgICByZXR1cm4gbjIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KGwzLCAiY29tcG9uZW50U3RhY2siLCB7CiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIGUgPSAiIiwgdCA9IG4yOwogICAgICAgICAgZG8KICAgICAgICAgICAgZSArPSBVaSh0LnR5cGUpLCB0ID0gdC5wYXJlbnQ7CiAgICAgICAgICB3aGlsZSAodCk7CiAgICAgICAgICB2YXIgciA9IGU7CiAgICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgICAgciA9IGAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCArIGkubWVzc2FnZSArIGAKYCArIGkuc3RhY2s7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkobDMsICJjb21wb25lbnRTdGFjayIsIHsKICAgICAgICAgIHZhbHVlOiByCiAgICAgICAgfSksIHI7CiAgICAgIH0KICAgIH0pLCBsMzsKICB9CiAgZnVuY3Rpb24gRzMobjIsIGwzLCBlKSB7CiAgICBpZiAobjIgPSBuMi5vbkVycm9yLCBsMyA9IG4yKGwzLCBlKSwgbDMgPT0gbnVsbCB8fCB0eXBlb2YgbDMgPT0gInN0cmluZyIpIHJldHVybiBsMzsKICB9CiAgZnVuY3Rpb24gSGwobjIsIGwzKSB7CiAgICB2YXIgZSA9IG4yLm9uU2hlbGxFcnJvciwgdCA9IG4yLm9uRmF0YWxFcnJvcjsKICAgIGUobDMpLCB0KGwzKSwgbjIuZGVzdGluYXRpb24gIT09IG51bGwgPyAobjIuc3RhdHVzID0gMTQsIFRpKG4yLmRlc3RpbmF0aW9uLCBsMykpIDogKG4yLnN0YXR1cyA9IDEzLCBuMi5mYXRhbEVycm9yID0gbDMpOwogIH0KICBmdW5jdGlvbiBZMihuMiwgbDMpIHsKICAgIER0KG4yLCBsMy5uZXh0LCBsMy5ob2lzdGFibGVzKTsKICB9CiAgZnVuY3Rpb24gRHQobjIsIGwzLCBlKSB7CiAgICBmb3IgKDsgbDMgIT09IG51bGw7ICkgewogICAgICBlICE9PSBudWxsICYmICh0bChsMy5ob2lzdGFibGVzLCBlKSwgbDMuaW5oZXJpdGVkSG9pc3RhYmxlcyA9IGUpOwogICAgICB2YXIgdCA9IGwzLmJvdW5kYXJpZXM7CiAgICAgIGlmICh0ICE9PSBudWxsKSB7CiAgICAgICAgbDMuYm91bmRhcmllcyA9IG51bGw7CiAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7CiAgICAgICAgICB2YXIgaSA9IHRbcl07CiAgICAgICAgICBlICE9PSBudWxsICYmIHRsKGkuY29udGVudFN0YXRlLCBlKSwgTW4objIsIGksIG51bGwsIG51bGwpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobDMucGVuZGluZ1Rhc2tzLS0sIDAgPCBsMy5wZW5kaW5nVGFza3MpIGJyZWFrOwogICAgICBlID0gbDMuaG9pc3RhYmxlcywgbDMgPSBsMy5uZXh0OwogICAgfQogIH0KICBmdW5jdGlvbiBUdChuMiwgbDMpIHsKICAgIHZhciBlID0gbDMuYm91bmRhcmllczsKICAgIGlmIChlICE9PSBudWxsICYmIGwzLnBlbmRpbmdUYXNrcyA9PT0gZS5sZW5ndGgpIHsKICAgICAgZm9yICh2YXIgdCA9IHRydWUsIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykgewogICAgICAgIHZhciBpID0gZVtyXTsKICAgICAgICBpZiAoaS5wZW5kaW5nVGFza3MgIT09IDEgfHwgaS5wYXJlbnRGbHVzaGVkIHx8IHJsKG4yLCBpKSkgewogICAgICAgICAgdCA9IGZhbHNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHQgJiYgRHQobjIsIGwzLCBsMy5ob2lzdGFibGVzKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gUGwobjIpIHsKICAgIHZhciBsMyA9IHsKICAgICAgcGVuZGluZ1Rhc2tzOiAxLAogICAgICBib3VuZGFyaWVzOiBudWxsLAogICAgICBob2lzdGFibGVzOiBndCgpLAogICAgICBpbmhlcml0ZWRIb2lzdGFibGVzOiBudWxsLAogICAgICB0b2dldGhlcjogZmFsc2UsCiAgICAgIG5leHQ6IG51bGwKICAgIH07CiAgICByZXR1cm4gbjIgIT09IG51bGwgJiYgMCA8IG4yLnBlbmRpbmdUYXNrcyAmJiAobDMucGVuZGluZ1Rhc2tzKyssIGwzLmJvdW5kYXJpZXMgPSBbXSwgbjIubmV4dCA9IGwzKSwgbDM7CiAgfQogIGZ1bmN0aW9uIG5pKG4yLCBsMywgZSwgdCwgcikgewogICAgdmFyIGkgPSBsMy5rZXlQYXRoLCBhID0gbDMudHJlZUNvbnRleHQsIHUyID0gbDMucm93OwogICAgbDMua2V5UGF0aCA9IGUsIGUgPSB0Lmxlbmd0aDsKICAgIHZhciBjMiA9IG51bGw7CiAgICBpZiAobDMucmVwbGF5ICE9PSBudWxsKSB7CiAgICAgIHZhciBmMiA9IGwzLnJlcGxheS5zbG90czsKICAgICAgaWYgKGYyICE9PSBudWxsICYmIHR5cGVvZiBmMiA9PSAib2JqZWN0IikgZm9yICh2YXIgbyA9IDA7IG8gPCBlOyBvKyspIHsKICAgICAgICB2YXIgaCA9IHIgIT09ICJiYWNrd2FyZHMiICYmIHIgIT09ICJ1bnN0YWJsZV9sZWdhY3ktYmFja3dhcmRzIiA/IG8gOiBlIC0gMSAtIG8sIHYzID0gdFtoXTsKICAgICAgICBsMy5yb3cgPSBjMiA9IFBsKGMyKSwgbDMudHJlZUNvbnRleHQgPSBVbihhLCBlLCBoKTsKICAgICAgICB2YXIgYjQgPSBmMltoXTsKICAgICAgICB0eXBlb2YgYjQgPT0gIm51bWJlciIgPyAoTWUyKG4yLCBsMywgYjQsIHYzLCBoKSwgZGVsZXRlIGYyW2hdKSA6IEIyKG4yLCBsMywgdjMsIGgpLCAtLWMyLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBZMihuMiwgYzIpOwogICAgICB9CiAgICAgIGVsc2UgZm9yIChmMiA9IDA7IGYyIDwgZTsgZjIrKykgbyA9IHIgIT09ICJiYWNrd2FyZHMiICYmIHIgIT09ICJ1bnN0YWJsZV9sZWdhY3ktYmFja3dhcmRzIiA/IGYyIDogZSAtIDEgLSBmMiwgaCA9IHRbb10sIGwzLnJvdyA9IGMyID0gUGwoYzIpLCBsMy50cmVlQ29udGV4dCA9IFVuKGEsIGUsIG8pLCBCMihuMiwgbDMsIGgsIG8pLCAtLWMyLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBZMihuMiwgYzIpOwogICAgfSBlbHNlIGlmIChyICE9PSAiYmFja3dhcmRzIiAmJiByICE9PSAidW5zdGFibGVfbGVnYWN5LWJhY2t3YXJkcyIpIGZvciAociA9IDA7IHIgPCBlOyByKyspIGYyID0gdFtyXSwgbDMucm93ID0gYzIgPSBQbChjMiksIGwzLnRyZWVDb250ZXh0ID0gVW4oYSwgZSwgciksIEIyKG4yLCBsMywgZjIsIHIpLCAtLWMyLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBZMihuMiwgYzIpOwogICAgZWxzZSB7CiAgICAgIGZvciAociA9IGwzLmJsb2NrZWRTZWdtZW50LCBmMiA9IHIuY2hpbGRyZW4ubGVuZ3RoLCBvID0gci5jaHVua3MubGVuZ3RoLCBoID0gZSAtIDE7IDAgPD0gaDsgaC0tKSB7CiAgICAgICAgdjMgPSB0W2hdLCBsMy5yb3cgPSBjMiA9IFBsKGMyKSwgbDMudHJlZUNvbnRleHQgPSBVbihhLCBlLCBoKSwgYjQgPSBBbihuMiwgbywgbnVsbCwgbDMuZm9ybWF0Q29udGV4dCwgaCA9PT0gMCA/IHIubGFzdFB1c2hlZFRleHQgOiB0cnVlLCB0cnVlKSwgci5jaGlsZHJlbi5zcGxpY2UoZjIsIDAsIGI0KSwgbDMuYmxvY2tlZFNlZ21lbnQgPSBiNDsKICAgICAgICB0cnkgewogICAgICAgICAgQjIobjIsIGwzLCB2MywgaCksIGI0Lmxhc3RQdXNoZWRUZXh0ICYmIGI0LnRleHRFbWJlZGRlZCAmJiBiNC5jaHVua3MucHVzaChkbiksIGI0LnN0YXR1cyA9IDEsIGxsKG4yLCBsMy5ibG9ja2VkQm91bmRhcnksIGI0KSwgLS1jMi5wZW5kaW5nVGFza3MgPT09IDAgJiYgWTIobjIsIGMyKTsKICAgICAgICB9IGNhdGNoIChDKSB7CiAgICAgICAgICB0aHJvdyBiNC5zdGF0dXMgPSBuMi5zdGF0dXMgPT09IDEyID8gMyA6IDQsIEM7CiAgICAgICAgfQogICAgICB9CiAgICAgIGwzLmJsb2NrZWRTZWdtZW50ID0gciwgci5sYXN0UHVzaGVkVGV4dCA9IGZhbHNlOwogICAgfQogICAgdTIgIT09IG51bGwgJiYgYzIgIT09IG51bGwgJiYgMCA8IGMyLnBlbmRpbmdUYXNrcyAmJiAodTIucGVuZGluZ1Rhc2tzKyssIGMyLm5leHQgPSB1MiksIGwzLnRyZWVDb250ZXh0ID0gYSwgbDMucm93ID0gdTIsIGwzLmtleVBhdGggPSBpOwogIH0KICBmdW5jdGlvbiBsaShuMiwgbDMsIGUsIHQsIHIsIGkpIHsKICAgIHZhciBhID0gbDMudGhlbmFibGVTdGF0ZTsKICAgIGZvciAobDMudGhlbmFibGVTdGF0ZSA9IG51bGwsIHduID0ge30sIF90ID0gbDMsIEx0ID0gbjIsIEJ0ID0gZSwgTGwgPSBfbCA9IDAsIEJsID0gLTEsIEVlMiA9IDAsIG5sID0gYSwgbjIgPSB0KHIsIGkpOyBUZTI7ICkgVGUyID0gZmFsc2UsIExsID0gX2wgPSAwLCBCbCA9IC0xLCBFZTIgPSAwLCBrZTIgKz0gMSwgUCA9IG51bGwsIG4yID0gdChyLCBpKTsKICAgIHJldHVybiBObCgpLCBuMjsKICB9CiAgZnVuY3Rpb24gZWkobjIsIGwzLCBlLCB0LCByLCBpLCBhKSB7CiAgICB2YXIgdTIgPSBmYWxzZTsKICAgIGlmIChpICE9PSAwICYmIG4yLmZvcm1TdGF0ZSAhPT0gbnVsbCkgewogICAgICB2YXIgYzIgPSBsMy5ibG9ja2VkU2VnbWVudDsKICAgICAgaWYgKGMyICE9PSBudWxsKSB7CiAgICAgICAgdTIgPSB0cnVlLCBjMiA9IGMyLmNodW5rczsKICAgICAgICBmb3IgKHZhciBmMiA9IDA7IGYyIDwgaTsgZjIrKykgZjIgPT09IGEgPyBjMi5wdXNoKEdhKSA6IGMyLnB1c2goWWEpOwogICAgICB9CiAgICB9CiAgICBpID0gbDMua2V5UGF0aCwgbDMua2V5UGF0aCA9IGUsIHIgPyAoZSA9IGwzLnRyZWVDb250ZXh0LCBsMy50cmVlQ29udGV4dCA9IFVuKGUsIDEsIDApLCBCMihuMiwgbDMsIHQsIC0xKSwgbDMudHJlZUNvbnRleHQgPSBlKSA6IHUyID8gQjIobjIsIGwzLCB0LCAtMSkgOiBybihuMiwgbDMsIHQsIC0xKSwgbDMua2V5UGF0aCA9IGk7CiAgfQogIGZ1bmN0aW9uIHdlMihuMiwgbDMsIGUsIHQsIHIsIGkpIHsKICAgIGlmICh0eXBlb2YgdCA9PSAiZnVuY3Rpb24iKSBpZiAodC5wcm90b3R5cGUgJiYgdC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCkgewogICAgICB2YXIgYSA9IHI7CiAgICAgIGlmICgicmVmIiBpbiByKSB7CiAgICAgICAgYSA9IHt9OwogICAgICAgIGZvciAodmFyIHUyIGluIHIpIHUyICE9PSAicmVmIiAmJiAoYVt1Ml0gPSByW3UyXSk7CiAgICAgIH0KICAgICAgdmFyIGMyID0gdC5kZWZhdWx0UHJvcHM7CiAgICAgIGlmIChjMikgewogICAgICAgIGEgPT09IHIgJiYgKGEgPSBLMih7fSwgYSwgcikpOwogICAgICAgIGZvciAodmFyIGYyIGluIGMyKSBhW2YyXSA9PT0gdm9pZCAwICYmIChhW2YyXSA9IGMyW2YyXSk7CiAgICAgIH0KICAgICAgciA9IGEsIGEgPSBRciwgYzIgPSB0LmNvbnRleHRUeXBlLCB0eXBlb2YgYzIgPT0gIm9iamVjdCIgJiYgYzIgIT09IG51bGwgJiYgKGEgPSBjMi5fY3VycmVudFZhbHVlKSwgYSA9IG5ldyB0KHIsIGEpOwogICAgICB2YXIgbyA9IGEuc3RhdGUgIT09IHZvaWQgMCA/IGEuc3RhdGUgOiBudWxsOwogICAgICBpZiAoYS51cGRhdGVyID0gVnIsIGEucHJvcHMgPSByLCBhLnN0YXRlID0gbywgYzIgPSB7CiAgICAgICAgcXVldWU6IFtdLAogICAgICAgIHJlcGxhY2U6IGZhbHNlCiAgICAgIH0sIGEuX3JlYWN0SW50ZXJuYWxzID0gYzIsIGkgPSB0LmNvbnRleHRUeXBlLCBhLmNvbnRleHQgPSB0eXBlb2YgaSA9PSAib2JqZWN0IiAmJiBpICE9PSBudWxsID8gaS5fY3VycmVudFZhbHVlIDogUXIsIGkgPSB0LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgdHlwZW9mIGkgPT0gImZ1bmN0aW9uIiAmJiAoaSA9IGkociwgbyksIG8gPSBpID09IG51bGwgPyBvIDogSzIoe30sIG8sIGkpLCBhLnN0YXRlID0gbyksIHR5cGVvZiB0LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAhPSAiZnVuY3Rpb24iICYmIHR5cGVvZiBhLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9ICJmdW5jdGlvbiIgJiYgKHR5cGVvZiBhLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT0gImZ1bmN0aW9uIiB8fCB0eXBlb2YgYS5jb21wb25lbnRXaWxsTW91bnQgPT0gImZ1bmN0aW9uIikpIGlmICh0ID0gYS5zdGF0ZSwgdHlwZW9mIGEuY29tcG9uZW50V2lsbE1vdW50ID09ICJmdW5jdGlvbiIgJiYgYS5jb21wb25lbnRXaWxsTW91bnQoKSwgdHlwZW9mIGEuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PSAiZnVuY3Rpb24iICYmIGEuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpLCB0ICE9PSBhLnN0YXRlICYmIFZyLmVucXVldWVSZXBsYWNlU3RhdGUoYSwgYS5zdGF0ZSwgbnVsbCksIGMyLnF1ZXVlICE9PSBudWxsICYmIDAgPCBjMi5xdWV1ZS5sZW5ndGgpIGlmICh0ID0gYzIucXVldWUsIGkgPSBjMi5yZXBsYWNlLCBjMi5xdWV1ZSA9IG51bGwsIGMyLnJlcGxhY2UgPSBmYWxzZSwgaSAmJiB0Lmxlbmd0aCA9PT0gMSkgYS5zdGF0ZSA9IHRbMF07CiAgICAgIGVsc2UgewogICAgICAgIGZvciAoYzIgPSBpID8gdFswXSA6IGEuc3RhdGUsIG8gPSB0cnVlLCBpID0gaSA/IDEgOiAwOyBpIDwgdC5sZW5ndGg7IGkrKykgZjIgPSB0W2ldLCBmMiA9IHR5cGVvZiBmMiA9PSAiZnVuY3Rpb24iID8gZjIuY2FsbChhLCBjMiwgciwgdm9pZCAwKSA6IGYyLCBmMiAhPSBudWxsICYmIChvID8gKG8gPSBmYWxzZSwgYzIgPSBLMih7fSwgYzIsIGYyKSkgOiBLMihjMiwgZjIpKTsKICAgICAgICBhLnN0YXRlID0gYzI7CiAgICAgIH0KICAgICAgZWxzZSBjMi5xdWV1ZSA9IG51bGw7CiAgICAgIGlmICh0ID0gYS5yZW5kZXIoKSwgbjIuc3RhdHVzID09PSAxMikgdGhyb3cgbnVsbDsKICAgICAgciA9IGwzLmtleVBhdGgsIGwzLmtleVBhdGggPSBlLCBybihuMiwgbDMsIHQsIC0xKSwgbDMua2V5UGF0aCA9IHI7CiAgICB9IGVsc2UgewogICAgICBpZiAodCA9IGxpKG4yLCBsMywgZSwgdCwgciwgdm9pZCAwKSwgbjIuc3RhdHVzID09PSAxMikgdGhyb3cgbnVsbDsKICAgICAgZWkobjIsIGwzLCBlLCB0LCBfbCAhPT0gMCwgTGwsIEJsKTsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiB0ID09ICJzdHJpbmciKSBpZiAoYSA9IGwzLmJsb2NrZWRTZWdtZW50LCBhID09PSBudWxsKSBhID0gci5jaGlsZHJlbiwgYzIgPSBsMy5mb3JtYXRDb250ZXh0LCBvID0gbDMua2V5UGF0aCwgbDMuZm9ybWF0Q29udGV4dCA9IElyKGMyLCB0LCByKSwgbDMua2V5UGF0aCA9IGUsIEIyKG4yLCBsMywgYSwgLTEpLCBsMy5mb3JtYXRDb250ZXh0ID0gYzIsIGwzLmtleVBhdGggPSBvOwogICAgZWxzZSB7CiAgICAgIGlmIChvID0gS2EoYS5jaHVua3MsIHQsIHIsIG4yLnJlc3VtYWJsZVN0YXRlLCBuMi5yZW5kZXJTdGF0ZSwgbDMuYmxvY2tlZFByZWFtYmxlLCBsMy5ob2lzdGFibGVTdGF0ZSwgbDMuZm9ybWF0Q29udGV4dCwgYS5sYXN0UHVzaGVkVGV4dCksIGEubGFzdFB1c2hlZFRleHQgPSBmYWxzZSwgYzIgPSBsMy5mb3JtYXRDb250ZXh0LCBpID0gbDMua2V5UGF0aCwgbDMua2V5UGF0aCA9IGUsIChsMy5mb3JtYXRDb250ZXh0ID0gSXIoYzIsIHQsIHIpKS5pbnNlcnRpb25Nb2RlID09PSAzKSB7CiAgICAgICAgZSA9IEFuKG4yLCAwLCBudWxsLCBsMy5mb3JtYXRDb250ZXh0LCBmYWxzZSwgZmFsc2UpLCBhLnByZWFtYmxlQ2hpbGRyZW4ucHVzaChlKSwgbDMuYmxvY2tlZFNlZ21lbnQgPSBlOwogICAgICAgIHRyeSB7CiAgICAgICAgICBlLnN0YXR1cyA9IDYsIEIyKG4yLCBsMywgbywgLTEpLCBlLmxhc3RQdXNoZWRUZXh0ICYmIGUudGV4dEVtYmVkZGVkICYmIGUuY2h1bmtzLnB1c2goZG4pLCBlLnN0YXR1cyA9IDEsIGxsKG4yLCBsMy5ibG9ja2VkQm91bmRhcnksIGUpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBsMy5ibG9ja2VkU2VnbWVudCA9IGE7CiAgICAgICAgfQogICAgICB9IGVsc2UgQjIobjIsIGwzLCBvLCAtMSk7CiAgICAgIGwzLmZvcm1hdENvbnRleHQgPSBjMiwgbDMua2V5UGF0aCA9IGk7CiAgICAgIG46IHsKICAgICAgICBzd2l0Y2ggKGwzID0gYS5jaHVua3MsIG4yID0gbjIucmVzdW1hYmxlU3RhdGUsIHQpIHsKICAgICAgICAgIGNhc2UgInRpdGxlIjoKICAgICAgICAgIGNhc2UgInN0eWxlIjoKICAgICAgICAgIGNhc2UgInNjcmlwdCI6CiAgICAgICAgICBjYXNlICJhcmVhIjoKICAgICAgICAgIGNhc2UgImJhc2UiOgogICAgICAgICAgY2FzZSAiYnIiOgogICAgICAgICAgY2FzZSAiY29sIjoKICAgICAgICAgIGNhc2UgImVtYmVkIjoKICAgICAgICAgIGNhc2UgImhyIjoKICAgICAgICAgIGNhc2UgImltZyI6CiAgICAgICAgICBjYXNlICJpbnB1dCI6CiAgICAgICAgICBjYXNlICJrZXlnZW4iOgogICAgICAgICAgY2FzZSAibGluayI6CiAgICAgICAgICBjYXNlICJtZXRhIjoKICAgICAgICAgIGNhc2UgInBhcmFtIjoKICAgICAgICAgIGNhc2UgInNvdXJjZSI6CiAgICAgICAgICBjYXNlICJ0cmFjayI6CiAgICAgICAgICBjYXNlICJ3YnIiOgogICAgICAgICAgICBicmVhayBuOwogICAgICAgICAgY2FzZSAiYm9keSI6CiAgICAgICAgICAgIGlmICgxID49IGMyLmluc2VydGlvbk1vZGUpIHsKICAgICAgICAgICAgICBuMi5oYXNCb2R5ID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhayBuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiaHRtbCI6CiAgICAgICAgICAgIGlmIChjMi5pbnNlcnRpb25Nb2RlID09PSAwKSB7CiAgICAgICAgICAgICAgbjIuaGFzSHRtbCA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWsgbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImhlYWQiOgogICAgICAgICAgICBpZiAoMSA+PSBjMi5pbnNlcnRpb25Nb2RlKSBicmVhayBuOwogICAgICAgIH0KICAgICAgICBsMy5wdXNoKEduKHQpKTsKICAgICAgfQogICAgICBhLmxhc3RQdXNoZWRUZXh0ID0gZmFsc2U7CiAgICB9CiAgICBlbHNlIHsKICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgY2FzZSBUYToKICAgICAgICBjYXNlIGZpOgogICAgICAgIGNhc2Ugb2k6CiAgICAgICAgY2FzZSB1aToKICAgICAgICAgIHQgPSBsMy5rZXlQYXRoLCBsMy5rZXlQYXRoID0gZSwgcm4objIsIGwzLCByLmNoaWxkcmVuLCAtMSksIGwzLmtleVBhdGggPSB0OwogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2UgZGk6CiAgICAgICAgICB0ID0gbDMuYmxvY2tlZFNlZ21lbnQsIHQgPT09IG51bGwgPyByLm1vZGUgIT09ICJoaWRkZW4iICYmICh0ID0gbDMua2V5UGF0aCwgbDMua2V5UGF0aCA9IGUsIEIyKG4yLCBsMywgci5jaGlsZHJlbiwgLTEpLCBsMy5rZXlQYXRoID0gdCkgOiByLm1vZGUgIT09ICJoaWRkZW4iICYmICh0LmNodW5rcy5wdXNoKHBhKSwgdC5sYXN0UHVzaGVkVGV4dCA9IGZhbHNlLCBhID0gbDMua2V5UGF0aCwgbDMua2V5UGF0aCA9IGUsIEIyKG4yLCBsMywgci5jaGlsZHJlbiwgLTEpLCBsMy5rZXlQYXRoID0gYSwgdC5jaHVua3MucHVzaCgkYSksIHQubGFzdFB1c2hlZFRleHQgPSBmYWxzZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FzZSBQdDoKICAgICAgICAgIG46IHsKICAgICAgICAgICAgaWYgKHQgPSByLmNoaWxkcmVuLCByID0gci5yZXZlYWxPcmRlciwgciA9PT0gImZvcndhcmRzIiB8fCByID09PSAiYmFja3dhcmRzIiB8fCByID09PSAidW5zdGFibGVfbGVnYWN5LWJhY2t3YXJkcyIpIHsKICAgICAgICAgICAgICBpZiAoaGUyKHQpKSB7CiAgICAgICAgICAgICAgICBuaShuMiwgbDMsIGUsIHQsIHIpOwogICAgICAgICAgICAgICAgYnJlYWsgbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKChhID0gZ2kodCkpICYmIChhID0gYS5jYWxsKHQpKSkgewogICAgICAgICAgICAgICAgaWYgKGMyID0gYS5uZXh0KCksICFjMi5kb25lKSB7CiAgICAgICAgICAgICAgICAgIGRvCiAgICAgICAgICAgICAgICAgICAgYzIgPSBhLm5leHQoKTsKICAgICAgICAgICAgICAgICAgd2hpbGUgKCFjMi5kb25lKTsKICAgICAgICAgICAgICAgICAgbmkobjIsIGwzLCBlLCB0LCByKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrIG47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHIgPT09ICJ0b2dldGhlciIgPyAociA9IGwzLmtleVBhdGgsIGEgPSBsMy5yb3csIGMyID0gbDMucm93ID0gUGwobnVsbCksIGMyLmJvdW5kYXJpZXMgPSBbXSwgYzIudG9nZXRoZXIgPSB0cnVlLCBsMy5rZXlQYXRoID0gZSwgcm4objIsIGwzLCB0LCAtMSksIC0tYzIucGVuZGluZ1Rhc2tzID09PSAwICYmIFkyKG4yLCBjMiksIGwzLmtleVBhdGggPSByLCBsMy5yb3cgPSBhLCBhICE9PSBudWxsICYmIDAgPCBjMi5wZW5kaW5nVGFza3MgJiYgKGEucGVuZGluZ1Rhc2tzKyssIGMyLm5leHQgPSBhKSkgOiAociA9IGwzLmtleVBhdGgsIGwzLmtleVBhdGggPSBlLCBybihuMiwgbDMsIHQsIC0xKSwgbDMua2V5UGF0aCA9IHIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2Ugd2E6CiAgICAgICAgY2FzZSB5YToKICAgICAgICAgIHRocm93IEVycm9yKHkyKDM0MykpOwogICAgICAgIGNhc2UgU2UyOgogICAgICAgICAgbjogaWYgKGwzLnJlcGxheSAhPT0gbnVsbCkgewogICAgICAgICAgICB0ID0gbDMua2V5UGF0aCwgYSA9IGwzLmZvcm1hdENvbnRleHQsIGMyID0gbDMucm93LCBsMy5rZXlQYXRoID0gZSwgbDMuZm9ybWF0Q29udGV4dCA9IHJlKG4yLnJlc3VtYWJsZVN0YXRlLCBhKSwgbDMucm93ID0gbnVsbCwgZSA9IHIuY2hpbGRyZW47CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgQjIobjIsIGwzLCBlLCAtMSk7CiAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgbDMua2V5UGF0aCA9IHQsIGwzLmZvcm1hdENvbnRleHQgPSBhLCBsMy5yb3cgPSBjMjsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdCA9IGwzLmtleVBhdGgsIGkgPSBsMy5mb3JtYXRDb250ZXh0OwogICAgICAgICAgICB2YXIgaCA9IGwzLnJvdzsKICAgICAgICAgICAgZjIgPSBsMy5ibG9ja2VkQm91bmRhcnksIHUyID0gbDMuYmxvY2tlZFByZWFtYmxlOwogICAgICAgICAgICB2YXIgdjMgPSBsMy5ob2lzdGFibGVTdGF0ZSwgYjQgPSBsMy5ibG9ja2VkU2VnbWVudCwgQyA9IHIuZmFsbGJhY2s7CiAgICAgICAgICAgIHIgPSByLmNoaWxkcmVuOwogICAgICAgICAgICB2YXIgdzMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCB4MyA9IDIgPiBsMy5mb3JtYXRDb250ZXh0Lmluc2VydGlvbk1vZGUgPyB6bChuMiwgbDMucm93LCB3MywgTWwoKSwgTWwoKSkgOiB6bChuMiwgbDMucm93LCB3MywgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgIG4yLnRyYWNrZWRQb3N0cG9uZXMgIT09IG51bGwgJiYgKHgzLnRyYWNrZWRDb250ZW50S2V5UGF0aCA9IGUpOwogICAgICAgICAgICB2YXIgTTIgPSBBbihuMiwgYjQuY2h1bmtzLmxlbmd0aCwgeDMsIGwzLmZvcm1hdENvbnRleHQsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgIGI0LmNoaWxkcmVuLnB1c2goTTIpLCBiNC5sYXN0UHVzaGVkVGV4dCA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRjIgPSBBbihuMiwgMCwgbnVsbCwgbDMuZm9ybWF0Q29udGV4dCwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgaWYgKEYyLnBhcmVudEZsdXNoZWQgPSB0cnVlLCBuMi50cmFja2VkUG9zdHBvbmVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgYSA9IGwzLmNvbXBvbmVudFN0YWNrLCBjMiA9IFsKICAgICAgICAgICAgICAgIGVbMF0sCiAgICAgICAgICAgICAgICAiU3VzcGVuc2UgRmFsbGJhY2siLAogICAgICAgICAgICAgICAgZVsyXQogICAgICAgICAgICAgIF0sIG8gPSBbCiAgICAgICAgICAgICAgICBjMlsxXSwKICAgICAgICAgICAgICAgIGMyWzJdLAogICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICBudWxsCiAgICAgICAgICAgICAgXSwgbjIudHJhY2tlZFBvc3Rwb25lcy53b3JraW5nTWFwLnNldChjMiwgbyksIHgzLnRyYWNrZWRGYWxsYmFja05vZGUgPSBvLCBsMy5ibG9ja2VkU2VnbWVudCA9IE0yLCBsMy5ibG9ja2VkUHJlYW1ibGUgPSB4My5mYWxsYmFja1ByZWFtYmxlLCBsMy5rZXlQYXRoID0gYzIsIGwzLmZvcm1hdENvbnRleHQgPSB1dChuMi5yZXN1bWFibGVTdGF0ZSwgaSksIGwzLmNvbXBvbmVudFN0YWNrID0geXQoYSksIE0yLnN0YXR1cyA9IDY7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIEIyKG4yLCBsMywgQywgLTEpLCBNMi5sYXN0UHVzaGVkVGV4dCAmJiBNMi50ZXh0RW1iZWRkZWQgJiYgTTIuY2h1bmtzLnB1c2goZG4pLCBNMi5zdGF0dXMgPSAxLCBsbChuMiwgZjIsIE0yKTsKICAgICAgICAgICAgICB9IGNhdGNoIChYKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBNMi5zdGF0dXMgPSBuMi5zdGF0dXMgPT09IDEyID8gMyA6IDQsIFg7CiAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIGwzLmJsb2NrZWRTZWdtZW50ID0gYjQsIGwzLmJsb2NrZWRQcmVhbWJsZSA9IHUyLCBsMy5rZXlQYXRoID0gdCwgbDMuZm9ybWF0Q29udGV4dCA9IGk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGwzID0gRGwobjIsIG51bGwsIHIsIC0xLCB4MywgRjIsIHgzLmNvbnRlbnRQcmVhbWJsZSwgeDMuY29udGVudFN0YXRlLCBsMy5hYm9ydFNldCwgZSwgcmUobjIucmVzdW1hYmxlU3RhdGUsIGwzLmZvcm1hdENvbnRleHQpLCBsMy5jb250ZXh0LCBsMy50cmVlQ29udGV4dCwgbnVsbCwgYSksIFluKGwzKSwgbjIucGluZ2VkVGFza3MucHVzaChsMyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbDMuYmxvY2tlZEJvdW5kYXJ5ID0geDMsIGwzLmJsb2NrZWRQcmVhbWJsZSA9IHgzLmNvbnRlbnRQcmVhbWJsZSwgbDMuaG9pc3RhYmxlU3RhdGUgPSB4My5jb250ZW50U3RhdGUsIGwzLmJsb2NrZWRTZWdtZW50ID0gRjIsIGwzLmtleVBhdGggPSBlLCBsMy5mb3JtYXRDb250ZXh0ID0gcmUobjIucmVzdW1hYmxlU3RhdGUsIGkpLCBsMy5yb3cgPSBudWxsLCBGMi5zdGF0dXMgPSA2OwogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoQjIobjIsIGwzLCByLCAtMSksIEYyLmxhc3RQdXNoZWRUZXh0ICYmIEYyLnRleHRFbWJlZGRlZCAmJiBGMi5jaHVua3MucHVzaChkbiksIEYyLnN0YXR1cyA9IDEsIGxsKG4yLCB4MywgRjIpLCBXbCh4MywgRjIpLCB4My5wZW5kaW5nVGFza3MgPT09IDAgJiYgeDMuc3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIGlmICh4My5zdGF0dXMgPSAxLCAhcmwobjIsIHgzKSkgewogICAgICAgICAgICAgICAgICAgIGggIT09IG51bGwgJiYgLS1oLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBZMihuMiwgaCksIG4yLnBlbmRpbmdSb290VGFza3MgPT09IDAgJiYgbDMuYmxvY2tlZFByZWFtYmxlICYmIFhsKG4yKTsKICAgICAgICAgICAgICAgICAgICBicmVhayBuOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaCAhPT0gbnVsbCAmJiBoLnRvZ2V0aGVyICYmIFR0KG4yLCBoKTsKICAgICAgICAgICAgICB9IGNhdGNoIChYKSB7CiAgICAgICAgICAgICAgICB4My5zdGF0dXMgPSA0LCBuMi5zdGF0dXMgPT09IDEyID8gKEYyLnN0YXR1cyA9IDMsIGEgPSBuMi5mYXRhbEVycm9yKSA6IChGMi5zdGF0dXMgPSA0LCBhID0gWCksIGMyID0ga24obDMuY29tcG9uZW50U3RhY2spLCBvID0gRzMobjIsIGEsIGMyKSwgeDMuZXJyb3JEaWdlc3QgPSBvLCBIdChuMiwgeDMpOwogICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICBsMy5ibG9ja2VkQm91bmRhcnkgPSBmMiwgbDMuYmxvY2tlZFByZWFtYmxlID0gdTIsIGwzLmhvaXN0YWJsZVN0YXRlID0gdjMsIGwzLmJsb2NrZWRTZWdtZW50ID0gYjQsIGwzLmtleVBhdGggPSB0LCBsMy5mb3JtYXRDb250ZXh0ID0gaSwgbDMucm93ID0gaDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbDMgPSBEbChuMiwgbnVsbCwgQywgLTEsIGYyLCBNMiwgeDMuZmFsbGJhY2tQcmVhbWJsZSwgeDMuZmFsbGJhY2tTdGF0ZSwgdzMsIFsKICAgICAgICAgICAgICAgIGVbMF0sCiAgICAgICAgICAgICAgICAiU3VzcGVuc2UgRmFsbGJhY2siLAogICAgICAgICAgICAgICAgZVsyXQogICAgICAgICAgICAgIF0sIHV0KG4yLnJlc3VtYWJsZVN0YXRlLCBsMy5mb3JtYXRDb250ZXh0KSwgbDMuY29udGV4dCwgbDMudHJlZUNvbnRleHQsIGwzLnJvdywgeXQobDMuY29tcG9uZW50U3RhY2spKSwgWW4obDMpLCBuMi5waW5nZWRUYXNrcy5wdXNoKGwzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgdCA9PSAib2JqZWN0IiAmJiB0ICE9PSBudWxsKSBzd2l0Y2ggKHQuJCR0eXBlb2YpIHsKICAgICAgICBjYXNlIEZ0OgogICAgICAgICAgaWYgKCJyZWYiIGluIHIpIGZvciAoYjQgaW4gYSA9IHt9LCByKSBiNCAhPT0gInJlZiIgJiYgKGFbYjRdID0gcltiNF0pOwogICAgICAgICAgZWxzZSBhID0gcjsKICAgICAgICAgIHQgPSBsaShuMiwgbDMsIGUsIHQucmVuZGVyLCBhLCBpKSwgZWkobjIsIGwzLCBlLCB0LCBfbCAhPT0gMCwgTGwsIEJsKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICBjYXNlIEF0OgogICAgICAgICAgd2UyKG4yLCBsMywgZSwgdC50eXBlLCByLCBpKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICBjYXNlIFJlMjoKICAgICAgICAgIGlmIChjMiA9IHIuY2hpbGRyZW4sIGEgPSBsMy5rZXlQYXRoLCByID0gci52YWx1ZSwgbyA9IHQuX2N1cnJlbnRWYWx1ZSwgdC5fY3VycmVudFZhbHVlID0gciwgaSA9IFduLCBXbiA9IHQgPSB7CiAgICAgICAgICAgIHBhcmVudDogaSwKICAgICAgICAgICAgZGVwdGg6IGkgPT09IG51bGwgPyAwIDogaS5kZXB0aCArIDEsCiAgICAgICAgICAgIGNvbnRleHQ6IHQsCiAgICAgICAgICAgIHBhcmVudFZhbHVlOiBvLAogICAgICAgICAgICB2YWx1ZTogcgogICAgICAgICAgfSwgbDMuY29udGV4dCA9IHQsIGwzLmtleVBhdGggPSBlLCBybihuMiwgbDMsIGMyLCAtMSksIG4yID0gV24sIG4yID09PSBudWxsKSB0aHJvdyBFcnJvcih5Mig0MDMpKTsKICAgICAgICAgIG4yLmNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IG4yLnBhcmVudFZhbHVlLCBuMiA9IFduID0gbjIucGFyZW50LCBsMy5jb250ZXh0ID0gbjIsIGwzLmtleVBhdGggPSBhOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2UgaGk6CiAgICAgICAgICByID0gci5jaGlsZHJlbiwgdCA9IHIodC5fY29udGV4dC5fY3VycmVudFZhbHVlKSwgciA9IGwzLmtleVBhdGgsIGwzLmtleVBhdGggPSBlLCBybihuMiwgbDMsIHQsIC0xKSwgbDMua2V5UGF0aCA9IHI7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FzZSBGZToKICAgICAgICAgIGlmIChhID0gdC5faW5pdCwgdCA9IGEodC5fcGF5bG9hZCksIG4yLnN0YXR1cyA9PT0gMTIpIHRocm93IG51bGw7CiAgICAgICAgICB3ZTIobjIsIGwzLCBlLCB0LCByLCBpKTsKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyBFcnJvcih5MigxMzAsIHQgPT0gbnVsbCA/IHQgOiB0eXBlb2YgdCwgIiIpKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gTWUyKG4yLCBsMywgZSwgdCwgcikgewogICAgdmFyIGkgPSBsMy5yZXBsYXksIGEgPSBsMy5ibG9ja2VkQm91bmRhcnksIHUyID0gQW4objIsIDAsIG51bGwsIGwzLmZvcm1hdENvbnRleHQsIGZhbHNlLCBmYWxzZSk7CiAgICB1Mi5pZCA9IGUsIHUyLnBhcmVudEZsdXNoZWQgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgbDMucmVwbGF5ID0gbnVsbCwgbDMuYmxvY2tlZFNlZ21lbnQgPSB1MiwgQjIobjIsIGwzLCB0LCByKSwgdTIuc3RhdHVzID0gMSwgbGwobjIsIGEsIHUyKSwgYSA9PT0gbnVsbCA/IG4yLmNvbXBsZXRlZFJvb3RTZWdtZW50ID0gdTIgOiAoV2woYSwgdTIpLCBhLnBhcmVudEZsdXNoZWQgJiYgbjIucGFydGlhbEJvdW5kYXJpZXMucHVzaChhKSk7CiAgICB9IGZpbmFsbHkgewogICAgICBsMy5yZXBsYXkgPSBpLCBsMy5ibG9ja2VkU2VnbWVudCA9IG51bGw7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJuKG4yLCBsMywgZSwgdCkgewogICAgbDMucmVwbGF5ICE9PSBudWxsICYmIHR5cGVvZiBsMy5yZXBsYXkuc2xvdHMgPT0gIm51bWJlciIgPyBNZTIobjIsIGwzLCBsMy5yZXBsYXkuc2xvdHMsIGUsIHQpIDogKGwzLm5vZGUgPSBlLCBsMy5jaGlsZEluZGV4ID0gdCwgZSA9IGwzLmNvbXBvbmVudFN0YWNrLCBZbihsMyksIEV0KG4yLCBsMyksIGwzLmNvbXBvbmVudFN0YWNrID0gZSk7CiAgfQogIGZ1bmN0aW9uIEV0KG4yLCBsMykgewogICAgdmFyIGUgPSBsMy5ub2RlLCB0ID0gbDMuY2hpbGRJbmRleDsKICAgIGlmIChlICE9PSBudWxsKSB7CiAgICAgIGlmICh0eXBlb2YgZSA9PSAib2JqZWN0IikgewogICAgICAgIHN3aXRjaCAoZS4kJHR5cGVvZikgewogICAgICAgICAgY2FzZSBhaToKICAgICAgICAgICAgdmFyIHIgPSBlLnR5cGUsIGkgPSBlLmtleSwgYSA9IGUucHJvcHM7CiAgICAgICAgICAgIGUgPSBhLnJlZjsKICAgICAgICAgICAgdmFyIHUyID0gZSAhPT0gdm9pZCAwID8gZSA6IG51bGwsIGMyID0gYmUyKHIpLCBmMiA9IGkgPz8gKHQgPT09IC0xID8gMCA6IHQpOwogICAgICAgICAgICBpZiAoaSA9IFsKICAgICAgICAgICAgICBsMy5rZXlQYXRoLAogICAgICAgICAgICAgIGMyLAogICAgICAgICAgICAgIGYyCiAgICAgICAgICAgIF0sIGwzLnJlcGxheSAhPT0gbnVsbCkgbjogewogICAgICAgICAgICAgIHZhciBvID0gbDMucmVwbGF5OwogICAgICAgICAgICAgIGZvciAodCA9IG8ubm9kZXMsIGUgPSAwOyBlIDwgdC5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgdmFyIGggPSB0W2VdOwogICAgICAgICAgICAgICAgaWYgKGYyID09PSBoWzFdKSB7CiAgICAgICAgICAgICAgICAgIGlmIChoLmxlbmd0aCA9PT0gNCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjMiAhPT0gbnVsbCAmJiBjMiAhPT0gaFswXSkgdGhyb3cgRXJyb3IoeTIoNDkwLCBoWzBdLCBjMikpOwogICAgICAgICAgICAgICAgICAgIHZhciB2MyA9IGhbMl07CiAgICAgICAgICAgICAgICAgICAgYzIgPSBoWzNdLCBmMiA9IGwzLm5vZGUsIGwzLnJlcGxheSA9IHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGVzOiB2MywKICAgICAgICAgICAgICAgICAgICAgIHNsb3RzOiBjMiwKICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdUYXNrczogMQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZTIobjIsIGwzLCBpLCByLCBhLCB1MiksIGwzLnJlcGxheS5wZW5kaW5nVGFza3MgPT09IDEgJiYgMCA8IGwzLnJlcGxheS5ub2Rlcy5sZW5ndGgpIHRocm93IEVycm9yKHkyKDQ4OCkpOwogICAgICAgICAgICAgICAgICAgICAgbDMucmVwbGF5LnBlbmRpbmdUYXNrcy0tOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFQzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFQzID09ICJvYmplY3QiICYmIFQzICE9PSBudWxsICYmIChUMyA9PT0gJDIgfHwgdHlwZW9mIFQzLnRoZW4gPT0gImZ1bmN0aW9uIikpIHRocm93IGwzLm5vZGUgPT09IGYyID8gbDMucmVwbGF5ID0gbyA6IHQuc3BsaWNlKGUsIDEpLCBUMzsKICAgICAgICAgICAgICAgICAgICAgIGwzLnJlcGxheS5wZW5kaW5nVGFza3MtLSwgYSA9IGtuKGwzLmNvbXBvbmVudFN0YWNrKSwgaSA9IG4yLCBuMiA9IGwzLmJsb2NrZWRCb3VuZGFyeSwgciA9IFQzLCBhID0gRzMoaSwgciwgYSksIFlsKGksIG4yLCB2MywgYzIsIHIsIGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsMy5yZXBsYXkgPSBvOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChyICE9PSBTZTIpIHRocm93IEVycm9yKHkyKDQ5MCwgIlN1c3BlbnNlIiwgYmUyKHIpIHx8ICJVbmtub3duIikpOwogICAgICAgICAgICAgICAgICAgIGw6IHsKICAgICAgICAgICAgICAgICAgICAgIG8gPSB2b2lkIDAsIHIgPSBoWzVdLCB1MiA9IGhbMl0sIGMyID0gaFszXSwgZjIgPSBoWzRdID09PSBudWxsID8gW10gOiBoWzRdWzJdLCBoID0gaFs0XSA9PT0gbnVsbCA/IG51bGwgOiBoWzRdWzNdOwogICAgICAgICAgICAgICAgICAgICAgdmFyIGI0ID0gbDMua2V5UGF0aCwgQyA9IGwzLmZvcm1hdENvbnRleHQsIHczID0gbDMucm93LCB4MyA9IGwzLnJlcGxheSwgTTIgPSBsMy5ibG9ja2VkQm91bmRhcnksIEYyID0gbDMuaG9pc3RhYmxlU3RhdGUsIFggPSBhLmNoaWxkcmVuLCBtMiA9IGEuZmFsbGJhY2ssIGduID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgICAgICAgICAgICAgICAgIGEgPSAyID4gbDMuZm9ybWF0Q29udGV4dC5pbnNlcnRpb25Nb2RlID8gemwobjIsIGwzLnJvdywgZ24sIE1sKCksIE1sKCkpIDogemwobjIsIGwzLnJvdywgZ24sIG51bGwsIG51bGwpLCBhLnBhcmVudEZsdXNoZWQgPSB0cnVlLCBhLnJvb3RTZWdtZW50SUQgPSByLCBsMy5ibG9ja2VkQm91bmRhcnkgPSBhLCBsMy5ob2lzdGFibGVTdGF0ZSA9IGEuY29udGVudFN0YXRlLCBsMy5rZXlQYXRoID0gaSwgbDMuZm9ybWF0Q29udGV4dCA9IHJlKG4yLnJlc3VtYWJsZVN0YXRlLCBDKSwgbDMucm93ID0gbnVsbCwgbDMucmVwbGF5ID0gewogICAgICAgICAgICAgICAgICAgICAgICBub2RlczogdTIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzOiBjMiwKICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1Rhc2tzOiAxCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEIyKG4yLCBsMywgWCwgLTEpLCBsMy5yZXBsYXkucGVuZGluZ1Rhc2tzID09PSAxICYmIDAgPCBsMy5yZXBsYXkubm9kZXMubGVuZ3RoKSB0aHJvdyBFcnJvcih5Mig0ODgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwzLnJlcGxheS5wZW5kaW5nVGFza3MtLSwgYS5wZW5kaW5nVGFza3MgPT09IDAgJiYgYS5zdGF0dXMgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBhLnN0YXR1cyA9IDEsIG4yLmNvbXBsZXRlZEJvdW5kYXJpZXMucHVzaChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUMykgewogICAgICAgICAgICAgICAgICAgICAgICBhLnN0YXR1cyA9IDQsIHYzID0ga24obDMuY29tcG9uZW50U3RhY2spLCBvID0gRzMobjIsIFQzLCB2MyksIGEuZXJyb3JEaWdlc3QgPSBvLCBsMy5yZXBsYXkucGVuZGluZ1Rhc2tzLS0sIG4yLmNsaWVudFJlbmRlcmVkQm91bmRhcmllcy5wdXNoKGEpOwogICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgbDMuYmxvY2tlZEJvdW5kYXJ5ID0gTTIsIGwzLmhvaXN0YWJsZVN0YXRlID0gRjIsIGwzLnJlcGxheSA9IHgzLCBsMy5rZXlQYXRoID0gYjQsIGwzLmZvcm1hdENvbnRleHQgPSBDLCBsMy5yb3cgPSB3MzsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHYzID0genQobjIsIG51bGwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXM6IGYyLAogICAgICAgICAgICAgICAgICAgICAgICBzbG90czogaCwKICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1Rhc2tzOiAwCiAgICAgICAgICAgICAgICAgICAgICB9LCBtMiwgLTEsIE0yLCBhLmZhbGxiYWNrU3RhdGUsIGduLCBbCiAgICAgICAgICAgICAgICAgICAgICAgIGlbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICJTdXNwZW5zZSBGYWxsYmFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlbMl0KICAgICAgICAgICAgICAgICAgICAgIF0sIHV0KG4yLnJlc3VtYWJsZVN0YXRlLCBsMy5mb3JtYXRDb250ZXh0KSwgbDMuY29udGV4dCwgbDMudHJlZUNvbnRleHQsIGwzLnJvdywgeXQobDMuY29tcG9uZW50U3RhY2spKSwgWW4odjMpLCBuMi5waW5nZWRUYXNrcy5wdXNoKHYzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgdC5zcGxpY2UoZSwgMSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2Ugd2UyKG4yLCBsMywgaSwgciwgYSwgdTIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlIGNpOgogICAgICAgICAgICB0aHJvdyBFcnJvcih5MigyNTcpKTsKICAgICAgICAgIGNhc2UgRmU6CiAgICAgICAgICAgIGlmICh2MyA9IGUuX2luaXQsIGUgPSB2MyhlLl9wYXlsb2FkKSwgbjIuc3RhdHVzID09PSAxMikgdGhyb3cgbnVsbDsKICAgICAgICAgICAgcm4objIsIGwzLCBlLCB0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaGUyKGUpKSB7CiAgICAgICAgICB3dChuMiwgbDMsIGUsIHQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoKHYzID0gZ2koZSkpICYmICh2MyA9IHYzLmNhbGwoZSkpKSB7CiAgICAgICAgICBpZiAoZSA9IHYzLm5leHQoKSwgIWUuZG9uZSkgewogICAgICAgICAgICBhID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgICAgYS5wdXNoKGUudmFsdWUpLCBlID0gdjMubmV4dCgpOwogICAgICAgICAgICB3aGlsZSAoIWUuZG9uZSk7CiAgICAgICAgICAgIHd0KG4yLCBsMywgYSwgdCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgZS50aGVuID09ICJmdW5jdGlvbiIpIHJldHVybiBsMy50aGVuYWJsZVN0YXRlID0gbnVsbCwgcm4objIsIGwzLCBXaShlKSwgdCk7CiAgICAgICAgaWYgKGUuJCR0eXBlb2YgPT09IFJlMikgcmV0dXJuIHJuKG4yLCBsMywgZS5fY3VycmVudFZhbHVlLCB0KTsKICAgICAgICB0aHJvdyB0ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCBFcnJvcih5MigzMSwgdCA9PT0gIltvYmplY3QgT2JqZWN0XSIgPyAib2JqZWN0IHdpdGgga2V5cyB7IiArIE9iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikgKyAifSIgOiB0KSk7CiAgICAgIH0KICAgICAgdHlwZW9mIGUgPT0gInN0cmluZyIgPyAodCA9IGwzLmJsb2NrZWRTZWdtZW50LCB0ICE9PSBudWxsICYmICh0Lmxhc3RQdXNoZWRUZXh0ID0gT3IodC5jaHVua3MsIGUsIG4yLnJlbmRlclN0YXRlLCB0Lmxhc3RQdXNoZWRUZXh0KSkpIDogKHR5cGVvZiBlID09ICJudW1iZXIiIHx8IHR5cGVvZiBlID09ICJiaWdpbnQiKSAmJiAodCA9IGwzLmJsb2NrZWRTZWdtZW50LCB0ICE9PSBudWxsICYmICh0Lmxhc3RQdXNoZWRUZXh0ID0gT3IodC5jaHVua3MsICIiICsgZSwgbjIucmVuZGVyU3RhdGUsIHQubGFzdFB1c2hlZFRleHQpKSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHd0KG4yLCBsMywgZSwgdCkgewogICAgdmFyIHIgPSBsMy5rZXlQYXRoOwogICAgaWYgKHQgIT09IC0xICYmIChsMy5rZXlQYXRoID0gWwogICAgICBsMy5rZXlQYXRoLAogICAgICAiRnJhZ21lbnQiLAogICAgICB0CiAgICBdLCBsMy5yZXBsYXkgIT09IG51bGwpKSB7CiAgICAgIGZvciAodmFyIGkgPSBsMy5yZXBsYXksIGEgPSBpLm5vZGVzLCB1MiA9IDA7IHUyIDwgYS5sZW5ndGg7IHUyKyspIHsKICAgICAgICB2YXIgYzIgPSBhW3UyXTsKICAgICAgICBpZiAoYzJbMV0gPT09IHQpIHsKICAgICAgICAgIHQgPSBjMlsyXSwgYzIgPSBjMlszXSwgbDMucmVwbGF5ID0gewogICAgICAgICAgICBub2RlczogdCwKICAgICAgICAgICAgc2xvdHM6IGMyLAogICAgICAgICAgICBwZW5kaW5nVGFza3M6IDEKICAgICAgICAgIH07CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAod3QobjIsIGwzLCBlLCAtMSksIGwzLnJlcGxheS5wZW5kaW5nVGFza3MgPT09IDEgJiYgMCA8IGwzLnJlcGxheS5ub2Rlcy5sZW5ndGgpIHRocm93IEVycm9yKHkyKDQ4OCkpOwogICAgICAgICAgICBsMy5yZXBsYXkucGVuZGluZ1Rhc2tzLS07CiAgICAgICAgICB9IGNhdGNoIChoKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgaCA9PSAib2JqZWN0IiAmJiBoICE9PSBudWxsICYmIChoID09PSAkMiB8fCB0eXBlb2YgaC50aGVuID09ICJmdW5jdGlvbiIpKSB0aHJvdyBoOwogICAgICAgICAgICBsMy5yZXBsYXkucGVuZGluZ1Rhc2tzLS0sIGUgPSBrbihsMy5jb21wb25lbnRTdGFjayk7CiAgICAgICAgICAgIHZhciBmMiA9IGwzLmJsb2NrZWRCb3VuZGFyeSwgbyA9IGg7CiAgICAgICAgICAgIGUgPSBHMyhuMiwgbywgZSksIFlsKG4yLCBmMiwgdCwgYzIsIG8sIGUpOwogICAgICAgICAgfQogICAgICAgICAgbDMucmVwbGF5ID0gaSwgYS5zcGxpY2UodTIsIDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGwzLmtleVBhdGggPSByOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaSA9IGwzLnRyZWVDb250ZXh0LCBhID0gZS5sZW5ndGgsIGwzLnJlcGxheSAhPT0gbnVsbCAmJiAodTIgPSBsMy5yZXBsYXkuc2xvdHMsIHUyICE9PSBudWxsICYmIHR5cGVvZiB1MiA9PSAib2JqZWN0IikpIHsKICAgICAgZm9yICh0ID0gMDsgdCA8IGE7IHQrKykgYzIgPSBlW3RdLCBsMy50cmVlQ29udGV4dCA9IFVuKGksIGEsIHQpLCBmMiA9IHUyW3RdLCB0eXBlb2YgZjIgPT0gIm51bWJlciIgPyAoTWUyKG4yLCBsMywgZjIsIGMyLCB0KSwgZGVsZXRlIHUyW3RdKSA6IEIyKG4yLCBsMywgYzIsIHQpOwogICAgICBsMy50cmVlQ29udGV4dCA9IGksIGwzLmtleVBhdGggPSByOwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKHUyID0gMDsgdTIgPCBhOyB1MisrKSB0ID0gZVt1Ml0sIGwzLnRyZWVDb250ZXh0ID0gVW4oaSwgYSwgdTIpLCBCMihuMiwgbDMsIHQsIHUyKTsKICAgIGwzLnRyZWVDb250ZXh0ID0gaSwgbDMua2V5UGF0aCA9IHI7CiAgfQogIGZ1bmN0aW9uIEppKG4yLCBsMywgZSkgewogICAgaWYgKGUuc3RhdHVzID0gNSwgZS5yb290U2VnbWVudElEID0gbjIubmV4dFNlZ21lbnRJZCsrLCBuMiA9IGUudHJhY2tlZENvbnRlbnRLZXlQYXRoLCBuMiA9PT0gbnVsbCkgdGhyb3cgRXJyb3IoeTIoNDg2KSk7CiAgICB2YXIgdCA9IGUudHJhY2tlZEZhbGxiYWNrTm9kZSwgciA9IFtdLCBpID0gbDMud29ya2luZ01hcC5nZXQobjIpOwogICAgcmV0dXJuIGkgPT09IHZvaWQgMCA/IChlID0gWwogICAgICBuMlsxXSwKICAgICAgbjJbMl0sCiAgICAgIHIsCiAgICAgIG51bGwsCiAgICAgIHQsCiAgICAgIGUucm9vdFNlZ21lbnRJRAogICAgXSwgbDMud29ya2luZ01hcC5zZXQobjIsIGUpLCBDZTIoZSwgbjJbMF0sIGwzKSwgZSkgOiAoaVs0XSA9IHQsIGlbNV0gPSBlLnJvb3RTZWdtZW50SUQsIGkpOwogIH0KICBmdW5jdGlvbiB4dChuMiwgbDMsIGUsIHQpIHsKICAgIHQuc3RhdHVzID0gNTsKICAgIHZhciByID0gZS5rZXlQYXRoLCBpID0gZS5ibG9ja2VkQm91bmRhcnk7CiAgICBpZiAoaSA9PT0gbnVsbCkgdC5pZCA9IG4yLm5leHRTZWdtZW50SWQrKywgbDMucm9vdFNsb3RzID0gdC5pZCwgbjIuY29tcGxldGVkUm9vdFNlZ21lbnQgIT09IG51bGwgJiYgKG4yLmNvbXBsZXRlZFJvb3RTZWdtZW50LnN0YXR1cyA9IDUpOwogICAgZWxzZSB7CiAgICAgIGlmIChpICE9PSBudWxsICYmIGkuc3RhdHVzID09PSAwKSB7CiAgICAgICAgdmFyIGEgPSBKaShuMiwgbDMsIGkpOwogICAgICAgIGlmIChpLnRyYWNrZWRDb250ZW50S2V5UGF0aCA9PT0gciAmJiBlLmNoaWxkSW5kZXggPT09IC0xKSB7CiAgICAgICAgICB0LmlkID09PSAtMSAmJiAodC5pZCA9IHQucGFyZW50Rmx1c2hlZCA/IGkucm9vdFNlZ21lbnRJRCA6IG4yLm5leHRTZWdtZW50SWQrKyksIGFbM10gPSB0LmlkOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodC5pZCA9PT0gLTEgJiYgKHQuaWQgPSB0LnBhcmVudEZsdXNoZWQgJiYgaSAhPT0gbnVsbCA/IGkucm9vdFNlZ21lbnRJRCA6IG4yLm5leHRTZWdtZW50SWQrKyksIGUuY2hpbGRJbmRleCA9PT0gLTEpIHIgPT09IG51bGwgPyBsMy5yb290U2xvdHMgPSB0LmlkIDogKGUgPSBsMy53b3JraW5nTWFwLmdldChyKSwgZSA9PT0gdm9pZCAwID8gKGUgPSBbCiAgICAgICAgclsxXSwKICAgICAgICByWzJdLAogICAgICAgIFtdLAogICAgICAgIHQuaWQKICAgICAgXSwgQ2UyKGUsIHJbMF0sIGwzKSkgOiBlWzNdID0gdC5pZCk7CiAgICAgIGVsc2UgewogICAgICAgIGlmIChyID09PSBudWxsKSB7CiAgICAgICAgICBpZiAobjIgPSBsMy5yb290U2xvdHMsIG4yID09PSBudWxsKSBuMiA9IGwzLnJvb3RTbG90cyA9IHt9OwogICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG4yID09ICJudW1iZXIiKSB0aHJvdyBFcnJvcih5Mig0OTEpKTsKICAgICAgICB9IGVsc2UgaWYgKGkgPSBsMy53b3JraW5nTWFwLCBhID0gaS5nZXQociksIGEgPT09IHZvaWQgMCkgbjIgPSB7fSwgYSA9IFsKICAgICAgICAgIHJbMV0sCiAgICAgICAgICByWzJdLAogICAgICAgICAgW10sCiAgICAgICAgICBuMgogICAgICAgIF0sIGkuc2V0KHIsIGEpLCBDZTIoYSwgclswXSwgbDMpOwogICAgICAgIGVsc2UgaWYgKG4yID0gYVszXSwgbjIgPT09IG51bGwpIG4yID0gYVszXSA9IHt9OwogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBuMiA9PSAibnVtYmVyIikgdGhyb3cgRXJyb3IoeTIoNDkxKSk7CiAgICAgICAgbjJbZS5jaGlsZEluZGV4XSA9IHQuaWQ7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gSHQobjIsIGwzKSB7CiAgICBuMiA9IG4yLnRyYWNrZWRQb3N0cG9uZXMsIG4yICE9PSBudWxsICYmIChsMyA9IGwzLnRyYWNrZWRDb250ZW50S2V5UGF0aCwgbDMgIT09IG51bGwgJiYgKGwzID0gbjIud29ya2luZ01hcC5nZXQobDMpLCBsMyAhPT0gdm9pZCAwICYmIChsMy5sZW5ndGggPSA0LCBsM1syXSA9IFtdLCBsM1szXSA9IG51bGwpKSk7CiAgfQogIGZ1bmN0aW9uIHRpKG4yLCBsMywgZSkgewogICAgcmV0dXJuIHp0KG4yLCBlLCBsMy5yZXBsYXksIGwzLm5vZGUsIGwzLmNoaWxkSW5kZXgsIGwzLmJsb2NrZWRCb3VuZGFyeSwgbDMuaG9pc3RhYmxlU3RhdGUsIGwzLmFib3J0U2V0LCBsMy5rZXlQYXRoLCBsMy5mb3JtYXRDb250ZXh0LCBsMy5jb250ZXh0LCBsMy50cmVlQ29udGV4dCwgbDMucm93LCBsMy5jb21wb25lbnRTdGFjayk7CiAgfQogIGZ1bmN0aW9uIHJpKG4yLCBsMywgZSkgewogICAgdmFyIHQgPSBsMy5ibG9ja2VkU2VnbWVudCwgciA9IEFuKG4yLCB0LmNodW5rcy5sZW5ndGgsIG51bGwsIGwzLmZvcm1hdENvbnRleHQsIHQubGFzdFB1c2hlZFRleHQsIHRydWUpOwogICAgcmV0dXJuIHQuY2hpbGRyZW4ucHVzaChyKSwgdC5sYXN0UHVzaGVkVGV4dCA9IGZhbHNlLCBEbChuMiwgZSwgbDMubm9kZSwgbDMuY2hpbGRJbmRleCwgbDMuYmxvY2tlZEJvdW5kYXJ5LCByLCBsMy5ibG9ja2VkUHJlYW1ibGUsIGwzLmhvaXN0YWJsZVN0YXRlLCBsMy5hYm9ydFNldCwgbDMua2V5UGF0aCwgbDMuZm9ybWF0Q29udGV4dCwgbDMuY29udGV4dCwgbDMudHJlZUNvbnRleHQsIGwzLnJvdywgbDMuY29tcG9uZW50U3RhY2spOwogIH0KICBmdW5jdGlvbiBCMihuMiwgbDMsIGUsIHQpIHsKICAgIHZhciByID0gbDMuZm9ybWF0Q29udGV4dCwgaSA9IGwzLmNvbnRleHQsIGEgPSBsMy5rZXlQYXRoLCB1MiA9IGwzLnRyZWVDb250ZXh0LCBjMiA9IGwzLmNvbXBvbmVudFN0YWNrLCBmMiA9IGwzLmJsb2NrZWRTZWdtZW50OwogICAgaWYgKGYyID09PSBudWxsKSB7CiAgICAgIGYyID0gbDMucmVwbGF5OwogICAgICB0cnkgewogICAgICAgIHJldHVybiBybihuMiwgbDMsIGUsIHQpOwogICAgICB9IGNhdGNoICh2MykgewogICAgICAgIGlmIChObCgpLCBlID0gdjMgPT09ICQyID8geWUyKCkgOiB2MywgbjIuc3RhdHVzICE9PSAxMiAmJiB0eXBlb2YgZSA9PSAib2JqZWN0IiAmJiBlICE9PSBudWxsKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGUudGhlbiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIHQgPSB2MyA9PT0gJDIgPyAkbigpIDogbnVsbCwgbjIgPSB0aShuMiwgbDMsIHQpLnBpbmcsIGUudGhlbihuMiwgbjIpLCBsMy5mb3JtYXRDb250ZXh0ID0gciwgbDMuY29udGV4dCA9IGksIGwzLmtleVBhdGggPSBhLCBsMy50cmVlQ29udGV4dCA9IHUyLCBsMy5jb21wb25lbnRTdGFjayA9IGMyLCBsMy5yZXBsYXkgPSBmMiwgU24oaSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChlLm1lc3NhZ2UgPT09ICJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZCIpIHsKICAgICAgICAgICAgZSA9IHYzID09PSAkMiA/ICRuKCkgOiBudWxsLCBlID0gdGkobjIsIGwzLCBlKSwgbjIucGluZ2VkVGFza3MucHVzaChlKSwgbDMuZm9ybWF0Q29udGV4dCA9IHIsIGwzLmNvbnRleHQgPSBpLCBsMy5rZXlQYXRoID0gYSwgbDMudHJlZUNvbnRleHQgPSB1MiwgbDMuY29tcG9uZW50U3RhY2sgPSBjMiwgbDMucmVwbGF5ID0gZjIsIFNuKGkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICB2YXIgbyA9IGYyLmNoaWxkcmVuLmxlbmd0aCwgaCA9IGYyLmNodW5rcy5sZW5ndGg7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIHJuKG4yLCBsMywgZSwgdCk7CiAgICAgIH0gY2F0Y2ggKHYzKSB7CiAgICAgICAgaWYgKE5sKCksIGYyLmNoaWxkcmVuLmxlbmd0aCA9IG8sIGYyLmNodW5rcy5sZW5ndGggPSBoLCBlID0gdjMgPT09ICQyID8geWUyKCkgOiB2MywgbjIuc3RhdHVzICE9PSAxMiAmJiB0eXBlb2YgZSA9PSAib2JqZWN0IiAmJiBlICE9PSBudWxsKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGUudGhlbiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGYyID0gZSwgZSA9IHYzID09PSAkMiA/ICRuKCkgOiBudWxsLCBuMiA9IHJpKG4yLCBsMywgZSkucGluZywgZjIudGhlbihuMiwgbjIpLCBsMy5mb3JtYXRDb250ZXh0ID0gciwgbDMuY29udGV4dCA9IGksIGwzLmtleVBhdGggPSBhLCBsMy50cmVlQ29udGV4dCA9IHUyLCBsMy5jb21wb25lbnRTdGFjayA9IGMyLCBTbihpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGUubWVzc2FnZSA9PT0gIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkIikgewogICAgICAgICAgICBmMiA9IHYzID09PSAkMiA/ICRuKCkgOiBudWxsLCBmMiA9IHJpKG4yLCBsMywgZjIpLCBuMi5waW5nZWRUYXNrcy5wdXNoKGYyKSwgbDMuZm9ybWF0Q29udGV4dCA9IHIsIGwzLmNvbnRleHQgPSBpLCBsMy5rZXlQYXRoID0gYSwgbDMudHJlZUNvbnRleHQgPSB1MiwgbDMuY29tcG9uZW50U3RhY2sgPSBjMiwgU24oaSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRocm93IGwzLmZvcm1hdENvbnRleHQgPSByLCBsMy5jb250ZXh0ID0gaSwgbDMua2V5UGF0aCA9IGEsIGwzLnRyZWVDb250ZXh0ID0gdTIsIFNuKGkpLCBlOwogIH0KICBmdW5jdGlvbiBVdShuMikgewogICAgdmFyIGwzID0gbjIuYmxvY2tlZEJvdW5kYXJ5LCBlID0gbjIuYmxvY2tlZFNlZ21lbnQ7CiAgICBlICE9PSBudWxsICYmIChlLnN0YXR1cyA9IDMsIE1uKHRoaXMsIGwzLCBuMi5yb3csIGUpKTsKICB9CiAgZnVuY3Rpb24gWWwobjIsIGwzLCBlLCB0LCByLCBpKSB7CiAgICBmb3IgKHZhciBhID0gMDsgYSA8IGUubGVuZ3RoOyBhKyspIHsKICAgICAgdmFyIHUyID0gZVthXTsKICAgICAgaWYgKHUyLmxlbmd0aCA9PT0gNCkgWWwobjIsIGwzLCB1MlsyXSwgdTJbM10sIHIsIGkpOwogICAgICBlbHNlIHsKICAgICAgICB1MiA9IHUyWzVdOwogICAgICAgIHZhciBjMiA9IG4yLCBmMiA9IGksIG8gPSB6bChjMiwgbnVsbCwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgbnVsbCwgbnVsbCk7CiAgICAgICAgby5wYXJlbnRGbHVzaGVkID0gdHJ1ZSwgby5yb290U2VnbWVudElEID0gdTIsIG8uc3RhdHVzID0gNCwgby5lcnJvckRpZ2VzdCA9IGYyLCBvLnBhcmVudEZsdXNoZWQgJiYgYzIuY2xpZW50UmVuZGVyZWRCb3VuZGFyaWVzLnB1c2gobyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChlLmxlbmd0aCA9IDAsIHQgIT09IG51bGwpIHsKICAgICAgaWYgKGwzID09PSBudWxsKSB0aHJvdyBFcnJvcih5Mig0ODcpKTsKICAgICAgaWYgKGwzLnN0YXR1cyAhPT0gNCAmJiAobDMuc3RhdHVzID0gNCwgbDMuZXJyb3JEaWdlc3QgPSBpLCBsMy5wYXJlbnRGbHVzaGVkICYmIG4yLmNsaWVudFJlbmRlcmVkQm91bmRhcmllcy5wdXNoKGwzKSksIHR5cGVvZiB0ID09ICJvYmplY3QiKSBmb3IgKHZhciBoIGluIHQpIGRlbGV0ZSB0W2hdOwogICAgfQogIH0KICBmdW5jdGlvbiBDdChuMiwgbDMsIGUpIHsKICAgIHZhciB0ID0gbjIuYmxvY2tlZEJvdW5kYXJ5LCByID0gbjIuYmxvY2tlZFNlZ21lbnQ7CiAgICBpZiAociAhPT0gbnVsbCkgewogICAgICBpZiAoci5zdGF0dXMgPT09IDYpIHJldHVybjsKICAgICAgci5zdGF0dXMgPSAzOwogICAgfQogICAgdmFyIGkgPSBrbihuMi5jb21wb25lbnRTdGFjayk7CiAgICBpZiAodCA9PT0gbnVsbCkgewogICAgICBpZiAobDMuc3RhdHVzICE9PSAxMyAmJiBsMy5zdGF0dXMgIT09IDE0KSB7CiAgICAgICAgaWYgKHQgPSBuMi5yZXBsYXksIHQgPT09IG51bGwpIHsKICAgICAgICAgIGwzLnRyYWNrZWRQb3N0cG9uZXMgIT09IG51bGwgJiYgciAhPT0gbnVsbCA/ICh0ID0gbDMudHJhY2tlZFBvc3Rwb25lcywgRzMobDMsIGUsIGkpLCB4dChsMywgdCwgbjIsIHIpLCBNbihsMywgbnVsbCwgbjIucm93LCByKSkgOiAoRzMobDMsIGUsIGkpLCBIbChsMywgZSkpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0LnBlbmRpbmdUYXNrcy0tLCB0LnBlbmRpbmdUYXNrcyA9PT0gMCAmJiAwIDwgdC5ub2Rlcy5sZW5ndGggJiYgKHIgPSBHMyhsMywgZSwgaSksIFlsKGwzLCBudWxsLCB0Lm5vZGVzLCB0LnNsb3RzLCBlLCByKSksIGwzLnBlbmRpbmdSb290VGFza3MtLSwgbDMucGVuZGluZ1Jvb3RUYXNrcyA9PT0gMCAmJiBVdChsMyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBhID0gbDMudHJhY2tlZFBvc3Rwb25lczsKICAgICAgaWYgKHQuc3RhdHVzICE9PSA0KSB7CiAgICAgICAgaWYgKGEgIT09IG51bGwgJiYgciAhPT0gbnVsbCkgcmV0dXJuIEczKGwzLCBlLCBpKSwgeHQobDMsIGEsIG4yLCByKSwgdC5mYWxsYmFja0Fib3J0YWJsZVRhc2tzLmZvckVhY2goZnVuY3Rpb24odTIpIHsKICAgICAgICAgIHJldHVybiBDdCh1MiwgbDMsIGUpOwogICAgICAgIH0pLCB0LmZhbGxiYWNrQWJvcnRhYmxlVGFza3MuY2xlYXIoKSwgTW4obDMsIHQsIG4yLnJvdywgcik7CiAgICAgICAgdC5zdGF0dXMgPSA0LCByID0gRzMobDMsIGUsIGkpLCB0LnN0YXR1cyA9IDQsIHQuZXJyb3JEaWdlc3QgPSByLCBIdChsMywgdCksIHQucGFyZW50Rmx1c2hlZCAmJiBsMy5jbGllbnRSZW5kZXJlZEJvdW5kYXJpZXMucHVzaCh0KTsKICAgICAgfQogICAgICB0LnBlbmRpbmdUYXNrcy0tLCByID0gdC5yb3csIHIgIT09IG51bGwgJiYgLS1yLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBZMihsMywgciksIHQuZmFsbGJhY2tBYm9ydGFibGVUYXNrcy5mb3JFYWNoKGZ1bmN0aW9uKHUyKSB7CiAgICAgICAgcmV0dXJuIEN0KHUyLCBsMywgZSk7CiAgICAgIH0pLCB0LmZhbGxiYWNrQWJvcnRhYmxlVGFza3MuY2xlYXIoKTsKICAgIH0KICAgIG4yID0gbjIucm93LCBuMiAhPT0gbnVsbCAmJiAtLW4yLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBZMihsMywgbjIpLCBsMy5hbGxQZW5kaW5nVGFza3MtLSwgbDMuYWxsUGVuZGluZ1Rhc2tzID09PSAwICYmIHhlMihsMyk7CiAgfQogIGZ1bmN0aW9uIFd0KG4yLCBsMykgewogICAgdHJ5IHsKICAgICAgdmFyIGUgPSBuMi5yZW5kZXJTdGF0ZSwgdCA9IGUub25IZWFkZXJzOwogICAgICBpZiAodCkgewogICAgICAgIHZhciByID0gZS5oZWFkZXJzOwogICAgICAgIGlmIChyKSB7CiAgICAgICAgICBlLmhlYWRlcnMgPSBudWxsOwogICAgICAgICAgdmFyIGkgPSByLnByZWNvbm5lY3RzOwogICAgICAgICAgaWYgKHIuZm9udFByZWxvYWRzICYmIChpICYmIChpICs9ICIsICIpLCBpICs9IHIuZm9udFByZWxvYWRzKSwgci5oaWdoSW1hZ2VQcmVsb2FkcyAmJiAoaSAmJiAoaSArPSAiLCAiKSwgaSArPSByLmhpZ2hJbWFnZVByZWxvYWRzKSwgIWwzKSB7CiAgICAgICAgICAgIHZhciBhID0gZS5zdHlsZXMudmFsdWVzKCksIHUyID0gYS5uZXh0KCk7CiAgICAgICAgICAgIG46IGZvciAoOyAwIDwgci5yZW1haW5pbmdDYXBhY2l0eSAmJiAhdTIuZG9uZTsgdTIgPSBhLm5leHQoKSkgZm9yICh2YXIgYzIgPSB1Mi52YWx1ZS5zaGVldHMudmFsdWVzKCksIGYyID0gYzIubmV4dCgpOyAwIDwgci5yZW1haW5pbmdDYXBhY2l0eSAmJiAhZjIuZG9uZTsgZjIgPSBjMi5uZXh0KCkpIHsKICAgICAgICAgICAgICB2YXIgbyA9IGYyLnZhbHVlLCBoID0gby5wcm9wcywgdjMgPSBoLmhyZWYsIGI0ID0gby5wcm9wcywgQyA9IHNlKGI0LmhyZWYsICJzdHlsZSIsIHsKICAgICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiBiNC5jcm9zc09yaWdpbiwKICAgICAgICAgICAgICAgIGludGVncml0eTogYjQuaW50ZWdyaXR5LAogICAgICAgICAgICAgICAgbm9uY2U6IGI0Lm5vbmNlLAogICAgICAgICAgICAgICAgdHlwZTogYjQudHlwZSwKICAgICAgICAgICAgICAgIGZldGNoUHJpb3JpdHk6IGI0LmZldGNoUHJpb3JpdHksCiAgICAgICAgICAgICAgICByZWZlcnJlclBvbGljeTogYjQucmVmZXJyZXJQb2xpY3ksCiAgICAgICAgICAgICAgICBtZWRpYTogYjQubWVkaWEKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBpZiAoMCA8PSAoci5yZW1haW5pbmdDYXBhY2l0eSAtPSBDLmxlbmd0aCArIDIpKSBlLnJlc2V0cy5zdHlsZVt2M10gPSB0biwgaSAmJiAoaSArPSAiLCAiKSwgaSArPSBDLCBlLnJlc2V0cy5zdHlsZVt2M10gPSB0eXBlb2YgaC5jcm9zc09yaWdpbiA9PSAic3RyaW5nIiB8fCB0eXBlb2YgaC5pbnRlZ3JpdHkgPT0gInN0cmluZyIgPyBbCiAgICAgICAgICAgICAgICBoLmNyb3NzT3JpZ2luLAogICAgICAgICAgICAgICAgaC5pbnRlZ3JpdHkKICAgICAgICAgICAgICBdIDogdG47CiAgICAgICAgICAgICAgZWxzZSBicmVhayBuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0KGkgPyB7CiAgICAgICAgICAgIExpbms6IGkKICAgICAgICAgIH0gOiB7fSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoICh3MykgewogICAgICBHMyhuMiwgdzMsIHt9KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gVXQobjIpIHsKICAgIG4yLnRyYWNrZWRQb3N0cG9uZXMgPT09IG51bGwgJiYgV3QobjIsIHRydWUpLCBuMi50cmFja2VkUG9zdHBvbmVzID09PSBudWxsICYmIFhsKG4yKSwgbjIub25TaGVsbEVycm9yID0gSiwgbjIgPSBuMi5vblNoZWxsUmVhZHksIG4yKCk7CiAgfQogIGZ1bmN0aW9uIHhlMihuMikgewogICAgV3QobjIsIG4yLnRyYWNrZWRQb3N0cG9uZXMgPT09IG51bGwgPyB0cnVlIDogbjIuY29tcGxldGVkUm9vdFNlZ21lbnQgPT09IG51bGwgfHwgbjIuY29tcGxldGVkUm9vdFNlZ21lbnQuc3RhdHVzICE9PSA1KSwgWGwobjIpLCBuMiA9IG4yLm9uQWxsUmVhZHksIG4yKCk7CiAgfQogIGZ1bmN0aW9uIFdsKG4yLCBsMykgewogICAgaWYgKGwzLmNodW5rcy5sZW5ndGggPT09IDAgJiYgbDMuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIGwzLmNoaWxkcmVuWzBdLmJvdW5kYXJ5ID09PSBudWxsICYmIGwzLmNoaWxkcmVuWzBdLmlkID09PSAtMSkgewogICAgICB2YXIgZSA9IGwzLmNoaWxkcmVuWzBdOwogICAgICBlLmlkID0gbDMuaWQsIGUucGFyZW50Rmx1c2hlZCA9IHRydWUsIGUuc3RhdHVzICE9PSAxICYmIGUuc3RhdHVzICE9PSAzICYmIGUuc3RhdHVzICE9PSA0IHx8IFdsKG4yLCBlKTsKICAgIH0gZWxzZSBuMi5jb21wbGV0ZWRTZWdtZW50cy5wdXNoKGwzKTsKICB9CiAgZnVuY3Rpb24gbGwobjIsIGwzLCBlKSB7CiAgICBpZiAoUmEgIT09IG51bGwpIHsKICAgICAgZSA9IGUuY2h1bmtzOwogICAgICBmb3IgKHZhciB0ID0gMCwgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKSB0ICs9IGVbcl0uYnl0ZUxlbmd0aDsKICAgICAgbDMgPT09IG51bGwgPyBuMi5ieXRlU2l6ZSArPSB0IDogbDMuYnl0ZVNpemUgKz0gdDsKICAgIH0KICB9CiAgZnVuY3Rpb24gTW4objIsIGwzLCBlLCB0KSB7CiAgICBpZiAoZSAhPT0gbnVsbCAmJiAoLS1lLnBlbmRpbmdUYXNrcyA9PT0gMCA/IFkyKG4yLCBlKSA6IGUudG9nZXRoZXIgJiYgVHQobjIsIGUpKSwgbjIuYWxsUGVuZGluZ1Rhc2tzLS0sIGwzID09PSBudWxsKSB7CiAgICAgIGlmICh0ICE9PSBudWxsICYmIHQucGFyZW50Rmx1c2hlZCkgewogICAgICAgIGlmIChuMi5jb21wbGV0ZWRSb290U2VnbWVudCAhPT0gbnVsbCkgdGhyb3cgRXJyb3IoeTIoMzg5KSk7CiAgICAgICAgbjIuY29tcGxldGVkUm9vdFNlZ21lbnQgPSB0OwogICAgICB9CiAgICAgIG4yLnBlbmRpbmdSb290VGFza3MtLSwgbjIucGVuZGluZ1Jvb3RUYXNrcyA9PT0gMCAmJiBVdChuMik7CiAgICB9IGVsc2UgaWYgKGwzLnBlbmRpbmdUYXNrcy0tLCBsMy5zdGF0dXMgIT09IDQpIGlmIChsMy5wZW5kaW5nVGFza3MgPT09IDApIHsKICAgICAgaWYgKGwzLnN0YXR1cyA9PT0gMCAmJiAobDMuc3RhdHVzID0gMSksIHQgIT09IG51bGwgJiYgdC5wYXJlbnRGbHVzaGVkICYmICh0LnN0YXR1cyA9PT0gMSB8fCB0LnN0YXR1cyA9PT0gMykgJiYgV2wobDMsIHQpLCBsMy5wYXJlbnRGbHVzaGVkICYmIG4yLmNvbXBsZXRlZEJvdW5kYXJpZXMucHVzaChsMyksIGwzLnN0YXR1cyA9PT0gMSkgZSA9IGwzLnJvdywgZSAhPT0gbnVsbCAmJiB0bChlLmhvaXN0YWJsZXMsIGwzLmNvbnRlbnRTdGF0ZSksIHJsKG4yLCBsMykgfHwgKGwzLmZhbGxiYWNrQWJvcnRhYmxlVGFza3MuZm9yRWFjaChVdSwgbjIpLCBsMy5mYWxsYmFja0Fib3J0YWJsZVRhc2tzLmNsZWFyKCksIGUgIT09IG51bGwgJiYgLS1lLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBZMihuMiwgZSkpLCBuMi5wZW5kaW5nUm9vdFRhc2tzID09PSAwICYmIG4yLnRyYWNrZWRQb3N0cG9uZXMgPT09IG51bGwgJiYgbDMuY29udGVudFByZWFtYmxlICE9PSBudWxsICYmIFhsKG4yKTsKICAgICAgZWxzZSBpZiAobDMuc3RhdHVzID09PSA1ICYmIChsMyA9IGwzLnJvdywgbDMgIT09IG51bGwpKSB7CiAgICAgICAgaWYgKG4yLnRyYWNrZWRQb3N0cG9uZXMgIT09IG51bGwpIHsKICAgICAgICAgIGUgPSBuMi50cmFja2VkUG9zdHBvbmVzOwogICAgICAgICAgdmFyIHIgPSBsMy5uZXh0OwogICAgICAgICAgaWYgKHIgIT09IG51bGwgJiYgKHQgPSByLmJvdW5kYXJpZXMsIHQgIT09IG51bGwpKSBmb3IgKHIuYm91bmRhcmllcyA9IG51bGwsIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykgewogICAgICAgICAgICB2YXIgaSA9IHRbcl07CiAgICAgICAgICAgIEppKG4yLCBlLCBpKSwgTW4objIsIGksIG51bGwsIG51bGwpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAtLWwzLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBZMihuMiwgbDMpOwogICAgICB9CiAgICB9IGVsc2UgdCA9PT0gbnVsbCB8fCAhdC5wYXJlbnRGbHVzaGVkIHx8IHQuc3RhdHVzICE9PSAxICYmIHQuc3RhdHVzICE9PSAzIHx8IChXbChsMywgdCksIGwzLmNvbXBsZXRlZFNlZ21lbnRzLmxlbmd0aCA9PT0gMSAmJiBsMy5wYXJlbnRGbHVzaGVkICYmIG4yLnBhcnRpYWxCb3VuZGFyaWVzLnB1c2gobDMpKSwgbDMgPSBsMy5yb3csIGwzICE9PSBudWxsICYmIGwzLnRvZ2V0aGVyICYmIFR0KG4yLCBsMyk7CiAgICBuMi5hbGxQZW5kaW5nVGFza3MgPT09IDAgJiYgeGUyKG4yKTsKICB9CiAgZnVuY3Rpb24gUnQobjIpIHsKICAgIGlmIChuMi5zdGF0dXMgIT09IDE0ICYmIG4yLnN0YXR1cyAhPT0gMTMpIHsKICAgICAgdmFyIGwzID0gV24sIGUgPSBxbi5IOwogICAgICBxbi5IID0gcHI7CiAgICAgIHZhciB0ID0gcW4uQTsKICAgICAgcW4uQSA9IHp1OwogICAgICB2YXIgciA9IEQzOwogICAgICBEMyA9IG4yOwogICAgICB2YXIgaSA9IGZlOwogICAgICBmZSA9IG4yLnJlc3VtYWJsZVN0YXRlOwogICAgICB0cnkgewogICAgICAgIHZhciBhID0gbjIucGluZ2VkVGFza3MsIHUyOwogICAgICAgIGZvciAodTIgPSAwOyB1MiA8IGEubGVuZ3RoOyB1MisrKSB7CiAgICAgICAgICB2YXIgYzIgPSBhW3UyXSwgZjIgPSBuMiwgbyA9IGMyLmJsb2NrZWRTZWdtZW50OwogICAgICAgICAgaWYgKG8gPT09IG51bGwpIHsKICAgICAgICAgICAgdmFyIGggPSBmMjsKICAgICAgICAgICAgaWYgKGMyLnJlcGxheS5wZW5kaW5nVGFza3MgIT09IDApIHsKICAgICAgICAgICAgICBTbihjMi5jb250ZXh0KTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjMi5yZXBsYXkuc2xvdHMgPT0gIm51bWJlciIgPyBNZTIoaCwgYzIsIGMyLnJlcGxheS5zbG90cywgYzIubm9kZSwgYzIuY2hpbGRJbmRleCkgOiBFdChoLCBjMiksIGMyLnJlcGxheS5wZW5kaW5nVGFza3MgPT09IDEgJiYgMCA8IGMyLnJlcGxheS5ub2Rlcy5sZW5ndGgpIHRocm93IEVycm9yKHkyKDQ4OCkpOwogICAgICAgICAgICAgICAgYzIucmVwbGF5LnBlbmRpbmdUYXNrcy0tLCBjMi5hYm9ydFNldC5kZWxldGUoYzIpLCBNbihoLCBjMi5ibG9ja2VkQm91bmRhcnksIGMyLnJvdywgbnVsbCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoXzIpIHsKICAgICAgICAgICAgICAgIE5sKCk7CiAgICAgICAgICAgICAgICB2YXIgdjMgPSBfMiA9PT0gJDIgPyB5ZTIoKSA6IF8yOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2MyA9PSAib2JqZWN0IiAmJiB2MyAhPT0gbnVsbCAmJiB0eXBlb2YgdjMudGhlbiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgIHZhciBiNCA9IGMyLnBpbmc7CiAgICAgICAgICAgICAgICAgIHYzLnRoZW4oYjQsIGI0KSwgYzIudGhlbmFibGVTdGF0ZSA9IF8yID09PSAkMiA/ICRuKCkgOiBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYzIucmVwbGF5LnBlbmRpbmdUYXNrcy0tLCBjMi5hYm9ydFNldC5kZWxldGUoYzIpOwogICAgICAgICAgICAgICAgICB2YXIgQyA9IGtuKGMyLmNvbXBvbmVudFN0YWNrKTsKICAgICAgICAgICAgICAgICAgZjIgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgIHZhciB3MyA9IGgsIHgzID0gYzIuYmxvY2tlZEJvdW5kYXJ5LCBNMiA9IGguc3RhdHVzID09PSAxMiA/IGguZmF0YWxFcnJvciA6IHYzLCBGMiA9IGMyLnJlcGxheS5ub2RlcywgWCA9IGMyLnJlcGxheS5zbG90czsKICAgICAgICAgICAgICAgICAgZjIgPSBHMyh3MywgTTIsIEMpLCBZbCh3MywgeDMsIEYyLCBYLCBNMiwgZjIpLCBoLnBlbmRpbmdSb290VGFza3MtLSwgaC5wZW5kaW5nUm9vdFRhc2tzID09PSAwICYmIFV0KGgpLCBoLmFsbFBlbmRpbmdUYXNrcy0tLCBoLmFsbFBlbmRpbmdUYXNrcyA9PT0gMCAmJiB4ZTIoaCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGggPSB2b2lkIDAsIHczID0gbywgdzMuc3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgIHczLnN0YXR1cyA9IDYsIFNuKGMyLmNvbnRleHQpOwogICAgICAgICAgICB2YXIgbTIgPSB3My5jaGlsZHJlbi5sZW5ndGgsIGduID0gdzMuY2h1bmtzLmxlbmd0aDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBFdChmMiwgYzIpLCB3My5sYXN0UHVzaGVkVGV4dCAmJiB3My50ZXh0RW1iZWRkZWQgJiYgdzMuY2h1bmtzLnB1c2goZG4pLCBjMi5hYm9ydFNldC5kZWxldGUoYzIpLCB3My5zdGF0dXMgPSAxLCBsbChmMiwgYzIuYmxvY2tlZEJvdW5kYXJ5LCB3MyksIE1uKGYyLCBjMi5ibG9ja2VkQm91bmRhcnksIGMyLnJvdywgdzMpOwogICAgICAgICAgICB9IGNhdGNoIChfMikgewogICAgICAgICAgICAgIE5sKCksIHczLmNoaWxkcmVuLmxlbmd0aCA9IG0yLCB3My5jaHVua3MubGVuZ3RoID0gZ247CiAgICAgICAgICAgICAgdmFyIFQzID0gXzIgPT09ICQyID8geWUyKCkgOiBmMi5zdGF0dXMgPT09IDEyID8gZjIuZmF0YWxFcnJvciA6IF8yOwogICAgICAgICAgICAgIGlmIChmMi5zdGF0dXMgPT09IDEyICYmIGYyLnRyYWNrZWRQb3N0cG9uZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHZhciBjbiA9IGYyLnRyYWNrZWRQb3N0cG9uZXMsIG5uID0ga24oYzIuY29tcG9uZW50U3RhY2spOwogICAgICAgICAgICAgICAgYzIuYWJvcnRTZXQuZGVsZXRlKGMyKSwgRzMoZjIsIFQzLCBubiksIHh0KGYyLCBjbiwgYzIsIHczKSwgTW4oZjIsIGMyLmJsb2NrZWRCb3VuZGFyeSwgYzIucm93LCB3Myk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgVDMgPT0gIm9iamVjdCIgJiYgVDMgIT09IG51bGwgJiYgdHlwZW9mIFQzLnRoZW4gPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgdzMuc3RhdHVzID0gMCwgYzIudGhlbmFibGVTdGF0ZSA9IF8yID09PSAkMiA/ICRuKCkgOiBudWxsOwogICAgICAgICAgICAgICAgdmFyIFEgPSBjMi5waW5nOwogICAgICAgICAgICAgICAgVDMudGhlbihRLCBRKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHVuID0ga24oYzIuY29tcG9uZW50U3RhY2spOwogICAgICAgICAgICAgICAgYzIuYWJvcnRTZXQuZGVsZXRlKGMyKSwgdzMuc3RhdHVzID0gNDsKICAgICAgICAgICAgICAgIHZhciBBMyA9IGMyLmJsb2NrZWRCb3VuZGFyeSwgdm4gPSBjMi5yb3c7CiAgICAgICAgICAgICAgICBpZiAodm4gIT09IG51bGwgJiYgLS12bi5wZW5kaW5nVGFza3MgPT09IDAgJiYgWTIoZjIsIHZuKSwgZjIuYWxsUGVuZGluZ1Rhc2tzLS0sIGggPSBHMyhmMiwgVDMsIHVuKSwgQTMgPT09IG51bGwpIEhsKGYyLCBUMyk7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBMy5wZW5kaW5nVGFza3MtLSwgQTMuc3RhdHVzICE9PSA0KSB7CiAgICAgICAgICAgICAgICAgIEEzLnN0YXR1cyA9IDQsIEEzLmVycm9yRGlnZXN0ID0gaCwgSHQoZjIsIEEzKTsKICAgICAgICAgICAgICAgICAgdmFyIGxuID0gQTMucm93OwogICAgICAgICAgICAgICAgICBsbiAhPT0gbnVsbCAmJiAtLWxuLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBZMihmMiwgbG4pLCBBMy5wYXJlbnRGbHVzaGVkICYmIGYyLmNsaWVudFJlbmRlcmVkQm91bmRhcmllcy5wdXNoKEEzKSwgZjIucGVuZGluZ1Jvb3RUYXNrcyA9PT0gMCAmJiBmMi50cmFja2VkUG9zdHBvbmVzID09PSBudWxsICYmIEEzLmNvbnRlbnRQcmVhbWJsZSAhPT0gbnVsbCAmJiBYbChmMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmMi5hbGxQZW5kaW5nVGFza3MgPT09IDAgJiYgeGUyKGYyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYS5zcGxpY2UoMCwgdTIpLCBuMi5kZXN0aW5hdGlvbiAhPT0gbnVsbCAmJiBJZTIobjIsIG4yLmRlc3RpbmF0aW9uKTsKICAgICAgfSBjYXRjaCAoXzIpIHsKICAgICAgICBHMyhuMiwgXzIsIHt9KSwgSGwobjIsIF8yKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBmZSA9IGksIHFuLkggPSBlLCBxbi5BID0gdCwgZSA9PT0gcHIgJiYgU24obDMpLCBEMyA9IHI7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gcnQobjIsIGwzLCBlKSB7CiAgICBsMy5wcmVhbWJsZUNoaWxkcmVuLmxlbmd0aCAmJiBlLnB1c2gobDMucHJlYW1ibGVDaGlsZHJlbik7CiAgICBmb3IgKHZhciB0ID0gZmFsc2UsIHIgPSAwOyByIDwgbDMuY2hpbGRyZW4ubGVuZ3RoOyByKyspIHQgPSBRaShuMiwgbDMuY2hpbGRyZW5bcl0sIGUpIHx8IHQ7CiAgICByZXR1cm4gdDsKICB9CiAgZnVuY3Rpb24gUWkobjIsIGwzLCBlKSB7CiAgICB2YXIgdCA9IGwzLmJvdW5kYXJ5OwogICAgaWYgKHQgPT09IG51bGwpIHJldHVybiBydChuMiwgbDMsIGUpOwogICAgdmFyIHIgPSB0LmNvbnRlbnRQcmVhbWJsZSwgaSA9IHQuZmFsbGJhY2tQcmVhbWJsZTsKICAgIGlmIChyID09PSBudWxsIHx8IGkgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHN3aXRjaCAodC5zdGF0dXMpIHsKICAgICAgY2FzZSAxOgogICAgICAgIGlmIChHcihuMi5yZW5kZXJTdGF0ZSwgciksIG4yLmJ5dGVTaXplICs9IHQuYnl0ZVNpemUsIGwzID0gdC5jb21wbGV0ZWRTZWdtZW50c1swXSwgIWwzKSB0aHJvdyBFcnJvcih5MigzOTEpKTsKICAgICAgICByZXR1cm4gcnQobjIsIGwzLCBlKTsKICAgICAgY2FzZSA1OgogICAgICAgIGlmIChuMi50cmFja2VkUG9zdHBvbmVzICE9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgY2FzZSA0OgogICAgICAgIGlmIChsMy5zdGF0dXMgPT09IDEpIHJldHVybiBHcihuMi5yZW5kZXJTdGF0ZSwgaSksIHJ0KG4yLCBsMywgZSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIGZ1bmN0aW9uIFhsKG4yKSB7CiAgICBpZiAobjIuY29tcGxldGVkUm9vdFNlZ21lbnQgJiYgbjIuY29tcGxldGVkUHJlYW1ibGVTZWdtZW50cyA9PT0gbnVsbCkgewogICAgICB2YXIgbDMgPSBbXSwgZSA9IG4yLmJ5dGVTaXplLCB0ID0gUWkobjIsIG4yLmNvbXBsZXRlZFJvb3RTZWdtZW50LCBsMyksIHIgPSBuMi5yZW5kZXJTdGF0ZS5wcmVhbWJsZTsKICAgICAgdCA9PT0gZmFsc2UgfHwgci5oZWFkQ2h1bmtzICYmIHIuYm9keUNodW5rcyA/IG4yLmNvbXBsZXRlZFByZWFtYmxlU2VnbWVudHMgPSBsMyA6IG4yLmJ5dGVTaXplID0gZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gdGUobjIsIGwzLCBlLCB0KSB7CiAgICBzd2l0Y2ggKGUucGFyZW50Rmx1c2hlZCA9IHRydWUsIGUuc3RhdHVzKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBlLmlkID0gbjIubmV4dFNlZ21lbnRJZCsrOwogICAgICBjYXNlIDU6CiAgICAgICAgcmV0dXJuIHQgPSBlLmlkLCBlLmxhc3RQdXNoZWRUZXh0ID0gZmFsc2UsIGUudGV4dEVtYmVkZGVkID0gZmFsc2UsIG4yID0gbjIucmVuZGVyU3RhdGUsIGQzKGwzLCBxYSksIGQzKGwzLCBuMi5wbGFjZWhvbGRlclByZWZpeCksIG4yID0gcyh0LnRvU3RyaW5nKDE2KSksIGQzKGwzLCBuMiksIFMzKGwzLCBqYSk7CiAgICAgIGNhc2UgMToKICAgICAgICBlLnN0YXR1cyA9IDI7CiAgICAgICAgdmFyIHIgPSB0cnVlLCBpID0gZS5jaHVua3MsIGEgPSAwOwogICAgICAgIGUgPSBlLmNoaWxkcmVuOwogICAgICAgIGZvciAodmFyIHUyID0gMDsgdTIgPCBlLmxlbmd0aDsgdTIrKykgewogICAgICAgICAgZm9yIChyID0gZVt1Ml07IGEgPCByLmluZGV4OyBhKyspIGQzKGwzLCBpW2FdKTsKICAgICAgICAgIHIgPSBHbChuMiwgbDMsIHIsIHQpOwogICAgICAgIH0KICAgICAgICBmb3IgKDsgYSA8IGkubGVuZ3RoIC0gMTsgYSsrKSBkMyhsMywgaVthXSk7CiAgICAgICAgcmV0dXJuIGEgPCBpLmxlbmd0aCAmJiAociA9IFMzKGwzLCBpW2FdKSksIHI7CiAgICAgIGNhc2UgMzoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBFcnJvcih5MigzOTApKTsKICAgIH0KICB9CiAgdmFyIFVsID0gMDsKICBmdW5jdGlvbiBHbChuMiwgbDMsIGUsIHQpIHsKICAgIHZhciByID0gZS5ib3VuZGFyeTsKICAgIGlmIChyID09PSBudWxsKSByZXR1cm4gdGUobjIsIGwzLCBlLCB0KTsKICAgIGlmIChyLnBhcmVudEZsdXNoZWQgPSB0cnVlLCByLnN0YXR1cyA9PT0gNCkgewogICAgICB2YXIgaSA9IHIucm93OwogICAgICBpICE9PSBudWxsICYmIC0taS5wZW5kaW5nVGFza3MgPT09IDAgJiYgWTIobjIsIGkpLCByID0gci5lcnJvckRpZ2VzdCwgUzMobDMsIHRjKSwgZDMobDMsIGljKSwgciAmJiAoZDMobDMsIGNjKSwgZDMobDMsIHMoRTQocikpKSwgZDMobDMsIGFjKSksIFMzKGwzLCB1YyksIHRlKG4yLCBsMywgZSwgdCk7CiAgICB9IGVsc2UgaWYgKHIuc3RhdHVzICE9PSAxKSByLnN0YXR1cyA9PT0gMCAmJiAoci5yb290U2VnbWVudElEID0gbjIubmV4dFNlZ21lbnRJZCsrKSwgMCA8IHIuY29tcGxldGVkU2VnbWVudHMubGVuZ3RoICYmIG4yLnBhcnRpYWxCb3VuZGFyaWVzLnB1c2gociksIFlyKGwzLCBuMi5yZW5kZXJTdGF0ZSwgci5yb290U2VnbWVudElEKSwgdCAmJiB0bCh0LCByLmZhbGxiYWNrU3RhdGUpLCB0ZShuMiwgbDMsIGUsIHQpOwogICAgZWxzZSBpZiAoIW9lICYmIHJsKG4yLCByKSAmJiAoVWwgKyByLmJ5dGVTaXplID4gbjIucHJvZ3Jlc3NpdmVDaHVua1NpemUgfHwgTGkoci5jb250ZW50U3RhdGUpKSkgci5yb290U2VnbWVudElEID0gbjIubmV4dFNlZ21lbnRJZCsrLCBuMi5jb21wbGV0ZWRCb3VuZGFyaWVzLnB1c2gociksIFlyKGwzLCBuMi5yZW5kZXJTdGF0ZSwgci5yb290U2VnbWVudElEKSwgdGUobjIsIGwzLCBlLCB0KTsKICAgIGVsc2UgewogICAgICBpZiAoVWwgKz0gci5ieXRlU2l6ZSwgdCAmJiB0bCh0LCByLmNvbnRlbnRTdGF0ZSksIGUgPSByLnJvdywgZSAhPT0gbnVsbCAmJiBybChuMiwgcikgJiYgLS1lLnBlbmRpbmdUYXNrcyA9PT0gMCAmJiBZMihuMiwgZSksIFMzKGwzLCBuYyksIGUgPSByLmNvbXBsZXRlZFNlZ21lbnRzLCBlLmxlbmd0aCAhPT0gMSkgdGhyb3cgRXJyb3IoeTIoMzkxKSk7CiAgICAgIEdsKG4yLCBsMywgZVswXSwgdCk7CiAgICB9CiAgICByZXR1cm4gUzMobDMsIHJjKTsKICB9CiAgZnVuY3Rpb24gaXQobjIsIGwzLCBlLCB0KSB7CiAgICByZXR1cm4gSWMobDMsIG4yLnJlbmRlclN0YXRlLCBlLnBhcmVudEZvcm1hdENvbnRleHQsIGUuaWQpLCBHbChuMiwgbDMsIGUsIHQpLCBPYyhsMywgZS5wYXJlbnRGb3JtYXRDb250ZXh0KTsKICB9CiAgZnVuY3Rpb24gaWkobjIsIGwzLCBlKSB7CiAgICBVbCA9IGUuYnl0ZVNpemU7CiAgICBmb3IgKHZhciB0ID0gZS5jb21wbGV0ZWRTZWdtZW50cywgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSBWaShuMiwgbDMsIGUsIHRbcl0pOwogICAgdC5sZW5ndGggPSAwLCB0ID0gZS5yb3csIHQgIT09IG51bGwgJiYgcmwobjIsIGUpICYmIC0tdC5wZW5kaW5nVGFza3MgPT09IDAgJiYgWTIobjIsIHQpLCBJaShsMywgZS5jb250ZW50U3RhdGUsIG4yLnJlbmRlclN0YXRlKSwgdCA9IG4yLnJlc3VtYWJsZVN0YXRlLCBuMiA9IG4yLnJlbmRlclN0YXRlLCByID0gZS5yb290U2VnbWVudElELCBlID0gZS5jb250ZW50U3RhdGU7CiAgICB2YXIgaSA9IG4yLnN0eWxlc1RvSG9pc3Q7CiAgICByZXR1cm4gbjIuc3R5bGVzVG9Ib2lzdCA9IGZhbHNlLCBkMyhsMywgbjIuc3RhcnRJbmxpbmVTY3JpcHQpLCBkMyhsMywgSTIpLCBpID8gKCh0Lmluc3RydWN0aW9ucyAmIDQpID09PSAwICYmICh0Lmluc3RydWN0aW9ucyB8PSA0LCBkMyhsMywgWGMpKSwgKHQuaW5zdHJ1Y3Rpb25zICYgMikgPT09IDAgJiYgKHQuaW5zdHJ1Y3Rpb25zIHw9IDIsIGQzKGwzLCBYcikpLCAodC5pbnN0cnVjdGlvbnMgJiA4KSA9PT0gMCA/ICh0Lmluc3RydWN0aW9ucyB8PSA4LCBkMyhsMywgRGMpKSA6IGQzKGwzLCBIYykpIDogKCh0Lmluc3RydWN0aW9ucyAmIDIpID09PSAwICYmICh0Lmluc3RydWN0aW9ucyB8PSAyLCBkMyhsMywgWHIpKSwgZDMobDMsIHpjKSksIHQgPSBzKHIudG9TdHJpbmcoMTYpKSwgZDMobDMsIG4yLmJvdW5kYXJ5UHJlZml4KSwgZDMobDMsIHQpLCBkMyhsMywgV2MpLCBkMyhsMywgbjIuc2VnbWVudFByZWZpeCksIGQzKGwzLCB0KSwgaSA/IChkMyhsMywgVWMpLCBkdShsMywgZSkpIDogZDMobDMsIEdjKSwgZSA9IFMzKGwzLCBZYyksIE1pKGwzLCBuMikgJiYgZTsKICB9CiAgZnVuY3Rpb24gVmkobjIsIGwzLCBlLCB0KSB7CiAgICBpZiAodC5zdGF0dXMgPT09IDIpIHJldHVybiB0cnVlOwogICAgdmFyIHIgPSBlLmNvbnRlbnRTdGF0ZSwgaSA9IHQuaWQ7CiAgICBpZiAoaSA9PT0gLTEpIHsKICAgICAgaWYgKCh0LmlkID0gZS5yb290U2VnbWVudElEKSA9PT0gLTEpIHRocm93IEVycm9yKHkyKDM5MikpOwogICAgICByZXR1cm4gaXQobjIsIGwzLCB0LCByKTsKICAgIH0KICAgIHJldHVybiBpID09PSBlLnJvb3RTZWdtZW50SUQgPyBpdChuMiwgbDMsIHQsIHIpIDogKGl0KG4yLCBsMywgdCwgciksIGUgPSBuMi5yZXN1bWFibGVTdGF0ZSwgbjIgPSBuMi5yZW5kZXJTdGF0ZSwgZDMobDMsIG4yLnN0YXJ0SW5saW5lU2NyaXB0KSwgZDMobDMsIEkyKSwgKGUuaW5zdHJ1Y3Rpb25zICYgMSkgPT09IDAgPyAoZS5pbnN0cnVjdGlvbnMgfD0gMSwgZDMobDMsIF9jKSkgOiBkMyhsMywgTGMpLCBkMyhsMywgbjIuc2VnbWVudFByZWZpeCksIGkgPSBzKGkudG9TdHJpbmcoMTYpKSwgZDMobDMsIGkpLCBkMyhsMywgQmMpLCBkMyhsMywgbjIucGxhY2Vob2xkZXJQcmVmaXgpLCBkMyhsMywgaSksIGwzID0gUzMobDMsIE5jKSwgbDMpOwogIH0KICB2YXIgb2UgPSBmYWxzZTsKICBmdW5jdGlvbiBJZTIobjIsIGwzKSB7CiAgICBqMyA9IG5ldyBVaW50OEFycmF5KDIwNDgpLCBwMyA9IDA7CiAgICB0cnkgewogICAgICBpZiAoISgwIDwgbjIucGVuZGluZ1Jvb3RUYXNrcykpIHsKICAgICAgICB2YXIgZSwgdCA9IG4yLmNvbXBsZXRlZFJvb3RTZWdtZW50OwogICAgICAgIGlmICh0ICE9PSBudWxsKSB7CiAgICAgICAgICBpZiAodC5zdGF0dXMgPT09IDUpIHJldHVybjsKICAgICAgICAgIHZhciByID0gbjIuY29tcGxldGVkUHJlYW1ibGVTZWdtZW50czsKICAgICAgICAgIGlmIChyID09PSBudWxsKSByZXR1cm47CiAgICAgICAgICBVbCA9IG4yLmJ5dGVTaXplOwogICAgICAgICAgdmFyIGkgPSBuMi5yZXN1bWFibGVTdGF0ZSwgYSA9IG4yLnJlbmRlclN0YXRlLCB1MiA9IGEucHJlYW1ibGUsIGMyID0gdTIuaHRtbENodW5rcywgZjIgPSB1Mi5oZWFkQ2h1bmtzLCBvOwogICAgICAgICAgaWYgKGMyKSB7CiAgICAgICAgICAgIGZvciAobyA9IDA7IG8gPCBjMi5sZW5ndGg7IG8rKykgZDMobDMsIGMyW29dKTsKICAgICAgICAgICAgaWYgKGYyKSBmb3IgKG8gPSAwOyBvIDwgZjIubGVuZ3RoOyBvKyspIGQzKGwzLCBmMltvXSk7CiAgICAgICAgICAgIGVsc2UgZDMobDMsIEwyKCJoZWFkIikpLCBkMyhsMywgSTIpOwogICAgICAgICAgfSBlbHNlIGlmIChmMikgZm9yIChvID0gMDsgbyA8IGYyLmxlbmd0aDsgbysrKSBkMyhsMywgZjJbb10pOwogICAgICAgICAgdmFyIGggPSBhLmNoYXJzZXRDaHVua3M7CiAgICAgICAgICBmb3IgKG8gPSAwOyBvIDwgaC5sZW5ndGg7IG8rKykgZDMobDMsIGhbb10pOwogICAgICAgICAgaC5sZW5ndGggPSAwLCBhLnByZWNvbm5lY3RzLmZvckVhY2goaG4sIGwzKSwgYS5wcmVjb25uZWN0cy5jbGVhcigpOwogICAgICAgICAgdmFyIHYzID0gYS52aWV3cG9ydENodW5rczsKICAgICAgICAgIGZvciAobyA9IDA7IG8gPCB2My5sZW5ndGg7IG8rKykgZDMobDMsIHYzW29dKTsKICAgICAgICAgIHYzLmxlbmd0aCA9IDAsIGEuZm9udFByZWxvYWRzLmZvckVhY2goaG4sIGwzKSwgYS5mb250UHJlbG9hZHMuY2xlYXIoKSwgYS5oaWdoSW1hZ2VQcmVsb2Fkcy5mb3JFYWNoKGhuLCBsMyksIGEuaGlnaEltYWdlUHJlbG9hZHMuY2xlYXIoKSwgZWwgPSBhLCBhLnN0eWxlcy5mb3JFYWNoKGZ1LCBsMyksIGVsID0gbnVsbDsKICAgICAgICAgIHZhciBiNCA9IGEuaW1wb3J0TWFwQ2h1bmtzOwogICAgICAgICAgZm9yIChvID0gMDsgbyA8IGI0Lmxlbmd0aDsgbysrKSBkMyhsMywgYjRbb10pOwogICAgICAgICAgYjQubGVuZ3RoID0gMCwgYS5ib290c3RyYXBTY3JpcHRzLmZvckVhY2goaG4sIGwzKSwgYS5zY3JpcHRzLmZvckVhY2goaG4sIGwzKSwgYS5zY3JpcHRzLmNsZWFyKCksIGEuYnVsa1ByZWxvYWRzLmZvckVhY2goaG4sIGwzKSwgYS5idWxrUHJlbG9hZHMuY2xlYXIoKSwgYzIgfHwgZjIgfHwgKGkuaW5zdHJ1Y3Rpb25zIHw9IDMyKTsKICAgICAgICAgIHZhciBDID0gYS5ob2lzdGFibGVDaHVua3M7CiAgICAgICAgICBmb3IgKG8gPSAwOyBvIDwgQy5sZW5ndGg7IG8rKykgZDMobDMsIENbb10pOwogICAgICAgICAgZm9yIChpID0gQy5sZW5ndGggPSAwOyBpIDwgci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgdzMgPSByW2ldOwogICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgdzMubGVuZ3RoOyBhKyspIEdsKG4yLCBsMywgdzNbYV0sIG51bGwpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHgzID0gbjIucmVuZGVyU3RhdGUucHJlYW1ibGUsIE0yID0geDMuaGVhZENodW5rczsKICAgICAgICAgICh4My5odG1sQ2h1bmtzIHx8IE0yKSAmJiBkMyhsMywgR24oImhlYWQiKSk7CiAgICAgICAgICB2YXIgRjIgPSB4My5ib2R5Q2h1bmtzOwogICAgICAgICAgaWYgKEYyKSBmb3IgKHIgPSAwOyByIDwgRjIubGVuZ3RoOyByKyspIGQzKGwzLCBGMltyXSk7CiAgICAgICAgICBHbChuMiwgbDMsIHQsIG51bGwpLCBuMi5jb21wbGV0ZWRSb290U2VnbWVudCA9IG51bGw7CiAgICAgICAgICB2YXIgWCA9IG4yLnJlbmRlclN0YXRlOwogICAgICAgICAgaWYgKG4yLmFsbFBlbmRpbmdUYXNrcyAhPT0gMCB8fCBuMi5jbGllbnRSZW5kZXJlZEJvdW5kYXJpZXMubGVuZ3RoICE9PSAwIHx8IG4yLmNvbXBsZXRlZEJvdW5kYXJpZXMubGVuZ3RoICE9PSAwIHx8IG4yLnRyYWNrZWRQb3N0cG9uZXMgIT09IG51bGwgJiYgKG4yLnRyYWNrZWRQb3N0cG9uZXMucm9vdE5vZGVzLmxlbmd0aCAhPT0gMCB8fCBuMi50cmFja2VkUG9zdHBvbmVzLnJvb3RTbG90cyAhPT0gbnVsbCkpIHsKICAgICAgICAgICAgdmFyIG0yID0gbjIucmVzdW1hYmxlU3RhdGU7CiAgICAgICAgICAgIGlmICgobTIuaW5zdHJ1Y3Rpb25zICYgNjQpID09PSAwKSB7CiAgICAgICAgICAgICAgaWYgKG0yLmluc3RydWN0aW9ucyB8PSA2NCwgZDMobDMsIFguc3RhcnRJbmxpbmVTY3JpcHQpLCAobTIuaW5zdHJ1Y3Rpb25zICYgMzIpID09PSAwKSB7CiAgICAgICAgICAgICAgICBtMi5pbnN0cnVjdGlvbnMgfD0gMzI7CiAgICAgICAgICAgICAgICB2YXIgZ24gPSAiXyIgKyBtMi5pZFByZWZpeCArICJSXyI7CiAgICAgICAgICAgICAgICBkMyhsMywgX2kpLCBkMyhsMywgcyhFNChnbikpKSwgZDMobDMsIE8pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkMyhsMywgSTIpLCBkMyhsMywgbWEpLCBTMyhsMywgZGUyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgTWkobDMsIFgpOwogICAgICAgIH0KICAgICAgICB2YXIgVDMgPSBuMi5yZW5kZXJTdGF0ZTsKICAgICAgICB0ID0gMDsKICAgICAgICB2YXIgY24gPSBUMy52aWV3cG9ydENodW5rczsKICAgICAgICBmb3IgKHQgPSAwOyB0IDwgY24ubGVuZ3RoOyB0KyspIGQzKGwzLCBjblt0XSk7CiAgICAgICAgY24ubGVuZ3RoID0gMCwgVDMucHJlY29ubmVjdHMuZm9yRWFjaChobiwgbDMpLCBUMy5wcmVjb25uZWN0cy5jbGVhcigpLCBUMy5mb250UHJlbG9hZHMuZm9yRWFjaChobiwgbDMpLCBUMy5mb250UHJlbG9hZHMuY2xlYXIoKSwgVDMuaGlnaEltYWdlUHJlbG9hZHMuZm9yRWFjaChobiwgbDMpLCBUMy5oaWdoSW1hZ2VQcmVsb2Fkcy5jbGVhcigpLCBUMy5zdHlsZXMuZm9yRWFjaChodSwgbDMpLCBUMy5zY3JpcHRzLmZvckVhY2goaG4sIGwzKSwgVDMuc2NyaXB0cy5jbGVhcigpLCBUMy5idWxrUHJlbG9hZHMuZm9yRWFjaChobiwgbDMpLCBUMy5idWxrUHJlbG9hZHMuY2xlYXIoKTsKICAgICAgICB2YXIgbm4gPSBUMy5ob2lzdGFibGVDaHVua3M7CiAgICAgICAgZm9yICh0ID0gMDsgdCA8IG5uLmxlbmd0aDsgdCsrKSBkMyhsMywgbm5bdF0pOwogICAgICAgIG5uLmxlbmd0aCA9IDA7CiAgICAgICAgdmFyIFEgPSBuMi5jbGllbnRSZW5kZXJlZEJvdW5kYXJpZXM7CiAgICAgICAgZm9yIChlID0gMDsgZSA8IFEubGVuZ3RoOyBlKyspIHsKICAgICAgICAgIHZhciB1biA9IFFbZV07CiAgICAgICAgICBUMyA9IGwzOwogICAgICAgICAgdmFyIEEzID0gbjIucmVzdW1hYmxlU3RhdGUsIHZuID0gbjIucmVuZGVyU3RhdGUsIGxuID0gdW4ucm9vdFNlZ21lbnRJRCwgXzIgPSB1bi5lcnJvckRpZ2VzdDsKICAgICAgICAgIGQzKFQzLCB2bi5zdGFydElubGluZVNjcmlwdCksIGQzKFQzLCBJMiksIChBMy5pbnN0cnVjdGlvbnMgJiA0KSA9PT0gMCA/IChBMy5pbnN0cnVjdGlvbnMgfD0gNCwgZDMoVDMsIFpjKSkgOiBkMyhUMywgSmMpLCBkMyhUMywgdm4uYm91bmRhcnlQcmVmaXgpLCBkMyhUMywgcyhsbi50b1N0cmluZygxNikpKSwgZDMoVDMsIFFjKSwgXzIgJiYgKGQzKFQzLCBWYyksIGQzKFQzLCBzKHFjKF8yIHx8ICIiKSkpKTsKICAgICAgICAgIHZhciBWMiA9IFMzKFQzLCBLYyk7CiAgICAgICAgICBpZiAoIVYyKSB7CiAgICAgICAgICAgIG4yLmRlc3RpbmF0aW9uID0gbnVsbCwgZSsrLCBRLnNwbGljZSgwLCBlKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBRLnNwbGljZSgwLCBlKTsKICAgICAgICB2YXIgSW4gPSBuMi5jb21wbGV0ZWRCb3VuZGFyaWVzOwogICAgICAgIGZvciAoZSA9IDA7IGUgPCBJbi5sZW5ndGg7IGUrKykgaWYgKCFpaShuMiwgbDMsIEluW2VdKSkgewogICAgICAgICAgbjIuZGVzdGluYXRpb24gPSBudWxsLCBlKyssIEluLnNwbGljZSgwLCBlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgSW4uc3BsaWNlKDAsIGUpLCBxZTIobDMpLCBqMyA9IG5ldyBVaW50OEFycmF5KDIwNDgpLCBwMyA9IDAsIG9lID0gdHJ1ZTsKICAgICAgICB2YXIgT24gPSBuMi5wYXJ0aWFsQm91bmRhcmllczsKICAgICAgICBmb3IgKGUgPSAwOyBlIDwgT24ubGVuZ3RoOyBlKyspIHsKICAgICAgICAgIHZhciBibiA9IE9uW2VdOwogICAgICAgICAgbjogewogICAgICAgICAgICBRID0gbjIsIHVuID0gbDMsIFVsID0gYm4uYnl0ZVNpemU7CiAgICAgICAgICAgIHZhciBfbiA9IGJuLmNvbXBsZXRlZFNlZ21lbnRzOwogICAgICAgICAgICBmb3IgKFYyID0gMDsgVjIgPCBfbi5sZW5ndGg7IFYyKyspIGlmICghVmkoUSwgdW4sIGJuLCBfbltWMl0pKSB7CiAgICAgICAgICAgICAgVjIrKywgX24uc3BsaWNlKDAsIFYyKTsKICAgICAgICAgICAgICB2YXIgYWwgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhayBuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9uLnNwbGljZSgwLCBWMik7CiAgICAgICAgICAgIHZhciBzbiA9IGJuLnJvdzsKICAgICAgICAgICAgc24gIT09IG51bGwgJiYgc24udG9nZXRoZXIgJiYgYm4ucGVuZGluZ1Rhc2tzID09PSAxICYmIChzbi5wZW5kaW5nVGFza3MgPT09IDEgPyBEdChRLCBzbiwgc24uaG9pc3RhYmxlcykgOiBzbi5wZW5kaW5nVGFza3MtLSksIGFsID0gSWkodW4sIGJuLmNvbnRlbnRTdGF0ZSwgUS5yZW5kZXJTdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWFsKSB7CiAgICAgICAgICAgIG4yLmRlc3RpbmF0aW9uID0gbnVsbCwgZSsrLCBPbi5zcGxpY2UoMCwgZSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgT24uc3BsaWNlKDAsIGUpLCBvZSA9IGZhbHNlOwogICAgICAgIHZhciB4biA9IG4yLmNvbXBsZXRlZEJvdW5kYXJpZXM7CiAgICAgICAgZm9yIChlID0gMDsgZSA8IHhuLmxlbmd0aDsgZSsrKSBpZiAoIWlpKG4yLCBsMywgeG5bZV0pKSB7CiAgICAgICAgICBuMi5kZXN0aW5hdGlvbiA9IG51bGwsIGUrKywgeG4uc3BsaWNlKDAsIGUpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB4bi5zcGxpY2UoMCwgZSk7CiAgICAgIH0KICAgIH0gZmluYWxseSB7CiAgICAgIG9lID0gZmFsc2UsIG4yLmFsbFBlbmRpbmdUYXNrcyA9PT0gMCAmJiBuMi5jbGllbnRSZW5kZXJlZEJvdW5kYXJpZXMubGVuZ3RoID09PSAwICYmIG4yLmNvbXBsZXRlZEJvdW5kYXJpZXMubGVuZ3RoID09PSAwID8gKG4yLmZsdXNoU2NoZWR1bGVkID0gZmFsc2UsIGUgPSBuMi5yZXN1bWFibGVTdGF0ZSwgZS5oYXNCb2R5ICYmIGQzKGwzLCBHbigiYm9keSIpKSwgZS5oYXNIdG1sICYmIGQzKGwzLCBHbigiaHRtbCIpKSwgcWUyKGwzKSwgbjIuc3RhdHVzID0gMTQsIGwzLmNsb3NlKCksIG4yLmRlc3RpbmF0aW9uID0gbnVsbCkgOiBxZTIobDMpOwogICAgfQogIH0KICBmdW5jdGlvbiBPZTIobjIpIHsKICAgIG4yLmZsdXNoU2NoZWR1bGVkID0gbjIuZGVzdGluYXRpb24gIT09IG51bGwsIGJpKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gUnQobjIpOwogICAgfSksIGt0KGZ1bmN0aW9uKCkgewogICAgICBuMi5zdGF0dXMgPT09IDEwICYmIChuMi5zdGF0dXMgPSAxMSksIG4yLnRyYWNrZWRQb3N0cG9uZXMgPT09IG51bGwgJiYgV3QobjIsIG4yLnBlbmRpbmdSb290VGFza3MgPT09IDApOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIFhuKG4yKSB7CiAgICBuMi5mbHVzaFNjaGVkdWxlZCA9PT0gZmFsc2UgJiYgbjIucGluZ2VkVGFza3MubGVuZ3RoID09PSAwICYmIG4yLmRlc3RpbmF0aW9uICE9PSBudWxsICYmIChuMi5mbHVzaFNjaGVkdWxlZCA9IHRydWUsIGt0KGZ1bmN0aW9uKCkgewogICAgICB2YXIgbDMgPSBuMi5kZXN0aW5hdGlvbjsKICAgICAgbDMgPyBJZTIobjIsIGwzKSA6IG4yLmZsdXNoU2NoZWR1bGVkID0gZmFsc2U7CiAgICB9KSk7CiAgfQogIGZ1bmN0aW9uIF9lMihuMiwgbDMpIHsKICAgIGlmIChuMi5zdGF0dXMgPT09IDEzKSBuMi5zdGF0dXMgPSAxNCwgVGkobDMsIG4yLmZhdGFsRXJyb3IpOwogICAgZWxzZSBpZiAobjIuc3RhdHVzICE9PSAxNCAmJiBuMi5kZXN0aW5hdGlvbiA9PT0gbnVsbCkgewogICAgICBuMi5kZXN0aW5hdGlvbiA9IGwzOwogICAgICB0cnkgewogICAgICAgIEllMihuMiwgbDMpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgRzMobjIsIGUsIHt9KSwgSGwobjIsIGUpOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGFuKG4yLCBsMykgewogICAgKG4yLnN0YXR1cyA9PT0gMTEgfHwgbjIuc3RhdHVzID09PSAxMCkgJiYgKG4yLnN0YXR1cyA9IDEyKTsKICAgIHRyeSB7CiAgICAgIHZhciBlID0gbjIuYWJvcnRhYmxlVGFza3M7CiAgICAgIGlmICgwIDwgZS5zaXplKSB7CiAgICAgICAgdmFyIHQgPSBsMyA9PT0gdm9pZCAwID8gRXJyb3IoeTIoNDMyKSkgOiB0eXBlb2YgbDMgPT0gIm9iamVjdCIgJiYgbDMgIT09IG51bGwgJiYgdHlwZW9mIGwzLnRoZW4gPT0gImZ1bmN0aW9uIiA/IEVycm9yKHkyKDUzMCkpIDogbDM7CiAgICAgICAgbjIuZmF0YWxFcnJvciA9IHQsIGUuZm9yRWFjaChmdW5jdGlvbihyKSB7CiAgICAgICAgICByZXR1cm4gQ3QociwgbjIsIHQpOwogICAgICAgIH0pLCBlLmNsZWFyKCk7CiAgICAgIH0KICAgICAgbjIuZGVzdGluYXRpb24gIT09IG51bGwgJiYgSWUyKG4yLCBuMi5kZXN0aW5hdGlvbik7CiAgICB9IGNhdGNoIChyKSB7CiAgICAgIEczKG4yLCByLCB7fSksIEhsKG4yLCByKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gQ2UyKG4yLCBsMywgZSkgewogICAgaWYgKGwzID09PSBudWxsKSBlLnJvb3ROb2Rlcy5wdXNoKG4yKTsKICAgIGVsc2UgewogICAgICB2YXIgdCA9IGUud29ya2luZ01hcCwgciA9IHQuZ2V0KGwzKTsKICAgICAgciA9PT0gdm9pZCAwICYmIChyID0gWwogICAgICAgIGwzWzFdLAogICAgICAgIGwzWzJdLAogICAgICAgIFtdLAogICAgICAgIG51bGwKICAgICAgXSwgdC5zZXQobDMsIHIpLCBDZTIociwgbDNbMF0sIGUpKSwgclsyXS5wdXNoKG4yKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gS2kobjIpIHsKICAgIHZhciBsMyA9IG4yLnRyYWNrZWRQb3N0cG9uZXM7CiAgICBpZiAobDMgPT09IG51bGwgfHwgbDMucm9vdE5vZGVzLmxlbmd0aCA9PT0gMCAmJiBsMy5yb290U2xvdHMgPT09IG51bGwpIHJldHVybiBuMi50cmFja2VkUG9zdHBvbmVzID0gbnVsbDsKICAgIGlmIChuMi5jb21wbGV0ZWRSb290U2VnbWVudCA9PT0gbnVsbCB8fCBuMi5jb21wbGV0ZWRSb290U2VnbWVudC5zdGF0dXMgIT09IDUgJiYgbjIuY29tcGxldGVkUHJlYW1ibGVTZWdtZW50cyAhPT0gbnVsbCkgewogICAgICB2YXIgZSA9IG4yLm5leHRTZWdtZW50SWQsIHQgPSBsMy5yb290U2xvdHMsIHIgPSBuMi5yZXN1bWFibGVTdGF0ZTsKICAgICAgci5ib290c3RyYXBTY3JpcHRDb250ZW50ID0gdm9pZCAwLCByLmJvb3RzdHJhcFNjcmlwdHMgPSB2b2lkIDAsIHIuYm9vdHN0cmFwTW9kdWxlcyA9IHZvaWQgMDsKICAgIH0gZWxzZSB7CiAgICAgIGUgPSAwLCB0ID0gLTEsIHIgPSBuMi5yZXN1bWFibGVTdGF0ZTsKICAgICAgdmFyIGkgPSBuMi5yZW5kZXJTdGF0ZTsKICAgICAgci5uZXh0Rm9ybUlEID0gMCwgci5oYXNCb2R5ID0gZmFsc2UsIHIuaGFzSHRtbCA9IGZhbHNlLCByLnVua25vd25SZXNvdXJjZXMgPSB7CiAgICAgICAgZm9udDogaS5yZXNldHMuZm9udAogICAgICB9LCByLmRuc1Jlc291cmNlcyA9IGkucmVzZXRzLmRucywgci5jb25uZWN0UmVzb3VyY2VzID0gaS5yZXNldHMuY29ubmVjdCwgci5pbWFnZVJlc291cmNlcyA9IGkucmVzZXRzLmltYWdlLCByLnN0eWxlUmVzb3VyY2VzID0gaS5yZXNldHMuc3R5bGUsIHIuc2NyaXB0UmVzb3VyY2VzID0ge30sIHIubW9kdWxlVW5rbm93blJlc291cmNlcyA9IHt9LCByLm1vZHVsZVNjcmlwdFJlc291cmNlcyA9IHt9LCByLmluc3RydWN0aW9ucyA9IDA7CiAgICB9CiAgICByZXR1cm4gewogICAgICBuZXh0U2VnbWVudElkOiBlLAogICAgICByb290Rm9ybWF0Q29udGV4dDogbjIucm9vdEZvcm1hdENvbnRleHQsCiAgICAgIHByb2dyZXNzaXZlQ2h1bmtTaXplOiBuMi5wcm9ncmVzc2l2ZUNodW5rU2l6ZSwKICAgICAgcmVzdW1hYmxlU3RhdGU6IG4yLnJlc3VtYWJsZVN0YXRlLAogICAgICByZXBsYXlOb2RlczogbDMucm9vdE5vZGVzLAogICAgICByZXBsYXlTbG90czogdAogICAgfTsKICB9CiAgZnVuY3Rpb24gbWkoKSB7CiAgICB2YXIgbjIgPSBTdC52ZXJzaW9uOwogICAgaWYgKG4yICE9PSAiMTkuMi40IikgdGhyb3cgRXJyb3IoeTIoNTI3LCBuMiwgIjE5LjIuNCIpKTsKICB9CiAgbWkoKTsKICBtaSgpOwogIGlsLnByZXJlbmRlciA9IGZ1bmN0aW9uKG4yLCBsMykgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsIHQpIHsKICAgICAgdmFyIHIgPSBsMyA/IGwzLm9uSGVhZGVycyA6IHZvaWQgMCwgaTsKICAgICAgciAmJiAoaSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICByKG5ldyBIZWFkZXJzKG8pKTsKICAgICAgfSk7CiAgICAgIHZhciBhID0gd2kobDMgPyBsMy5pZGVudGlmaWVyUHJlZml4IDogdm9pZCAwLCBsMyA/IGwzLnVuc3RhYmxlX2V4dGVybmFsUnVudGltZVNyYyA6IHZvaWQgMCwgbDMgPyBsMy5ib290c3RyYXBTY3JpcHRDb250ZW50IDogdm9pZCAwLCBsMyA/IGwzLmJvb3RzdHJhcFNjcmlwdHMgOiB2b2lkIDAsIGwzID8gbDMuYm9vdHN0cmFwTW9kdWxlcyA6IHZvaWQgMCksIHUyID0gSHUobjIsIGEsIFBlMihhLCB2b2lkIDAsIGwzID8gbDMudW5zdGFibGVfZXh0ZXJuYWxSdW50aW1lU3JjIDogdm9pZCAwLCBsMyA/IGwzLmltcG9ydE1hcCA6IHZvaWQgMCwgaSwgbDMgPyBsMy5tYXhIZWFkZXJzTGVuZ3RoIDogdm9pZCAwKSwgeGkobDMgPyBsMy5uYW1lc3BhY2VVUkkgOiB2b2lkIDApLCBsMyA/IGwzLnByb2dyZXNzaXZlQ2h1bmtTaXplIDogdm9pZCAwLCBsMyA/IGwzLm9uRXJyb3IgOiB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBvID0gbmV3IFJlYWRhYmxlU3RyZWFtKHsKICAgICAgICAgIHR5cGU6ICJieXRlcyIsCiAgICAgICAgICBwdWxsOiBmdW5jdGlvbihoKSB7CiAgICAgICAgICAgIF9lMih1MiwgaCk7CiAgICAgICAgICB9LAogICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbihoKSB7CiAgICAgICAgICAgIHUyLmRlc3RpbmF0aW9uID0gbnVsbCwgYW4odTIsIGgpOwogICAgICAgICAgfQogICAgICAgIH0sIHsKICAgICAgICAgIGhpZ2hXYXRlck1hcms6IDAKICAgICAgICB9KTsKICAgICAgICBvID0gewogICAgICAgICAgcG9zdHBvbmVkOiBLaSh1MiksCiAgICAgICAgICBwcmVsdWRlOiBvCiAgICAgICAgfSwgZShvKTsKICAgICAgfSwgdm9pZCAwLCB2b2lkIDAsIHQsIGwzID8gbDMub25Qb3N0cG9uZSA6IHZvaWQgMCk7CiAgICAgIGlmIChsMyAmJiBsMy5zaWduYWwpIHsKICAgICAgICB2YXIgYzIgPSBsMy5zaWduYWw7CiAgICAgICAgaWYgKGMyLmFib3J0ZWQpIGFuKHUyLCBjMi5yZWFzb24pOwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIGYyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGFuKHUyLCBjMi5yZWFzb24pLCBjMi5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIGYyKTsKICAgICAgICAgIH07CiAgICAgICAgICBjMi5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsIGYyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgT2UyKHUyKTsKICAgIH0pOwogIH07CiAgaWwucmVuZGVyVG9SZWFkYWJsZVN0cmVhbSA9IGZ1bmN0aW9uKG4yLCBsMykgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsIHQpIHsKICAgICAgdmFyIHIsIGksIGEgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihiNCwgQykgewogICAgICAgIGkgPSBiNCwgciA9IEM7CiAgICAgIH0pLCB1MiA9IGwzID8gbDMub25IZWFkZXJzIDogdm9pZCAwLCBjMjsKICAgICAgdTIgJiYgKGMyID0gZnVuY3Rpb24oYjQpIHsKICAgICAgICB1MihuZXcgSGVhZGVycyhiNCkpOwogICAgICB9KTsKICAgICAgdmFyIGYyID0gd2kobDMgPyBsMy5pZGVudGlmaWVyUHJlZml4IDogdm9pZCAwLCBsMyA/IGwzLnVuc3RhYmxlX2V4dGVybmFsUnVudGltZVNyYyA6IHZvaWQgMCwgbDMgPyBsMy5ib290c3RyYXBTY3JpcHRDb250ZW50IDogdm9pZCAwLCBsMyA/IGwzLmJvb3RzdHJhcFNjcmlwdHMgOiB2b2lkIDAsIGwzID8gbDMuYm9vdHN0cmFwTW9kdWxlcyA6IHZvaWQgMCksIG8gPSBZaShuMiwgZjIsIFBlMihmMiwgbDMgPyBsMy5ub25jZSA6IHZvaWQgMCwgbDMgPyBsMy51bnN0YWJsZV9leHRlcm5hbFJ1bnRpbWVTcmMgOiB2b2lkIDAsIGwzID8gbDMuaW1wb3J0TWFwIDogdm9pZCAwLCBjMiwgbDMgPyBsMy5tYXhIZWFkZXJzTGVuZ3RoIDogdm9pZCAwKSwgeGkobDMgPyBsMy5uYW1lc3BhY2VVUkkgOiB2b2lkIDApLCBsMyA/IGwzLnByb2dyZXNzaXZlQ2h1bmtTaXplIDogdm9pZCAwLCBsMyA/IGwzLm9uRXJyb3IgOiB2b2lkIDAsIGksIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBiNCA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7CiAgICAgICAgICB0eXBlOiAiYnl0ZXMiLAogICAgICAgICAgcHVsbDogZnVuY3Rpb24oQykgewogICAgICAgICAgICBfZTIobywgQyk7CiAgICAgICAgICB9LAogICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbihDKSB7CiAgICAgICAgICAgIG8uZGVzdGluYXRpb24gPSBudWxsLCBhbihvLCBDKTsKICAgICAgICAgIH0KICAgICAgICB9LCB7CiAgICAgICAgICBoaWdoV2F0ZXJNYXJrOiAwCiAgICAgICAgfSk7CiAgICAgICAgYjQuYWxsUmVhZHkgPSBhLCBlKGI0KTsKICAgICAgfSwgZnVuY3Rpb24oYjQpIHsKICAgICAgICBhLmNhdGNoKGZ1bmN0aW9uKCkgewogICAgICAgIH0pLCB0KGI0KTsKICAgICAgfSwgciwgbDMgPyBsMy5vblBvc3Rwb25lIDogdm9pZCAwLCBsMyA/IGwzLmZvcm1TdGF0ZSA6IHZvaWQgMCk7CiAgICAgIGlmIChsMyAmJiBsMy5zaWduYWwpIHsKICAgICAgICB2YXIgaCA9IGwzLnNpZ25hbDsKICAgICAgICBpZiAoaC5hYm9ydGVkKSBhbihvLCBoLnJlYXNvbik7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgdjMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgYW4obywgaC5yZWFzb24pLCBoLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IiwgdjMpOwogICAgICAgICAgfTsKICAgICAgICAgIGguYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCB2Myk7CiAgICAgICAgfQogICAgICB9CiAgICAgIE9lMihvKTsKICAgIH0pOwogIH07CiAgaWwucmVzdW1lID0gZnVuY3Rpb24objIsIGwzLCBlKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCwgcikgewogICAgICB2YXIgaSwgYSwgdTIgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihoLCB2MykgewogICAgICAgIGEgPSBoLCBpID0gdjM7CiAgICAgIH0pLCBjMiA9IFhpKG4yLCBsMywgUGUyKGwzLnJlc3VtYWJsZVN0YXRlLCBlID8gZS5ub25jZSA6IHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgdm9pZCAwKSwgZSA/IGUub25FcnJvciA6IHZvaWQgMCwgYSwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGggPSBuZXcgUmVhZGFibGVTdHJlYW0oewogICAgICAgICAgdHlwZTogImJ5dGVzIiwKICAgICAgICAgIHB1bGw6IGZ1bmN0aW9uKHYzKSB7CiAgICAgICAgICAgIF9lMihjMiwgdjMpOwogICAgICAgICAgfSwKICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24odjMpIHsKICAgICAgICAgICAgYzIuZGVzdGluYXRpb24gPSBudWxsLCBhbihjMiwgdjMpOwogICAgICAgICAgfQogICAgICAgIH0sIHsKICAgICAgICAgIGhpZ2hXYXRlck1hcms6IDAKICAgICAgICB9KTsKICAgICAgICBoLmFsbFJlYWR5ID0gdTIsIHQoaCk7CiAgICAgIH0sIGZ1bmN0aW9uKGgpIHsKICAgICAgICB1Mi5jYXRjaChmdW5jdGlvbigpIHsKICAgICAgICB9KSwgcihoKTsKICAgICAgfSwgaSwgZSA/IGUub25Qb3N0cG9uZSA6IHZvaWQgMCk7CiAgICAgIGlmIChlICYmIGUuc2lnbmFsKSB7CiAgICAgICAgdmFyIGYyID0gZS5zaWduYWw7CiAgICAgICAgaWYgKGYyLmFib3J0ZWQpIGFuKGMyLCBmMi5yZWFzb24pOwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIG8gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgYW4oYzIsIGYyLnJlYXNvbiksIGYyLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0Iiwgbyk7CiAgICAgICAgICB9OwogICAgICAgICAgZjIuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCBvKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgT2UyKGMyKTsKICAgIH0pOwogIH07CiAgaWwucmVzdW1lQW5kUHJlcmVuZGVyID0gZnVuY3Rpb24objIsIGwzLCBlKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCwgcikgewogICAgICB2YXIgaSA9IFd1KG4yLCBsMywgUGUyKGwzLnJlc3VtYWJsZVN0YXRlLCB2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIHZvaWQgMCksIGUgPyBlLm9uRXJyb3IgOiB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBjMiA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7CiAgICAgICAgICB0eXBlOiAiYnl0ZXMiLAogICAgICAgICAgcHVsbDogZnVuY3Rpb24oZjIpIHsKICAgICAgICAgICAgX2UyKGksIGYyKTsKICAgICAgICAgIH0sCiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKGYyKSB7CiAgICAgICAgICAgIGkuZGVzdGluYXRpb24gPSBudWxsLCBhbihpLCBmMik7CiAgICAgICAgICB9CiAgICAgICAgfSwgewogICAgICAgICAgaGlnaFdhdGVyTWFyazogMAogICAgICAgIH0pOwogICAgICAgIGMyID0gewogICAgICAgICAgcG9zdHBvbmVkOiBLaShpKSwKICAgICAgICAgIHByZWx1ZGU6IGMyCiAgICAgICAgfSwgdChjMik7CiAgICAgIH0sIHZvaWQgMCwgdm9pZCAwLCByLCBlID8gZS5vblBvc3Rwb25lIDogdm9pZCAwKTsKICAgICAgaWYgKGUgJiYgZS5zaWduYWwpIHsKICAgICAgICB2YXIgYSA9IGUuc2lnbmFsOwogICAgICAgIGlmIChhLmFib3J0ZWQpIGFuKGksIGEucmVhc29uKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciB1MiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBhbihpLCBhLnJlYXNvbiksIGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCB1Mik7CiAgICAgICAgICB9OwogICAgICAgICAgYS5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsIHUyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgT2UyKGkpOwogICAgfSk7CiAgfTsKICBpbC52ZXJzaW9uID0gIjE5LjIuNCI7Cn0pOwp2YXIgTGUyID0gc2EocWkoKSk7CnZhciB7IHByZXJlbmRlcjogWHUsIHJlbmRlclRvUmVhZGFibGVTdHJlYW06IFp1LCByZXN1bWU6IEp1LCByZXN1bWVBbmRQcmVyZW5kZXI6IFF1LCB2ZXJzaW9uOiBWdSB9ID0gTGUyOwp2YXIgS3UgPSBMZTIuZGVmYXVsdCA/PyBMZTI7CgovLyBkZW5vOmh0dHBzOi8vZXNtLnNoL3JlYWN0LWRvbUAxOS4yLjQvWC1aR056YzNSNWNHVkFNeTR5TGpNS1pYSmxZV04wL2VzMjAyMi9zZXJ2ZXIubWpzCnZhciByZXF1aXJlNSA9IChuMikgPT4gewogIGNvbnN0IGUgPSAobTIpID0+IHR5cGVvZiBtMi5kZWZhdWx0IDwgInUiID8gbTIuZGVmYXVsdCA6IG0yLCBjMiA9IChtMikgPT4gT2JqZWN0LmFzc2lnbih7CiAgICBfX2VzTW9kdWxlOiB0cnVlCiAgfSwgbTIpOwogIHN3aXRjaCAobjIpIHsKICAgIGNhc2UgInJlYWN0LWRvbS9janMvcmVhY3QtZG9tLXNlcnZlci1sZWdhY3kuYnJvd3Nlci5wcm9kdWN0aW9uIjoKICAgICAgcmV0dXJuIGUocmVhY3RfZG9tX3NlcnZlcl9sZWdhY3lfYnJvd3Nlcl9wcm9kdWN0aW9uX2V4cG9ydHMpOwogICAgY2FzZSAicmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20tc2VydmVyLmJyb3dzZXIucHJvZHVjdGlvbiI6CiAgICAgIHJldHVybiBlKHJlYWN0X2RvbV9zZXJ2ZXJfYnJvd3Nlcl9wcm9kdWN0aW9uX2V4cG9ydHMpOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5lcnJvcignbW9kdWxlICInICsgbjIgKyAnIiBub3QgZm91bmQnKTsKICAgICAgcmV0dXJuIG51bGw7CiAgfQp9Owp2YXIgbDIgPSBPYmplY3QuY3JlYXRlOwp2YXIgYyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIHAyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKdmFyIHYyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7CnZhciBTMiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKdmFyIFQyID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKdmFyIG0gPSAoKGUpID0+IHR5cGVvZiByZXF1aXJlNSA8ICJ1IiA/IHJlcXVpcmU1IDogdHlwZW9mIFByb3h5IDwgInUiID8gbmV3IFByb3h5KGUsIHsKICBnZXQ6IChyLCBvKSA9PiAodHlwZW9mIHJlcXVpcmU1IDwgInUiID8gcmVxdWlyZTUgOiByKVtvXQp9KSA6IGUpKGZ1bmN0aW9uKGUpIHsKICBpZiAodHlwZW9mIHJlcXVpcmU1IDwgInUiKSByZXR1cm4gcmVxdWlyZTUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB0aHJvdyBFcnJvcignRHluYW1pYyByZXF1aXJlIG9mICInICsgZSArICciIGlzIG5vdCBzdXBwb3J0ZWQnKTsKfSk7CnZhciBqMiA9IChlLCByKSA9PiAoKSA9PiAociB8fCBlKChyID0gewogIGV4cG9ydHM6IHt9Cn0pLmV4cG9ydHMsIHIpLCByLmV4cG9ydHMpOwp2YXIgYjMgPSAoZSwgciwgbywgaSkgPT4gewogIGlmIChyICYmIHR5cGVvZiByID09ICJvYmplY3QiIHx8IHR5cGVvZiByID09ICJmdW5jdGlvbiIpIGZvciAobGV0IHQgb2YgdjIocikpICFUMi5jYWxsKGUsIHQpICYmIHQgIT09IG8gJiYgYyhlLCB0LCB7CiAgICBnZXQ6ICgpID0+IHJbdF0sCiAgICBlbnVtZXJhYmxlOiAhKGkgPSBwMihyLCB0KSkgfHwgaS5lbnVtZXJhYmxlCiAgfSk7CiAgcmV0dXJuIGU7Cn07CnZhciBmID0gKGUsIHIsIG8pID0+IChvID0gZSAhPSBudWxsID8gbDIoUzIoZSkpIDoge30sIGIzKHIgfHwgIWUgfHwgIWUuX19lc01vZHVsZSA/IGMobywgImRlZmF1bHQiLCB7CiAgdmFsdWU6IGUsCiAgZW51bWVyYWJsZTogdHJ1ZQp9KSA6IG8sIGUpKTsKdmFyIHUgPSBqMigocykgPT4gewogICJ1c2Ugc3RyaWN0IjsKICB2YXIgYSwgZDM7CiAgYSA9IG0oInJlYWN0LWRvbS9janMvcmVhY3QtZG9tLXNlcnZlci1sZWdhY3kuYnJvd3Nlci5wcm9kdWN0aW9uIiksIGQzID0gbSgicmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20tc2VydmVyLmJyb3dzZXIucHJvZHVjdGlvbiIpOwogIHMudmVyc2lvbiA9IGEudmVyc2lvbjsKICBzLnJlbmRlclRvU3RyaW5nID0gYS5yZW5kZXJUb1N0cmluZzsKICBzLnJlbmRlclRvU3RhdGljTWFya3VwID0gYS5yZW5kZXJUb1N0YXRpY01hcmt1cDsKICBzLnJlbmRlclRvUmVhZGFibGVTdHJlYW0gPSBkMy5yZW5kZXJUb1JlYWRhYmxlU3RyZWFtOwogIHMucmVzdW1lID0gZDMucmVzdW1lOwp9KTsKdmFyIG4gPSBmKHUoKSk7CnZhciB7IHZlcnNpb246IGszLCByZW5kZXJUb1N0cmluZzogTSwgcmVuZGVyVG9TdGF0aWNNYXJrdXA6IFIyLCByZW5kZXJUb1JlYWRhYmxlU3RyZWFtOiB3MiwgcmVzdW1lOiB4MiB9ID0gbjsKdmFyIEUzID0gbi5kZWZhdWx0ID8/IG47CgovLyBleHRlbnNpb25zL2V4dC1yZWFjdC1zc3Ivc3JjL3dvcmtlci1yZW5kZXJlci1zb3VyY2UudHMKdmFyIGNyZWF0ZUlzb2xhdGVkU3NyUmVuZGVyZXIgPSAoKSA9PiBPYmplY3QuZnJlZXplKHsKICBjcmVhdGVFbGVtZW50OiBoZSwKICByZW5kZXJUb1JlYWRhYmxlU3RyZWFtOiB3Mgp9KTsKZXhwb3J0IHsKICBjcmVhdGVJc29sYXRlZFNzclJlbmRlcmVyCn07Ci8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246CgpyZWFjdC9janMvcmVhY3QucHJvZHVjdGlvbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHJlYWN0LnByb2R1Y3Rpb24uanMKICAgKgogICAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCiovCi8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246CgpyZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5wcm9kdWN0aW9uLmpzOgogICgqKgogICAqIEBsaWNlbnNlIFJlYWN0CiAgICogcmVhY3QtZG9tLnByb2R1Y3Rpb24uanMKICAgKgogICAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCiovCi8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246CgpyZWFjdC1kb20vY2pzL3JlYWN0LWRvbS1zZXJ2ZXItbGVnYWN5LmJyb3dzZXIucHJvZHVjdGlvbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHJlYWN0LWRvbS1zZXJ2ZXItbGVnYWN5LmJyb3dzZXIucHJvZHVjdGlvbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4KICAgKgogICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKikKKi8KLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjoKCnJlYWN0LWRvbS9janMvcmVhY3QtZG9tLXNlcnZlci5icm93c2VyLnByb2R1Y3Rpb24uanM6CiAgKCoqCiAgICogQGxpY2Vuc2UgUmVhY3QKICAgKiByZWFjdC1kb20tc2VydmVyLmJyb3dzZXIucHJvZHVjdGlvbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4KICAgKgogICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKikKKi8K";
9
+ export const REACT_SSR_RENDERER_BUNDLE_SHA256 = "b672d38dac426ba86ce683829815da2d38d6a97028c696e24c44b9c75deafbaf";