{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\jsmind\\es6\\jsmind.js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\jsmind\\es6\\jsmind.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\babel.config.js","mtime":1733906004399},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:dmFyIF9kZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIikuZGVmYXVsdDsKdmFyIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyID0gcmVxdWlyZSgiRDovamVua2lucy93b3Jrc3BhY2UvZGF0YVNoYXJlLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlci5qcyIpLmRlZmF1bHQ7CnZhciBfY3JlYXRlQ2xhc3MgPSByZXF1aXJlKCJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIpLmRlZmF1bHQ7CnZhciBfY2xhc3NDYWxsQ2hlY2sgPSByZXF1aXJlKCJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIpLmRlZmF1bHQ7CnZhciBfdHlwZW9mID0gcmVxdWlyZSgiRDovamVua2lucy93b3Jrc3BhY2UvZGF0YVNoYXJlLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIikuZGVmYXVsdDsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmVycm9yLmNhdXNlLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuam9pbi5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubWFwLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29ydC5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5uYW1lLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5nbG9iYWwtdGhpcy5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3BsaXQuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZm9yLWVhY2guanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5tYXAuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL3dlYi5idG9hLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5jb25zdHJ1Y3Rvci5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24uc3RhY2suanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tZXhjZXB0aW9uLnRvLXN0cmluZy10YWcuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL3dlYi5zZWxmLmpzIik7Ci8qKgoqIEBsaWNlbnNlIEJTRC0zLUNsYXVzZQoqIEBjb3B5cmlnaHQgMjAxNC0yMDIzIGhpenpnZGV2QDE2My5jb20KKgoqIFByb2plY3QgSG9tZToKKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9oaXp6Z2Rldi9qc21pbmQvCiovCiFmdW5jdGlvbiAoZSwgdCkgewogICJvYmplY3QiID09ICh0eXBlb2YgZXhwb3J0cyA9PT0gInVuZGVmaW5lZCIgPyAidW5kZWZpbmVkIiA6IF90eXBlb2YoZXhwb3J0cykpICYmICJ1bmRlZmluZWQiICE9IHR5cGVvZiBtb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA9IHQoKSA6ICJmdW5jdGlvbiIgPT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKHQpIDogKGUgPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgZ2xvYmFsVGhpcyA/IGdsb2JhbFRoaXMgOiBlIHx8IHNlbGYpLmpzTWluZCA9IHQoKTsKfSh0aGlzLCBmdW5jdGlvbiAoKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgZSA9ICIwLjguNiI7CiAgImZ1bmN0aW9uIiAhPSB0eXBlb2YgU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoICYmIChTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPSBmdW5jdGlvbiAoZSkgewogICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgZS5sZW5ndGgpID09PSBlOwogIH0pOwogIHZhciB0ID0gewogICAgICBsZWZ0OiAtMSwKICAgICAgY2VudGVyOiAwLAogICAgICByaWdodDogMSwKICAgICAgb2Y6IGZ1bmN0aW9uIG9mKGUpIHsKICAgICAgICByZXR1cm4gZSAmJiAtMSAhPT0gZSAmJiAwICE9PSBlICYmIDEgIT09IGUgPyAiLTEiID09PSBlIHx8ICIwIiA9PT0gZSB8fCAiMSIgPT09IGUgPyBwYXJzZUludChlKSA6ICJsZWZ0IiA9PT0gZS50b0xvd2VyQ2FzZSgpID8gdGhpcy5sZWZ0IDogInJpZ2h0IiA9PT0gZS50b0xvd2VyQ2FzZSgpID8gdGhpcy5yaWdodCA6ICJjZW50ZXIiID09PSBlLnRvTG93ZXJDYXNlKCkgPyB0aGlzLmNlbnRlciA6IHZvaWQgMCA6IGU7CiAgICAgIH0KICAgIH0sCiAgICBpID0gewogICAgICBzaG93OiAxLAogICAgICByZXNpemU6IDIsCiAgICAgIGVkaXQ6IDMsCiAgICAgIHNlbGVjdDogNAogICAgfSwKICAgIG4gPSB7CiAgICAgIGRlYnVnOiAxLAogICAgICBpbmZvOiAyLAogICAgICB3YXJuOiAzLAogICAgICBlcnJvcjogNCwKICAgICAgZGlzYWJsZTogOQogICAgfTsKICB2YXIgbyA9IGZ1bmN0aW9uIG8oKSB7fTsKICB2YXIgcyA9ICJ1bmRlZmluZWQiID09IHR5cGVvZiBjb25zb2xlID8gewogICAgbGV2ZWw6IG8sCiAgICBsb2c6IG8sCiAgICBkZWJ1ZzogbywKICAgIGluZm86IG8sCiAgICB3YXJuOiBvLAogICAgZXJyb3I6IG8KICB9IDogewogICAgbGV2ZWw6IGZ1bmN0aW9uIGxldmVsKGUpIHsKICAgICAgcy5kZWJ1ZyA9IGUgPiBuLmRlYnVnID8gbyA6IGNvbnNvbGUuZGVidWc7CiAgICAgIHMuaW5mbyA9IGUgPiBuLmluZm8gPyBvIDogY29uc29sZS5pbmZvOwogICAgICBzLndhcm4gPSBlID4gbi53YXJuID8gbyA6IGNvbnNvbGUud2FybjsKICAgICAgcy5lcnJvciA9IGUgPiBuLmVycm9yID8gbyA6IGNvbnNvbGUuZXJyb3I7CiAgICB9LAogICAgbG9nOiBjb25zb2xlLmxvZywKICAgIGRlYnVnOiBjb25zb2xlLmRlYnVnLAogICAgaW5mbzogY29uc29sZS5pbmZvLAogICAgd2FybjogY29uc29sZS53YXJuLAogICAgZXJyb3I6IGNvbnNvbGUuZXJyb3IKICB9OwogIHZhciByID0gbmV3ICgvKiNfX1BVUkVfXyovX2NyZWF0ZUNsYXNzKGZ1bmN0aW9uIF9jbGFzcyhlKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBfY2xhc3MpOwogICAgICB0aGlzLncgPSBlLCB0aGlzLmQgPSBlLmRvY3VtZW50LCB0aGlzLmcgPSBmdW5jdGlvbiAoZSkgewogICAgICAgIHJldHVybiB0aGlzLmQuZ2V0RWxlbWVudEJ5SWQoZSk7CiAgICAgIH0sIHRoaXMuYyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZC5jcmVhdGVFbGVtZW50KGUpOwogICAgICB9LCB0aGlzLnQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgIGUuaGFzQ2hpbGROb2RlcygpID8gZS5maXJzdENoaWxkLm5vZGVWYWx1ZSA9IHQgOiBlLmFwcGVuZENoaWxkKHRoaXMuZC5jcmVhdGVUZXh0Tm9kZSh0KSk7CiAgICAgIH0sIHRoaXMuaCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gKGUuaW5uZXJIVE1MID0gIiIsIGUuYXBwZW5kQ2hpbGQodCkpIDogZS5pbm5lckhUTUwgPSB0OwogICAgICB9LCB0aGlzLmkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgIHJldHVybiAhIWUgJiYgIm9iamVjdCIgPT0gX3R5cGVvZihlKSAmJiAxID09PSBlLm5vZGVUeXBlICYmICJvYmplY3QiID09IF90eXBlb2YoZS5zdHlsZSkgJiYgIm9iamVjdCIgPT0gX3R5cGVvZihlLm93bmVyRG9jdW1lbnQpOwogICAgICB9LCB0aGlzLm9uID0gZnVuY3Rpb24gKGUsIHQsIGkpIHsKICAgICAgICBlLmFkZEV2ZW50TGlzdGVuZXIgPyBlLmFkZEV2ZW50TGlzdGVuZXIodCwgaSwgITEpIDogZS5hdHRhY2hFdmVudCgib24iICsgdCwgaSk7CiAgICAgIH07CiAgICB9KSkod2luZG93KSwKICAgIGEgPSB7CiAgICAgIGZpbGU6IHsKICAgICAgICByZWFkOiBmdW5jdGlvbiByZWFkKGUsIHQpIHsKICAgICAgICAgIHZhciBpID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgIGkub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmIHQodGhpcy5yZXN1bHQsIGUubmFtZSk7CiAgICAgICAgICB9LCBpLnJlYWRBc1RleHQoZSk7CiAgICAgICAgfSwKICAgICAgICBzYXZlOiBmdW5jdGlvbiBzYXZlKGUsIHQsIGkpIHsKICAgICAgICAgIHZhciBuOwogICAgICAgICAgaWYgKCJmdW5jdGlvbiIgPT0gdHlwZW9mIHIudy5CbG9iKSBuID0gbmV3IEJsb2IoW2VdLCB7CiAgICAgICAgICAgIHR5cGU6IHQKICAgICAgICAgIH0pO2Vsc2UgewogICAgICAgICAgICB2YXIgbyA9IG5ldyAoci53LkJsb2JCdWlsZGVyIHx8IHIudy5Nb3pCbG9iQnVpbGRlciB8fCByLncuV2ViS2l0QmxvYkJ1aWxkZXIgfHwgci53Lk1TQmxvYkJ1aWxkZXIpKCk7CiAgICAgICAgICAgIG8uYXBwZW5kKGUpLCBuID0gby5nZXRCbG9iKHQpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSBuYXZpZ2F0b3IubXNTYXZlQmxvYihuLCBpKTtlbHNlIHsKICAgICAgICAgICAgdmFyIHMgPSAoci53LlVSTCB8fCByLncud2Via2l0VVJMKS5jcmVhdGVPYmplY3RVUkwobiksCiAgICAgICAgICAgICAgYSA9IHIuYygiYSIpOwogICAgICAgICAgICBpZiAoImRvd25sb2FkIiBpbiBhKSB7CiAgICAgICAgICAgICAgYS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiIsIGEuaHJlZiA9IHMsIGEuZG93bmxvYWQgPSBpLCByLmQuYm9keS5hcHBlbmRDaGlsZChhKTsKICAgICAgICAgICAgICB2YXIgZCA9IHIuZC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTsKICAgICAgICAgICAgICBkLmluaXRFdmVudCgiY2xpY2siLCAhMCwgITApLCBhLmRpc3BhdGNoRXZlbnQoZCksIHIuZC5ib2R5LnJlbW92ZUNoaWxkKGEpOwogICAgICAgICAgICB9IGVsc2UgbG9jYXRpb24uaHJlZiA9IHM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBqc29uOiB7CiAgICAgICAganNvbjJzdHJpbmc6IGZ1bmN0aW9uIGpzb24yc3RyaW5nKGUpIHsKICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKTsKICAgICAgICB9LAogICAgICAgIHN0cmluZzJqc29uOiBmdW5jdGlvbiBzdHJpbmcyanNvbihlKSB7CiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShlKTsKICAgICAgICB9LAogICAgICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShlLCB0KSB7CiAgICAgICAgICBmb3IgKHZhciBpIGluIHQpIGkgaW4gZSA/ICJvYmplY3QiICE9IF90eXBlb2YoZVtpXSkgfHwgIltvYmplY3Qgb2JqZWN0XSIgIT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVbaV0pLnRvTG93ZXJDYXNlKCkgfHwgZVtpXS5sZW5ndGggPyBlW2ldID0gdFtpXSA6IGEuanNvbi5tZXJnZShlW2ldLCB0W2ldKSA6IGVbaV0gPSB0W2ldOwogICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgfQogICAgICB9LAogICAgICB1dWlkOiB7CiAgICAgICAgbmV3aWQ6IGZ1bmN0aW9uIG5ld2lkKCkgewogICAgICAgICAgcmV0dXJuIChuZXcgRGF0ZSgpLmdldFRpbWUoKS50b1N0cmluZygxNikgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMikpLnN1YnN0cmluZygyLCAxOCk7CiAgICAgICAgfQogICAgICB9LAogICAgICB0ZXh0OiB7CiAgICAgICAgaXNfZW1wdHk6IGZ1bmN0aW9uIGlzX2VtcHR5KGUpIHsKICAgICAgICAgIHJldHVybiAhZSB8fCAwID09IGUucmVwbGFjZSgvXHMqLywgIiIpLmxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBkID0gewogICAgICBjb250YWluZXI6ICIiLAogICAgICBlZGl0YWJsZTogITEsCiAgICAgIHRoZW1lOiBudWxsLAogICAgICBtb2RlOiAiZnVsbCIsCiAgICAgIHN1cHBvcnRfaHRtbDogITAsCiAgICAgIGxvZ19sZXZlbDogImluZm8iLAogICAgICB2aWV3OiB7CiAgICAgICAgZW5naW5lOiAiY2FudmFzIiwKICAgICAgICBlbmFibGVfZGV2aWNlX3BpeGVsX3JhdGlvOiAhMSwKICAgICAgICBobWFyZ2luOiAxMDAsCiAgICAgICAgdm1hcmdpbjogNTAsCiAgICAgICAgbGluZV93aWR0aDogMiwKICAgICAgICBsaW5lX2NvbG9yOiAiIzU1NSIsCiAgICAgICAgbGluZV9zdHlsZTogImN1cnZlZCIsCiAgICAgICAgZHJhZ2dhYmxlOiAhMSwKICAgICAgICBoaWRlX3Njcm9sbGJhcnNfd2hlbl9kcmFnZ2FibGU6ICExLAogICAgICAgIG5vZGVfb3ZlcmZsb3c6ICJoaWRkZW4iLAogICAgICAgIHpvb206IHsKICAgICAgICAgIG1pbjogLjUsCiAgICAgICAgICBtYXg6IDIuMSwKICAgICAgICAgIHN0ZXA6IC4xCiAgICAgICAgfSwKICAgICAgICBjdXN0b21fbm9kZV9yZW5kZXI6IG51bGwsCiAgICAgICAgZXhwYW5kZXJfc3R5bGU6ICJjaGFyIgogICAgICB9LAogICAgICBsYXlvdXQ6IHsKICAgICAgICBoc3BhY2U6IDMwLAogICAgICAgIHZzcGFjZTogMjAsCiAgICAgICAgcHNwYWNlOiAxMywKICAgICAgICBjb3VzaW5fc3BhY2U6IDAKICAgICAgfSwKICAgICAgZGVmYXVsdF9ldmVudF9oYW5kbGU6IHsKICAgICAgICBlbmFibGVfbW91c2Vkb3duX2hhbmRsZTogITAsCiAgICAgICAgZW5hYmxlX2NsaWNrX2hhbmRsZTogITAsCiAgICAgICAgZW5hYmxlX2RibGNsaWNrX2hhbmRsZTogITAsCiAgICAgICAgZW5hYmxlX21vdXNld2hlZWxfaGFuZGxlOiAhMAogICAgICB9LAogICAgICBzaG9ydGN1dDogewogICAgICAgIGVuYWJsZTogITAsCiAgICAgICAgaGFuZGxlczoge30sCiAgICAgICAgbWFwcGluZzogewogICAgICAgICAgYWRkY2hpbGQ6IFs0NSwgNDEwOV0sCiAgICAgICAgICBhZGRicm90aGVyOiAxMywKICAgICAgICAgIGVkaXRub2RlOiAxMTMsCiAgICAgICAgICBkZWxub2RlOiA0NiwKICAgICAgICAgIHRvZ2dsZTogMzIsCiAgICAgICAgICBsZWZ0OiAzNywKICAgICAgICAgIHVwOiAzOCwKICAgICAgICAgIHJpZ2h0OiAzOSwKICAgICAgICAgIGRvd246IDQwCiAgICAgICAgfQogICAgICB9LAogICAgICBwbHVnaW46IHt9CiAgICB9OwogIHZhciBsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIGwoZSwgdCwgaSwgbiwgbywgciwgYSwgZCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgbCk7CiAgICAgIGUgPyAibnVtYmVyIiA9PSB0eXBlb2YgdCA/ICh2b2lkIDAgPT09IGQgJiYgKGQgPSAhMCksIHRoaXMuaWQgPSBlLCB0aGlzLmluZGV4ID0gdCwgdGhpcy50b3BpYyA9IGksIHRoaXMuZGF0YSA9IG4gfHwge30sIHRoaXMuaXNyb290ID0gbywgdGhpcy5wYXJlbnQgPSByLCB0aGlzLmRpcmVjdGlvbiA9IGEsIHRoaXMuZXhwYW5kZWQgPSAhIWQsIHRoaXMuY2hpbGRyZW4gPSBbXSwgdGhpcy5fZGF0YSA9IHt9KSA6IHMuZXJyb3IoImludmFsaWQgbm9kZSBpbmRleCIpIDogcy5lcnJvcigiaW52YWxpZCBub2RlIGlkIik7CiAgICB9CiAgICByZXR1cm4gX2NyZWF0ZUNsYXNzKGwsIFt7CiAgICAgIGtleTogImdldF9sb2NhdGlvbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfbG9jYXRpb24oKSB7CiAgICAgICAgdmFyIGUgPSB0aGlzLl9kYXRhLnZpZXc7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHg6IGUuYWJzX3gsCiAgICAgICAgICB5OiBlLmFic195CiAgICAgICAgfTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRfc2l6ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfc2l6ZSgpIHsKICAgICAgICB2YXIgZSA9IHRoaXMuX2RhdGEudmlldzsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdzogZS53aWR0aCwKICAgICAgICAgIGg6IGUuaGVpZ2h0CiAgICAgICAgfTsKICAgICAgfQogICAgfV0sIFt7CiAgICAgIGtleTogImNvbXBhcmUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGFyZShlLCB0KSB7CiAgICAgICAgdmFyIGkgPSBlLmluZGV4LAogICAgICAgICAgbiA9IHQuaW5kZXg7CiAgICAgICAgcmV0dXJuIGkgPj0gMCAmJiBuID49IDAgPyBpIC0gbiA6IC0xID09IGkgJiYgLTEgPT0gbiA/IDAgOiAtMSA9PSBpID8gMSA6IC0xID09IG4gPyAtMSA6IDA7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiaW5oZXJpdGVkIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGluaGVyaXRlZChlLCB0KSB7CiAgICAgICAgaWYgKGUgJiYgdCkgewogICAgICAgICAgaWYgKGUuaWQgPT09IHQuaWQpIHJldHVybiAhMDsKICAgICAgICAgIGlmIChlLmlzcm9vdCkgcmV0dXJuICEwOwogICAgICAgICAgZm9yICh2YXIgaSA9IGUuaWQsIG4gPSB0OyAhbi5pc3Jvb3Q7KSBpZiAoKG4gPSBuLnBhcmVudCkuaWQgPT09IGkpIHJldHVybiAhMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICExOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImlzX25vZGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gaXNfbm9kZShlKSB7CiAgICAgICAgcmV0dXJuICEhZSAmJiBlIGluc3RhbmNlb2YgbDsKICAgICAgfQogICAgfV0pOwogIH0oKTsKICB2YXIgaCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBoKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgaCk7CiAgICAgIHRoaXMubmFtZSA9IG51bGwsIHRoaXMuYXV0aG9yID0gbnVsbCwgdGhpcy52ZXJzaW9uID0gbnVsbCwgdGhpcy5yb290ID0gbnVsbCwgdGhpcy5zZWxlY3RlZCA9IG51bGwsIHRoaXMubm9kZXMgPSB7fTsKICAgIH0KICAgIHJldHVybiBfY3JlYXRlQ2xhc3MoaCwgW3sKICAgICAga2V5OiAiZ2V0X25vZGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0X25vZGUoZSkgewogICAgICAgIHJldHVybiBlIGluIHRoaXMubm9kZXMgPyB0aGlzLm5vZGVzW2VdIDogKHMud2FybigidGhlIG5vZGVbaWQ9IiArIGUgKyAiXSBjYW4gbm90IGJlIGZvdW5kIiksIG51bGwpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNldF9yb290IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldF9yb290KGUsIHQsIGkpIHsKICAgICAgICByZXR1cm4gbnVsbCA9PSB0aGlzLnJvb3QgPyAodGhpcy5yb290ID0gbmV3IGwoZSwgMCwgdCwgaSwgITApLCB0aGlzLl9wdXRfbm9kZSh0aGlzLnJvb3QpLCB0aGlzLnJvb3QpIDogKHMuZXJyb3IoInJvb3Qgbm9kZSBpcyBhbHJlYWR5IGV4aXN0IiksIG51bGwpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImFkZF9ub2RlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZF9ub2RlKGUsIGksIG4sIG8sIHIsIGEsIGQpIHsKICAgICAgICBpZiAoIWwuaXNfbm9kZShlKSkgcmV0dXJuIHMuZXJyb3IoInRoZSBwYXJlbnRfbm9kZSAiICsgZSArICIgaXMgbm90IGEgbm9kZS4iKSwgbnVsbDsKICAgICAgICB2YXIgX2ggPSBuZXcgbChpLCBkIHx8IC0xLCBuLCBvLCAhMSwgZSwgZS5kaXJlY3Rpb24sIGEpOwogICAgICAgIHJldHVybiBlLmlzcm9vdCAmJiAoX2guZGlyZWN0aW9uID0gciB8fCB0LnJpZ2h0KSwgdGhpcy5fcHV0X25vZGUoX2gpID8gKGUuY2hpbGRyZW4ucHVzaChfaCksIHRoaXMuX3VwZGF0ZV9pbmRleChlKSkgOiAocy5lcnJvcigiZmFpbCwgdGhlIG5vZGUgaWQgJyIgKyBfaC5pZCArICInIGhhcyBiZWVuIGFscmVhZHkgZXhpc3QuIiksIF9oID0gbnVsbCksIF9oOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImluc2VydF9ub2RlX2JlZm9yZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRfbm9kZV9iZWZvcmUoZSwgdCwgaSwgbiwgbykgewogICAgICAgIGlmICghbC5pc19ub2RlKGUpKSByZXR1cm4gcy5lcnJvcigidGhlIG5vZGVfYmVmb3JlICIgKyBlICsgIiBpcyBub3QgYSBub2RlLiIpLCBudWxsOwogICAgICAgIHZhciByID0gZS5pbmRleCAtIC41OwogICAgICAgIHJldHVybiB0aGlzLmFkZF9ub2RlKGUucGFyZW50LCB0LCBpLCBuLCBvLCAhMCwgcik7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZ2V0X25vZGVfYmVmb3JlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldF9ub2RlX2JlZm9yZShlKSB7CiAgICAgICAgaWYgKCFsLmlzX25vZGUoZSkpIHsKICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRfbm9kZShlKTsKICAgICAgICAgIHJldHVybiB0ID8gdGhpcy5nZXRfbm9kZV9iZWZvcmUodCkgOiAocy5lcnJvcigidGhlIG5vZGVbaWQ9IiArIGUgKyAiXSBjYW4gbm90IGJlIGZvdW5kLiIpLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgaWYgKGUuaXNyb290KSByZXR1cm4gbnVsbDsKICAgICAgICB2YXIgaSA9IGUuaW5kZXggLSAyOwogICAgICAgIHJldHVybiBpID49IDAgPyBlLnBhcmVudC5jaGlsZHJlbltpXSA6IG51bGw7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiaW5zZXJ0X25vZGVfYWZ0ZXIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0X25vZGVfYWZ0ZXIoZSwgdCwgaSwgbiwgbykgewogICAgICAgIGlmICghbC5pc19ub2RlKGUpKSByZXR1cm4gcy5lcnJvcigidGhlIG5vZGVfYWZ0ZXIgIiArIGUgKyAiIGlzIG5vdCBhIG5vZGUuIiksIG51bGw7CiAgICAgICAgdmFyIHIgPSBlLmluZGV4ICsgLjU7CiAgICAgICAgcmV0dXJuIHRoaXMuYWRkX25vZGUoZS5wYXJlbnQsIHQsIGksIG4sIG8sICEwLCByKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRfbm9kZV9hZnRlciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfbm9kZV9hZnRlcihlKSB7CiAgICAgICAgaWYgKCFsLmlzX25vZGUoZSkpIHsKICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRfbm9kZShlKTsKICAgICAgICAgIHJldHVybiB0ID8gdGhpcy5nZXRfbm9kZV9hZnRlcih0KSA6IChzLmVycm9yKCJ0aGUgbm9kZVtpZD0iICsgZSArICJdIGNhbiBub3QgYmUgZm91bmQuIiksIG51bGwpOwogICAgICAgIH0KICAgICAgICBpZiAoZS5pc3Jvb3QpIHJldHVybiBudWxsOwogICAgICAgIHZhciBpID0gZS5pbmRleDsKICAgICAgICByZXR1cm4gZS5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoID4gaSA/IGUucGFyZW50LmNoaWxkcmVuW2ldIDogbnVsbDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJtb3ZlX25vZGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZV9ub2RlKGUsIHQsIGksIG4pIHsKICAgICAgICByZXR1cm4gbC5pc19ub2RlKGUpID8gKGkgfHwgKGkgPSBlLnBhcmVudC5pZCksIHRoaXMuX21vdmVfbm9kZShlLCB0LCBpLCBuKSkgOiAocy5lcnJvcigidGhlIHBhcmFtZXRlciBub2RlICIgKyBlICsgIiBpcyBub3QgYSBub2RlLiIpLCBudWxsKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfZmxvd19ub2RlX2RpcmVjdGlvbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZmxvd19ub2RlX2RpcmVjdGlvbihlLCB0KSB7CiAgICAgICAgdm9pZCAwID09PSB0ID8gdCA9IGUuZGlyZWN0aW9uIDogZS5kaXJlY3Rpb24gPSB0OwogICAgICAgIGZvciAodmFyIGkgPSBlLmNoaWxkcmVuLmxlbmd0aDsgaS0tOykgdGhpcy5fZmxvd19ub2RlX2RpcmVjdGlvbihlLmNoaWxkcmVuW2ldLCB0KTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfbW92ZV9ub2RlX2ludGVybmFsIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9tb3ZlX25vZGVfaW50ZXJuYWwoZSwgdCkgewogICAgICAgIGlmIChlICYmIHQpIGlmICgiX2xhc3RfIiA9PSB0KSBlLmluZGV4ID0gLTEsIHRoaXMuX3VwZGF0ZV9pbmRleChlLnBhcmVudCk7ZWxzZSBpZiAoIl9maXJzdF8iID09IHQpIGUuaW5kZXggPSAwLCB0aGlzLl91cGRhdGVfaW5kZXgoZS5wYXJlbnQpO2Vsc2UgewogICAgICAgICAgdmFyIGkgPSB0ID8gdGhpcy5nZXRfbm9kZSh0KSA6IG51bGw7CiAgICAgICAgICBudWxsICE9IGkgJiYgbnVsbCAhPSBpLnBhcmVudCAmJiBpLnBhcmVudC5pZCA9PSBlLnBhcmVudC5pZCAmJiAoZS5pbmRleCA9IGkuaW5kZXggLSAuNSwgdGhpcy5fdXBkYXRlX2luZGV4KGUucGFyZW50KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIl9tb3ZlX25vZGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gX21vdmVfbm9kZShlLCBpLCBuLCBvKSB7CiAgICAgICAgaWYgKGUgJiYgbikgewogICAgICAgICAgdmFyIHIgPSB0aGlzLmdldF9ub2RlKG4pOwogICAgICAgICAgaWYgKGwuaW5oZXJpdGVkKGUsIHIpKSByZXR1cm4gcy5lcnJvcigiY2FuIG5vdCBtb3ZlIGEgbm9kZSB0byBpdHMgY2hpbGRyZW4iKSwgbnVsbDsKICAgICAgICAgIGlmIChlLnBhcmVudC5pZCAhPSBuKSB7CiAgICAgICAgICAgIGZvciAodmFyIGEgPSBlLnBhcmVudC5jaGlsZHJlbiwgZCA9IGEubGVuZ3RoOyBkLS07KSBpZiAoYVtkXS5pZCA9PSBlLmlkKSB7CiAgICAgICAgICAgICAgYS5zcGxpY2UoZCwgMSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF90ID0gZS5wYXJlbnQ7CiAgICAgICAgICAgIGUucGFyZW50ID0gciwgci5jaGlsZHJlbi5wdXNoKGUpLCB0aGlzLl91cGRhdGVfaW5kZXgoX3QpOwogICAgICAgICAgfQogICAgICAgICAgZS5wYXJlbnQuaXNyb290ID8gbyA9PSB0LmxlZnQgPyBlLmRpcmVjdGlvbiA9IG8gOiBlLmRpcmVjdGlvbiA9IHQucmlnaHQgOiBlLmRpcmVjdGlvbiA9IGUucGFyZW50LmRpcmVjdGlvbiwgdGhpcy5fbW92ZV9ub2RlX2ludGVybmFsKGUsIGkpLCB0aGlzLl9mbG93X25vZGVfZGlyZWN0aW9uKGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmVfbm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVfbm9kZShlKSB7CiAgICAgICAgaWYgKCFsLmlzX25vZGUoZSkpIHJldHVybiBzLmVycm9yKCJ0aGUgcGFyYW1ldGVyIG5vZGUgIiArIGUgKyAiIGlzIG5vdCBhIG5vZGUuIiksICExOwogICAgICAgIGlmIChlLmlzcm9vdCkgcmV0dXJuIHMuZXJyb3IoImZhaWwsIGNhbiBub3QgcmVtb3ZlIHJvb3Qgbm9kZSIpLCAhMTsKICAgICAgICBudWxsICE9IHRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5zZWxlY3RlZC5pZCA9PSBlLmlkICYmICh0aGlzLnNlbGVjdGVkID0gbnVsbCk7CiAgICAgICAgZm9yICh2YXIgdCA9IGUuY2hpbGRyZW4sIGkgPSB0Lmxlbmd0aDsgaS0tOykgdGhpcy5yZW1vdmVfbm9kZSh0W2ldKTsKICAgICAgICB0Lmxlbmd0aCA9IDA7CiAgICAgICAgZm9yICh2YXIgbiA9IGUucGFyZW50LCBvID0gbi5jaGlsZHJlbiwgciA9IG8ubGVuZ3RoOyByLS07KSBpZiAob1tyXS5pZCA9PSBlLmlkKSB7CiAgICAgICAgICBvLnNwbGljZShyLCAxKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBhIGluIGRlbGV0ZSB0aGlzLm5vZGVzW2UuaWRdLCBlKSBkZWxldGUgZVthXTsKICAgICAgICByZXR1cm4gZSA9IG51bGwsIHRoaXMuX3VwZGF0ZV9pbmRleChuKSwgITA7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX3B1dF9ub2RlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9wdXRfbm9kZShlKSB7CiAgICAgICAgcmV0dXJuIGUuaWQgaW4gdGhpcy5ub2RlcyA/IChzLndhcm4oInRoZSBub2RlX2lkICciICsgZS5pZCArICInIGhhcyBiZWVuIGFscmVhZHkgZXhpc3QuIiksICExKSA6ICh0aGlzLm5vZGVzW2UuaWRdID0gZSwgITApOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIl91cGRhdGVfaW5kZXgiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZV9pbmRleChlKSB7CiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBsKSB7CiAgICAgICAgICBlLmNoaWxkcmVuLnNvcnQobC5jb21wYXJlKTsKICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5jaGlsZHJlbi5sZW5ndGg7IHQrKykgZS5jaGlsZHJlblt0XS5pbmRleCA9IHQgKyAxOwogICAgICAgIH0KICAgICAgfQogICAgfV0pOwogIH0oKTsKICB2YXIgXyA9IHsKICAgICAgbmFtZTogImpzTWluZCIsCiAgICAgIGF1dGhvcjogImhpenpnZGV2QDE2My5jb20iLAogICAgICB2ZXJzaW9uOiBlCiAgICB9LAogICAgdSA9IHsKICAgICAgbm9kZV90cmVlOiB7CiAgICAgICAgZXhhbXBsZTogewogICAgICAgICAgbWV0YTogXywKICAgICAgICAgIGZvcm1hdDogIm5vZGVfdHJlZSIsCiAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgIGlkOiAicm9vdCIsCiAgICAgICAgICAgIHRvcGljOiAianNNaW5kIG5vZGVfdHJlZSBleGFtcGxlIgogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZ2V0X21pbmQ6IGZ1bmN0aW9uIGdldF9taW5kKGUpIHsKICAgICAgICAgIHZhciB0ID0gdS5ub2RlX3RyZWUsCiAgICAgICAgICAgIGkgPSBuZXcgaCgpOwogICAgICAgICAgcmV0dXJuIGkubmFtZSA9IGUubWV0YS5uYW1lLCBpLmF1dGhvciA9IGUubWV0YS5hdXRob3IsIGkudmVyc2lvbiA9IGUubWV0YS52ZXJzaW9uLCB0Ll9wYXJzZShpLCBlLmRhdGEpLCBpOwogICAgICAgIH0sCiAgICAgICAgZ2V0X2RhdGE6IGZ1bmN0aW9uIGdldF9kYXRhKGUpIHsKICAgICAgICAgIHZhciB0ID0gdS5ub2RlX3RyZWUsCiAgICAgICAgICAgIGkgPSB7fTsKICAgICAgICAgIHJldHVybiBpLm1ldGEgPSB7CiAgICAgICAgICAgIG5hbWU6IGUubmFtZSwKICAgICAgICAgICAgYXV0aG9yOiBlLmF1dGhvciwKICAgICAgICAgICAgdmVyc2lvbjogZS52ZXJzaW9uCiAgICAgICAgICB9LCBpLmZvcm1hdCA9ICJub2RlX3RyZWUiLCBpLmRhdGEgPSB0Ll9idWlsZF9ub2RlKGUucm9vdCksIGk7CiAgICAgICAgfSwKICAgICAgICBfcGFyc2U6IGZ1bmN0aW9uIF9wYXJzZShlLCB0KSB7CiAgICAgICAgICB2YXIgaSA9IHUubm9kZV90cmVlLAogICAgICAgICAgICBuID0gaS5fZXh0cmFjdF9kYXRhKHQpOwogICAgICAgICAgaWYgKGUuc2V0X3Jvb3QodC5pZCwgdC50b3BpYywgbiksICJjaGlsZHJlbiIgaW4gdCkgZm9yICh2YXIgbyA9IHQuY2hpbGRyZW4sIHMgPSAwOyBzIDwgby5sZW5ndGg7IHMrKykgaS5fZXh0cmFjdF9zdWJub2RlKGUsIGUucm9vdCwgb1tzXSk7CiAgICAgICAgfSwKICAgICAgICBfZXh0cmFjdF9kYXRhOiBmdW5jdGlvbiBfZXh0cmFjdF9kYXRhKGUpIHsKICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICBmb3IgKHZhciBpIGluIGUpICJpZCIgIT0gaSAmJiAidG9waWMiICE9IGkgJiYgImNoaWxkcmVuIiAhPSBpICYmICJkaXJlY3Rpb24iICE9IGkgJiYgImV4cGFuZGVkIiAhPSBpICYmICh0W2ldID0gZVtpXSk7CiAgICAgICAgICByZXR1cm4gdDsKICAgICAgICB9LAogICAgICAgIF9leHRyYWN0X3N1Ym5vZGU6IGZ1bmN0aW9uIF9leHRyYWN0X3N1Ym5vZGUoZSwgaSwgbikgewogICAgICAgICAgdmFyIG8gPSB1Lm5vZGVfdHJlZSwKICAgICAgICAgICAgcyA9IG8uX2V4dHJhY3RfZGF0YShuKSwKICAgICAgICAgICAgciA9IG51bGw7CiAgICAgICAgICBpLmlzcm9vdCAmJiAociA9ICJsZWZ0IiA9PSBuLmRpcmVjdGlvbiA/IHQubGVmdCA6IHQucmlnaHQpOwogICAgICAgICAgdmFyIGEgPSBlLmFkZF9ub2RlKGksIG4uaWQsIG4udG9waWMsIHMsIHIsIG4uZXhwYW5kZWQpOwogICAgICAgICAgaWYgKG4uY2hpbGRyZW4pIGZvciAodmFyIGQgPSBuLmNoaWxkcmVuLCBsID0gMDsgbCA8IGQubGVuZ3RoOyBsKyspIG8uX2V4dHJhY3Rfc3Vibm9kZShlLCBhLCBkW2xdKTsKICAgICAgICB9LAogICAgICAgIF9idWlsZF9ub2RlOiBmdW5jdGlvbiBfYnVpbGRfbm9kZShlKSB7CiAgICAgICAgICB2YXIgaSA9IHUubm9kZV90cmVlOwogICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBsKSB7CiAgICAgICAgICAgIHZhciBuID0gewogICAgICAgICAgICAgIGlkOiBlLmlkLAogICAgICAgICAgICAgIHRvcGljOiBlLnRvcGljLAogICAgICAgICAgICAgIGV4cGFuZGVkOiBlLmV4cGFuZGVkCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChlLnBhcmVudCAmJiBlLnBhcmVudC5pc3Jvb3QgJiYgKG4uZGlyZWN0aW9uID0gZS5kaXJlY3Rpb24gPT0gdC5sZWZ0ID8gImxlZnQiIDogInJpZ2h0IiksIG51bGwgIT0gZS5kYXRhKSB7CiAgICAgICAgICAgICAgdmFyIG8gPSBlLmRhdGE7CiAgICAgICAgICAgICAgZm9yICh2YXIgcyBpbiBvKSBuW3NdID0gb1tzXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgciA9IGUuY2hpbGRyZW47CiAgICAgICAgICAgIGlmIChyLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBuLmNoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCByLmxlbmd0aDsgYSsrKSBuLmNoaWxkcmVuLnB1c2goaS5fYnVpbGRfbm9kZShyW2FdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBub2RlX2FycmF5OiB7CiAgICAgICAgZXhhbXBsZTogewogICAgICAgICAgbWV0YTogXywKICAgICAgICAgIGZvcm1hdDogIm5vZGVfYXJyYXkiLAogICAgICAgICAgZGF0YTogW3sKICAgICAgICAgICAgaWQ6ICJyb290IiwKICAgICAgICAgICAgdG9waWM6ICJqc01pbmQgbm9kZV9hcnJheSBleGFtcGxlIiwKICAgICAgICAgICAgaXNyb290OiAhMAogICAgICAgICAgfV0KICAgICAgICB9LAogICAgICAgIGdldF9taW5kOiBmdW5jdGlvbiBnZXRfbWluZChlKSB7CiAgICAgICAgICB2YXIgdCA9IHUubm9kZV9hcnJheSwKICAgICAgICAgICAgaSA9IG5ldyBoKCk7CiAgICAgICAgICByZXR1cm4gaS5uYW1lID0gZS5tZXRhLm5hbWUsIGkuYXV0aG9yID0gZS5tZXRhLmF1dGhvciwgaS52ZXJzaW9uID0gZS5tZXRhLnZlcnNpb24sIHQuX3BhcnNlKGksIGUuZGF0YSksIGk7CiAgICAgICAgfSwKICAgICAgICBnZXRfZGF0YTogZnVuY3Rpb24gZ2V0X2RhdGEoZSkgewogICAgICAgICAgdmFyIHQgPSB1Lm5vZGVfYXJyYXksCiAgICAgICAgICAgIGkgPSB7fTsKICAgICAgICAgIHJldHVybiBpLm1ldGEgPSB7CiAgICAgICAgICAgIG5hbWU6IGUubmFtZSwKICAgICAgICAgICAgYXV0aG9yOiBlLmF1dGhvciwKICAgICAgICAgICAgdmVyc2lvbjogZS52ZXJzaW9uCiAgICAgICAgICB9LCBpLmZvcm1hdCA9ICJub2RlX2FycmF5IiwgaS5kYXRhID0gW10sIHQuX2FycmF5KGUsIGkuZGF0YSksIGk7CiAgICAgICAgfSwKICAgICAgICBfcGFyc2U6IGZ1bmN0aW9uIF9wYXJzZShlLCB0KSB7CiAgICAgICAgICB2YXIgaSA9IHUubm9kZV9hcnJheSwKICAgICAgICAgICAgbiA9IHQuc2xpY2UoMCk7CiAgICAgICAgICBuLnJldmVyc2UoKTsKICAgICAgICAgIHZhciBvID0gaS5fZXh0cmFjdF9yb290KGUsIG4pOwogICAgICAgICAgbyA/IGkuX2V4dHJhY3Rfc3Vibm9kZShlLCBvLCBuKSA6IHMuZXJyb3IoInJvb3Qgbm9kZSBjYW4gbm90IGJlIGZvdW5kIik7CiAgICAgICAgfSwKICAgICAgICBfZXh0cmFjdF9yb290OiBmdW5jdGlvbiBfZXh0cmFjdF9yb290KGUsIHQpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSB1Lm5vZGVfYXJyYXksIG4gPSB0Lmxlbmd0aDsgbi0tOykgaWYgKCJpc3Jvb3QiIGluIHRbbl0gJiYgdFtuXS5pc3Jvb3QpIHsKICAgICAgICAgICAgdmFyIG8gPSB0W25dLAogICAgICAgICAgICAgIHMgPSBpLl9leHRyYWN0X2RhdGEobyksCiAgICAgICAgICAgICAgciA9IGUuc2V0X3Jvb3Qoby5pZCwgby50b3BpYywgcyk7CiAgICAgICAgICAgIHJldHVybiB0LnNwbGljZShuLCAxKSwgcjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCiAgICAgICAgX2V4dHJhY3Rfc3Vibm9kZTogZnVuY3Rpb24gX2V4dHJhY3Rfc3Vibm9kZShlLCBpLCBuKSB7CiAgICAgICAgICBmb3IgKHZhciBvID0gdS5ub2RlX2FycmF5LCBzID0gbi5sZW5ndGgsIHIgPSBudWxsLCBhID0gbnVsbCwgZCA9IDA7IHMtLTspIGlmICgociA9IG5bc10pLnBhcmVudGlkID09IGkuaWQpIHsKICAgICAgICAgICAgYSA9IG8uX2V4dHJhY3RfZGF0YShyKTsKICAgICAgICAgICAgdmFyIGwgPSBudWxsLAogICAgICAgICAgICAgIGggPSByLmRpcmVjdGlvbjsKICAgICAgICAgICAgaCAmJiAobCA9ICJsZWZ0IiA9PSBoID8gdC5sZWZ0IDogdC5yaWdodCk7CiAgICAgICAgICAgIHZhciBfID0gZS5hZGRfbm9kZShpLCByLmlkLCByLnRvcGljLCBhLCBsLCByLmV4cGFuZGVkKTsKICAgICAgICAgICAgbi5zcGxpY2UocywgMSksIGQrKzsKICAgICAgICAgICAgdmFyIGMgPSBvLl9leHRyYWN0X3N1Ym5vZGUoZSwgXywgbik7CiAgICAgICAgICAgIGMgPiAwICYmIChzID0gbi5sZW5ndGgsIGQgKz0gYyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZDsKICAgICAgICB9LAogICAgICAgIF9leHRyYWN0X2RhdGE6IGZ1bmN0aW9uIF9leHRyYWN0X2RhdGEoZSkgewogICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgIGZvciAodmFyIGkgaW4gZSkgImlkIiAhPSBpICYmICJ0b3BpYyIgIT0gaSAmJiAicGFyZW50aWQiICE9IGkgJiYgImlzcm9vdCIgIT0gaSAmJiAiZGlyZWN0aW9uIiAhPSBpICYmICJleHBhbmRlZCIgIT0gaSAmJiAodFtpXSA9IGVbaV0pOwogICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgfSwKICAgICAgICBfYXJyYXk6IGZ1bmN0aW9uIF9hcnJheShlLCB0KSB7CiAgICAgICAgICB1Lm5vZGVfYXJyYXkuX2FycmF5X25vZGUoZS5yb290LCB0KTsKICAgICAgICB9LAogICAgICAgIF9hcnJheV9ub2RlOiBmdW5jdGlvbiBfYXJyYXlfbm9kZShlLCBpKSB7CiAgICAgICAgICB2YXIgbiA9IHUubm9kZV9hcnJheTsKICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgbCkgewogICAgICAgICAgICB2YXIgbyA9IHsKICAgICAgICAgICAgICBpZDogZS5pZCwKICAgICAgICAgICAgICB0b3BpYzogZS50b3BpYywKICAgICAgICAgICAgICBleHBhbmRlZDogZS5leHBhbmRlZAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoZS5wYXJlbnQgJiYgKG8ucGFyZW50aWQgPSBlLnBhcmVudC5pZCksIGUuaXNyb290ICYmIChvLmlzcm9vdCA9ICEwKSwgZS5wYXJlbnQgJiYgZS5wYXJlbnQuaXNyb290ICYmIChvLmRpcmVjdGlvbiA9IGUuZGlyZWN0aW9uID09IHQubGVmdCA/ICJsZWZ0IiA6ICJyaWdodCIpLCBudWxsICE9IGUuZGF0YSkgewogICAgICAgICAgICAgIHZhciBzID0gZS5kYXRhOwogICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gcykgb1tyXSA9IHNbcl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaS5wdXNoKG8pOwogICAgICAgICAgICBmb3IgKHZhciBhID0gZS5jaGlsZHJlbi5sZW5ndGgsIGQgPSAwOyBkIDwgYTsgZCsrKSBuLl9hcnJheV9ub2RlKGUuY2hpbGRyZW5bZF0sIGkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgZnJlZW1pbmQ6IHsKICAgICAgICBleGFtcGxlOiB7CiAgICAgICAgICBtZXRhOiBfLAogICAgICAgICAgZm9ybWF0OiAiZnJlZW1pbmQiLAogICAgICAgICAgZGF0YTogJzxtYXAgdmVyc2lvbj0iMS4wLjEiPjxub2RlIElEPSJyb290IiBURVhUPSJqc01pbmQgZnJlZW1pbmQgZXhhbXBsZSIvPjwvbWFwPicKICAgICAgICB9LAogICAgICAgIGdldF9taW5kOiBmdW5jdGlvbiBnZXRfbWluZChlKSB7CiAgICAgICAgICB2YXIgdCA9IHUuZnJlZW1pbmQsCiAgICAgICAgICAgIGkgPSBuZXcgaCgpOwogICAgICAgICAgaS5uYW1lID0gZS5tZXRhLm5hbWUsIGkuYXV0aG9yID0gZS5tZXRhLmF1dGhvciwgaS52ZXJzaW9uID0gZS5tZXRhLnZlcnNpb247CiAgICAgICAgICB2YXIgbiA9IGUuZGF0YSwKICAgICAgICAgICAgbyA9IHQuX3BhcnNlX3htbChuKSwKICAgICAgICAgICAgcyA9IHQuX2ZpbmRfcm9vdChvKTsKICAgICAgICAgIHJldHVybiB0Ll9sb2FkX25vZGUoaSwgbnVsbCwgcyksIGk7CiAgICAgICAgfSwKICAgICAgICBnZXRfZGF0YTogZnVuY3Rpb24gZ2V0X2RhdGEoZSkgewogICAgICAgICAgdmFyIHQgPSB1LmZyZWVtaW5kLAogICAgICAgICAgICBpID0ge307CiAgICAgICAgICBpLm1ldGEgPSB7CiAgICAgICAgICAgIG5hbWU6IGUubmFtZSwKICAgICAgICAgICAgYXV0aG9yOiBlLmF1dGhvciwKICAgICAgICAgICAgdmVyc2lvbjogZS52ZXJzaW9uCiAgICAgICAgICB9LCBpLmZvcm1hdCA9ICJmcmVlbWluZCI7CiAgICAgICAgICB2YXIgbiA9IFtdOwogICAgICAgICAgcmV0dXJuIG4ucHVzaCgnPG1hcCB2ZXJzaW9uPSIxLjAuMSI+JyksIHQuX2J1aWxkX21hcChlLnJvb3QsIG4pLCBuLnB1c2goIjwvbWFwPiIpLCBpLmRhdGEgPSBuLmpvaW4oIiIpLCBpOwogICAgICAgIH0sCiAgICAgICAgX3BhcnNlX3htbDogZnVuY3Rpb24gX3BhcnNlX3htbChlKSB7CiAgICAgICAgICB2YXIgdCA9IG51bGw7CiAgICAgICAgICB3aW5kb3cuRE9NUGFyc2VyID8gdCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoZSwgInRleHQveG1sIikgOiAoKHQgPSBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpKS5hc3luYyA9ICExLCB0LmxvYWRYTUwoZSkpOwogICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgfSwKICAgICAgICBfZmluZF9yb290OiBmdW5jdGlvbiBfZmluZF9yb290KGUpIHsKICAgICAgICAgIGZvciAodmFyIHQgPSBlLmNoaWxkTm9kZXMsIGkgPSBudWxsLCBuID0gbnVsbCwgbyA9IDA7IG8gPCB0Lmxlbmd0aDsgbysrKSBpZiAoMSA9PSAobiA9IHRbb10pLm5vZGVUeXBlICYmICJtYXAiID09IG4udGFnTmFtZSkgewogICAgICAgICAgICBpID0gbjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICB2YXIgcyA9IGkuY2hpbGROb2RlczsKICAgICAgICAgICAgaSA9IG51bGw7CiAgICAgICAgICAgIGZvciAobyA9IDA7IG8gPCBzLmxlbmd0aDsgbysrKSBpZiAoMSA9PSAobiA9IHNbb10pLm5vZGVUeXBlICYmICJub2RlIiA9PSBuLnRhZ05hbWUpIHsKICAgICAgICAgICAgICBpID0gbjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfSwKICAgICAgICBfbG9hZF9ub2RlOiBmdW5jdGlvbiBfbG9hZF9ub2RlKGUsIGksIG4pIHsKICAgICAgICAgIHZhciBvID0gdS5mcmVlbWluZCwKICAgICAgICAgICAgcyA9IG4uZ2V0QXR0cmlidXRlKCJJRCIpLAogICAgICAgICAgICByID0gbi5nZXRBdHRyaWJ1dGUoIlRFWFQiKSwKICAgICAgICAgICAgYSA9IG4uZ2V0QXR0cmlidXRlKCJGT0xERUQiKTsKICAgICAgICAgIGlmIChudWxsID09IHIpIGZvciAodmFyIGQgPSBuLmNoaWxkTm9kZXMsIGwgPSBudWxsLCBoID0gMDsgaCA8IGQubGVuZ3RoOyBoKyspIGlmICgxID09IChsID0gZFtoXSkubm9kZVR5cGUgJiYgInJpY2hjb250ZW50IiA9PT0gbC50YWdOYW1lKSB7CiAgICAgICAgICAgIHIgPSBsLnRleHRDb250ZW50OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBfID0gby5fbG9hZF9hdHRyaWJ1dGVzKG4pLAogICAgICAgICAgICBjID0gImV4cGFuZGVkIiBpbiBfID8gInRydWUiID09IF8uZXhwYW5kZWQgOiAidHJ1ZSIgIT0gYTsKICAgICAgICAgIGRlbGV0ZSBfLmV4cGFuZGVkOwogICAgICAgICAgdmFyIHAgPSBuLmdldEF0dHJpYnV0ZSgiUE9TSVRJT04iKSwKICAgICAgICAgICAgdiA9IG51bGw7CiAgICAgICAgICBwICYmICh2ID0gImxlZnQiID09IHAgPyB0LmxlZnQgOiB0LnJpZ2h0KTsKICAgICAgICAgIHZhciBmID0gbnVsbDsKICAgICAgICAgIGYgPSBpID8gZS5hZGRfbm9kZShpLCBzLCByLCBfLCB2LCBjKSA6IGUuc2V0X3Jvb3QocywgciwgXyk7CiAgICAgICAgICB2YXIgZyA9IG4uY2hpbGROb2RlcywKICAgICAgICAgICAgbSA9IG51bGw7CiAgICAgICAgICBmb3IgKGggPSAwOyBoIDwgZy5sZW5ndGg7IGgrKykgMSA9PSAobSA9IGdbaF0pLm5vZGVUeXBlICYmICJub2RlIiA9PSBtLnRhZ05hbWUgJiYgby5fbG9hZF9ub2RlKGUsIGYsIG0pOwogICAgICAgIH0sCiAgICAgICAgX2xvYWRfYXR0cmlidXRlczogZnVuY3Rpb24gX2xvYWRfYXR0cmlidXRlcyhlKSB7CiAgICAgICAgICBmb3IgKHZhciB0ID0gZS5jaGlsZE5vZGVzLCBpID0gbnVsbCwgbiA9IHt9LCBvID0gMDsgbyA8IHQubGVuZ3RoOyBvKyspIDEgPT0gKGkgPSB0W29dKS5ub2RlVHlwZSAmJiAiYXR0cmlidXRlIiA9PT0gaS50YWdOYW1lICYmIChuW2kuZ2V0QXR0cmlidXRlKCJOQU1FIildID0gaS5nZXRBdHRyaWJ1dGUoIlZBTFVFIikpOwogICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgfSwKICAgICAgICBfYnVpbGRfbWFwOiBmdW5jdGlvbiBfYnVpbGRfbWFwKGUsIGkpIHsKICAgICAgICAgIHZhciBuID0gdS5mcmVlbWluZCwKICAgICAgICAgICAgbyA9IG51bGw7CiAgICAgICAgICBlLnBhcmVudCAmJiBlLnBhcmVudC5pc3Jvb3QgJiYgKG8gPSBlLmRpcmVjdGlvbiA9PT0gdC5sZWZ0ID8gImxlZnQiIDogInJpZ2h0IiksIGkucHVzaCgiPG5vZGUiKSwgaS5wdXNoKCcgSUQ9IicgKyBlLmlkICsgJyInKSwgbyAmJiBpLnB1c2goJyBQT1NJVElPTj0iJyArIG8gKyAnIicpLCBlLmV4cGFuZGVkIHx8IGkucHVzaCgnIEZPTERFRD0idHJ1ZSInKSwgaS5wdXNoKCcgVEVYVD0iJyArIG4uX2VzY2FwZShlLnRvcGljKSArICciPicpOwogICAgICAgICAgdmFyIHMgPSBlLmRhdGE7CiAgICAgICAgICBpZiAobnVsbCAhPSBzKSBmb3IgKHZhciByIGluIHMpIGkucHVzaCgnPGF0dHJpYnV0ZSBOQU1FPSInICsgciArICciIFZBTFVFPSInICsgc1tyXSArICciLz4nKTsKICAgICAgICAgIGZvciAodmFyIGEgPSBlLmNoaWxkcmVuLCBkID0gMDsgZCA8IGEubGVuZ3RoOyBkKyspIG4uX2J1aWxkX21hcChhW2RdLCBpKTsKICAgICAgICAgIGkucHVzaCgiPC9ub2RlPiIpOwogICAgICAgIH0sCiAgICAgICAgX2VzY2FwZTogZnVuY3Rpb24gX2VzY2FwZShlKSB7CiAgICAgICAgICByZXR1cm4gZS5yZXBsYWNlKC8mL2csICImYW1wOyIpLnJlcGxhY2UoLzwvZywgIiZsdDsiKS5yZXBsYWNlKC8+L2csICImZ3Q7IikucmVwbGFjZSgvJy9nLCAiJmFwb3M7IikucmVwbGFjZSgvIi9nLCAiJnF1b3Q7Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICB0ZXh0OiB7CiAgICAgICAgZXhhbXBsZTogewogICAgICAgICAgbWV0YTogXywKICAgICAgICAgIGZvcm1hdDogInRleHQiLAogICAgICAgICAgZGF0YTogImpzTWluZCB0ZXh0IGV4YW1wbGVcbiBub2RlMVxuICBub2RlMS1zdWJcbiAgbm9kZTEtc3ViXG4gbm9kZTIiCiAgICAgICAgfSwKICAgICAgICBfbGluZV9yZWdleDogL1xzKi8sCiAgICAgICAgZ2V0X21pbmQ6IGZ1bmN0aW9uIGdldF9taW5kKGUpIHsKICAgICAgICAgIHZhciB0ID0gdS50ZXh0LAogICAgICAgICAgICBpID0gbmV3IGgoKTsKICAgICAgICAgIGkubmFtZSA9IGUubWV0YS5uYW1lLCBpLmF1dGhvciA9IGUubWV0YS5hdXRob3IsIGkudmVyc2lvbiA9IGUubWV0YS52ZXJzaW9uOwogICAgICAgICAgdmFyIG4gPSBlLmRhdGEuc3BsaXQoL1xufFxyLyk7CiAgICAgICAgICByZXR1cm4gdC5fZmlsbF9ub2RlcyhpLCBuLCAwLCAwKSwgaTsKICAgICAgICB9LAogICAgICAgIF9maWxsX25vZGVzOiBmdW5jdGlvbiBfZmlsbF9ub2RlcyhlLCB0KSB7CiAgICAgICAgICB2YXIgaSA9IFtdLAogICAgICAgICAgICBuID0gMDsKICAgICAgICAgIGZvciAoOyBuIDwgdC5sZW5ndGg7KSB7CiAgICAgICAgICAgIHZhciBfbyA9IHRbbl0sCiAgICAgICAgICAgICAgX3MgPSBfby5tYXRjaCgvXHMqLylbMF0ubGVuZ3RoLAogICAgICAgICAgICAgIF9yID0gX28uc3Vic3RyKF9zKTsKICAgICAgICAgICAgaWYgKDAgPT0gX3MgJiYgaS5sZW5ndGggPiAwKSByZXR1cm4gdm9pZCBsb2cuZXJyb3IoIm1vcmUgdGhhbiAxIHJvb3Qgbm9kZSB3YXMgZm91bmQ6ICIgKyBfcik7CiAgICAgICAgICAgIGlmIChfcyA+IGkubGVuZ3RoKSByZXR1cm4gdm9pZCBsb2cuZXJyb3IoImEgc3VzcGVuZGVkIG5vZGUgd2FzIGZvdW5kOiAiICsgX3IpOwogICAgICAgICAgICB2YXIgX2QgPSBpLmxlbmd0aCAtIF9zOwogICAgICAgICAgICBmb3IgKDsgX2QtLTspIGkucG9wKCk7CiAgICAgICAgICAgIGlmICgwID09IF9zICYmIDAgPT0gaS5sZW5ndGgpIHsKICAgICAgICAgICAgICB2YXIgX3QyID0gZS5zZXRfcm9vdChhLnV1aWQubmV3aWQoKSwgX3IpOwogICAgICAgICAgICAgIGkucHVzaChfdDIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBfdDMgPSBlLmFkZF9ub2RlKGlbX3MgLSAxXSwgYS51dWlkLm5ld2lkKCksIF9yLCB7fSwgbnVsbCk7CiAgICAgICAgICAgICAgaS5wdXNoKF90Myk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbisrOwogICAgICAgICAgfQogICAgICAgICAgaS5sZW5ndGggPSAwOwogICAgICAgIH0sCiAgICAgICAgZ2V0X2RhdGE6IGZ1bmN0aW9uIGdldF9kYXRhKGUpIHsKICAgICAgICAgIHZhciB0ID0gdS50ZXh0LAogICAgICAgICAgICBpID0ge307CiAgICAgICAgICBpLm1ldGEgPSB7CiAgICAgICAgICAgIG5hbWU6IGUubmFtZSwKICAgICAgICAgICAgYXV0aG9yOiBlLmF1dGhvciwKICAgICAgICAgICAgdmVyc2lvbjogZS52ZXJzaW9uCiAgICAgICAgICB9LCBpLmZvcm1hdCA9ICJ0ZXh0IjsKICAgICAgICAgIHZhciBuID0gW107CiAgICAgICAgICByZXR1cm4gdC5fYnVpbGRfbGluZXMobiwgW2Uucm9vdF0sIDApLCBpLmRhdGEgPSBuLmpvaW4oIlxuIiksIGk7CiAgICAgICAgfSwKICAgICAgICBfYnVpbGRfbGluZXM6IGZ1bmN0aW9uIF9idWlsZF9saW5lcyhlLCB0LCBpKSB7CiAgICAgICAgICB2YXIgbiA9IG5ldyBBcnJheShpICsgMSkuam9pbigiICIpOwogICAgICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHQpLAogICAgICAgICAgICBfc3RlcDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CiAgICAgICAgICAgICAgdmFyIF9vMiA9IF9zdGVwLnZhbHVlOwogICAgICAgICAgICAgIGUucHVzaChuICsgX28yLnRvcGljKSwgX28yLmNoaWxkcmVuICYmIHUudGV4dC5fYnVpbGRfbGluZXMoZSwgX28yLmNoaWxkcmVuLCBpICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBfaXRlcmF0b3IuZShlcnIpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgX2l0ZXJhdG9yLmYoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgdmFyIGMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gYyhlKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBjKTsKICAgICAgdGhpcy5qbSA9IGU7CiAgICB9CiAgICByZXR1cm4gX2NyZWF0ZUNsYXNzKGMsIFt7CiAgICAgIGtleTogImluaXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdCgpIHsKICAgICAgICBzLmRlYnVnKCJkYXRhLmluaXQiKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZXNldCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHsKICAgICAgICBzLmRlYnVnKCJkYXRhLnJlc2V0Iik7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAibG9hZCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKGUpIHsKICAgICAgICB2YXIgdCA9IG51bGwsCiAgICAgICAgICBpID0gbnVsbDsKICAgICAgICByZXR1cm4gIm5vZGVfYXJyYXkiID09ICh0ID0gIm9iamVjdCIgPT0gX3R5cGVvZihlKSA/IGUuZm9ybWF0ID8gZS5mb3JtYXQgOiAibm9kZV90cmVlIiA6ICJmcmVlbWluZCIpID8gaSA9IHUubm9kZV9hcnJheS5nZXRfbWluZChlKSA6ICJub2RlX3RyZWUiID09IHQgPyBpID0gdS5ub2RlX3RyZWUuZ2V0X21pbmQoZSkgOiAiZnJlZW1pbmQiID09IHQgPyBpID0gdS5mcmVlbWluZC5nZXRfbWluZChlKSA6ICJ0ZXh0IiA9PSB0ID8gaSA9IHUudGV4dC5nZXRfbWluZChlKSA6IHMud2FybigidW5zdXBwb3J0ZWQgZm9ybWF0IiksIGk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZ2V0X2RhdGEiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0X2RhdGEoZSkgewogICAgICAgIHZhciB0ID0gbnVsbDsKICAgICAgICByZXR1cm4gIm5vZGVfYXJyYXkiID09IGUgPyB0ID0gdS5ub2RlX2FycmF5LmdldF9kYXRhKHRoaXMuam0ubWluZCkgOiAibm9kZV90cmVlIiA9PSBlID8gdCA9IHUubm9kZV90cmVlLmdldF9kYXRhKHRoaXMuam0ubWluZCkgOiAiZnJlZW1pbmQiID09IGUgPyB0ID0gdS5mcmVlbWluZC5nZXRfZGF0YSh0aGlzLmptLm1pbmQpIDogInRleHQiID09IGUgPyB0ID0gdS50ZXh0LmdldF9kYXRhKHRoaXMuam0ubWluZCkgOiBzLmVycm9yKCJ1bnN1cHBvcnRlZCAiICsgZSArICIgZm9ybWF0IiksIHQ7CiAgICAgIH0KICAgIH1dKTsKICB9KCk7CiAgdmFyIHAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gcChlLCB0KSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBwKTsKICAgICAgdGhpcy5vcHRzID0gdCwgdGhpcy5qbSA9IGUsIHRoaXMuaXNzaWRlID0gInNpZGUiID09IHRoaXMub3B0cy5tb2RlLCB0aGlzLmJvdW5kcyA9IG51bGwsIHRoaXMuY2FjaGVfdmFsaWQgPSAhMTsKICAgIH0KICAgIHJldHVybiBfY3JlYXRlQ2xhc3MocCwgW3sKICAgICAga2V5OiAiaW5pdCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0KCkgewogICAgICAgIHMuZGVidWcoImxheW91dC5pbml0Iik7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVzZXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgICAgcy5kZWJ1ZygibGF5b3V0LnJlc2V0IiksIHRoaXMuYm91bmRzID0gewogICAgICAgICAgbjogMCwKICAgICAgICAgIHM6IDAsCiAgICAgICAgICB3OiAwLAogICAgICAgICAgZTogMAogICAgICAgIH07CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiY2FsY3VsYXRlX25leHRfY2hpbGRfZGlyZWN0aW9uIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbGN1bGF0ZV9uZXh0X2NoaWxkX2RpcmVjdGlvbihlKSB7CiAgICAgICAgaWYgKHRoaXMuaXNzaWRlKSByZXR1cm4gdC5yaWdodDsKICAgICAgICBmb3IgKHZhciBpID0gZS5jaGlsZHJlbiB8fCBbXSwgbiA9IGkubGVuZ3RoLCBvID0gMCwgcyA9IDA7IHMgPCBuOyBzKyspIGlbc10uZGlyZWN0aW9uID09PSB0LmxlZnQgPyBvLS0gOiBvKys7CiAgICAgICAgcmV0dXJuIG4gPiAxICYmIG8gPiAwID8gdC5sZWZ0IDogdC5yaWdodDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJsYXlvdXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gbGF5b3V0KCkgewogICAgICAgIHMuZGVidWcoImxheW91dC5sYXlvdXQiKSwgdGhpcy5sYXlvdXRfZGlyZWN0aW9uKCksIHRoaXMubGF5b3V0X29mZnNldCgpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImxheW91dF9kaXJlY3Rpb24iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gbGF5b3V0X2RpcmVjdGlvbigpIHsKICAgICAgICB0aGlzLl9sYXlvdXRfZGlyZWN0aW9uX3Jvb3QoKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfbGF5b3V0X2RpcmVjdGlvbl9yb290IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9sYXlvdXRfZGlyZWN0aW9uX3Jvb3QoKSB7CiAgICAgICAgdmFyIGUgPSB0aGlzLmptLm1pbmQucm9vdCwKICAgICAgICAgIGkgPSBudWxsOwogICAgICAgICJsYXlvdXQiIGluIGUuX2RhdGEgPyBpID0gZS5fZGF0YS5sYXlvdXQgOiAoaSA9IHt9LCBlLl9kYXRhLmxheW91dCA9IGkpOwogICAgICAgIHZhciBuID0gZS5jaGlsZHJlbiwKICAgICAgICAgIG8gPSBuLmxlbmd0aDsKICAgICAgICBpZiAoaS5kaXJlY3Rpb24gPSB0LmNlbnRlciwgaS5zaWRlX2luZGV4ID0gMCwgdGhpcy5pc3NpZGUpIGZvciAodmFyIHMgPSBvOyBzLS07KSB0aGlzLl9sYXlvdXRfZGlyZWN0aW9uX3NpZGUobltzXSwgdC5yaWdodCwgcyk7ZWxzZSB7CiAgICAgICAgICBzID0gbzsKICAgICAgICAgIGZvciAodmFyIHIgPSBudWxsOyBzLS07KSAociA9IG5bc10pLmRpcmVjdGlvbiA9PSB0LmxlZnQgPyB0aGlzLl9sYXlvdXRfZGlyZWN0aW9uX3NpZGUociwgdC5sZWZ0LCBzKSA6IHRoaXMuX2xheW91dF9kaXJlY3Rpb25fc2lkZShyLCB0LnJpZ2h0LCBzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2xheW91dF9kaXJlY3Rpb25fc2lkZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfbGF5b3V0X2RpcmVjdGlvbl9zaWRlKGUsIHQsIGkpIHsKICAgICAgICB2YXIgbiA9IG51bGw7CiAgICAgICAgImxheW91dCIgaW4gZS5fZGF0YSA/IG4gPSBlLl9kYXRhLmxheW91dCA6IChuID0ge30sIGUuX2RhdGEubGF5b3V0ID0gbik7CiAgICAgICAgdmFyIG8gPSBlLmNoaWxkcmVuLAogICAgICAgICAgcyA9IG8ubGVuZ3RoOwogICAgICAgIG4uZGlyZWN0aW9uID0gdCwgbi5zaWRlX2luZGV4ID0gaTsKICAgICAgICBmb3IgKHZhciByID0gczsgci0tOykgdGhpcy5fbGF5b3V0X2RpcmVjdGlvbl9zaWRlKG9bcl0sIHQsIHIpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImxheW91dF9vZmZzZXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gbGF5b3V0X29mZnNldCgpIHsKICAgICAgICB2YXIgZSA9IHRoaXMuam0ubWluZC5yb290LAogICAgICAgICAgaSA9IGUuX2RhdGEubGF5b3V0OwogICAgICAgIGkub2Zmc2V0X3ggPSAwLCBpLm9mZnNldF95ID0gMCwgaS5vdXRlcl9oZWlnaHQgPSAwOwogICAgICAgIGZvciAodmFyIG4gPSBlLmNoaWxkcmVuLCBvID0gbi5sZW5ndGgsIHMgPSBbXSwgciA9IFtdLCBhID0gbnVsbDsgby0tOykgKGEgPSBuW29dKS5fZGF0YS5sYXlvdXQuZGlyZWN0aW9uID09IHQucmlnaHQgPyByLnVuc2hpZnQoYSkgOiBzLnVuc2hpZnQoYSk7CiAgICAgICAgaS5sZWZ0X25vZGVzID0gcywgaS5yaWdodF9ub2RlcyA9IHIsIGkub3V0ZXJfaGVpZ2h0X2xlZnQgPSB0aGlzLl9sYXlvdXRfb2Zmc2V0X3N1Ym5vZGVzKHMpLCBpLm91dGVyX2hlaWdodF9yaWdodCA9IHRoaXMuX2xheW91dF9vZmZzZXRfc3Vibm9kZXMociksIHRoaXMuYm91bmRzLmUgPSBlLl9kYXRhLnZpZXcud2lkdGggLyAyLCB0aGlzLmJvdW5kcy53ID0gMCAtIHRoaXMuYm91bmRzLmUsIHRoaXMuYm91bmRzLm4gPSAwLCB0aGlzLmJvdW5kcy5zID0gTWF0aC5tYXgoaS5vdXRlcl9oZWlnaHRfbGVmdCwgaS5vdXRlcl9oZWlnaHRfcmlnaHQpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIl9sYXlvdXRfb2Zmc2V0X3N1Ym5vZGVzIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9sYXlvdXRfb2Zmc2V0X3N1Ym5vZGVzKGUpIHsKICAgICAgICBmb3IgKHZhciB0ID0gMCwgaSA9IGUubGVuZ3RoLCBuID0gaSwgbyA9IG51bGwsIHMgPSAwLCByID0gbnVsbCwgYSA9IDAsIGQgPSBudWxsOyBuLS07KSByID0gKG8gPSBlW25dKS5fZGF0YS5sYXlvdXQsIG51bGwgPT0gZCAmJiAoZCA9IG8ucGFyZW50Ll9kYXRhKSwgcyA9IHRoaXMuX2xheW91dF9vZmZzZXRfc3Vibm9kZXMoby5jaGlsZHJlbiksIG8uZXhwYW5kZWQgfHwgKHMgPSAwLCB0aGlzLnNldF92aXNpYmxlKG8uY2hpbGRyZW4sICExKSksIHMgPSBNYXRoLm1heChvLl9kYXRhLnZpZXcuaGVpZ2h0LCBzKSwgdGhpcy5fc2hvdWxkX3Jlc2VydmVfY291c2luX3NwYWNlKG8pICYmIChzICs9IHRoaXMub3B0cy5jb3VzaW5fc3BhY2UpLCByLm91dGVyX2hlaWdodCA9IHMsIHIub2Zmc2V0X3kgPSBhIC0gcyAvIDIsIHIub2Zmc2V0X3ggPSB0aGlzLm9wdHMuaHNwYWNlICogci5kaXJlY3Rpb24gKyBkLnZpZXcud2lkdGggKiAoZC5sYXlvdXQuZGlyZWN0aW9uICsgci5kaXJlY3Rpb24pIC8gMiwgby5wYXJlbnQuaXNyb290IHx8IChyLm9mZnNldF94ICs9IHRoaXMub3B0cy5wc3BhY2UgKiByLmRpcmVjdGlvbiksIGEgPSBhIC0gcyAtIHRoaXMub3B0cy52c3BhY2UsIHQgKz0gczsKICAgICAgICBpID4gMSAmJiAodCArPSB0aGlzLm9wdHMudnNwYWNlICogKGkgLSAxKSksIG4gPSBpOwogICAgICAgIGZvciAodmFyIGwgPSB0IC8gMjsgbi0tOykgKG8gPSBlW25dKS5fZGF0YS5sYXlvdXQub2Zmc2V0X3kgKz0gbDsKICAgICAgICByZXR1cm4gdDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfbGF5b3V0X29mZnNldF9zdWJub2Rlc19oZWlnaHQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gX2xheW91dF9vZmZzZXRfc3Vibm9kZXNfaGVpZ2h0KGUpIHsKICAgICAgICBmb3IgKHZhciB0ID0gMCwgaSA9IGUubGVuZ3RoLCBuID0gaSwgbyA9IG51bGwsIHMgPSAwLCByID0gbnVsbCwgYSA9IDAsIGQgPSBudWxsOyBuLS07KSByID0gKG8gPSBlW25dKS5fZGF0YS5sYXlvdXQsIG51bGwgPT0gZCAmJiAoZCA9IG8ucGFyZW50Ll9kYXRhKSwgcyA9IHRoaXMuX2xheW91dF9vZmZzZXRfc3Vibm9kZXNfaGVpZ2h0KG8uY2hpbGRyZW4pLCBvLmV4cGFuZGVkIHx8IChzID0gMCksIHMgPSBNYXRoLm1heChvLl9kYXRhLnZpZXcuaGVpZ2h0LCBzKSwgdGhpcy5fc2hvdWxkX3Jlc2VydmVfY291c2luX3NwYWNlKG8pICYmIChzICs9IHRoaXMub3B0cy5jb3VzaW5fc3BhY2UpLCByLm91dGVyX2hlaWdodCA9IHMsIHIub2Zmc2V0X3kgPSBhIC0gcyAvIDIsIGEgPSBhIC0gcyAtIHRoaXMub3B0cy52c3BhY2UsIHQgKz0gczsKICAgICAgICBpID4gMSAmJiAodCArPSB0aGlzLm9wdHMudnNwYWNlICogKGkgLSAxKSksIG4gPSBpOwogICAgICAgIGZvciAodmFyIGwgPSB0IC8gMjsgbi0tOykgKG8gPSBlW25dKS5fZGF0YS5sYXlvdXQub2Zmc2V0X3kgKz0gbDsKICAgICAgICByZXR1cm4gdDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfc2hvdWxkX3Jlc2VydmVfY291c2luX3NwYWNlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zaG91bGRfcmVzZXJ2ZV9jb3VzaW5fc3BhY2UoZSkgewogICAgICAgIHJldHVybiBlLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgZS5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoID4gMTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRfbm9kZV9vZmZzZXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0X25vZGVfb2Zmc2V0KGUpIHsKICAgICAgICB2YXIgdCA9IGUuX2RhdGEubGF5b3V0LAogICAgICAgICAgaSA9IG51bGw7CiAgICAgICAgaWYgKCJfb2Zmc2V0XyIgaW4gdCAmJiB0aGlzLmNhY2hlX3ZhbGlkID8gaSA9IHQuX29mZnNldF8gOiAoaSA9IHsKICAgICAgICAgIHg6IC0xLAogICAgICAgICAgeTogLTEKICAgICAgICB9LCB0Ll9vZmZzZXRfID0gaSksIC0xID09IGkueCB8fCAtMSA9PSBpLnkpIHsKICAgICAgICAgIHZhciBuID0gdC5vZmZzZXRfeCwKICAgICAgICAgICAgbyA9IHQub2Zmc2V0X3k7CiAgICAgICAgICBpZiAoIWUuaXNyb290KSB7CiAgICAgICAgICAgIHZhciBzID0gdGhpcy5nZXRfbm9kZV9vZmZzZXQoZS5wYXJlbnQpOwogICAgICAgICAgICBuICs9IHMueCwgbyArPSBzLnk7CiAgICAgICAgICB9CiAgICAgICAgICBpLnggPSBuLCBpLnkgPSBvOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRfbm9kZV9wb2ludCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfbm9kZV9wb2ludChlKSB7CiAgICAgICAgdmFyIHQgPSBlLl9kYXRhLnZpZXcsCiAgICAgICAgICBpID0gdGhpcy5nZXRfbm9kZV9vZmZzZXQoZSksCiAgICAgICAgICBuID0ge307CiAgICAgICAgcmV0dXJuIG4ueCA9IGkueCArIHQud2lkdGggKiAoZS5fZGF0YS5sYXlvdXQuZGlyZWN0aW9uIC0gMSkgLyAyLCBuLnkgPSBpLnkgLSB0LmhlaWdodCAvIDIsIG47CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZ2V0X25vZGVfcG9pbnRfaW4iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0X25vZGVfcG9pbnRfaW4oZSkgewogICAgICAgIHJldHVybiB0aGlzLmdldF9ub2RlX29mZnNldChlKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRfbm9kZV9wb2ludF9vdXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0X25vZGVfcG9pbnRfb3V0KGUpIHsKICAgICAgICB2YXIgdCA9IGUuX2RhdGEubGF5b3V0LAogICAgICAgICAgaSA9IG51bGw7CiAgICAgICAgaWYgKCJfcG91dF8iIGluIHQgJiYgdGhpcy5jYWNoZV92YWxpZCA/IGkgPSB0Ll9wb3V0XyA6IChpID0gewogICAgICAgICAgeDogLTEsCiAgICAgICAgICB5OiAtMQogICAgICAgIH0sIHQuX3BvdXRfID0gaSksIC0xID09IGkueCB8fCAtMSA9PSBpLnkpIGlmIChlLmlzcm9vdCkgaS54ID0gMCwgaS55ID0gMDtlbHNlIHsKICAgICAgICAgIHZhciBuID0gZS5fZGF0YS52aWV3LAogICAgICAgICAgICBvID0gdGhpcy5nZXRfbm9kZV9vZmZzZXQoZSk7CiAgICAgICAgICBpLnggPSBvLnggKyAobi53aWR0aCArIHRoaXMub3B0cy5wc3BhY2UpICogZS5fZGF0YS5sYXlvdXQuZGlyZWN0aW9uLCBpLnkgPSBvLnk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImdldF9leHBhbmRlcl9wb2ludCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfZXhwYW5kZXJfcG9pbnQoZSkgewogICAgICAgIHZhciBpID0gdGhpcy5nZXRfbm9kZV9wb2ludF9vdXQoZSksCiAgICAgICAgICBuID0ge307CiAgICAgICAgcmV0dXJuIGUuX2RhdGEubGF5b3V0LmRpcmVjdGlvbiA9PSB0LnJpZ2h0ID8gbi54ID0gaS54IC0gdGhpcy5vcHRzLnBzcGFjZSA6IG4ueCA9IGkueCwgbi55ID0gaS55IC0gTWF0aC5jZWlsKHRoaXMub3B0cy5wc3BhY2UgLyAyKSwgbjsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRfbWluX3NpemUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0X21pbl9zaXplKCkgewogICAgICAgIHZhciBlID0gdGhpcy5qbS5taW5kLm5vZGVzLAogICAgICAgICAgdCA9IG51bGwsCiAgICAgICAgICBpID0gbnVsbDsKICAgICAgICBmb3IgKHZhciBuIGluIGUpIHQgPSBlW25dLCAoaSA9IHRoaXMuZ2V0X25vZGVfcG9pbnRfb3V0KHQpKS54ID4gdGhpcy5ib3VuZHMuZSAmJiAodGhpcy5ib3VuZHMuZSA9IGkueCksIGkueCA8IHRoaXMuYm91bmRzLncgJiYgKHRoaXMuYm91bmRzLncgPSBpLngpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICB3OiB0aGlzLmJvdW5kcy5lIC0gdGhpcy5ib3VuZHMudywKICAgICAgICAgIGg6IHRoaXMuYm91bmRzLnMgLSB0aGlzLmJvdW5kcy5uCiAgICAgICAgfTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJ0b2dnbGVfbm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0b2dnbGVfbm9kZShlKSB7CiAgICAgICAgZS5pc3Jvb3QgfHwgKGUuZXhwYW5kZWQgPyB0aGlzLmNvbGxhcHNlX25vZGUoZSkgOiB0aGlzLmV4cGFuZF9ub2RlKGUpKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJleHBhbmRfbm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBleHBhbmRfbm9kZShlKSB7CiAgICAgICAgZS5leHBhbmRlZCA9ICEwLCB0aGlzLnBhcnRfbGF5b3V0KGUpLCB0aGlzLnNldF92aXNpYmxlKGUuY2hpbGRyZW4sICEwKSwgdGhpcy5qbS5pbnZva2VfZXZlbnRfaGFuZGxlKGkuc2hvdywgewogICAgICAgICAgZXZ0OiAiZXhwYW5kX25vZGUiLAogICAgICAgICAgZGF0YTogW10sCiAgICAgICAgICBub2RlOiBlLmlkCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiY29sbGFwc2Vfbm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xsYXBzZV9ub2RlKGUpIHsKICAgICAgICBlLmV4cGFuZGVkID0gITEsIHRoaXMucGFydF9sYXlvdXQoZSksIHRoaXMuc2V0X3Zpc2libGUoZS5jaGlsZHJlbiwgITEpLCB0aGlzLmptLmludm9rZV9ldmVudF9oYW5kbGUoaS5zaG93LCB7CiAgICAgICAgICBldnQ6ICJjb2xsYXBzZV9ub2RlIiwKICAgICAgICAgIGRhdGE6IFtdLAogICAgICAgICAgbm9kZTogZS5pZAogICAgICAgIH0pOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImV4cGFuZF9hbGwiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhwYW5kX2FsbCgpIHsKICAgICAgICB2YXIgZSwKICAgICAgICAgIHQgPSB0aGlzLmptLm1pbmQubm9kZXMsCiAgICAgICAgICBpID0gMDsKICAgICAgICBmb3IgKHZhciBuIGluIHQpIChlID0gdFtuXSkuZXhwYW5kZWQgfHwgKGUuZXhwYW5kZWQgPSAhMCwgaSsrKTsKICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgIHZhciBvID0gdGhpcy5qbS5taW5kLnJvb3Q7CiAgICAgICAgICB0aGlzLnBhcnRfbGF5b3V0KG8pLCB0aGlzLnNldF92aXNpYmxlKG8uY2hpbGRyZW4sICEwKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiY29sbGFwc2VfYWxsIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbGxhcHNlX2FsbCgpIHsKICAgICAgICB2YXIgZSwKICAgICAgICAgIHQgPSB0aGlzLmptLm1pbmQubm9kZXMsCiAgICAgICAgICBpID0gMDsKICAgICAgICBmb3IgKHZhciBuIGluIHQpIChlID0gdFtuXSkuZXhwYW5kZWQgJiYgIWUuaXNyb290ICYmIChlLmV4cGFuZGVkID0gITEsIGkrKyk7CiAgICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgICB2YXIgbyA9IHRoaXMuam0ubWluZC5yb290OwogICAgICAgICAgdGhpcy5wYXJ0X2xheW91dChvKSwgdGhpcy5zZXRfdmlzaWJsZShvLmNoaWxkcmVuLCAhMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImV4cGFuZF90b19kZXB0aCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBleHBhbmRfdG9fZGVwdGgoZSwgdCwgaSkgewogICAgICAgIGlmICghKGUgPCAxKSkgZm9yICh2YXIgbiA9IHQgfHwgdGhpcy5qbS5taW5kLnJvb3QuY2hpbGRyZW4sIG8gPSBpIHx8IDEsIHMgPSBuLmxlbmd0aCwgciA9IG51bGw7IHMtLTspIHIgPSBuW3NdLCBvIDwgZSAmJiAoci5leHBhbmRlZCB8fCB0aGlzLmV4cGFuZF9ub2RlKHIpLCB0aGlzLmV4cGFuZF90b19kZXB0aChlLCByLmNoaWxkcmVuLCBvICsgMSkpLCBvID09IGUgJiYgci5leHBhbmRlZCAmJiB0aGlzLmNvbGxhcHNlX25vZGUocik7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicGFydF9sYXlvdXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcGFydF9sYXlvdXQoZSkgewogICAgICAgIHZhciBpID0gdGhpcy5qbS5taW5kLnJvb3Q7CiAgICAgICAgaWYgKGkpIHsKICAgICAgICAgIHZhciBuID0gaS5fZGF0YS5sYXlvdXQ7CiAgICAgICAgICBlLmlzcm9vdCA/IChuLm91dGVyX2hlaWdodF9yaWdodCA9IHRoaXMuX2xheW91dF9vZmZzZXRfc3Vibm9kZXNfaGVpZ2h0KG4ucmlnaHRfbm9kZXMpLCBuLm91dGVyX2hlaWdodF9sZWZ0ID0gdGhpcy5fbGF5b3V0X29mZnNldF9zdWJub2Rlc19oZWlnaHQobi5sZWZ0X25vZGVzKSkgOiBlLl9kYXRhLmxheW91dC5kaXJlY3Rpb24gPT0gdC5yaWdodCA/IG4ub3V0ZXJfaGVpZ2h0X3JpZ2h0ID0gdGhpcy5fbGF5b3V0X29mZnNldF9zdWJub2Rlc19oZWlnaHQobi5yaWdodF9ub2RlcykgOiBuLm91dGVyX2hlaWdodF9sZWZ0ID0gdGhpcy5fbGF5b3V0X29mZnNldF9zdWJub2Rlc19oZWlnaHQobi5sZWZ0X25vZGVzKSwgdGhpcy5ib3VuZHMucyA9IE1hdGgubWF4KG4ub3V0ZXJfaGVpZ2h0X2xlZnQsIG4ub3V0ZXJfaGVpZ2h0X3JpZ2h0KSwgdGhpcy5jYWNoZV92YWxpZCA9ICExOwogICAgICAgIH0gZWxzZSBzLndhcm4oImNhbiBub3QgZm91bmQgcm9vdCBub2RlIik7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAic2V0X3Zpc2libGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0X3Zpc2libGUoZSwgdCkgewogICAgICAgIGZvciAodmFyIGkgPSBlLmxlbmd0aCwgbiA9IG51bGw7IGktLTspIChuID0gZVtpXSkuX2RhdGEubGF5b3V0LCBuLmV4cGFuZGVkID8gdGhpcy5zZXRfdmlzaWJsZShuLmNoaWxkcmVuLCB0KSA6IHRoaXMuc2V0X3Zpc2libGUobi5jaGlsZHJlbiwgITEpLCBuLmlzcm9vdCB8fCAobi5fZGF0YS5sYXlvdXQudmlzaWJsZSA9IHQpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImlzX2V4cGFuZCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc19leHBhbmQoZSkgewogICAgICAgIHJldHVybiBlLmV4cGFuZGVkOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImlzX3Zpc2libGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gaXNfdmlzaWJsZShlKSB7CiAgICAgICAgdmFyIHQgPSBlLl9kYXRhLmxheW91dDsKICAgICAgICByZXR1cm4gISgidmlzaWJsZSIgaW4gdCAmJiAhdC52aXNpYmxlKTsKICAgICAgfQogICAgfV0pOwogIH0oKTsKICB2YXIgdiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiB2KGUpIHsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIHYpOwogICAgICB0aGlzLnZpZXcgPSBlLCB0aGlzLm9wdHMgPSBlLm9wdHMsIHRoaXMuZV9zdmcgPSB2LmMoInN2ZyIpLCB0aGlzLmVfc3ZnLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAianNtaW5kIiksIHRoaXMuc2l6ZSA9IHsKICAgICAgICB3OiAwLAogICAgICAgIGg6IDAKICAgICAgfSwgdGhpcy5saW5lcyA9IFtdLCB0aGlzLmxpbmVfZHJhd2luZyA9IHsKICAgICAgICBzdHJhaWdodDogdGhpcy5fbGluZV90bywKICAgICAgICBjdXJ2ZWQ6IHRoaXMuX2Jlemllcl90bwogICAgICB9LCB0aGlzLmluaXRfbGluZV9yZW5kZXIoKTsKICAgIH0KICAgIHJldHVybiBfY3JlYXRlQ2xhc3ModiwgW3sKICAgICAga2V5OiAiaW5pdF9saW5lX3JlbmRlciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0X2xpbmVfcmVuZGVyKCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgImZ1bmN0aW9uIiA9PSB0eXBlb2YgdGhpcy5vcHRzLmN1c3RvbV9saW5lX3JlbmRlciA/IHRoaXMuZHJhd2luZyA9IGZ1bmN0aW9uIChlLCB0LCBpLCBuLCBvKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBfdGhpcy5vcHRzLmN1c3RvbV9saW5lX3JlbmRlci5jYWxsKF90aGlzLCB7CiAgICAgICAgICAgICAgY3R4OiBlLAogICAgICAgICAgICAgIHN0YXJ0X3BvaW50OiB7CiAgICAgICAgICAgICAgICB4OiB0LAogICAgICAgICAgICAgICAgeTogaQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgZW5kX3BvaW50OiB7CiAgICAgICAgICAgICAgICB4OiBuLAogICAgICAgICAgICAgICAgeTogbwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHMuZXJyb3IoImN1c3RvbSBsaW5lIHJlbmRlcmVyIGVycm9yOiAiLCBlKTsKICAgICAgICAgIH0KICAgICAgICB9IDogdGhpcy5kcmF3aW5nID0gdGhpcy5saW5lX2RyYXdpbmdbdGhpcy5vcHRzLmxpbmVfc3R5bGVdIHx8IHRoaXMubGluZV9kcmF3aW5nLmN1cnZlZDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJlbGVtZW50IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGVsZW1lbnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZV9zdmc7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAic2V0X3NpemUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0X3NpemUoZSwgdCkgewogICAgICAgIHRoaXMuc2l6ZS53ID0gZSwgdGhpcy5zaXplLmggPSB0LCB0aGlzLmVfc3ZnLnNldEF0dHJpYnV0ZSgid2lkdGgiLCBlKSwgdGhpcy5lX3N2Zy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIHQpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImNsZWFyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkgewogICAgICAgIGZvciAodmFyIGUgPSB0aGlzLmxpbmVzLmxlbmd0aDsgZS0tOykgdGhpcy5lX3N2Zy5yZW1vdmVDaGlsZCh0aGlzLmxpbmVzW2VdKTsKICAgICAgICB0aGlzLmxpbmVzLmxlbmd0aCA9IDA7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZHJhd19saW5lIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRyYXdfbGluZShlLCB0LCBpLCBuKSB7CiAgICAgICAgdmFyIG8gPSB2LmMoInBhdGgiKTsKICAgICAgICBvLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgbiB8fCB0aGlzLm9wdHMubGluZV9jb2xvciksIG8uc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCB0aGlzLm9wdHMubGluZV93aWR0aCksIG8uc2V0QXR0cmlidXRlKCJmaWxsIiwgInRyYW5zcGFyZW50IiksIHRoaXMubGluZXMucHVzaChvKSwgdGhpcy5lX3N2Zy5hcHBlbmRDaGlsZChvKSwgdGhpcy5kcmF3aW5nKG8sIHQueCArIGkueCwgdC55ICsgaS55LCBlLnggKyBpLngsIGUueSArIGkueSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiY29weV90byIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5X3RvKGUsIHQpIHsKICAgICAgICB2YXIgaSA9IG5ldyBJbWFnZSgpOwogICAgICAgIGkub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgZS5kcmF3SW1hZ2UoaSwgMCwgMCksIHQgJiYgdCgpOwogICAgICAgIH0sIGkuc3JjID0gImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsIiArIGJ0b2EobmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh0aGlzLmVfc3ZnKSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2Jlemllcl90byIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfYmV6aWVyX3RvKGUsIHQsIGksIG4sIG8pIHsKICAgICAgICBlLnNldEF0dHJpYnV0ZSgiZCIsICJNICIgKyB0ICsgIiAiICsgaSArICIgQyAiICsgKHQgKyAyICogKG4gLSB0KSAvIDMpICsgIiAiICsgaSArICIsICIgKyB0ICsgIiAiICsgbyArICIsICIgKyBuICsgIiAiICsgbyk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2xpbmVfdG8iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gX2xpbmVfdG8oZSwgdCwgaSwgbiwgbykgewogICAgICAgIGUuc2V0QXR0cmlidXRlKCJkIiwgIk0gIiArIHQgKyAiICIgKyBpICsgIiBMICIgKyBuICsgIiAiICsgbyk7CiAgICAgIH0KICAgIH1dLCBbewogICAgICBrZXk6ICJjIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGMoZSkgewogICAgICAgIHJldHVybiByLmQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsIGUpOwogICAgICB9CiAgICB9XSk7CiAgfSgpOwogIHZhciBmID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIGYoZSkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgZik7CiAgICAgIHRoaXMub3B0cyA9IGUub3B0cywgdGhpcy5lX2NhbnZhcyA9IHIuYygiY2FudmFzIiksIHRoaXMuZV9jYW52YXMuY2xhc3NOYW1lID0gImpzbWluZCIsIHRoaXMuY2FudmFzX2N0eCA9IHRoaXMuZV9jYW52YXMuZ2V0Q29udGV4dCgiMmQiKSwgdGhpcy5zaXplID0gewogICAgICAgIHc6IDAsCiAgICAgICAgaDogMAogICAgICB9LCB0aGlzLmxpbmVfZHJhd2luZyA9IHsKICAgICAgICBzdHJhaWdodDogdGhpcy5fbGluZV90bywKICAgICAgICBjdXJ2ZWQ6IHRoaXMuX2Jlemllcl90bwogICAgICB9LCB0aGlzLmRwciA9IGUuZGV2aWNlX3BpeGVsX3JhdGlvLCB0aGlzLmluaXRfbGluZV9yZW5kZXIoKTsKICAgIH0KICAgIHJldHVybiBfY3JlYXRlQ2xhc3MoZiwgW3sKICAgICAga2V5OiAiaW5pdF9saW5lX3JlbmRlciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0X2xpbmVfcmVuZGVyKCkgewogICAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICAgICJmdW5jdGlvbiIgPT0gdHlwZW9mIHRoaXMub3B0cy5jdXN0b21fbGluZV9yZW5kZXIgPyB0aGlzLmRyYXdpbmcgPSBmdW5jdGlvbiAoZSwgdCwgaSwgbiwgbykgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgX3RoaXMyLm9wdHMuY3VzdG9tX2xpbmVfcmVuZGVyLmNhbGwoX3RoaXMyLCB7CiAgICAgICAgICAgICAgY3R4OiBlLAogICAgICAgICAgICAgIHN0YXJ0X3BvaW50OiB7CiAgICAgICAgICAgICAgICB4OiB0LAogICAgICAgICAgICAgICAgeTogaQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgZW5kX3BvaW50OiB7CiAgICAgICAgICAgICAgICB4OiBuLAogICAgICAgICAgICAgICAgeTogbwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHMuZXJyb3IoImN1c3RvbSBsaW5lIHJlbmRlciBlcnJvcjogIiwgZSk7CiAgICAgICAgICB9CiAgICAgICAgfSA6IHRoaXMuZHJhd2luZyA9IHRoaXMubGluZV9kcmF3aW5nW3RoaXMub3B0cy5saW5lX3N0eWxlXSB8fCB0aGlzLmxpbmVfZHJhd2luZy5jdXJ2ZWQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZWxlbWVudCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBlbGVtZW50KCkgewogICAgICAgIHJldHVybiB0aGlzLmVfY2FudmFzOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNldF9zaXplIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldF9zaXplKGUsIHQpIHsKICAgICAgICB0aGlzLnNpemUudyA9IGUsIHRoaXMuc2l6ZS5oID0gdCwgdGhpcy5lX2NhbnZhcy53aWR0aCAmJiB0aGlzLmVfY2FudmFzLmhlaWdodCAmJiB0aGlzLmNhbnZhc19jdHguc2NhbGUgPyAodGhpcy5lX2NhbnZhcy53aWR0aCA9IGUgKiB0aGlzLmRwciwgdGhpcy5lX2NhbnZhcy5oZWlnaHQgPSB0ICogdGhpcy5kcHIsIHRoaXMuZV9jYW52YXMuc3R5bGUud2lkdGggPSBlICsgInB4IiwgdGhpcy5lX2NhbnZhcy5zdHlsZS5oZWlnaHQgPSB0ICsgInB4IiwgdGhpcy5jYW52YXNfY3R4LnNjYWxlKHRoaXMuZHByLCB0aGlzLmRwcikpIDogKHRoaXMuZV9jYW52YXMud2lkdGggPSBlLCB0aGlzLmVfY2FudmFzLmhlaWdodCA9IHQpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImNsZWFyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkgewogICAgICAgIHRoaXMuY2FudmFzX2N0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5zaXplLncsIHRoaXMuc2l6ZS5oKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJkcmF3X2xpbmUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZHJhd19saW5lKGUsIHQsIGksIG4pIHsKICAgICAgICB2YXIgbyA9IHRoaXMuY2FudmFzX2N0eDsKICAgICAgICBvLnN0cm9rZVN0eWxlID0gbiB8fCB0aGlzLm9wdHMubGluZV9jb2xvciwgby5saW5lV2lkdGggPSB0aGlzLm9wdHMubGluZV93aWR0aCwgby5saW5lQ2FwID0gInJvdW5kIiwgdGhpcy5kcmF3aW5nKG8sIHQueCArIGkueCwgdC55ICsgaS55LCBlLnggKyBpLngsIGUueSArIGkueSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiY29weV90byIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5X3RvKGUsIHQpIHsKICAgICAgICBlLmRyYXdJbWFnZSh0aGlzLmVfY2FudmFzLCAwLCAwLCB0aGlzLnNpemUudywgdGhpcy5zaXplLmgpLCB0ICYmIHQoKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfYmV6aWVyX3RvIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9iZXppZXJfdG8oZSwgdCwgaSwgbiwgbykgewogICAgICAgIGUuYmVnaW5QYXRoKCksIGUubW92ZVRvKHQsIGkpLCBlLmJlemllckN1cnZlVG8odCArIDIgKiAobiAtIHQpIC8gMywgaSwgdCwgbywgbiwgbyksIGUuc3Ryb2tlKCk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2xpbmVfdG8iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gX2xpbmVfdG8oZSwgdCwgaSwgbiwgbykgewogICAgICAgIGUuYmVnaW5QYXRoKCksIGUubW92ZVRvKHQsIGkpLCBlLmxpbmVUbyhuLCBvKSwgZS5zdHJva2UoKTsKICAgICAgfQogICAgfV0pOwogIH0oKTsKICB2YXIgZyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBnKGUsIHQpIHsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIGcpOwogICAgICB0aGlzLm9wdHMgPSB0LCB0aGlzLmptID0gZSwgdGhpcy5sYXlvdXQgPSBlLmxheW91dCwgdGhpcy5jb250YWluZXIgPSBudWxsLCB0aGlzLmVfcGFuZWwgPSBudWxsLCB0aGlzLmVfbm9kZXMgPSBudWxsLCB0aGlzLnNpemUgPSB7CiAgICAgICAgdzogMCwKICAgICAgICBoOiAwCiAgICAgIH0sIHRoaXMuc2VsZWN0ZWRfbm9kZSA9IG51bGwsIHRoaXMuZWRpdGluZ19ub2RlID0gbnVsbCwgdGhpcy5ncmFwaCA9IG51bGwsIHRoaXMucmVuZGVyX25vZGUgPSB0LmN1c3RvbV9ub2RlX3JlbmRlciA/IHRoaXMuX2N1c3RvbV9ub2RlX3JlbmRlciA6IHRoaXMuX2RlZmF1bHRfbm9kZV9yZW5kZXIsIHRoaXMuem9vbV9jdXJyZW50ID0gMSwgdGhpcy5kZXZpY2VfcGl4ZWxfcmF0aW8gPSB0aGlzLm9wdHMuZW5hYmxlX2RldmljZV9waXhlbF9yYXRpbyAmJiByLncuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxLCB0aGlzLl9pbml0aWFsaXplZCA9ICExOwogICAgfQogICAgcmV0dXJuIF9jcmVhdGVDbGFzcyhnLCBbewogICAgICBrZXk6ICJpbml0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CiAgICAgICAgaWYgKHMuZGVidWcodGhpcy5vcHRzKSwgcy5kZWJ1Zygidmlldy5pbml0IiksIHRoaXMuY29udGFpbmVyID0gci5pKHRoaXMub3B0cy5jb250YWluZXIpID8gdGhpcy5vcHRzLmNvbnRhaW5lciA6IHIuZyh0aGlzLm9wdHMuY29udGFpbmVyKSwgdGhpcy5jb250YWluZXIpIHsKICAgICAgICAgIHZhciBlOwogICAgICAgICAgdGhpcy5ncmFwaCA9IChlID0gdGhpcywgInN2ZyIgPT09IHRoaXMub3B0cy5lbmdpbmUudG9Mb3dlckNhc2UoKSA/IG5ldyB2KGUpIDogbmV3IGYoZSkpLCB0aGlzLmVfcGFuZWwgPSByLmMoImRpdiIpLCB0aGlzLmVfbm9kZXMgPSByLmMoImptbm9kZXMiKSwgdGhpcy5lX2VkaXRvciA9IHIuYygiaW5wdXQiKSwgdGhpcy5lX3BhbmVsLmNsYXNzTmFtZSA9ICJqc21pbmQtaW5uZXIgam1ub2RlLW92ZXJmbG93LSIgKyB0aGlzLm9wdHMubm9kZV9vdmVyZmxvdywgdGhpcy5lX3BhbmVsLnRhYkluZGV4ID0gMSwgdGhpcy5lX3BhbmVsLmFwcGVuZENoaWxkKHRoaXMuZ3JhcGguZWxlbWVudCgpKSwgdGhpcy5lX3BhbmVsLmFwcGVuZENoaWxkKHRoaXMuZV9ub2RlcyksIHRoaXMuZV9lZGl0b3IuY2xhc3NOYW1lID0gImpzbWluZC1lZGl0b3IiLCB0aGlzLmVfZWRpdG9yLnR5cGUgPSAidGV4dCI7CiAgICAgICAgICB2YXIgdCA9IHRoaXM7CiAgICAgICAgICByLm9uKHRoaXMuZV9lZGl0b3IsICJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGkgPSBlIHx8IGV2ZW50OwogICAgICAgICAgICAxMyA9PSBpLmtleUNvZGUgJiYgKHQuZWRpdF9ub2RlX2VuZCgpLCBpLnN0b3BQcm9wYWdhdGlvbigpKTsKICAgICAgICAgIH0pLCByLm9uKHRoaXMuZV9lZGl0b3IsICJibHVyIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdC5lZGl0X25vZGVfZW5kKCk7CiAgICAgICAgICB9KSwgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lX3BhbmVsKSwgdGhpcy5jb250YWluZXIub2Zmc2V0UGFyZW50IHx8IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICBlWzBdLmlzSW50ZXJzZWN0aW5nICYmICh0LnVub2JzZXJ2ZShfdGhpczMuZV9wYW5lbCksIF90aGlzMy5yZXNpemUoKSk7CiAgICAgICAgICB9KS5vYnNlcnZlKHRoaXMuZV9wYW5lbCk7CiAgICAgICAgfSBlbHNlIHMuZXJyb3IoInRoZSBvcHRpb25zLnZpZXcuY29udGFpbmVyIHdhcyBub3QgYmUgZm91bmQgaW4gZG9tIik7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiYWRkX2V2ZW50IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZF9ldmVudChlLCB0LCBpLCBuKSB7CiAgICAgICAgdmFyIG8gPSBuID8gdGhpcy5lX3BhbmVsIDogdGhpcy5lX25vZGVzOwogICAgICAgIHIub24obywgdCwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgIHZhciBuID0gdCB8fCBldmVudDsKICAgICAgICAgIGkuY2FsbChlLCBuKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRfYmluZGVkX25vZGVpZCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfYmluZGVkX25vZGVpZChlKSB7CiAgICAgICAgaWYgKG51bGwgPT0gZSkgcmV0dXJuIG51bGw7CiAgICAgICAgdmFyIHQgPSBlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICByZXR1cm4gImptbm9kZSIgPT0gdCB8fCAiam1leHBhbmRlciIgPT0gdCA/IGUuZ2V0QXR0cmlidXRlKCJub2RlaWQiKSA6ICJqbW5vZGVzIiA9PSB0IHx8ICJib2R5IiA9PSB0IHx8ICJodG1sIiA9PSB0ID8gbnVsbCA6IHRoaXMuZ2V0X2JpbmRlZF9ub2RlaWQoZS5wYXJlbnRFbGVtZW50KTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJpc19ub2RlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGlzX25vZGUoZSkgewogICAgICAgIGlmIChudWxsID09IGUpIHJldHVybiAhMTsKICAgICAgICB2YXIgdCA9IGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHJldHVybiAiam1ub2RlIiA9PSB0IHx8ICJqbW5vZGVzIiAhPSB0ICYmICJib2R5IiAhPSB0ICYmICJodG1sIiAhPSB0ICYmIHRoaXMuaXNfbm9kZShlLnBhcmVudEVsZW1lbnQpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImlzX2V4cGFuZGVyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGlzX2V4cGFuZGVyKGUpIHsKICAgICAgICByZXR1cm4gImptZXhwYW5kZXIiID09IGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInJlc2V0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICAgIHMuZGVidWcoInZpZXcucmVzZXQiKSwgdGhpcy5zZWxlY3RlZF9ub2RlID0gbnVsbCwgdGhpcy5jbGVhcl9saW5lcygpLCB0aGlzLmNsZWFyX25vZGVzKCksIHRoaXMucmVzZXRfdGhlbWUoKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZXNldF90aGVtZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldF90aGVtZSgpIHsKICAgICAgICB2YXIgZSA9IHRoaXMuam0ub3B0aW9ucy50aGVtZTsKICAgICAgICB0aGlzLmVfbm9kZXMuY2xhc3NOYW1lID0gZSA/ICJ0aGVtZS0iICsgZSA6ICIiOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInJlc2V0X2N1c3RvbV9zdHlsZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldF9jdXN0b21fc3R5bGUoKSB7CiAgICAgICAgdmFyIGUgPSB0aGlzLmptLm1pbmQubm9kZXM7CiAgICAgICAgZm9yICh2YXIgdCBpbiBlKSB0aGlzLnJlc2V0X25vZGVfY3VzdG9tX3N0eWxlKGVbdF0pOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImxvYWQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZCgpIHsKICAgICAgICBzLmRlYnVnKCJ2aWV3LmxvYWQiKSwgdGhpcy5zZXR1cF9jYW52YXNfZHJhZ2dhYmxlKHRoaXMub3B0cy5kcmFnZ2FibGUpLCB0aGlzLmluaXRfbm9kZXMoKSwgdGhpcy5faW5pdGlhbGl6ZWQgPSAhMDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJleHBhbmRfc2l6ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBleHBhbmRfc2l6ZSgpIHsKICAgICAgICB2YXIgZSA9IHRoaXMubGF5b3V0LmdldF9taW5fc2l6ZSgpLAogICAgICAgICAgdCA9IGUudyArIDIgKiB0aGlzLm9wdHMuaG1hcmdpbiwKICAgICAgICAgIGkgPSBlLmggKyAyICogdGhpcy5vcHRzLnZtYXJnaW4sCiAgICAgICAgICBuID0gdGhpcy5lX3BhbmVsLmNsaWVudFdpZHRoLAogICAgICAgICAgbyA9IHRoaXMuZV9wYW5lbC5jbGllbnRIZWlnaHQ7CiAgICAgICAgbiA8IHQgJiYgKG4gPSB0KSwgbyA8IGkgJiYgKG8gPSBpKSwgdGhpcy5zaXplLncgPSBuLCB0aGlzLnNpemUuaCA9IG87CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiaW5pdF9ub2Rlc19zaXplIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRfbm9kZXNfc2l6ZShlKSB7CiAgICAgICAgdmFyIHQgPSBlLl9kYXRhLnZpZXc7CiAgICAgICAgdC53aWR0aCA9IHQuZWxlbWVudC5jbGllbnRXaWR0aCwgdC5oZWlnaHQgPSB0LmVsZW1lbnQuY2xpZW50SGVpZ2h0OwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImluaXRfbm9kZXMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdF9ub2RlcygpIHsKICAgICAgICB2YXIgX3RoaXM0ID0gdGhpczsKICAgICAgICB2YXIgZSA9IHRoaXMuam0ubWluZC5ub2RlcywKICAgICAgICAgIHQgPSByLmQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgICAgIGZvciAodmFyIGkgaW4gZSkgdGhpcy5jcmVhdGVfbm9kZV9lbGVtZW50KGVbaV0sIHQpOwogICAgICAgIHRoaXMuZV9ub2Rlcy5hcHBlbmRDaGlsZCh0KSwgdGhpcy5ydW5faW5fYzExeV9tb2RlX2lmX25lZWRlZChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBmb3IgKHZhciB0IGluIGUpIF90aGlzNC5pbml0X25vZGVzX3NpemUoZVt0XSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiYWRkX25vZGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gYWRkX25vZGUoZSkgewogICAgICAgIHZhciBfdGhpczUgPSB0aGlzOwogICAgICAgIHRoaXMuY3JlYXRlX25vZGVfZWxlbWVudChlLCB0aGlzLmVfbm9kZXMpLCB0aGlzLnJ1bl9pbl9jMTF5X21vZGVfaWZfbmVlZGVkKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIF90aGlzNS5pbml0X25vZGVzX3NpemUoZSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicnVuX2luX2MxMXlfbW9kZV9pZl9uZWVkZWQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcnVuX2luX2MxMXlfbW9kZV9pZl9uZWVkZWQoZSkgewogICAgICAgIHRoaXMuY29udGFpbmVyLm9mZnNldFBhcmVudCA/IGUoKSA6IChzLndhcm4oImluaXQgbm9kZXMgaW4gY29tcGF0aWJpbGl0eSBtb2RlLiBiZWNhdXNlIHRoZSBjb250YWluZXIgb3IgaXRzIHBhcmVudCBoYXMgc3R5bGUge2Rpc3BsYXk6bm9uZX0uICIpLCB0aGlzLmVfcGFuZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiLCB0aGlzLmVfcGFuZWwuc3R5bGUudG9wID0gIi0xMDAwMDAiLCByLmQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmVfcGFuZWwpLCBlKCksIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZV9wYW5lbCksIHRoaXMuZV9wYW5lbC5zdHlsZS5wb3NpdGlvbiA9IG51bGwsIHRoaXMuZV9wYW5lbC5zdHlsZS50b3AgPSBudWxsKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJjcmVhdGVfbm9kZV9lbGVtZW50IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZV9ub2RlX2VsZW1lbnQoZSwgdCkgewogICAgICAgIHZhciBpID0gbnVsbDsKICAgICAgICAidmlldyIgaW4gZS5fZGF0YSA/IGkgPSBlLl9kYXRhLnZpZXcgOiAoaSA9IHt9LCBlLl9kYXRhLnZpZXcgPSBpKTsKICAgICAgICB2YXIgbiA9IHIuYygiam1ub2RlIik7CiAgICAgICAgaWYgKGUuaXNyb290KSBuLmNsYXNzTmFtZSA9ICJyb290IjtlbHNlIHsKICAgICAgICAgIHZhciBvID0gci5jKCJqbWV4cGFuZGVyIik7CiAgICAgICAgICByLnQobywgIi0iKSwgby5zZXRBdHRyaWJ1dGUoIm5vZGVpZCIsIGUuaWQpLCBvLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIiwgdC5hcHBlbmRDaGlsZChvKSwgaS5leHBhbmRlciA9IG87CiAgICAgICAgfQogICAgICAgIGUudG9waWMgJiYgdGhpcy5yZW5kZXJfbm9kZShuLCBlKSwgbi5zZXRBdHRyaWJ1dGUoIm5vZGVpZCIsIGUuaWQpLCBuLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIiwgdGhpcy5fcmVzZXRfbm9kZV9jdXN0b21fc3R5bGUobiwgZS5kYXRhKSwgdC5hcHBlbmRDaGlsZChuKSwgaS5lbGVtZW50ID0gbjsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmVfbm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVfbm9kZShlKSB7CiAgICAgICAgbnVsbCAhPSB0aGlzLnNlbGVjdGVkX25vZGUgJiYgdGhpcy5zZWxlY3RlZF9ub2RlLmlkID09IGUuaWQgJiYgKHRoaXMuc2VsZWN0ZWRfbm9kZSA9IG51bGwpLCBudWxsICE9IHRoaXMuZWRpdGluZ19ub2RlICYmIHRoaXMuZWRpdGluZ19ub2RlLmlkID09IGUuaWQgJiYgKGUuX2RhdGEudmlldy5lbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuZV9lZGl0b3IpLCB0aGlzLmVkaXRpbmdfbm9kZSA9IG51bGwpOwogICAgICAgIGZvciAodmFyIHQgPSBlLmNoaWxkcmVuLCBpID0gdC5sZW5ndGg7IGktLTspIHRoaXMucmVtb3ZlX25vZGUodFtpXSk7CiAgICAgICAgaWYgKGUuX2RhdGEudmlldykgewogICAgICAgICAgdmFyIG4gPSBlLl9kYXRhLnZpZXcuZWxlbWVudCwKICAgICAgICAgICAgbyA9IGUuX2RhdGEudmlldy5leHBhbmRlcjsKICAgICAgICAgIHRoaXMuZV9ub2Rlcy5yZW1vdmVDaGlsZChuKSwgdGhpcy5lX25vZGVzLnJlbW92ZUNoaWxkKG8pLCBlLl9kYXRhLnZpZXcuZWxlbWVudCA9IG51bGwsIGUuX2RhdGEudmlldy5leHBhbmRlciA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInVwZGF0ZV9ub2RlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZV9ub2RlKGUpIHsKICAgICAgICB2YXIgdCA9IGUuX2RhdGEudmlldywKICAgICAgICAgIGkgPSB0LmVsZW1lbnQ7CiAgICAgICAgaWYgKGUudG9waWMgJiYgdGhpcy5yZW5kZXJfbm9kZShpLCBlKSwgdGhpcy5sYXlvdXQuaXNfdmlzaWJsZShlKSkgdC53aWR0aCA9IGkuY2xpZW50V2lkdGgsIHQuaGVpZ2h0ID0gaS5jbGllbnRIZWlnaHQ7ZWxzZSB7CiAgICAgICAgICB2YXIgX2UgPSBpLmdldEF0dHJpYnV0ZSgic3R5bGUiKTsKICAgICAgICAgIGkuc3R5bGUgPSAidmlzaWJpbGl0eTogdmlzaWJsZTsgbGVmdDowOyB0b3A6MDsiLCB0LndpZHRoID0gaS5jbGllbnRXaWR0aCwgdC5oZWlnaHQgPSBpLmNsaWVudEhlaWdodCwgaS5zdHlsZSA9IF9lOwogICAgICAgIH0KICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJzZWxlY3Rfbm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZWxlY3Rfbm9kZShlKSB7CiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRfbm9kZSkgewogICAgICAgICAgdmFyIHQgPSB0aGlzLnNlbGVjdGVkX25vZGUuX2RhdGEudmlldy5lbGVtZW50OwogICAgICAgICAgdC5jbGFzc05hbWUgPSB0LmNsYXNzTmFtZS5yZXBsYWNlKC9ccypzZWxlY3RlZFxiL2ksICIiKSwgdGhpcy5yZXN0b3JlX3NlbGVjdGVkX25vZGVfY3VzdG9tX3N0eWxlKHRoaXMuc2VsZWN0ZWRfbm9kZSk7CiAgICAgICAgfQogICAgICAgIGUgJiYgKHRoaXMuc2VsZWN0ZWRfbm9kZSA9IGUsIGUuX2RhdGEudmlldy5lbGVtZW50LmNsYXNzTmFtZSArPSAiIHNlbGVjdGVkIiwgdGhpcy5jbGVhcl9zZWxlY3RlZF9ub2RlX2N1c3RvbV9zdHlsZShlKSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAic2VsZWN0X2NsZWFyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbGVjdF9jbGVhcigpIHsKICAgICAgICB0aGlzLnNlbGVjdF9ub2RlKG51bGwpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImdldF9lZGl0aW5nX25vZGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0X2VkaXRpbmdfbm9kZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5lZGl0aW5nX25vZGU7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiaXNfZWRpdGluZyIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc19lZGl0aW5nKCkgewogICAgICAgIHJldHVybiAhIXRoaXMuZWRpdGluZ19ub2RlOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImVkaXRfbm9kZV9iZWdpbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBlZGl0X25vZGVfYmVnaW4oZSkgewogICAgICAgIGlmIChlLnRvcGljKSB7CiAgICAgICAgICBudWxsICE9IHRoaXMuZWRpdGluZ19ub2RlICYmIHRoaXMuZWRpdF9ub2RlX2VuZCgpLCB0aGlzLmVkaXRpbmdfbm9kZSA9IGU7CiAgICAgICAgICB2YXIgdCA9IGUuX2RhdGEudmlldy5lbGVtZW50LAogICAgICAgICAgICBpID0gZS50b3BpYywKICAgICAgICAgICAgbiA9IGdldENvbXB1dGVkU3R5bGUodCk7CiAgICAgICAgICB0aGlzLmVfZWRpdG9yLnZhbHVlID0gaSwgdGhpcy5lX2VkaXRvci5zdHlsZS53aWR0aCA9IHQuY2xpZW50V2lkdGggLSBwYXJzZUludChuLmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctbGVmdCIpKSAtIHBhcnNlSW50KG4uZ2V0UHJvcGVydHlWYWx1ZSgicGFkZGluZy1yaWdodCIpKSArICJweCIsIHQuaW5uZXJIVE1MID0gIiIsIHQuYXBwZW5kQ2hpbGQodGhpcy5lX2VkaXRvciksIHQuc3R5bGUuekluZGV4ID0gNSwgdGhpcy5lX2VkaXRvci5mb2N1cygpLCB0aGlzLmVfZWRpdG9yLnNlbGVjdCgpOwogICAgICAgIH0gZWxzZSBzLndhcm4oImRvbid0IGVkaXQgaW1hZ2Ugbm9kZXMiKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJlZGl0X25vZGVfZW5kIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGVkaXRfbm9kZV9lbmQoKSB7CiAgICAgICAgaWYgKG51bGwgIT0gdGhpcy5lZGl0aW5nX25vZGUpIHsKICAgICAgICAgIHZhciBlID0gdGhpcy5lZGl0aW5nX25vZGU7CiAgICAgICAgICB0aGlzLmVkaXRpbmdfbm9kZSA9IG51bGw7CiAgICAgICAgICB2YXIgdCA9IGUuX2RhdGEudmlldy5lbGVtZW50LAogICAgICAgICAgICBpID0gdGhpcy5lX2VkaXRvci52YWx1ZTsKICAgICAgICAgIHQuc3R5bGUuekluZGV4ID0gImF1dG8iLCB0LnJlbW92ZUNoaWxkKHRoaXMuZV9lZGl0b3IpLCBhLnRleHQuaXNfZW1wdHkoaSkgfHwgZS50b3BpYyA9PT0gaSA/IHRoaXMucmVuZGVyX25vZGUodCwgZSkgOiB0aGlzLmptLnVwZGF0ZV9ub2RlKGUuaWQsIGkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmVfcGFuZWwuZm9jdXMoKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRfdmlld19vZmZzZXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0X3ZpZXdfb2Zmc2V0KCkgewogICAgICAgIHZhciBlID0gdGhpcy5sYXlvdXQuYm91bmRzOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICB4OiAodGhpcy5zaXplLncgLSBlLmUgLSBlLncpIC8gMiwKICAgICAgICAgIHk6IHRoaXMuc2l6ZS5oIC8gMgogICAgICAgIH07CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVzaXplIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZSgpIHsKICAgICAgICB0aGlzLmdyYXBoLnNldF9zaXplKDEsIDEpLCB0aGlzLmVfbm9kZXMuc3R5bGUud2lkdGggPSAiMXB4IiwgdGhpcy5lX25vZGVzLnN0eWxlLmhlaWdodCA9ICIxcHgiLCB0aGlzLmV4cGFuZF9zaXplKCksIHRoaXMuX3Nob3coKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfc2hvdyIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfc2hvdygpIHsKICAgICAgICB0aGlzLmdyYXBoLnNldF9zaXplKHRoaXMuc2l6ZS53LCB0aGlzLnNpemUuaCksIHRoaXMuZV9ub2Rlcy5zdHlsZS53aWR0aCA9IHRoaXMuc2l6ZS53ICsgInB4IiwgdGhpcy5lX25vZGVzLnN0eWxlLmhlaWdodCA9IHRoaXMuc2l6ZS5oICsgInB4IiwgdGhpcy5zaG93X25vZGVzKCksIHRoaXMuc2hvd19saW5lcygpLCB0aGlzLmptLmludm9rZV9ldmVudF9oYW5kbGUoaS5yZXNpemUsIHsKICAgICAgICAgIGRhdGE6IFtdCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiem9vbV9pbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiB6b29tX2luKGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXRfem9vbSh0aGlzLnpvb21fY3VycmVudCArIHRoaXMub3B0cy56b29tLnN0ZXAsIGUpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInpvb21fb3V0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHpvb21fb3V0KGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXRfem9vbSh0aGlzLnpvb21fY3VycmVudCAtIHRoaXMub3B0cy56b29tLnN0ZXAsIGUpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNldF96b29tIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldF96b29tKGUsIHQpIHsKICAgICAgICBpZiAoZSA8IHRoaXMub3B0cy56b29tLm1pbiB8fCBlID4gdGhpcy5vcHRzLnpvb20ubWF4KSByZXR1cm4gITE7CiAgICAgICAgdmFyIGkgPSB0aGlzLmVfcGFuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgaWYgKGUgPCAxICYmIGUgPCB0aGlzLnpvb21fY3VycmVudCAmJiB0aGlzLnNpemUudyAqIGUgPCBpLndpZHRoICYmIHRoaXMuc2l6ZS5oICogZSA8IGkuaGVpZ2h0KSByZXR1cm4gITE7CiAgICAgICAgdmFyIG4gPSB0ID8gewogICAgICAgICAgICB4OiB0LnggLSBpLngsCiAgICAgICAgICAgIHk6IHQueSAtIGkueQogICAgICAgICAgfSA6IHsKICAgICAgICAgICAgeDogaS53aWR0aCAvIDIsCiAgICAgICAgICAgIHk6IGkuaGVpZ2h0IC8gMgogICAgICAgICAgfSwKICAgICAgICAgIG8gPSAodGhpcy5lX3BhbmVsLnNjcm9sbExlZnQgKyBuLngpICogZSAvIHRoaXMuem9vbV9jdXJyZW50IC0gbi54LAogICAgICAgICAgcyA9ICh0aGlzLmVfcGFuZWwuc2Nyb2xsVG9wICsgbi55KSAqIGUgLyB0aGlzLnpvb21fY3VycmVudCAtIG4ueTsKICAgICAgICB0aGlzLnpvb21fY3VycmVudCA9IGU7CiAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0aGlzLmVfcGFuZWwuY2hpbGRyZW4ubGVuZ3RoOyByKyspIHRoaXMuZV9wYW5lbC5jaGlsZHJlbltyXS5zdHlsZS56b29tID0gZTsKICAgICAgICByZXR1cm4gdGhpcy5fc2hvdygpLCB0aGlzLmVfcGFuZWwuc2Nyb2xsTGVmdCA9IG8sIHRoaXMuZV9wYW5lbC5zY3JvbGxUb3AgPSBzLCAhMDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJzaG93IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNob3coZSkgewogICAgICAgIHMuZGVidWcoInZpZXcuc2hvdzoge2tlZXBfY2VudGVyOiAiLmNvbmNhdChlLCAifSIpKSwgdGhpcy5leHBhbmRfc2l6ZSgpLCB0aGlzLl9zaG93KCksIGUgJiYgdGhpcy5jZW50ZXJfbm9kZSh0aGlzLmptLm1pbmQucm9vdCk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVsYXlvdXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVsYXlvdXQoKSB7CiAgICAgICAgdGhpcy5leHBhbmRfc2l6ZSgpLCB0aGlzLl9zaG93KCk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAic2F2ZV9sb2NhdGlvbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzYXZlX2xvY2F0aW9uKGUpIHsKICAgICAgICB2YXIgdCA9IGUuX2RhdGEudmlldzsKICAgICAgICB0Ll9zYXZlZF9sb2NhdGlvbiA9IHsKICAgICAgICAgIHg6IHBhcnNlSW50KHQuZWxlbWVudC5zdHlsZS5sZWZ0KSAtIHRoaXMuZV9wYW5lbC5zY3JvbGxMZWZ0LAogICAgICAgICAgeTogcGFyc2VJbnQodC5lbGVtZW50LnN0eWxlLnRvcCkgLSB0aGlzLmVfcGFuZWwuc2Nyb2xsVG9wCiAgICAgICAgfTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZXN0b3JlX2xvY2F0aW9uIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlc3RvcmVfbG9jYXRpb24oZSkgewogICAgICAgIHZhciB0ID0gZS5fZGF0YS52aWV3OwogICAgICAgIHRoaXMuZV9wYW5lbC5zY3JvbGxMZWZ0ID0gcGFyc2VJbnQodC5lbGVtZW50LnN0eWxlLmxlZnQpIC0gdC5fc2F2ZWRfbG9jYXRpb24ueCwgdGhpcy5lX3BhbmVsLnNjcm9sbFRvcCA9IHBhcnNlSW50KHQuZWxlbWVudC5zdHlsZS50b3ApIC0gdC5fc2F2ZWRfbG9jYXRpb24ueTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJjbGVhcl9ub2RlcyIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcl9ub2RlcygpIHsKICAgICAgICB2YXIgZSA9IHRoaXMuam0ubWluZDsKICAgICAgICBpZiAobnVsbCAhPSBlKSB7CiAgICAgICAgICB2YXIgdCA9IGUubm9kZXMsCiAgICAgICAgICAgIGkgPSBudWxsOwogICAgICAgICAgZm9yICh2YXIgbiBpbiB0KSAoaSA9IHRbbl0pLl9kYXRhLnZpZXcuZWxlbWVudCA9IG51bGwsIGkuX2RhdGEudmlldy5leHBhbmRlciA9IG51bGw7CiAgICAgICAgICB0aGlzLmVfbm9kZXMuaW5uZXJIVE1MID0gIiI7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNob3dfbm9kZXMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvd19ub2RlcygpIHsKICAgICAgICB2YXIgZSA9IHRoaXMuam0ubWluZC5ub2RlcywKICAgICAgICAgIHQgPSBudWxsLAogICAgICAgICAgaSA9IG51bGwsCiAgICAgICAgICBuID0gbnVsbCwKICAgICAgICAgIG8gPSBudWxsLAogICAgICAgICAgcyA9IHRoaXMuZ2V0X3ZpZXdfb2Zmc2V0KCk7CiAgICAgICAgZm9yICh2YXIgciBpbiBlKSBpID0gKG8gPSAodCA9IGVbcl0pLl9kYXRhLnZpZXcpLmVsZW1lbnQsIHRoaXMubGF5b3V0LmlzX3Zpc2libGUodCkgPyAodGhpcy5yZXNldF9ub2RlX2N1c3RvbV9zdHlsZSh0KSwgbiA9IHRoaXMubGF5b3V0LmdldF9ub2RlX3BvaW50KHQpLCBvLmFic194ID0gcy54ICsgbi54LCBvLmFic195ID0gcy55ICsgbi55LCBpLnN0eWxlLmxlZnQgPSBzLnggKyBuLnggKyAicHgiLCBpLnN0eWxlLnRvcCA9IHMueSArIG4ueSArICJweCIsIGkuc3R5bGUuZGlzcGxheSA9ICIiLCBpLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSIsIHRoaXMuX3Nob3dfZXhwYW5kZXIodCwgcykpIDogKGkuc3R5bGUuZGlzcGxheSA9ICJub25lIiwgby5leHBhbmRlci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfc2hvd19leHBhbmRlciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfc2hvd19leHBhbmRlcihlLCB0KSB7CiAgICAgICAgaWYgKGUuaXNyb290KSByZXR1cm47CiAgICAgICAgdmFyIGkgPSBlLl9kYXRhLnZpZXcuZXhwYW5kZXI7CiAgICAgICAgaWYgKDAgPT0gZS5jaGlsZHJlbi5sZW5ndGgpIHJldHVybiBpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIsIHZvaWQgKGkuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iKTsKICAgICAgICB2YXIgbiA9IHRoaXMuX2dldF9leHBhbmRlcl90ZXh0KGUpOwogICAgICAgIHIudChpLCBuKTsKICAgICAgICB2YXIgbyA9IHRoaXMubGF5b3V0LmdldF9leHBhbmRlcl9wb2ludChlKTsKICAgICAgICBpLnN0eWxlLmxlZnQgPSB0LnggKyBvLnggKyAicHgiLCBpLnN0eWxlLnRvcCA9IHQueSArIG8ueSArICJweCIsIGkuc3R5bGUuZGlzcGxheSA9ICIiLCBpLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2dldF9leHBhbmRlcl90ZXh0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRfZXhwYW5kZXJfdGV4dChlKSB7CiAgICAgICAgdmFyIHQgPSB0aGlzLm9wdHMuZXhwYW5kZXJfc3R5bGUgPyB0aGlzLm9wdHMuZXhwYW5kZXJfc3R5bGUudG9Mb3dlckNhc2UoKSA6ICJjaGFyIjsKICAgICAgICByZXR1cm4gIm51bWJlciIgPT09IHQgPyBlLmNoaWxkcmVuLmxlbmd0aCA+IDk5ID8gIi4uLiIgOiBlLmNoaWxkcmVuLmxlbmd0aCA6ICJjaGFyIiA9PT0gdCA/IGUuZXhwYW5kZWQgPyAiLSIgOiAiKyIgOiB2b2lkIDA7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2RlZmF1bHRfbm9kZV9yZW5kZXIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gX2RlZmF1bHRfbm9kZV9yZW5kZXIoZSwgdCkgewogICAgICAgIHRoaXMub3B0cy5zdXBwb3J0X2h0bWwgPyByLmgoZSwgdC50b3BpYykgOiByLnQoZSwgdC50b3BpYyk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2N1c3RvbV9ub2RlX3JlbmRlciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfY3VzdG9tX25vZGVfcmVuZGVyKGUsIHQpIHsKICAgICAgICB0aGlzLm9wdHMuY3VzdG9tX25vZGVfcmVuZGVyKHRoaXMuam0sIGUsIHQpIHx8IHRoaXMuX2RlZmF1bHRfbm9kZV9yZW5kZXIoZSwgdCk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVzZXRfbm9kZV9jdXN0b21fc3R5bGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXRfbm9kZV9jdXN0b21fc3R5bGUoZSkgewogICAgICAgIHRoaXMuX3Jlc2V0X25vZGVfY3VzdG9tX3N0eWxlKGUuX2RhdGEudmlldy5lbGVtZW50LCBlLmRhdGEpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIl9yZXNldF9ub2RlX2N1c3RvbV9zdHlsZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVzZXRfbm9kZV9jdXN0b21fc3R5bGUoZSwgdCkgewogICAgICAgIGlmICgiYmFja2dyb3VuZC1jb2xvciIgaW4gdCAmJiAoZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0WyJiYWNrZ3JvdW5kLWNvbG9yIl0pLCAiZm9yZWdyb3VuZC1jb2xvciIgaW4gdCAmJiAoZS5zdHlsZS5jb2xvciA9IHRbImZvcmVncm91bmQtY29sb3IiXSksICJ3aWR0aCIgaW4gdCAmJiAoZS5zdHlsZS53aWR0aCA9IHQud2lkdGggKyAicHgiKSwgImhlaWdodCIgaW4gdCAmJiAoZS5zdHlsZS5oZWlnaHQgPSB0LmhlaWdodCArICJweCIpLCAiZm9udC1zaXplIiBpbiB0ICYmIChlLnN0eWxlLmZvbnRTaXplID0gdFsiZm9udC1zaXplIl0gKyAicHgiKSwgImZvbnQtd2VpZ2h0IiBpbiB0ICYmIChlLnN0eWxlLmZvbnRXZWlnaHQgPSB0WyJmb250LXdlaWdodCJdKSwgImZvbnQtc3R5bGUiIGluIHQgJiYgKGUuc3R5bGUuZm9udFN0eWxlID0gdFsiZm9udC1zdHlsZSJdKSwgImJhY2tncm91bmQtaW1hZ2UiIGluIHQpIHsKICAgICAgICAgIHZhciBpID0gdFsiYmFja2dyb3VuZC1pbWFnZSJdOwogICAgICAgICAgaWYgKGkuc3RhcnRzV2l0aCgiZGF0YSIpICYmIHQud2lkdGggJiYgdC5oZWlnaHQpIHsKICAgICAgICAgICAgdmFyIG4gPSBuZXcgSW1hZ2UoKTsKICAgICAgICAgICAgbi5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIHQgPSByLmMoImNhbnZhcyIpOwogICAgICAgICAgICAgIHQud2lkdGggPSBlLmNsaWVudFdpZHRoLCB0LmhlaWdodCA9IGUuY2xpZW50SGVpZ2h0OwogICAgICAgICAgICAgIGlmICh0LmdldENvbnRleHQpIHsKICAgICAgICAgICAgICAgIHQuZ2V0Q29udGV4dCgiMmQiKS5kcmF3SW1hZ2UodGhpcywgMiwgMiwgZS5jbGllbnRXaWR0aCwgZS5jbGllbnRIZWlnaHQpOwogICAgICAgICAgICAgICAgdmFyIGkgPSB0LnRvRGF0YVVSTCgpOwogICAgICAgICAgICAgICAgZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKCIgKyBpICsgIikiOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgbi5zcmMgPSBpOwogICAgICAgICAgfSBlbHNlIGUuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaSArICIpIjsKICAgICAgICAgIGUuc3R5bGUuYmFja2dyb3VuZFNpemUgPSAiOTklIiwgImJhY2tncm91bmQtcm90YXRpb24iIGluIHQgJiYgKGUuc3R5bGUudHJhbnNmb3JtID0gInJvdGF0ZSgiICsgdFsiYmFja2dyb3VuZC1yb3RhdGlvbiJdICsgImRlZykiKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVzdG9yZV9zZWxlY3RlZF9ub2RlX2N1c3RvbV9zdHlsZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZXN0b3JlX3NlbGVjdGVkX25vZGVfY3VzdG9tX3N0eWxlKGUpIHsKICAgICAgICB2YXIgdCA9IGUuX2RhdGEudmlldy5lbGVtZW50LAogICAgICAgICAgaSA9IGUuZGF0YTsKICAgICAgICAiYmFja2dyb3VuZC1jb2xvciIgaW4gaSAmJiAodC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBpWyJiYWNrZ3JvdW5kLWNvbG9yIl0pLCAiZm9yZWdyb3VuZC1jb2xvciIgaW4gaSAmJiAodC5zdHlsZS5jb2xvciA9IGlbImZvcmVncm91bmQtY29sb3IiXSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiY2xlYXJfc2VsZWN0ZWRfbm9kZV9jdXN0b21fc3R5bGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXJfc2VsZWN0ZWRfbm9kZV9jdXN0b21fc3R5bGUoZSkgewogICAgICAgIHZhciB0ID0gZS5fZGF0YS52aWV3LmVsZW1lbnQ7CiAgICAgICAgdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiIiwgdC5zdHlsZS5jb2xvciA9ICIiOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImNsZWFyX2xpbmVzIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyX2xpbmVzKCkgewogICAgICAgIHRoaXMuZ3JhcGguY2xlYXIoKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJzaG93X2xpbmVzIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNob3dfbGluZXMoKSB7CiAgICAgICAgdGhpcy5jbGVhcl9saW5lcygpOwogICAgICAgIHZhciBlID0gdGhpcy5qbS5taW5kLm5vZGVzLAogICAgICAgICAgdCA9IG51bGwsCiAgICAgICAgICBpID0gbnVsbCwKICAgICAgICAgIG4gPSBudWxsLAogICAgICAgICAgbyA9IG51bGwsCiAgICAgICAgICBzID0gdGhpcy5nZXRfdmlld19vZmZzZXQoKTsKICAgICAgICBmb3IgKHZhciByIGluIGUpICh0ID0gZVtyXSkuaXNyb290IHx8IHRoaXMubGF5b3V0LmlzX3Zpc2libGUodCkgJiYgKGkgPSB0aGlzLmxheW91dC5nZXRfbm9kZV9wb2ludF9pbih0KSwgbiA9IHRoaXMubGF5b3V0LmdldF9ub2RlX3BvaW50X291dCh0LnBhcmVudCksIG8gPSB0LmRhdGFbImxlYWRpbmctbGluZS1jb2xvciJdLCB0aGlzLmdyYXBoLmRyYXdfbGluZShuLCBpLCBzLCBvKSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAic2V0dXBfY2FudmFzX2RyYWdnYWJsZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXR1cF9jYW52YXNfZHJhZ2dhYmxlKGUpIHsKICAgICAgICB2YXIgX3RoaXM2ID0gdGhpczsKICAgICAgICBpZiAodGhpcy5vcHRzLmRyYWdnYWJsZSA9IGUsICF0aGlzLl9pbml0aWFsaXplZCkgewogICAgICAgICAgdmFyIF9lMiwKICAgICAgICAgICAgX3Q0LAogICAgICAgICAgICBfaSA9ICExOwogICAgICAgICAgdGhpcy5vcHRzLmhpZGVfc2Nyb2xsYmFyc193aGVuX2RyYWdnYWJsZSAmJiAodGhpcy5lX3BhbmVsLnN0eWxlID0gIm92ZXJmbG93OiBoaWRkZW4iKSwgci5vbih0aGlzLmNvbnRhaW5lciwgIm1vdXNlZG93biIsIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgIF90aGlzNi5vcHRzLmRyYWdnYWJsZSAmJiAoX2kgPSAhMCwgX2UyID0gbi5jbGllbnRYLCBfdDQgPSBuLmNsaWVudFkpOwogICAgICAgICAgfSksIHIub24odGhpcy5jb250YWluZXIsICJtb3VzZXVwIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfaSA9ICExOwogICAgICAgICAgfSksIHIub24odGhpcy5jb250YWluZXIsICJtb3VzZW1vdmUiLCBmdW5jdGlvbiAobikgewogICAgICAgICAgICBfdGhpczYub3B0cy5kcmFnZ2FibGUgJiYgX2kgJiYgKF90aGlzNi5lX3BhbmVsLnNjcm9sbEJ5KF9lMiAtIG4uY2xpZW50WCwgX3Q0IC0gbi5jbGllbnRZKSwgX2UyID0gbi5jbGllbnRYLCBfdDQgPSBuLmNsaWVudFkpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImNlbnRlcl9ub2RlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNlbnRlcl9ub2RlKGUpIHsKICAgICAgICBpZiAoIXRoaXMubGF5b3V0LmlzX3Zpc2libGUoZSkpIHJldHVybiBzLndhcm4oImNhbiBub3Qgc2Nyb2xsIHRvIHRoZSBub2RlLCBiZWNhdXNlIGl0IGlzIGludmlzaWJsZSIpLCAhMTsKICAgICAgICB2YXIgdCA9IGUuX2RhdGEudmlldywKICAgICAgICAgIGkgPSB0aGlzLmVfcGFuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICAgICAgICBuID0gdC5hYnNfeCArIHQud2lkdGggLyAyLAogICAgICAgICAgbyA9IHQuYWJzX3kgKyB0LmhlaWdodCAvIDI7CiAgICAgICAgcmV0dXJuIHRoaXMuZV9wYW5lbC5zY3JvbGxUbyhuICogdGhpcy56b29tX2N1cnJlbnQgLSBpLndpZHRoIC8gMiwgbyAqIHRoaXMuem9vbV9jdXJyZW50IC0gaS5oZWlnaHQgLyAyKSwgITA7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiem9vbUluIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHpvb21JbihlKSB7CiAgICAgICAgcmV0dXJuIHMud2FybigicGxlYXNlIHVzZSB6b29tX2luIGluc3RlYWQiKSwgdGhpcy56b29tX2luKGUpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInpvb21PdXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gem9vbU91dChlKSB7CiAgICAgICAgcmV0dXJuIHMud2FybigicGxlYXNlIHVzZSB6b29tX291dCBpbnN0ZWFkIiksIHRoaXMuem9vbV9vdXQoZSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAic2V0Wm9vbSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRab29tKGUsIHQpIHsKICAgICAgICByZXR1cm4gcy53YXJuKCJwbGVhc2UgdXNlIHNldF96b29tIGluc3RlYWQiKSwgdGhpcy5zZXRfem9vbShlLCB0KTsKICAgICAgfQogICAgfV0pOwogIH0oKTsKICB2YXIgbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBtKGUsIHQpIHsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIG0pOwogICAgICB0aGlzLmptID0gZSwgdGhpcy5vcHRzID0gdCwgdGhpcy5tYXBwaW5nID0gdC5tYXBwaW5nLCB0aGlzLmhhbmRsZXMgPSB0LmhhbmRsZXMsIHRoaXMuX25ld2lkID0gbnVsbCwgdGhpcy5fbWFwcGluZyA9IHt9OwogICAgfQogICAgcmV0dXJuIF9jcmVhdGVDbGFzcyhtLCBbewogICAgICBrZXk6ICJpbml0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgICAgZm9yICh2YXIgZSBpbiByLm9uKHRoaXMuam0udmlldy5lX3BhbmVsLCAia2V5ZG93biIsIHRoaXMuaGFuZGxlci5iaW5kKHRoaXMpKSwgdGhpcy5oYW5kbGVzLmFkZGNoaWxkID0gdGhpcy5oYW5kbGVfYWRkY2hpbGQsIHRoaXMuaGFuZGxlcy5hZGRicm90aGVyID0gdGhpcy5oYW5kbGVfYWRkYnJvdGhlciwgdGhpcy5oYW5kbGVzLmVkaXRub2RlID0gdGhpcy5oYW5kbGVfZWRpdG5vZGUsIHRoaXMuaGFuZGxlcy5kZWxub2RlID0gdGhpcy5oYW5kbGVfZGVsbm9kZSwgdGhpcy5oYW5kbGVzLnRvZ2dsZSA9IHRoaXMuaGFuZGxlX3RvZ2dsZSwgdGhpcy5oYW5kbGVzLnVwID0gdGhpcy5oYW5kbGVfdXAsIHRoaXMuaGFuZGxlcy5kb3duID0gdGhpcy5oYW5kbGVfZG93biwgdGhpcy5oYW5kbGVzLmxlZnQgPSB0aGlzLmhhbmRsZV9sZWZ0LCB0aGlzLmhhbmRsZXMucmlnaHQgPSB0aGlzLmhhbmRsZV9yaWdodCwgdGhpcy5tYXBwaW5nKSBpZiAodGhpcy5tYXBwaW5nW2VdICYmIGUgaW4gdGhpcy5oYW5kbGVzKSB7CiAgICAgICAgICB2YXIgX3Q1ID0gdGhpcy5tYXBwaW5nW2VdOwogICAgICAgICAgQXJyYXkuaXNBcnJheShfdDUpIHx8IChfdDUgPSBbX3Q1XSk7CiAgICAgICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKF90NSksCiAgICAgICAgICAgIF9zdGVwMjsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7CiAgICAgICAgICAgICAgdmFyIF9pMiA9IF9zdGVwMi52YWx1ZTsKICAgICAgICAgICAgICB0aGlzLl9tYXBwaW5nW19pMl0gPSB0aGlzLmhhbmRsZXNbZV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIF9pdGVyYXRvcjIuZigpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAiZnVuY3Rpb24iID09IHR5cGVvZiB0aGlzLm9wdHMuaWRfZ2VuZXJhdG9yID8gdGhpcy5fbmV3aWQgPSB0aGlzLm9wdHMuaWRfZ2VuZXJhdG9yIDogdGhpcy5fbmV3aWQgPSBhLnV1aWQubmV3aWQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZW5hYmxlX3Nob3J0Y3V0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZV9zaG9ydGN1dCgpIHsKICAgICAgICB0aGlzLm9wdHMuZW5hYmxlID0gITA7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZGlzYWJsZV9zaG9ydGN1dCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlX3Nob3J0Y3V0KCkgewogICAgICAgIHRoaXMub3B0cy5lbmFibGUgPSAhMTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJoYW5kbGVyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZXIoZSkgewogICAgICAgIGlmICg5ID09IGUud2hpY2ggJiYgZS5wcmV2ZW50RGVmYXVsdCgpLCAhdGhpcy5qbS52aWV3LmlzX2VkaXRpbmcoKSkgewogICAgICAgICAgdmFyIHQgPSBlIHx8IGV2ZW50OwogICAgICAgICAgaWYgKCF0aGlzLm9wdHMuZW5hYmxlKSByZXR1cm4gITA7CiAgICAgICAgICB2YXIgaSA9IHQua2V5Q29kZSArICh0Lm1ldGFLZXkgPDwgMTMpICsgKHQuY3RybEtleSA8PCAxMikgKyAodC5hbHRLZXkgPDwgMTEpICsgKHQuc2hpZnRLZXkgPDwgMTApOwogICAgICAgICAgaSBpbiB0aGlzLl9tYXBwaW5nICYmIHRoaXMuX21hcHBpbmdbaV0uY2FsbCh0aGlzLCB0aGlzLmptLCBlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiaGFuZGxlX2FkZGNoaWxkIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZV9hZGRjaGlsZChlLCB0KSB7CiAgICAgICAgdmFyIGkgPSBlLmdldF9zZWxlY3RlZF9ub2RlKCk7CiAgICAgICAgaWYgKGkpIHsKICAgICAgICAgIHZhciBuID0gdGhpcy5fbmV3aWQoKTsKICAgICAgICAgIGUuYWRkX25vZGUoaSwgbiwgIk5ldyBOb2RlIikgJiYgKGUuc2VsZWN0X25vZGUobiksIGUuYmVnaW5fZWRpdChuKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImhhbmRsZV9hZGRicm90aGVyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZV9hZGRicm90aGVyKGUsIHQpIHsKICAgICAgICB2YXIgaSA9IGUuZ2V0X3NlbGVjdGVkX25vZGUoKTsKICAgICAgICBpZiAoaSAmJiAhaS5pc3Jvb3QpIHsKICAgICAgICAgIHZhciBuID0gdGhpcy5fbmV3aWQoKTsKICAgICAgICAgIGUuaW5zZXJ0X25vZGVfYWZ0ZXIoaSwgbiwgIk5ldyBOb2RlIikgJiYgKGUuc2VsZWN0X25vZGUobiksIGUuYmVnaW5fZWRpdChuKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImhhbmRsZV9lZGl0bm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVfZWRpdG5vZGUoZSwgdCkgewogICAgICAgIHZhciBpID0gZS5nZXRfc2VsZWN0ZWRfbm9kZSgpOwogICAgICAgIGkgJiYgZS5iZWdpbl9lZGl0KGkpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImhhbmRsZV9kZWxub2RlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZV9kZWxub2RlKGUsIHQpIHsKICAgICAgICB2YXIgaSA9IGUuZ2V0X3NlbGVjdGVkX25vZGUoKTsKICAgICAgICBpICYmICFpLmlzcm9vdCAmJiAoZS5zZWxlY3Rfbm9kZShpLnBhcmVudCksIGUucmVtb3ZlX25vZGUoaSkpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImhhbmRsZV90b2dnbGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlX3RvZ2dsZShlLCB0KSB7CiAgICAgICAgdmFyIGkgPSB0IHx8IGV2ZW50LAogICAgICAgICAgbiA9IGUuZ2V0X3NlbGVjdGVkX25vZGUoKTsKICAgICAgICBuICYmIChlLnRvZ2dsZV9ub2RlKG4uaWQpLCBpLnN0b3BQcm9wYWdhdGlvbigpLCBpLnByZXZlbnREZWZhdWx0KCkpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImhhbmRsZV91cCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVfdXAoZSwgdCkgewogICAgICAgIHZhciBpID0gdCB8fCBldmVudCwKICAgICAgICAgIG4gPSBlLmdldF9zZWxlY3RlZF9ub2RlKCk7CiAgICAgICAgaWYgKG4pIHsKICAgICAgICAgIHZhciBvID0gZS5maW5kX25vZGVfYmVmb3JlKG4pOwogICAgICAgICAgaWYgKCFvKSB7CiAgICAgICAgICAgIHZhciBzID0gZS5maW5kX25vZGVfYmVmb3JlKG4ucGFyZW50KTsKICAgICAgICAgICAgcyAmJiBzLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgKG8gPSBzLmNoaWxkcmVuW3MuY2hpbGRyZW4ubGVuZ3RoIC0gMV0pOwogICAgICAgICAgfQogICAgICAgICAgbyAmJiBlLnNlbGVjdF9ub2RlKG8pLCBpLnN0b3BQcm9wYWdhdGlvbigpLCBpLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImhhbmRsZV9kb3duIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZV9kb3duKGUsIHQpIHsKICAgICAgICB2YXIgaSA9IHQgfHwgZXZlbnQsCiAgICAgICAgICBuID0gZS5nZXRfc2VsZWN0ZWRfbm9kZSgpOwogICAgICAgIGlmIChuKSB7CiAgICAgICAgICB2YXIgbyA9IGUuZmluZF9ub2RlX2FmdGVyKG4pOwogICAgICAgICAgaWYgKCFvKSB7CiAgICAgICAgICAgIHZhciBzID0gZS5maW5kX25vZGVfYWZ0ZXIobi5wYXJlbnQpOwogICAgICAgICAgICBzICYmIHMuY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiAobyA9IHMuY2hpbGRyZW5bMF0pOwogICAgICAgICAgfQogICAgICAgICAgbyAmJiBlLnNlbGVjdF9ub2RlKG8pLCBpLnN0b3BQcm9wYWdhdGlvbigpLCBpLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImhhbmRsZV9sZWZ0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZV9sZWZ0KGUsIGkpIHsKICAgICAgICB0aGlzLl9oYW5kbGVfZGlyZWN0aW9uKGUsIGksIHQubGVmdCk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiaGFuZGxlX3JpZ2h0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZV9yaWdodChlLCBpKSB7CiAgICAgICAgdGhpcy5faGFuZGxlX2RpcmVjdGlvbihlLCBpLCB0LnJpZ2h0KTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfaGFuZGxlX2RpcmVjdGlvbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlX2RpcmVjdGlvbihlLCB0LCBpKSB7CiAgICAgICAgdmFyIG4gPSB0IHx8IGV2ZW50LAogICAgICAgICAgbyA9IGUuZ2V0X3NlbGVjdGVkX25vZGUoKSwKICAgICAgICAgIHMgPSBudWxsOwogICAgICAgIGlmIChvKSB7CiAgICAgICAgICBpZiAoby5pc3Jvb3QpIHsKICAgICAgICAgICAgZm9yICh2YXIgciA9IG8uY2hpbGRyZW4sIGEgPSBbXSwgZCA9IDA7IGQgPCByLmxlbmd0aDsgZCsrKSByW2RdLmRpcmVjdGlvbiA9PT0gaSAmJiBhLnB1c2goZCk7CiAgICAgICAgICAgIHMgPSByW2FbTWF0aC5mbG9vcigoYS5sZW5ndGggLSAxKSAvIDIpXV07CiAgICAgICAgICB9IGVsc2UgaWYgKG8uZGlyZWN0aW9uID09PSBpKSB7CiAgICAgICAgICAgIHZhciBsID0gKGEgPSBvLmNoaWxkcmVuKS5sZW5ndGg7CiAgICAgICAgICAgIGwgPiAwICYmIChzID0gYVtNYXRoLmZsb29yKChsIC0gMSkgLyAyKV0pOwogICAgICAgICAgfSBlbHNlIHMgPSBvLnBhcmVudDsKICAgICAgICAgIHMgJiYgZS5zZWxlY3Rfbm9kZShzKSwgbi5zdG9wUHJvcGFnYXRpb24oKSwgbi5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfV0pOwogIH0oKTsKICB2YXIgdyA9IHsKICAgIHBsdWdpbnM6IFtdCiAgfTsKICBmdW5jdGlvbiB5KGUpIHsKICAgIGlmICghKGUgaW5zdGFuY2VvZiB4KSkgdGhyb3cgbmV3IEVycm9yKCJjYW4gbm90IHJlZ2lzdGVyIHBsdWdpbiwgaXQgaXMgbm90IGFuIGluc3RhbmNlIG9mIFBsdWdpbiIpOwogICAgaWYgKHcucGx1Z2lucy5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgcmV0dXJuIGUubmFtZTsKICAgIH0pLmluY2x1ZGVzKGUubmFtZSkpIHRocm93IG5ldyBFcnJvcigiY2FuIG5vdCByZWdpc3RlciBwbHVnaW4gIiArIGUubmFtZSArICI6IHBsdWdpbiBuYW1lIGFscmVhZHkgZXhpc3QiKTsKICAgIHcucGx1Z2lucy5wdXNoKGUpOwogIH0KICBmdW5jdGlvbiBiKGUsIHQpIHsKICAgIHIudy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgIWZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgdy5wbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKGkpIHsKICAgICAgICAgIHJldHVybiBpLmZuX2luaXQoZSwgdFtpLm5hbWVdKTsKICAgICAgICB9KTsKICAgICAgfShlLCB0KTsKICAgIH0sIDApOwogIH0KICB2YXIgeCA9IC8qI19fUFVSRV9fKi9fY3JlYXRlQ2xhc3MoZnVuY3Rpb24geChlLCB0KSB7CiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgeCk7CiAgICBpZiAoIWUpIHRocm93IG5ldyBFcnJvcigicGx1Z2luIG11c3QgaGFzIGEgbmFtZSIpOwogICAgaWYgKCF0IHx8ICJmdW5jdGlvbiIgIT0gdHlwZW9mIHQpIHRocm93IG5ldyBFcnJvcigicGx1Z2luIG11c3QgaGFzIGFuIGluaXQgZnVuY3Rpb24iKTsKICAgIHRoaXMubmFtZSA9IGUsIHRoaXMuZm5faW5pdCA9IHQ7CiAgfSk7CiAgdmFyIHogPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24geih0KSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCB6KTsKICAgICAgei5jdXJyZW50ID0gdGhpcywgdGhpcy5vcHRpb25zID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgIGlmIChhLmpzb24ubWVyZ2UodCwgZCksIGEuanNvbi5tZXJnZSh0LCBlKSwgIXQuY29udGFpbmVyKSB0aHJvdyBuZXcgRXJyb3IoInRoZSBvcHRpb25zLmNvbnRhaW5lciBzaG91bGQgbm90IGJlIG51bGwgb3IgZW1wdHkuIik7CiAgICAgICAgcmV0dXJuIHQ7CiAgICAgIH0odCksIHMubGV2ZWwoblt0aGlzLm9wdGlvbnMubG9nX2xldmVsXSksIHRoaXMudmVyc2lvbiA9IGUsIHRoaXMuaW5pdGlhbGl6ZWQgPSAhMSwgdGhpcy5taW5kID0gbnVsbCwgdGhpcy5ldmVudF9oYW5kbGVzID0gW10sIHRoaXMuaW5pdCgpOwogICAgfQogICAgcmV0dXJuIF9jcmVhdGVDbGFzcyh6LCBbewogICAgICBrZXk6ICJpbml0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7CiAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gITA7CiAgICAgICAgICB2YXIgZSA9IHsKICAgICAgICAgICAgICBtb2RlOiB0aGlzLm9wdGlvbnMubW9kZSwKICAgICAgICAgICAgICBoc3BhY2U6IHRoaXMub3B0aW9ucy5sYXlvdXQuaHNwYWNlLAogICAgICAgICAgICAgIHZzcGFjZTogdGhpcy5vcHRpb25zLmxheW91dC52c3BhY2UsCiAgICAgICAgICAgICAgcHNwYWNlOiB0aGlzLm9wdGlvbnMubGF5b3V0LnBzcGFjZSwKICAgICAgICAgICAgICBjb3VzaW5fc3BhY2U6IHRoaXMub3B0aW9ucy5sYXlvdXQuY291c2luX3NwYWNlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHQgPSB7CiAgICAgICAgICAgICAgY29udGFpbmVyOiB0aGlzLm9wdGlvbnMuY29udGFpbmVyLAogICAgICAgICAgICAgIHN1cHBvcnRfaHRtbDogdGhpcy5vcHRpb25zLnN1cHBvcnRfaHRtbCwKICAgICAgICAgICAgICBlbmdpbmU6IHRoaXMub3B0aW9ucy52aWV3LmVuZ2luZSwKICAgICAgICAgICAgICBlbmFibGVfZGV2aWNlX3BpeGVsX3JhdGlvOiB0aGlzLm9wdGlvbnMudmlldy5lbmFibGVfZGV2aWNlX3BpeGVsX3JhdGlvLAogICAgICAgICAgICAgIGhtYXJnaW46IHRoaXMub3B0aW9ucy52aWV3LmhtYXJnaW4sCiAgICAgICAgICAgICAgdm1hcmdpbjogdGhpcy5vcHRpb25zLnZpZXcudm1hcmdpbiwKICAgICAgICAgICAgICBsaW5lX3dpZHRoOiB0aGlzLm9wdGlvbnMudmlldy5saW5lX3dpZHRoLAogICAgICAgICAgICAgIGxpbmVfY29sb3I6IHRoaXMub3B0aW9ucy52aWV3LmxpbmVfY29sb3IsCiAgICAgICAgICAgICAgbGluZV9zdHlsZTogdGhpcy5vcHRpb25zLnZpZXcubGluZV9zdHlsZSwKICAgICAgICAgICAgICBjdXN0b21fbGluZV9yZW5kZXI6IHRoaXMub3B0aW9ucy52aWV3LmN1c3RvbV9saW5lX3JlbmRlciwKICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRoaXMub3B0aW9ucy52aWV3LmRyYWdnYWJsZSwKICAgICAgICAgICAgICBoaWRlX3Njcm9sbGJhcnNfd2hlbl9kcmFnZ2FibGU6IHRoaXMub3B0aW9ucy52aWV3LmhpZGVfc2Nyb2xsYmFyc193aGVuX2RyYWdnYWJsZSwKICAgICAgICAgICAgICBub2RlX292ZXJmbG93OiB0aGlzLm9wdGlvbnMudmlldy5ub2RlX292ZXJmbG93LAogICAgICAgICAgICAgIHpvb206IHRoaXMub3B0aW9ucy52aWV3Lnpvb20sCiAgICAgICAgICAgICAgY3VzdG9tX25vZGVfcmVuZGVyOiB0aGlzLm9wdGlvbnMudmlldy5jdXN0b21fbm9kZV9yZW5kZXIsCiAgICAgICAgICAgICAgZXhwYW5kZXJfc3R5bGU6IHRoaXMub3B0aW9ucy52aWV3LmV4cGFuZGVyX3N0eWxlCiAgICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgYyh0aGlzKSwgdGhpcy5sYXlvdXQgPSBuZXcgcCh0aGlzLCBlKSwgdGhpcy52aWV3ID0gbmV3IGcodGhpcywgdCksIHRoaXMuc2hvcnRjdXQgPSBuZXcgbSh0aGlzLCB0aGlzLm9wdGlvbnMuc2hvcnRjdXQpLCB0aGlzLmRhdGEuaW5pdCgpLCB0aGlzLmxheW91dC5pbml0KCksIHRoaXMudmlldy5pbml0KCksIHRoaXMuc2hvcnRjdXQuaW5pdCgpLCB0aGlzLl9ldmVudF9iaW5kKCksIGIodGhpcywgdGhpcy5vcHRpb25zLnBsdWdpbik7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImdldF9lZGl0YWJsZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfZWRpdGFibGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5lZGl0YWJsZTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJlbmFibGVfZWRpdCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVfZWRpdCgpIHsKICAgICAgICB0aGlzLm9wdGlvbnMuZWRpdGFibGUgPSAhMDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJkaXNhYmxlX2VkaXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZGlzYWJsZV9lZGl0KCkgewogICAgICAgIHRoaXMub3B0aW9ucy5lZGl0YWJsZSA9ICExOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImdldF92aWV3X2RyYWdnYWJsZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfdmlld19kcmFnZ2FibGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy52aWV3LmRyYWdnYWJsZTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJlbmFibGVfdmlld19kcmFnZ2FibGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlX3ZpZXdfZHJhZ2dhYmxlKCkgewogICAgICAgIHRoaXMub3B0aW9ucy52aWV3LmRyYWdnYWJsZSA9ICEwLCB0aGlzLnZpZXcuc2V0dXBfY2FudmFzX2RyYWdnYWJsZSghMCk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZGlzYWJsZV92aWV3X2RyYWdnYWJsZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlX3ZpZXdfZHJhZ2dhYmxlKCkgewogICAgICAgIHRoaXMub3B0aW9ucy52aWV3LmRyYWdnYWJsZSA9ICExLCB0aGlzLnZpZXcuc2V0dXBfY2FudmFzX2RyYWdnYWJsZSghMSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZW5hYmxlX2V2ZW50X2hhbmRsZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVfZXZlbnRfaGFuZGxlKGUpIHsKICAgICAgICB0aGlzLm9wdGlvbnMuZGVmYXVsdF9ldmVudF9oYW5kbGVbImVuYWJsZV8iICsgZSArICJfaGFuZGxlIl0gPSAhMDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJkaXNhYmxlX2V2ZW50X2hhbmRsZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlX2V2ZW50X2hhbmRsZShlKSB7CiAgICAgICAgdGhpcy5vcHRpb25zLmRlZmF1bHRfZXZlbnRfaGFuZGxlWyJlbmFibGVfIiArIGUgKyAiX2hhbmRsZSJdID0gITE7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAic2V0X3RoZW1lIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldF90aGVtZShlKSB7CiAgICAgICAgdmFyIHQgPSB0aGlzLm9wdGlvbnMudGhlbWU7CiAgICAgICAgdGhpcy5vcHRpb25zLnRoZW1lID0gZSB8fCBudWxsLCB0ICE9IHRoaXMub3B0aW9ucy50aGVtZSAmJiAodGhpcy52aWV3LnJlc2V0X3RoZW1lKCksIHRoaXMudmlldy5yZXNldF9jdXN0b21fc3R5bGUoKSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2V2ZW50X2JpbmQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gX2V2ZW50X2JpbmQoKSB7CiAgICAgICAgdGhpcy52aWV3LmFkZF9ldmVudCh0aGlzLCAibW91c2Vkb3duIiwgdGhpcy5tb3VzZWRvd25faGFuZGxlKSwgdGhpcy52aWV3LmFkZF9ldmVudCh0aGlzLCAiY2xpY2siLCB0aGlzLmNsaWNrX2hhbmRsZSksIHRoaXMudmlldy5hZGRfZXZlbnQodGhpcywgImRibGNsaWNrIiwgdGhpcy5kYmxjbGlja19oYW5kbGUpLCB0aGlzLnZpZXcuYWRkX2V2ZW50KHRoaXMsICJtb3VzZXdoZWVsIiwgdGhpcy5tb3VzZXdoZWVsX2hhbmRsZSwgITApOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIm1vdXNlZG93bl9oYW5kbGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gbW91c2Vkb3duX2hhbmRsZShlKSB7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWZhdWx0X2V2ZW50X2hhbmRsZS5lbmFibGVfbW91c2Vkb3duX2hhbmRsZSkgewogICAgICAgICAgdmFyIHQgPSBlLnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50LAogICAgICAgICAgICBpID0gdGhpcy52aWV3LmdldF9iaW5kZWRfbm9kZWlkKHQpOwogICAgICAgICAgaSA/IHRoaXMudmlldy5pc19ub2RlKHQpICYmIHRoaXMuc2VsZWN0X25vZGUoaSkgOiB0aGlzLnNlbGVjdF9jbGVhcigpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJjbGlja19oYW5kbGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gY2xpY2tfaGFuZGxlKGUpIHsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlZmF1bHRfZXZlbnRfaGFuZGxlLmVuYWJsZV9jbGlja19oYW5kbGUpIHsKICAgICAgICAgIHZhciB0ID0gZS50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDsKICAgICAgICAgIGlmICh0aGlzLnZpZXcuaXNfZXhwYW5kZXIodCkpIHsKICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnZpZXcuZ2V0X2JpbmRlZF9ub2RlaWQodCk7CiAgICAgICAgICAgIGkgJiYgdGhpcy50b2dnbGVfbm9kZShpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZGJsY2xpY2tfaGFuZGxlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRibGNsaWNrX2hhbmRsZShlKSB7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWZhdWx0X2V2ZW50X2hhbmRsZS5lbmFibGVfZGJsY2xpY2tfaGFuZGxlICYmIHRoaXMuZ2V0X2VkaXRhYmxlKCkpIHsKICAgICAgICAgIHZhciB0ID0gZS50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDsKICAgICAgICAgIGlmICh0aGlzLnZpZXcuaXNfbm9kZSh0KSkgewogICAgICAgICAgICB2YXIgaSA9IHRoaXMudmlldy5nZXRfYmluZGVkX25vZGVpZCh0KTsKICAgICAgICAgICAgaSAmJiB0aGlzLmJlZ2luX2VkaXQoaSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIm1vdXNld2hlZWxfaGFuZGxlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIG1vdXNld2hlZWxfaGFuZGxlKGUpIHsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlZmF1bHRfZXZlbnRfaGFuZGxlLmVuYWJsZV9tb3VzZXdoZWVsX2hhbmRsZSAmJiBlLmN0cmxLZXkpIHsKICAgICAgICAgIHZhciB0ID0gZSB8fCBldmVudDsKICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKSwgdC5kZWx0YVkgPCAwID8gdGhpcy52aWV3Lnpvb21faW4odCkgOiB0aGlzLnZpZXcuem9vbV9vdXQodCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImJlZ2luX2VkaXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gYmVnaW5fZWRpdChlKSB7CiAgICAgICAgaWYgKCFsLmlzX25vZGUoZSkpIHsKICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRfbm9kZShlKTsKICAgICAgICAgIHJldHVybiB0ID8gdGhpcy5iZWdpbl9lZGl0KHQpIDogKHMuZXJyb3IoInRoZSBub2RlW2lkPSIgKyBlICsgIl0gY2FuIG5vdCBiZSBmb3VuZC4iKSwgITEpOwogICAgICAgIH0KICAgICAgICB0aGlzLmdldF9lZGl0YWJsZSgpID8gdGhpcy52aWV3LmVkaXRfbm9kZV9iZWdpbihlKSA6IHMuZXJyb3IoImZhaWwsIHRoaXMgbWluZCBtYXAgaXMgbm90IGVkaXRhYmxlLiIpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImVuZF9lZGl0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGVuZF9lZGl0KCkgewogICAgICAgIHRoaXMudmlldy5lZGl0X25vZGVfZW5kKCk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAidG9nZ2xlX25vZGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gdG9nZ2xlX25vZGUoZSkgewogICAgICAgIGlmICghbC5pc19ub2RlKGUpKSB7CiAgICAgICAgICB2YXIgdCA9IHRoaXMuZ2V0X25vZGUoZSk7CiAgICAgICAgICByZXR1cm4gdCA/IHRoaXMudG9nZ2xlX25vZGUodCkgOiB2b2lkIHMuZXJyb3IoInRoZSBub2RlW2lkPSIgKyBlICsgIl0gY2FuIG5vdCBiZSBmb3VuZC4iKTsKICAgICAgICB9CiAgICAgICAgZS5pc3Jvb3QgfHwgKHRoaXMudmlldy5zYXZlX2xvY2F0aW9uKGUpLCB0aGlzLmxheW91dC50b2dnbGVfbm9kZShlKSwgdGhpcy52aWV3LnJlbGF5b3V0KCksIHRoaXMudmlldy5yZXN0b3JlX2xvY2F0aW9uKGUpKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJleHBhbmRfbm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBleHBhbmRfbm9kZShlKSB7CiAgICAgICAgaWYgKCFsLmlzX25vZGUoZSkpIHsKICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRfbm9kZShlKTsKICAgICAgICAgIHJldHVybiB0ID8gdGhpcy5leHBhbmRfbm9kZSh0KSA6IHZvaWQgcy5lcnJvcigidGhlIG5vZGVbaWQ9IiArIGUgKyAiXSBjYW4gbm90IGJlIGZvdW5kLiIpOwogICAgICAgIH0KICAgICAgICBlLmlzcm9vdCB8fCAodGhpcy52aWV3LnNhdmVfbG9jYXRpb24oZSksIHRoaXMubGF5b3V0LmV4cGFuZF9ub2RlKGUpLCB0aGlzLnZpZXcucmVsYXlvdXQoKSwgdGhpcy52aWV3LnJlc3RvcmVfbG9jYXRpb24oZSkpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImNvbGxhcHNlX25vZGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gY29sbGFwc2Vfbm9kZShlKSB7CiAgICAgICAgaWYgKCFsLmlzX25vZGUoZSkpIHsKICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRfbm9kZShlKTsKICAgICAgICAgIHJldHVybiB0ID8gdGhpcy5jb2xsYXBzZV9ub2RlKHQpIDogdm9pZCBzLmVycm9yKCJ0aGUgbm9kZVtpZD0iICsgZSArICJdIGNhbiBub3QgYmUgZm91bmQuIik7CiAgICAgICAgfQogICAgICAgIGUuaXNyb290IHx8ICh0aGlzLnZpZXcuc2F2ZV9sb2NhdGlvbihlKSwgdGhpcy5sYXlvdXQuY29sbGFwc2Vfbm9kZShlKSwgdGhpcy52aWV3LnJlbGF5b3V0KCksIHRoaXMudmlldy5yZXN0b3JlX2xvY2F0aW9uKGUpKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJleHBhbmRfYWxsIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGV4cGFuZF9hbGwoKSB7CiAgICAgICAgdGhpcy5sYXlvdXQuZXhwYW5kX2FsbCgpLCB0aGlzLnZpZXcucmVsYXlvdXQoKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJjb2xsYXBzZV9hbGwiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gY29sbGFwc2VfYWxsKCkgewogICAgICAgIHRoaXMubGF5b3V0LmNvbGxhcHNlX2FsbCgpLCB0aGlzLnZpZXcucmVsYXlvdXQoKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJleHBhbmRfdG9fZGVwdGgiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhwYW5kX3RvX2RlcHRoKGUpIHsKICAgICAgICB0aGlzLmxheW91dC5leHBhbmRfdG9fZGVwdGgoZSksIHRoaXMudmlldy5yZWxheW91dCgpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIl9yZXNldCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVzZXQoKSB7CiAgICAgICAgdGhpcy52aWV3LnJlc2V0KCksIHRoaXMubGF5b3V0LnJlc2V0KCksIHRoaXMuZGF0YS5yZXNldCgpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIl9zaG93IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zaG93KGUsIHQpIHsKICAgICAgICB2YXIgbiA9IGUgfHwgdS5ub2RlX2FycmF5LmV4YW1wbGU7CiAgICAgICAgdGhpcy5taW5kID0gdGhpcy5kYXRhLmxvYWQobiksIHRoaXMubWluZCA/IChzLmRlYnVnKCJkYXRhLmxvYWQgb2siKSwgdGhpcy52aWV3LmxvYWQoKSwgcy5kZWJ1Zygidmlldy5sb2FkIG9rIiksIHRoaXMubGF5b3V0LmxheW91dCgpLCBzLmRlYnVnKCJsYXlvdXQubGF5b3V0IG9rIiksIHRoaXMudmlldy5zaG93KCF0KSwgcy5kZWJ1Zygidmlldy5zaG93IG9rIiksIHRoaXMuaW52b2tlX2V2ZW50X2hhbmRsZShpLnNob3csIHsKICAgICAgICAgIGRhdGE6IFtlXQogICAgICAgIH0pKSA6IHMuZXJyb3IoImRhdGEubG9hZCBlcnJvciIpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNob3ciLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdyhlLCB0KSB7CiAgICAgICAgdGhpcy5fcmVzZXQoKSwgdGhpcy5fc2hvdyhlLCB0KTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRfbWV0YSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfbWV0YSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgbmFtZTogdGhpcy5taW5kLm5hbWUsCiAgICAgICAgICBhdXRob3I6IHRoaXMubWluZC5hdXRob3IsCiAgICAgICAgICB2ZXJzaW9uOiB0aGlzLm1pbmQudmVyc2lvbgogICAgICAgIH07CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZ2V0X2RhdGEiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0X2RhdGEoZSkgewogICAgICAgIHZhciB0ID0gZSB8fCAibm9kZV90cmVlIjsKICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmdldF9kYXRhKHQpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImdldF9yb290IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldF9yb290KCkgewogICAgICAgIHJldHVybiB0aGlzLm1pbmQucm9vdDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRfbm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfbm9kZShlKSB7CiAgICAgICAgcmV0dXJuIGwuaXNfbm9kZShlKSA/IGUgOiB0aGlzLm1pbmQuZ2V0X25vZGUoZSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiYWRkX25vZGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gYWRkX25vZGUoZSwgbiwgbywgciwgYSkgewogICAgICAgIGlmICh0aGlzLmdldF9lZGl0YWJsZSgpKSB7CiAgICAgICAgICB2YXIgZCA9IHRoaXMuZ2V0X25vZGUoZSksCiAgICAgICAgICAgIGwgPSB0Lm9mKGEpOwogICAgICAgICAgdm9pZCAwID09PSBsICYmIChsID0gdGhpcy5sYXlvdXQuY2FsY3VsYXRlX25leHRfY2hpbGRfZGlyZWN0aW9uKGQpKTsKICAgICAgICAgIHZhciBoID0gdGhpcy5taW5kLmFkZF9ub2RlKGQsIG4sIG8sIHIsIGwpOwogICAgICAgICAgcmV0dXJuIGggJiYgKHRoaXMudmlldy5hZGRfbm9kZShoKSwgdGhpcy5sYXlvdXQubGF5b3V0KCksIHRoaXMudmlldy5zaG93KCExKSwgdGhpcy52aWV3LnJlc2V0X25vZGVfY3VzdG9tX3N0eWxlKGgpLCB0aGlzLmV4cGFuZF9ub2RlKGQpLCB0aGlzLmludm9rZV9ldmVudF9oYW5kbGUoaS5lZGl0LCB7CiAgICAgICAgICAgIGV2dDogImFkZF9ub2RlIiwKICAgICAgICAgICAgZGF0YTogW2QuaWQsIG4sIG8sIHIsIGxdLAogICAgICAgICAgICBub2RlOiBuCiAgICAgICAgICB9KSksIGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzLmVycm9yKCJmYWlsLCB0aGlzIG1pbmQgbWFwIGlzIG5vdCBlZGl0YWJsZSIpLCBudWxsOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImluc2VydF9ub2RlX2JlZm9yZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRfbm9kZV9iZWZvcmUoZSwgbiwgbywgciwgYSkgewogICAgICAgIGlmICh0aGlzLmdldF9lZGl0YWJsZSgpKSB7CiAgICAgICAgICB2YXIgZCA9IHRoaXMuZ2V0X25vZGUoZSksCiAgICAgICAgICAgIGwgPSB0Lm9mKGEpOwogICAgICAgICAgdm9pZCAwID09PSBsICYmIChsID0gdGhpcy5sYXlvdXQuY2FsY3VsYXRlX25leHRfY2hpbGRfZGlyZWN0aW9uKGQucGFyZW50KSk7CiAgICAgICAgICB2YXIgaCA9IHRoaXMubWluZC5pbnNlcnRfbm9kZV9iZWZvcmUoZCwgbiwgbywgciwgbCk7CiAgICAgICAgICByZXR1cm4gaCAmJiAodGhpcy52aWV3LmFkZF9ub2RlKGgpLCB0aGlzLmxheW91dC5sYXlvdXQoKSwgdGhpcy52aWV3LnNob3coITEpLCB0aGlzLmludm9rZV9ldmVudF9oYW5kbGUoaS5lZGl0LCB7CiAgICAgICAgICAgIGV2dDogImluc2VydF9ub2RlX2JlZm9yZSIsCiAgICAgICAgICAgIGRhdGE6IFtkLmlkLCBuLCBvLCByLCBsXSwKICAgICAgICAgICAgbm9kZTogbgogICAgICAgICAgfSkpLCBoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcy5lcnJvcigiZmFpbCwgdGhpcyBtaW5kIG1hcCBpcyBub3QgZWRpdGFibGUiKSwgbnVsbDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJpbnNlcnRfbm9kZV9hZnRlciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRfbm9kZV9hZnRlcihlLCBuLCBvLCByLCBhKSB7CiAgICAgICAgaWYgKHRoaXMuZ2V0X2VkaXRhYmxlKCkpIHsKICAgICAgICAgIHZhciBkID0gdGhpcy5nZXRfbm9kZShlKSwKICAgICAgICAgICAgbCA9IHQub2YoYSk7CiAgICAgICAgICB2b2lkIDAgPT09IGwgJiYgKGwgPSB0aGlzLmxheW91dC5jYWxjdWxhdGVfbmV4dF9jaGlsZF9kaXJlY3Rpb24oZC5wYXJlbnQpKTsKICAgICAgICAgIHZhciBoID0gdGhpcy5taW5kLmluc2VydF9ub2RlX2FmdGVyKGQsIG4sIG8sIHIsIGwpOwogICAgICAgICAgcmV0dXJuIGggJiYgKHRoaXMudmlldy5hZGRfbm9kZShoKSwgdGhpcy5sYXlvdXQubGF5b3V0KCksIHRoaXMudmlldy5zaG93KCExKSwgdGhpcy5pbnZva2VfZXZlbnRfaGFuZGxlKGkuZWRpdCwgewogICAgICAgICAgICBldnQ6ICJpbnNlcnRfbm9kZV9hZnRlciIsCiAgICAgICAgICAgIGRhdGE6IFtkLmlkLCBuLCBvLCByLCBsXSwKICAgICAgICAgICAgbm9kZTogbgogICAgICAgICAgfSkpLCBoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcy5lcnJvcigiZmFpbCwgdGhpcyBtaW5kIG1hcCBpcyBub3QgZWRpdGFibGUiKSwgbnVsbDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmVfbm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVfbm9kZShlKSB7CiAgICAgICAgaWYgKCFsLmlzX25vZGUoZSkpIHsKICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRfbm9kZShlKTsKICAgICAgICAgIHJldHVybiB0ID8gdGhpcy5yZW1vdmVfbm9kZSh0KSA6IChzLmVycm9yKCJ0aGUgbm9kZVtpZD0iICsgZSArICJdIGNhbiBub3QgYmUgZm91bmQuIiksICExKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZ2V0X2VkaXRhYmxlKCkpIHsKICAgICAgICAgIGlmIChlLmlzcm9vdCkgcmV0dXJuIHMuZXJyb3IoImZhaWwsIGNhbiBub3QgcmVtb3ZlIHJvb3Qgbm9kZSIpLCAhMTsKICAgICAgICAgIHZhciBuID0gZS5pZCwKICAgICAgICAgICAgbyA9IGUucGFyZW50LmlkLAogICAgICAgICAgICByID0gdGhpcy5nZXRfbm9kZShvKTsKICAgICAgICAgIHJldHVybiB0aGlzLnZpZXcuc2F2ZV9sb2NhdGlvbihyKSwgdGhpcy52aWV3LnJlbW92ZV9ub2RlKGUpLCB0aGlzLm1pbmQucmVtb3ZlX25vZGUoZSksIHRoaXMubGF5b3V0LmxheW91dCgpLCB0aGlzLnZpZXcuc2hvdyghMSksIHRoaXMudmlldy5yZXN0b3JlX2xvY2F0aW9uKHIpLCB0aGlzLmludm9rZV9ldmVudF9oYW5kbGUoaS5lZGl0LCB7CiAgICAgICAgICAgIGV2dDogInJlbW92ZV9ub2RlIiwKICAgICAgICAgICAgZGF0YTogW25dLAogICAgICAgICAgICBub2RlOiBvCiAgICAgICAgICB9KSwgITA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzLmVycm9yKCJmYWlsLCB0aGlzIG1pbmQgbWFwIGlzIG5vdCBlZGl0YWJsZSIpLCAhMTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJ1cGRhdGVfbm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVfbm9kZShlLCB0KSB7CiAgICAgICAgaWYgKHRoaXMuZ2V0X2VkaXRhYmxlKCkpIHsKICAgICAgICAgIGlmIChhLnRleHQuaXNfZW1wdHkodCkpIHMud2FybigiZmFpbCwgdG9waWMgY2FuIG5vdCBiZSBlbXB0eSIpO2Vsc2UgewogICAgICAgICAgICB2YXIgbiA9IHRoaXMuZ2V0X25vZGUoZSk7CiAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgaWYgKG4udG9waWMgPT09IHQpIHJldHVybiBzLmluZm8oIm5vdGhpbmcgY2hhbmdlZCIpLCB2b2lkIHRoaXMudmlldy51cGRhdGVfbm9kZShuKTsKICAgICAgICAgICAgICBuLnRvcGljID0gdCwgdGhpcy52aWV3LnVwZGF0ZV9ub2RlKG4pLCB0aGlzLmxheW91dC5sYXlvdXQoKSwgdGhpcy52aWV3LnNob3coITEpLCB0aGlzLmludm9rZV9ldmVudF9oYW5kbGUoaS5lZGl0LCB7CiAgICAgICAgICAgICAgICBldnQ6ICJ1cGRhdGVfbm9kZSIsCiAgICAgICAgICAgICAgICBkYXRhOiBbZSwgdF0sCiAgICAgICAgICAgICAgICBub2RlOiBlCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2Ugcy5lcnJvcigiZmFpbCwgdGhpcyBtaW5kIG1hcCBpcyBub3QgZWRpdGFibGUiKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJtb3ZlX25vZGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZV9ub2RlKGUsIHQsIG4sIG8pIHsKICAgICAgICBpZiAodGhpcy5nZXRfZWRpdGFibGUoKSkgewogICAgICAgICAgdmFyIHIgPSB0aGlzLmdldF9ub2RlKGUpLAogICAgICAgICAgICBhID0gdGhpcy5taW5kLm1vdmVfbm9kZShyLCB0LCBuLCBvKTsKICAgICAgICAgIGEgJiYgKHRoaXMudmlldy51cGRhdGVfbm9kZShhKSwgdGhpcy5sYXlvdXQubGF5b3V0KCksIHRoaXMudmlldy5zaG93KCExKSwgdGhpcy5pbnZva2VfZXZlbnRfaGFuZGxlKGkuZWRpdCwgewogICAgICAgICAgICBldnQ6ICJtb3ZlX25vZGUiLAogICAgICAgICAgICBkYXRhOiBbZSwgdCwgbiwgb10sCiAgICAgICAgICAgIG5vZGU6IGUKICAgICAgICAgIH0pKTsKICAgICAgICB9IGVsc2Ugcy5lcnJvcigiZmFpbCwgdGhpcyBtaW5kIG1hcCBpcyBub3QgZWRpdGFibGUiKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJzZWxlY3Rfbm9kZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZWxlY3Rfbm9kZShlKSB7CiAgICAgICAgaWYgKCFsLmlzX25vZGUoZSkpIHsKICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRfbm9kZShlKTsKICAgICAgICAgIHJldHVybiB0ID8gdGhpcy5zZWxlY3Rfbm9kZSh0KSA6IHZvaWQgcy5lcnJvcigidGhlIG5vZGVbaWQ9IiArIGUgKyAiXSBjYW4gbm90IGJlIGZvdW5kLiIpOwogICAgICAgIH0KICAgICAgICB0aGlzLmxheW91dC5pc192aXNpYmxlKGUpICYmICh0aGlzLm1pbmQuc2VsZWN0ZWQgPSBlLCB0aGlzLnZpZXcuc2VsZWN0X25vZGUoZSksIHRoaXMuaW52b2tlX2V2ZW50X2hhbmRsZShpLnNlbGVjdCwgewogICAgICAgICAgZXZ0OiAic2VsZWN0X25vZGUiLAogICAgICAgICAgZGF0YTogW10sCiAgICAgICAgICBub2RlOiBlLmlkCiAgICAgICAgfSkpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImdldF9zZWxlY3RlZF9ub2RlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldF9zZWxlY3RlZF9ub2RlKCkgewogICAgICAgIHJldHVybiB0aGlzLm1pbmQgPyB0aGlzLm1pbmQuc2VsZWN0ZWQgOiBudWxsOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNlbGVjdF9jbGVhciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZWxlY3RfY2xlYXIoKSB7CiAgICAgICAgdGhpcy5taW5kICYmICh0aGlzLm1pbmQuc2VsZWN0ZWQgPSBudWxsLCB0aGlzLnZpZXcuc2VsZWN0X2NsZWFyKCkpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImlzX25vZGVfdmlzaWJsZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc19ub2RlX3Zpc2libGUoZSkgewogICAgICAgIHJldHVybiB0aGlzLmxheW91dC5pc192aXNpYmxlKGUpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNjcm9sbF9ub2RlX3RvX2NlbnRlciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzY3JvbGxfbm9kZV90b19jZW50ZXIoZSkgewogICAgICAgIGlmIChsLmlzX25vZGUoZSkpIHRoaXMudmlldy5jZW50ZXJfbm9kZShlKTtlbHNlIHsKICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRfbm9kZShlKTsKICAgICAgICAgIHQgPyB0aGlzLnNjcm9sbF9ub2RlX3RvX2NlbnRlcih0KSA6IHMuZXJyb3IoInRoZSBub2RlW2lkPSIgKyBlICsgIl0gY2FuIG5vdCBiZSBmb3VuZC4iKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZmluZF9ub2RlX2JlZm9yZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kX25vZGVfYmVmb3JlKGUpIHsKICAgICAgICBpZiAoIWwuaXNfbm9kZShlKSkgewogICAgICAgICAgdmFyIHQgPSB0aGlzLmdldF9ub2RlKGUpOwogICAgICAgICAgcmV0dXJuIHQgPyB0aGlzLmZpbmRfbm9kZV9iZWZvcmUodCkgOiB2b2lkIHMuZXJyb3IoInRoZSBub2RlW2lkPSIgKyBlICsgIl0gY2FuIG5vdCBiZSBmb3VuZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGUuaXNyb290KSByZXR1cm4gbnVsbDsKICAgICAgICB2YXIgaSA9IG51bGw7CiAgICAgICAgaWYgKGUucGFyZW50Lmlzcm9vdCkgZm9yICh2YXIgbiA9IGUucGFyZW50LmNoaWxkcmVuLCBvID0gbnVsbCwgciA9IG51bGwsIGEgPSAwOyBhIDwgbi5sZW5ndGg7IGErKykgciA9IG5bYV0sIGUuZGlyZWN0aW9uID09PSByLmRpcmVjdGlvbiAmJiAoZS5pZCA9PT0gci5pZCAmJiAoaSA9IG8pLCBvID0gcik7ZWxzZSBpID0gdGhpcy5taW5kLmdldF9ub2RlX2JlZm9yZShlKTsKICAgICAgICByZXR1cm4gaTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJmaW5kX25vZGVfYWZ0ZXIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZmluZF9ub2RlX2FmdGVyKGUpIHsKICAgICAgICBpZiAoIWwuaXNfbm9kZShlKSkgewogICAgICAgICAgdmFyIHQgPSB0aGlzLmdldF9ub2RlKGUpOwogICAgICAgICAgcmV0dXJuIHQgPyB0aGlzLmZpbmRfbm9kZV9hZnRlcih0KSA6IHZvaWQgcy5lcnJvcigidGhlIG5vZGVbaWQ9IiArIGUgKyAiXSBjYW4gbm90IGJlIGZvdW5kLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoZS5pc3Jvb3QpIHJldHVybiBudWxsOwogICAgICAgIHZhciBpID0gbnVsbDsKICAgICAgICBpZiAoZS5wYXJlbnQuaXNyb290KSB7CiAgICAgICAgICBmb3IgKHZhciBuID0gZS5wYXJlbnQuY2hpbGRyZW4sIG8gPSAhMSwgciA9IG51bGwsIGEgPSAwOyBhIDwgbi5sZW5ndGg7IGErKykgaWYgKHIgPSBuW2FdLCBlLmRpcmVjdGlvbiA9PT0gci5kaXJlY3Rpb24pIHsKICAgICAgICAgICAgaWYgKG8pIHsKICAgICAgICAgICAgICBpID0gcjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlLmlkID09PSByLmlkICYmIChvID0gITApOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpID0gdGhpcy5taW5kLmdldF9ub2RlX2FmdGVyKGUpOwogICAgICAgIHJldHVybiBpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNldF9ub2RlX2NvbG9yIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldF9ub2RlX2NvbG9yKGUsIHQsIGkpIHsKICAgICAgICBpZiAoIXRoaXMuZ2V0X2VkaXRhYmxlKCkpIHJldHVybiBzLmVycm9yKCJmYWlsLCB0aGlzIG1pbmQgbWFwIGlzIG5vdCBlZGl0YWJsZSIpLCBudWxsOwogICAgICAgIHZhciBuID0gdGhpcy5taW5kLmdldF9ub2RlKGUpOwogICAgICAgIG4gJiYgKHQgJiYgKG4uZGF0YVsiYmFja2dyb3VuZC1jb2xvciJdID0gdCksIGkgJiYgKG4uZGF0YVsiZm9yZWdyb3VuZC1jb2xvciJdID0gaSksIHRoaXMudmlldy5yZXNldF9ub2RlX2N1c3RvbV9zdHlsZShuKSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAic2V0X25vZGVfZm9udF9zdHlsZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRfbm9kZV9mb250X3N0eWxlKGUsIHQsIGksIG4pIHsKICAgICAgICBpZiAoIXRoaXMuZ2V0X2VkaXRhYmxlKCkpIHJldHVybiBzLmVycm9yKCJmYWlsLCB0aGlzIG1pbmQgbWFwIGlzIG5vdCBlZGl0YWJsZSIpLCBudWxsOwogICAgICAgIHZhciBvID0gdGhpcy5taW5kLmdldF9ub2RlKGUpOwogICAgICAgIG8gJiYgKHQgJiYgKG8uZGF0YVsiZm9udC1zaXplIl0gPSB0KSwgaSAmJiAoby5kYXRhWyJmb250LXdlaWdodCJdID0gaSksIG4gJiYgKG8uZGF0YVsiZm9udC1zdHlsZSJdID0gbiksIHRoaXMudmlldy5yZXNldF9ub2RlX2N1c3RvbV9zdHlsZShvKSwgdGhpcy52aWV3LnVwZGF0ZV9ub2RlKG8pLCB0aGlzLmxheW91dC5sYXlvdXQoKSwgdGhpcy52aWV3LnNob3coITEpKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJzZXRfbm9kZV9iYWNrZ3JvdW5kX2ltYWdlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldF9ub2RlX2JhY2tncm91bmRfaW1hZ2UoZSwgdCwgaSwgbiwgbykgewogICAgICAgIGlmICghdGhpcy5nZXRfZWRpdGFibGUoKSkgcmV0dXJuIHMuZXJyb3IoImZhaWwsIHRoaXMgbWluZCBtYXAgaXMgbm90IGVkaXRhYmxlIiksIG51bGw7CiAgICAgICAgdmFyIHIgPSB0aGlzLm1pbmQuZ2V0X25vZGUoZSk7CiAgICAgICAgciAmJiAodCAmJiAoci5kYXRhWyJiYWNrZ3JvdW5kLWltYWdlIl0gPSB0KSwgaSAmJiAoci5kYXRhLndpZHRoID0gaSksIG4gJiYgKHIuZGF0YS5oZWlnaHQgPSBuKSwgbyAmJiAoci5kYXRhWyJiYWNrZ3JvdW5kLXJvdGF0aW9uIl0gPSBvKSwgdGhpcy52aWV3LnJlc2V0X25vZGVfY3VzdG9tX3N0eWxlKHIpLCB0aGlzLnZpZXcudXBkYXRlX25vZGUociksIHRoaXMubGF5b3V0LmxheW91dCgpLCB0aGlzLnZpZXcuc2hvdyghMSkpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNldF9ub2RlX2JhY2tncm91bmRfcm90YXRpb24iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0X25vZGVfYmFja2dyb3VuZF9yb3RhdGlvbihlLCB0KSB7CiAgICAgICAgaWYgKCF0aGlzLmdldF9lZGl0YWJsZSgpKSByZXR1cm4gcy5lcnJvcigiZmFpbCwgdGhpcyBtaW5kIG1hcCBpcyBub3QgZWRpdGFibGUiKSwgbnVsbDsKICAgICAgICB2YXIgaSA9IHRoaXMubWluZC5nZXRfbm9kZShlKTsKICAgICAgICBpZiAoaSkgewogICAgICAgICAgaWYgKCFpLmRhdGFbImJhY2tncm91bmQtaW1hZ2UiXSkgcmV0dXJuIHMuZXJyb3IoImZhaWwsIG9ubHkgY2FuIGNoYW5nZSByb3RhdGlvbiBhbmdsZSBvZiBub2RlIHdpdGggYmFja2dyb3VuZCBpbWFnZSIpLCBudWxsOwogICAgICAgICAgaS5kYXRhWyJiYWNrZ3JvdW5kLXJvdGF0aW9uIl0gPSB0LCB0aGlzLnZpZXcucmVzZXRfbm9kZV9jdXN0b21fc3R5bGUoaSksIHRoaXMudmlldy51cGRhdGVfbm9kZShpKSwgdGhpcy5sYXlvdXQubGF5b3V0KCksIHRoaXMudmlldy5zaG93KCExKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVzaXplIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZSgpIHsKICAgICAgICB0aGlzLnZpZXcucmVzaXplKCk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiYWRkX2V2ZW50X2xpc3RlbmVyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZF9ldmVudF9saXN0ZW5lcihlKSB7CiAgICAgICAgImZ1bmN0aW9uIiA9PSB0eXBlb2YgZSAmJiB0aGlzLmV2ZW50X2hhbmRsZXMucHVzaChlKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJjbGVhcl9ldmVudF9saXN0ZW5lciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcl9ldmVudF9saXN0ZW5lcigpIHsKICAgICAgICB0aGlzLmV2ZW50X2hhbmRsZXMgPSBbXTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJpbnZva2VfZXZlbnRfaGFuZGxlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGludm9rZV9ldmVudF9oYW5kbGUoZSwgdCkgewogICAgICAgIHZhciBpID0gdGhpczsKICAgICAgICByLncuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpLl9pbnZva2VfZXZlbnRfaGFuZGxlKGUsIHQpOwogICAgICAgIH0sIDApOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIl9pbnZva2VfZXZlbnRfaGFuZGxlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9pbnZva2VfZXZlbnRfaGFuZGxlKGUsIHQpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5ldmVudF9oYW5kbGVzLmxlbmd0aCwgbiA9IDA7IG4gPCBpOyBuKyspIHRoaXMuZXZlbnRfaGFuZGxlc1tuXShlLCB0KTsKICAgICAgfQogICAgfV0sIFt7CiAgICAgIGtleTogInNob3ciLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdyhlLCB0KSB7CiAgICAgICAgcy53YXJuKCJganNNaW5kLnNob3cob3B0aW9ucywgbWluZClgIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgYGptID0gbmV3IGpzTWluZChvcHRpb25zKTsgam0uc2hvdyhtaW5kKTtgIGluc3RlYWQiKTsKICAgICAgICB2YXIgaSA9IG5ldyB6KGUpOwogICAgICAgIHJldHVybiBpLnNob3codCksIGk7CiAgICAgIH0KICAgIH1dKTsKICB9KCk7CiAgX2RlZmluZVByb3BlcnR5KHosICJtaW5kIiwgaCk7CiAgX2RlZmluZVByb3BlcnR5KHosICJub2RlIiwgbCk7CiAgX2RlZmluZVByb3BlcnR5KHosICJkaXJlY3Rpb24iLCB0KTsKICBfZGVmaW5lUHJvcGVydHkoeiwgImV2ZW50X3R5cGUiLCBpKTsKICBfZGVmaW5lUHJvcGVydHkoeiwgIiQiLCByKTsKICBfZGVmaW5lUHJvcGVydHkoeiwgInBsdWdpbiIsIHgpOwogIF9kZWZpbmVQcm9wZXJ0eSh6LCAicmVnaXN0ZXJfcGx1Z2luIiwgeSk7CiAgX2RlZmluZVByb3BlcnR5KHosICJ1dGlsIiwgYSk7CiAgcmV0dXJuIHo7Cn0pOw=="},null]}