{"remainingRequest":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\thread-loader\\dist\\cjs.js!C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\babel-loader\\lib\\index.js!C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\quill\\core\\quill.js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\quill\\core\\quill.js","mtime":1787309795651},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\babel.config.js","mtime":1787567871334},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\thread-loader\\dist\\cjs.js","mtime":1787309791954},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\babel-loader\\lib\\index.js","mtime":1787309793142}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90eXBlb2YgZnJvbSAiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZi5qcyI7CmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSAiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLmpzIjsKaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiOwppbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSAiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXkuanMiOwppbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gIkM6L1VzZXJzL0FkbWluL0Rlc2t0b3AvZWR1Y2F0aW9uL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjay5qcyI7CmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSAiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIjsKaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tICJDOi9Vc2Vycy9BZG1pbi9EZXNrdG9wL2VkdWNhdGlvbi9mcm9udGVuZC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiOwp2YXIgX2V4Y2x1ZGVkID0gWyJtb2R1bGVzIl0sCiAgX2V4Y2x1ZGVkMiA9IFsibW9kdWxlcyJdOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcm9tLWVudHJpZXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGguanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmluZC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5yZWR1Y2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIjsKaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICdsb2Rhc2gtZXMnOwppbXBvcnQgKiBhcyBQYXJjaG1lbnQgZnJvbSAncGFyY2htZW50JzsKaW1wb3J0IERlbHRhIGZyb20gJ3F1aWxsLWRlbHRhJzsKaW1wb3J0IEVkaXRvciBmcm9tICcuL2VkaXRvci5qcyc7CmltcG9ydCBFbWl0dGVyIGZyb20gJy4vZW1pdHRlci5qcyc7CmltcG9ydCBpbnN0YW5jZXMgZnJvbSAnLi9pbnN0YW5jZXMuanMnOwppbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyLmpzJzsKaW1wb3J0IE1vZHVsZSBmcm9tICcuL21vZHVsZS5qcyc7CmltcG9ydCBTZWxlY3Rpb24sIHsgUmFuZ2UgfSBmcm9tICcuL3NlbGVjdGlvbi5qcyc7CmltcG9ydCBDb21wb3NpdGlvbiBmcm9tICcuL2NvbXBvc2l0aW9uLmpzJzsKaW1wb3J0IFRoZW1lIGZyb20gJy4vdGhlbWUuanMnOwppbXBvcnQgX3Njcm9sbFJlY3RJbnRvVmlldyBmcm9tICcuL3V0aWxzL3Njcm9sbFJlY3RJbnRvVmlldy5qcyc7CmltcG9ydCBjcmVhdGVSZWdpc3RyeVdpdGhGb3JtYXRzIGZyb20gJy4vdXRpbHMvY3JlYXRlUmVnaXN0cnlXaXRoRm9ybWF0cy5qcyc7CnZhciBkZWJ1ZyA9IGxvZ2dlcigncXVpbGwnKTsKdmFyIGdsb2JhbFJlZ2lzdHJ5ID0gbmV3IFBhcmNobWVudC5SZWdpc3RyeSgpOwpQYXJjaG1lbnQuUGFyZW50QmxvdC51aUNsYXNzID0gJ3FsLXVpJzsKCi8qKgogKiBPcHRpb25zIGZvciBpbml0aWFsaXppbmcgYSBRdWlsbCBpbnN0YW5jZQogKi8KCi8qKgogKiBTaW1pbGFyIHRvIFF1aWxsT3B0aW9ucywgYnV0IHdpdGggYWxsIHByb3BlcnRpZXMgZXhwYW5kZWQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMsCiAqIGFuZCBhbGwgc2VsZWN0b3JzIHJlc29sdmVkIHRvIEhUTUxFbGVtZW50cy4KICovCnZhciBRdWlsbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gUXVpbGwoY29udGFpbmVyKSB7CiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFF1aWxsKTsKICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgIHRoaXMub3B0aW9ucyA9IGV4cGFuZENvbmZpZyhjb250YWluZXIsIG9wdGlvbnMpOwogICAgdGhpcy5jb250YWluZXIgPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyOwogICAgaWYgKHRoaXMuY29udGFpbmVyID09IG51bGwpIHsKICAgICAgZGVidWcuZXJyb3IoJ0ludmFsaWQgUXVpbGwgY29udGFpbmVyJywgY29udGFpbmVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1ZykgewogICAgICBRdWlsbC5kZWJ1Zyh0aGlzLm9wdGlvbnMuZGVidWcpOwogICAgfQogICAgdmFyIGh0bWwgPSB0aGlzLmNvbnRhaW5lci5pbm5lckhUTUwudHJpbSgpOwogICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgncWwtY29udGFpbmVyJyk7CiAgICB0aGlzLmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJzsKICAgIGluc3RhbmNlcy5zZXQodGhpcy5jb250YWluZXIsIHRoaXMpOwogICAgdGhpcy5yb290ID0gdGhpcy5hZGRDb250YWluZXIoJ3FsLWVkaXRvcicpOwogICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ3FsLWJsYW5rJyk7CiAgICB0aGlzLmVtaXR0ZXIgPSBuZXcgRW1pdHRlcigpOwogICAgdmFyIHNjcm9sbEJsb3ROYW1lID0gUGFyY2htZW50LlNjcm9sbEJsb3QuYmxvdE5hbWU7CiAgICB2YXIgU2Nyb2xsQmxvdCA9IHRoaXMub3B0aW9ucy5yZWdpc3RyeS5xdWVyeShzY3JvbGxCbG90TmFtZSk7CiAgICBpZiAoIVNjcm9sbEJsb3QgfHwgISgnYmxvdE5hbWUnIGluIFNjcm9sbEJsb3QpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGluaXRpYWxpemUgUXVpbGwgd2l0aG91dCBcIiIuY29uY2F0KHNjcm9sbEJsb3ROYW1lLCAiXCIgYmxvdCIpKTsKICAgIH0KICAgIHRoaXMuc2Nyb2xsID0gbmV3IFNjcm9sbEJsb3QodGhpcy5vcHRpb25zLnJlZ2lzdHJ5LCB0aGlzLnJvb3QsIHsKICAgICAgZW1pdHRlcjogdGhpcy5lbWl0dGVyCiAgICB9KTsKICAgIHRoaXMuZWRpdG9yID0gbmV3IEVkaXRvcih0aGlzLnNjcm9sbCk7CiAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb24odGhpcy5zY3JvbGwsIHRoaXMuZW1pdHRlcik7CiAgICB0aGlzLmNvbXBvc2l0aW9uID0gbmV3IENvbXBvc2l0aW9uKHRoaXMuc2Nyb2xsLCB0aGlzLmVtaXR0ZXIpOwogICAgdGhpcy50aGVtZSA9IG5ldyB0aGlzLm9wdGlvbnMudGhlbWUodGhpcywgdGhpcy5vcHRpb25zKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwCiAgICB0aGlzLmtleWJvYXJkID0gdGhpcy50aGVtZS5hZGRNb2R1bGUoJ2tleWJvYXJkJyk7CiAgICB0aGlzLmNsaXBib2FyZCA9IHRoaXMudGhlbWUuYWRkTW9kdWxlKCdjbGlwYm9hcmQnKTsKICAgIHRoaXMuaGlzdG9yeSA9IHRoaXMudGhlbWUuYWRkTW9kdWxlKCdoaXN0b3J5Jyk7CiAgICB0aGlzLnVwbG9hZGVyID0gdGhpcy50aGVtZS5hZGRNb2R1bGUoJ3VwbG9hZGVyJyk7CiAgICB0aGlzLnRoZW1lLmFkZE1vZHVsZSgnaW5wdXQnKTsKICAgIHRoaXMudGhlbWUuYWRkTW9kdWxlKCd1aU5vZGUnKTsKICAgIHRoaXMudGhlbWUuaW5pdCgpOwogICAgdGhpcy5lbWl0dGVyLm9uKEVtaXR0ZXIuZXZlbnRzLkVESVRPUl9DSEFOR0UsIGZ1bmN0aW9uICh0eXBlKSB7CiAgICAgIGlmICh0eXBlID09PSBFbWl0dGVyLmV2ZW50cy5URVhUX0NIQU5HRSkgewogICAgICAgIF90aGlzLnJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgncWwtYmxhbmsnLCBfdGhpcy5lZGl0b3IuaXNCbGFuaygpKTsKICAgICAgfQogICAgfSk7CiAgICB0aGlzLmVtaXR0ZXIub24oRW1pdHRlci5ldmVudHMuU0NST0xMX1VQREFURSwgZnVuY3Rpb24gKHNvdXJjZSwgbXV0YXRpb25zKSB7CiAgICAgIHZhciBvbGRSYW5nZSA9IF90aGlzLnNlbGVjdGlvbi5sYXN0UmFuZ2U7CiAgICAgIHZhciBfdGhpcyRzZWxlY3Rpb24kZ2V0UmEgPSBfdGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSwKICAgICAgICBfdGhpcyRzZWxlY3Rpb24kZ2V0UmEyID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMkc2VsZWN0aW9uJGdldFJhLCAxKSwKICAgICAgICBuZXdSYW5nZSA9IF90aGlzJHNlbGVjdGlvbiRnZXRSYTJbMF07CiAgICAgIHZhciBzZWxlY3Rpb25JbmZvID0gb2xkUmFuZ2UgJiYgbmV3UmFuZ2UgPyB7CiAgICAgICAgb2xkUmFuZ2U6IG9sZFJhbmdlLAogICAgICAgIG5ld1JhbmdlOiBuZXdSYW5nZQogICAgICB9IDogdW5kZWZpbmVkOwogICAgICBtb2RpZnkuY2FsbChfdGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBfdGhpcy5lZGl0b3IudXBkYXRlKG51bGwsIG11dGF0aW9ucywgc2VsZWN0aW9uSW5mbyk7CiAgICAgIH0sIHNvdXJjZSk7CiAgICB9KTsKICAgIHRoaXMuZW1pdHRlci5vbihFbWl0dGVyLmV2ZW50cy5TQ1JPTExfRU1CRURfVVBEQVRFLCBmdW5jdGlvbiAoYmxvdCwgZGVsdGEpIHsKICAgICAgdmFyIG9sZFJhbmdlID0gX3RoaXMuc2VsZWN0aW9uLmxhc3RSYW5nZTsKICAgICAgdmFyIF90aGlzJHNlbGVjdGlvbiRnZXRSYTMgPSBfdGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSwKICAgICAgICBfdGhpcyRzZWxlY3Rpb24kZ2V0UmE0ID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMkc2VsZWN0aW9uJGdldFJhMywgMSksCiAgICAgICAgbmV3UmFuZ2UgPSBfdGhpcyRzZWxlY3Rpb24kZ2V0UmE0WzBdOwogICAgICB2YXIgc2VsZWN0aW9uSW5mbyA9IG9sZFJhbmdlICYmIG5ld1JhbmdlID8gewogICAgICAgIG9sZFJhbmdlOiBvbGRSYW5nZSwKICAgICAgICBuZXdSYW5nZTogbmV3UmFuZ2UKICAgICAgfSA6IHVuZGVmaW5lZDsKICAgICAgbW9kaWZ5LmNhbGwoX3RoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgY2hhbmdlID0gbmV3IERlbHRhKCkucmV0YWluKGJsb3Qub2Zmc2V0KF90aGlzKSkucmV0YWluKF9kZWZpbmVQcm9wZXJ0eSh7fSwgYmxvdC5zdGF0aWNzLmJsb3ROYW1lLCBkZWx0YSkpOwogICAgICAgIHJldHVybiBfdGhpcy5lZGl0b3IudXBkYXRlKGNoYW5nZSwgW10sIHNlbGVjdGlvbkluZm8pOwogICAgICB9LCBRdWlsbC5zb3VyY2VzLlVTRVIpOwogICAgfSk7CiAgICBpZiAoaHRtbCkgewogICAgICB2YXIgY29udGVudHMgPSB0aGlzLmNsaXBib2FyZC5jb252ZXJ0KHsKICAgICAgICBodG1sOiAiIi5jb25jYXQoaHRtbCwgIjxwPjxicj48L3A+IiksCiAgICAgICAgdGV4dDogJ1xuJwogICAgICB9KTsKICAgICAgdGhpcy5zZXRDb250ZW50cyhjb250ZW50cyk7CiAgICB9CiAgICB0aGlzLmhpc3RvcnkuY2xlYXIoKTsKICAgIGlmICh0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIpIHsKICAgICAgdGhpcy5yb290LnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsIHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcik7CiAgICB9CiAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRPbmx5KSB7CiAgICAgIHRoaXMuZGlzYWJsZSgpOwogICAgfQogICAgdGhpcy5hbGxvd1JlYWRPbmx5RWRpdHMgPSBmYWxzZTsKICB9CiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhRdWlsbCwgW3sKICAgIGtleTogImFkZENvbnRhaW5lciIsCiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQ29udGFpbmVyKGNvbnRhaW5lcikgewogICAgICB2YXIgcmVmTm9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDsKICAgICAgaWYgKHR5cGVvZiBjb250YWluZXIgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGNvbnRhaW5lcjsKICAgICAgICBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpOwogICAgICB9CiAgICAgIHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZShjb250YWluZXIsIHJlZk5vZGUpOwogICAgICByZXR1cm4gY29udGFpbmVyOwogICAgfQogIH0sIHsKICAgIGtleTogImJsdXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGJsdXIoKSB7CiAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKG51bGwpOwogICAgfQogIH0sIHsKICAgIGtleTogImRlbGV0ZVRleHQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGRlbGV0ZVRleHQoaW5kZXgsIGxlbmd0aCwgc291cmNlKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAgIHZhciBfb3ZlcmxvYWQgPSBvdmVybG9hZChpbmRleCwgbGVuZ3RoLCBzb3VyY2UpOwogICAgICB2YXIgX292ZXJsb2FkMiA9IF9zbGljZWRUb0FycmF5KF9vdmVybG9hZCwgNCk7CiAgICAgIGluZGV4ID0gX292ZXJsb2FkMlswXTsKICAgICAgbGVuZ3RoID0gX292ZXJsb2FkMlsxXTsKICAgICAgc291cmNlID0gX292ZXJsb2FkMlszXTsKICAgICAgcmV0dXJuIG1vZGlmeS5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX3RoaXMyLmVkaXRvci5kZWxldGVUZXh0KGluZGV4LCBsZW5ndGgpOwogICAgICB9LCBzb3VyY2UsIGluZGV4LCAtMSAqIGxlbmd0aCk7CiAgICB9CiAgfSwgewogICAga2V5OiAiZGlzYWJsZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzYWJsZSgpIHsKICAgICAgdGhpcy5lbmFibGUoZmFsc2UpOwogICAgfQogIH0sIHsKICAgIGtleTogImVkaXRSZWFkT25seSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZWRpdFJlYWRPbmx5KG1vZGlmaWVyKSB7CiAgICAgIHRoaXMuYWxsb3dSZWFkT25seUVkaXRzID0gdHJ1ZTsKICAgICAgdmFyIHZhbHVlID0gbW9kaWZpZXIoKTsKICAgICAgdGhpcy5hbGxvd1JlYWRPbmx5RWRpdHMgPSBmYWxzZTsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogIH0sIHsKICAgIGtleTogImVuYWJsZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlKCkgewogICAgICB2YXIgZW5hYmxlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTsKICAgICAgdGhpcy5zY3JvbGwuZW5hYmxlKGVuYWJsZWQpOwogICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdxbC1kaXNhYmxlZCcsICFlbmFibGVkKTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJmb2N1cyIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZm9jdXMoKSB7CiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTsKICAgICAgdGhpcy5zZWxlY3Rpb24uZm9jdXMoKTsKICAgICAgaWYgKCFvcHRpb25zLnByZXZlbnRTY3JvbGwpIHsKICAgICAgICB0aGlzLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3KCk7CiAgICAgIH0KICAgIH0KICB9LCB7CiAgICBrZXk6ICJmb3JtYXQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdChuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogRW1pdHRlci5zb3VyY2VzLkFQSTsKICAgICAgcmV0dXJuIG1vZGlmeS5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgcmFuZ2UgPSBfdGhpczMuZ2V0U2VsZWN0aW9uKHRydWUpOwogICAgICAgIHZhciBjaGFuZ2UgPSBuZXcgRGVsdGEoKTsKICAgICAgICBpZiAocmFuZ2UgPT0gbnVsbCkgcmV0dXJuIGNoYW5nZTsKICAgICAgICBpZiAoX3RoaXMzLnNjcm9sbC5xdWVyeShuYW1lLCBQYXJjaG1lbnQuU2NvcGUuQkxPQ0spKSB7CiAgICAgICAgICBjaGFuZ2UgPSBfdGhpczMuZWRpdG9yLmZvcm1hdExpbmUocmFuZ2UuaW5kZXgsIHJhbmdlLmxlbmd0aCwgX2RlZmluZVByb3BlcnR5KHt9LCBuYW1lLCB2YWx1ZSkpOwogICAgICAgIH0gZWxzZSBpZiAocmFuZ2UubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICBfdGhpczMuc2VsZWN0aW9uLmZvcm1hdChuYW1lLCB2YWx1ZSk7CiAgICAgICAgICByZXR1cm4gY2hhbmdlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjaGFuZ2UgPSBfdGhpczMuZWRpdG9yLmZvcm1hdFRleHQocmFuZ2UuaW5kZXgsIHJhbmdlLmxlbmd0aCwgX2RlZmluZVByb3BlcnR5KHt9LCBuYW1lLCB2YWx1ZSkpOwogICAgICAgIH0KICAgICAgICBfdGhpczMuc2V0U2VsZWN0aW9uKHJhbmdlLCBFbWl0dGVyLnNvdXJjZXMuU0lMRU5UKTsKICAgICAgICByZXR1cm4gY2hhbmdlOwogICAgICB9LCBzb3VyY2UpOwogICAgfQogIH0sIHsKICAgIGtleTogImZvcm1hdExpbmUiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdExpbmUoaW5kZXgsIGxlbmd0aCwgbmFtZSwgdmFsdWUsIHNvdXJjZSkgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKICAgICAgdmFyIGZvcm1hdHM7CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QKICAgICAgdmFyIF9vdmVybG9hZDMgPSBvdmVybG9hZChpbmRleCwgbGVuZ3RoLAogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAgIG5hbWUsIHZhbHVlLCBzb3VyY2UpOwogICAgICB2YXIgX292ZXJsb2FkNCA9IF9zbGljZWRUb0FycmF5KF9vdmVybG9hZDMsIDQpOwogICAgICBpbmRleCA9IF9vdmVybG9hZDRbMF07CiAgICAgIGxlbmd0aCA9IF9vdmVybG9hZDRbMV07CiAgICAgIGZvcm1hdHMgPSBfb3ZlcmxvYWQ0WzJdOwogICAgICBzb3VyY2UgPSBfb3ZlcmxvYWQ0WzNdOwogICAgICByZXR1cm4gbW9kaWZ5LmNhbGwodGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBfdGhpczQuZWRpdG9yLmZvcm1hdExpbmUoaW5kZXgsIGxlbmd0aCwgZm9ybWF0cyk7CiAgICAgIH0sIHNvdXJjZSwgaW5kZXgsIDApOwogICAgfQogIH0sIHsKICAgIGtleTogImZvcm1hdFRleHQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdFRleHQoaW5kZXgsIGxlbmd0aCwgbmFtZSwgdmFsdWUsIHNvdXJjZSkgewogICAgICB2YXIgX3RoaXM1ID0gdGhpczsKICAgICAgdmFyIGZvcm1hdHM7CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QKICAgICAgdmFyIF9vdmVybG9hZDUgPSBvdmVybG9hZCgKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICBpbmRleCwgbGVuZ3RoLCBuYW1lLCB2YWx1ZSwgc291cmNlKTsKICAgICAgdmFyIF9vdmVybG9hZDYgPSBfc2xpY2VkVG9BcnJheShfb3ZlcmxvYWQ1LCA0KTsKICAgICAgaW5kZXggPSBfb3ZlcmxvYWQ2WzBdOwogICAgICBsZW5ndGggPSBfb3ZlcmxvYWQ2WzFdOwogICAgICBmb3JtYXRzID0gX292ZXJsb2FkNlsyXTsKICAgICAgc291cmNlID0gX292ZXJsb2FkNlszXTsKICAgICAgcmV0dXJuIG1vZGlmeS5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX3RoaXM1LmVkaXRvci5mb3JtYXRUZXh0KGluZGV4LCBsZW5ndGgsIGZvcm1hdHMpOwogICAgICB9LCBzb3VyY2UsIGluZGV4LCAwKTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJnZXRCb3VuZHMiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJvdW5kcyhpbmRleCkgewogICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwOwogICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgICAgaWYgKHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicpIHsKICAgICAgICBib3VuZHMgPSB0aGlzLnNlbGVjdGlvbi5nZXRCb3VuZHMoaW5kZXgsIGxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYm91bmRzID0gdGhpcy5zZWxlY3Rpb24uZ2V0Qm91bmRzKGluZGV4LmluZGV4LCBpbmRleC5sZW5ndGgpOwogICAgICB9CiAgICAgIGlmICghYm91bmRzKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIGNvbnRhaW5lckJvdW5kcyA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICByZXR1cm4gewogICAgICAgIGJvdHRvbTogYm91bmRzLmJvdHRvbSAtIGNvbnRhaW5lckJvdW5kcy50b3AsCiAgICAgICAgaGVpZ2h0OiBib3VuZHMuaGVpZ2h0LAogICAgICAgIGxlZnQ6IGJvdW5kcy5sZWZ0IC0gY29udGFpbmVyQm91bmRzLmxlZnQsCiAgICAgICAgcmlnaHQ6IGJvdW5kcy5yaWdodCAtIGNvbnRhaW5lckJvdW5kcy5sZWZ0LAogICAgICAgIHRvcDogYm91bmRzLnRvcCAtIGNvbnRhaW5lckJvdW5kcy50b3AsCiAgICAgICAgd2lkdGg6IGJvdW5kcy53aWR0aAogICAgICB9OwogICAgfQogIH0sIHsKICAgIGtleTogImdldENvbnRlbnRzIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb250ZW50cygpIHsKICAgICAgdmFyIGluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwOwogICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0aGlzLmdldExlbmd0aCgpIC0gaW5kZXg7CiAgICAgIHZhciBfb3ZlcmxvYWQ3ID0gb3ZlcmxvYWQoaW5kZXgsIGxlbmd0aCk7CiAgICAgIHZhciBfb3ZlcmxvYWQ4ID0gX3NsaWNlZFRvQXJyYXkoX292ZXJsb2FkNywgMik7CiAgICAgIGluZGV4ID0gX292ZXJsb2FkOFswXTsKICAgICAgbGVuZ3RoID0gX292ZXJsb2FkOFsxXTsKICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmdldENvbnRlbnRzKGluZGV4LCBsZW5ndGgpOwogICAgfQogIH0sIHsKICAgIGtleTogImdldEZvcm1hdCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Rm9ybWF0KCkgewogICAgICB2YXIgaW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMuZ2V0U2VsZWN0aW9uKHRydWUpOwogICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwOwogICAgICBpZiAodHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJykgewogICAgICAgIHJldHVybiB0aGlzLmVkaXRvci5nZXRGb3JtYXQoaW5kZXgsIGxlbmd0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmdldEZvcm1hdChpbmRleC5pbmRleCwgaW5kZXgubGVuZ3RoKTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJnZXRJbmRleCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SW5kZXgoYmxvdCkgewogICAgICByZXR1cm4gYmxvdC5vZmZzZXQodGhpcy5zY3JvbGwpOwogICAgfQogIH0sIHsKICAgIGtleTogImdldExlbmd0aCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TGVuZ3RoKCkgewogICAgICByZXR1cm4gdGhpcy5zY3JvbGwubGVuZ3RoKCk7CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0TGVhZiIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TGVhZihpbmRleCkgewogICAgICByZXR1cm4gdGhpcy5zY3JvbGwubGVhZihpbmRleCk7CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0TGluZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TGluZShpbmRleCkgewogICAgICByZXR1cm4gdGhpcy5zY3JvbGwubGluZShpbmRleCk7CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0TGluZXMiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldExpbmVzKCkgewogICAgICB2YXIgaW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDA7CiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IE51bWJlci5NQVhfVkFMVUU7CiAgICAgIGlmICh0eXBlb2YgaW5kZXggIT09ICdudW1iZXInKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsLmxpbmVzKGluZGV4LmluZGV4LCBpbmRleC5sZW5ndGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnNjcm9sbC5saW5lcyhpbmRleCwgbGVuZ3RoKTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJnZXRNb2R1bGUiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1vZHVsZShuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzLnRoZW1lLm1vZHVsZXNbbmFtZV07CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0U2VsZWN0aW9uIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTZWxlY3Rpb24oKSB7CiAgICAgIHZhciBmb2N1cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7CiAgICAgIGlmIChmb2N1cykgdGhpcy5mb2N1cygpOwogICAgICB0aGlzLnVwZGF0ZSgpOyAvLyBNYWtlIHN1cmUgd2UgYWNjZXNzIGdldFJhbmdlIHdpdGggZWRpdG9yIGluIGNvbnNpc3RlbnQgc3RhdGUKICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKClbMF07CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0U2VtYW50aWNIVE1MIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTZW1hbnRpY0hUTUwoKSB7CiAgICAgIHZhciBpbmRleCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMDsKICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkOwogICAgICBpZiAodHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJykgewogICAgICAgIGxlbmd0aCA9IGxlbmd0aCAhPT0gbnVsbCAmJiBsZW5ndGggIT09IHZvaWQgMCA/IGxlbmd0aCA6IHRoaXMuZ2V0TGVuZ3RoKCkgLSBpbmRleDsKICAgICAgfQogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAgIHZhciBfb3ZlcmxvYWQ5ID0gb3ZlcmxvYWQoaW5kZXgsIGxlbmd0aCk7CiAgICAgIHZhciBfb3ZlcmxvYWQwID0gX3NsaWNlZFRvQXJyYXkoX292ZXJsb2FkOSwgMik7CiAgICAgIGluZGV4ID0gX292ZXJsb2FkMFswXTsKICAgICAgbGVuZ3RoID0gX292ZXJsb2FkMFsxXTsKICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmdldEhUTUwoaW5kZXgsIGxlbmd0aCk7CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0VGV4dCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGV4dCgpIHsKICAgICAgdmFyIGluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwOwogICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7CiAgICAgIGlmICh0eXBlb2YgaW5kZXggPT09ICdudW1iZXInKSB7CiAgICAgICAgbGVuZ3RoID0gbGVuZ3RoICE9PSBudWxsICYmIGxlbmd0aCAhPT0gdm9pZCAwID8gbGVuZ3RoIDogdGhpcy5nZXRMZW5ndGgoKSAtIGluZGV4OwogICAgICB9CiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IKICAgICAgdmFyIF9vdmVybG9hZDEgPSBvdmVybG9hZChpbmRleCwgbGVuZ3RoKTsKICAgICAgdmFyIF9vdmVybG9hZDEwID0gX3NsaWNlZFRvQXJyYXkoX292ZXJsb2FkMSwgMik7CiAgICAgIGluZGV4ID0gX292ZXJsb2FkMTBbMF07CiAgICAgIGxlbmd0aCA9IF9vdmVybG9hZDEwWzFdOwogICAgICByZXR1cm4gdGhpcy5lZGl0b3IuZ2V0VGV4dChpbmRleCwgbGVuZ3RoKTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJoYXNGb2N1cyIsCiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzRm9jdXMoKSB7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5oYXNGb2N1cygpOwogICAgfQogIH0sIHsKICAgIGtleTogImluc2VydEVtYmVkIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRFbWJlZChpbmRleCwgZW1iZWQsIHZhbHVlKSB7CiAgICAgIHZhciBfdGhpczYgPSB0aGlzOwogICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBRdWlsbC5zb3VyY2VzLkFQSTsKICAgICAgcmV0dXJuIG1vZGlmeS5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX3RoaXM2LmVkaXRvci5pbnNlcnRFbWJlZChpbmRleCwgZW1iZWQsIHZhbHVlKTsKICAgICAgfSwgc291cmNlLCBpbmRleCk7CiAgICB9CiAgfSwgewogICAga2V5OiAiaW5zZXJ0VGV4dCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0VGV4dChpbmRleCwgdGV4dCwgbmFtZSwgdmFsdWUsIHNvdXJjZSkgewogICAgICB2YXIgX3RoaXM3ID0gdGhpczsKICAgICAgdmFyIGZvcm1hdHM7CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICB2YXIgX292ZXJsb2FkMTEgPSBvdmVybG9hZChpbmRleCwgMCwgbmFtZSwgdmFsdWUsIHNvdXJjZSk7CiAgICAgIHZhciBfb3ZlcmxvYWQxMiA9IF9zbGljZWRUb0FycmF5KF9vdmVybG9hZDExLCA0KTsKICAgICAgaW5kZXggPSBfb3ZlcmxvYWQxMlswXTsKICAgICAgZm9ybWF0cyA9IF9vdmVybG9hZDEyWzJdOwogICAgICBzb3VyY2UgPSBfb3ZlcmxvYWQxMlszXTsKICAgICAgcmV0dXJuIG1vZGlmeS5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX3RoaXM3LmVkaXRvci5pbnNlcnRUZXh0KGluZGV4LCB0ZXh0LCBmb3JtYXRzKTsKICAgICAgfSwgc291cmNlLCBpbmRleCwgdGV4dC5sZW5ndGgpOwogICAgfQogIH0sIHsKICAgIGtleTogImlzRW5hYmxlZCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gaXNFbmFibGVkKCkgewogICAgICByZXR1cm4gdGhpcy5zY3JvbGwuaXNFbmFibGVkKCk7CiAgICB9CiAgfSwgewogICAga2V5OiAib2ZmIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYoKSB7CiAgICAgIHZhciBfdGhpcyRlbWl0dGVyOwogICAgICByZXR1cm4gKF90aGlzJGVtaXR0ZXIgPSB0aGlzLmVtaXR0ZXIpLm9mZi5hcHBseShfdGhpcyRlbWl0dGVyLCBhcmd1bWVudHMpOwogICAgfQogIH0sIHsKICAgIGtleTogIm9uIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBvbigpIHsKICAgICAgdmFyIF90aGlzJGVtaXR0ZXIyOwogICAgICByZXR1cm4gKF90aGlzJGVtaXR0ZXIyID0gdGhpcy5lbWl0dGVyKS5vbi5hcHBseShfdGhpcyRlbWl0dGVyMiwgYXJndW1lbnRzKTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJvbmNlIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBvbmNlKCkgewogICAgICB2YXIgX3RoaXMkZW1pdHRlcjM7CiAgICAgIHJldHVybiAoX3RoaXMkZW1pdHRlcjMgPSB0aGlzLmVtaXR0ZXIpLm9uY2UuYXBwbHkoX3RoaXMkZW1pdHRlcjMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfSwgewogICAga2V5OiAicmVtb3ZlRm9ybWF0IiwKICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVGb3JtYXQoaW5kZXgsIGxlbmd0aCwgc291cmNlKSB7CiAgICAgIHZhciBfdGhpczggPSB0aGlzOwogICAgICB2YXIgX292ZXJsb2FkMTMgPSBvdmVybG9hZChpbmRleCwgbGVuZ3RoLCBzb3VyY2UpOwogICAgICB2YXIgX292ZXJsb2FkMTQgPSBfc2xpY2VkVG9BcnJheShfb3ZlcmxvYWQxMywgNCk7CiAgICAgIGluZGV4ID0gX292ZXJsb2FkMTRbMF07CiAgICAgIGxlbmd0aCA9IF9vdmVybG9hZDE0WzFdOwogICAgICBzb3VyY2UgPSBfb3ZlcmxvYWQxNFszXTsKICAgICAgcmV0dXJuIG1vZGlmeS5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX3RoaXM4LmVkaXRvci5yZW1vdmVGb3JtYXQoaW5kZXgsIGxlbmd0aCk7CiAgICAgIH0sIHNvdXJjZSwgaW5kZXgpOwogICAgfQogIH0sIHsKICAgIGtleTogInNjcm9sbFJlY3RJbnRvVmlldyIsCiAgICB2YWx1ZTogZnVuY3Rpb24gc2Nyb2xsUmVjdEludG9WaWV3KHJlY3QpIHsKICAgICAgX3Njcm9sbFJlY3RJbnRvVmlldyh0aGlzLnJvb3QsIHJlY3QpOwogICAgfQoKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQgVXNlIFF1aWxsI3Njcm9sbFNlbGVjdGlvbkludG9WaWV3KCkgaW5zdGVhZC4KICAgICAqLwogIH0sIHsKICAgIGtleTogInNjcm9sbEludG9WaWV3IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBzY3JvbGxJbnRvVmlldygpIHsKICAgICAgY29uc29sZS53YXJuKCdRdWlsbCNzY3JvbGxJbnRvVmlldygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUuIFBsZWFzZSB1c2UgUXVpbGwjc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXcoKSBpbnN0ZWFkLicpOwogICAgICB0aGlzLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTY3JvbGwgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGludG8gdGhlIHZpc2libGUgYXJlYS4KICAgICAqIElmIHRoZSBzZWxlY3Rpb24gaXMgYWxyZWFkeSB2aXNpYmxlLCBubyBzY3JvbGxpbmcgd2lsbCBvY2N1ci4KICAgICAqLwogIH0sIHsKICAgIGtleTogInNjcm9sbFNlbGVjdGlvbkludG9WaWV3IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBzY3JvbGxTZWxlY3Rpb25JbnRvVmlldygpIHsKICAgICAgdmFyIHJhbmdlID0gdGhpcy5zZWxlY3Rpb24ubGFzdFJhbmdlOwogICAgICB2YXIgYm91bmRzID0gcmFuZ2UgJiYgdGhpcy5zZWxlY3Rpb24uZ2V0Qm91bmRzKHJhbmdlLmluZGV4LCByYW5nZS5sZW5ndGgpOwogICAgICBpZiAoYm91bmRzKSB7CiAgICAgICAgdGhpcy5zY3JvbGxSZWN0SW50b1ZpZXcoYm91bmRzKTsKICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogInNldENvbnRlbnRzIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDb250ZW50cyhkZWx0YSkgewogICAgICB2YXIgX3RoaXM5ID0gdGhpczsKICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogRW1pdHRlci5zb3VyY2VzLkFQSTsKICAgICAgcmV0dXJuIG1vZGlmeS5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICBkZWx0YSA9IG5ldyBEZWx0YShkZWx0YSk7CiAgICAgICAgdmFyIGxlbmd0aCA9IF90aGlzOS5nZXRMZW5ndGgoKTsKICAgICAgICAvLyBRdWlsbCB3aWxsIHNldCBlbXB0eSBlZGl0b3IgdG8gXG4KICAgICAgICB2YXIgZGVsZXRlMSA9IF90aGlzOS5lZGl0b3IuZGVsZXRlVGV4dCgwLCBsZW5ndGgpOwogICAgICAgIHZhciBhcHBsaWVkID0gX3RoaXM5LmVkaXRvci5pbnNlcnRDb250ZW50cygwLCBkZWx0YSk7CiAgICAgICAgLy8gUmVtb3ZlIGV4dHJhIFxuIGZyb20gZW1wdHkgZWRpdG9yIGluaXRpYWxpemF0aW9uCiAgICAgICAgdmFyIGRlbGV0ZTIgPSBfdGhpczkuZWRpdG9yLmRlbGV0ZVRleHQoX3RoaXM5LmdldExlbmd0aCgpIC0gMSwgMSk7CiAgICAgICAgcmV0dXJuIGRlbGV0ZTEuY29tcG9zZShhcHBsaWVkKS5jb21wb3NlKGRlbGV0ZTIpOwogICAgICB9LCBzb3VyY2UpOwogICAgfQogIH0sIHsKICAgIGtleTogInNldFNlbGVjdGlvbiIsCiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGluZGV4LCBsZW5ndGgsIHNvdXJjZSkgewogICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewogICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8yMjYwOQogICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKG51bGwsIGxlbmd0aCB8fCBRdWlsbC5zb3VyY2VzLkFQSSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICAgIHZhciBfb3ZlcmxvYWQxNSA9IG92ZXJsb2FkKGluZGV4LCBsZW5ndGgsIHNvdXJjZSk7CiAgICAgICAgdmFyIF9vdmVybG9hZDE2ID0gX3NsaWNlZFRvQXJyYXkoX292ZXJsb2FkMTUsIDQpOwogICAgICAgIGluZGV4ID0gX292ZXJsb2FkMTZbMF07CiAgICAgICAgbGVuZ3RoID0gX292ZXJsb2FkMTZbMV07CiAgICAgICAgc291cmNlID0gX292ZXJsb2FkMTZbM107CiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2UobmV3IFJhbmdlKE1hdGgubWF4KDAsIGluZGV4KSwgbGVuZ3RoKSwgc291cmNlKTsKICAgICAgICBpZiAoc291cmNlICE9PSBFbWl0dGVyLnNvdXJjZXMuU0lMRU5UKSB7CiAgICAgICAgICB0aGlzLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSwgewogICAga2V5OiAic2V0VGV4dCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VGV4dCh0ZXh0KSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IEVtaXR0ZXIuc291cmNlcy5BUEk7CiAgICAgIHZhciBkZWx0YSA9IG5ldyBEZWx0YSgpLmluc2VydCh0ZXh0KTsKICAgICAgcmV0dXJuIHRoaXMuc2V0Q29udGVudHMoZGVsdGEsIHNvdXJjZSk7CiAgICB9CiAgfSwgewogICAga2V5OiAidXBkYXRlIiwKICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IEVtaXR0ZXIuc291cmNlcy5VU0VSOwogICAgICB2YXIgY2hhbmdlID0gdGhpcy5zY3JvbGwudXBkYXRlKHNvdXJjZSk7IC8vIFdpbGwgdXBkYXRlIHNlbGVjdGlvbiBiZWZvcmUgc2VsZWN0aW9uLnVwZGF0ZSgpIGRvZXMgaWYgdGV4dCBjaGFuZ2VzCiAgICAgIHRoaXMuc2VsZWN0aW9uLnVwZGF0ZShzb3VyY2UpOwogICAgICAvLyBUT0RPIHRoaXMgaXMgdXN1YWxseSB1bmRlZmluZWQKICAgICAgcmV0dXJuIGNoYW5nZTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJ1cGRhdGVDb250ZW50cyIsCiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlQ29udGVudHMoZGVsdGEpIHsKICAgICAgdmFyIF90aGlzMCA9IHRoaXM7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IEVtaXR0ZXIuc291cmNlcy5BUEk7CiAgICAgIHJldHVybiBtb2RpZnkuY2FsbCh0aGlzLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgZGVsdGEgPSBuZXcgRGVsdGEoZGVsdGEpOwogICAgICAgIHJldHVybiBfdGhpczAuZWRpdG9yLmFwcGx5RGVsdGEoZGVsdGEpOwogICAgICB9LCBzb3VyY2UsIHRydWUpOwogICAgfQogIH1dLCBbewogICAga2V5OiAiZGVidWciLAogICAgdmFsdWU6IGZ1bmN0aW9uIGRlYnVnKGxpbWl0KSB7CiAgICAgIGlmIChsaW1pdCA9PT0gdHJ1ZSkgewogICAgICAgIGxpbWl0ID0gJ2xvZyc7CiAgICAgIH0KICAgICAgbG9nZ2VyLmxldmVsKGxpbWl0KTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJmaW5kIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kKG5vZGUpIHsKICAgICAgdmFyIGJ1YmJsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CiAgICAgIHJldHVybiBpbnN0YW5jZXMuZ2V0KG5vZGUpIHx8IGdsb2JhbFJlZ2lzdHJ5LmZpbmQobm9kZSwgYnViYmxlKTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJpbXBvcnQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIF9pbXBvcnQobmFtZSkgewogICAgICBpZiAodGhpcy5pbXBvcnRzW25hbWVdID09IG51bGwpIHsKICAgICAgICBkZWJ1Zy5lcnJvcigiQ2Fubm90IGltcG9ydCAiLmNvbmNhdChuYW1lLCAiLiBBcmUgeW91IHN1cmUgaXQgd2FzIHJlZ2lzdGVyZWQ/IikpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLmltcG9ydHNbbmFtZV07CiAgICB9CiAgfSwgewogICAga2V5OiAicmVnaXN0ZXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIHJlZ2lzdGVyKCkgewogICAgICB2YXIgX3RoaXMxID0gdGhpczsKICAgICAgaWYgKHR5cGVvZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAwID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzBdKSAhPT0gJ3N0cmluZycpIHsKICAgICAgICB2YXIgdGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzBdOwogICAgICAgIHZhciBvdmVyd3JpdGUgPSAhIShhcmd1bWVudHMubGVuZ3RoIDw9IDEgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV0pOwogICAgICAgIHZhciBuYW1lID0gJ2F0dHJOYW1lJyBpbiB0YXJnZXQgPyB0YXJnZXQuYXR0ck5hbWUgOiB0YXJnZXQuYmxvdE5hbWU7CiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykgewogICAgICAgICAgLy8gU2hvcnRjdXQgZm9yIGZvcm1hdHM6CiAgICAgICAgICAvLyByZWdpc3RlcihCbG90IHwgQXR0cmlidXRvciwgb3ZlcndyaXRlKQogICAgICAgICAgdGhpcy5yZWdpc3RlcigiZm9ybWF0cy8iLmNvbmNhdChuYW1lKSwgdGFyZ2V0LCBvdmVyd3JpdGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBPYmplY3Qua2V5cyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICBfdGhpczEucmVnaXN0ZXIoa2V5LCB0YXJnZXRba2V5XSwgb3ZlcndyaXRlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1swXTsKICAgICAgICB2YXIgX3RhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXTsKICAgICAgICB2YXIgX292ZXJ3cml0ZSA9ICEhKGFyZ3VtZW50cy5sZW5ndGggPD0gMiA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1syXSk7CiAgICAgICAgaWYgKHRoaXMuaW1wb3J0c1twYXRoXSAhPSBudWxsICYmICFfb3ZlcndyaXRlKSB7CiAgICAgICAgICBkZWJ1Zy53YXJuKCJPdmVyd3JpdGluZyAiLmNvbmNhdChwYXRoLCAiIHdpdGgiKSwgX3RhcmdldCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuaW1wb3J0c1twYXRoXSA9IF90YXJnZXQ7CiAgICAgICAgaWYgKChwYXRoLnN0YXJ0c1dpdGgoJ2Jsb3RzLycpIHx8IHBhdGguc3RhcnRzV2l0aCgnZm9ybWF0cy8nKSkgJiYgX3RhcmdldCAmJiB0eXBlb2YgX3RhcmdldCAhPT0gJ2Jvb2xlYW4nICYmIF90YXJnZXQuYmxvdE5hbWUgIT09ICdhYnN0cmFjdCcpIHsKICAgICAgICAgIGdsb2JhbFJlZ2lzdHJ5LnJlZ2lzdGVyKF90YXJnZXQpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIF90YXJnZXQucmVnaXN0ZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIF90YXJnZXQucmVnaXN0ZXIoZ2xvYmFsUmVnaXN0cnkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH1dKTsKfSgpOwpfZGVmaW5lUHJvcGVydHkoUXVpbGwsICJERUZBVUxUUyIsIHsKICBib3VuZHM6IG51bGwsCiAgbW9kdWxlczogewogICAgY2xpcGJvYXJkOiB0cnVlLAogICAga2V5Ym9hcmQ6IHRydWUsCiAgICBoaXN0b3J5OiB0cnVlLAogICAgdXBsb2FkZXI6IHRydWUKICB9LAogIHBsYWNlaG9sZGVyOiAnJywKICByZWFkT25seTogZmFsc2UsCiAgcmVnaXN0cnk6IGdsb2JhbFJlZ2lzdHJ5LAogIHRoZW1lOiAnZGVmYXVsdCcKfSk7Cl9kZWZpbmVQcm9wZXJ0eShRdWlsbCwgImV2ZW50cyIsIEVtaXR0ZXIuZXZlbnRzKTsKX2RlZmluZVByb3BlcnR5KFF1aWxsLCAic291cmNlcyIsIEVtaXR0ZXIuc291cmNlcyk7Cl9kZWZpbmVQcm9wZXJ0eShRdWlsbCwgInZlcnNpb24iLCB0eXBlb2YgIjIuMC4yIiA9PT0gJ3VuZGVmaW5lZCcgPyAnZGV2JyA6ICIyLjAuMiIpOwpfZGVmaW5lUHJvcGVydHkoUXVpbGwsICJpbXBvcnRzIiwgewogIGRlbHRhOiBEZWx0YSwKICBwYXJjaG1lbnQ6IFBhcmNobWVudCwKICAnY29yZS9tb2R1bGUnOiBNb2R1bGUsCiAgJ2NvcmUvdGhlbWUnOiBUaGVtZQp9KTsKZnVuY3Rpb24gcmVzb2x2ZVNlbGVjdG9yKHNlbGVjdG9yKSB7CiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gJ3N0cmluZycgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSA6IHNlbGVjdG9yOwp9CmZ1bmN0aW9uIGV4cGFuZE1vZHVsZUNvbmZpZyhjb25maWcpIHsKICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29uZmlnICE9PSBudWxsICYmIGNvbmZpZyAhPT0gdm9pZCAwID8gY29uZmlnIDoge30pLnJlZHVjZShmdW5jdGlvbiAoZXhwYW5kZWQsIF9yZWYpIHsKICAgIHZhciBfcmVmMyA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLAogICAgICBrZXkgPSBfcmVmM1swXSwKICAgICAgdmFsdWUgPSBfcmVmM1sxXTsKICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGV4cGFuZGVkKSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwga2V5LCB2YWx1ZSA9PT0gdHJ1ZSA/IHt9IDogdmFsdWUpKTsKICB9LCB7fSk7Cn0KZnVuY3Rpb24gb21pdFVuZGVmaW5lZFZhbHVlc0Zyb21PcHRpb25zKG9iaikgewogIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5maWx0ZXIoZnVuY3Rpb24gKGVudHJ5KSB7CiAgICByZXR1cm4gZW50cnlbMV0gIT09IHVuZGVmaW5lZDsKICB9KSk7Cn0KZnVuY3Rpb24gZXhwYW5kQ29uZmlnKGNvbnRhaW5lck9yU2VsZWN0b3IsIG9wdGlvbnMpIHsKICB2YXIgY29udGFpbmVyID0gcmVzb2x2ZVNlbGVjdG9yKGNvbnRhaW5lck9yU2VsZWN0b3IpOwogIGlmICghY29udGFpbmVyKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUXVpbGwgY29udGFpbmVyJyk7CiAgfQogIHZhciBzaG91bGRVc2VEZWZhdWx0VGhlbWUgPSAhb3B0aW9ucy50aGVtZSB8fCBvcHRpb25zLnRoZW1lID09PSBRdWlsbC5ERUZBVUxUUy50aGVtZTsKICB2YXIgdGhlbWUgPSBzaG91bGRVc2VEZWZhdWx0VGhlbWUgPyBUaGVtZSA6IFF1aWxsLmltcG9ydCgidGhlbWVzLyIuY29uY2F0KG9wdGlvbnMudGhlbWUpKTsKICBpZiAoIXRoZW1lKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdGhlbWUgIi5jb25jYXQob3B0aW9ucy50aGVtZSwgIi4gRGlkIHlvdSByZWdpc3RlciBpdD8iKSk7CiAgfQogIHZhciBfUXVpbGwkREVGQVVMVFMgPSBRdWlsbC5ERUZBVUxUUywKICAgIHF1aWxsTW9kdWxlRGVmYXVsdHMgPSBfUXVpbGwkREVGQVVMVFMubW9kdWxlcywKICAgIHF1aWxsRGVmYXVsdHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX1F1aWxsJERFRkFVTFRTLCBfZXhjbHVkZWQpOwogIHZhciBfdGhlbWUkREVGQVVMVFMgPSB0aGVtZS5ERUZBVUxUUywKICAgIHRoZW1lTW9kdWxlRGVmYXVsdHMgPSBfdGhlbWUkREVGQVVMVFMubW9kdWxlcywKICAgIHRoZW1lRGVmYXVsdHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3RoZW1lJERFRkFVTFRTLCBfZXhjbHVkZWQyKTsKICB2YXIgdXNlck1vZHVsZU9wdGlvbnMgPSBleHBhbmRNb2R1bGVDb25maWcob3B0aW9ucy5tb2R1bGVzKTsKICAvLyBTcGVjaWFsIGNhc2UgdG9vbGJhciBzaG9ydGhhbmQKICBpZiAodXNlck1vZHVsZU9wdGlvbnMgIT0gbnVsbCAmJiB1c2VyTW9kdWxlT3B0aW9ucy50b29sYmFyICYmIHVzZXJNb2R1bGVPcHRpb25zLnRvb2xiYXIuY29uc3RydWN0b3IgIT09IE9iamVjdCkgewogICAgdXNlck1vZHVsZU9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHVzZXJNb2R1bGVPcHRpb25zKSwge30sIHsKICAgICAgdG9vbGJhcjogewogICAgICAgIGNvbnRhaW5lcjogdXNlck1vZHVsZU9wdGlvbnMudG9vbGJhcgogICAgICB9CiAgICB9KTsKICB9CiAgdmFyIG1vZHVsZXMgPSBtZXJnZSh7fSwgZXhwYW5kTW9kdWxlQ29uZmlnKHF1aWxsTW9kdWxlRGVmYXVsdHMpLCBleHBhbmRNb2R1bGVDb25maWcodGhlbWVNb2R1bGVEZWZhdWx0cyksIHVzZXJNb2R1bGVPcHRpb25zKTsKICB2YXIgY29uZmlnID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHF1aWxsRGVmYXVsdHMpLCBvbWl0VW5kZWZpbmVkVmFsdWVzRnJvbU9wdGlvbnModGhlbWVEZWZhdWx0cykpLCBvbWl0VW5kZWZpbmVkVmFsdWVzRnJvbU9wdGlvbnMob3B0aW9ucykpOwogIHZhciByZWdpc3RyeSA9IG9wdGlvbnMucmVnaXN0cnk7CiAgaWYgKHJlZ2lzdHJ5KSB7CiAgICBpZiAob3B0aW9ucy5mb3JtYXRzKSB7CiAgICAgIGRlYnVnLndhcm4oJ0lnbm9yaW5nICJmb3JtYXRzIiBvcHRpb24gYmVjYXVzZSAicmVnaXN0cnkiIGlzIHNwZWNpZmllZCcpOwogICAgfQogIH0gZWxzZSB7CiAgICByZWdpc3RyeSA9IG9wdGlvbnMuZm9ybWF0cyA/IGNyZWF0ZVJlZ2lzdHJ5V2l0aEZvcm1hdHMob3B0aW9ucy5mb3JtYXRzLCBjb25maWcucmVnaXN0cnksIGRlYnVnKSA6IGNvbmZpZy5yZWdpc3RyeTsKICB9CiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY29uZmlnKSwge30sIHsKICAgIHJlZ2lzdHJ5OiByZWdpc3RyeSwKICAgIGNvbnRhaW5lcjogY29udGFpbmVyLAogICAgdGhlbWU6IHRoZW1lLAogICAgbW9kdWxlczogT2JqZWN0LmVudHJpZXMobW9kdWxlcykucmVkdWNlKGZ1bmN0aW9uIChtb2R1bGVzV2l0aERlZmF1bHRzLCBfcmVmMikgewogICAgICB2YXIgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMiwgMiksCiAgICAgICAgbmFtZSA9IF9yZWY0WzBdLAogICAgICAgIHZhbHVlID0gX3JlZjRbMV07CiAgICAgIGlmICghdmFsdWUpIHJldHVybiBtb2R1bGVzV2l0aERlZmF1bHRzOwogICAgICB2YXIgbW9kdWxlQ2xhc3MgPSBRdWlsbC5pbXBvcnQoIm1vZHVsZXMvIi5jb25jYXQobmFtZSkpOwogICAgICBpZiAobW9kdWxlQ2xhc3MgPT0gbnVsbCkgewogICAgICAgIGRlYnVnLmVycm9yKCJDYW5ub3QgbG9hZCAiLmNvbmNhdChuYW1lLCAiIG1vZHVsZS4gQXJlIHlvdSBzdXJlIHlvdSByZWdpc3RlcmVkIGl0PyIpKTsKICAgICAgICByZXR1cm4gbW9kdWxlc1dpdGhEZWZhdWx0czsKICAgICAgfQogICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtb2R1bGVzV2l0aERlZmF1bHRzKSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwgbmFtZSwgbWVyZ2Uoe30sIG1vZHVsZUNsYXNzLkRFRkFVTFRTIHx8IHt9LCB2YWx1ZSkpKTsKICAgIH0sIHt9KSwKICAgIGJvdW5kczogcmVzb2x2ZVNlbGVjdG9yKGNvbmZpZy5ib3VuZHMpCiAgfSk7Cn0KCi8vIEhhbmRsZSBzZWxlY3Rpb24gcHJlc2VydmF0aW9uIGFuZCBURVhUX0NIQU5HRSBlbWlzc2lvbgovLyBjb21tb24gdG8gbW9kaWZpY2F0aW9uIEFQSXMKZnVuY3Rpb24gbW9kaWZ5KG1vZGlmaWVyLCBzb3VyY2UsIGluZGV4LCBzaGlmdCkgewogIGlmICghdGhpcy5pc0VuYWJsZWQoKSAmJiBzb3VyY2UgPT09IEVtaXR0ZXIuc291cmNlcy5VU0VSICYmICF0aGlzLmFsbG93UmVhZE9ubHlFZGl0cykgewogICAgcmV0dXJuIG5ldyBEZWx0YSgpOwogIH0KICB2YXIgcmFuZ2UgPSBpbmRleCA9PSBudWxsID8gbnVsbCA6IHRoaXMuZ2V0U2VsZWN0aW9uKCk7CiAgdmFyIG9sZERlbHRhID0gdGhpcy5lZGl0b3IuZGVsdGE7CiAgdmFyIGNoYW5nZSA9IG1vZGlmaWVyKCk7CiAgaWYgKHJhbmdlICE9IG51bGwpIHsKICAgIGlmIChpbmRleCA9PT0gdHJ1ZSkgewogICAgICBpbmRleCA9IHJhbmdlLmluZGV4OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nCiAgICB9CiAgICBpZiAoc2hpZnQgPT0gbnVsbCkgewogICAgICByYW5nZSA9IHNoaWZ0UmFuZ2UocmFuZ2UsIGNoYW5nZSwgc291cmNlKTsKICAgIH0gZWxzZSBpZiAoc2hpZnQgIT09IDApIHsKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpbmRleCBzaG91bGQgYWx3YXlzIGJlIG51bWJlcgogICAgICByYW5nZSA9IHNoaWZ0UmFuZ2UocmFuZ2UsIGluZGV4LCBzaGlmdCwgc291cmNlKTsKICAgIH0KICAgIHRoaXMuc2V0U2VsZWN0aW9uKHJhbmdlLCBFbWl0dGVyLnNvdXJjZXMuU0lMRU5UKTsKICB9CiAgaWYgKGNoYW5nZS5sZW5ndGgoKSA+IDApIHsKICAgIHZhciBfdGhpcyRlbWl0dGVyNDsKICAgIHZhciBhcmdzID0gW0VtaXR0ZXIuZXZlbnRzLlRFWFRfQ0hBTkdFLCBjaGFuZ2UsIG9sZERlbHRhLCBzb3VyY2VdOwogICAgKF90aGlzJGVtaXR0ZXI0ID0gdGhpcy5lbWl0dGVyKS5lbWl0LmFwcGx5KF90aGlzJGVtaXR0ZXI0LCBbRW1pdHRlci5ldmVudHMuRURJVE9SX0NIQU5HRV0uY29uY2F0KGFyZ3MpKTsKICAgIGlmIChzb3VyY2UgIT09IEVtaXR0ZXIuc291cmNlcy5TSUxFTlQpIHsKICAgICAgdmFyIF90aGlzJGVtaXR0ZXI1OwogICAgICAoX3RoaXMkZW1pdHRlcjUgPSB0aGlzLmVtaXR0ZXIpLmVtaXQuYXBwbHkoX3RoaXMkZW1pdHRlcjUsIGFyZ3MpOwogICAgfQogIH0KICByZXR1cm4gY2hhbmdlOwp9CmZ1bmN0aW9uIG92ZXJsb2FkKGluZGV4LCBsZW5ndGgsIG5hbWUsIHZhbHVlLCBzb3VyY2UpIHsKICB2YXIgZm9ybWF0cyA9IHt9OwogIC8vIEB0cy1leHBlY3QtZXJyb3IKICBpZiAodHlwZW9mIGluZGV4LmluZGV4ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgaW5kZXgubGVuZ3RoID09PSAnbnVtYmVyJykgewogICAgLy8gQWxsb3cgZm9yIHRocm93YXdheSBlbmQgKHVzZWQgYnkgaW5zZXJ0VGV4dC9pbnNlcnRFbWJlZCkKICAgIGlmICh0eXBlb2YgbGVuZ3RoICE9PSAnbnVtYmVyJykgewogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAgIHNvdXJjZSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IG5hbWU7CiAgICAgIG5hbWUgPSBsZW5ndGg7CiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IKICAgICAgbGVuZ3RoID0gaW5kZXgubGVuZ3RoOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nCiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IKICAgICAgaW5kZXggPSBpbmRleC5pbmRleDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZwogICAgfSBlbHNlIHsKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICBsZW5ndGggPSBpbmRleC5sZW5ndGg7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmcKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICBpbmRleCA9IGluZGV4LmluZGV4OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nCiAgICB9CiAgfSBlbHNlIGlmICh0eXBlb2YgbGVuZ3RoICE9PSAnbnVtYmVyJykgewogICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgc291cmNlID0gdmFsdWU7CiAgICB2YWx1ZSA9IG5hbWU7CiAgICBuYW1lID0gbGVuZ3RoOwogICAgbGVuZ3RoID0gMDsKICB9CiAgLy8gSGFuZGxlIGZvcm1hdCBiZWluZyBvYmplY3QsIHR3byBmb3JtYXQgbmFtZS92YWx1ZSBzdHJpbmdzIG9yIGV4Y2x1ZGVkCiAgaWYgKF90eXBlb2YobmFtZSkgPT09ICdvYmplY3QnKSB7CiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeCBtZSBsYXRlcgogICAgZm9ybWF0cyA9IG5hbWU7CiAgICAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICBzb3VyY2UgPSB2YWx1ZTsKICB9IGVsc2UgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykgewogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgZm9ybWF0c1tuYW1lXSA9IHZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICBzb3VyY2UgPSBuYW1lOwogICAgfQogIH0KICAvLyBIYW5kbGUgb3B0aW9uYWwgc291cmNlCiAgc291cmNlID0gc291cmNlIHx8IEVtaXR0ZXIuc291cmNlcy5BUEk7CiAgLy8gQHRzLWV4cGVjdC1lcnJvcgogIHJldHVybiBbaW5kZXgsIGxlbmd0aCwgZm9ybWF0cywgc291cmNlXTsKfQpmdW5jdGlvbiBzaGlmdFJhbmdlKHJhbmdlLCBpbmRleCwgbGVuZ3RoT3JTb3VyY2UsIHNvdXJjZSkgewogIHZhciBsZW5ndGggPSB0eXBlb2YgbGVuZ3RoT3JTb3VyY2UgPT09ICdudW1iZXInID8gbGVuZ3RoT3JTb3VyY2UgOiAwOwogIGlmIChyYW5nZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICB2YXIgc3RhcnQ7CiAgdmFyIGVuZDsKICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRPRE86IGFkZCBhIGJldHRlciB0eXBlIGd1YXJkIGFyb3VuZCBgaW5kZXhgCiAgaWYgKGluZGV4ICYmIHR5cGVvZiBpbmRleC50cmFuc2Zvcm1Qb3NpdGlvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgdmFyIF9tYXAgPSBbcmFuZ2UuaW5kZXgsIHJhbmdlLmluZGV4ICsgcmFuZ2UubGVuZ3RoXS5tYXAoZnVuY3Rpb24gKHBvcykgewogICAgICByZXR1cm4gKAogICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gVE9ETzogYWRkIGEgYmV0dGVyIHR5cGUgZ3VhcmQgYXJvdW5kIGBpbmRleGAKICAgICAgICBpbmRleC50cmFuc2Zvcm1Qb3NpdGlvbihwb3MsIHNvdXJjZSAhPT0gRW1pdHRlci5zb3VyY2VzLlVTRVIpCiAgICAgICk7CiAgICB9KTsKICAgIHZhciBfbWFwMiA9IF9zbGljZWRUb0FycmF5KF9tYXAsIDIpOwogICAgc3RhcnQgPSBfbWFwMlswXTsKICAgIGVuZCA9IF9tYXAyWzFdOwogIH0gZWxzZSB7CiAgICB2YXIgX21hcDMgPSBbcmFuZ2UuaW5kZXgsIHJhbmdlLmluZGV4ICsgcmFuZ2UubGVuZ3RoXS5tYXAoZnVuY3Rpb24gKHBvcykgewogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRPRE86IGFkZCBhIGJldHRlciB0eXBlIGd1YXJkIGFyb3VuZCBgaW5kZXhgCiAgICAgIGlmIChwb3MgPCBpbmRleCB8fCBwb3MgPT09IGluZGV4ICYmIHNvdXJjZSA9PT0gRW1pdHRlci5zb3VyY2VzLlVTRVIpIHJldHVybiBwb3M7CiAgICAgIGlmIChsZW5ndGggPj0gMCkgewogICAgICAgIHJldHVybiBwb3MgKyBsZW5ndGg7CiAgICAgIH0KICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUT0RPOiBhZGQgYSBiZXR0ZXIgdHlwZSBndWFyZCBhcm91bmQgYGluZGV4YAogICAgICByZXR1cm4gTWF0aC5tYXgoaW5kZXgsIHBvcyArIGxlbmd0aCk7CiAgICB9KTsKICAgIHZhciBfbWFwNCA9IF9zbGljZWRUb0FycmF5KF9tYXAzLCAyKTsKICAgIHN0YXJ0ID0gX21hcDRbMF07CiAgICBlbmQgPSBfbWFwNFsxXTsKICB9CiAgcmV0dXJuIG5ldyBSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQpOwp9CmV4cG9ydCB7IFBhcmNobWVudCwgUmFuZ2UgfTsKZXhwb3J0IHsgZ2xvYmFsUmVnaXN0cnksIGV4cGFuZENvbmZpZywgb3ZlcmxvYWQsIFF1aWxsIGFzIGRlZmF1bHQgfTs="},null]}