diff --git a/auto/gui.files.go b/auto/gui.files.go index 31e583151..553b0201e 100644 --- a/auto/gui.files.go +++ b/auto/gui.files.go @@ -18,7 +18,7 @@ func init() { bs, _ = ioutil.ReadAll(gr) Assets["angular.min.js"] = bs - bs, _ = hex.DecodeString("1f8b080000096e8800ffd43b6d6fdbb6d6dffb2b38af9be4c691d3e1c1838bbae9b065dd90db6d2d9a655f027f902ddae62293be22ddc4c8fcdfefe18b2452a4642569d75e036d6cf2f0bcf1f0bc891a3ffb8be7840a342bd80dc7c50b248a2d1ea139a382d02d2e7f6ff22d97fff46ff46cfc64fc6c99b3599aa3a72fd022cd3900a574b9cdd3c2fc96404fa22d7ce1a22073114d9e3cf9901688efe85cac085da2d37245b266d936c77154cd452374351dc28a6a24912c152ccf71114717e5e8992872805d6ce1376114c54ff99c6d8097a72b21364374f704c14792dd14f8c34fa9c040f564528d2eb178fb0686a454f56881b9480ba17954c2002772526397ac50ac087200b8db4f1a930bb2f4c7d7bbf39f60348a9c51ca322c915c4d0348cea914d461cfcce3a26045601dc798be96733e25d031ce7db60abc612522353e1ea30bd830bae4688617acc068c658ce51ced8358c08810b97a2100a1850a8f13b92bd40d1af840b4c0111ec0e483807ab50bb86de154cb039cb9186403f6419a89b630e8062b7018b8b04be15f0cbec8236b9fdc842fe5b7a7b8169f666b6e116fab75bb16472cfdecb6dfe95ac8940f19b1f377c58a3a6dbf50c179dc8df03ba949e5390f3439a5f5804f40c2aa7507c6fccc670c2c8cde4c3f1bf4b8b14ce47fe1eff670b40b66e406308f4032b69a6545483f4c70f48ce5670647143f112f9cf24c748cf6afdf7d6bc45e017e5517ea0f4354d6739ce2c1a7a0ac11c83b38e6bbcd2383bb9fe95cd5b70aa9987a0bc90e33f6a8f69dbb71c46f5b88dce597ff98ebef3d9d123484e86174f5d2fb4dc928bf0e13367ca56dfe5f9630edca52ba8c4f6c356ac30048979aa1cefa523f24184ef52ce6f58917523b5a00ce24d3d12425e6aa88a07e0df2fb6f339c619cee2321cc80f59a0f82be5fded51a5dd38fa9a620154ae95278d86d275a6791cad4886a3e1c481f60388fcec1d3a753809d1aa67bb298582924b6fef0bff730ae7d297bc9da3028b6d41db24b99fc2ee66e9fc3a2bd806360ee8c1b6c2b65de3dd8ca54566b2847d8b3e7b092883e7195b6fd202c7e908cd9a624aa3610b9426bfa76b8cbe3a8598b8a5195e100a070f7dfb2d3200b32040534e89d1a07a69960c1d805a7fe8f87973f3d4b059feca2c6f5333808164902e283aea6b789f1c3a358e9a9a46f3aa4233b1f55865000bb08795547a9546d9e4542a95c0c6c4d1581ace98efc091ac619bb93c5a9cc7f5ba2c15699355f70cba7a29930885113890eb2d89863ad189c38c19e4a58ddbebeaef769a93403af33a9daf2c7c72dc33e8a6c02a75fa5e829e46e808613a8781cbf7e7d2f6180587a5d024b04b7d756271a6905f1904534f074d791cd99a8c5a8969efed91092f65374058a6c79090dec4c391032132988c25cc7195460fd1183d3f3939712149661c70f9b1b26e581fdc7b42219ba8b3f2c62cdb8a6ada9987ad4431c910a1a84dc1cac7cbc96495f2b7371452cf0d2ec40e960d43f0f253163e136f76ef8d8862d7824512bd22d9b412eeb754ac92757a1b9f8cd0bfd033bd130ae29cfeb81398ffc104e422c7810ac38392aa17d9d0e7d0a15c29ae9d3424847d683b60adc4f70882f67c8562dca65a4f29277d450800fabbe198d3d169839c8fc135307b811e6a1cc19071ba7560d377759c535dbef53ea2cda22f4c693f79d22cec2023155bee78f6a6c3b3e2a4e790c01b7587441368a24b7a0dc79b467630aabeaaa25f68271049ffe9d349d47cbdba04577faf4ea68960971b38bb6729c710028ef404686fc645113f1f5abe41ca63969fa2812c3921cb19a0bfff46f5e87996e34153163d0d763040f1a0e6523620dee1620e5e3e5d62a3be2334f86638084a6b546209d48cb61b7696431afbe9774566e1c7842ed847db1747b9110135761337e61db5253a352eae37aa1bdda620ebb4d805d1b509ed6adfddcd4fbe051021db440f285b37d494af55f84ffa61753674331720154080a70f9020aaa3a4498c4300160f93a66e5524996392c74025ec7464461e703a2a515f38c5866456fa4f800bc41db3c064ad53d7022560283997e389ccc972acc84a1d822642f1a8b496738aa442a286b347583630db9719b78262796c9a648f50f4cdb089b1c355443f116e64074b6a55ebf95c8af4bfa054767d5f7d9a12e43e4a5b4396c6dbb5e5bbd82f565dbe93eca533df191ed499ed167d95c9c6d03fac31c398529ae94b75f9f6ef3bf6db52f96713a1e1043ae354bb287fe283db209971395586663d696861d3407cc00507dc21fe3ea57a720271f7cf76da3df659f54feea31dd9a509f364837470e38a5ce69c504cfd7f3804e28c08ab2fdbd25389a3afcb27277dfb65aacf390c6635e9077c9864f0c952a3cfe600256f376ad713dd393607d4310c1fea421409dfe4046a9d91942cdd58c5cd2d3054eaf53611e0c1e2e124502a6d18b77b1a400534f1ef8bb7bf275c3d9a228b5dec30311ca1bb154e33b0ad17e82e3a832a1e4cedf80fc8df22d066ba018e745379fc176734da3b34439b31903dd8415b69a5daa7adaa765ab56e67b8ade3cb57ec26ead4835915f9bdadd6878501cb94567ce8fc9468b745014a342b9e269058639ac577fb5179267c56240990ebf52dd842507c07ec02e70bdd5a6ab832c793f9f2d68c25d5d30cb03bd564d298aae1e42f462898228a1a1b5e2ae341a7cfd56b9a659e5a0feaf3cee61c48663b9aae81e6be874ec387d6556a13e6e38a0c050316b85bea1045efc986ead185053dfc68a2a981f261bafd3359905c60bb85dc16a368697f5fd506689b9add4157f4db4ea2826cf261b52854eb52c659a27a5bf0e7a5dba6ce315d8a154c1c1db5b48214dc15993649b9e33d647f84fc4d1df8fb7120d6fcc3aebe61c23268761ab06e8c2b7f324219a37884c8e4be32f63a04860a0aa9dd83aa7d5bc8df3d30fc5644a49cbe18bad9ee59ab3e601dd66a353a146c6999265f75fd7ec7339272712db1dfcf359cbbf1a6fccc0a9c5ef7a894f42303c0d472eeb4c49b2d5fc57e0c6c714809678588ad67950ff51b9ff9c030b1c245c9625be2635719adfeb7b7fb95f1ff60a35bac083f789009242d4d17fc0083a68ddd019b9c78164f7bd66496f05774da6e9d0199d5a3009970f7dc0afde8c0df8bb6da08277f10f5a0ba79afece06ecc739c16afcb27159d09917d59cde1f3cae55aef073a46cfa78aadae10a2968c15135198c14501556896ef7c4b86f36373d911a60fda89aaa26d8f1eb616ae9256f85f06ee3c9de3785eb9c351b3ec9573c36147a50a785af3fef79018dc2fef372beabc9f43ce275b944a71e049f65d858085a4cc45bc67ef5e321258eb10bd2a4fd6d4bf71f3805ac4c46649e7e354019e920f6a37a0d407e4ff1f57109918754aa2afc86ed8c7488c1c9ebdc4c850f11223b9ca83aac2e7d5d49f73edc872cabe2955e79e6a2f4e68184b28d90993a3a5d19e6a5ae1406009a1338c3b6dec2f0c23cdab52cd10213fba2e0bf3fbd02cef604d62657955fd61a25fc9486776572e4215fc67caeeb4a44af786911ee54d228d9113c120ae342bb12f2779d386d1eda07a1dc98f5ab09797cfdd4b5acd24a56849528a2458acbed757a9dcd8f0b8bdfba2cbd9e6e512d3dcef75bbc47d1ee05c2da9b4f698fb7fddf7fb2c376ce6ac8cbf9dbed1eb3de857ef6404e9b7f5b10f74ba4dcded7418bde681df2e37beb804ec5b2296c8bca230789202e61d5aa39eba9637270f297c2c2f4fdc5febd57951fb6b8f35c8725cbd1811bb1c8ed455c3130054c015e10ccfc91a4e2144eb1c72d1edda7ee127234b22b8bc5f3e2f6597be4bbe58e15dae300ee5c479b8a2119437e816396345acbee66ca9bfa433457a282fc55533cf4fca245d526e5cc0031ea18ed1980d94a1add9dcdb6f3c194718d1142052f73da7927bb3ba9e2074b31523d0404eb280886a3a11ec67728bb3b852a0b3aa76307bf715ac92a119a1f2c9737f7e9a4fe7d4a0da86ea0a4ddbc59f13d47a7b48637905c6f1ddffa167f61f2f435190e3d300e82444b55b4bdf0de50db008fd42eec35a1f9e1ec1cc6ffd98e9e4e211e4df84c9db37870a069b5dda835c131db2b335966f0e7e4176a6ae55597f3ab4d9047d8c9ddd87b33e2c3dc6cc7af1d2c9c423a85f7f0223e32b88bd0fb43187f9e0cd8016a2697e93eef8efe53b719fdebe83f7106df6db38ce48212f7f7cc071c454faf33a93094517d3b67ef4bbbf90c89e4523bb2897cd2ef37271352c8a94f279becdbc19950dbc685ed8d58fec01f7a9f96a91d85b68f11ac809f9fad84bad3079adf374206f8a0e105d1eabfb8fa70337c9bb323813924d07af5e8ed5ca57868251d37f010000ffff010000ffff7fb8afda3e3d0000") + bs, _ = hex.DecodeString("1f8b080000096e8800ffd43b6d73db36d2dff32b50352da958a69cce33cfdc44713aad9b767c699b4c5cf78b471f2812925853000f84626b5cfdf75bbc90040890a2eda4c96926b1042cf61dbb8b25387df657996784a305a33725662f10675b3c4109253c235b5cfd2ef26d29fea9dfe8d9f4c9f4d92aa78b38474f5fa0659c97001493d5368f99fe2d809e045bf8527296253c983d79f22166a8dc9184af33b242a7d58a6843d36d8ec3a09e0b26e86a3e8615f54824586234cf310b838b6af48cb31c60975bf89d5182c2a765420be0e5e99af3628cee9e20f808b205c31f7e8a3906aa27b37a7485f9db373024a46a46192e79ccb8e2510a039c8849855db042b0245802c0dd7ed69a5c662b777cb33bff094683c01a2534c502c9d5dc83e49c08412df6f43c668c32cfba1263f25accb99440c73877d962b8a01522393e9da20b301859956881979461b4a0342f514ee9358c708e994d9173090c28e4f85d96be40c1af59c9310144601d903001af905643ef18e534a1395210e88734057597b80440be2bc0e3028e6f39fcd256502eb79f18c87f8b6f2f3049df2c8ad240ff76cb5754d8ecbd30f3afd926e3287cf363518e1bd464bb5960d68bfc3da08bc93901393fc4f9854140cda06a0a85f7c6ac1dc78f5c4f3e1cffbb98c5b03ff2f7f83f5b003275031a43a01f584952a9a20664387e4072b6862d8b5b8a17c87fce728cd4acd2ff60cd1b047e9111e507425e937891e3d4a0a1a610cc51d8ebb8c12b9cb397eb5f69d28153ce3c04e58518ff51454cd3bfc5306ac64d74d6facb77e49dcb8e1a4162d2bf786e47a1d536bbf06f3ebda74cf55d9e3f66c35dda820a6c3f6cf91a4392486219782f2d910f227c1797e50d65693f52034a232e9a111ff24a43753e80f87eb14d128c539c86553a109f6c89c2af64f43747a576c3e06b823950b9969134188bd019e761b0ce521c8c6716b49b40c4676fd169d2898f5633db4fc997946c7a7b57f89f63d897aee4dd1c31ccb78c7449723f85dd2de2e43a65b400c3013d302b98ed1aef163466a9ae12f61dfa1c24a0489e677453c40c87f1042dda620aa7a14b1447bfc71b8cbe3a859cb825295e6604361efaf65ba401165e80b69c02a346f5522f195b008dfed0f1f3b6f1e4b05efe4a2fef5233808164502e483af2abdf4e169d0647434da17955a399997aac2b8025f8c35a28bd2ea34c72b2948ac0306130158e332d7710483660e6526cadb20c9b7569cce336abf61eb4f552151112237020d61b128d55a113fa19d3c82b1f37d735dfcd32278272e6759cac0d7c62dc71e8b6c0b274fa5e809e06e8086192c0c0e5fb73e17b9440c0926822b0d2509d189c49e4571ac1dcd1415b1e4bb636a346613ad83ca2e025f406088bf2180ad29b703cb120780a93a18039aecbe8319aa2e7272727366496ea005c7d8caa1bd67b6d9f11a8269aaabc354bb7bc9eb6e6c19428cc529411d4a56019e3c564b48ecbb737044acf0233be8365631fbcf854079f9933bb774638db75601144afb2745e0bf75bccd7d126be0d4f26e85fe899b2848438273fee382effa01c6a9163cf09c38112aae7e9d8e5d0a25c2bae9b34148443685b609dc4f7089276b24621ee52ada39493a12278005d6b58ee7474da22e762b01dcc5ca0865a5bd0e79cf639b01dbb7af6a93abe0ddea2ed439f9fd27ef6a47db0838a946f4b2bb2b7039e91279d8004d1a83f25ea44135c926bd8de2430939145c1450d6681330e6c6099753b315f705a1440d98b59b613b80a2f8188cc1e3272be595d81cbbf5727f388d34b20c0cee2124372395213609745c959f87c3cb3e5d0cb4fd1481c66a17e1aa1bfff46cde8799ae3515b16350d1e3642e1a8e152b436de619640fe8857581be6088dbe198fbcd26a951802b5f37841cf7228903fbdbd457d7f9c9125fd041697b86f62464445fcb1cc6ed92ec8c04afdf4f5be0cba2ab40657a9fca01f5dc1b24dcc765e745d3ab58d6b3bcb27b730a4f62ed13dca569d40992424fe9361582d83160907a900025294d777c4865324a63e008387595bb732052638cb43a0e28f96e228e18996f284b1b44e49825911f801ce9330f5025d6ecf6d0f1480be5385188f443199634956e81034e14ba495b79c13241412b4b214c2a2f3dabd4c472d148a6dd3267b84826fc66d8c3d9128f8292bb5ec7584f6a8f53c1122fd2f28955edf579ffaec741fa56da0bc2cbbb5e546f02f565d6e901ca43337181ed49919165d95898ed63fac31cd98549a6ea8f5c5f6ef7bec6da8fcb389d00a02bd79aa5b943ff1413308666c4ea5a3198f483ad8d4101f302b01b78fbf4fa99e3c83bcfb6737ed0176968d9ffb6847b497fc3c99203ddcd82257252d9c02ffdf9f02719a71a3a1dcd10c0a83afab473e431b7db2413bf65635f1077c98a4f79158ab416801456f0b69f548b5bcf506b51cc385bae02c2a8b3c8343da44481617c6a9ec1618aaf47a1b718860e178e639e315b4349b31400534f1ef8bb7bf47a57ca6962d77a1c5c47882eed6384ec1b75ea0bbe08c1260851fff01f55b00da8c0be04875c3a77f9594047b8ba6cf1823d13c1e759d0965dfb753d5568fd96e6977b5aacb35bd097af5a057056e53aef329a7c73385171fda3f15da2d63a044bde269048535266978b79f547bc265459000b95edf822f78c5b7c02e70be543db15628b322992b6fc358543f8601bf93dd3185a91e8efea21901574441cbe095321eb4fb6cbdc669eaa8f5a03eef4cce8164ba23f10668ee07e8d4bf696da5b6613eaec87060c01cf74beda3e83c9291cd45bfa0879fa9b43550dd02307f46cb2ce7d8ec7d77e52852f9df578d039aae66b6fe25fdae9d2821db7c181d10d973157936934d39f8f3d2eeafe798acf81a268e8e3a7a5812ee2a9bb749d9e303647f84fc6d1db8f638906bfee150df726191347b1d5875f4653c99a094123c41d9ecbe320eda049a0af2a9dd816a629b2fde3d30fdd644849cae18ea2981e3ad6a83f578abd1e890b09567ea7ad58efb3d0f77aac58dc46e235a736ee79beab36038be1e705252cf3a0053c7be531217db721dba39b023204525653c341eb23e346e7ce60d43f91ab38ac5aec2c73c6574c6dfc1e157e4ff831d7abececa831b3983a2a51d821fe0d0a4651df0c999e3f164e099cc10fe8accbbbdd323b37c86210aee81a650cf3c5c5b749d8d70f447269fb0b72fc41db44692e398bdae1eb1f41644e62d3b8bcf2b9b6b650f748c9ecf255b7d29442e994a26023f834b06a7d034dfb99e0cfbc7e4b2274d1ff413798a3623badf5b4a59b4c2ff2271e77182c3a40e8793f6b157cc8dc73d2755c0d359f7bf87c2e07e75bf5ed1d4fd25d47ca2452915079164df7710309054b5887369c029463c6b2da257d5ce9abb57851e7016d1b959d0f938a70047c907b5eb51ea03eaff8f2b88288c7a2551777b0bfa310a238b67a730d2549cc248ac72a0eaf4793577e76c3f3282b2eb4af5be272a8a67c48fc557ecf8c991ca694f152d7f2230845015c69d72f6179a91f61daf768a101f752ef3f3fbd02aefe099c4a8f2eaf387ce7e1523bdd55db508d5f09fa9ba53924add6b46061c6f22e18c65c629e495f649eccb29de9463f407a8415bf2a31ed8ab5bf3f6edb27691c23a8a1416790fabefd51d303b373cce765ff471b67d2b4637f7075d8bb19f075877626aad3de6e262fdd8dd7b31d108c37acea8f8bbe96bbdde837efd3289977e571ffb40a75b9fb9ad0ea3d33c70dbe53a165780438f881532e750e8dd491ef7f6ad914f5dab2b9f87143e159727eeaff57abf48fb9a632db225aedfe8086d0e27f28ee409004ae09a708a936c03bb10b2750eb5e87663bea99466ab8c97e2627c52c92e62977823c4b95ca103ca89f5704521a8aefe2d734a5928bfe674a5bec40b497a2c6ef3d533cf4faa225d506edd1c041ee11ca3306b284d5bb1b9375fd5d28130203140c4f60b5a15f77a7533919162cb27485e11f28828a7234e7fce6e711ad60ab4563501666fbf3b5631b4c88878f23c9c9ff6d3393928cd505fa1e9baf873823a6f0f292cafc039befb3ff4ccfce3542812727aea019df9a8f66be9bbb1b86016a05fb2fbb03684a74730f3db30667ab97804f9377ef2e6cd2146c1d8953f8835c1213fdb60f1cae317e467f25a95f1a7479b6dd0c7f8d97d381bc2d263dc6c102fbd4c3c82faf52770b2720db9f7813e6631efbd19d04134ce6fe25df97bf532dfa7f76fef3d4493fd2e8ed38c89cb1f1f70185059febc4e4541d1c7b4a91ff5d23214b267c1c43c948b66977e2bba1ee62c2665926f53674656032fdaf781d5237bc07daabf1a24f6065abc01725cbcf7f652294c5ceb3c1d899ba2234456c7f2fee3e9c82ef2ae34ce284be7a3572fa772e52b4d41abe9bf000000ffff010000ffffc5983f82f73d0000") gr, _ = gzip.NewReader(bytes.NewBuffer(bs)) bs, _ = ioutil.ReadAll(gr) Assets["app.js"] = bs @@ -63,7 +63,7 @@ func init() { bs, _ = ioutil.ReadAll(gr) Assets["favicon.png"] = bs - bs, _ = hex.DecodeString("1f8b080000096e8800ffec5c5173dbb6b27ecfaf403873d364ae29d94ed2db7124cd2476da66da269938b93d673a7d804848440d022c00da51539fdf7e76019222294a96642971a77db04512e002f876b1fb015c7270ffeccde9fb7fbf7d49129b8ad1bd01fe1041e57418301910390d69960d033393914db89c065887d178748f9041ca2c255142b5617618e476127e13cc0b126bb390fd9ef3cb61f0aff0c3f3f054a519b57c2c584022252d9370d7ab9743164f59ed3e4953360c2e39bbca94b6b5aa573cb6c93066973c62a13b39205c72cba9084d44051b1ef50e1704c5cc449a67962b5993b5508de636517aa186e0f2826826000228b6516e098f5052a2d964184ce8259ef632870cde60b9156c54e135e8fb0b952c7fdf58296baca6593f32a65f9df5522e7b7025289ab433c14cc298f59d71e7c4ce32e8af651f2ddeec4a0819ab78463eb94342321ac7d0763856d6aaf484fcdf61f6f159513681f185139a72313b21c1f74c5c32cb234a5eb39c0507a4ba70409e6b00f680182a4d6898e6132fe2fa9efb498e0e48720c7f8fe1ef09fc3d85bfafab2edcba9942c415e3d3c49e90c787878de6696f6c65d51a8211c62c529aa29e4f88549235eae7e27f93a755fd94ea2997a155d90939ea3d6569a36ecf894b955426a311eb1e5355dcba958279876012319386c523eb268bd52334d6c55254dbf2d209d8c5f2d24a72bc527267692539ae4637563a66da63b2009f6b8c580d074dd0a9e053c03b8229c374130aa1a6aa85f809397cd6b4d1da15d772f8746eaa9932dcab13660328f6b28575a6d5543363aa4692c2588e8fe6420a55975381cb046ccc2e11541d8563aa2bb1306f59d825db1984e17f30b0a2e3f27229345242d00cd00e2fb941a757c98bb9c9049d35616edeb3d6ed5c62cf5aa0736343a9c2712e04b3b521c065e73e42741fbee9d68d601f224fe5b276c2b150d145052b60ea5c30789772fa54606b0fd5d1bc604ca38ba956b98cb115a541a5d3f1c3e3c75f1f90e32787f8efe8d1b3a6216a1af3dcc0ccaf19446933a003f2a4ad63d00d5caee9a1352e98adb21753f0f82d3720d8047a7b38f7038de11d1dce2fd74dde0df2d9cd589500833f8e84a217dd6640eef314c31d9576defd41dfa90c426edfc7dc7b03e7e75114989e0613617a189c97c1e6d46a01114c50638641d95e1197ee872179af3282861d86fe9aa497556d7a8925fe079d407918b309cd058461688db97a7cea9c6c11780631af8460a7280c5f176518b200f4661be158531907a3014fa76509ba8a80181d61cc0bf12c3c3afec64555e2a37ef0f83828e6b73b1e91f37988c546aa16c739cc745944497f5261823103feca41b96393920c268b37da72d450e0c84f247874015428e6f69c590bad99878fa0eff5614dc52c4b900590ea08d4037ca0e81829ef1cf47d770ae0fa809c0beb7d68d42b640996be3e6af05bae8d05555c1d1025c58c0029b992844f886411b82daa67cfc83b662cd5965c512da1d952db857818140702721fe44ff8f49544182b7c40f05c758dce88308d41275569b31c86c90471ffc3a2d95acd8eba21dab3ab35481e374b1c5f0a46e5285e3316b31826c0e35185d872b1383d1a2d43a56cf43e61c48f37f7048124d4903163e014e825785bd00bcc424b680451865a16f7e6e645d21c212fba635555098322e07ed514dd1bf4b3461f6fee3406e3da9cd9c08ec176ebe63cb7e3baf1165d5fcb6e819c42f5646ebb951ad455d37cbb86130946f5847f0c3a54d5bcd038ad9d14870b06cfa6b900f704f6d932e786e196f2f0c677ccd107a5672ef89187e8d3d0d33f9a4be834f2afd7b0f1d229dedac68b3e72666e63e1b9a81c29c6f95cbab0113b23d02c63d4a215640aa213c15fd312e0d626ed4b2de7dde4c4c1e8d32794d43be39a4588f2f575d30f2fef5ec54e167ab1b4276d28aaa01e1007e530a8a9fbd559a7e02523ca61b693aea960e9dc85af230e994505cbabb3e578b83bdb8ade629cb8c64cb492fc0fefd360a2da7c51b5db8c3d52690a8c7ef3f17bb7e3a724f4f4140f1f16883c2ad139771dad2e6f89d4a0df6d295b1ad077428da9f0d3c3e33be1b0f8de099c5390cdb632a654c54cfc5220f56b6fea3af92d768cfc49a8b8a233f33a4fc74c5f5ffbfe1e902537bd985977d3984b8ab3f5c55eccf34715ed0bc444a53bc15060173784d0ddb31b04776cb61fe4dc0d0070bb831bd60e791cc6402f611111ef0278094c6e43dcf196fd1aee6ebce5369162408bbdc0f642035dbc738eeb10b68cc9888b395f7b0902067dbab23b1bdae6a09f8b05beb050b35d6b2fbcb7b650eba6c0752c691c3b28d7825160e42c417c1ec735feb86fde5b67adafc1fe6b7cd50df50e1156ecdea64cb5895af274f496314d4a494fb7a0b212ee3d9d4c91cd2a588369270bd5bc03528bb25fd3943d2c1a59c14e3e0baf750601968c9b923b7156f810622b6f8e80c0c4d06b20e3646c4b21dc88ef20b7f59b7f1e07cf6be74094f814ccf69608ed98229c15319c686ad95de1062046c2c211746b7e29e0eaa1e631ea7339ce30e2a7cc6a1e5d5fc3d95e2ced43b60f58f26c2fa0a8dcee06951d5b979bae974c9bf996f0ed50dc76dd8d80fd3fdb9b7bba834411a1af86fbd7e38a0bc4e07dc28d2306b7e70516443978f6cd0a1eb0d464cfbe0c3738cdb5864846de3dff89e4968b2258ee6616265b4d42333396a53df8a9afd8b0877bf1e02502a76f3fd411200f8f0e895954fd56405073616e834594e56f99c607e4ad752f9c4aa00b9a8a93a3ebebffc141dc0587dea00bb80cb154ec06ca1dd0862f400df600c12d28c217a601c5d3c3c2b461accfa554b98cd89b1fc8fd21c9252c34b944bf7cd3462b2d6e2486e9cb855d80edd045179b282db7e4f6268ff0216ab06a94c1e88d7bc2bf5503319553186af50c76490393c94d2dfcc35ebe387b59d1c897d8e92ac9ce163b5d9e717d863d2e7fec37bafacd47b978e9a5d64a9bee740586653f02937af8a827989cda848cc8e15dcc5b78ad2c8fd8adf215ea9c16068e7cb6367ed4714a85806000577bef79ca201cc0646327c1f727697a021eecfafa0434ec6a914f9f269a33198b99df27c39b1cd48ec4ee3f5761234b7656e60d0147fae687cf9b74d0b0d02a03a7ca97c2cb2f5c22e17a6954655e46710a9d6471918948121ec74c861fcd7a7954592b890a7d35f28162e5dd50656df1815d2beea81dfa14911a30e0e2c04f375b701b8585efc654ee933e806322956bc37a557e734f32db0f46e77986d96ba44fbe553a4fbd5fae3bcea54d944098b4de9881d6a6dc26f9b817a9b41f519126fdaad1be66a074834fba7e04bb37b004f21736687783d6aef8050f46672aca71e3d0ad30f63d406e4c8ec37b9163dad85edb02e5814e81889dba38d06c6b1eebbad2d5dc130b66af94bef01e8aa42a066e574e0c34691e430f7d1d37af2bbfe0ab4e68cc3a66802b0c634e859a767a765fa148d65fe2dd7d1df4d83087a960609fee7fc9c31aae2279d2bcad70e74db7735370651fa1307516121a3e5d42444fab6d3e1ff31a1e2b79b2c461758d6d217c0cb26653f32c36c3586a307d6dcc082ec10e88c26c6ea619e18650926935162c25576028640616415e614a37a88eccb7257b0de1ef60093203d90f1226046fec823402cb0d7eb7e1807dea96cb3973b9779df6a4ab0a77c19ab89ca83dd8523b15af057d89c067311eb09039e63df2d6395b922811ef5af76e3b1997074b9d49b976d85cf55e60287663034de856312058f41be82eae87a02726e595a88050cd69e8bd362cc0740e63786081d299675dcc072d0bc81266fdc2f21191007dbcfc08bc70612e94463767f875e368895a4b122eb83a446d616713a5d3229f1c0fdb33a326018b437c7120ebd8c7a56320ef50c3effc62da9fb39e576710c1b06ce10e2e334cf49da216f08d98b863e42e5e79718d4e1409f741edf52b475c5dc60ae8d8ef4462078a473638715d830bdda8b81ccc9dccbf2a10b81c65e9bb4f22f00ce0a627f8be84dfcd6604ecd7a0cb2e4e8352af6057deb8952f704fc49da4762672e772781bb0292662e176f86a9c334123863e02df51f85ec132e5dc6ff5788c51cad608539f0bb601bee73e535e1a8b6f32a909296ca50434827531c4bbe249f3beb02b9ee423b57b5e1e6e80623c03d87814346d78d1f6c87048d2199a30423d6f745bbcabbe9e5bbd21ee2f9145107ce84e81836414b754e3d5cf5b7876828b89728fa2ea3e9affca1b0b78ca1b81ec644c3b6743735873012f8b885bc38015ced00650f185f835343ee8a3ac85f5f17287dc94f773c224f16f3001dfc2170770961e900bc632b4c294c36cb709b564c0d2113ec17215067d38f32f218c5d6f01bec65c371c0cd92ad523e8434ab376a32b4440fc3e69ed316886097a339fa78c676b2e9bbb1c7cc79ec05a6f2f649aa754cfeaeb7f7c1da3dcca3a87e3ce20b8c11b3edd5177748a117995ec72dba9a950f2e00129957ccec424b8a10f6e99e1dfcac0370fea038529c66c35d43377b6d8a1cd9973a66e664f58eb1ff6b4367baa6702ee84432d1378179814e69d227769bc4fb149842a76494cb006cf2a1adb222abdf319c29b73006d0f482ef9ef393845b01acb271ca6e8c4af856b89eb3df253e171f1ba01be814e970a51110574ac7be309d891b7141fc2d71481173650c57ffa67736594703ba1db025ebdecb321eed82846e326c4651473c9f5c810401ed33df233079401f84833c715f884c0a4891533ee1d3d8626b453dceb3baf098b2ec6ea63c703b34127f035f03d7e95842518be03f7f7460a8090e021c1e3c5b69668b9638cbba1f468cb557a6f77db5d28b5b36f6e4cc9dd198c06226604d6e11a72c97265a65c808f3c1a093b8faeaf6f81f05267e27ae05f02c54ea0819b846ae67957cdce714bed4bd0cb7917ba482676bce1e5719727c76f0fe04ce5b599cadde0a6ccb1cd31b357f8e2ac777f48396704071de18e9061123fd970093c159a719c15587794c0a4a59115b3ea6e74a45ec2dde19de5cb02778f77de9a679643db15cf2cdf685f42324d51fc7725995dccaff61580cfc6f9ea8fc5bbca3b5e20e9aa560b2275875f6819bd4aa5f04ebf5e4f1cf2157ba804dca4f80ae9c657e4cf3fc942897449725f2d495da947af4f9fca9b79ec73f1cb73f7ed275ce12e0d3a55d841bb6d095a4593e655f11c2bd7e294fb1e40ef4de633b9e7327f5dca9b3a4c6189caea71b113d1b15262356add65842ce0b60a9b15617abbe12f8dc92bb0e90ed79d17f761f6d39c9fefcff23bcb32e8da95d2f15f785e7cf7e1d5df754e6c32f47dce871bb9e7e7e65ef58feb7c7efeb536fdc143ff3541ffb122205ef85d12f7d9bedf7c5a9d2b1db52bfef67bcef42c3cee1df61edf5c7bfe75c0dfda1f075c791fcdb25605182b7e070e3f20e5beeff85f000000ffff010000ffff0f816f18f0510000") + bs, _ = hex.DecodeString("1f8b080000096e8800ffec5c6173db3693fe9e5f8170e6d264ce946c27e9bde3489a49ecf4ada76d928993ebdd74fa012221113508b00068474d7dbffd76019222294a96642971a7fd608b248005f060b1fb005c70f0f0ecede987ff7df79a243615a30703fc2182cae930603220721ad22c1b066626239b70390d300fa3f1e801218394594aa2846ac3ec30c8ed24fc57304f48accd42f67bceaf86c1ff841f5f86a72acda8e563c102122969998452e7af872c9eb25a394953360cae38bbce94b6b5acd73cb6c93066573c62a1bb39205c72cba9084d44051b1ef50e1704c5cc449a67962b5993b5908de636517a2187e0f2926826000248b6516e098f5052a2d964184ce815def632870c16b0dc0a36aaf01af4fd834a962f3756ca1aab69d68f8ce95777bd94cb1e3c098a2aed4c309330667d63dc3db1b30cda6bd9278b855d0a216315cfc86777494846e318ea0ec7ca5a959e90ff3acc3ebd28d226d0bf7042532e662724f89e892b667944c91b96b3e080540f0ec84b0dc01e1043a5090dd37ce245dc3c703fc9d101498ee1ef29fc3d83bfe7f0f76dd5843b575388b8667c9ad813f2f4f0b0513ded8dadac6a4330c298454a531ce7132295648dfcb9f8cfe479953fa57aca65685576428e7acf59dac8db73e2522595c968c4bafb5425b78a5250ef10542266d2b07864dd64b17a84caba988ac3b63c75027ab13cb5921caf94dc995a498eabde8d958e99f6982cc0e72a2356c34513742af814f08e60ca30dd8442a8a96a217e420e5f3475b4f6c4d51c3e9fab6aa60cf7c309b30106f6aa8575a6d5543363aa4a9242598e8fe6428aa12ea7029709e8985d22a8ba0ac754576261deb2b04bb65308c3ff60a045c7e5e35268a484a019a01d5e718346af92177393093a6bc2dc2cb356712eb1652dd0b9b1a154e1381782d95a17e0b1331f219a0f5f75ab20e887c853b9ac9e702c547459c10a983a130cd6a59c3e15d8da4375344f18d3e872aa552e63ac456918d2e9f8f1f1d36f0fc8f1b343fc77f4e4455311358d796e60e6d714a2d4191803f2ac3dc63036f0b8360ead7ec16c95bd9882c56f9901c126d0dac3b91d6874efe870feb8aef2ae932f6ec7aa0418ec712414bdec5603f290a7e8eea8b4f3e60ffa6ec8c0e5f6bdcf7d3070761e4581ea695011a687c145e96c4ead16e0c10435661894f5157ee96118920f2a23a8d861e89f497a55e5a65798e27fd0089497319bd05c801b86da98cbc7a7cec8168e6710f34a08368a42f77591862e0b406fd6118e359571301af0745aa6a0a90888d111fabc10efc2a3e37f39af4abcd70f9e1e07c5fc76d723723177b1584955e33887992e0b2fe96f2a4cd067c05fd929776d5292c164f14a5bf61a121cf989048f2e810ac5dc5e306ba136f3f809b4bddeada9986509b200525dc1f0001f281a46ca9283be6f4e015c1f90736ebd0f95fa015982a5cf8f23f81dd7c6c2505c1f1025c58c0029b996844f886411982daa672fc87b662cd5965c532da1da72b40bf1d0290e04e421c89ff0e9b944182b7c40f07ce81a8d11611ac39854a9cd74e82613c4fd0f8b6a6b393bf286a8cf2ed72079da4c717c291895bd78c358cc6298004f471562cbc5e2f468d40c99b2d1878411dfdfdc1304925043c68c8151a057606d615c60165a4223f032d4b2b837572f92e60879d11cabaa4ce81401f7eba6e8dea09f35da787ba3d119d7e6cc067a0cba5b57e7b91ed795b768fa5a7a0be414b22773ddad86415d37d5b7ab3b9160544ff8a7a063a89a0f1ab7b59be27241e1d93417609e403f5beadc50dc521e167ccf1c7d507ae69c1f798c360d2dfd93b9844e25ff760d1d2f8de29d75bc682367e62e1a9e8bca90a29fcfa5731bb15302cd32462d6a41a6c03b11fc352d016e6dd27ed432de4d4e1c8c3e7f4649bd33ae598428dfdc34ed705b4c61775ca17379054e34aed459d031c355e718a185b5274e8622cf09292a2aee5754d342a122410b9d5ddae136e2157708881bb16150d3aaf3b34ec14b80cbc1a890ae1967e9dc53ac230e094c85fef9d9723c5cc9b63e6dd14f5cca265a49fe87379d600f6cbea841dbf43d52690a0b87cdfbefad9b9ff9d0d253bc7c5c20f2a444e7c235b47abc2552837eb7a66ca940ff166a4c859f851edf098735fe4ee09c826cb69532a52a66e29702a95f7b53d7c8efb061e44f42c5359d9937793a66fae6c6b7f7802c29f46a665da13197148dc2abbda8e78f2ada1788894a7782a1c0266e08a12bb31b0477acb61fe5dc0c0070bb831b9628791cc6c06261ad12ef027809847143dcb1c87e157737d6721b4f31a0c596637b3d8326de19c7757861c664c4c59c16be0601833e5dd99c0d7573d0cfc5022d59c8d9ceb5177a5d5b0f7633ed3a96348e1d946bc128d0739620be8ce31a4ddd37bdae93e337a0ff355aecba7a8f7831366f5342dc442d793e7ac79826a5a4e75b306609654f275324cd0a967adac9c261de017746d96f68ca1e1795ac60275f84d73a85004dc6bdcf9d182b7cd7b1953547406062e835907132b6a510aec7f790dbfa3d468f83e7b573204a7c0a667b4784764c11ce0a1f4e34b5ecbe70031023617d0a636b7e29e0eae1c8a3d7e7729ca1c74f99d53cbab981bbbd68dac76c1fb0e4d95e4051b9dd0d2a3bd62e375daf9836f39de7bba1b8edba1b01fb6fb637f3740f8922425f75f7afc7151788c187841b470ceece0b2c8872f0ec9b153c62a9c95e7c1d6e709a6b0d9e8cbc7ff913c92d1785b3dccd2c4cb69a8466662c4b7bf0535fb1610bf762c14b044edf7dac23401e1f1d12b338f45b0141cda5b90b165196bf631adfc3b7d6bd702b812e682a4e8e6e6efe033b711f0c7a832ee032c452b11b2877401bbe0235d8030477a0085f9906142f0b0ad586bebe9452e532626f7f200f872497b0d0e492d5de202cdb68a545416298be5ad805d80e5d34b189d2724b6e6ff208dfd506ab7a198cdeba4082ad2a285ea154af7a97543099dc56c33fece5abb39715957c8d9dae92ec6cb1d3e519d717d8e3f2d77ea3abdf7c638c8f5e6badb4e98e8a6098f62330a9c74f7a82c9a94dc8881cdec7f08837caf288dd292ca2ce69a1e3c8676bfdc7314ea910e00ce069ef034f19b803986cec24f8fe244d4fc082dddc9cc008bb5ce4f3e789e64cc662e6f7c9b09083da91d8fd87446ca4c94ecbbc22604fdffef065631b1a1a5a05fa546159f8f8958b575c2f5aab0cff286ea1912c2e021e49c2e398c9f093592f5c2b6bc56aa1ad463e50acbc1b43595b7c60d38a12b54b1f895203064c1cd8e9660d6ea3b0b0dd18317ed207704ca4726d58af0aa3ee4966fbc1e822cf30488ef4c9774ae7a9b7cb75c3b9b48a120893d62b3350db94db241ff72295f6232ad2a45f55dad70c06dde09bae1f41ef0d2c81fc830deadda0b66b7ec983d1998a72dc38742b8c7d77901b9363f75ee5189db6d7ba60f0604c81889d3a3fd0ac6beeebbaa2e2dc1b0b66af95bef4168aa42a066e574e0c54691e430b7d1e37af2bbbe0b34e68cc3a66804b0c634e859a765a769fa13813b0c4bafb3c68b1610e53c1403fddff2a94a56e2a9267cd6285396f9a9ddb9c2bfb0489a9d390d0f0e912227a5a6df3799fd7b058c9b32506abab6f0bee639035ab9a07cb19c65283517263467009764014068d33cd083784924cabb16029b906452133d008728e91e3307464be2dd96b087f0f4b9019c87e943021786317a4e1586eb1bb0d03ec23c45c689b0bf1ebd4275d65b80fdac4e544ed4197da117f2de84b04be88f28086cc31ef9177ced892448978d763efb6937179b0d498946b87cd87de0b0cc56e74a009dd2a06048b7e03cdc5f510b4c4a4bc121510aa390dbdd5860598cea10f8f2c503af3a28bf9a0660159c2e062583e2212301eaf3f012f5c980ba5d2cd197e5d395aa2d692840bae0e515be8d944e9b4085bc7cbf6cca849c0e410cf27641dfbb82e381172f89d5f0cfb73da737e061e0cd3164a7099613cf11447010fdec41d3d77feca8b6b34a288eb0f6aa7bc1c7175112b30c67e27121b50bcb2c189eb2a5c6846c5e560ee64fe4442e042a1a56f3e89c03280999ee0b10cbf9bcd08e8af41935ddc06e5b8825e79e5563ec1bd117792da01cf9dcbe16dc0a6188885dbe1ab71ce048d18da083c0af1bd8265ca85dfeaf118a394ad11a63e166c037c2f7c40be34160f4ca9092974a50434827531f8bbe24df3beb02bdee423b57b595e6e80623c03d8781434757851f7c87048d219aa30423daf745bbcabb65e58bd21eeaf9145107ce94e81836414b754e3d5ef5b7876828b89728fa26a3eaaffca82053c6541203b19d3ced8d01cd65cc0cb22e2d630a08533d4011cf842fc1a233ee8a3ac85f5f17283dc94f773c224f107a5806fe1f9049ca507e492b10cb530e530db6d422d19b074846fb05c86411feefc5987b16b2dc0d798eb8683225ba57a046d48a9d6ae778508f0df27ad3d06cd30406fe6e394f16ecd65739781efd81358eb9044a6794af5acbefec7531fe556d6055c773ac10d0e12757bddd1297ae455b2cb6da7e68092478f4839c8174c4c825bdae09619fef0071e70a87714a618b35557cfdcdd62833667ce99ba9d3d61ae7fd8d3daeca91e09b8130eb54ce07d605218778adca5719e62130f55ec9298600d9e5554b685577aef238437e700da1e905cf2df73308aa035964f384cd1895f0bd702d77be4a7c2e2e273037c038d2e15a2220a6858f7c613b021ef28be84af0d043ed86028feaf7f361f8c126e27745bc0ab33451be28e95a2376e425c7a31175c8f0c01e431dd233f734019808f34735c814f084c9a5831e38e023254a19de25edf794d587439569f3a5e980d3a81af81eff1ab242cc1f03d98bfb7520084042f095e2fd6b564943bfab81b4a8fba5c85f776d7dd85523bfae6d690dc9dc168c06346a01dae22172c5746ca05f8caa311b0f3e4e6e60e082f3526ae05feac29360215dc245433cfbb6a7a8e5b6a5f835ece9bd04532b1e10d2b8fbb3c397ee200672aafcd54ee3a37658e6d8e99bdc6f3b9defc21e59c11ec74843b428649fc32c415f054a8c6715660dd510293964656ccaad26848bd84fbc33bcbc302f78f77de9967965ddb15cf2c0fce2f2199a648febb92cc2ee657fbd8c017e37cf5d7e25de91d0748bab2d59c48dde017a38c56a51af04ebb5e0f1cf2197b3808b849f10dd28d6fc89f7f928514e982e4be5912ba52f75e9f3f9785f118b20bbd2beedd27a67085bbd4e9546e07f5b62568154d9a67c57bcc5cf353eeb303bdb7998fe49ecbfc75296fea5085254356f78b9d888e9512ab51eb4e236401b755d8ac70d3db757fa94f5e814db7bbee7cb80fb59fe6fc627f9adf999641d3ae958effc2f3e2df1fcfffae736293aeef733edcca3dbf34f7aa7fc3e7cbf3afb5e90f5efa8f16fa6f2201f1c2cf9fb8af03fee6c3ea5ceaa89df1b7df73a667e171efb0f7f4f6dcf38f10fed6fe06e1ca7234cb5a19a0aff8b939fc4e95fb8ce4ff030000ffff010000fffff36a425657520000") gr, _ = gzip.NewReader(bytes.NewBuffer(bs)) bs, _ = ioutil.ReadAll(gr) Assets["index.html"] = bs diff --git a/cmd/syncthing/config.go b/cmd/syncthing/config.go index 8373adf65..a5a089835 100644 --- a/cmd/syncthing/config.go +++ b/cmd/syncthing/config.go @@ -25,6 +25,7 @@ type RepositoryConfiguration struct { Directory string `xml:"directory,attr"` Nodes []NodeConfiguration `xml:"node"` ReadOnly bool `xml:"ro,attr"` + Invalid string `xml:"-"` // Set at runtime when there is an error, not saved nodeIDs []string } @@ -171,17 +172,21 @@ func readConfigXML(rd io.Reader, myID string) (Configuration, error) { cfg.Options.ListenAddress = uniqueStrings(cfg.Options.ListenAddress) // Check for missing or duplicate repository ID:s - var seenRepos = map[string]bool{} + var seenRepos = map[string]*RepositoryConfiguration{} for i := range cfg.Repositories { - if cfg.Repositories[i].ID == "" { - cfg.Repositories[i].ID = "default" + repo := &cfg.Repositories[i] + + if repo.ID == "" { + repo.ID = "default" } - id := cfg.Repositories[i].ID - if seenRepos[id] { - panic("duplicate repository ID " + id) + if seen, ok := seenRepos[repo.ID]; ok { + seen.Invalid = "duplicate repository ID" + repo.Invalid = "duplicate repository ID" + warnf("Multiple repositories with ID %q; disabling", repo.ID) + } else { + seenRepos[repo.ID] = repo } - seenRepos[id] = true } // Upgrade to v2 configuration if appropriate diff --git a/cmd/syncthing/gui.go b/cmd/syncthing/gui.go index 0119e46bc..8033ff5c8 100644 --- a/cmd/syncthing/gui.go +++ b/cmd/syncthing/gui.go @@ -84,6 +84,13 @@ func restGetModel(m *Model, w http.ResponseWriter, r *http.Request) { var repo = qs.Get("repo") var res = make(map[string]interface{}) + for _, cr := range cfg.Repositories { + if cr.ID == repo { + res["invalid"] = cr.Invalid + break + } + } + globalFiles, globalDeleted, globalBytes := m.GlobalSize(repo) res["globalFiles"], res["globalDeleted"], res["globalBytes"] = globalFiles, globalDeleted, globalBytes diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index d84b626a9..698e68b5f 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -222,6 +222,9 @@ func main() { m := NewModel(cfg.Options.MaxChangeKbps * 1000) for _, repo := range cfg.Repositories { + if repo.Invalid != "" { + continue + } dir := expandTilde(repo.Directory) m.AddRepo(repo.ID, dir, repo.Nodes) } @@ -260,6 +263,10 @@ func main() { m.LoadIndexes(confDir) for _, repo := range cfg.Repositories { + if repo.Invalid != "" { + continue + } + dir := expandTilde(repo.Directory) // Safety check. If the cached index contains files but the repository @@ -295,6 +302,10 @@ func main() { go listenConnect(myID, m, tlsCfg) for _, repo := range cfg.Repositories { + if repo.Invalid != "" { + continue + } + // Routine to pull blocks from other nodes to synchronize the local // repository. Does not run when we are in read only (publish only) mode. if repo.ReadOnly { diff --git a/gui/app.js b/gui/app.js index 1e487f938..b7baee064 100644 --- a/gui/app.js +++ b/gui/app.js @@ -121,6 +121,10 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) { return 'Unknown'; } + if ($scope.model[repo].invalid !== '') { + return 'Stopped'; + } + var state = '' + $scope.model[repo].state; state = state[0].toUpperCase() + state.substr(1); @@ -136,6 +140,10 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) { return 'text-info'; } + if ($scope.model[repo].invalid !== '') { + return 'text-warning'; + } + var state = '' + $scope.model[repo].state; if (state == 'idle') { return 'text-success'; diff --git a/gui/index.html b/gui/index.html index 455204b2c..a28daf243 100644 --- a/gui/index.html +++ b/gui/index.html @@ -134,6 +134,7 @@