{"remainingRequest":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\eslint-loader\\index.js??ref--13-0!D:\\jenkins\\workspace\\xcjy-fvue\\src\\utils\\utils.js","dependencies":[{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\src\\utils\\utils.js","mtime":1741314105347},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\babel.config.js","mtime":1741314102158},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS94Y2p5LWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIjsKaW1wb3J0IF9yZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UveGNqeS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWdlbmVyYXRvclJ1bnRpbWUuanMiOwppbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UveGNqeS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIjsKdmFyIF90aGlzMiA9IHRoaXM7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmpvaW4uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuZmlsdGVyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5zb21lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtaW50LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnRvLWZpeGVkLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmRvdC1hbGwuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5zdGlja3kuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudGVzdC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiOwppbXBvcnQgeyBNZXNzYWdlLCBNZXNzYWdlQm94LCBOb3RpZmljYXRpb24gfSBmcm9tICdlbGVtZW50LXVpJzsKaW1wb3J0IGRpY3RVdGlscyBmcm9tICdAL2NvbXBvbmVudHMvZGljdC9EaWN0U2VsZWN0VXRpbHMnOwp2YXIgY2xvc2VBbGxOb3RpZmljYXRpb25GbGFnID0gZmFsc2U7IC8v5piv5ZCm6ZqQ6JeP5oSf5Y+55Y+35qCh6aqM5o+Q56S6CnZhciBub3RpZmljYXRpb25zID0ge307IC8v55So5p2l6I635Y+W5by556qX55qE5a6e5L6L77yM5Lul5a+55a+55bqU5by556qX6L+b6KGM5pON5L2cCnZhciB1dGlscyA9IHsKICAvLyDmjInpkq7mnYPpmZAKICBCdG5BdXRoOiBmdW5jdGlvbiBCdG5BdXRoKGVsQXV0aCkgewogICAgdmFyIHNob3dTdGF0dXMgPSBmYWxzZTsKICAgIHZhciBhbGxNZXRob2QgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuYWxsTWV0aG9kOwogICAgdmFyIG1ldGhvZEF1dGggPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UubWV0aG9kQXV0aDsKICAgIHZhciBhbGxNZXRob2RBcnJheSA9IGFsbE1ldGhvZC5zcGxpdCgnLCcpOwogICAgdmFyIG1ldGhvZEF1dGhBcnJheSA9IG1ldGhvZEF1dGguc3BsaXQoJywnKTsKICAgIC8vIOaXoOadg+mZkOWImemakOiXj+aMiemSrgogICAgaWYgKG1ldGhvZEF1dGhBcnJheS5pbmNsdWRlcyhlbEF1dGgpICYmIGFsbE1ldGhvZEFycmF5LmluY2x1ZGVzKGVsQXV0aCkpIHsKICAgICAgc2hvd1N0YXR1cyA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gc2hvd1N0YXR1czsKICB9LAogIGZvbnRTaXplOiBmdW5jdGlvbiBmb250U2l6ZShyZXMpIHsKICAgIHZhciBjbGllbnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoOwogICAgaWYgKCFjbGllbnRXaWR0aCkgcmV0dXJuOwogICAgdmFyIGZvbnRTaXplID0gY2xpZW50V2lkdGggLyAxOTIwOwogICAgcmV0dXJuIHJlcyAqIGZvbnRTaXplOwogIH0sCiAgLy8g5rua5Yqo5Yiw5bqV6YOoCiAgc2NvcmxsVG9UYWJsZUJvdHRvbTogZnVuY3Rpb24gc2NvcmxsVG9UYWJsZUJvdHRvbSh0YWJsZVJlZikgewogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIF90aGlzMi4kbmV4dFRpY2soZnVuY3Rpb24gKCkgewogICAgICAgIHZhciB0YWJsZSA9IF90aGlzMi4kcmVmc1t0YWJsZVJlZl07CiAgICAgICAgaWYgKHRhYmxlKSB7CiAgICAgICAgICB0YWJsZS5ib2R5V3JhcHBlci5zY3JvbGxUb3AgPSB0YWJsZS5ib2R5V3JhcHBlci5zY3JvbGxIZWlnaHQ7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sIDIwMCk7CiAgfSwKICAvKioNCiAgICog6ZqP5py655Sf5oiQaWQNCiAgICovCiAgdXVpZDogZnVuY3Rpb24gdXVpZCgpIHsKICAgIHZhciBoYXNIeXBoZW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlOwogICAgcmV0dXJuIChoYXNIeXBoZW4gPyAieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4IiA6ICJ4eHh4eHh4eHh4eHg0eHh4eXh4eHh4eHh4eHh4eHh4eCIpLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHsKICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwOwogICAgICB2YXIgdiA9IGMgPT0gIngiID8gciA6IHIgJiAweDMgfCAweDg7CiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTsKICAgIH0pOwogIH0sCiAgLyoqDQogICAqIOa3seaLt+i0nQ0KICAgKi8KICBkZWVwQ2xvbmU6IGZ1bmN0aW9uIGRlZXBDbG9uZShkYXRhKSB7CiAgICB2YXIgdHlwZSA9IHV0aWxzLmdldFR5cGUoZGF0YSk7CiAgICB2YXIgb2JqOwogICAgaWYgKHR5cGUgPT09ICJhcnJheSIpIHsKICAgICAgb2JqID0gW107CiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgIG9iaiA9IHt9OwogICAgfSBlbHNlIHsKICAgICAgLy/kuI3lho3lhbfmnInkuIvkuIDlsYLmrKEKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBpZiAodHlwZSA9PT0gImFycmF5IikgewogICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZGF0YS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIG9iai5wdXNoKHV0aWxzLmRlZXBDbG9uZShkYXRhW2ldKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gIm9iamVjdCIpIHsKICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICBvYmpba2V5XSA9IHV0aWxzLmRlZXBDbG9uZShkYXRhW2tleV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0sCiAgZ2V0VHlwZTogZnVuY3Rpb24gZ2V0VHlwZShvYmopIHsKICAgIC8vdG9zdHJpbmfkvJrov5Tlm57lr7nlupTkuI3lkIznmoTmoIfnrb7nmoTmnoTpgKDlh73mlbAKICAgIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgICB2YXIgbWFwID0gewogICAgICAiW29iamVjdCBCb29sZWFuXSI6ICJib29sZWFuIiwKICAgICAgIltvYmplY3QgTnVtYmVyXSI6ICJudW1iZXIiLAogICAgICAiW29iamVjdCBTdHJpbmddIjogInN0cmluZyIsCiAgICAgICJbb2JqZWN0IEZ1bmN0aW9uXSI6ICJmdW5jdGlvbiIsCiAgICAgICJbb2JqZWN0IEFycmF5XSI6ICJhcnJheSIsCiAgICAgICJbb2JqZWN0IERhdGVdIjogImRhdGUiLAogICAgICAiW29iamVjdCBSZWdFeHBdIjogInJlZ0V4cCIsCiAgICAgICJbb2JqZWN0IFVuZGVmaW5lZF0iOiAidW5kZWZpbmVkIiwKICAgICAgIltvYmplY3QgTnVsbF0iOiAibnVsbCIsCiAgICAgICJbb2JqZWN0IE9iamVjdF0iOiAib2JqZWN0IgogICAgfTsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbGVtZW50KSB7CiAgICAgIHJldHVybiAiZWxlbWVudCI7CiAgICB9CiAgICByZXR1cm4gbWFwW3RvU3RyaW5nLmNhbGwob2JqKV07CiAgfSwKICAvKioNCiAgKiDmoLnmja7lrZflhbjnvJbnoIHojrflj5blrZflhbgg5byC5q2lDQogICovCiAgZ2V0RGljdEFzeW5jOiBmdW5jdGlvbiBnZXREaWN0QXN5bmMoZGljdENvZGUpIHsKICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcigvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgdmFyIGRpY3RJdGVtczsKICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgaWYgKCEodHlwZW9mIGRpY3RDb2RlID09ICd1bmRlZmluZWQnKSkgewogICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIFtdKTsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgZGljdEl0ZW1zID0gW107CiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1OwogICAgICAgICAgICByZXR1cm4gZGljdFV0aWxzLmdldERpY3RJdGVtc0FzeW5jKGRpY3RDb2RlKTsKICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgZGljdEl0ZW1zID0gX2NvbnRleHQuc2VudDsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgZGljdEl0ZW1zKTsKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlKTsKICAgIH0pKSgpOwogIH0sCiAgLyoqDQogICAqIOagueaNruWtl+WFuOe8lueggeWSjOWAvOiOt+WPluWtl+WFuOWQjeensA0KICAgKi8KICBnZXREaWN0TmFtZTogZnVuY3Rpb24gZ2V0RGljdE5hbWUoZGljdENvZGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZW9mIGRpY3RDb2RlID09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB2YWx1ZSA9PSAndW5kZWZpbmVkJykgcmV0dXJuICcnOwogICAgdmFyIG5hbWUgPSAnJzsKICAgIHZhciBkaWN0SXRlbXMgPSBkaWN0VXRpbHMuZ2V0RGljdEl0ZW1zRnJvbUNhY2hlKGRpY3RDb2RlKTsKICAgIGRpY3RJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIGlmIChpdGVtLnZhbHVlID09IHZhbHVlKSB7CiAgICAgICAgbmFtZSA9IGl0ZW0ubmFtZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gbmFtZTsKICB9LAogIC8qKg0KICAgKiDmoLnmja7lrZflhbjnvJbnoIHojrflj5blrZflhbjmlbDmja4NCiAgICovCiAgZ2V0RGljdEl0ZW1zRnJvbUNhY2hlOiBmdW5jdGlvbiBnZXREaWN0SXRlbXNGcm9tQ2FjaGUoZGljdENvZGUpIHsKICAgIGlmICghZGljdENvZGUpIHsKICAgICAgcmV0dXJuICflrZflhbhDb2Rl5LiN6IO95Li656m6ISc7CiAgICB9CiAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZGljdF9kYXRhJykpIHsKICAgICAgdmFyIGRpY3RfZGF0YSA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZGljdF9kYXRhJykpOwogICAgICBpZiAoZGljdF9kYXRhW2RpY3RDb2RlXSkgewogICAgICAgIHZhciBkaXN0SXRlbSA9IGRpY3RfZGF0YVtkaWN0Q29kZV07CiAgICAgICAgcmV0dXJuIGRpc3RJdGVtOwogICAgICB9CiAgICB9CiAgfSwKICAvL+agueaNruS8oOWFpeeahOWAvOWSjOaVsOe7hOi/m+ihjOavlOi+g++8jOebuOetiei/lOWbnuivpeaVsOaNruS4quafkOadoeaVsOaNrgogIGluZGV4T2ZMaXN0OiBmdW5jdGlvbiBpbmRleE9mTGlzdChsaXN0LCBrZXksIHZhbHVlKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGxpc3RbaV1ba2V5XSA9PSB2YWx1ZSkgewogICAgICAgIHJldHVybiBsaXN0W2ldOwogICAgICB9CiAgICB9CiAgfSwKICAvL+Wtl+iKguaVsOi9rEtC5oiW6ICFTUIKICBiaWdEZWNpbWFsOiBmdW5jdGlvbiBiaWdEZWNpbWFsKGJ5dGVzKSB7CiAgICB2YXIgcmV0dXJuVmFsdWUgPSBieXRlcyAvICgxMDI0ICogMTAyNCk7CiAgICBpZiAocmV0dXJuVmFsdWUgPiAxKSB7CiAgICAgIHJldHVybiByZXR1cm5WYWx1ZS50b0ZpeGVkKDIpICsgJ00nOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuVmFsdWUgPSBieXRlcyAvIDEwMjQ7CiAgICAgIHJldHVybiByZXR1cm5WYWx1ZS50b0ZpeGVkKDApICsgJ0tCJzsKICAgIH0KICB9LAogIC8v6I635Y+W5oyH5a6a5a2X56ym5ZCO6Z2i5omA5pyJ5a2X56ymCiAgc3Vic3RyaW5nVHlwZTogZnVuY3Rpb24gc3Vic3RyaW5nVHlwZShzdHIsIHR5cGUpIHsKICAgIHZhciByZXR1cm5WYWx1ZSA9IHN0ci5zcGxpdCgnLicpOwogICAgcmV0dXJuIHJldHVyblZhbHVlW3JldHVyblZhbHVlLmxlbmd0aCAtIDFdOwogIH0sCiAgLy8g6I635Y+W6ZqP5py655qE5ZCN56ewCiAgZ2V0TmFtZTogZnVuY3Rpb24gZ2V0TmFtZSgpIHsKICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMik7CiAgfSwKICAvLyDojrflj5bmjqfku7bmmK/lkKblj6/nvJbovpEKICBnZXRXcml0ZWFibGU6IGZ1bmN0aW9uIGdldFdyaXRlYWJsZShwZXJtaXNzaW9uKSB7CiAgICBpZiAocGVybWlzc2lvbiA9PT0gJ3cnIHx8IHBlcm1pc3Npb24gPT09ICdiJykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9LAogIC8vIOiOt+WPluaOp+S7tuaYr+WQpua3u+WKoOW/heWhq+agoemqjAogIGFkZFJlcXVpcmVkT3JOb3Q6IGZ1bmN0aW9uIGFkZFJlcXVpcmVkT3JOb3QocGVybWlzc2lvbiwgdmFsaWRhdGUsIGxpbmthZ2VWYWxpZGF0ZSwgX3RoaXMpIHsKICAgIC8v5Yik5pat5piv5ZCm5pyJ6IGU5Yqo5qCh6aqMCiAgICBpZiAobGlua2FnZVZhbGlkYXRlLmxlbmd0aCA+IDApIHsKICAgICAgbGlua2FnZVZhbGlkYXRlLmZvckVhY2goZnVuY3Rpb24gKGVsZSkgewogICAgICAgIGlmIChlbGUgJiYgZWxlLnZhbGlkYXRlICYmICdkYXRhLicgKyBlbGUudGFyZ2V0ID09IF90aGlzLmF0dGVyKSB7CiAgICAgICAgICB2YWxpZGF0ZSA9IGVsZS52YWxpZGF0ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgaWYgKHBlcm1pc3Npb24gIT09ICdiJykgewogICAgICByZXR1cm4gdmFsaWRhdGU7CiAgICB9CiAgICAvL+WmguaenOihqOWNleaOiOadg+S4uuafkOaOp+S7tuWKoOS6huW/heWhq+WImeW/heWhqwogICAgaWYgKHBlcm1pc3Npb24gPT09ICdiJyAmJiB2YWxpZGF0ZSAmJiAhdmFsaWRhdGUucmVxdWlyZWQgJiYgdmFsaWRhdGUuY29uc3RydWN0b3IgPT09IE9iamVjdCkgewogICAgICB2YWxpZGF0ZS5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICBpZiAodmFsaWRhdGUgPT09IHVuZGVmaW5lZCB8fCB2YWxpZGF0ZSA9PT0gbnVsbCkgewogICAgICB2YWxpZGF0ZSA9ICdyZXF1aXJlZCc7CiAgICB9IGVsc2UgaWYgKHZhbGlkYXRlLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgdmFyIGFyeSA9IHZhbGlkYXRlLnNwbGl0KCd8Jyk7CiAgICAgIGlmICghYXJ5LnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICByZXR1cm4gaXRlbSA9PT0gJ3JlcXVpcmVkJzsKICAgICAgfSkpIHsKICAgICAgICBhcnkuc3BsaWNlKDAsIDAsICdyZXF1aXJlZCcpOwogICAgICAgIHZhbGlkYXRlID0gYXJ5LmpvaW4oJ3wnKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh2YWxpZGF0ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7CiAgICAgIHZhbGlkYXRlID0gT2JqZWN0LmFzc2lnbih7CiAgICAgICAgcmVxdWlyZWQ6IHRydWUKICAgICAgfSwgdmFsaWRhdGUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ3ZhbGlkYXRl5LiN5piv5YWB6K6455qE57G75Z6LJzsKICAgIH0KICAgIHJldHVybiB2YWxpZGF0ZTsKICB9LAogIC8vIOagvOW8j+WMluaXpeacnwogIGZvcm1hdERhdGU6IGZ1bmN0aW9uIGZvcm1hdERhdGUodmFsdWUpIHsKICAgIHZhciBkYXRlID0gbnVsbDsKICAgIGlmICghdmFsdWUpIHsKICAgICAgcmV0dXJuIGRhdGU7CiAgICB9CiAgICBpZiAodmFsdWUuY29uc3RydWN0b3IgPT0gRGF0ZSAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKSkgewogICAgICBkYXRlID0gdmFsdWU7CiAgICB9IGVsc2UgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09IFN0cmluZyB8fCB2YWx1ZS5jb25zdHJ1Y3RvciA9PSBOdW1iZXIpIHsKICAgICAgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICfmoLzlvI/ljJbml6XmnJ/ml7bvvIzkvKDlhaXnmoTmlbDmja7moLzlvI/kuI3mraPnoa7jgIInOwogICAgfQogICAgdmFyIHkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICB2YXIgTU0gPSBkYXRlLmdldE1vbnRoKCkgKyAxOwogICAgTU0gPSBNTSA8IDEwID8gJzAnICsgTU0gOiBNTTsKICAgIHZhciBkID0gZGF0ZS5nZXREYXRlKCk7CiAgICBkID0gZCA8IDEwID8gJzAnICsgZCA6IGQ7CiAgICB2YXIgaCA9IGRhdGUuZ2V0SG91cnMoKTsKICAgIGggPSBoIDwgMTAgPyAnMCcgKyBoIDogaDsKICAgIHZhciBtID0gZGF0ZS5nZXRNaW51dGVzKCk7CiAgICBtID0gbSA8IDEwID8gJzAnICsgbSA6IG07CiAgICB2YXIgcyA9IGRhdGUuZ2V0U2Vjb25kcygpOwogICAgcyA9IHMgPCAxMCA/ICcwJyArIHMgOiBzOwogICAgcmV0dXJuIHkgKyAnLScgKyBNTSArICctJyArIGQgKyAnICcgKyBoICsgJzonICsgbSArICc6JyArIHM7CiAgfSwKICAvLyDmoLzlvI/ljJbml6XmnJ8KICBmb3JtYXREYXRlWWVhcjogZnVuY3Rpb24gZm9ybWF0RGF0ZVllYXIodmFsdWUpIHsKICAgIHZhciBkYXRlID0gbmV3IERhdGUodmFsdWUpOwogICAgdmFyIHkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICB2YXIgTU0gPSBkYXRlLmdldE1vbnRoKCkgKyAxOwogICAgTU0gPSBNTSA8IDEwID8gJzAnICsgTU0gOiBNTTsKICAgIHZhciBkID0gZGF0ZS5nZXREYXRlKCk7CiAgICBkID0gZCA8IDEwID8gJzAnICsgZCA6IGQ7CiAgICByZXR1cm4geSArICctJyArIE1NICsgJy0nICsgZDsKICB9LAogIC8vIOavlOi+gzLkuKrml6XmnJ8KICBkYXlzQmV0d2VlbjogZnVuY3Rpb24gZGF5c0JldHdlZW4oRGF0ZU9uZSwgRGF0ZVR3bywgbm90U3VwcG9ydEVxdWFscykgewogICAgaWYgKCFEYXRlT25lIHx8ICFEYXRlVHdvKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdmFyIGRhdGUxID0gbmV3IERhdGUoRGF0ZU9uZSkuZ2V0VGltZSgpIHx8IG5ldyBEYXRlKG5ldyBEYXRlKCkuZm9ybWF0KCd5eXl5LU1NLWRkJykgKyAnICcgKyBEYXRlT25lKS5nZXRUaW1lKCk7CiAgICB2YXIgZGF0ZTIgPSBuZXcgRGF0ZShEYXRlVHdvKS5nZXRUaW1lKCkgfHwgbmV3IERhdGUobmV3IERhdGUoKS5mb3JtYXQoJ3l5eXktTU0tZGQnKSArICcgJyArIERhdGVUd28pLmdldFRpbWUoKTsKICAgIGlmIChub3RTdXBwb3J0RXF1YWxzKSB7CiAgICAgIC8v5aSn5LqO44CCdjI+djEg44CCCiAgICAgIGlmIChkYXRlMiA+IGRhdGUxKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvL+Wkp+S6juetieS6juOAgnYyPj12MSDjgILlj6ropoF2MeS4jeWkp+S6jnYy5Y2z5Y+vCiAgICAgIGlmIChkYXRlMSA+IGRhdGUyKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgfSwKICBkYXRlQ2FsYzogZnVuY3Rpb24gZGF0ZUNhbGMoc3RhcnREYXRlLCBlbmREYXRlLCBvcCkgewogICAgaWYgKCFzdGFydERhdGUgfHwgIWVuZERhdGUgfHwgc3RhcnREYXRlLmxlbmd0aCA9PSAwIHx8IGVuZERhdGUubGVuZ3RoID09IDApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAob3AubGVnZW5kID09IDApIHsKICAgICAgb3AgPSAnZGF5JzsKICAgIH0KICAgIHZhciBkYXRlMSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSkuZ2V0VGltZSgpIHx8IG5ldyBEYXRlKG5ldyBEYXRlKCkuZm9ybWF0KCd5eXl5LU1NLWRkJykgKyAnICcgKyBzdGFydERhdGUpLmdldFRpbWUoKTsKICAgIHZhciBkYXRlMiA9IG5ldyBEYXRlKGVuZERhdGUpLmdldFRpbWUoKSB8fCBuZXcgRGF0ZShuZXcgRGF0ZSgpLmZvcm1hdCgneXl5eS1NTS1kZCcpICsgJyAnICsgZW5kRGF0ZSkuZ2V0VGltZSgpOwogICAgdmFyIHJlcyA9IDA7CiAgICB2YXIgZGF5cyA9IGRhdGUyIC0gZGF0ZTE7CiAgICBzd2l0Y2ggKG9wKSB7CiAgICAgIGNhc2UgJ21vbnRoJzoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gKDEwMDAgKiA2MCAqIDYwICogMjQgKiAzMCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdkYXknOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdob3VyJzoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gKDEwMDAgKiA2MCAqIDYwKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ21pbnV0ZSc6CiAgICAgICAgcmVzID0gcGFyc2VJbnQoZGF5cyAvICgxMDAwICogNjApKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gMTAwMCk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0sCiAgLy8g5bmz6ZO657uT5p6E6L2s5bWM5aWX57uT5p6ECiAgdGlsZTJuZXN0OiBmdW5jdGlvbiB0aWxlMm5lc3QoYXJyYXksIGtleSwgcEtleSwgY2hpbGRyZW5LZXkpIHsKICAgIGlmICghYXJyYXkgfHwgYXJyYXkuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIC8vIOWkjeWItuS4gOS7ve+8jOmBv+WFjeS/ruaUueWOn+Wni+aVsOe7hAogICAgdmFyIGFyeSA9IF90b0NvbnN1bWFibGVBcnJheShhcnJheSk7CiAgICBrZXkgPSBrZXkgfHwgJ2lkJzsKICAgIHBLZXkgPSBwS2V5IHx8ICdwYXJlbnRJZCc7CiAgICBjaGlsZHJlbktleSA9IGNoaWxkcmVuS2V5IHx8ICdjaGlsZHJlbic7CiAgICAvLyDlrprkuYnkuIDkuKrlvoXnp7vpmaTmlbDnu4QKICAgIHZhciBhcnkycmVtb3ZlID0gW107CiAgICBhcnkubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIGlmIChpdGVtW2tleV0gIT09IGl0ZW1bcEtleV0pIHsKICAgICAgICAvLyDmib7niLboioLngrkKICAgICAgICB2YXIgcCA9IGFyeS5maWx0ZXIoZnVuY3Rpb24gKGMpIHsKICAgICAgICAgIHJldHVybiBjW2tleV0gPT09IGl0ZW1bcEtleV07CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHAgJiYgcC5sZW5ndGggPT0gMSkgewogICAgICAgICAgcFswXS5jaGlsZHJlbiA9IHBbMF0uY2hpbGRyZW4gfHwgW107CiAgICAgICAgICAvLyDlsIblrZDoioLngrnmlL7liLDniLboioLngrnkuK0KICAgICAgICAgIHBbMF0uY2hpbGRyZW4ucHVzaChpdGVtKTsKICAgICAgICAgIGFyeTJyZW1vdmUucHVzaChpdGVtW2tleV0pOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICAvLyDpgY3ljobnp7vpmaTlvoXliKDpmaTlr7nosaEKICAgIGFyeTJyZW1vdmUubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIGFyeSA9IGFyeS5maWx0ZXIoZnVuY3Rpb24gKGMpIHsKICAgICAgICByZXR1cm4gY1trZXldICE9PSBpdGVtOwogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIGFyeTsKICB9LAogIC8v5pWw57uE5Y6756m6CiAgdHJpbVNwYWNlOiBmdW5jdGlvbiB0cmltU3BhY2UoYXJyYXkpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGFycmF5W2ldID09ICIiIHx8IGFycmF5W2ldID09IG51bGwgfHwgdHlwZW9mIGFycmF5W2ldID09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgYXJyYXkuc3BsaWNlKGksIDEpOwogICAgICAgIGkgPSBpIC0gMTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGFycmF5OwogIH0sCiAgLy/pgJrov4fmn5DkuKroioLngrlpZOafpeivouaJgOacieeItue6pwogIGdldEFsbFBhcmVudEFycjogZnVuY3Rpb24gZ2V0QWxsUGFyZW50QXJyKGxpc3QsIGlkLCBuYW1lLCBjaGlsZCkgewogICAgZm9yICh2YXIgaSBpbiBsaXN0KSB7CiAgICAgIGlmIChsaXN0W2ldW25hbWVdID09IGlkKSB7CiAgICAgICAgcmV0dXJuIFtsaXN0W2ldW25hbWVdXTsKICAgICAgfQogICAgICBpZiAobGlzdFtpXVtjaGlsZF0pIHsKICAgICAgICB2YXIgbm9kZSA9IHV0aWxzLmdldEFsbFBhcmVudEFycihsaXN0W2ldW2NoaWxkXSwgaWQsIG5hbWUsIGNoaWxkKTsKICAgICAgICBpZiAoISFub2RlKSB7CiAgICAgICAgICByZXR1cm4gW2xpc3RbaV1bbmFtZV1dLmNvbmNhdChub2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9LAogIC8vIOS7juWvueixoeS4reiOt+WPluWSjOmqjOivgeWtl+autei3r+W+hAogIGdldEFuZFZhbGlkUGF0aDogZnVuY3Rpb24gZ2V0QW5kVmFsaWRQYXRoKG9iaiwga2V5KSB7CiAgICBpZiAoIW9iaiB8fCBvYmouY29uc3RydWN0b3IgIT0gT2JqZWN0IHx8ICFrZXkgfHwga2V5LmNvbnN0cnVjdG9yICE9IFN0cmluZykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgcGF0aCA9IG9ialtrZXldOwogICAgaWYgKC9eXHcrLipcdyskLy50ZXN0KHBhdGgpKSB7CiAgICAgIHJldHVybiBwYXRoOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfSwKICAvLyDojrflj5ZWdWXlrp7kvovkuK3mjIflrppjbGFzc05hbWXnmoTniLblrp7kvosKICBnZXRQYXJlbnRJbnN0YW5jZUJ5Q2xhc3NOYW1lOiBmdW5jdGlvbiBnZXRQYXJlbnRJbnN0YW5jZUJ5Q2xhc3NOYW1lKGluc3RhbmNlLCBjbGFzc05hbWUpIHsKICAgIGlmICghaW5zdGFuY2UpIHsKICAgICAgdGhyb3cgJ1Z1ZUNvbXBvbmVudOWunuS+i+S4uuepui4nOwogICAgfQogICAgaWYgKGluc3RhbmNlLiRlbC5jbGFzc05hbWUgJiYgaW5zdGFuY2UuJGVsLmNsYXNzTmFtZS5pbmRleE9mKGNsYXNzTmFtZSkgPiAtMSkgewogICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRyb290ICYmIGluc3RhbmNlLiRyb290Ll91aWQgPT0gaW5zdGFuY2UuX3VpZCkgewogICAgICB0aHJvdyAiXHU2N0U1XHU2MjdFVnVlQ29tcG9uZW50XHU1QjlFXHU0RjhCXHU2ODExXHU2NUY2XHU2MjdFXHU1MjMwXHU2ODM5XHU4MjgyXHU3MEI5XHU5MEZEXHU2NzJBXHU2MjdFXHU1MjMwY2xhc3NOYW1lXHU0RTNBIi5jb25jYXQoY2xhc3NOYW1lLCAiXHU3Njg0XHU1QjlFXHU0RjhCLiIpOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcGFyZW50KSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRQYXJlbnRJbnN0YW5jZUJ5Q2xhc3NOYW1lKGluc3RhbmNlLiRwYXJlbnQsIGNsYXNzTmFtZSk7CiAgICB9CiAgfSwKICAvLyDojrflj5bmjqfku7bmiYDlnKjooajljZXlr7nlupTnmoTlrp7kvovlr7nosaEKICBnZXRPbmxpbmVGb3JtSW5zdGFuY2U6IGZ1bmN0aW9uIGdldE9ubGluZUZvcm1JbnN0YW5jZShpbnN0YW5jZSkgewogICAgaWYgKCFpbnN0YW5jZSkgewogICAgICB0aHJvdyAnVnVlQ29tcG9uZW505a6e5L6L5Li656m6Lic7CiAgICB9CiAgICBpZiAoaW5zdGFuY2UuJGVsLmdldEF0dHJpYnV0ZSAmJiBpbnN0YW5jZS4kZWwuZ2V0QXR0cmlidXRlKCduYW1lJykgPT09ICdvbmxpbmUtZm9ybScpIHsKICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcm9vdCAmJiBpbnN0YW5jZS4kcm9vdC5fdWlkID09IGluc3RhbmNlLl91aWQpIHsKICAgICAgdGhyb3cgIlx1NjdFNVx1NjI3RVZ1ZUNvbXBvbmVudFx1NUI5RVx1NEY4Qlx1NjgxMVx1NjVGNlx1NjI3RVx1NTIzMFx1NjgzOVx1ODI4Mlx1NzBCOVx1OTBGRFx1NjcyQVx1NjI3RVx1NTIzMG5hbWVcdTRFM0FvbmxpbmUtZm9ybVx1NzY4NFx1NUI5RVx1NEY4Qi4iOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcGFyZW50KSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UoaW5zdGFuY2UuJHBhcmVudCk7CiAgICB9CiAgfSwKICAvLyDmoLnmja7oh6rlrprkuYnmoIfnrb7lkI0o57uE5Lu25ZCNKeiOt+WPluafkOS4qlZ1ZeWunuS+iwogIGdldEluc3RhbmNlQnlUYWc6IGZ1bmN0aW9uIGdldEluc3RhbmNlQnlUYWcoaW5zdGFuY2UsIGFyZ3MpIHsKICAgIGlmICghaW5zdGFuY2UpIHsKICAgICAgdGhyb3cgJ1Z1ZUNvbXBvbmVudOWunuS+i+S4uuepui4nOwogICAgfQogICAgaWYgKGFyZ3MuaW5jbHVkZXMoaW5zdGFuY2UuJG9wdGlvbnMuX2NvbXBvbmVudFRhZykpIHsKICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcm9vdCAmJiBpbnN0YW5jZS4kcm9vdC5fdWlkID09IGluc3RhbmNlLl91aWQpIHsKICAgICAgdGhyb3cgIlx1NjdFNVx1NjI3RVZ1ZUNvbXBvbmVudFx1NUI5RVx1NEY4Qlx1NjgxMVx1NjVGNlx1NjI3RVx1NTIzMFx1NjgzOVx1ODI4Mlx1NzBCOVx1OTBGRFx1NjcyQVx1NjI3RVx1NTIzMG5hbWVcdTRFM0F0YWdcdTc2ODRcdTVCOUVcdTRGOEIuIjsKICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuJHBhcmVudCkgewogICAgICByZXR1cm4gdXRpbHMuZ2V0SW5zdGFuY2VCeVRhZyhpbnN0YW5jZS4kcGFyZW50LCBhcmdzKTsKICAgIH0KICB9LAogIC8vIOiOt+WPllZ1ZeWunuS+i+WPiueItue6p+WunuS+i+S4reaciXJlbG9hZOaWueazleeahOWunuS+iwogIGdldFJlbG9hZE1ldGhvZDogZnVuY3Rpb24gZ2V0UmVsb2FkTWV0aG9kKGluc3RhbmNlKSB7CiAgICBpZiAoIWluc3RhbmNlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGluc3RhbmNlLnJlbG9hZCAmJiBpbnN0YW5jZS5yZWxvYWQuY29uc3RydWN0b3IgPT09IEZ1bmN0aW9uKSB7CiAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuJHJvb3QgJiYgaW5zdGFuY2UuJHJvb3QuX3VpZCA9PSBpbnN0YW5jZS5fdWlkKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcGFyZW50KSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRSZWxvYWRNZXRob2QoaW5zdGFuY2UuJHBhcmVudCk7CiAgICB9CiAgfSwKICAvLyDph43mlrDliqDovb3lvZPliY3pobXpnaIo5LiN5Lya5Yi35paw5pW05Liq6aG16Z2i77yM5Y+q5Yi35pawcm91dGVyLXZpZXfpg6jliIYpCiAgcmVsb2FkOiBmdW5jdGlvbiByZWxvYWQoKSB7CiAgICB2YXIgdmlld0VsZW1lbnRBcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnYXBwLWJhc2UtbWFpbicpOwogICAgaWYgKCF2aWV3RWxlbWVudEFyeSB8fCB2aWV3RWxlbWVudEFyeS5sZW5ndGggIT0gMSkgewogICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICB9IGVsc2UgewogICAgICB2YXIgdmlld0luc3QgPSB2aWV3RWxlbWVudEFyeVswXS5fX3Z1ZV9fOwogICAgICBpZiAoIXZpZXdJbnN0IHx8ICF2aWV3SW5zdC5faXNWdWUpIHsKICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgIH0KICAgICAgdmFyIHIgPSB1dGlscy5nZXRSZWxvYWRNZXRob2Qodmlld0luc3QpOwogICAgICBpZiAocikgewogICAgICAgIHIucmVsb2FkKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICB9CiAgICB9CiAgfSwKICAvLyDojrflj5blnKjnur/ooajljZXnmoRqc29u5qC85byP5a2X56ym5Liy55qE6KGo5Y2V5pWw5o2uKHZhbGlkYXRl5Y+C5pWw5Yaz5a6a5piv5ZCm6ZyA6KaB5a+56KGo5Y2V6L+b6KGM6aqM6K+BKQogIGdldE9ubGluZUZvcm1EYXRhOiBmdW5jdGlvbiBnZXRPbmxpbmVGb3JtRGF0YSh2YWxpZGF0ZSkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGZvcm1FbGVtZW50QXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ29ubGluZS1mb3JtJyk7CiAgICAgIGlmICghZm9ybUVsZW1lbnRBcnkgfHwgZm9ybUVsZW1lbnRBcnkubGVuZ3RoIDwgMSkgewogICAgICAgIHZhciBmcm1GcmFtZSA9ICQoJyNmcm1GcmFtZScpOwogICAgICAgIGlmIChmcm1GcmFtZSAmJiBmcm1GcmFtZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB2YXIgZnJtID0gZnJtRnJhbWVbMF07CiAgICAgICAgICB2YXIgaXNDYWxsQmFjayA9IGZhbHNlOwogICAgICAgICAgdmFyIGNhbmNlbFRpbWVvdXQgPSBmYWxzZTsKICAgICAgICAgIHZhciBpc1RpbWVPdXQgPSBmYWxzZTsKICAgICAgICAgIC8vIOWtkOmhtemdouaYr+WQpuaUtuWIsOS6hua2iOaBrwogICAgICAgICAgdmFyIGlzUm9nZXIgPSBmYWxzZTsKICAgICAgICAgIGZybS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdzYXZlRGF0YScsICcqJyk7CiAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGlmIChlLmRhdGEgJiYgZS5kYXRhLmNvbnN0cnVjdG9yID09IE9iamVjdCkgewogICAgICAgICAgICAgIGlmIChlLmRhdGEudHlwZSA9PSAnc2F2ZURhdGEnICYmICFpc0NhbGxCYWNrKSB7CiAgICAgICAgICAgICAgICBpc0NhbGxCYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmIChlLmRhdGEuc3RhdGUgJiYgIWlzVGltZU91dCkgewogICAgICAgICAgICAgICAgICB2YXIgaWZyYW1lRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0tleTogZS5kYXRhLmJ1c2luZXNzS2V5LAogICAgICAgICAgICAgICAgICAgIHN5c0NvZGU6IGUuZGF0YS5zeXNDb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFycykgewogICAgICAgICAgICAgICAgICAgIGlmcmFtZURhdGEudmFycyA9IGUuZGF0YS52YXJzOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHJlc29sdmUoaWZyYW1lRGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEudHlwZSA9PSAnY2FuY2VsVGltZW91dCcpIHsKICAgICAgICAgICAgICAgIGNhbmNlbFRpbWVvdXQgPSB0cnVlOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLnR5cGUgPT0gJ3JvZ2VyJyAmJiAhaXNSb2dlcikgewogICAgICAgICAgICAgICAgaXNSb2dlciA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICAvLyDlj6ropoHlrZDpobXpnaLlvJXlhaXkuoZob3RlbnQuaGVscGVyLmpz77yM54i26aG16Z2i5Y+R6YCB5LqG5raI5oGv5ZCO77yM5a2Q6aG16Z2i5Lya6ams5LiK5Zue5aSNYHJvZ2VyYOOAggogICAgICAgICAgLy8g6L+Z6YeM6K6+572uMC4156eS5ZCO5pyq5pS25YiwYHJvZ2VyYOa2iOaBr+WImeiupOS4uuWtkOmhtemdouacquW8leWFpWhvdGVudC5oZWxwZXIuanPvvIzmraTml7bnm7TmjqVyZWplY3TjgIIKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIWlzUm9nZXIpIHsKICAgICAgICAgICAgICByZWplY3QoNik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIDUwMCk7CgogICAgICAgICAgLy8g6K6+572uMTDnp5LotoXml7bmnLrliLbvvIzlpoLmnpzotoXml7bliJnkuI3lho3lvoDkuIvmiafooYwKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIWlzQ2FsbEJhY2sgJiYgIWNhbmNlbFRpbWVvdXQpIHsKICAgICAgICAgICAgICBpc1RpbWVPdXQgPSB0cnVlOwogICAgICAgICAgICAgIHJlamVjdCg1KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgMTAwMDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWplY3QoMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHZhciBmcm1JbnN0ID0gZm9ybUVsZW1lbnRBcnlbMF0uX192dWVfXzsKICAgICAgICBpZiAoIWZybUluc3QgfHwgIWZybUluc3QuX2lzVnVlKSB7CiAgICAgICAgICByZWplY3QoMik7CiAgICAgICAgfQogICAgICAgIC8v5aSE55CGaGFuZHNvbnRhYmxl5a2Q6KGo5pWw5o2uCiAgICAgICAgdmFyIHJlZnMgPSBmcm1JbnN0LiRyZWZzWydvbmxpbmVGb3JtJ10uJHJlZnM7CiAgICAgICAgdmFyIGhvdERhdGEgPSB0cnVlOwogICAgICAgIGlmIChyZWZzKSB7CiAgICAgICAgICBmb3IgKHZhciByZWYgaW4gcmVmcykgewogICAgICAgICAgICBpZiAocmVmcy5oYXNPd25Qcm9wZXJ0eShyZWYpICYmIHJlZi5pbmRleE9mKCdob3R0YWJsZS4nKSA9PSAwKSB7CiAgICAgICAgICAgICAgdmFyIHJlZkVsZSA9IHJlZnNbcmVmXTsKICAgICAgICAgICAgICBob3REYXRhID0gcmVmRWxlLmdldEhvdFRhYmxlRGF0YSh0cnVlKTsKICAgICAgICAgICAgICBpZiAoaG90RGF0YSAmJiBBcnJheS5pc0FycmF5KGhvdERhdGEpKSB7CiAgICAgICAgICAgICAgICB2YXIgbmFtZXMgPSByZWYuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgIGlmIChob3REYXRhICYmIEFycmF5LmlzQXJyYXkoaG90RGF0YSkpIHsKICAgICAgICAgICAgICAgICAgZnJtSW5zdC5kYXRhW25hbWVzWzFdXVtuYW1lc1syXV0gPSBfdG9Db25zdW1hYmxlQXJyYXkoaG90RGF0YSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBmcm1JbnN0LmRhdGFbbmFtZXNbMV1dW25hbWVzWzJdXSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXZhbGlkYXRlKSB7CiAgICAgICAgICByZXNvbHZlKEpTT04uc3RyaW5naWZ5KGZybUluc3QuZGF0YSkpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmcm1JbnN0LiRyb290LiR2YWxpZGF0b3IudmFsaWRhdGVBbGwoJ2N1c3RvbS1mb3JtJykudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICBpZiAoaG90RGF0YSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy9ob3R0YWJsZeWtkOihqOaVsOaNruagoemqjOWksei0pQogICAgICAgICAgICByZWplY3QoNyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgcmVzb2x2ZShKU09OLnN0cmluZ2lmeShmcm1JbnN0LmRhdGEpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlamVjdCh7CiAgICAgICAgICAgICAgcmVhc29uOiAzLAogICAgICAgICAgICAgIGVycm9yczogZnJtSW5zdC4kcm9vdC4kdmFsaWRhdG9yLmVycm9ycy5pdGVtcwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSk7CiAgfSwKICAvLyDojrflj5booajljZXmlbDmja7lpLHotKXnmoTlpITnkIYKICBoYW5kbGVHZXRGb3JtRGF0YVJlamVjdDogZnVuY3Rpb24gaGFuZGxlR2V0Rm9ybURhdGFSZWplY3QocmVhc29uLCBuZWVkQ29uZmlybSkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGVycm9ycyA9IFtdOwogICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5jb25zdHJ1Y3RvciA9PSBPYmplY3QpIHsKICAgICAgICBlcnJvcnMgPSByZWFzb24uZXJyb3JzOwogICAgICAgIHJlYXNvbiA9IHJlYXNvbi5yZWFzb247CiAgICAgIH0KICAgICAgc3dpdGNoIChyZWFzb24pIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBNZXNzYWdlLmVycm9yKCfmnKrojrflj5bliLDlnKjnur/ooajljZXmiJbogIVVUkzooajljZUuJyk7CiAgICAgICAgICByZWplY3QoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoJ+S9v+eUqOS6huWcqOe6v+ihqOWNle+8jOS9huaYr+ihqOWNleS4uuepuuaIluiAheWKoOi9veWksei0pS4nKTsKICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgdmFyIGVycm9yTXNnID0gW107CiAgICAgICAgICBlcnJvcnMgJiYgZXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGZpZWxkTGFiZWwgPSAnJzsKICAgICAgICAgICAgaWYgKGUuZmllbGQpIHsKICAgICAgICAgICAgICBpZiAoZS5maWVsZC5pbmRleE9mKCctJykgIT0gLTEpIHsKICAgICAgICAgICAgICAgIGZpZWxkTGFiZWwgPSBlLmZpZWxkLnN1YnN0cihlLmZpZWxkLmluZGV4T2YoJy0nKSArIDEpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmaWVsZExhYmVsID0gZS5maWVsZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3JNc2cucHVzaCgiIi5jb25jYXQoZmllbGRMYWJlbCwgIiAiKS5jb25jYXQoZS5tc2cpKTsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKGVycm9yTXNnLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdvbmxpbmUtZm9ybScpWzBdKSB7CiAgICAgICAgICAgICAgdmFyIGZybUluc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnb25saW5lLWZvcm0nKVswXS5fX3Z1ZV9fOwogICAgICAgICAgICAgIHZhciBqc29uT2JqID0gZnJtSW5zdC4kcmVmcy5vbmxpbmVGb3JtLiRyZWZzOwogICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBqc29uT2JqKSB7CiAgICAgICAgICAgICAgICBpZiAoanNvbk9ialtrZXldLiRlbC50ZXh0Q29udGVudCkgewogICAgICAgICAgICAgICAgICB2YXIgdGV4dENvbnRlbnQgPSBqc29uT2JqW2tleV0uJGVsLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVycm9yTXNnLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRDb250ZW50LmluZGV4T2YoZXJyb3JNc2dbaV0pICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGtleSlbMF0uc3R5bGUuY29sb3IgPSAncmVkJzsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB1dGlscy5oYW5kbGVSZWplY3QoZXJyb3JNc2cpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgTWVzc2FnZS53YXJuaW5nKCfor7fmraPnoa7nmoTloavlhpnooajljZXlhoXlrrkuJyk7CiAgICAgICAgICB9CiAgICAgICAgICByZWplY3QoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNToKICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoJ1VSTOihqOWNleWkhOeQhuS4muWKoeaVsOaNrui2heaXti4nKTsKICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OgogICAgICAgICAgaWYgKG5lZWRDb25maXJtKSB7CiAgICAgICAgICAgIE1lc3NhZ2VCb3guY29uZmlybSgnVVJM6KGo5Y2V6aG16Z2i5pyq5q2j56Gu5aSE55CG5pWw5o2u77yM5piv5ZCm5LuN54S25ZCv5Yqo5rWB56iL77yfJywgewogICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdCgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzoKICAgICAgICAgIC8vaG90dGFibGXlrZDooajmlbDmja7moKHpqozlpLHotKXjgIIKICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoIlx1ODNCN1x1NTNENlx1ODg2OFx1NTM1NVx1NjU3MFx1NjM2RVx1NjVGNlx1NTNEMVx1NzUxRlx1OTg4NFx1NjcxRlx1NEU0Qlx1NTkxNlx1NzY4NFx1NUYwMlx1NUUzOFx1RkYwQ3JlYXNvbjoiLmNvbmNhdChyZWFzb24pKTsKICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pOwogIH0sCiAgLy/lhbPpl63miYDmnInmoKHpqozpgJrnn6UKICBjbG9zZUFsbE5vdGlmaWNhdGlvbjogZnVuY3Rpb24gY2xvc2VBbGxOb3RpZmljYXRpb24oKSB7CiAgICBjbG9zZUFsbE5vdGlmaWNhdGlvbkZsYWcgPSB0cnVlOwogICAgZm9yICh2YXIga2V5IGluIG5vdGlmaWNhdGlvbnMpIHsKICAgICAgbm90aWZpY2F0aW9uc1trZXldLmNsb3NlKCk7CiAgICAgIGRlbGV0ZSBub3RpZmljYXRpb25zW2tleV07CiAgICB9CiAgfSwKICBoYW5kbGVSZWplY3Q6IGZ1bmN0aW9uIGhhbmRsZVJlamVjdChlcnJvck1zZykgewogICAgdXRpbHMuY2xvc2VBbGxOb3RpZmljYXRpb24oKTsKICAgIGNsb3NlQWxsTm90aWZpY2F0aW9uRmxhZyA9IGZhbHNlOwogICAgdmFyIG5vdGlmaSA9IE5vdGlmaWNhdGlvbi5lcnJvcih7CiAgICAgIHRpdGxlOiAn6ZSZ6K+v5o+Q56S6JywKICAgICAgZGFuZ2Vyb3VzbHlVc2VIVE1MU3RyaW5nOiB0cnVlLAogICAgICBtZXNzYWdlOiAiXHU4QkY3XHU2QjYzXHU3ODZFXHU3Njg0XHU1ODZCXHU1MTk5XHU0RUU1XHU0RTBCXHU4ODY4XHU1MzU1XHU1MTg1XHU1QkI5XHVGRjFBPGJyLz4iLmNvbmNhdChlcnJvck1zZy5qb2luKCc8YnIvPicpKSwKICAgICAgZHVyYXRpb246IDAsCiAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgaWYgKCFjbG9zZUFsbE5vdGlmaWNhdGlvbkZsYWcpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgbiA9IE5vdGlmaWNhdGlvbi53YXJuaW5nKHsKICAgICAgICAgICAgICBjdXN0b21DbGFzczogJ2N1c3RvbUNsYXNzJywKICAgICAgICAgICAgICBkdXJhdGlvbjogMCwKICAgICAgICAgICAgICBzaG93Q2xvc2U6IGZhbHNlLAogICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7CiAgICAgICAgICAgICAgICBuLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB1dGlscy5oYW5kbGVSZWplY3QoZXJyb3JNc2cpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG5vdGlmaWNhdGlvbnNbbi5pZF0gPSBuOwogICAgICAgICAgfSwgMTApOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBub3RpZmljYXRpb25zW25vdGlmaS5pZF0gPSBub3RpZmk7CiAgfSwKICAvLyDojrflj5bmjIflrppkb23lhYPntKDnmoTniLbnuqfkuK3lhbfmnInmjIflrprlsZ7mgKfnmoRkb23lhYPntKAKICBnZXRQYXJlbnRFbGVtZW50QnlBdHRyaWJ1dGU6IGZ1bmN0aW9uIGdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZShlbCwgYXR0cmlidXRlKSB7CiAgICBpZiAoIWVsIHx8ICFlbC5oYXNBdHRyaWJ1dGUgfHwgZWwuaGFzQXR0cmlidXRlLmNvbnN0cnVjdG9yICE9PSBGdW5jdGlvbikgewogICAgICB0aHJvdyAn5Lyg5YWl55qE5YWD57SgZWzkuI3og73kuLrnqbrkuJTlv4XpobvkuLpIVE1MSHRtbEVsZW1lbnTnsbvlnosuJzsKICAgIH0KICAgIGlmICghYXR0cmlidXRlIHx8IGF0dHJpYnV0ZS5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nKSB7CiAgICAgIHRocm93ICfkvKDlhaXnmoTlsZ7mgKdhdHRyaWJ1dGXkuI3og73kuLrnqbrkuJTlv4XpobvkuLpTdHJpbmfnsbvlnosuJzsKICAgIH0KICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkgewogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgaWYgKGVsLnRhZ05hbWUgPT09ICdIVE1MJykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRQYXJlbnRFbGVtZW50QnlBdHRyaWJ1dGUoZWwucGFyZW50RWxlbWVudCwgYXR0cmlidXRlKTsKICAgIH0KICB9LAogIC8vIOS7jueItue6p2RvbeWFg+e0oOS4reiOt+WPluaMh+WumuWxnuaAp+eahOWAvAogIGdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudDogZnVuY3Rpb24gZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KGVsLCBhdHRyaWJ1dGUpIHsKICAgIHZhciBwRWwgPSB1dGlscy5nZXRQYXJlbnRFbGVtZW50QnlBdHRyaWJ1dGUoZWwsIGF0dHJpYnV0ZSk7CiAgICBpZiAocEVsICYmIHBFbC5nZXRBdHRyaWJ1dGUgJiYgcEVsLmdldEF0dHJpYnV0ZS5jb25zdHJ1Y3RvciA9PT0gRnVuY3Rpb24pIHsKICAgICAgcmV0dXJuIHBFbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0sCiAgLy8g6YCa6L+H6Lev5b6E5Y+W5b6X5a+56LGh5Lit55qE5bGe5oCnCiAgZ2V0VmFsdWVCeVBhdGg6IGZ1bmN0aW9uIGdldFZhbHVlQnlQYXRoKG9iaiwgcGF0aCwgc3ViSW5kZXgpIHsKICAgIGlmICghb2JqIHx8ICFwYXRoIHx8IHBhdGguY29uc3RydWN0b3IgIT0gU3RyaW5nKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCEvXlx3Py4qW1x3fFxdXSQvLnRlc3QocGF0aCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgcGF0aEFyeSA9IHBhdGguc3BsaXQoJy4nKTsKICAgIGlmIChwYXRoQXJ5Lmxlbmd0aCA9PSAxKSB7CiAgICAgIHJldHVybiBvYmpbcGF0aF07CiAgICB9IGVsc2UgaWYgKHBhdGhBcnkubGVuZ3RoID4gMSkgewogICAgICB2YXIgcmV0ID0gb2JqOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIga2V5ID0gcGF0aEFyeVtpXTsKICAgICAgICB2YXIgbWF0Y2ggPSAvXihcdyspXFsoXGQrKVxdJC8uZXhlYyhrZXkpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgcmV0ID0gcmV0W21hdGNoWzFdXVttYXRjaFsyXV07CiAgICAgICAgfSBlbHNlIGlmIChyZXQgJiYgcmV0LmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICAgIGlmIChzdWJJbmRleCAhPSBudWxsICYmIHN1YkluZGV4ICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICB2YXIgcHJlSW5kZXggPSBOdW1iZXIucGFyc2VJbnQoc3ViSW5kZXgpOwogICAgICAgICAgICBpZiAoIWlzTmFOKHByZUluZGV4KSkgewogICAgICAgICAgICAgIGluZGV4ID0gcHJlSW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldCA9IHJldFtpbmRleF1ba2V5XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0ID0gcmV0W2tleV07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9LAogIC8vIOmAmui/h+i3r+W+hOiuvue9ruWvueixoeS4reeahOWxnuaApwogIHNldFZhbHVlQnlQYXRoOiBmdW5jdGlvbiBzZXRWYWx1ZUJ5UGF0aChvYmosIHBhdGgsIHZhbHVlLCBzdWJJbmRleCkgewogICAgaWYgKCFvYmogfHwgIXBhdGggfHwgcGF0aC5jb25zdHJ1Y3RvciAhPSBTdHJpbmcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCEvXlx3Py4qW1x3fFxdXSQvLnRlc3QocGF0aCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIHBhdGhBcnkgPSBwYXRoLnNwbGl0KCcuJyk7CiAgICBpZiAocGF0aEFyeS5sZW5ndGggPT0gMSkgewogICAgICBvYmpbcGF0aF0gPSB2YWx1ZTsKICAgIH0gZWxzZSBpZiAocGF0aEFyeS5sZW5ndGggPiAxKSB7CiAgICAgIHZhciByZXQgPSBvYmo7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFyeS5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBrZXkgPSBwYXRoQXJ5W2ldOwogICAgICAgIHZhciBtYXRjaCA9IC9eKFx3KylcWyhcZCspXF0kLy5leGVjKGtleSk7CiAgICAgICAgaWYgKGkgPT0gcGF0aEFyeS5sZW5ndGggLSAxKSB7CiAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0W21hdGNoWzFdXVttYXRjaFsyXV0gPSB2YWx1ZTsKICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICYmIHJldC5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICAgICAgaWYgKHN1YkluZGV4ICE9IG51bGwgJiYgc3ViSW5kZXggIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgdmFyIHByZUluZGV4ID0gTnVtYmVyLnBhcnNlSW50KHN1YkluZGV4KTsKICAgICAgICAgICAgICBpZiAoIWlzTmFOKHByZUluZGV4KSkgewogICAgICAgICAgICAgICAgaW5kZXggPSBwcmVJbmRleDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqLiRzZXQocmV0W2luZGV4XSwga2V5LCB2YWx1ZSk7CiAgICAgICAgICAgIC8vcmV0W2luZGV4XVtrZXldID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvL3JldFtrZXldID0gdmFsdWU7CiAgICAgICAgICAgIG9iai4kc2V0KHJldCwga2V5LCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICByZXQgPSByZXRbbWF0Y2hbMV1dW21hdGNoWzJdXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldCA9IHJldFtrZXldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgb2JqLiRmb3JjZVVwZGF0ZSgpOwogIH0sCiAgLyoqDQogICAqIOWwhuWtl+espuS4sui9rOS4umpzb27lr7nosaHjgIINCiAgICogQHBhcmFtIGpzb25TdHINCiAgICogQHBhcmFtIHR5cGUgIOWPr+S4jeWhq+WGmXBhcnNlVG9Kc29uDQogICAqIEByZXR1cm5zDQogICAqLwogIHBhcnNlVG9Kc29uOiBmdW5jdGlvbiBwYXJzZVRvSnNvbihqc29uU3RyLCB0eXBlKSB7CiAgICB0eXBlID0gdHlwZSB8fCAxOwogICAgaWYgKCFqc29uU3RyIHx8IGpzb25TdHIgPT09ICcnKSByZXR1cm47CiAgICAvL+WmguaenOWMheWQq+aNouihjO+8jOS4i+mdouino+aekGpzb27kvJrmiqXplJnvvIzmiYDku6XlsIbmjaLooYzmm7/mjaLkuLoy5Liq56m65qC856ymCiAgICBqc29uU3RyID0ganNvblN0ci5yZXBsYWNlKC9cbi9nLCAnICAnKTsKICAgIHRyeSB7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgMToKICAgICAgICAgIHJldHVybiBldmFsKCcoJyArIGpzb25TdHIgKyAnKScpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgSlNPTi5wYXJzZShqc29uU3RyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyAn6Kej5p6QanNvbuWvueixoemUmeivryc7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gdXRpbHMucGFyc2VUb0pzb24oanNvblN0ciwgdHlwZSArIDEpOwogICAgfQogIH0sCiAgLyoqDQogICAqIOWwhuaVsOWtl+i9rOaNouaIkOS6uuWQjeW4geWkp+WGmeOAgg0KICAgKg0KICAgKiBAcGFyYW0gY3VycmVuY3lEaWdpdHMNCiAgICogQHJldHVybnMNCiAgICovCiAgY29udmVydEN1cnJlbmN5OiBmdW5jdGlvbiBjb252ZXJ0Q3VycmVuY3koY3VycmVuY3lEaWdpdHMpIHsKICAgIHZhciBNQVhJTVVNX05VTUJFUiA9IDk5OTk5OTk5OTk5Ljk5OwogICAgdmFyIENOX1pFUk8gPSAn6Zu2JzsKICAgIHZhciBDTl9PTkUgPSAn5aO5JzsKICAgIHZhciBDTl9UV08gPSAn6LSwJzsKICAgIHZhciBDTl9USFJFRSA9ICflj4EnOwogICAgdmFyIENOX0ZPVVIgPSAn6IKGJzsKICAgIHZhciBDTl9GSVZFID0gJ+S8jSc7CiAgICB2YXIgQ05fU0lYID0gJ+mZhic7CiAgICB2YXIgQ05fU0VWRU4gPSAn5p+SJzsKICAgIHZhciBDTl9FSUdIVCA9ICfmjYwnOwogICAgdmFyIENOX05JTkUgPSAn546WJzsKICAgIHZhciBDTl9URU4gPSAn5ou+JzsKICAgIHZhciBDTl9IVU5EUkVEID0gJ+S9sCc7CiAgICB2YXIgQ05fVEhPVVNBTkQgPSAn5LufJzsKICAgIHZhciBDTl9URU5fVEhPVVNBTkQgPSAn5LiHJzsKICAgIHZhciBDTl9IVU5EUkVEX01JTExJT04gPSAn5Lq/JzsKICAgIHZhciBDTl9TWU1CT0wgPSAnJzsKICAgIHZhciBDTl9ET0xMQVIgPSAn5YWDJzsKICAgIHZhciBDTl9URU5fQ0VOVCA9ICfop5InOwogICAgdmFyIENOX0NFTlQgPSAn5YiGJzsKICAgIHZhciBDTl9JTlRFR0VSID0gJ+aVtCc7CiAgICB2YXIgaW50ZWdyYWw7CiAgICB2YXIgZGVjaW1hbDsKICAgIHZhciBvdXRwdXRDaGFyYWN0ZXJzOwogICAgdmFyIHBhcnRzOwogICAgdmFyIGRpZ2l0cywgcmFkaWNlcywgYmlnUmFkaWNlcywgZGVjaW1hbHM7CiAgICB2YXIgemVyb0NvdW50OwogICAgdmFyIGksIHAsIGQ7CiAgICB2YXIgcXVvdGllbnQsIG1vZHVsdXM7CiAgICBjdXJyZW5jeURpZ2l0cyA9IGN1cnJlbmN5RGlnaXRzLnRvU3RyaW5nKCk7CiAgICBpZiAoY3VycmVuY3lEaWdpdHMgPT0gJycpIHsKICAgICAgcmV0dXJuICcnOwogICAgfQogICAgaWYgKGN1cnJlbmN5RGlnaXRzLm1hdGNoKC9bXiwuXGRdLykgIT0gbnVsbCkgewogICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBpZiAoY3VycmVuY3lEaWdpdHMubWF0Y2goL14oKFxkezEsM30oLFxkezN9KSooLigoXGR7M30sKSpcZHsxLDN9KSk/KXwoXGQrKC5cZCspPykpJC8pID09IG51bGwpIHsKICAgICAgcmV0dXJuICcnOwogICAgfQogICAgY3VycmVuY3lEaWdpdHMgPSBjdXJyZW5jeURpZ2l0cy5yZXBsYWNlKC8sL2csICcnKTsKICAgIGN1cnJlbmN5RGlnaXRzID0gY3VycmVuY3lEaWdpdHMucmVwbGFjZSgvXjArLywgJycpOwogICAgaWYgKE51bWJlcihjdXJyZW5jeURpZ2l0cykgPiBNQVhJTVVNX05VTUJFUikgewogICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBwYXJ0cyA9IGN1cnJlbmN5RGlnaXRzLnNwbGl0KCcuJyk7CiAgICBpZiAocGFydHMubGVuZ3RoID4gMSkgewogICAgICBpbnRlZ3JhbCA9IHBhcnRzWzBdOwogICAgICBkZWNpbWFsID0gcGFydHNbMV07CiAgICAgIGRlY2ltYWwgPSBkZWNpbWFsLnN1YnN0cigwLCAyKTsKICAgIH0gZWxzZSB7CiAgICAgIGludGVncmFsID0gcGFydHNbMF07CiAgICAgIGRlY2ltYWwgPSAnJzsKICAgIH0KICAgIGRpZ2l0cyA9IG5ldyBBcnJheShDTl9aRVJPLCBDTl9PTkUsIENOX1RXTywgQ05fVEhSRUUsIENOX0ZPVVIsIENOX0ZJVkUsIENOX1NJWCwgQ05fU0VWRU4sIENOX0VJR0hULCBDTl9OSU5FKTsKICAgIHJhZGljZXMgPSBuZXcgQXJyYXkoJycsIENOX1RFTiwgQ05fSFVORFJFRCwgQ05fVEhPVVNBTkQpOwogICAgYmlnUmFkaWNlcyA9IG5ldyBBcnJheSgnJywgQ05fVEVOX1RIT1VTQU5ELCBDTl9IVU5EUkVEX01JTExJT04pOwogICAgZGVjaW1hbHMgPSBuZXcgQXJyYXkoQ05fVEVOX0NFTlQsIENOX0NFTlQpOwogICAgb3V0cHV0Q2hhcmFjdGVycyA9ICcnOwogICAgaWYgKE51bWJlcihpbnRlZ3JhbCkgPiAwKSB7CiAgICAgIHplcm9Db3VudCA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnRlZ3JhbC5sZW5ndGg7IGkrKykgewogICAgICAgIHAgPSBpbnRlZ3JhbC5sZW5ndGggLSBpIC0gMTsKICAgICAgICBkID0gaW50ZWdyYWwuc3Vic3RyKGksIDEpOwogICAgICAgIHF1b3RpZW50ID0gcCAvIDQ7CiAgICAgICAgbW9kdWx1cyA9IHAgJSA0OwogICAgICAgIGlmIChkID09ICcwJykgewogICAgICAgICAgemVyb0NvdW50Kys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh6ZXJvQ291bnQgPiAwKSB7CiAgICAgICAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gZGlnaXRzWzBdOwogICAgICAgICAgfQogICAgICAgICAgemVyb0NvdW50ID0gMDsKICAgICAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gZGlnaXRzW051bWJlcihkKV0gKyByYWRpY2VzW21vZHVsdXNdOwogICAgICAgIH0KICAgICAgICBpZiAobW9kdWx1cyA9PSAwICYmIHplcm9Db3VudCA8IDQpIHsKICAgICAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gYmlnUmFkaWNlc1txdW90aWVudF07CiAgICAgICAgfQogICAgICB9CiAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gQ05fRE9MTEFSOwogICAgfQogICAgaWYgKGRlY2ltYWwgIT0gJycpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IGRlY2ltYWwubGVuZ3RoOyBpKyspIHsKICAgICAgICBkID0gZGVjaW1hbC5zdWJzdHIoaSwgMSk7CiAgICAgICAgaWYgKGQgIT0gJzAnKSB7CiAgICAgICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IGRpZ2l0c1tOdW1iZXIoZCldICsgZGVjaW1hbHNbaV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAob3V0cHV0Q2hhcmFjdGVycyA9PSAnJykgewogICAgICBvdXRwdXRDaGFyYWN0ZXJzID0gQ05fWkVSTyArIENOX0RPTExBUjsKICAgIH0KICAgIGlmIChkZWNpbWFsID09ICcnKSB7CiAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gQ05fSU5URUdFUjsKICAgIH0KICAgIG91dHB1dENoYXJhY3RlcnMgPSBDTl9TWU1CT0wgKyBvdXRwdXRDaGFyYWN0ZXJzOwogICAgcmV0dXJuIG91dHB1dENoYXJhY3RlcnM7CiAgfSwKICAvKioNCiAgICog5pWw5a2X5qC85byP6L2s5o2i5oiQ5Y2D5YiG5L2NDQogICAqQHBhcmFte09iamVjdH1udW0NCiAgICovCiAgdGhvdXNhbmRCaXQ6IGZ1bmN0aW9uIHRob3VzYW5kQml0KG51bSkgewogICAgaWYgKChudW0gKyAnJykudHJpbSgpID09ICcnKSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIGlmIChpc05hTihudW0pKSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIG51bSA9IG51bSArICcnOwogICAgaWYgKC9eLipcLi4qJC8udGVzdChudW0pKSB7CiAgICAgIHZhciBwb2ludEluZGV4ID0gbnVtLmxhc3RJbmRleE9mKCcuJyk7CiAgICAgIHZhciBpbnRQYXJ0ID0gbnVtLnN1YnN0cmluZygwLCBwb2ludEluZGV4KTsKICAgICAgdmFyIHBvaW50UGFydCA9IG51bS5zdWJzdHJpbmcocG9pbnRJbmRleCArIDEsIG51bS5sZW5ndGgpOwogICAgICB2YXIgaW50UGFydCA9IGludFBhcnQgKyAnJzsKICAgICAgdmFyIHJlID0gLygtP1xkKykoXGR7M30pLzsKICAgICAgd2hpbGUgKHJlLnRlc3QoaW50UGFydCkpIHsKICAgICAgICBpbnRQYXJ0ID0gaW50UGFydC5yZXBsYWNlKHJlLCAnJDEsJDInKTsKICAgICAgfQogICAgICBudW0gPSBpbnRQYXJ0ICsgJy4nICsgcG9pbnRQYXJ0OwogICAgfSBlbHNlIHsKICAgICAgbnVtID0gbnVtICsgJyc7CiAgICAgIHZhciByZSA9IC8oLT9cZCspKFxkezN9KS87CiAgICAgIHdoaWxlIChyZS50ZXN0KG51bSkpIHsKICAgICAgICBudW0gPSBudW0ucmVwbGFjZShyZSwgJyQxLCQyJyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudW07CiAgfSwKICAvKioNCiAgICog6YCa6L+HbmFtZeiOt+WPlumhtemdonVybOWcsOWdgOWPguaVsA0KICAgKiBAcGFyYW0gbmFtZQ0KICAgKiBAcmV0dXJucw0KICAgKg0KICAgKi8KICBnZXRVcmxLZXk6IGZ1bmN0aW9uIGdldFVybEtleShuYW1lKSB7CiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KChuZXcgUmVnRXhwKCdbP3wmXScgKyBuYW1lICsgJz0nICsgJyhbXiY7XSs/KSgmfCN8O3wkKScpLmV4ZWMobG9jYXRpb24uaHJlZikgfHwgWywgJyddKVsxXS5yZXBsYWNlKC9cKy9nLCAnJTIwJykpIHx8IG51bGw7CiAgfSwKICAvL+mAieaLqeWZqOS4iuS4i+enuwogIGRvd246IGZ1bmN0aW9uIGRvd24oYXJ5LCBzZWxlY3RBcnIsIHRoaXNfKSB7CiAgICBpZiAoYXJ5Lmxlbmd0aCA+IDAgJiYgc2VsZWN0QXJyLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGlkeCA9IHNlbGVjdEFyci5pbmRleE9mKGFyeVthcnkubGVuZ3RoIC0gMV0pOwogICAgICBpZiAoaWR4ICsgMSA8IHNlbGVjdEFyci5sZW5ndGgpIHsKICAgICAgICB2YXIgdCA9IHNlbGVjdEFycltpZHggKyAxXTsKICAgICAgICBzZWxlY3RBcnJbaWR4ICsgMV0gPSBzZWxlY3RBcnJbaWR4XTsKICAgICAgICBzZWxlY3RBcnJbaWR4XSA9IHQ7CiAgICAgICAgdGhpc18uY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpOwogICAgICAgIHRoaXNfLnN5bmNJbnB1dFZhbHVlKCk7CiAgICAgIH0KICAgIH0KICB9LAogIHVwOiBmdW5jdGlvbiB1cChhcnksIHNlbGVjdEFyciwgdGhpc18pIHsKICAgIGlmIChhcnkubGVuZ3RoID4gMCAmJiBzZWxlY3RBcnIubGVuZ3RoID4gMCkgewogICAgICB2YXIgaWR4ID0gc2VsZWN0QXJyLmluZGV4T2YoYXJ5W2FyeS5sZW5ndGggLSAxXSk7CiAgICAgIGlmIChpZHggIT0gMCkgewogICAgICAgIHZhciB0ID0gc2VsZWN0QXJyW2lkeCAtIDFdOwogICAgICAgIHNlbGVjdEFycltpZHggLSAxXSA9IHNlbGVjdEFycltpZHhdOwogICAgICAgIHNlbGVjdEFycltpZHhdID0gdDsKICAgICAgICB0aGlzXy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCk7CiAgICAgICAgdGhpc18uc3luY0lucHV0VmFsdWUoKTsKICAgICAgfQogICAgfQogIH0sCiAgQXJyYXk6IHsKICAgIC8v5LiK56e75oyJ6ZKuCiAgICB1cDogZnVuY3Rpb24gdXAoaWR4LCBsaXN0KSB7CiAgICAgIGlkeCA9IHBhcnNlSW50KGlkeCk7CiAgICAgIGlmIChpZHggPCAxKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciB0ID0gbGlzdFtpZHggLSAxXTsKICAgICAgbGlzdFtpZHggLSAxXSA9IGxpc3RbaWR4XTsKICAgICAgbGlzdFtpZHhdID0gdDsKICAgIH0sCiAgICAvL+S4i+enu+aMiemSrgogICAgZG93bjogZnVuY3Rpb24gZG93bihpZHgsIGxpc3QpIHsKICAgICAgaWR4ID0gcGFyc2VJbnQoaWR4KTsKICAgICAgaWYgKGlkeCA+PSBsaXN0Lmxlbmd0aCAtIDEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIHQgPSBsaXN0W2lkeCArIDFdOwogICAgICBsaXN0W2lkeCArIDFdID0gbGlzdFtpZHhdOwogICAgICBsaXN0W2lkeF0gPSB0OwogICAgfSwKICAgIHJlc3VtZVNuOiBmdW5jdGlvbiByZXN1bWVTbihsaXN0KSB7CiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbGlzdC5sZW5ndGg7IGsrKykgewogICAgICAgIGxpc3Rba10uc24gPSBrOwogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfSwKICAgIC8qKg0KICAgICAqIGlkeCDljp/kvY3nva4NCiAgICAgKiBudW0g55uu5qCH5L2N572uDQogICAgICogbGlzdCDmlbDnu4QNCiAgICAgKi8KICAgIG1vdmVUb051bTogZnVuY3Rpb24gbW92ZVRvTnVtKGlkeCwgdGFyZ2V0LCBsaXN0KSB7CiAgICAgIGlmICh0YXJnZXQgPT0gLTEpIHsKICAgICAgICB0YXJnZXQgPSAwOwogICAgICB9IGVsc2UgaWYgKGlkeCA+PSB0YXJnZXQpIHsKICAgICAgICB0YXJnZXQgPSB0YXJnZXQgKyAxOwogICAgICB9CiAgICAgIHZhciB0ID0gbGlzdC5zcGxpY2UoaWR4LCAxKTsKICAgICAgbGlzdC5pbnNlcnQodGFyZ2V0LCB0WzBdKTsKICAgICAgdGhpcy5yZXN1bWVTbihsaXN0KTsKICAgIH0sCiAgICAvL+WIoOmZpOaMiemSrgogICAgZGVsOiBmdW5jdGlvbiBkZWwoaWR4LCBsaXN0KSB7CiAgICAgIGxpc3Quc3BsaWNlKGlkeCwgMSk7CiAgICB9LAogICAgLy/mib7liLDmjIflrprlhYPntKDnmoTmnKrnn6UKICAgIGlkeE9mOiBmdW5jdGlvbiBpZHhPZih2YWwsIGxpc3QpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGxpc3RbaV0gPT0gdmFsKSByZXR1cm4gaTsKICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9LAogICAgLy/liKDpmaTmjIflrprlhYPntKAKICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKHZhbCwgbGlzdCkgewogICAgICB2YXIgaWR4ID0gdGhpcy5pZHhPZih2YWwsIGxpc3QpOwogICAgICBpZiAoaWR4ID4gLTEpIHsKICAgICAgICBsaXN0LnNwbGljZShpZHgsIDEpOwogICAgICB9CiAgICB9LAogICAgLy/nva7pobYKICAgIHRvcDogZnVuY3Rpb24gdG9wKGlkeCwgbGlzdCkgewogICAgICBpZiAoaWR4ID49IGxpc3QubGVuZ3RoIHx8IGlkeCA8IDEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy/pgJDkuKrkuqTmjaIKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHg7IGkrKykgewogICAgICAgIHZhciB0ZW1wID0gbGlzdFtpXTsKICAgICAgICBsaXN0W2ldID0gbGlzdFtpZHhdOwogICAgICAgIGxpc3RbaWR4XSA9IHRlbXA7CiAgICAgIH0KICAgIH0sCiAgICAvL+e9ruW6lQogICAgYm90dG9tOiBmdW5jdGlvbiBib3R0b20oaWR4LCBsaXN0KSB7CiAgICAgIGlmIChpZHggPj0gbGlzdC5sZW5ndGggLSAxIHx8IGlkeCA8IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy/pgJDkuKrkuqTmjaIKICAgICAgZm9yICh2YXIgaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+IGlkeDsgaS0tKSB7CiAgICAgICAgdmFyIHRlbXAgPSBsaXN0W2ldOwogICAgICAgIGxpc3RbaV0gPSBsaXN0W2lkeF07CiAgICAgICAgbGlzdFtpZHhdID0gdGVtcDsKICAgICAgfQogICAgfQogIH0sCiAgLyoqDQogICAqIOWvueixoei9rHVybOWPguaVsA0KICAgKiBAcGFyYW0geyp9IGRhdGENCiAgICogQHBhcmFtIHsqfSBpc1ByZWZpeA0KICAgKi8KICBxdWVyeVBhcmFtczogZnVuY3Rpb24gcXVlcnlQYXJhbXMoZGF0YSkgewogICAgdmFyIGlzUHJlZml4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTsKICAgIHZhciBwcmVmaXggPSBpc1ByZWZpeCA/ICc/JyA6ICcnOwogICAgdmFyIF9yZXN1bHQgPSBbXTsKICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGtleSkgewogICAgICB2YXIgdmFsdWUgPSBkYXRhW2tleV07CiAgICAgIC8vIOWOu+aOieS4uuepuueahOWPguaVsAogICAgICBpZiAoWycnLCB1bmRlZmluZWQsIG51bGxdLmluY2x1ZGVzKHZhbHVlKSkgewogICAgICAgIHJldHVybiAxOyAvLyBjb250aW51ZQogICAgICB9CiAgICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChfdmFsdWUpIHsKICAgICAgICAgIF9yZXN1bHQucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICdbXT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KF92YWx1ZSkpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIF9yZXN1bHQucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpOwogICAgICB9CiAgICB9OwogICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgaWYgKF9sb29wKGtleSkpIGNvbnRpbnVlOwogICAgfQogICAgcmV0dXJuIF9yZXN1bHQubGVuZ3RoID8gcHJlZml4ICsgX3Jlc3VsdC5qb2luKCcmJykgOiAnJzsKICB9LAogIE1lbnU6IHsKICAgIGFkZFN1Yk1lbnVzOiBmdW5jdGlvbiBhZGRTdWJNZW51cyh0aGF0LCBjaGlsZHJlbikgewogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgIC8vCQkJCQlpZighcGFyZW50LmNoaWxkcmVuKXsKICAgICAgICAvLwkJCQkJCXBhcmVudC5jaGlsZHJlbiA9IFt7cGF0aDonLycsIHJlZGlyZWN0OmNoaWxkcmVuWzBdLm1lbnVVcmx9XTsKICAgICAgICAvLwkJCQkJfQogICAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKG0pIHsKICAgICAgICAgIC8vY29uc3Qgcm91dGUgPSB7cGF0aDogbS5tZW51VXJsLCBuYW1lOiBtLmFsaWFzLCAgY29tcG9uZW50OiByZXNvbHZlID0+IHJlcXVpcmUoW2BALyR7bS50ZW1wbGF0ZVVybH1gXSwgcmVzb2x2ZSApfTsKICAgICAgICAgIC8vcGFyZW50LmNoaWxkcmVuLnB1c2gocm91dGUpOwogICAgICAgICAgaWYgKG0uY2hpbGRyZW4gJiYgbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHRoaXNfLmFkZFN1Yk1lbnVzKHRoYXQsIG0uY2hpbGRyZW4pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9LAogICAgYWRkVG9Sb3V0ZXI6IGZ1bmN0aW9uIGFkZFRvUm91dGVyKHRoYXQsIHJvdXRlKSB7CiAgICAgIHZhciByb3V0ZXMgPSB0aGF0LiRyb3V0ZXIub3B0aW9ucy5yb3V0ZXM7CiAgICAgIHZhciBpc0luID0gZmFsc2U7CiAgICAgIHJvdXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgaWYgKHIucGF0aCA9PSByb3V0ZS5wYXRoKSB7CiAgICAgICAgICBpc0luID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAoIWlzSW4pIHsKICAgICAgICB0aGF0LiRyb3V0ZXIub3B0aW9ucy5yb3V0ZXMucHVzaChyb3V0ZSk7CiAgICAgICAgdGhhdC4kcm91dGVyLmFkZFJvdXRlcyhbcm91dGVdKTsKICAgICAgfQogICAgfSwKICAgIGFkZFN5bmNNZW51czogZnVuY3Rpb24gYWRkU3luY01lbnVzKHRoYXQsIG1lbnVzKSB7CiAgICAgIHZhciBfdGhpczMgPSB0aGlzOwogICAgICBpZiAobWVudXMgJiYgbWVudXMuY29uc3RydWN0b3IgPT09IEFycmF5ICYmIG1lbnVzLmxlbmd0aCA+IDApIHsKICAgICAgICAvLyDmm7TmlrDlvZPliY3pgInkuK3nmoToj5zljZUKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBjdXJSb3V0ZVBhdGggPSB0aGF0LiRyb3V0ZS5wYXRoOwogICAgICAgICAgbWVudXMuZm9yRWFjaChmdW5jdGlvbiAobSkgewogICAgICAgICAgICAvL+WwhuWKqOaAgeiPnOWNlea3u+WKoOWIsOi3r+eUsQogICAgICAgICAgICBpZiAobS5jb2RlICE9ICdob21lJyAmJiBtLmNvZGUgIT0gJ3N0YXRlbWVudCcgJiYgdGhhdC5tZW51TWFwc1ttLmNvZGVdKSB7CiAgICAgICAgICAgICAgLy9jb25zdCByb3V0ZSA9IHtwYXRoOiBtLnBhdGgsICBjb21wb25lbnQ6IHJlc29sdmUgPT4gcmVxdWlyZShbYEAvJHttLnRlbXBsYXRlVXJsfWBdLCByZXNvbHZlICl9OwogICAgICAgICAgICAgIC8v5re75Yqg6Lev55Sx5L+h5oGvCiAgICAgICAgICAgICAgaWYgKHRoYXQubWVudU1hcHNbbS5jb2RlXSAmJiB0aGF0Lm1lbnVNYXBzW20uY29kZV0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgX3RoaXMzLmFkZFN1Yk1lbnVzKHRoYXQsIHRoYXQubWVudU1hcHNbbS5jb2RlXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vdGhpcy5hZGRUb1JvdXRlcih0aGF0LHJvdXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcCA9IG5ldyBSZWdFeHAoIl4vIi5jb25jYXQobS5hbGlhcywgIi8uKiQiKSk7CiAgICAgICAgICAgIGlmIChwLnRlc3QoY3VyUm91dGVQYXRoKSkgewogICAgICAgICAgICAgIHRoYXQuYWN0aXZlTWVudUluZGV4ID0gbS5hbGlhczsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSwgMTAwKTsKICAgICAgfQogICAgfQogIH0KfTsKCi8vIOWcqOaVsOe7hOS4iuaJqeWxleS4gOS4quWIoOmZpOaMh+WumumhueeahOaWueazlQpBcnJheS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGl0ZW0pIHsKICB0aGlzLnNwbGljZSh0aGlzLmZpbmRJbmRleChmdW5jdGlvbiAodikgewogICAgcmV0dXJuIHYgPT09IGl0ZW07CiAgfSksIDEpOwp9OwoKLy8g5Zyo5pWw57uE5LiK5omp5bGV5LiA5Liq5Y676YeN55qE5pa55rOVCkFycmF5LnByb3RvdHlwZS51bmlxdWUgPSBmdW5jdGlvbiAoYXJnKSB7CiAgdmFyIHJlcyA9IG5ldyBNYXAoKTsKICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKG0pIHsKICAgIGlmIChhcmcpIHsKICAgICAgcmV0dXJuICFyZXMuaGFzKG1bYXJnXSkgJiYgcmVzLnNldChtW2FyZ10sIDEpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICFyZXMuaGFzKG0pICYmIHJlcy5zZXQobSwgMSk7CiAgICB9CiAgfSk7Cn07CmV4cG9ydCBkZWZhdWx0IHV0aWxzOw=="},null]}