{"remainingRequest":"/home/camus/work/lotus/node_modules/thread-loader/dist/cjs.js!/home/camus/work/lotus/node_modules/babel-loader/lib/index.js!/home/camus/work/lotus/node_modules/ts-loader/index.js??ref--15-3!/home/camus/work/lotus/node_modules/eslint-loader/index.js??ref--14-0!/home/camus/work/lotus/inc/staffSvg/organizeTokens.ts","dependencies":[{"path":"/home/camus/work/lotus/inc/staffSvg/organizeTokens.ts","mtime":1732184473675},{"path":"/home/camus/work/lotus/node_modules/cache-loader/dist/cjs.js","mtime":1719800821084},{"path":"/home/camus/work/lotus/node_modules/thread-loader/dist/cjs.js","mtime":1719800821095},{"path":"/home/camus/work/lotus/node_modules/babel-loader/lib/index.js","mtime":1727163989637},{"path":"/home/camus/work/lotus/node_modules/ts-loader/index.js","mtime":1726221607070},{"path":"/home/camus/work/lotus/node_modules/eslint-loader/index.js","mtime":1719800837044}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IHsgUE9TX1BSRUNJU0lPTiwgY29uc3RhbnRzIH0gZnJvbSAiLi91dGlscyI7CjsKY2xhc3MgTGluZVN0YWNrIHsKICBjb25zdHJ1Y3Rvcihyb290KSB7CiAgICB0aGlzLnRyYW5zbGF0aW9uID0gewogICAgICB4OiAwLAogICAgICB5OiAwCiAgICB9OwogICAgdGhpcy5saW5lcyA9IFtyb290XTsKICB9CiAgLy8gdGhlIGJvdHRvbSBsaW5lCiAgZ2V0IHRpcCgpIHsKICAgIHJldHVybiB0aGlzLmxpbmVzW3RoaXMubGluZXMubGVuZ3RoIC0gMV07CiAgfQogIGdldCByZWN0KCkgewogICAgaWYgKCF0aGlzLl9yZWN0KSB7CiAgICAgIGNvbnN0IHlzID0gdGhpcy5saW5lcy5tYXAodG9rZW4gPT4gdG9rZW4ueSArIHRva2VuLmhlaWdodCAvIDIpOwogICAgICB0aGlzLl9yZWN0ID0gewogICAgICAgIGxlZnQ6IE1hdGgubWluKC4uLnRoaXMubGluZXMubWFwKHRva2VuID0+IHRva2VuLngpKSwKICAgICAgICByaWdodDogTWF0aC5tYXgoLi4udGhpcy5saW5lcy5tYXAodG9rZW4gPT4gdG9rZW4ueCArIHRva2VuLndpZHRoKSksCiAgICAgICAgdG9wOiB5c1swXSwKICAgICAgICBib3R0b206IHlzW3lzLmxlbmd0aCAtIDFdCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gdGhpcy5fcmVjdDsKICB9CiAgdHJ5QXBwZW5kKGxpbmUpIHsKICAgIGlmIChsaW5lLnJ5IC0gdGhpcy50aXAucnkgPT09IDEgJiYgTWF0aC5hYnMobGluZS54IC0gdGhpcy50aXAueCkgPCAyKSB7CiAgICAgIHRoaXMubGluZXMucHVzaChsaW5lKTsKICAgICAgdGhpcy5fcmVjdCA9IG51bGw7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICB0cnlBdHRhY2hDb25uZWN0aW9uKGNvbm5lY3Rpb24sIGluZGV4KSB7CiAgICBjb25zdCB7CiAgICAgIHRvcCwKICAgICAgYm90dG9tCiAgICB9ID0gdGhpcy5yZWN0OwogICAgLy9jb25zb2xlLmxvZygiY29ubmVjdGlvbjoiLCBjb25uZWN0aW9uLnkgKyBjb25uZWN0aW9uLmhlaWdodCwgdG9wIC0gMS4yKTsKICAgIGNvbnN0IHkgPSBjb25uZWN0aW9uLnkgKyB0aGlzLnRyYW5zbGF0aW9uLnk7CiAgICBpZiAoYm90dG9tICsgMS42ID4geSAmJiB0b3AgLSAxLjYgPCB5ICsgY29ubmVjdGlvbi5oZWlnaHQpIHsKICAgICAgdGhpcy5zeXN0ZW1JbmRleCA9IGluZGV4OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgdHJ5QXR0YWNoU3RhZmYoeSwgaW5kZXgpIHsKICAgIGNvbnN0IHsKICAgICAgdG9wLAogICAgICBib3R0b20KICAgIH0gPSB0aGlzLnJlY3Q7CiAgICB5ICs9IHRoaXMudHJhbnNsYXRpb24ueTsKICAgIGlmIChib3R0b20gKyAzLjIgPiB5ICYmIHRvcCAtIDMuMiA8IHkpIHsKICAgICAgdGhpcy5zdGFmZkluZGV4ID0gaW5kZXg7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb250YWlucyh0b2tlbikgewogICAgY29uc3QgewogICAgICBsZWZ0LAogICAgICByaWdodCwKICAgICAgdG9wLAogICAgICBib3R0b20KICAgIH0gPSB0aGlzLnJlY3Q7CiAgICBjb25zdCB4ID0gdG9rZW4ueCArIHRoaXMudHJhbnNsYXRpb24ueDsKICAgIGNvbnN0IHkgPSB0b2tlbi55ICsgdGhpcy50cmFuc2xhdGlvbi55OwogICAgcmV0dXJuIHggPiBsZWZ0IC0gMS42ICYmIHggPCByaWdodCAtIDEgJiYgeSA+IHRvcCAtIDAuNiAmJiB5IDwgYm90dG9tICsgMC42OwogIH0KICB0cmFuc2xhdGUoewogICAgeCA9IDAsCiAgICB5ID0gMAogIH0gPSB7fSkgewogICAgdGhpcy50cmFuc2xhdGlvbi54ICs9IHg7CiAgICB0aGlzLnRyYW5zbGF0aW9uLnkgKz0geTsKICB9Cn0KOwpjb25zdCBwYXJzZUFkZGl0aW9uYWxMaW5lU3RhY2tzID0gdG9rZW5zID0+IHsKICBjb25zdCBsaW5lcyA9IHRva2Vucy5maWx0ZXIodG9rZW4gPT4gdG9rZW4uaXMoIkFERElUSU9OQUxfTElORSIpKS5zb3J0KCh0MSwgdDIpID0+IHQxLnkgLSB0Mi55KTsKICBjb25zdCBzdGFja3MgPSBbXTsKICBsaW5lcy5mb3JFYWNoKGxpbmUgPT4gewogICAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3MpIHsKICAgICAgaWYgKHN0YWNrLnRyeUFwcGVuZChsaW5lKSkgcmV0dXJuOwogICAgfQogICAgc3RhY2tzLnB1c2gobmV3IExpbmVTdGFjayhsaW5lKSk7CiAgfSk7CiAgcmV0dXJuIHN0YWNrczsKfTsKY29uc3QgdG9rZW5zU3lzdGVtc1NwbGl0ID0gKHRva2VucywgbG9nZ2VyKSA9PiB7CiAgaWYgKCF0b2tlbnMubGVuZ3RoKSB7CiAgICBsb2dnZXIuYXBwZW5kKCJ0b2tlbnNTeXN0ZW1zU3BsaXQuZW1wdHlUb2tlbnMiKTsKICAgIHJldHVybiBbXTsKICB9CiAgY29uc3QgcGFnZUhlaWdodCA9IE1hdGgubWF4KC4uLnRva2Vucy5tYXAodG9rZW4gPT4gdG9rZW4ueSkpOwogIGNvbnN0IHBhZ2VUaWxlID0gQXJyYXkoTWF0aC5yb3VuZChwYWdlSGVpZ2h0KSkuZmlsbCgtMSk7CiAgbGV0IGNyb3NzZWRDb3VudCA9IDA7CiAgY29uc3QgY29ubmVjdGlvbnMgPSB0b2tlbnMuZmlsdGVyKHRva2VuID0+IHRva2VuLmlzKCJTVEFWRVNfQ09OTkVDVElPTiIpKTsKICBpZiAoIWNvbm5lY3Rpb25zLmxlbmd0aCkgewogICAgLy8gc2luZ2xlIGxpbmUgc3lzdGVtLCBzcGxpdCBieSBzdGFmZiBsaW5lcwogICAgY29uc3QgbGluZXMgPSB0b2tlbnMuZmlsdGVyKHRva2VuID0+IHRva2VuLmlzKCJTVEFGRl9MSU5FIikpOwogICAgbGluZXMuZm9yRWFjaChsaW5lID0+IHBhZ2VUaWxlW01hdGgucm91bmQobGluZS55KV0gPSAwKTsKICAgIC8vIG5vbi1zdGFmZiBwYWdlCiAgICBpZiAoIWxpbmVzLmxlbmd0aCkgewogICAgICBsb2dnZXIuYXBwZW5kKCJ0b2tlbnNTeXN0ZW1zU3BsaXQubm9Db25uZXRpb25zT3JMaW5lcyIsIHsKICAgICAgICB0b2tlbnMKICAgICAgfSk7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIGxldCBpbmRleCA9IC0xOwogICAgbGV0IG91dFN0YWZmID0gdHJ1ZTsKICAgIGZvciAobGV0IHkgPSAwOyB5IDwgcGFnZVRpbGUubGVuZ3RoOyArK3kpIHsKICAgICAgY29uc3Qgb3V0ID0gcGFnZVRpbGVbeV0gPCAwOwogICAgICBpZiAob3V0U3RhZmYgJiYgIW91dCkgewogICAgICAgICsraW5kZXg7CiAgICAgICAgLy8gYXBwZW5kIGNvbm5lY3Rpb24gcGxhY2Vob2xkZXIKICAgICAgICBjb25uZWN0aW9ucy5wdXNoKHsKICAgICAgICAgIHksCiAgICAgICAgICBoZWlnaHQ6IDQKICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAoIW91dCkgcGFnZVRpbGVbeV0gPSBpbmRleDsKICAgICAgb3V0U3RhZmYgPSBvdXQ7CiAgICB9CiAgfSBlbHNlIHsKICAgIGNvbm5lY3Rpb25zLmZvckVhY2goKGNvbm5lY3Rpb24sIGkpID0+IHsKICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLnJvdW5kKGNvbm5lY3Rpb24ueSkgLSAxOwogICAgICBjb25zdCBlbmQgPSBNYXRoLnJvdW5kKGNvbm5lY3Rpb24ueSArIGNvbm5lY3Rpb24uaGVpZ2h0KSArIDE7CiAgICAgIGxldCBpbmRleCA9IGkgLSBjcm9zc2VkQ291bnQ7CiAgICAgIGZvciAobGV0IHkgPSBzdGFydDsgeSA8PSBlbmQ7ICsreSkgewogICAgICAgIGlmIChwYWdlVGlsZVt5XSA+PSAwKSB7CiAgICAgICAgICBpbmRleCA9IHBhZ2VUaWxlW3ldOwogICAgICAgICAgKytjcm9zc2VkQ291bnQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChsZXQgeSA9IHN0YXJ0OyB5IDw9IGVuZDsgKyt5KSBwYWdlVGlsZVt5XSA9IGluZGV4OwogICAgfSk7CiAgfQogIC8vbG9nZ2VyLmFwcGVuZCgidG9rZW5zU3lzdGVtc1NwbGl0LnBhZ2VUaWxlLjAiLCBbLi4ucGFnZVRpbGVdKTsKICAvL2xvZ2dlci5hcHBlbmQoInRva2Vuc1N5c3RlbXNTcGxpdC5jb25uZWN0aW9ucyIsIGNvbm5lY3Rpb25zKTsKICBjb25zdCBsaW5lU3RhY2tzID0gcGFyc2VBZGRpdGlvbmFsTGluZVN0YWNrcyh0b2tlbnMpOwogIGxpbmVTdGFja3MuZm9yRWFjaChzdGFjayA9PiB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChzdGFjay50cnlBdHRhY2hDb25uZWN0aW9uKGNvbm5lY3Rpb25zW2ldLCBpKSkgYnJlYWs7CiAgICB9CiAgfSk7CiAgLy9sb2dnZXIuYXBwZW5kKCJ0b2tlbnNTeXN0ZW1zU3BsaXQubGluZVN0YWNrcyIsIGxpbmVTdGFja3MpOwogIGNvbnN0IHZhbGlkTGluZVN0YWNrcyA9IGxpbmVTdGFja3MuZmlsdGVyKHN0YWNrID0+IHN0YWNrLnN5c3RlbUluZGV4ID49IDApOwogIGlmICh2YWxpZExpbmVTdGFja3MubGVuZ3RoIDwgbGluZVN0YWNrcy5sZW5ndGgpIGxvZ2dlci5hcHBlbmQoInRva2Vuc1N5c3RlbXNTcGxpdC5pbnZhbGlkTGluZVN0YWNrcyIsIGxpbmVTdGFja3MuZmlsdGVyKHN0YWNrID0+ICEoc3RhY2suc3lzdGVtSW5kZXggPj0gMCkpKTsKICAvLyBmaWxsIHBhZ2UgdGlsZSBieSBsaW5lIHN0YWNrcwogIHZhbGlkTGluZVN0YWNrcy5mb3JFYWNoKHN0YWNrID0+IHsKICAgIGNvbnN0IHsKICAgICAgdG9wLAogICAgICBib3R0b20KICAgIH0gPSBzdGFjay5yZWN0OwogICAgZm9yIChsZXQgeSA9IE1hdGguZmxvb3IodG9wKSAtIDE7IHkgPCBNYXRoLmNlaWwoYm90dG9tKTsgKyt5KSB7CiAgICAgIGlmIChwYWdlVGlsZVt5XSA8IDApIHBhZ2VUaWxlW3ldID0gc3RhY2suc3lzdGVtSW5kZXg7CiAgICB9CiAgfSk7CiAgLy8gZmlsbCBpbnRlcnZhbCBiZXR3ZWVuIHRvcCB0b2tlbnMgYW5kIHN5c3RlbSB0b3AKICBjb25zdCB0b3BUb2tlbnMgPSB0b2tlbnMuZmlsdGVyKHRva2VuID0+IHRva2VuLnRvcEF0U3lzdGVtKTsKICB0b3BUb2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7CiAgICBjb25zdCBuZXh0SW5kZXggPSBwYWdlVGlsZS5maW5kKChpbmRleCwgeSkgPT4geSA+IHRva2VuLnkgJiYgaW5kZXggPj0gMCk7CiAgICBmb3IgKGxldCB5ID0gTWF0aC5mbG9vcih0b2tlbi55KSAtIDE7IHkgPCBwYWdlSGVpZ2h0OyArK3kpIHsKICAgICAgaWYgKHBhZ2VUaWxlW3ldID49IDApIGJyZWFrOwogICAgICBwYWdlVGlsZVt5XSA9IG5leHRJbmRleDsKICAgIH0KICB9KTsKICAvL2xvZ2dlci5hcHBlbmQoInRva2Vuc1N5c3RlbXNTcGxpdC5vY3RhdmVBcyIsIG9jdGF2ZUFzKTsKICAvLyBlbmxhcmdlIHBhZ2UgdGlsZSBieSBpbnRlcnNlY3Rpb24gc3RlbXMKICBjb25zdCBpbnRlclN0ZW1zID0gdG9rZW5zLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5pcygiTk9URV9TVEVNIikgJiYgcGFnZVRpbGVbTWF0aC5yb3VuZCh0b2tlbi55KV0gPT09IC0xICYmIHBhZ2VUaWxlW01hdGgucm91bmQodG9rZW4ueSldICE9PSBwYWdlVGlsZVtNYXRoLnJvdW5kKHRva2VuLnkgKyB0b2tlbi5oZWlnaHQpXSk7CiAgaW50ZXJTdGVtcy5mb3JFYWNoKHN0ZW0gPT4gewogICAgY29uc3QgYm90dG9tSW5kZXggPSBwYWdlVGlsZVtNYXRoLnJvdW5kKHN0ZW0ueSArIHN0ZW0uaGVpZ2h0KV07CiAgICBpZiAoYm90dG9tSW5kZXggPiAwKSB7CiAgICAgIGZvciAobGV0IHkgPSBNYXRoLnJvdW5kKHN0ZW0ueSArIHN0ZW0uaGVpZ2h0KSAtIDE7IHkgPj0gTWF0aC5yb3VuZChzdGVtLnkpOyAtLXkpIHBhZ2VUaWxlW3ldID0gYm90dG9tSW5kZXg7CiAgICB9CiAgfSk7CiAgLy9sb2dnZXIuYXBwZW5kKCJ0b2tlbnNTeXN0ZW1zU3BsaXQucGFnZVRpbGUuMiIsIHBhZ2VUaWxlKTsKICBjb25zdCBzeXN0ZW1Cb3VuZGFyaWVzID0gcGFnZVRpbGUucmVkdWNlKChib3VuZGFyaWVzLCBpbmRleCwgeSkgPT4gewogICAgaWYgKGluZGV4ID49IGJvdW5kYXJpZXMubGVuZ3RoKSBib3VuZGFyaWVzLnB1c2goeSAtIDEpOwogICAgcmV0dXJuIGJvdW5kYXJpZXM7CiAgfSwgW10pOwogIHN5c3RlbUJvdW5kYXJpZXNbMF0gPSAtSW5maW5pdHk7CiAgLy9sb2dnZXIuYXBwZW5kKCJ0b2tlbnNTeXN0ZW1zU3BsaXQuc3lzdGVtQm91bmRhcmllcyIsIHN5c3RlbUJvdW5kYXJpZXMpOwogIGNvbnN0IHN5c3RlbXMgPSBBcnJheShzeXN0ZW1Cb3VuZGFyaWVzLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKCkgPT4gKHsKICAgIHRva2VuczogW10sCiAgICBzdGFja3M6IFtdCiAgfSkpOwogIHZhbGlkTGluZVN0YWNrcy5mb3JFYWNoKHN0YWNrID0+IHN5c3RlbXNbc3RhY2suc3lzdGVtSW5kZXhdICYmIHN5c3RlbXNbc3RhY2suc3lzdGVtSW5kZXhdLnN0YWNrcy5wdXNoKHN0YWNrKSk7CiAgLy9sb2dnZXIuYXBwZW5kKCJ0b2tlbnNTeXN0ZW1zU3BsaXQudmFsaWRMaW5lU3RhY2tzIiwge3N5c3RlbXMsIHZhbGlkTGluZVN0YWNrc30pOwogIHRva2Vucy5mb3JFYWNoKHRva2VuID0+IHsKICAgIGZvciAoY29uc3Qgc3RhY2sgb2YgdmFsaWRMaW5lU3RhY2tzKSB7CiAgICAgIGlmIChzdGFjay5jb250YWlucyh0b2tlbikpIHsKICAgICAgICBpZiAoc3lzdGVtc1tzdGFjay5zeXN0ZW1JbmRleF0pIHsKICAgICAgICAgIHN5c3RlbXNbc3RhY2suc3lzdGVtSW5kZXhdLnRva2Vucy5wdXNoKHRva2VuKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgbG9nZ2VyLmFwcGVuZCgidG9rZW5zU3lzdGVtc1NwbGl0LmludmFsaWRTdGFja1N5c3RlbUluZGV4IiwgewogICAgICAgICAgc3RhY2ssCiAgICAgICAgICBzeXN0ZW1zCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0b2tlbi53aXRoVXAgfHwgdG9rZW4ud2l0aERvd24pIHsKICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgaWYgKHRva2VuLndpdGhVcCkgaW5kZXggPSBjb25uZWN0aW9ucy5maWx0ZXIoYyA9PiBjLnkgKyBjLmhlaWdodCA8IHRva2VuLnkpLmxlbmd0aDtlbHNlIGluZGV4ID0gTWF0aC5tYXgoY29ubmVjdGlvbnMuZmlsdGVyKGMgPT4gYy55IDwgdG9rZW4ueSkubGVuZ3RoIC0gMSwgMCk7CiAgICAgIGlmIChzeXN0ZW1zW2luZGV4XSkgc3lzdGVtc1tpbmRleF0udG9rZW5zLnB1c2godG9rZW4pO2Vsc2UgY29uc29sZS53YXJuKCJ0b2tlbnNTeXN0ZW1zU3BsaXQ6IGludmFsaWQgc3lzdGVtIGluZGV4OiIsIGluZGV4LCBzeXN0ZW1zLmxlbmd0aCwgdG9rZW4uc291cmNlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgeSA9IHRva2VuLmxvZ2ljWTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3lzdGVtQm91bmRhcmllcy5sZW5ndGg7ICsraSkgewogICAgICBpZiAoeSA+PSBzeXN0ZW1Cb3VuZGFyaWVzW2ldICYmIChpID49IHN5c3RlbUJvdW5kYXJpZXMubGVuZ3RoIC0gMSB8fCB5IDwgc3lzdGVtQm91bmRhcmllc1tpICsgMV0pKSB7CiAgICAgICAgc3lzdGVtc1tpXS50b2tlbnMucHVzaCh0b2tlbik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfSk7CiAgc3lzdGVtcy5mb3JFYWNoKHN5c3RlbSA9PiBzeXN0ZW0udG9rZW5zID0gc3lzdGVtLnRva2Vucy5zb3J0KCh0MSwgdDIpID0+IHQxLmxvZ2ljWCAtIHQyLmxvZ2ljWCkpOwogIHJldHVybiBzeXN0ZW1zOwp9Owpjb25zdCBwYXJzZUNob3Jkc0J5U3RlbXMgPSAodG9rZW5zLCBsb2dnZXIpID0+IHsKICBjb25zdCBzdGVtcyA9IHRva2Vucy5maWx0ZXIodG9rZW4gPT4gdG9rZW4uaXMoIk5PVEVfU1RFTSIpKTsKICBjb25zdCBub3RlcyA9IHRva2Vucy5maWx0ZXIodG9rZW4gPT4gdG9rZW4uaXMoIk5PVEVIRUFEIikgfHwgdG9rZW4uaXMoIlRFTVBPX05PVEVIRUFEIikpOwogIHN0ZW1zLmZvckVhY2goc3RlbSA9PiB7CiAgICBjb25zdCByaWdodEF0dGFjaGVkID0gbm90ZXMuZmlsdGVyKG5vdGUgPT4gc3RlbS5zdGVtQXR0YWNoZWQoewogICAgICB4OiBub3RlLngsCiAgICAgIHk6IG5vdGUueSArIGNvbnN0YW50cy5OT1RFX1RZUEVfSk9JTlRfWVtub3RlLm5vdGVUeXBlXSAqIChub3RlLnNjYWxlIHx8IDEpLAogICAgICBocmVmOiBub3RlLmhyZWYKICAgIH0pKTsKICAgIGNvbnN0IGxlZnRBdHRhY2hlZCA9IG5vdGVzLmZpbHRlcihub3RlID0+IHN0ZW0uc3RlbUF0dGFjaGVkKHsKICAgICAgeDogbm90ZS54ICsgY29uc3RhbnRzLk5PVEVfVFlQRV9XSURUSFNbbm90ZS5ub3RlVHlwZV0gKiAobm90ZS5zY2FsZSB8fCAxKSwKICAgICAgeTogbm90ZS55IC0gY29uc3RhbnRzLk5PVEVfVFlQRV9KT0lOVF9ZW25vdGUubm90ZVR5cGVdICogKG5vdGUuc2NhbGUgfHwgMSksCiAgICAgIGhyZWY6IG5vdGUuaHJlZgogICAgfSkpOwogICAgaWYgKHJpZ2h0QXR0YWNoZWQubGVuZ3RoICsgbGVmdEF0dGFjaGVkLmxlbmd0aCA8PSAwKSB7CiAgICAgIGxvZ2dlci5hcHBlbmQoInBhcnNlQ2hvcmRzQnlTdGVtcy5iYWxkU3RlbToiLCBzdGVtKTsKICAgICAgLy9jb25zb2xlLndhcm4oImJhbGQgc3RlbToiLCBzdGVtKTsKICAgICAgc3RlbS5hZGRTeW1ib2woIkJBTEQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgeXMgPSBbLi4ucmlnaHRBdHRhY2hlZC5tYXAobiA9PiBuLnkpLCAuLi5sZWZ0QXR0YWNoZWQubWFwKG4gPT4gbi55KV07CiAgICBjb25zdCB0b3AgPSBNYXRoLmFicyhzdGVtLnkgLSBNYXRoLm1pbiguLi55cykpOwogICAgY29uc3QgYm90dG9tID0gTWF0aC5hYnMoc3RlbS55ICsgc3RlbS5oZWlnaHQgLSBNYXRoLm1heCguLi55cykpOwogICAgY29uc3QgdXAgPSB0b3AgPCBib3R0b207CiAgICAvL2NvbnNvbGUuYXNzZXJ0KHVwIHx8IGxlZnRBdHRhY2hlZC5sZW5ndGgsICJ1bmV4cGVjdGVkIHN0ZW0sIGRvd253YXJkcyBidXQgbm8gbGVmdC1hdHRhY2hlZCBub3Rlcy4iKTsKICAgIC8vY29uc29sZS5hc3NlcnQoIXVwIHx8IHJpZ2h0QXR0YWNoZWQubGVuZ3RoLCAidW5leHBlY3RlZCBzdGVtLCB1cHdhcmRzIGJ1dCBubyByaWdodC1hdHRhY2hlZCBub3Rlcy4iKTsKICAgIHN0ZW0uc3RlbVVwID0gIXVwOwogICAgY29uc3QgYW5jaG9yTm90ZSA9IHVwID8gcmlnaHRBdHRhY2hlZFswXSA6IGxlZnRBdHRhY2hlZFswXTsKICAgIGNvbnN0IGFuY2hvclRva2VuID0gYW5jaG9yTm90ZSB8fCBzdGVtOwogICAgY29uc3QgYXNzaWduID0gbm90ZSA9PiB7CiAgICAgIG5vdGUuc3RlbVggPSBhbmNob3JUb2tlbi54OwogICAgICBub3RlLnN0ZW1VcCA9ICF1cDsKICAgICAgbm90ZS5zdGVtcyA9IG5vdGUuc3RlbXMgfHwgW107CiAgICAgIG5vdGUuc3RlbXMucHVzaChzdGVtLmluZGV4KTsKICAgIH07CiAgICByaWdodEF0dGFjaGVkLmZvckVhY2goYXNzaWduKTsKICAgIGxlZnRBdHRhY2hlZC5mb3JFYWNoKGFzc2lnbik7CiAgICBpZiAoIWFuY2hvck5vdGUpIHsKICAgICAgc3RlbS5hZGRTeW1ib2woIk5PVElDRSIpOwogICAgICBsb2dnZXIuYXBwZW5kKCJwYXJzZUNob3Jkc0J5U3RlbXMudW5leHBlY3RlZFN0ZW0iLCB7CiAgICAgICAgc3RlbSwKICAgICAgICB5cywKICAgICAgICByaWdodEF0dGFjaGVkLAogICAgICAgIGxlZnRBdHRhY2hlZAogICAgICB9KTsKICAgIH0gZWxzZSBpZiAoYW5jaG9yTm90ZS5pcygiSEFMRiIpKSBzdGVtLmRpdmlzaW9uID0gMTsKICB9KTsKfTsKY29uc3QgaXNTeXN0ZW1Ub2tlbiA9IHRva2VuID0+IHRva2VuLmlzKCJTVEFWRVNfQ09OTkVDVElPTiIpIHx8IHRva2VuLmlzKCJCUkFDRSIpIHx8IHRva2VuLmlzKCJWRVJUSUNBTF9MSU5FIik7Ci8vY29uc3Qgcm91bmRKb2luID0gKHgsIHkpID0+IGAke01hdGgucm91bmQoeCl9LCR7TWF0aC5yb3VuZCh5KX1gOwpjb25zdCBwYXJzZVRva2VuU3lzdGVtID0gKHRva2Vucywgc3RhY2tzLCBsb2dnZXIpID0+IHsKICBjb25zdCBzZXBhcmF0b3JZcyA9IG5ldyBTZXQoKTsKICBjb25zdCBtZWFzdXJlU2VwYXJhdG9ycyA9IHRva2Vucy5maWx0ZXIodG9rZW4gPT4gdG9rZW4uaXMoIk1FQVNVUkVfU0VQQVJBVE9SIikpOwogIG1lYXN1cmVTZXBhcmF0b3JzLmZvckVhY2godG9rZW4gPT4gc2VwYXJhdG9yWXMuYWRkKHRva2VuLnJ5KSk7CiAgLy9sb2dnZXIuYXBwZW5kKCJwYXJzZVRva2VuU3lzdGVtLm1lYXN1cmVTZXBhcmF0b3JzIiwgQXJyYXkuZnJvbShtZWFzdXJlU2VwYXJhdG9ycykpOwogIC8vIHJlbW92ZSBzZXBhcmF0b3IgWSBmcm9tIGZha2UgTUVBU1VSRV9TRVBBUkFUT1IKICBmb3IgKGNvbnN0IHkgb2YgQXJyYXkuZnJvbShzZXBhcmF0b3JZcykuc29ydCgpKSB7CiAgICBpZiAoc2VwYXJhdG9yWXMuaGFzKHkgLSA0KSAmJiBzZXBhcmF0b3JZcy5oYXMoeSArIDQpKSB7CiAgICAgIHNlcGFyYXRvcllzLmRlbGV0ZSh5KTsKICAgICAgbWVhc3VyZVNlcGFyYXRvcnMuZmlsdGVyKHRva2VuID0+IHRva2VuLnJ5ID09PSB5KS5mb3JFYWNoKHRva2VuID0+IHsKICAgICAgICB0b2tlbi5yZW1vdmVTeW1ib2woIk1FQVNVUkVfU0VQQVJBVE9SIik7CiAgICAgICAgdG9rZW4uYWRkU3ltYm9sKCJWRVJUSUNBTF9MSU5FIik7CiAgICAgIH0pOwogICAgfQogIH0KICAvL2xvZ2dlci5hcHBlbmQoInBhcnNlVG9rZW5TeXN0ZW0uc2VwYXJhdG9yWXMiLCBBcnJheS5mcm9tKHNlcGFyYXRvcllzKSk7CiAgY29uc3Qgc3RhZmZMaW5lcyA9IHRva2Vucy5maWx0ZXIodG9rZW4gPT4gdG9rZW4uaXMoIlNUQUZGX0xJTkUiKSkucmVkdWNlKChsaW5lcywgdG9rZW4pID0+IHsKICAgIGlmICghbGluZXNbdG9rZW4ucnldIHx8IGxpbmVzW3Rva2VuLnJ5XS54ID4gdG9rZW4ueCkgbGluZXNbdG9rZW4ucnldID0gdG9rZW47CiAgICByZXR1cm4gbGluZXM7CiAgfSwge30pOwogIC8vbG9nZ2VyLmFwcGVuZCgicGFyc2VUb2tlblN5c3RlbS5zdGFmZkxpbmVzIiwgT2JqZWN0LmtleXMoc3RhZmZMaW5lcykpOwogIC8vIGNvbnN0cnVjdCBzdGFmZiBZIGZyb20gc3RhZmYgbGluZXMgd2hlbiBubyBzZXBhcmF0b3JzCiAgaWYgKCFzZXBhcmF0b3JZcy5zaXplKSB7CiAgICBjb25zdCB5cyA9IE9iamVjdC5rZXlzKHN0YWZmTGluZXMpLm1hcChOdW1iZXIpOwogICAgY29uc3QgdG9wTGluZVlzID0geXMuZmlsdGVyKHkgPT4gc3RhZmZMaW5lc1t5ICsgM10gJiYgc3RhZmZMaW5lc1t5ICsgNF0pOwogICAgdG9wTGluZVlzLmZvckVhY2goeSA9PiBzZXBhcmF0b3JZcy5hZGQoeSkpOwogIH0KICBjb25zdCBzdGFmZllzID0gQXJyYXkuZnJvbShzZXBhcmF0b3JZcykuZmlsdGVyKHkgPT4gc3RhZmZMaW5lc1t5XSB8fCBzdGFmZkxpbmVzW3kgKyBQT1NfUFJFQ0lTSU9OXSkubWFwKHkgPT4gc3RhZmZMaW5lc1t5XSA/IHkgOiB5ICsgUE9TX1BSRUNJU0lPTikubWFwKHkgPT4geSArIDIpLnNvcnQoKHkxLCB5MikgPT4geTEgLSB5MikuZmlsdGVyKHkgPT4gc3RhZmZMaW5lc1t5IC0gMl0gJiYgc3RhZmZMaW5lc1t5XSAmJiBzdGFmZkxpbmVzW3kgKyAyXSk7CiAgLy9sb2dnZXIuYXBwZW5kKCJwYXJzZVRva2VuU3lzdGVtLnN0YWZmWXMiLCBzdGFmZllzKTsKICBjb25zdCBhZGRpdGlvbmFsTGluZXMgPSB0b2tlbnMuZmlsdGVyKHRva2VuID0+IHRva2VuLmlzKCJBRERJVElPTkFMX0xJTkUiKSkuc29ydCgobDEsIGwyKSA9PiBsMS55IC0gbDIueSk7CiAgY29uc3QgYWRkaXRpb25hbExpbmVzWXMgPSBhZGRpdGlvbmFsTGluZXMucmVkdWNlKCh5cywgdG9rZW4pID0+IHsKICAgIHlzLmFkZCh0b2tlbi5yeSk7CiAgICByZXR1cm4geXM7CiAgfSwgbmV3IFNldCgpKTsKICAvL2xvZ2dlci5hcHBlbmQoInBhcnNlVG9rZW5TeXN0ZW0uYWRkaXRpb25hbExpbmVzWXMiLCBBcnJheS5mcm9tKGFkZGl0aW9uYWxMaW5lc1lzKSk7CiAgLypmb3IgKGNvbnN0IHkgb2Ygc3RhZmZZcykgewogICAgICBjb25zb2xlLmFzc2VydChzdGFmZkxpbmVzW3kgLSAyXSAmJiBzdGFmZkxpbmVzW3ldICYmIHN0YWZmTGluZXNbeSArIDJdLAogICAgICAgICAgIm5vIGNvcnJlc3BvbmRpbmcgc3RhZmYgbGluZXMgZm9yIHNlcGFyYXRvciIsIHkgLSAyLCBPYmplY3Qua2V5cyhzdGFmZkxpbmVzKSk7CiAgfSovCiAgY29uc3Qgc3lzdGVtWSA9IHN0YWZmWXNbMF0gLSAyOwogIGNvbnN0IHN5c3RlbVggPSBzdGFmZkxpbmVzW3N5c3RlbVldICYmIHN0YWZmTGluZXNbc3lzdGVtWV0ucng7CiAgY29uc3Qgbm90ZVlzID0gdG9rZW5zLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5pcygiTk9URSIpICYmICF0b2tlbi5pcygiVEVNUE9fTk9URUhFQUQiKSkubWFwKHRva2VuID0+IHRva2VuLnJ5KS5jb25jYXQoT2JqZWN0LmtleXMoc3RhZmZMaW5lcykubWFwKE51bWJlcikpOwogIGNvbnN0IHRvcCA9IE1hdGgubWluKC4uLm5vdGVZcykgLSBzeXN0ZW1ZOwogIGNvbnN0IGJvdHRvbSA9IE1hdGgubWF4KC4uLm5vdGVZcykgLSBzeXN0ZW1ZOwogIC8vY29uc29sZS5sb2coImFkZGl0aW9uYWxMaW5lc1lzOiIsIGFkZGl0aW9uYWxMaW5lc1lzKTsKICBjb25zdCBzcGxpdHRlcnMgPSBbXTsKICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWZmWXMubGVuZ3RoIC0gMTsgKytpKSB7CiAgICBsZXQgdXAgPSBzdGFmZllzW2ldICsgMjsKICAgIHdoaWxlIChhZGRpdGlvbmFsTGluZXNZcy5oYXModXAgKyAxKSkgKyt1cDsKICAgIGxldCBkb3duID0gc3RhZmZZc1tpICsgMV0gLSAyOwogICAgd2hpbGUgKGFkZGl0aW9uYWxMaW5lc1lzLmhhcyhkb3duIC0gMSkpIC0tZG93bjsKICAgIC8vY29uc3Qgc3BsaXR0ZXIgPSBNYXRoLm1pbihNYXRoLm1heCgoc3RhZmZZc1tpXSArIHN0YWZmWXNbaSArIDFdKSAvIDIsIHVwICsgMSksIGRvd24gLSAxKSAtIHN5c3RlbVk7CiAgICBjb25zdCBzcGxpdHRlciA9ICh1cCArIGRvd24pIC8gMiAtIHN5c3RlbVk7CiAgICBzcGxpdHRlcnMucHVzaChzcGxpdHRlcik7CiAgICAvL2xvZ2dlci5hcHBlbmQoInBhcnNlVG9rZW5TeXN0ZW0uc3BsaXR0ZXIiLCB7c3BsaXR0ZXIsIHVwLCBkb3duLCBzeXN0ZW1ZfSk7CiAgfQogIHNwbGl0dGVycy5wdXNoKEluZmluaXR5KTsKICBzdGFja3MuZm9yRWFjaChzdGFjayA9PiB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWZmWXMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKHN0YWNrLnRyeUF0dGFjaFN0YWZmKHN0YWZmWXNbaV0sIGkpKSByZXR1cm47CiAgICB9CiAgfSk7CiAgY29uc3QgZmluZFN0YWZmQnlTdGFja3MgPSB0b2tlbiA9PiB7CiAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcykgewogICAgICBpZiAoc3RhY2suY29udGFpbnModG9rZW4pKSByZXR1cm4gc3RhY2suc3RhZmZJbmRleDsKICAgIH0KICB9OwogIGNvbnN0IGxvY2FsVG9rZW5zID0gdG9rZW5zLm1hcCh0b2tlbiA9PiB0b2tlbi50cmFuc2xhdGUoewogICAgeDogLXN5c3RlbVgsCiAgICB5OiAtc3lzdGVtWQogIH0pKTsKICBjb25zdCBzdGVtcyA9IGxvY2FsVG9rZW5zLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5pcygiTk9URV9TVEVNIikpOwogIHN0ZW1zLmZvckVhY2goc3RlbSA9PiBzdGVtLmRpdmlzaW9uID0gMik7CiAgY29uc3Qgc2xhc2hlcyA9IGxvY2FsVG9rZW5zLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5pcygiTElORSIpICYmIHRva2VuLnRhcmdldCAmJiB0b2tlbi50YXJnZXQueCA+IDAgJiYgdG9rZW4udGFyZ2V0LnkgPCAwKTsKICBjb25zdCBiYWNrU2xhc2hlcyA9IGxvY2FsVG9rZW5zLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5pcygiTElORSIpICYmIHRva2VuLnRhcmdldCAmJiB0b2tlbi50YXJnZXQueCA+IDAgJiYgdG9rZW4udGFyZ2V0LnkgPiAwKTsKICBjb25zdCBzdGFmZlRva2VucyA9IFtdOwogIC8vY29uc29sZS5sb2coInNwbGl0dGVyczoiLCBzcGxpdHRlcnMpOwogIGNvbnN0IGFwcGVuZFRva2VuID0gdG9rZW4gPT4gewogICAgaWYgKHRva2VuLmlzKCJCRUFNIikpIHsKICAgICAgY29uc3Qgam9pbnRTdGVtcyA9IHN0ZW1zLmZpbHRlcihzdGVtID0+IE1hdGguYWJzKHN0ZW0uY2VudGVyWCAtIHRva2VuLngpIDwgMC4xICYmIChNYXRoLmFicyh0b2tlbi55IC0gc3RlbS55KSA8IDAuMiB8fCBNYXRoLmFicyh0b2tlbi55IC0gKHN0ZW0ueSArIHN0ZW0uaGVpZ2h0KSkgPCAwLjIpKTsKICAgICAgY29uc3QgayA9ICh0b2tlbi50YXJnZXQueSAtIHRva2VuLnN0YXJ0LnkpIC8gKHRva2VuLnRhcmdldC54IC0gdG9rZW4uc3RhcnQueCk7CiAgICAgIGNvbnN0IGNvbnRhY3RlZFN0ZW1zID0gc3RlbXMuZmlsdGVyKHN0ZW0gPT4gewogICAgICAgIGNvbnN0IGR5ID0gKHN0ZW0ueCAtICh0b2tlbi54ICsgdG9rZW4uc3RhcnQueCkpICogazsKICAgICAgICByZXR1cm4gc3RlbS5jZW50ZXJYIC0gKHRva2VuLnggKyB0b2tlbi5zdGFydC54KSA+IC0wLjEgJiYgc3RlbS5jZW50ZXJYIC0gKHRva2VuLnggKyB0b2tlbi50YXJnZXQueCkgPCAwLjEgJiYgdG9rZW4ueSArIGR5IC0gc3RlbS55ID4gLTAuMiAmJiB0b2tlbi55ICsgZHkgLSAoc3RlbS55ICsgc3RlbS5oZWlnaHQpIDwgMC4yOwogICAgICB9KTsKICAgICAgaWYgKCFjb250YWN0ZWRTdGVtcy5sZW5ndGgpIHsKICAgICAgICB0b2tlbi5yZW1vdmVTeW1ib2woIk5PVEVUQUlMIik7CiAgICAgICAgdG9rZW4ucmVtb3ZlU3ltYm9sKCJKT0lOVCIpOwogICAgICB9IGVsc2UgewogICAgICAgIHRva2VuLnN0ZW1zID0gY29udGFjdGVkU3RlbXMubWFwKHN0ZW0gPT4gc3RlbS5pbmRleCk7CiAgICAgICAgaWYgKGpvaW50U3RlbXMubGVuZ3RoKSB0b2tlbi5hZGRTeW1ib2woIkNBUElUQUxfQkVBTSIpOwogICAgICAgIGNvbnN0IGsgPSAodG9rZW4udGFyZ2V0LnkgLSB0b2tlbi5zdGFydC55KSAvICh0b2tlbi50YXJnZXQueCAtIHRva2VuLnN0YXJ0LngpOwogICAgICAgIC8vIGFwcGVuZCBzdGVtIGRpdmlzaW9uCiAgICAgICAgY29uc3QgY3Jvc3NlZFN0ZW1zID0gc3RlbXMuZmlsdGVyKHN0ZW0gPT4gc3RlbS5jZW50ZXJYID4gdG9rZW4ueCAtIDAuMSAmJiBzdGVtLmNlbnRlclggPCB0b2tlbi54ICsgdG9rZW4udGFyZ2V0LnggKyAwLjEgJiYgc3RlbS55IDwgTWF0aC5tYXgodG9rZW4ueSwgdG9rZW4ueSArIHRva2VuLnRhcmdldC55KSArIDAuMiAmJiBzdGVtLnkgKyBzdGVtLmhlaWdodCA+IE1hdGgubWluKHRva2VuLnksIHRva2VuLnkgKyB0b2tlbi50YXJnZXQueSkgLSAwLjIpOwogICAgICAgIGNyb3NzZWRTdGVtcy5mb3JFYWNoKHN0ZW0gPT4gewogICAgICAgICAgY29uc3QgYmVhbVkgPSAoc3RlbS5jZW50ZXJYIC0gdG9rZW4ueCArIHRva2VuLnN0YXJ0LngpICogayArIHRva2VuLnkgKyB0b2tlbi5zdGFydC55OwogICAgICAgICAgaWYgKGJlYW1ZID4gc3RlbS55IC0gMC4yICYmIGJlYW1ZIDwgc3RlbS55ICsgc3RlbS5oZWlnaHQgKyAwLjIpIHsKICAgICAgICAgICAgY29uc3QgYXRUaXAgPSBzdGVtLnN0ZW1VcCA/IGJlYW1ZIDwgc3RlbS55ICsgMy4yIDogYmVhbVkgPiBzdGVtLnkgKyBzdGVtLmhlaWdodCAtIDMuMjsKICAgICAgICAgICAgaWYgKGF0VGlwKSB7CiAgICAgICAgICAgICAgKytzdGVtLmRpdmlzaW9uOwogICAgICAgICAgICAgIGlmICh0b2tlbi5pcygiQ0FQSVRBTF9CRUFNIikpIHN0ZW0uYmVhbSA9IHRva2VuLmluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0b2tlbi5pcygiRkxBRyBVUCIpKSB7CiAgICAgIGNvbnN0IHN0ZW0gPSBzdGVtcy5maW5kKHN0ZW0gPT4gTWF0aC5hYnMoc3RlbS54ICsgc3RlbS53aWR0aCAtIHRva2VuLngpIDwgMC4wNCAmJiBNYXRoLmFicyhzdGVtLnkgLSB0b2tlbi55KSA8IDAuMSk7CiAgICAgIGlmIChzdGVtKSB7CiAgICAgICAgdG9rZW4uc3RlbSA9IHN0ZW0uaW5kZXg7CiAgICAgICAgc3RlbS5kaXZpc2lvbiA9IHRva2VuLmZsYWdOdW1iZXI7CiAgICAgIH0gZWxzZSB0b2tlbi5hZGRTeW1ib2woIlNVU1BFTkRFRCIpOwogICAgfQogICAgaWYgKHRva2VuLmlzKCJGTEFHIERPV04iKSkgewogICAgICBjb25zdCBzdGVtID0gc3RlbXMuZmluZChzdGVtID0+IE1hdGguYWJzKHN0ZW0ueCArIHN0ZW0ud2lkdGggLSB0b2tlbi54KSA8IDAuMDQgJiYgTWF0aC5hYnMoc3RlbS55ICsgc3RlbS5oZWlnaHQgLSB0b2tlbi55KSA8IDAuMSk7CiAgICAgIGlmIChzdGVtKSB7CiAgICAgICAgdG9rZW4uc3RlbSA9IHN0ZW0uaW5kZXg7CiAgICAgICAgc3RlbS5kaXZpc2lvbiA9IHRva2VuLmZsYWdOdW1iZXI7CiAgICAgIH0gZWxzZSB0b2tlbi5hZGRTeW1ib2woIlNVU1BFTkRFRCIpOwogICAgfQogICAgaWYgKHNsYXNoZXMuaW5jbHVkZXModG9rZW4pKSB7CiAgICAgIGNvbnN0IHBhcnRuZXIgPSBiYWNrU2xhc2hlcy5maW5kKHQgPT4gdC54ID09PSB0b2tlbi54ICYmIHQudGFyZ2V0LnkgPT09IC10b2tlbi50YXJnZXQueSk7CiAgICAgIGlmIChwYXJ0bmVyKSB7CiAgICAgICAgaWYgKHRva2VuLnkgPD0gcGFydG5lci55KSB7CiAgICAgICAgICB0b2tlbi5hZGRTeW1ib2woIldFREdFIENSRVNDRU5ETyBUT1AiKTsKICAgICAgICAgIHBhcnRuZXIuYWRkU3ltYm9sKCJXRURHRSBDUkVTQ0VORE8gQk9UVE9NIik7CiAgICAgICAgfSBlbHNlIGlmICh0b2tlbi55ID4gcGFydG5lci55KSB7CiAgICAgICAgICB0b2tlbi5hZGRTeW1ib2woIldFREdFIERFQ1JFU0NFTkRPIEJPVFRPTSIpOwogICAgICAgICAgcGFydG5lci5hZGRTeW1ib2woIldFREdFIERFQ1JFU0NFTkRPIFRPUCIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgbGV0IGluZGV4ID0gMDsKICAgIGlmICh0b2tlbi53aXRoVXAgfHwgdG9rZW4ud2l0aERvd24pIHsKICAgICAgaWYgKHRva2VuLndpdGhVcCkgaW5kZXggPSBzdGFmZllzLmZpbHRlcihzeSA9PiBzeSArIDIgPCB0b2tlbi55ICsgc3lzdGVtWSkubGVuZ3RoO2Vsc2UgaWYgKHRva2VuLndpdGhEb3duKSBpbmRleCA9IE1hdGgubWF4KHN0YWZmWXMuZmlsdGVyKHN5ID0+IHN5IC0gMiA8IHRva2VuLnkgKyBzeXN0ZW1ZKS5sZW5ndGggLSAxLCAwKTsKICAgIH0gZWxzZSB7CiAgICAgIGxldCB5ID0gdG9rZW4ubG9naWNZOwogICAgICAvL2NvbnN0IGluZGV4SW5NYXAgPSBpbmRpY2VzTWFwW3JvdW5kSm9pbih0b2tlbi54ICsgc3lzdGVtWCwgeSArIHN5c3RlbVkpXTsKICAgICAgY29uc3QgaW5kZXhCeVN0YWNrcyA9IGZpbmRTdGFmZkJ5U3RhY2tzKHRva2VuKTsKICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW5kZXhCeVN0YWNrcykpIGluZGV4ID0gaW5kZXhCeVN0YWNrcztlbHNlIHsKICAgICAgICAvLyBhZmZpbGlhdGUgYmVhbSB0byBhIHN0ZW0KICAgICAgICBpZiAodG9rZW4uaXMoIk5PVEVUQUlMIikgJiYgdG9rZW4uaXMoIkpPSU5UIikpIHsKICAgICAgICAgIGNvbnN0IHN0ZW0gPSBzdGVtcy5maW5kKHN0ZW0gPT4gTWF0aC5hYnMoc3RlbS5jZW50ZXJYIC0gdG9rZW4ueCkgPCAwLjEgJiYgdG9rZW4ueSA+IHN0ZW0ueSAtIDAuMiAmJiB0b2tlbi55IDwgc3RlbS55ICsgc3RlbS5oZWlnaHQgKyAwLjIpOwogICAgICAgICAgaWYgKHN0ZW0pIHkgPSBzdGVtLmxvZ2ljWTsKICAgICAgICAgIC8vZWxzZQogICAgICAgICAgLy8JY29uc29sZS5kZWJ1ZygiaXNvbGF0ZWQgYmVhbToiLCB0b2tlbik7CiAgICAgICAgfQogICAgICAgIC8vaWYgKHRva2VuLmlzKCJOT1RFSEVBRCIpKQogICAgICAgIC8vCWNvbnNvbGUubG9nKCJvbWl0IG5vdGU6IiwgdG9rZW4uaHJlZiwgcm91bmRKb2luKHRva2VuLnggKyBzeXN0ZW1YLCB5ICsgc3lzdGVtWSkpOwogICAgICAgIHdoaWxlICh5ID4gc3BsaXR0ZXJzW2luZGV4XSkgKytpbmRleDsKICAgICAgfQogICAgfQogICAgc3RhZmZUb2tlbnNbaW5kZXhdID0gc3RhZmZUb2tlbnNbaW5kZXhdIHx8IFtdOwogICAgc3RhZmZUb2tlbnNbaW5kZXhdLnB1c2godG9rZW4pOwogIH07CiAgc3RhY2tzLmZvckVhY2goc3RhY2sgPT4gc3RhY2sudHJhbnNsYXRlKHsKICAgIHg6IHN5c3RlbVgsCiAgICB5OiBzeXN0ZW1ZCiAgfSkpOwogIC8vbG9nZ2VyLmFwcGVuZCgicGFyc2VUb2tlblN5c3RlbS5zdGFja3MiLCBzdGFja3MpOwogIHBhcnNlQ2hvcmRzQnlTdGVtcyhsb2NhbFRva2VucywgbG9nZ2VyKTsKICBsb2NhbFRva2Vucy5maWx0ZXIodG9rZW4gPT4gIWlzU3lzdGVtVG9rZW4odG9rZW4pKS5mb3JFYWNoKGFwcGVuZFRva2VuKTsKICAvLyBtZWFzdXJlIHJhbmdlcwogIGNvbnN0IG5vdGVzID0gbG9jYWxUb2tlbnMuZmlsdGVyKHRva2VuID0+IHRva2VuLmlzKCJOT1RFIikpOwogIGNvbnN0IHNlcGFyYXRvclhzUmF3ID0gQXJyYXkuZnJvbShuZXcgU2V0KGxvY2FsVG9rZW5zLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5pcygiTUVBU1VSRV9TRVBBUkFUT1IiKSkubWFwKHRva2VuID0+IHRva2VuLmxvZ2ljWCkpKS5zb3J0KCh4MSwgeDIpID0+IHgxIC0geDIpOwogIC8vIHN1cHBsZW1lbnQgZm9yIGVtcHR5IG1lYXN1cmUgc2VwYXJhdG9yIHN0YWZmLCBtYXliZSBzb21lIGxpbHlwb25kIGJ1ZyBpZiBub3QgYXQgZW5kLgogIGlmICghc2VwYXJhdG9yWHNSYXcubGVuZ3RoKSBzZXBhcmF0b3JYc1Jhdy5wdXNoKGxvY2FsVG9rZW5zW2xvY2FsVG9rZW5zLmxlbmd0aCAtIDFdLnggKyAxKTsKICBjb25zdCBtZWFzdXJlUmFuZ2VzID0gc2VwYXJhdG9yWHNSYXcubWFwKCh4LCBpKSA9PiB7CiAgICBjb25zdCBsZWZ0ID0gaSA+IDAgPyBzZXBhcmF0b3JYc1Jhd1tpIC0gMV0gOiAtSW5maW5pdHk7CiAgICByZXR1cm4gewogICAgICB4LAogICAgICBub3Rlczogbm90ZXMuZmlsdGVyKG5vdGUgPT4gbm90ZS54ID4gbGVmdCAmJiBub3RlLnggPCB4KQogICAgfTsKICB9KS5maWx0ZXIoKHsKICAgIG5vdGVzCiAgfSkgPT4gbm90ZXMubGVuZ3RoKS5tYXAoKHsKICAgIHgsCiAgICBub3RlcwogIH0pID0+ICh7CiAgICBoZWFkWDogbm90ZXNbMF0ueCAtIDEuNSwKICAgIG5vdGVSYW5nZTogewogICAgICBiZWdpbjogbm90ZXNbMF0ueCwKICAgICAgZW5kOiB4CiAgICB9CiAgfSkpOwogIC8vbG9nZ2VyLmFwcGVuZCgicGFyc2VUb2tlblN5c3RlbS5tZWFzdXJlUmFuZ2VzIiwgbWVhc3VyZVJhbmdlcyk7CiAgcmV0dXJuIHsKICAgIHg6IHN5c3RlbVgsCiAgICB5OiBzeXN0ZW1ZLAogICAgdG9wLAogICAgYm90dG9tLAogICAgdG9rZW5zOiBsb2NhbFRva2Vucy5maWx0ZXIoaXNTeXN0ZW1Ub2tlbiksCiAgICBzdGF2ZXM6IHN0YWZmWXMubWFwKCh5LCBpKSA9PiBzdGFmZlRva2Vuc1tpXSAmJiBwYXJzZVRva2VuU3RhZmYoewogICAgICB0b2tlbnM6IHN0YWZmVG9rZW5zW2ldLAogICAgICB5OiB5IC0gc3lzdGVtWSwKICAgICAgdG9wOiBzcGxpdHRlcnNbaV0gLSAoeSAtIHN5c3RlbVkpLAogICAgICBtZWFzdXJlUmFuZ2VzLAogICAgICBsb2dnZXIKICAgIH0pKQogIH07Cn07CmNvbnN0IGlzU3RhZmZUb2tlbiA9IHRva2VuID0+IHRva2VuLmlzKCJTVEFGRl9MSU5FIikgfHwgdG9rZW4uaXMoIk1FQVNVUkVfU0VQQVJBVE9SIik7CmNvbnN0IHBhcnNlVG9rZW5TdGFmZiA9ICh7CiAgdG9rZW5zLAogIHksCiAgdG9wLAogIG1lYXN1cmVSYW5nZXMsCiAgbG9nZ2VyCn0pID0+IHsKICBjb25zdCBsb2NhbFRva2VucyA9IHRva2Vucy5tYXAodG9rZW4gPT4gdG9rZW4udHJhbnNsYXRlKHsKICAgIHk6IC15CiAgfSkpOwogIGNvbnN0IG5vdGVzID0gbG9jYWxUb2tlbnMuZmlsdGVyKHRva2VuID0+IHRva2VuLmlzKCJOT1RFIikpOwogIC8vbG9nZ2VyLmFwcGVuZCgicGFyc2VUb2tlblN0YWZmLmxvY2FsVG9rZW5zIiwgbG9jYWxUb2tlbnMpOwogIGNvbnN0IGhlYWRYID0gbWVhc3VyZVJhbmdlc1swXSA/IG1lYXN1cmVSYW5nZXNbMF0uaGVhZFggOiAwOwogIGNvbnN0IGFsdGVycyA9IGxvY2FsVG9rZW5zLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5pcygiQUxURVIiKSk7CiAgbGV0IGxhc3RBbHRlciA9IG51bGw7CiAgLy8gbWFyayBrZXkgYWx0ZXJzCiAgZm9yIChjb25zdCBhbHRlciBvZiBhbHRlcnMpIHsKICAgIC8vIGZhciBkaXN0YW5jZSBhbHRlciBtYXkgYmUgY2hvcmRtb2RlIGVsZW1lbnQKICAgIGlmIChhbHRlci55ID4gMyB8fCBhbHRlci55IDwgLTMpIGNvbnRpbnVlOwogICAgaWYgKGFsdGVyLnNvdXJjZSAmJiBhbHRlci5zb3VyY2Uuc3Vic3RyKDAsIDQpID09PSAiXFxrZXkiKSBsYXN0QWx0ZXIgPSBhbHRlcjsKICAgIC8vIGJyZWFrIGtleSBjaGFpbiBhdCBsYXJnZSBnYXAKICAgIGVsc2UgaWYgKGxhc3RBbHRlciAmJiBhbHRlci54IC0gbGFzdEFsdGVyLnggPiAyKSBicmVhaztlbHNlIGlmIChhbHRlci54IDwgaGVhZFgpIGxhc3RBbHRlciA9IGFsdGVyOwogICAgLy8gY29udGludWUga2V5IGNoYWluCiAgICBlbHNlIGlmIChsYXN0QWx0ZXIgJiYgYWx0ZXIueCAtIGxhc3RBbHRlci54IDwgMS4yKSBsYXN0QWx0ZXIgPSBhbHRlcjtlbHNlIGJyZWFrOwogICAgYWx0ZXIuYWRkU3ltYm9sKCJLRVkiKTsKICB9CiAgLy8gYWZmaWxpYXRlIGFjY2lkZW50YWwgYWx0ZXJzIHRvIG5vdGVzCiAgY29uc3QgYWNjcyA9IGFsdGVycy5maWx0ZXIoYWx0ZXIgPT4gIWFsdGVyLmlzKCJLRVkiKSAmJiAhYWx0ZXIuaHJlZik7CiAgYWNjcy5mb3JFYWNoKGFsdGVyID0+IHsKICAgIGNvbnN0IG5vdGVoZWFkID0gbm90ZXMuZmluZChub3RlID0+IG5vdGUucnkgPT09IGFsdGVyLnJ5ICYmIG5vdGUueCA+IGFsdGVyLnggJiYgbm90ZS54IC0gYWx0ZXIueCA8IDUpOwogICAgaWYgKG5vdGVoZWFkKSBhbHRlci5zdGVtWCA9IG5vdGVoZWFkLmxvZ2ljWCAtIGNvbnN0YW50cy5FUFNJTE9OO2Vsc2UgewogICAgICBhbHRlci5hZGRTeW1ib2woIk5PVElDRSIpOwogICAgICBsb2dnZXIuYXBwZW5kKCJvcnBoYW5BbHRlciIsIGFsdGVyKTsKICAgIH0KICB9KTsKICAvL2xvZ2dlci5hcHBlbmQoIm1lYXN1cmVSYW5nZXM6Iiwge21lYXN1cmVSYW5nZXMsIGFjY3N9KTsKICBjb25zdCBtZWFzdXJlcyA9IG1lYXN1cmVSYW5nZXMubWFwKChyYW5nZSwgaSkgPT4gewogICAgY29uc3QgbGVmdCA9IGkgPiAwID8gbWVhc3VyZVJhbmdlc1tpIC0gMV0ubm90ZVJhbmdlLmVuZCA6IC1JbmZpbml0eTsKICAgIGNvbnN0IHRva2VucyA9IGxvY2FsVG9rZW5zLmZpbHRlcih0b2tlbiA9PiAhaXNTdGFmZlRva2VuKHRva2VuKSAmJiB0b2tlbi5sb2dpY1ggPiBsZWZ0ICYmICh0b2tlbi5sb2dpY1ggPCByYW5nZS5ub3RlUmFuZ2UuZW5kIHx8IGkgPT09IG1lYXN1cmVSYW5nZXMubGVuZ3RoIC0gMSkpLnNvcnQoKHQxLCB0MikgPT4gdDEubG9naWNYIC0gdDIubG9naWNYKTsKICAgIGNvbnN0IGxlZnROb3RlWCA9IE1hdGgubWluKC4uLnRva2Vucy5maWx0ZXIodG9rZW4gPT4gdG9rZW4uaXMoIk5PVEUiKSkubWFwKG5vdGUgPT4gbm90ZS54KSwgbGVmdCArIDIuOSk7CiAgICAvLyBtYXJrIHZvbHRhIHJlcGVhdCBkb3RzCiAgICBjb25zdCBkb3RzID0gdG9rZW5zLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5pcygiRE9UIikgJiYgTWF0aC5hYnModG9rZW4ucnkpID09PSAwLjUpOwogICAgY29uc3QgZG90c0wgPSBkb3RzLmZpbHRlcihkb3QgPT4gZG90LnggPCBsZWZ0Tm90ZVgpOyAvLyBkb3VibGUgbGluZXMgd2lsbCBlbmxhcmdlIGxlZnQgbGluZSBpbnRlcnZhbAogICAgY29uc3QgZG90c1IgPSBkb3RzLmZpbHRlcihkb3QgPT4gZG90LnggPiByYW5nZS5ub3RlUmFuZ2UuZW5kIC0gMSk7CiAgICBbZG90c0wsIGRvdHNSXS5mb3JFYWNoKChwYWlyLCBpKSA9PiB7CiAgICAgIGlmIChwYWlyLmxlbmd0aCA9PT0gMiAmJiBwYWlyWzBdLnJ5ICogcGFpclsxXS5yeSA8IDApIHsKICAgICAgICBwYWlyLmZvckVhY2goZG90ID0+IHsKICAgICAgICAgIGRvdC5hZGRTeW1ib2woaSA/ICJSSUdIVCIgOiAiTEVGVCIpOwogICAgICAgICAgZG90LmFkZFN5bWJvbCgiVk9MVEEiKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gewogICAgICB0b2tlbnMsCiAgICAgIG5vdGVSYW5nZTogcmFuZ2Uubm90ZVJhbmdlLAogICAgICBoZWFkWDogcmFuZ2UuaGVhZFgKICAgIH07CiAgfSk7CiAgY29uc3QgaGVhZFdpZHRoID0gbWVhc3VyZXNbMF0gPyBtZWFzdXJlc1swXS5oZWFkWCA6IDA7CiAgcmV0dXJuIHsKICAgIHg6IDAsCiAgICB5LAogICAgaGVhZFdpZHRoLAogICAgdG9wLAogICAgdG9rZW5zOiBsb2NhbFRva2Vucy5maWx0ZXIoaXNTdGFmZlRva2VuKSwKICAgIG1lYXN1cmVzCiAgfTsKfTsKY29uc3QgaXNQYWdlVG9rZW4gPSB0b2tlbiA9PiB0b2tlbi5pcygiVEVYVCIpICYmICF0b2tlbi5zb3VyY2U7CmNvbnN0IG9yZ2FuaXplVG9rZW5zID0gKHRva2Vucywgc291cmNlLCB7CiAgbG9nZ2VyLAogIHZpZXdCb3gsCiAgd2lkdGgsCiAgaGVpZ2h0Cn0gPSB7fSkgPT4gewogIC8vbG9nZ2VyLmFwcGVuZCgib3JnYW5pemVUb2tlbnMiLCB0b2tlbnMpOwogIC8vIGFkZGVkIHNvdXJjZSBvbiB0b2tlbnMKICB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7CiAgICBjb25zdCBwb3MgPSB0b2tlbi5zb3VyY2VQb3NpdGlvbjsKICAgIGlmIChwb3MpIHsKICAgICAgLy90b2tlbi5zb3VyY2UgPSBseUxpbmVzW3Bvcy5saW5lIC0gMV0uc3Vic3RyKHBvcy5zdGFydCwgTWF0aC5tYXgocG9zLmVuZCAtIHBvcy5zdGFydCwgOCkpOwogICAgICB0b2tlbi5zb3VyY2UgPSBzb3VyY2Uuc2xpY2UocG9zLmxpbmUsIFtwb3Muc3RhcnQsIE1hdGgubWF4KHBvcy5lbmQsIHBvcy5zdGFydCArIDgpXSk7CiAgICAgIC8vIGVubGFyZ2UgdG9rZW4gc291cmNlIHJhbmdlIGZvciBjb21tYW5kIHRva2VucwogICAgICBpZiAoL15cXC8udGVzdCh0b2tlbi5zb3VyY2UpKSB7CiAgICAgICAgZm9yIChsZXQgbGVuID0gdG9rZW4uc291cmNlLmxlbmd0aCArIDE7IGxlbiA8IDgwOyArK2xlbikgewogICAgICAgICAgY29uc3QgY2FwdHVyZXMgPSB0b2tlbi5zb3VyY2UubWF0Y2goL1xzKy9nKTsKICAgICAgICAgIGlmIChjYXB0dXJlcyAmJiBjYXB0dXJlcy5sZW5ndGggPj0gMikgYnJlYWs7CiAgICAgICAgICB0b2tlbi5zb3VyY2UgPSBzb3VyY2Uuc2xpY2UocG9zLmxpbmUsIFtwb3Muc3RhcnQsIHBvcy5zdGFydCArIGxlbl0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0pOwogIGNvbnN0IG1lYW5pbmdmdWxUb2tlbnMgPSB0b2tlbnMuZmlsdGVyKHRva2VuID0+ICF0b2tlbi5pcygiTlVMTCIpKTsKICAvL2xvZ2dlci5hcHBlbmQoIm9yZ2FuaXplVG9rZW5zLm1lYW5pbmdmdWxUb2tlbnMiLCBtZWFuaW5nZnVsVG9rZW5zKTsKICBjb25zdCBwYWdlVG9rZW5zID0gbWVhbmluZ2Z1bFRva2Vucy5maWx0ZXIoaXNQYWdlVG9rZW4pOwogIG1lYW5pbmdmdWxUb2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7CiAgICBpZiAodG9rZW4uc291cmNlKSB7CiAgICAgIC8vIHByb2Nlc3MgdGVtcG8gbm90ZWhlYWRzCiAgICAgIGlmICh0b2tlbi5zb3VyY2Uuc3Vic3RyKDAsIDYpID09PSAiXFx0ZW1wbyIgJiYgdG9rZW4uaXMoIk5PVEVIRUFEIikpIHsKICAgICAgICB0b2tlbi5yZW1vdmVTeW1ib2woIk5PVEVIRUFEIik7CiAgICAgICAgdG9rZW4uYWRkU3ltYm9sKCJURU1QT19OT1RFSEVBRCIpOwogICAgICB9CiAgICAgIC8vIHByb2Nlc3MgcGVkIGRvdAogICAgICBpZiAodG9rZW4uaXMoIkRPVCIpICYmIC9eXFxzdXN0YWluLy50ZXN0KHRva2VuLnNvdXJjZSkpIHsKICAgICAgICB0b2tlbi5yZW1vdmVTeW1ib2woIkRPVCIpOwogICAgICAgIHRva2VuLmFkZFN5bWJvbCgiU1VTVEFJTiIsICJQRURfRE9UIik7CiAgICAgIH0KICAgICAgLy8gdHJlbW9sbyBiZWFtcyBwaWVyY2VkCiAgICAgIGlmICh0b2tlbi5pcygiQkVBTSIpICYmIC9eOlxkKy8udGVzdCh0b2tlbi5zb3VyY2UpKSB7CiAgICAgICAgdG9rZW4ucmVtb3ZlU3ltYm9sKCJOT1RFVEFJTCIpOwogICAgICAgIHRva2VuLnJlbW92ZVN5bWJvbCgiSk9JTlQiKTsKICAgICAgICB0b2tlbi5hZGRTeW1ib2woIlRSRU1PTE9fQkVBTSIpOwogICAgICAgIHRva2VuLmFkZFN5bWJvbCgiUElFUkNFRCIpOwogICAgICB9CiAgICAgIC8vIHRyZW1vbG8gYmVhbXMgcGFpcmVkCiAgICAgIGlmICh0b2tlbi5pcygiQkVBTSIpICYmIC9yZXBlYXQgdHJlbW9sby8udGVzdCh0b2tlbi5zb3VyY2UpKSB7CiAgICAgICAgdG9rZW4ucmVtb3ZlU3ltYm9sKCJOT1RFVEFJTCIpOwogICAgICAgIHRva2VuLmFkZFN5bWJvbCgiVFJFTU9MT19CRUFNIik7CiAgICAgICAgdG9rZW4uYWRkU3ltYm9sKCJUUkVNT0xPX1BBSVIiKTsKICAgICAgfQogICAgICAvLyBnbGlzc2FuZG8KICAgICAgaWYgKC9eXFxnbGlzc2FuZG8vLnRlc3QodG9rZW4uc291cmNlKSkgewogICAgICAgIHRva2VuLnJlbW92ZVN5bWJvbCgiVFJfV0FWRSIpOwogICAgICAgIHRva2VuLmFkZFN5bWJvbCgiR0xJU1NBTkRPIik7CiAgICAgIH0KICAgICAgLy8gYXJwZWdnaW8KICAgICAgaWYgKC9eXFxhcnBlZ2dpby8udGVzdCh0b2tlbi5zb3VyY2UpKSB0b2tlbi5hZGRTeW1ib2woIkFSUEVHR0lPIik7CiAgICB9CiAgfSk7CiAgY29uc3Qgc3lzdGVtRGF0YXMgPSB0b2tlbnNTeXN0ZW1zU3BsaXQobWVhbmluZ2Z1bFRva2Vucy5maWx0ZXIodG9rZW4gPT4gIWlzUGFnZVRva2VuKHRva2VuKSksIGxvZ2dlcik7CiAgLy9sb2dnZXIuYXBwZW5kKCJvcmdhbml6ZVRva2Vucy5zeXN0ZW1EYXRhcyIsIHN5c3RlbURhdGFzKTsKICBjb25zdCBzeXN0ZW1zID0gc3lzdGVtRGF0YXMubWFwKCh7CiAgICB0b2tlbnMsCiAgICBzdGFja3MKICB9KSA9PiBwYXJzZVRva2VuU3lzdGVtKHRva2Vucywgc3RhY2tzLCBsb2dnZXIpKS5maWx0ZXIoc3lzdGVtID0+IHN5c3RlbS5zdGF2ZXMubGVuZ3RoID4gMCk7CiAgcmV0dXJuIHsKICAgIHRva2VuczogcGFnZVRva2VucywKICAgIHN5c3RlbXMsCiAgICB2aWV3Qm94LAogICAgd2lkdGgsCiAgICBoZWlnaHQKICB9Owp9OwpleHBvcnQgZGVmYXVsdCBvcmdhbml6ZVRva2Vuczs="},{"version":3,"names":["POS_PRECISION","constants","LineStack","constructor","root","translation","x","y","lines","tip","length","rect","_rect","ys","map","token","height","left","Math","min","right","max","width","top","bottom","tryAppend","line","ry","abs","push","tryAttachConnection","connection","index","systemIndex","tryAttachStaff","staffIndex","contains","translate","parseAdditionalLineStacks","tokens","filter","is","sort","t1","t2","stacks","forEach","stack","tokensSystemsSplit","logger","append","pageHeight","pageTile","Array","round","fill","crossedCount","connections","outStaff","out","i","start","end","lineStacks","validLineStacks","floor","ceil","topTokens","topAtSystem","nextIndex","find","interStems","stem","bottomIndex","systemBoundaries","reduce","boundaries","Infinity","systems","withUp","withDown","c","console","warn","source","logicY","system","logicX","parseChordsByStems","stems","notes","rightAttached","note","stemAttached","NOTE_TYPE_JOINT_Y","noteType","scale","href","leftAttached","NOTE_TYPE_WIDTHS","addSymbol","n","up","stemUp","anchorNote","anchorToken","assign","stemX","division","isSystemToken","parseTokenSystem","separatorYs","Set","measureSeparators","add","from","has","delete","removeSymbol","staffLines","size","Object","keys","Number","topLineYs","staffYs","y1","y2","additionalLines","l1","l2","additionalLinesYs","systemY","systemX","rx","noteYs","concat","splitters","down","splitter","findStaffByStacks","localTokens","slashes","target","backSlashes","staffTokens","appendToken","jointStems","centerX","k","contactedStems","dy","crossedStems","beamY","atTip","beam","flagNumber","includes","partner","t","sy","indexByStacks","isInteger","separatorXsRaw","x1","x2","measureRanges","headX","noteRange","begin","staves","parseTokenStaff","isStaffToken","alters","lastAlter","alter","substr","accs","notehead","EPSILON","measures","range","leftNoteX","dots","dotsL","dot","dotsR","pair","headWidth","isPageToken","organizeTokens","viewBox","pos","sourcePosition","slice","test","len","captures","match","meaningfulTokens","pageTokens","systemDatas"],"sources":["/home/camus/work/lotus/node_modules/eslint-loader/index.js??ref--14-0!/home/camus/work/lotus/inc/staffSvg/organizeTokens.ts"],"sourcesContent":["\nimport {POS_PRECISION, constants} from \"./utils\";\n\nimport type StaffToken from \"./staffToken\";\nimport type {SheetStaff} from \"./sheetDocument\";\nimport type TextSource from \"../textSource\";\n\n\n\ninterface Rect {\n\tleft: number;\n\tright: number;\n\ttop: number;\n\tbottom: number;\n};\n\n\ntype IConnection = {y: number, height: number};\n\n\nclass LineStack {\n\tlines: StaffToken[];\n\ttranslation = {x: 0, y: 0};\n\n\tsystemIndex?: number;\n\tstaffIndex?: number;\n\n\t_rect?: Rect;\n\n\n\tconstructor (root) {\n\t\tthis.lines = [root];\n\t}\n\n\n\t// the bottom line\n\tget tip (): StaffToken {\n\t\treturn this.lines[this.lines.length - 1];\n\t}\n\n\n\tget rect (): {left: number, right: number, top: number, bottom: number} {\n\t\tif (!this._rect) {\n\t\t\tconst ys = this.lines.map(token => token.y + token.height / 2);\n\n\t\t\tthis._rect = {\n\t\t\t\tleft: Math.min(...this.lines.map(token => token.x)),\n\t\t\t\tright: Math.max(...this.lines.map(token => token.x + token.width)),\n\t\t\t\ttop: ys[0],\n\t\t\t\tbottom: ys[ys.length - 1],\n\t\t\t};\n\t\t}\n\n\t\treturn this._rect;\n\t}\n\n\n\ttryAppend (line: StaffToken): boolean {\n\t\tif (line.ry - this.tip.ry === 1 && Math.abs(line.x - this.tip.x) < 2) {\n\t\t\tthis.lines.push(line);\n\n\t\t\tthis._rect = null;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\ttryAttachConnection (connection: IConnection, index: number): boolean {\n\t\tconst {top, bottom} = this.rect;\n\n\t\t//console.log(\"connection:\", connection.y + connection.height, top - 1.2);\n\n\t\tconst y = connection.y + this.translation.y;\n\n\t\tif (bottom + 1.6 > y && top - 1.6 < y + connection.height) {\n\t\t\tthis.systemIndex = index;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\ttryAttachStaff (y: number, index: number): boolean {\n\t\tconst {top, bottom} = this.rect;\n\n\t\ty += this.translation.y;\n\n\t\tif (bottom + 3.2 > y && top - 3.2 < y) {\n\t\t\tthis.staffIndex = index;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\tcontains (token: StaffToken) {\n\t\tconst {left, right, top, bottom} = this.rect;\n\n\t\tconst x = token.x + this.translation.x;\n\t\tconst y = token.y + this.translation.y;\n\n\t\treturn x > left - 1.6 && x < right - 1 && y > top - 0.6 && y < bottom + 0.6;\n\t}\n\n\n\ttranslate ({x = 0, y = 0} = {}) {\n\t\tthis.translation.x += x;\n\t\tthis.translation.y += y;\n\t}\n};\n\n\nconst parseAdditionalLineStacks = (tokens: StaffToken[]): LineStack[] => {\n\tconst lines = tokens.filter(token => token.is(\"ADDITIONAL_LINE\")).sort((t1, t2) => t1.y - t2.y);\n\n\tconst stacks: LineStack[] = [];\n\n\tlines.forEach(line => {\n\t\tfor (const stack of stacks) {\n\t\t\tif (stack.tryAppend(line))\n\t\t\t\treturn;\n\t\t}\n\n\t\tstacks.push(new LineStack(line));\n\t});\n\n\treturn stacks;\n};\n\n\nconst tokensSystemsSplit = (tokens: StaffToken[], logger) => {\n\tif (!tokens.length) {\n\t\tlogger.append(\"tokensSystemsSplit.emptyTokens\");\n\t\treturn [];\n\t}\n\n\tconst pageHeight = Math.max(...tokens.map(token => token.y));\n\tconst pageTile = Array(Math.round(pageHeight)).fill(-1);\n\n\tlet crossedCount = 0;\n\n\tconst connections: IConnection[] = tokens.filter(token => token.is(\"STAVES_CONNECTION\")) as IConnection[];\n\tif (!connections.length) {\n\t\t// single line system, split by staff lines\n\t\tconst lines = tokens.filter(token => token.is(\"STAFF_LINE\"));\n\t\tlines.forEach(line => pageTile[Math.round(line.y)] = 0);\n\n\t\t// non-staff page\n\t\tif (!lines.length) {\n\t\t\tlogger.append(\"tokensSystemsSplit.noConnetionsOrLines\", {tokens});\n\t\t\treturn [];\n\t\t}\n\n\t\tlet index = -1;\n\t\tlet outStaff = true;\n\t\tfor (let y = 0; y < pageTile.length; ++y) {\n\t\t\tconst out = pageTile[y] < 0;\n\t\t\tif (outStaff && !out) {\n\t\t\t\t++index;\n\n\t\t\t\t// append connection placeholder\n\t\t\t\tconnections.push({y, height: 4});\n\t\t\t}\n\n\t\t\tif (!out)\n\t\t\t\tpageTile[y] = index;\n\n\t\t\toutStaff = out;\n\t\t}\n\t}\n\telse {\n\t\tconnections.forEach((connection, i) => {\n\t\t\tconst start = Math.round(connection.y) - 1;\n\t\t\tconst end = Math.round(connection.y + connection.height) + 1;\n\n\t\t\tlet index = i - crossedCount;\n\n\t\t\tfor (let y = start; y <= end; ++y) {\n\t\t\t\tif (pageTile[y] >= 0) {\n\t\t\t\t\tindex = pageTile[y];\n\t\t\t\t\t++crossedCount;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (let y = start; y <= end; ++y) \n\t\t\t\tpageTile[y] = index;\n\t\t});\n\t}\n\n\t//logger.append(\"tokensSystemsSplit.pageTile.0\", [...pageTile]);\n\t//logger.append(\"tokensSystemsSplit.connections\", connections);\n\n\tconst lineStacks = parseAdditionalLineStacks(tokens);\n\tlineStacks.forEach(stack => {\n\t\tfor (let i = 0; i < connections.length; ++i) {\n\t\t\tif (stack.tryAttachConnection(connections[i], i))\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t//logger.append(\"tokensSystemsSplit.lineStacks\", lineStacks);\n\tconst validLineStacks = lineStacks.filter(stack => stack.systemIndex >= 0);\n\tif (validLineStacks.length < lineStacks.length)\n\t\tlogger.append(\"tokensSystemsSplit.invalidLineStacks\", lineStacks.filter(stack => !(stack.systemIndex >= 0)));\n\n\t// fill page tile by line stacks\n\tvalidLineStacks.forEach(stack => {\n\t\tconst {top, bottom} = stack.rect;\n\t\tfor (let y = Math.floor(top) - 1; y < Math.ceil(bottom); ++y) {\n\t\t\tif (pageTile[y] < 0)\n\t\t\t\tpageTile[y] = stack.systemIndex;\n\t\t}\n\t});\n\n\t// fill interval between top tokens and system top\n\tconst topTokens = tokens.filter(token => token.topAtSystem);\n\ttopTokens.forEach(token => {\n\t\tconst nextIndex = pageTile.find((index, y) => y > token.y && index >= 0);\n\t\tfor (let y = Math.floor(token.y) - 1; y < pageHeight; ++y) {\n\t\t\tif (pageTile[y] >= 0)\n\t\t\t\tbreak;\n\n\t\t\tpageTile[y] = nextIndex;\n\t\t}\n\t});\n\n\t//logger.append(\"tokensSystemsSplit.octaveAs\", octaveAs);\n\n\t// enlarge page tile by intersection stems\n\tconst interStems = tokens.filter(token => token.is(\"NOTE_STEM\")\n\t\t&& pageTile[Math.round(token.y)] === -1\n\t\t&& pageTile[Math.round(token.y)] !== pageTile[Math.round(token.y + token.height)]);\n\tinterStems.forEach(stem => {\n\t\tconst bottomIndex = pageTile[Math.round(stem.y + stem.height)];\n\t\tif (bottomIndex > 0) {\n\t\t\tfor (let y = Math.round(stem.y + stem.height) - 1; y >= Math.round(stem.y); --y)\n\t\t\t\tpageTile[y] = bottomIndex;\n\t\t}\n\t});\n\n\t//logger.append(\"tokensSystemsSplit.pageTile.2\", pageTile);\n\n\tconst systemBoundaries = pageTile.reduce((boundaries, index, y) => {\n\t\tif (index >= boundaries.length)\n\t\t\tboundaries.push(y - 1);\n\n\t\treturn boundaries;\n\t}, []);\n\n\tsystemBoundaries[0] = -Infinity;\n\t//logger.append(\"tokensSystemsSplit.systemBoundaries\", systemBoundaries);\n\n\tconst systems = Array(systemBoundaries.length).fill(null).map(() => ({tokens: [], stacks: []}));\n\n\tvalidLineStacks.forEach(stack => systems[stack.systemIndex] && systems[stack.systemIndex].stacks.push(stack));\n\t//logger.append(\"tokensSystemsSplit.validLineStacks\", {systems, validLineStacks});\n\n\ttokens.forEach(token => {\n\t\tfor (const stack of validLineStacks) {\n\t\t\tif (stack.contains(token)) {\n\t\t\t\tif (systems[stack.systemIndex]) {\n\t\t\t\t\tsystems[stack.systemIndex].tokens.push(token);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tlogger.append(\"tokensSystemsSplit.invalidStackSystemIndex\", {stack, systems});\n\t\t\t}\n\t\t}\n\n\t\tif (token.withUp || token.withDown) {\n\t\t\tlet index = 0;\n\t\t\tif (token.withUp)\n\t\t\t\tindex = connections.filter(c => c.y + c.height < token.y).length;\n\t\t\telse\n\t\t\t\tindex = Math.max(connections.filter(c => c.y < token.y).length - 1, 0);\n\n\t\t\tif (systems[index])\n\t\t\t\tsystems[index].tokens.push(token);\n\t\t\telse\n\t\t\t\tconsole.warn(\"tokensSystemsSplit: invalid system index:\", index, systems.length, token.source);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst y = token.logicY;\n\t\tfor (let i = 0; i < systemBoundaries.length; ++i) {\n\t\t\tif (y >= systemBoundaries[i] && (i >= systemBoundaries.length - 1 || y < systemBoundaries[i + 1])) {\n\t\t\t\tsystems[i].tokens.push(token);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t});\n\n\tsystems.forEach(system => system.tokens = system.tokens.sort((t1, t2) => t1.logicX - t2.logicX));\n\n\treturn systems;\n};\n\n\nconst parseChordsByStems = (tokens: StaffToken[], logger) => {\n\tconst stems = tokens.filter(token => token.is(\"NOTE_STEM\"));\n\tconst notes = tokens.filter(token => token.is(\"NOTEHEAD\") || token.is(\"TEMPO_NOTEHEAD\"));\n\n\tstems.forEach(stem => {\n\t\tconst rightAttached = notes.filter(note => stem.stemAttached({\n\t\t\tx: note.x,\n\t\t\ty: note.y + constants.NOTE_TYPE_JOINT_Y[note.noteType] * (note.scale || 1),\n\t\t\thref: note.href,\n\t\t}));\n\t\tconst leftAttached = notes.filter(note => stem.stemAttached({\n\t\t\tx: note.x + constants.NOTE_TYPE_WIDTHS[note.noteType] * (note.scale || 1),\n\t\t\ty: note.y - constants.NOTE_TYPE_JOINT_Y[note.noteType] * (note.scale || 1),\n\t\t\thref: note.href,\n\t\t}));\n\n\t\tif (rightAttached.length + leftAttached.length <= 0) {\n\t\t\tlogger.append(\"parseChordsByStems.baldStem:\", stem);\n\t\t\t//console.warn(\"bald stem:\", stem);\n\n\t\t\tstem.addSymbol(\"BALD\");\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst ys = [...rightAttached.map(n => n.y), ...leftAttached.map(n => n.y)];\n\t\tconst top = Math.abs(stem.y - Math.min(...ys));\n\t\tconst bottom = Math.abs(stem.y + stem.height - Math.max(...ys));\n\n\t\tconst up = top < bottom;\n\t\t//console.assert(up || leftAttached.length, \"unexpected stem, downwards but no left-attached notes.\");\n\t\t//console.assert(!up || rightAttached.length, \"unexpected stem, upwards but no right-attached notes.\");\n\n\t\tstem.stemUp = !up;\n\n\t\tconst anchorNote = up ? rightAttached[0] : leftAttached[0];\n\t\tconst anchorToken = anchorNote || stem;\n\n\t\tconst assign = note => {\n\t\t\tnote.stemX = anchorToken.x;\n\t\t\tnote.stemUp = !up;\n\n\t\t\tnote.stems = note.stems || [];\n\t\t\tnote.stems.push(stem.index);\n\t\t};\n\n\t\trightAttached.forEach(assign);\n\t\tleftAttached.forEach(assign);\n\n\t\tif (!anchorNote) {\n\t\t\tstem.addSymbol(\"NOTICE\");\n\t\t\tlogger.append(\"parseChordsByStems.unexpectedStem\", {stem, ys, rightAttached, leftAttached});\n\t\t}\n\t\telse if (anchorNote.is(\"HALF\"))\n\t\t\tstem.division = 1;\n\t});\n};\n\n\nconst isSystemToken = token => token.is(\"STAVES_CONNECTION\") || token.is(\"BRACE\") || token.is(\"VERTICAL_LINE\");\n\n//const roundJoin = (x, y) => `${Math.round(x)},${Math.round(y)}`;\n\n\nconst parseTokenSystem = (tokens: StaffToken[], stacks: LineStack[], logger) => {\n\tconst separatorYs : Set = new Set();\n\tconst measureSeparators = tokens.filter(token => token.is(\"MEASURE_SEPARATOR\"));\n\tmeasureSeparators.forEach(token => separatorYs.add(token.ry));\n\t//logger.append(\"parseTokenSystem.measureSeparators\", Array.from(measureSeparators));\n\n\t// remove separator Y from fake MEASURE_SEPARATOR\n\tfor (const y of Array.from(separatorYs).sort()) {\n\t\tif (separatorYs.has(y - 4) && separatorYs.has(y + 4)) {\n\t\t\tseparatorYs.delete(y);\n\n\t\t\tmeasureSeparators.filter(token => token.ry === y).forEach(token => {\n\t\t\t\ttoken.removeSymbol(\"MEASURE_SEPARATOR\");\n\t\t\t\ttoken.addSymbol(\"VERTICAL_LINE\");\n\t\t\t});\n\t\t}\n\t}\n\n\t//logger.append(\"parseTokenSystem.separatorYs\", Array.from(separatorYs));\n\n\tconst staffLines = tokens.filter(token => token.is(\"STAFF_LINE\")).reduce((lines, token) => {\n\t\tif (!lines[token.ry] || lines[token.ry].x > token.x)\n\t\t\tlines[token.ry] = token;\n\t\treturn lines;\n\t}, {});\n\t//logger.append(\"parseTokenSystem.staffLines\", Object.keys(staffLines));\n\n\t// construct staff Y from staff lines when no separators\n\tif (!separatorYs.size) {\n\t\tconst ys = Object.keys(staffLines).map(Number);\n\t\tconst topLineYs = ys.filter(y => staffLines[y + 3] && staffLines[y + 4]);\n\n\t\ttopLineYs.forEach(y => separatorYs.add(y));\n\t}\n\n\tconst staffYs = Array.from(separatorYs)\n\t\t.filter(y => staffLines[y] || staffLines[y + POS_PRECISION])\n\t\t.map(y => staffLines[y] ? y : y + POS_PRECISION).map(y => y + 2)\n\t\t.sort((y1, y2) => y1 - y2)\n\t\t.filter(y => staffLines[y - 2] && staffLines[y] && staffLines[y + 2]);\n\t//logger.append(\"parseTokenSystem.staffYs\", staffYs);\n\n\tconst additionalLines = tokens.filter(token => token.is(\"ADDITIONAL_LINE\")).sort((l1, l2) => l1.y - l2.y);\n\tconst additionalLinesYs = additionalLines.reduce((ys, token) => {\n\t\tys.add(token.ry);\n\t\treturn ys;\n\t}, new Set());\n\t//logger.append(\"parseTokenSystem.additionalLinesYs\", Array.from(additionalLinesYs));\n\n\t/*for (const y of staffYs) {\n\t\tconsole.assert(staffLines[y - 2] && staffLines[y] && staffLines[y + 2],\n\t\t\t\"no corresponding staff lines for separator\", y - 2, Object.keys(staffLines));\n\t}*/\n\n\tconst systemY = staffYs[0] - 2;\n\tconst systemX = staffLines[systemY] && staffLines[systemY].rx;\n\n\tconst noteYs = tokens\n\t\t.filter(token => token.is(\"NOTE\") && !token.is(\"TEMPO_NOTEHEAD\"))\n\t\t.map(token => token.ry)\n\t\t.concat(Object.keys(staffLines).map(Number));\n\n\tconst top = Math.min(...noteYs) - systemY;\n\tconst bottom = Math.max(...noteYs) - systemY;\n\n\t//console.log(\"additionalLinesYs:\", additionalLinesYs);\n\tconst splitters = [];\n\tfor (let i = 0; i < staffYs.length - 1; ++i) {\n\t\tlet up = staffYs[i] + 2;\n\t\twhile (additionalLinesYs.has(up + 1))\n\t\t\t++up;\n\n\t\tlet down = staffYs[i + 1] - 2;\n\t\twhile (additionalLinesYs.has(down - 1))\n\t\t\t--down;\n\n\t\t//const splitter = Math.min(Math.max((staffYs[i] + staffYs[i + 1]) / 2, up + 1), down - 1) - systemY;\n\t\tconst splitter = (up + down) / 2 - systemY;\n\t\tsplitters.push(splitter);\n\n\t\t//logger.append(\"parseTokenSystem.splitter\", {splitter, up, down, systemY});\n\t}\n\tsplitters.push(Infinity);\n\n\n\tstacks.forEach(stack => {\n\t\tfor (let i = 0; i < staffYs.length; ++i) {\n\t\t\tif (stack.tryAttachStaff(staffYs[i], i))\n\t\t\t\treturn;\n\t\t}\n\t});\n\n\tconst findStaffByStacks = token => {\n\t\tfor (const stack of stacks) {\n\t\t\tif (stack.contains(token))\n\t\t\t\treturn stack.staffIndex;\n\t\t}\n\t};\n\n\tconst localTokens = tokens.map(token => token.translate({x: -systemX, y: -systemY}));\n\tconst stems = localTokens.filter(token => token.is(\"NOTE_STEM\"));\n\tstems.forEach(stem => stem.division = 2);\n\n\tconst slashes = localTokens.filter(token => token.is(\"LINE\") && token.target && token.target.x > 0 && token.target.y < 0);\n\tconst backSlashes = localTokens.filter(token => token.is(\"LINE\") && token.target && token.target.x > 0 && token.target.y > 0);\n\n\tconst staffTokens = [];\n\t//console.log(\"splitters:\", splitters);\n\tconst appendToken = (token: StaffToken) => {\n\t\tif (token.is(\"BEAM\")) {\n\t\t\tconst jointStems = stems.filter(stem => Math.abs(stem.centerX - token.x) < 0.1\n\t\t\t\t&& (Math.abs(token.y - stem.y) < 0.2 || Math.abs(token.y - (stem.y + stem.height)) < 0.2));\n\n\t\t\tconst k = (token.target.y - token.start.y) / (token.target.x - token.start.x);\n\t\t\tconst contactedStems = stems.filter(stem => {\n\t\t\t\tconst dy = (stem.x - (token.x + token.start.x)) * k;\n\t\t\t\treturn stem.centerX - (token.x + token.start.x) > -0.1 && stem.centerX - (token.x + token.target.x) < 0.1\n\t\t\t\t\t&& token.y + dy - stem.y > -0.2 && token.y + dy - (stem.y + stem.height) < 0.2;\n\t\t\t});\n\n\t\t\tif (!contactedStems.length) {\n\t\t\t\ttoken.removeSymbol(\"NOTETAIL\");\n\t\t\t\ttoken.removeSymbol(\"JOINT\");\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttoken.stems = contactedStems.map(stem => stem.index);\n\n\t\t\t\tif (jointStems.length)\n\t\t\t\t\ttoken.addSymbol(\"CAPITAL_BEAM\");\n\n\t\t\t\tconst k = (token.target.y - token.start.y) / (token.target.x - token.start.x);\n\n\t\t\t\t// append stem division\n\t\t\t\tconst crossedStems = stems.filter(stem =>\n\t\t\t\t\tstem.centerX > token.x - 0.1 && stem.centerX < token.x + token.target.x + 0.1\n\t\t\t\t&& stem.y < Math.max(token.y, token.y + token.target.y) + 0.2\n\t\t\t\t&& stem.y + stem.height > Math.min(token.y, token.y + token.target.y) - 0.2);\n\t\t\t\tcrossedStems.forEach(stem => {\n\t\t\t\t\tconst beamY = (stem.centerX - token.x + token.start.x) * k + token.y + token.start.y;\n\t\t\t\t\tif (beamY > stem.y - 0.2 && beamY < stem.y + stem.height + 0.2) {\n\t\t\t\t\t\tconst atTip = stem.stemUp ? beamY < stem.y + 3.2 : beamY > stem.y + stem.height - 3.2;\n\t\t\t\t\t\tif (atTip) {\n\t\t\t\t\t\t\t++stem.division;\n\n\t\t\t\t\t\t\tif (token.is(\"CAPITAL_BEAM\"))\n\t\t\t\t\t\t\t\tstem.beam = token.index;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (token.is(\"FLAG UP\")) {\n\t\t\tconst stem = stems.find(stem => Math.abs(stem.x + stem.width - token.x) < 0.04 && Math.abs(stem.y - token.y) < 0.1);\n\t\t\tif (stem) {\n\t\t\t\ttoken.stem = stem.index;\n\t\t\t\tstem.division = token.flagNumber;\n\t\t\t}\n\t\t\telse\n\t\t\t\ttoken.addSymbol(\"SUSPENDED\");\n\t\t}\n\n\t\tif (token.is(\"FLAG DOWN\")) {\n\t\t\tconst stem = stems.find(stem => Math.abs(stem.x + stem.width - token.x) < 0.04 && Math.abs(stem.y + stem.height - token.y) < 0.1);\n\t\t\tif (stem) {\n\t\t\t\ttoken.stem = stem.index;\n\t\t\t\tstem.division = token.flagNumber;\n\t\t\t}\n\t\t\telse\n\t\t\t\ttoken.addSymbol(\"SUSPENDED\");\n\t\t}\n\n\t\tif (slashes.includes(token)) {\n\t\t\tconst partner = backSlashes.find(t => t.x === token.x && t.target.y === - token.target.y);\n\t\t\tif (partner) {\n\t\t\t\tif (token.y <= partner.y) {\n\t\t\t\t\ttoken.addSymbol(\"WEDGE CRESCENDO TOP\");\n\t\t\t\t\tpartner.addSymbol(\"WEDGE CRESCENDO BOTTOM\");\n\t\t\t\t}\n\t\t\t\telse if (token.y > partner.y) {\n\t\t\t\t\ttoken.addSymbol(\"WEDGE DECRESCENDO BOTTOM\");\n\t\t\t\t\tpartner.addSymbol(\"WEDGE DECRESCENDO TOP\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet index = 0;\n\n\t\tif (token.withUp || token.withDown) {\n\t\t\tif (token.withUp)\n\t\t\t\tindex = staffYs.filter(sy => sy + 2 < token.y + systemY).length;\n\t\t\telse if (token.withDown)\n\t\t\t\tindex = Math.max(staffYs.filter(sy => sy - 2 < token.y + systemY).length - 1, 0);\n\t\t}\n\t\telse {\n\t\t\tlet y = token.logicY;\n\t\t\t//const indexInMap = indicesMap[roundJoin(token.x + systemX, y + systemY)];\n\t\t\tconst indexByStacks = findStaffByStacks(token);\n\t\t\tif (Number.isInteger(indexByStacks))\n\t\t\t\tindex = indexByStacks;\n\t\t\telse {\n\t\t\t\t// affiliate beam to a stem\n\t\t\t\tif (token.is(\"NOTETAIL\") && token.is(\"JOINT\")) {\n\t\t\t\t\tconst stem = stems.find(stem => Math.abs(stem.centerX - token.x) < 0.1\n\t\t\t\t\t\t&& token.y > stem.y - 0.2 && token.y < stem.y + stem.height + 0.2);\n\t\n\t\t\t\t\tif (stem)\n\t\t\t\t\t\ty = stem.logicY;\n\t\t\t\t\t//else\n\t\t\t\t\t//\tconsole.debug(\"isolated beam:\", token);\n\t\t\t\t}\n\n\t\t\t\t//if (token.is(\"NOTEHEAD\"))\n\t\t\t\t//\tconsole.log(\"omit note:\", token.href, roundJoin(token.x + systemX, y + systemY));\n\t\t\t\twhile (y > splitters[index])\n\t\t\t\t\t++index;\n\t\t\t}\n\t\t}\n\n\t\tstaffTokens[index] = staffTokens[index] || [];\n\t\tstaffTokens[index].push(token);\n\t};\n\n\tstacks.forEach(stack => stack.translate({x: systemX, y: systemY}));\n\t//logger.append(\"parseTokenSystem.stacks\", stacks);\n\n\tparseChordsByStems(localTokens, logger);\n\n\tlocalTokens\n\t\t.filter(token => !isSystemToken(token))\n\t\t.forEach(appendToken);\n\n\t// measure ranges\n\tconst notes = localTokens.filter(token => token.is(\"NOTE\"));\n\tconst separatorXsRaw = Array.from(new Set(localTokens\n\t\t.filter(token => token.is(\"MEASURE_SEPARATOR\"))\n\t\t.map(token => token.logicX))).sort((x1: number, x2: number) => x1 - x2);\n\n\t// supplement for empty measure separator staff, maybe some lilypond bug if not at end.\n\tif (!separatorXsRaw.length)\n\t\tseparatorXsRaw.push(localTokens[localTokens.length - 1].x + 1);\n\n\tconst measureRanges = separatorXsRaw.map((x, i) => {\n\t\tconst left = i > 0 ? separatorXsRaw[i - 1] : -Infinity;\n\n\t\treturn {\n\t\t\tx,\n\t\t\tnotes: notes.filter(note => note.x > left && note.x < x),\n\t\t};\n\t}).filter(({notes}) => notes.length).map(({x, notes}) => ({\n\t\theadX: notes[0].x - 1.5,\n\t\tnoteRange: {begin: notes[0].x, end: x},\n\t}));\n\t//logger.append(\"parseTokenSystem.measureRanges\", measureRanges);\n\n\treturn {\n\t\tx: systemX,\n\t\ty: systemY,\n\t\ttop,\n\t\tbottom,\n\t\ttokens: localTokens.filter(isSystemToken),\n\t\tstaves: staffYs.map((y, i) => staffTokens[i] && parseTokenStaff({\n\t\t\ttokens: staffTokens[i],\n\t\t\ty: y - systemY,\n\t\t\ttop: splitters[i] - (y - systemY),\n\t\t\tmeasureRanges,\n\t\t\tlogger,\n\t\t})),\n\t};\n};\n\n\nconst isStaffToken = token => token.is(\"STAFF_LINE\") || token.is(\"MEASURE_SEPARATOR\");\n\n\nconst parseTokenStaff = ({tokens, y, top, measureRanges, logger}): SheetStaff => {\n\tconst localTokens = tokens.map(token => token.translate({y: -y}));\n\tconst notes = localTokens.filter(token => token.is(\"NOTE\"));\n\t//logger.append(\"parseTokenStaff.localTokens\", localTokens);\n\n\tconst headX = measureRanges[0] ? measureRanges[0].headX : 0;\n\n\tconst alters = localTokens.filter(token => token.is(\"ALTER\"));\n\tlet lastAlter = null;\n\n\t// mark key alters\n\tfor (const alter of alters) {\n\t\t// far distance alter may be chordmode element\n\t\tif (alter.y > 3 || alter.y < -3)\n\t\t\tcontinue;\n\n\t\tif ((alter.source && alter.source.substr(0, 4) === \"\\\\key\"))\n\t\t\tlastAlter = alter;\n\t\t// break key chain at large gap\n\t\telse if (lastAlter && alter.x - lastAlter.x > 2)\n\t\t\tbreak;\n\t\telse if (alter.x < headX)\n\t\t\tlastAlter = alter;\n\t\t// continue key chain\n\t\telse if (lastAlter && alter.x - lastAlter.x < 1.2)\n\t\t\tlastAlter = alter;\n\t\telse\n\t\t\tbreak;\n\n\t\talter.addSymbol(\"KEY\");\n\t}\n\n\t// affiliate accidental alters to notes\n\tconst accs = alters.filter(alter => !alter.is(\"KEY\") && !alter.href);\n\taccs.forEach(alter => {\n\t\tconst notehead = notes.find(note => note.ry === alter.ry && note.x > alter.x && note.x - alter.x < 5);\n\t\tif (notehead)\n\t\t\talter.stemX = notehead.logicX - constants.EPSILON;\n\t\telse {\n\t\t\talter.addSymbol(\"NOTICE\");\n\t\t\tlogger.append(\"orphanAlter\", alter);\n\t\t}\n\t});\n\t//logger.append(\"measureRanges:\", {measureRanges, accs});\n\n\tconst measures = measureRanges.map((range, i) => {\n\t\tconst left = i > 0 ? measureRanges[i - 1].noteRange.end : -Infinity;\n\n\t\tconst tokens = localTokens.filter(token => !isStaffToken(token) && token.logicX > left\n\t\t\t&& (token.logicX < range.noteRange.end || i === measureRanges.length - 1))\n\t\t\t.sort((t1, t2) => t1.logicX - t2.logicX);\n\n\t\tconst leftNoteX = Math.min(...tokens.filter(token => token.is(\"NOTE\")).map(note => note.x), left + 2.9);\n\n\t\t// mark volta repeat dots\n\t\tconst dots = tokens.filter(token => token.is(\"DOT\") && Math.abs(token.ry) === 0.5);\n\t\tconst dotsL = dots.filter(dot => dot.x < leftNoteX);\t// double lines will enlarge left line interval\n\t\tconst dotsR = dots.filter(dot => dot.x > range.noteRange.end - 1);\n\t\t[dotsL, dotsR].forEach((pair, i) => {\n\t\t\tif (pair.length === 2 && pair[0].ry * pair[1].ry < 0) {\n\t\t\t\tpair.forEach(dot => {\n\t\t\t\t\tdot.addSymbol(i ? \"RIGHT\" : \"LEFT\");\n\t\t\t\t\tdot.addSymbol(\"VOLTA\");\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\ttokens,\n\t\t\tnoteRange: range.noteRange,\n\t\t\theadX: range.headX,\n\t\t};\n\t});\n\n\tconst headWidth = measures[0] ? measures[0].headX : 0;\n\n\treturn {\n\t\tx: 0, y,\n\t\theadWidth,\n\t\ttop,\n\t\ttokens: localTokens.filter(isStaffToken),\n\t\tmeasures,\n\t};\n};\n\n\nconst isPageToken = token => token.is(\"TEXT\") && !token.source;\n\n\nconst organizeTokens = (tokens: StaffToken[], source: TextSource, {logger, viewBox, width, height}: any = {}) => {\n\t//logger.append(\"organizeTokens\", tokens);\n\n\t// added source on tokens\n\ttokens.forEach(token => {\n\t\tconst pos = token.sourcePosition;\n\t\tif (pos) {\n\t\t\t//token.source = lyLines[pos.line - 1].substr(pos.start, Math.max(pos.end - pos.start, 8));\n\t\t\ttoken.source = source.slice(pos.line, [pos.start, Math.max(pos.end, pos.start + 8)]);\n\n\t\t\t// enlarge token source range for command tokens\n\t\t\tif (/^\\\\/.test(token.source)) {\n\t\t\t\tfor (let len = token.source.length + 1; len < 80; ++len) {\n\t\t\t\t\tconst captures = token.source.match(/\\s+/g);\n\t\t\t\t\tif (captures && captures.length >= 2)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\ttoken.source = source.slice(pos.line, [pos.start, pos.start + len]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tconst meaningfulTokens = tokens.filter(token => !token.is(\"NULL\"));\n\t//logger.append(\"organizeTokens.meaningfulTokens\", meaningfulTokens);\n\n\tconst pageTokens = meaningfulTokens.filter(isPageToken);\n\n\tmeaningfulTokens.forEach(token => {\n\t\tif (token.source) {\n\t\t\t// process tempo noteheads\n\t\t\tif (token.source.substr(0, 6) === \"\\\\tempo\" && token.is(\"NOTEHEAD\")) {\n\t\t\t\ttoken.removeSymbol(\"NOTEHEAD\");\n\t\t\t\ttoken.addSymbol(\"TEMPO_NOTEHEAD\");\n\t\t\t}\n\n\t\t\t// process ped dot\n\t\t\tif (token.is(\"DOT\") && /^\\\\sustain/.test(token.source)) {\n\t\t\t\ttoken.removeSymbol(\"DOT\");\n\t\t\t\ttoken.addSymbol(\"SUSTAIN\", \"PED_DOT\");\n\t\t\t}\n\n\t\t\t// tremolo beams pierced\n\t\t\tif (token.is(\"BEAM\") && /^:\\d+/.test(token.source)) {\n\t\t\t\ttoken.removeSymbol(\"NOTETAIL\");\n\t\t\t\ttoken.removeSymbol(\"JOINT\");\n\t\t\t\ttoken.addSymbol(\"TREMOLO_BEAM\");\n\t\t\t\ttoken.addSymbol(\"PIERCED\");\n\t\t\t}\n\n\t\t\t// tremolo beams paired\n\t\t\tif (token.is(\"BEAM\") && /repeat tremolo/.test(token.source)) {\n\t\t\t\ttoken.removeSymbol(\"NOTETAIL\");\n\t\t\t\ttoken.addSymbol(\"TREMOLO_BEAM\");\n\t\t\t\ttoken.addSymbol(\"TREMOLO_PAIR\");\n\t\t\t}\n\n\t\t\t// glissando\n\t\t\tif (/^\\\\glissando/.test(token.source)) {\n\t\t\t\ttoken.removeSymbol(\"TR_WAVE\");\n\t\t\t\ttoken.addSymbol(\"GLISSANDO\");\n\t\t\t}\n\n\t\t\t// arpeggio\n\t\t\tif (/^\\\\arpeggio/.test(token.source))\n\t\t\t\ttoken.addSymbol(\"ARPEGGIO\");\n\t\t}\n\t});\n\n\tconst systemDatas = tokensSystemsSplit(meaningfulTokens.filter(token => !isPageToken(token)), logger);\n\t//logger.append(\"organizeTokens.systemDatas\", systemDatas);\n\n\tconst systems = systemDatas.map(({tokens, stacks}) => parseTokenSystem(tokens, stacks, logger))\n\t\t.filter(system => system.staves.length > 0);\n\n\treturn {\n\t\ttokens: pageTokens,\n\t\tsystems,\n\n\t\tviewBox,\n\t\twidth,\n\t\theight,\n\t};\n};\n\n\n\nexport default organizeTokens;\n"],"mappings":"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","ignoreList":[]}]}