From c2f75d36899102338eb2988d1c3c95f111683e6b Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Sat, 24 May 2014 21:34:11 +0200 Subject: [PATCH] Show counters for total data transferred (fixes #265) --- auto/gui.files.go | 4 ++-- gui/app.js | 5 ----- gui/index.html | 8 ++++---- model/model.go | 9 +++++++++ protocol/counting.go | 11 +++++++++++ 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/auto/gui.files.go b/auto/gui.files.go index 3e0e638ed..28146c1b6 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("1f8b080000096e8800ffd43c5f73dbb693eff914882e2da944a69cde4de7c68ad3699db4e7cb3f4f9ce4c5f503254212638a5448d0b6c6d577ffed022009100045db499b6a26b10d2c16fb0f8bdd05a0f1e3cf4512a78c4cf3ecaaa0f901617949476496a52c4e4b5afdbd4eca02ff89bfc9e3f183f1e345924dc3843c3a20f3302900284c176512e6f26f047ae095f04bc1f278c6bcc9830797614e8a4d3a63cb385d90c36a44b0caa232a1be57f7792372763e9cf001659e4c43407348bc9c161c4f0d1720a179962434f7bdd3aaf588e509609897f0779ca5c47f54ccb23550f868c9d87a486e1e10f820ee754e2f5f840c91ef4fead60565ef5e4113f2dab4e2e461ce04e59c45a0043b05762425a57cc202006eb69356e73c5e98edabcdf10be4ccd35ad32ca288e4ecdc82e438454635f2643fcdf32cb78c2b284d5f629f3913489e262659395d671517bc7d3c26a7a0c6745190299d673925d32c4b0a9264d905b43046737d46c63830d0c2db6fe2e88078afe382d11410817680c319d80ad71a39c93396cdb2840808f26b1481b80b5a0020dbacc10e3d46af19fc25b5200c713b5290bf09af4f691abd9aae0b05fdbb922d32d4d97b54f3eb781533e2bf8a7f1b17c306775aaea634efc4fe1ef085e9710a8c5e86c9a93283e8215517f16f8d595a8e1db9ecbc3bfe93300f618124efe997128054e180c808080846a611975103d21f3f20395ac24aa62dc923f2dfe38412d12b14d05ff4ca0c7f704ff36b9abe4cc36942236512d1455ec460779734df3488d13e3be97e9dcd1c4879cfbd709e6439732324b2bbbf8c4fb1fd37e1a3d5b583cda46957c9d4c67f3c494f4c3e450bc14efbe073ddc32dcaf8d4beb0e57a5515f3f1f83e8bf9a3ce2862fbb5644b0adbd22ce44efda3c6f24e842761515c6579d48d54819288d74d4b27b51f5eabcb161ac8ff7df870724ac0571298a8970d55e2ae372ed8884ecbd98cd288467eb56fe1279e13ff21dfa6d4564555711a337f38d1bb7cefbf52ca809b0bbe1b784374ff61e27bcb38a25e0bdadc04f1b3d54868b6c45b92d10cec2602618b65c9a2ec2aed86b4edce3ad15b53b8bf87e09f4cc9bad9ca292bf3d4250ebb425c52bf9986b38b28cfd66014301fd82098c505dd4cb3308f6410b57528a58bc17a0b9f031f4b04aee32095361e0b0580d0af02ac27c41b171b58b22ba0b140bb2b0abf191c852c6c33a71be8c4660202239081e3159287225cf1edd449e49582d471cdefefa69f61670c406685af062ec30056ddcb70b65490c791a118ab007840f40ba239f4a081a63368f8f8fef8285badb3145c0562ea2b1e450c1cef591c9d1b926873a5fe6ea75189347b6b0a23d834bb82d931de8508f3ca1f8e34081641a78f307b755c3c2463f2747f7f5f878c23e9a8aa8f1246c378ab19c42944074d98ddeacd4a56776bfde83e41e2244e894bc0dc176267b00c8b775729c4926b9ab30d5794051e3f557e33317ab7460b830ddb8e05274595d6ccbd09d9325885d7fefe88fc2f792c34c1218ed3df368c161f320681c09e256530a050f42c1a9a146a33d782734f0d015e9fb93530e7e45b023be56c497cea12ad2194fdbe2c58004d6d68e6f4e4b0359d894137307580686aad439b71ea895ddb8ded5aac2229ebbd4edba99c7dbaede4413b5d8358909585e6eeb1b9bdb7611492cd75af8470e0970e213b2cd388cee314c244fbd607a14d7a91e26eacee3eda0c266ad00d242eb08a1fe2144ecca72c5baf61662b665e3a60c2c778e8992dd3f0fe667405ce7f9eed9f072cfb0813e447a01ad86c9e880ed0cbb460b9ff7438d1f990c30fc9005354080606e4afbf48d37a1c2574d0e6457483990d883f68a8c482c509cd67b07f840b2a15f3840c7e180eacdc4a91280cb537f77576944068faedf51da7f3ec1b283bc29c30ff6abad614e6c5a01ae7cc721d7aae28ae415308bd3b31adf37815427e68c364119fae42dd24beb91e611777316c91aea8edf1fd80e3dfef8755d3e07ac6802b8080ddc86a26b8acc414631b8042c3a42d56bedbcd930ce24798c6ee14b18866718ad87c34d7227ba4169d3cc05936473920780b3f8f5f9ceb3687806dd954ed01c68c09e5d3a2104114b64db376ac6bc2321e9d79ad4d8950aca7ba474aff447c5c2bed99610ffa61d8c6d8e1733c5ea6e0ecd7bed822d9e31972f56f906b76715b79cad4e936425b413459b8a565faeaef565ca67bec2533d317ee9499ea1a4d9161d5e86f9698248c0b4d16adba5cfb2f1dfa5644fe8fb1d072029ddb949b954f74a71a90189d526e68ca1187834c097149f30270dbe8fb96e24962d87b3fb9e7dea167d86e239cd8908ece2e72b0c29c899fe8a8073c80216154ad8020bdd5b469234a22b04eb46c035994788384a60bb684888b3c75705cc7071d8c4a6c10293b8de16db832f9b558838c56646fcf106530704528b59e617ac76015a48347dd62aad81f72e69fed41045bc6c55b1be36d15a7c2125ac3fc96c214b9f4158a5f8a848b0f1a768a68977cfa08a7b764681433e534c02e99f11842b50b4a4282f54f8c5160eca6eed6ce350309f26e5da5dad5f1308ef1755809a466df365c58e2efc403002a0e2c374b9efad66979fd7e688df0c34bda5b424599c37fd98a8ab3f1193f338b743f28da00d5c39a25faa50c93c22e9c51a77c8790cd1abbb9f8ec400f3273a0d6a519cf7d49f2d05ae3d0a9edd6538b766b11b121af172e41ac1b517dcede2ab63b3908c479978c1cb41dcb843a657950ac9398f9de084d2d5c2bfbc0b5b20f5c070c422b7024a47d1820ea4debac30aac3301dd8e8ff9fbe7b1b14fcd43e9eb784301c919b250d23d8fd0ec88d7794a54013dbfb00fec9033b0fd7409a38131b7f2eb2d4db6a15ea07dd2b668007340357a98a9fad38d783768ea39f3d390e8e6e7b8ee2109bc4ecb95c8ae5da458bb5eaa0ea4ebcd98952cebeccf2a1eda4c9382cbbad74b677e71f77046b40d40a102ab4659e83cdc9118f027a0d2618f937db51b54b9ba4e01420be97d7b086ac62d4c04e693217671aadd8540b4d4d7e1bc282faec1ad62b39acc387ba39f89cc5292c6162b11b047e09946479f008d6c849ce89d66202545925b63b6d38ba06623320d5040fb3c5d117e5e0b75866579e1d5718ed4066d3e28d2a2f203fdaa4e10ae8dff6d064cbcd5a556987f9fb051d5148ace84e611b331a47d7fcf0ca2e92dd67cf3639f44b32ac1162b53e1e360b445d0aa2b787a7e0906d3a949d969fe9614023cef5b4935bfb6908efe387362dd4ad8e1eccde83e136d3a602ba03877f64bf6eef511093769a6d95cb80971b91284be988c493db32dacbf4ebe4d0227b03aaf6dded0c0e2c200967d41f933110ecc17475cb5ed5a29dfb54e1943143edba6c7efe8ee15a3d094ad2149438dde6479f2426cff4852b927ae878f2c456da5361cfe273b5f0a28ba8e3524235b8e17862804acaf57db6fa4c731a5ef428f989337ac0e458e082e375592c7d73ef7738baa0c872e657d5b630a777f547dfc3baccd892e6159daee851ad99399d7b6fdf8ec18fe9cd1df58f4e7f1143c4d6f6ef77b0eab4a52230cc8961f669cf0aa3cabcdb402d1c8749d2ad87ca432a16d568afed58a4511b6521054c29be14f6b81aef0260d6d8d334c4dd01d3365ca5211a7c8857943c37ae8befb48e5942c3fc657555a1334e54efa06b749ee954cb52e61e797acec9dab97df271634e8923929de7312416c9c6542b2c6a95d42630b9bdf1f2028dba9bd94db8e06904fc5f6f53b3da518fda9556ec1b0e3b0a7680c79164afb33e0653c1e9b7e76cb52cdccedf43efed723b39a2c9ed0a889bf15c91ab021ce6b62bd9539054e19d71adcf88ef2c63b549cf2a07726ede6dbd73be8972eb998020455f210181eccc50c74e3d58c47fe7bcecef671943d74e9ec5239d75f63542578d66237495b318a12b8e32a0eaf0e3ecdcecd36d53d9cf4cf3acbd93380dc2d4c98ac5162cdaa74bab857028e6b2efa10a136233bb110be84012d22e4bb6f757fc887cd94eafa92291d555c04216f22f578887922fd01a632e6a9763fbae62be6209416bd132e94a5546c401fb81cb889cce114f8cda4116e2d182927ab7699d6bfaca71d070e828110a743c12b78434bc9357c80623e228080bd3e87666bd16e5d729a5484bd52cd1b2a768a7cdf734c57f4bed001f73a896bafb35813cd8bfede55739cc7afb75c78cb77cbf50ad44fb1b050542bed3e4d7cccdc4690751524bb724aa7e32ea24ca75b0b4e3e8491635b4d2b533293770bd6df2141bbc2d2bb701572f4cf1e79b70edbbd7901301bfa4d57e1bd24b1563bc7c79377dd40b949b82dab6335b521f4341c8543de8f4758646fcc1c53ec071766ad21491fae1884c2b2a956b05213fe017176f9b8b05e4c71f8904985a01da9737249a67127c68cb19f79e1ade5e0e7b2e875559848255c42d1caf51996ae115e31acc62e8f37a284847910ddf081db2098317710ed146966ff8d4f55ffd676f103c57119834a02127eafbf295f2b43ab1ecd05afab93acbab604792218da5ba9f634ec83796953a63a2c408ad42fb4a9d2c1131c00a8be74385e9442c6045a23a11894e444467f10aaf088021432a576ab444f1226605be8a9c55511e6a041f311b978a25fa7d2df91408aad72de2be2fff35c916e29770caa71ee28395bae7e97e15aee0ccadc7314023d9939875d604995bf5eb05640dc54b438008f52f15a8a897a395a766e9ba6423c26fc15b58e4dd01cb7e8faf69e4d702d446350e843b0193a0699c86fc65725f7ada8b9c377235d48ec075cd7d9f38efca0b2ccfc165fdf43fe4b1fac3c84238e4f8d0023ab1cdda2da59f86f87cc2237fc4b721ad0f4df720e64d3f623aa9b8c7f4afecd3ab37e6f30c945dd9038ef176d9d98ae297777c4776c69f13283f3aa4d906bd8f9ddd86b23e24ddc7cc7ad1d249c43d66bff80646562cc5f721dcc5c634e2ad97161d9386c955b829de56dfbdf0ededdbfafe46257f17c5b365995e1cbff8cac4da48556fe2f2a73c61ceb76121657e4fd81f07374f473f6fc78b760ace8177a2954d1c5866227b75fdbed3504ec0c8fe711988b3e0f1d99fe33fff3c1f5b4580af05057bf24ce3d921f96f876d28fab7dac720088231be2714080b48d8a9af22dffb69280b2de3814b8a110f5ce34bea7b194f0845fdb64b96ea3a135fe37440bc236fa434f3530cf93d517533cbc3b498256564f4f05ce7a0fd6a52dc2004dc87f257658aad8296ae603a865fa3f14ce811139bc3017efbc780a48b3dfe7eec70a0a7bd67126700a1eee0f9b3311ff95cce602e37454c651a7f29796d4a1152978cbe943018bfd265f1062951b848e2f4e2a0c1c1c5302234598d48c8580e51f28ce549db3cb02d78048a2e685e04655a2ce339abf307ff32a6579fc2c45eb9e56f19fb54c3aacf784cae288135562651ea31118a82b4adc0823290ec27848ad9a6252d5e4f9e1843e53ba286365161ab1939ef208e2d4505995064a4206192d330dadc893c5e5e73d3b79b86b82002e157958ed1226dac964fabd46e1c0e4a73fe0f000000ffff010000ffffbe11589ed84d0000") + bs, _ = hex.DecodeString("1f8b080000096e8800ffd43c5f73dbb693eff914882e2da944a69cde4de7c68ad3699db4e7cb3f4f9ce4c5f503254212638a5448d0b6c6d577ffed022009100045db499b6a26b10d2c16fb0f8bdd05a0f1e3cf4512a78c4cf3ecaaa0f901617949476496a52c4e4b5afdbd4eca02ff89bfc9e3f183f1e345924dc3843c3a20f3302900284c176512e6f26f047ae095f04bc1f278c6bcc9830797614e8a4d3a63cb385d90c36a44b0caa232a1be57f7792372763e9cf001659e4c43407348bc9c161c4f0d1720a179962434f7bdd3aaf588e509609897f0779ca5c47f54ccb23550f868c9d87a486e1e10f820ee754e2f5f840c91ef4fead60565ef5e4113f2dab4e2e461ce04e59c45a0043b05762425a57cc202006eb69356e73c5e98edabcdf10be4ccd35ad32ca288e4ecdc82e438454635f2643fcdf32cb78c2b284d5f629f3913489e262659395d671517bc7d3c26a7a0c6745190299d673925d32c4b0a9264d905b43046737d46c63830d0c2db6fe2e88078afe382d11410817680c319d80ad71a39c93396cdb2840808f26b1481b80b5a0020dbacc10e3d46af19fc25b5200c713b5290bf09af4f691abd9aae0b05fdbb922d32d4d97b54f3eb781533e2bf8a7f1b17c306775aaea634efc4fe1ef085e9710a8c5e86c9a93283e8215517f16f8d595a8e1db9ecbc3bfe93300f618124efe997128054e180c808080846a611975103d21f3f20395ac24aa62dc923f2dfe38412d12b14d05ff4ca0c7f704ff36b9abe4cc36942236512d1455ec460779734df3488d13e3be97e9dcd1c4879cfbd709e6439732324b2bbbf8c4fb1fd37e1a3d5b583cda46957c9d4c67f3c494f4c3e450bc14efbe073ddc32dcaf8d4beb0e57a5515f3f1f83e8bf9a3ce2862fbb5644b0adbd22ce44efda3c6f24e842761515c6579d48d54819288d74d4b27b51f5eabcb161ac8ff7df870724ac0571298a8970d55e2ae372ed8884ecbd98cd288467eb56fe1279e13ff21dfa6d4564555711a337f38d1bb7cefbf52ca809b0bbe1b784374ff61e27bcb38a25e0bdadc04f1b3d54868b6c45b92d10cec2602618b65c9a2ec2aed86b4edce3ad15b53b8bf87e09f4cc9bad9ca292bf3d4250ebb425c52bf9986b38b28cfd66014301fd82098c505dd4cb3308f6410b57528a58bc17a0b9f031f4b04aee32095361e0b0580d0af02ac27c41b171b58b22ba0b140bb2b0abf191c852c6c33a71be8c4660202239081e3159287225cf1edd449e49582d471cdefefa69f61670c406685af062ec30056ddcb70b65490c791a118ab007840f40ba239f4a081a63368f8f8fef8285badb3145c0562ea2b1e450c1cef591c9d1b926873a5fe6ea75189347b6b0a23d834bb82d931de8508f3ca1f8e34081641a78f307b755c3c2463f2747f7f5f878c23e9a8aa8f1246c3789d357480203312a7c42522eecdb0335886c5bbab14a2c135cdd9868bda028f9f2a439918bd5ba385c1966bc78293a252c05141f002e4bf09d9325885d7fefe88fc2f792c64c9218ed3df368c161f32065bf99e25e837a050782c1a9a146a336725db353584687de6d6c09c936f09ec75b325f1a94bb48650f6fbb26001d4b5b1b579083d716abb895d8b41243dbdd7413b55b24fb79d3c68a743106bb1b2d0dc2936b7f70edce5b3b9beea110ed6fd21645f651ad1799c421866df5a2074482f52dced54efaecd60a206454162006bec214ee1c47ccab2f51a66b662e6a939136bd843cf679986f737a32b70fef36cff3c60d94798203f02d580337f223a402fd382e5fed3e144e7430e3f24034c0161b31d90bffe224deb7194d0419b17d1fd04ba893f68a8c482c009cd67e09fc305958a7942063f0c07566ea5481486da9be73a3b4a20f4fbf6fa8ed379f60d941d61ce957f355d6b0af362508d7366b90e3d5794d4a02984de9d98d679bc0a21ffb261b2884f57a16e12df5c8fb04bba18b64857d4ceb8b7e6f8f7fb61d534b89e31e00a2060afb09a092e2b31c5d806a0d030698b95ef45f32483f80ca6b13b452c52599c22361fcdb5c819a945270f7096ad4b0e08dec2cfe317e7bacd21605b36557b80315942f9b4284410856d4bab1deb9ab08c473f5e2bf82214eb95ee91d23f111fd74a7b66d8837e18b63176f81c8f970138fbb52fb648f678865cfd1be49a5ddc569e3235b98dd05610eb156e6999befabb1597e91e7bc9ccf4853b65a6ba4653645895f99b252609e3429345a12ed7fe4b87be1591ff632cb49c40e736e566e513dda9062446a7941b9a7284e02053425cd2bc00dc36fabea5789218f6de4feeb977e819b6db082736a4a3b38b1cac30a3e12726ea010a604818552b0c486f356dda889208ac132ddb401625de20a1e9822d21e2224f1d1cd7f14107a3121b44ca4e63781bae4c7e2dd620a315d9db3344190c5c114aad6798de315805e9e051b7982af6878cf6677b10c19671f1d6c6785bc5a9b084d630bfa530452e7d85e29722e1e283869d22da259f3ec2e92d191ac54ca9b6db25331e43a876414948b0be88310a8cddd4dddab9612041deadab54bb3a7ec531be0e2b81d4ecdb860b4be89d780040c581e55cc953df3a28af8f0fad117e78497b4ba82873f82f5b5171f63ce3675291ee07451ba07a58b344bf946152d88533ea94ef10b2596337179f1de841660ed4ba34e3b92f491e5a6b1c3ab5dd7a6ad16eade436e4f5c225887523aacfb15bc56c270781384f929183b6639950a72c0f8a751233df1ba1a9856b651fb856f681eb804168058e84b48beda2deb4ce0aa3fa0ad3818dfeffe9bbb741c14fc5e3794b08c311b959d23082ddef80dc7847590a34b1bd0fe09f3cb0f3700da48933a7f1e7224bbdad56017ed0bd62067800327095aaf8d985733d68e724fad98ee360e6b6e7140eb149cc9ecba558ae35b458ab0e82eec49b9d28e56cc92c1fda4e728cc3a8db4a677b77fe7147b00644ad00a1425be639d89c1cf128a0d76082917fb31d55bbb4490a4e01e27b790d6bc82a460dec9426737166d08a4db5d0d4e4b7212ca8cf8661bd92c33a7ca89b83cf599cc2122616bb41e097404996078f608d9ce49c682d2640955562bbd386a36b203603524df0305b1c7d510e568b6576e5d97185d10e64362ddea8f202f2a34d1aae80fe6d0f4db6dcac55957698bf5fd01185c48aee14b631a37134cc8f96ec22d97db66b9343bf24c31a2156ebe361b340d4a5207a7b780a0ed9a643d969f9891b0634e2d44d3b19b59f86f03e7e94d342ddeae8c1ec3d186e336d2aa03b70f847f6ebf61e053169a7d956b90c78b91189b2948e483cb92da3bd4cbf4e0e2db237a06adfddcee0c002927046fd311903c11e4c57b7ec552ddab94f154e1933d4aecbe6e7ef18aed593a0244d4189b3677e304962f24c5fb822a9878e274f6ca53d15f62c3e570b2fba883a0efdabc10dc713035452aeefb3d5679ad3f0a247c94f9ca00326c702171cafcb62e99b7bbfc3d105459633bfaab68539bdab3ffa1ed665c69634afe874458f6acdcce9dc7bfb760c7e4c6feea87f74fa8b1822b6b67fbf8355a72d1581614e0cb34f7b561855e6dd066ae1384c926e3d541e52b1a8467b6dc7228dda280b29604af1a5b0c7d5781700b3c69ea621ee0e98b6e12a0dd1e043bca2e4b9711d7ba775cc121ae62fabab0a9d71a27ac75ba3f34ca75a9632f7c8d3734ed6ceed938f1b734a1c91ec3c8f21b14836a65a6151aba43681c9ed8d971768d4ddcc6ec2054f23e0ff7a9b9ad58e7ad4aeb462df70d851b0033c8e247b9df531980a4ebf9d66ab65e176fe1e7a6f97dbc9114d6e5740dc8ce78a5c15e030b75dc99e82a40aef8c6b73467c6719ab4d7a56399073f3eee89df34d945bcf040429fa0a09086467863a76eac122fe3be7657f3fcb18ba76f22c1ec1acb3af11ba6a341ba1ab9cc5085d71940155871f67e7669f6e9bca7e669a67ed9dc46910a64e562cb660d13e5d5a2d844331977d0f5598109bd98d58400792907659b2bdbfe247e4cb767a4d1589acae0216b2907fb9423c947c81d6187351bb1cdb7715f3154b085a8b964957aa32220ed80f5c46e4748e7862d40eb2108f1694d4bb4deb5cd3578e838643478950a0e391b825a4e19dbc423618114741589846b733ebb528bf4e29455aaa6689963d453b6dbea729fe5b6a07f85842b5d4ddb7f5e5c1fe6d2fbfca61d6dbaf3b66bce5fb806a25dadf002810f21d24bf046e264e3b88925aba2551f5934c2751ae83a51d474fb2a8a195ae9d49b981eb6d93a7d8e06d59b90db87ac1893fdf846bdfbd869c08f825adf6db8b5eaa18e3e5cbbbe9a35ea0dc14d4b69dd992fad80842a6eac1a4af3334e20f1af6018eb35393a688d40f47645a51a95c2b08f901bfb878db5c2c203ffe4824c0d40ad0bebc21d13c93e0435bceb8f7d4f0f672d87339acca2214ac226ee1788dca540baf18d76016439fd743413a8a6cf846e8904d18bc88738836b27cc3a7aeffea3f7b83e0b98ac0a4010d3951df6faf94a7cb896587d6d2cfd5595e053b920c692cd5fd1c7342beb1acd4191325466815da57ea6489880156583c1f2a4c2762012b12d589487422223a8b577845000c1952b952a3258a17312bf0d5e1ac8af25023f848d8b8542cd1ef6bc9a74050bd3d11f77df9af49b610bf84533ef5109f93d43d4ff7ab7005676e3d5d011ac99ec4acb326c8dcaacff7650dc54b438008f547fb15f572b4f2942b5d976c44f82d780b8bbc3b60d9eff1358dfc5a80daa8c68170276012348dd390bffced4b4f7b91f346ae86da11b8aeb9ef13e75d7981e539b8ac9ffe873c567f185908871c1f5a4027b659bba5f4d3109f4f78e48ff836a4f5a1e91ec4bce9474c2715f798fe957d7af5c67c9e81b22b7bc031de2e3b5b51fc728cefc8cef87302e5478734dba0f7b1b3db50d687a4fb98592f5a3a89b8c7ec17dfc0c88aa5f8be81bbd89846bcf5d2a263d230b90a37c5dbeabb0dbebd7d5bdfdfa8e4efa278b62cd38be3175f99581ba9ea4d5cfe9427ccf9362ca4ccef09fbe3e0e6e9e8e7ed78d14ec139f04eb4b28903cb4c64afaedf771aca0918d93f2e0371163c3efb73fce79fe763ab08f0b5a0604f9e693c3b24ffedb00d45ff56fb18044130c6f784026101093bf555e47b3f0d65a1653c704931e2816b7c497d2fe309a1a8df76c9525d67e26b920e8877e48d94667e8a21bf87a96e66799816b3a48c8c1e9eeb1cb45f4d8a1b8480fb50feaa4cb155d0d2154cc7f06b2a9e093d62627338c06fd7189074b1c7df8f1d0ef4b4f74ce20c20d41d3c7f36e6239fcb19cce5a688a94ce32f25af4d2942ea92d1971206e357a62cde20250a17499c5e1c3438b818468426ab110919cb214a9eb13c699b07b6058f40d105cd8ba04c8b653c6775fee05fc6f4ea5398d82bb7fc2d639f6a58f5198fc91525b0c6ca244a3d26425190b61558500692fd845031dbb4a4c5ebc91363a87c47d4d0262a6c3523e71dc4b1a5a820138a8c14244c721a469b3b91c7cb6b6efa76d310174420fcaad2315aa48dd5f26995da8dc34169ceff010000ffff010000ffff1acec71e384d0000") 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("1f8b080000096e8800ffec5deb73db3892ff9ebf02e1dee5516752ce63f6b61c5955193bd971ede4517172735b53f30122211163926000d08ecef1feedd70df0fd902945763cbbfb219148020d74a3bbf1eb66439ede3f7e77f4f1efef5f9150c7d1ecde143f484493e5a1c31287244b97a6e9a1a35689af439e2ccd2d5f245a8a2862f2d0392d9e1c691939c48fa852870e368a043d739024a3c1ec1e21d398694afc904ac5f4a193e985fb17a77a106a9dbaec73c6cf0f9dff753fbd748f449c52cde71103b230224ba0d7c9ab43162c59ad5f426376e89c7376910aa96b4d2f78a0c3c3809d739fb9e6628ff0846b4e2357f93462874fbcfd0ea180295ff2547391d468759ad14c8742765a443c39239245203178acfd4c13ee23a550b2c5a1b3a0e778e9a520c8d93deca0b98ed8ac1422f94a2e2fe19b7a2b02f616467af4f8ea6a3ab1adca012cb1b9105a6949d389afd4a4bcf2629e7870c7c9e7a15711532163daced05c13bd4a8109cdbe68ec6c9e103217c18a5c9aaf84a434086042ee5c682de203f2dffbe99717f9b30530ed2e68cca3d501717e62d139d3dca7e42dcb98b347ca1b7be4a50469ef114513e52a26f9c292b8ba673eb2e8bfc21fca11632a973c71b5480fc813ef071637da7a38593716895029f559d9ab3197372c89c41e792312eac3e79148940085dc23ce91c8246712a67801332cc9b486a0a06ca8dd014b140b66daa8ae9633549dee5394d7f0d3052cc8f0d39272b09672efd39272504a612e64c0a4955d2292165f91588a96980fc8fe8be64ad7ee1832ee0fd582a74271b48803d429b0c9f3f6005c693711ee3c03a7a0cba1cc6da3702e2a9c9d5aab233016657152f609b84a230a6bc913d075e6ce23e19f15f300d5b6960cfa58e847a938922f430daa533d9853ff6c29459604388a9030fde5fcd1d3677fde234f9fefe37f4f1ebf684a50d28067ea803cab315fc8e749fa853cafee17827c0ab79f16b7afda7c819a255e40c171b4f43c620b98ed7ea5e80df69eec57b78de6d3882f51fec8e48beb655508b870c45df9e25a90fb3c46af4913dd630944874d33bb6056c4cff7f77b9b071def61997c0abea36728f04613a31db0494cec2e716f6a54dfb8c6fbae4b3e8a14565112d7b5f7127a5e6e31f41c9fd80fd4fce26bc016348b6027802d8a99767c498d3fb76e6e1af09208ba6f0aa293f9337490b060cd31dcb9a449e0cca63c5e164fd0a41ca2a48f1ed6c52bf7c9d3bf18c74eecc6e33c7b0a6edf48cc7e9fcc48e9e7a72aa65154100b7900b6ed7e0147dc1cdffabc4c3318fd2b080b1ecd7a3708436e96b72838c9a21a1f85746a5f8d2e558c47bc681e489106e222299f99e734df77fee4b4db81f4974bdca651cff38b3a955701d70f92b94a5f4ce7a5e4a9c42d693a99c33fda18a89a773940cc92ac311b33df5939270b4b22ee9fc1d61c041f582a1e3d06ea75612ea3551ae2f64bca6f6e18e0ba5ab13d6031ccf0651010ec0e0e4fc8154e6d3a8191460f8deb326a6860ff825911b4864712830397a2e1e73c40bddd607a0cd6e194690d0aa846cdd117cbd6fc8aee1b0a868f97cb67e943d3f6b0a1b82027c776d4ba92ef442e2acc34aad9a8f989c5a23339db7d439948a634957aa4b22ca079d81af883a5d037ee749245d575f369f56c3a0171195838019f605dec8077b4edd127bfe6526970ae177b4424d18a00d2bd48085f9084f94c292a572f483e3372416582b036f7df397990010761dc07fa0bbe3c49d02d964e0508573ea93199c88d03f0b2353f507f0e62611131ffbbf9b04dffd56eebe296635a4dc367cd27066f3bb3828bb78c052c803dead9ac94d83059dcc1dabe2a9d7d0c19b1fc66d2ec4624a48acc19038840cf5940e6102b244213ea03bea2e0f2bd6abb20718622cfa7a345d908b6680672bf6892f6a693b4a90cd74e1a31656d17cc9bc19c34ccd4460bf6a25ca7b94e08fc73556c3ef25d97a40001f39de56674dd4ea335d1ba9e448cca05ffe2f4ac55f346e3b276917fed683c5b6611200e50d0963e3734b7a0871dab8dc46061f208610a62a2c715855e2dff73af09d8a542449b3a840728d69c3e676a84595c5e6287237cf008bf7927c7801ecc3ac125a3da52043849f0f3679832aed83823aab71ab0a7269a688005e03ba2a92a30440ae800a3ea3f35382c0008decc990116808306e54df67c925339e692f9669dbe1213b9bfa73abcba1a225b2939a961374beb54539dd5e5dbddb0da80071dcbb5e65aac7783f1a6980b2192529a1b7aaa7a131b768225a6104543c4d7f60d16f3d71b9356a49a5f2b2d798a08b6d5df227d429a7765fb16de0caff71a9ab6a14acdf8103900911eca41036ae788b82661e817742639e9ce72fb892f448481a74859d262e0b579b2cdcc4b75be0d067c11033c6f0359dcbb422912fe7f664bda828b1e43ba6956969198b7a1e75fe11e8d1a31c146acc48066a35f732e7ef39686dc6b1e3105be86461774a5de66f19cc9ab2bb2c0db7b64a0d38f2b6d3acd794271697fbc798184226ecbe367e1ef501c1152db501aa6cf7710861f892c7011e94782b6e3c67700dfc4c240b66f934802607343816097ef200fcc36b5a4f0862a8091db6a47b79d99421e2e18763f00dc7807518733fb3b537da160a7dbfd56bfb762b0db8d4b2c039fc8fc33d6569e9365222423ef998cb952e02ed5aee56647c001d4a6a26b74fd9ed25321a04297469dad06ef07e417aec30d4dcf5054265b84ac8ede63e04e17bdc04dc43bed9b6d2cd78f231dcc11f44756a9e43198b43390d0a9663f22b60290e1f3a8253f4ccff56756b68da09a31541e0c6106a8160619b677140725407a4c0054a6866b110ff63d5a2c31e8f9b548ac3e7afcdb1661cfa8c0677ce863992a621ebc02e89fcfd6c359dad067b33d9c581226739cd3325a4fdb6a3b3624199ad735910988fb0e072743e1c980f71a1ba274721a2fdf904f9a476b31f23af7b582dd36f6e0e3ba8dbfdf157f233b549da9164747ef3fed82233fcd60bff1c10e5a20082e13880a248d0e9e5c5dfde76db1ba16f91de7b7c907aad9c61cf3649ee2f2c50c34d1bfba82abdbe52a4b7b78fa946ecf91c87487a55e74b086a70281e4fa00f45f268900f8c4defd8ddc3f241958f182273d863b9a7b7c571d0ad90eba8b71c82993e743d1f77824d6daf0cd8b60d341653e66cb9d759c3ab377e6c5ee10e41a241ed064c96449fbfe00f1c5e21aeab7e649dab99bff61526de33fce6dbf7e1c378047b7c7723780e60cfa2836e6ef06e8466492cd1c4d26b9821143b84ae89049e44c6d954efe3eb86a789dc7bccd6df4eec55c63f4a8995dc6be7952ac0edd7a5e87de3a9cfb97c3725887d77d750f4c0c44ee6b7c16ca1afb3616f59610c0f6a9db6b18ead1d33f3c5403f209f35124ead7a681fce6fdf3c1b875dcee02e2dd01b4806c41dfadb4f4dfb0e19a3cd0bdeabbcdff4c9a2fcef1d62b298554fdd5210c9fd957d05ec492a50ec98cecdfc53291b742739f7d5379481d3801e3089a6afce3829a02bfcb4bb8eb7de43103db0354c30e9c9f0ee2f800e288abab83a20c10f0c642729604d1ca822eec64446d34fce64b436a00a6bf4aa4aebea65ec32ac2b8faabf6befbee6fb75b14d2d0e9b244aa2c51c5db3f9aa2f97195ab45e14c7e099364415e755f877ff7ba8ade295d1d2af8ac9b82ad466bd6b71a30937b163c8671300116952f32a998571efdf012a627ceec344bb18e974cc86b21b3b85b7c366a0805632cb90eb3b9072064e2d3280e27e55013c960c114e6747f062d579a7cb037b61c6d0d433ed05f0ab99a04c2cf100ce5a5c2c7f5cb9b61922b95218b3f667df5943b1801160b58f61939eaa9285d5f056812f610d30879663d11894540a3529dcb78c1b631f65bdabf6dbaa001ebd15bf3d00d388dc4b2d783db06f9c19a012f6edba06706cba311037d34ff17998f868187cf9bdd7a83c7ebdc0efb020f63a30daee2cba43fd23b2a4193dddb1a7e267c3ee066fa78eb864c6973a8aa385031f083581538670481ef1e81e5c2909b11ae0825a914004a6272018a4256a011e404642b61e94805f2bc06f10f80eb5640fb41c8a288a72f1a7ca4a3bd65c36dda823853c5674a1a7bf549960dee8236f164216e4097da158e2dd11712b815e5010da964ee91f7c6cd925044c1aed7be28931e58f9a208fb2eac7b919cddfdd2d7abc79b2b5248078f3d464cb35b59fdaa06198637cec3dbd5729f1c0f2c340f3e6fb15558626eb49bd5be81956d9d5b687436afbe4f00ca69bee0be2dff7e100754852feac9c1eaf573333ff86deb5f6f7001264df03f04e4ad1395e612dfb9b5c4737919af6031bf123fcc9233cc060e4e050f48e5e11bf62957d952b5e7d308347201b1c4f38442086acf507d9693ee30ce6403a67ba29451e5eb65446292c48012b10227273aaa583d16e7ed12b9a3482054ed04259b9a90511b0cef07e15711fbdf397b022dc0732187ce7d9c22b89a575f2094ed6ceb85a955c79eea9ade22358a1226317a486de1341742c6f91942fceae427bfd15a5f9935697b881a4dec5014a89850d7dcbd7c08fed63570fa211ec02c087989c9ab79ffc193731af1803c78d0f734e052afda6f263050a073066b2ea49d1cd8ddcc3a9c63c0fbf8acd38327299e36c9df0e76e45a318a365cbc16a8d9b3612fff1580961b716a67cb0defa656115c4026f1fd0b4e2c4f23e201f5cf19972c00eb3133eaccb39e0e1a58fc351ecd64313bc3d63d4c4f6ace646372da008052ebb4aeabb1eb592dbb925fbff6ad642a0d1730433c1694d8c542046ffc2431d0dd07ea00e817787c19f34178d2c731da3d23f97138705ad696857d6cdeb319721e39450900fa87ceb8cfe057202acc0f1b808778c44d555ff0d81b666cc08067bf840018ec015f882ef0f4110eb947ce184b71a631874175483599b278869b9a69309dc0953dc9047c417f163427ae38c8410be10d97188e285aec11b7b138afd0b675d6d55c1058023c9105b39d4734391b98572ba3d69ff0edf70d6b4d9962d916e282f5569c46b0d0a1392a70e8fc24e2a27221375ca4d267b6a3ec94dacab17ee3ec3593537b1830511af6052c88ce3d51a1c17e94990a6165de0fb50faaed4a76d4be8ac3e4cacbe2eb06520c562036ee1bb10022c0947ed0e7c1c8e121b13807455d0dbaadbccbb99e6ab9a1dc5f19c781eff328512ca5124f10f61d26af9c234f0f309157140696d3c7ecc1da8eb9788a8ee0b65226cd6e49332d3047e213936e032d5ca10ee0c2e7e447acf87482b46e01fa95ef546a2781e939cb4f2a3717bfe6308a5d7a9b5cf529d0efcb56df39a85acea87ffb451f5a6c0ca72c5a38d7ccdc64e5ecd9503cfe581739580144bba38f87c3e692b5ab0e8f0d892e179b67a752713ddec656ff0c78bb7e486327a87b88e0eeb03796b9ef047b57843cfcdac2de3d4f47606fdb144f8d37ce1dae45e02557b88934f7a0fcfd836a39a2ce7214e74207e0f935fbce077b86a8c2e2244bf8e70ceb7152b1d916d46ed43e83d29268898f7b9e55f8f8140fe3028f3675023e646173dba43c18bcf2c89b1c53e27d05224558697f5ec5820d53f13584deae99a6c58e5628c6f20d4294f5352e31ad6df54d03d541ea901af64de1c6a1ea5853c283d3eb8cc93e1f694ed8b861507863ac4999ce4da3fac7e4b832abc2706cbb2d4da73c693b229afd56abb1a21bb21bfbb4b21cbc466cd6349622e2326728112fc24499f4c82f1cec05b4c797cc2047be201c13c24c991fa560e86e3c827aa739c8d2fc8c1ff5d1b8a698f69cfd633a319f45d89a61591ec5b74fe50fe1a1e5dac6659dbfa18561b8b9bd85e158a6af359d9ad2758c274539dd7ea4577f938f6702e7e24b5f92a157d56bea6e35b4a430a0a5d5e9c7fa4f52d8c39a3d5176bf7d8dcf95d8e3ab986f482540731f156a21458c5a0340509118300c6a6295b0507be60750da0d8a0482cd1d98b8fc22d75485a7434afd56ba083472a7bfd3d0f25617ab71de92748f86ded0826110970f41e65cdbf5cbb344e402533e91106788fdd190f385f2c8276516eaf5cb8ff678b231ec1b0becf3837ea6ac6988edbec56a17a6afad4adfe96a2a884dd000cc40a690b2a8a2743a87f1da55e1bb59dc533303fb4b413809341a73f09598d45ccd156281c016017a95a81dca1836e875d387d514fa928838f106a6c677d6667f41ebe73567ce0d734b66bccadc54e42739f8c3ad6b6554dac7f7dbe03cf0172dcf9949901afc1653ed87b0d1c1ae16adcade08232d857b8312b9ed0445feeb76cdb8a0b6e3fd3b418171d137262446ff84e04d26248a5fdb1b2a99c81fdfb96c445f8a80543f1db8e3e4c0f0ae522f12ee7bde3965dedfac1506151b492e7ef456e54af4ee17b5d75879430fb513d3c70f31b8788870bef32431275e1ff6926cee8a80a7f3ce3cc0a34bd5b5f9356b04d8839b59b99da142b508ad0b8aaaa6789d9ffd2af63ff363741e1606428377a93d445091fe6d30b9dda311032b57df767b053b17225a2fbcfe6758f0d012df3a11ad4101df2485c19d7f8d88fa4141efcd9b308265c64f6fce0e7a9fa530351070f0c7b792bf7e3af917b7904d247093d671e75e486df493bd7f5844371a1be157fb371a6ced184039fc5d4ef3770f7eb748cc3c9db51bfefe396372e53ef5f6bd67d7b7aefebcc2efedbfaeb0b61f4dd35603e0d59c1403e063fec8c6ff030000ffff010000ffff92b63cbd75630000") + bs, _ = hex.DecodeString("1f8b080000096e8800ffec5deb73db3892ff9ebf02e1dee5516752ce63f6b61c5955193bd971ede4517172735b53f30122211163926000d08ecef1feedd70df0fd90294576bc3bfb211149000da0d1ddf875b3414fef1fbf3bfaf8f7f7af48a8e368766f8a3f24a2c9f2d061894392a54bd3f4d051abc4d7214f96e6912f122d45143179e89c1625475a460ef123aad4a183952241cf1c24c96830bb47c834669a123fa452317de8647ae1fec5a90a42ad53977dcef8f9a1f3bfeea797ee918853aaf93c6240167a6409b43a7975c88225abb54b68cc0e9d73ce2e522175adea050f747818b073ee33d7dcec119e70cd69e42a9f46ecf089b7df211430e54b9e6a2e921aad4e359ae950c84e8d88276744b2083806c5dacf34e13e520a255b1c3a0b7a8eb75e0a8c9cddc3069aeb88cd4a2692afe4f212aed45b11b0b7d0d3a3c75757d389ad55766089cd85d04a4b9a4e7ca526e59d17f3c483274e3e0ebd8a980a19d37684e69ee8550a93d0ec8bc6c6a68490b90856e4d25c1292d2208001b973a1b5880fc87fefa75f5ee4650b98b4bba0318f5607c4f98945e74c739f92b72c63ce1e291fec919712b8bd47144d94ab98e40b4be2ea9ef9c9a2ff0a7f287b8ca95cf2c4d5223d204fbc1f58dca8ebe160dd582442a5d46765abc658deb024127be48d48a80fbf4722510204728f384722939c4918e2058cb024d3ea8282b0a174072c512c986923ba5ace5074baa5c8afe1d2052cc870694939584bb9b7b4a41c945c980b193069799788a435af482c458bcd0764ff4573a56b4f0c19f7876ac153a1386ac401ca14e8e479bb03aeb49b08779e8151d06557e6b111381705ce0eadd5102616657152b609b84a230a6bc9139075e6ce23e19f15e300d1b69a0cf258c8472938922f430da25315cca97fb694224b02ec454818fe72fee8e9b33fef91a7cff7f1bf278f5f34392869c03375409ed5265ff0e749fa853caf9e178c7c0a8f9f168fafdaf302314bbc8082e168c979c41630dafd4ad01bd37bb25f3d36924f23be44fee3245f5ccfab82c18521eef217d782dce7315a4d9ae81e4d203a6caad905b32c7ebebfdf5b3de8580f3bc9a7603b7aba026b3431d2019bc4c4ee12f7a646f48d69bcefbae4a348611525715dfb2ca1e7e51643cfb1c4fea0e41797015bd02c829d00b62866eaf12535f6dc9ab969c04b2268be29b04ee665682061c19a7db8734993c0994d79bc2c4a50a51ca2a48f16d6c53bf7c9d3bf18c34eecc6e33c7b0a66df70cc5e4f66a4b4f35315d3282a88853c00dd76bf80216ef66f6d5ea619f4fe15980545b3de0dc2909be5358a9964516d1e05776a974696aa8947bca81e489106e22229cb4c39cdf79d3f39ed7ac0fde512b76994f3fca64ee555c0f58364aed217d379c9792a714b9a4ee6f08f363aaac65d7610b3246b8cc68c77568ec9c29288fb67b03507c107968a478f817a9d99cb689586b8fd92f2ca0d035c57cbb6072c8611be0c0282cdc1e009b9c2a14d27d0d3e8ae715d46750dd3bf609605adee91c460c7256bf8390f506e37181e837538655a8300aa5163f4c5b235bea2f9868ce1e3f9f259fa50b5dd6d282ec8c9b1edb52ee43be18b0a338d62366a7c62b1e80cce36df902792294da51e292c0ba81eb63afe6029f4f53b9d645175df2cadcaa6136097818513b009d6c40e58475b1f6df26b2e9506e37ab1474412ad0820dd8b84f0054998cf94a272f582e42323175426086b73fb9d93071e7060c67da0bfe0cb9304cd626954807065931a8389dc38002b5bb303f572600b8b88f9dfcdbb6ddaaf765d17b71c536b1a3e6b9618bcedcc8a59bc652c6001ec51cf6625c786c9e20ed6b655e9ec63c8889d6f26cd6e4442aac89c318008f49c05640ebe422234a13ee02b0a26dfabb60b1267c8f27c385a9495608b66c0f78b26696f3a499bc270eda01153d676c1bc1a8c49c348adb7606fca759aeb84c03f57c5e627df75490a1030df596e46d6ed305a03adcb49c4a85cf02f4ecf5a351f346e6b37f96547e2d9328b00718080b6e4b921b9053d6c586d24060b9347085310133dae28f44af99f7b55c02e1522dad4213c40b6e6f4395323d4e2f2121b1c61c123bcf24e8e013d9875825b46b5a5087092e0efcf30645cb1714a54af35a04f4d34d1000b30ef88a6aac01029a003f4aaffd498610140f0613e199802cca04179933d9fe4548eb964be59a7afc478eeefa90eafae86c856424e6ad8cdd23ad5546775fe7637ac36e041c372adba16ebdd987893cd051349c9cd0d2d55bd8a753b411353f0a2c1e36bdb068bf9eb9549cb53cdef95963c4504db6a6f913e21cda7b2fd081f86d75b0d4ddb50a5a67c881c80480fe5a001b573445ce330b40b3a839c7447b9fdc0172242c753a42c694de0b529d966e4a538dfc6047c11033c6f0359dcbb422912fe7f664bda62163d8a74d353594662de869e7f8567346af8041b4d2506341bfd9acfe2376f69c8bde61153606b68744157ea6d16cf99bcba220b7cbc47061afdb8d2a6d19c271497f6c79b674828e2363f7e16fe0ed91121b50db961da7c0766f891c80217917e2468db6f7c07f04d2c0c64fb368e24003637640836f90efcc068538b0b6fa80218b9ad7474eb9921e4ee8299ee07801befc0eb70667f67aacf15ec34bbdf6af7560c36bb718e656013997fc6dac273b24c8464e43d9331570acca5da35df6c0fd881da94758da6df937b2a0454e8d2a8b3d5e0f380fcc275b8a1ea198aca448b70aaa3f71878d2452ff010f14efb611bcbf5e348076304fd9e552a790c2aed0c0474aad18ff0ad0064f83c6af10fc373fd91956d3da8a60f953b431801aab94166da3bf28312203dc6012a43c3358f07db1e2d96e8f4fc5a04561f3dfe6d0bb76794e333def5b1932a7c1ebc03e89f8fd6c3515ad767b33d9c581226729cd332524fdb623bd625191ad7359e09b0fb0e3b2743eec980f51aeba274621a2fdf904f9a476b31f23af3b582dd36f6e0e7ba8dbfdf147fe374a83a53ad191dbdffb48b19f96906fb8d0f7ad00241709b8057206974f0e4eaea3f6f6baa6b91df71fe987ca09a6d3c63209f80af867bfeaf0fb5d0347af89bc793798a6b1a33104fffea0aef1e0dd43d490cf4fb88b77531787cbbccc9d21ed67c4a77cc1891e9f19c0148be1bd6147828974e18e6cb241100e6d8bbbf91fb8724039bb2e0498f1919cd447c731e0ad90e0114fd905326cf876201e371610b7e98d7d2a681ca7c8cdd3beb66eaccde99d7cc43007090784093259325edfb03c4178b6ba8df9a5d6b4792fe8749b58d353bb7edfa51e5003ade1e59de00b63458a88009df0d5e8e886b9b319ab876056a86509ed021933833b55570fbfba0bce1751ef36eb9d1ba17018e91a366ac1bdbe621ba3a90ec79397bebe0f20f872c312bb09b480093188823acb159c86b6cdb58d45b0212db0792af99508f9cfe4b01c7a6828cc28fed267f0418d99ef31834d96eb333507907f009ce0dda6ea517ff062ad7c4c1ee55d736fe3569260ee0a357520aa9fab3631896d957f05ec492a50ec98cecdfc53499b742739f7d537a4c1daac1c411a6d5e68f0b6a121c2f2fe1a9f791c70c340f70143b707e3a88e303f05caeae0e8a344840380bc95912442b0bf3b09161b591f09b4f8da941a6fe2c99baf89a7c152b08e3f2cfda3bfdbbbfdd6e524c43a6cb14b13245171fff680e0d8ccbdc2d1287f25b18240bf2530775c079af2be89dd4dda184d7ba2ad86cbc667eaf814fb965c16328071398a2f2452615f3caa32f5ec2f4c4999d6629e6319309792d64167793ef4675a1a08f25d76136f700f64c7c1ac5e1a4ec6a22192c98c298f6cf20e54a930ff6c196bdad99900ff49742ae2681f033845f79aaf471fdf66626c995ca708a3f667df9a43be801160ba6ec3372d49351bb3e0bd2bcb0002f4ac8336b89482c02d8f00b712e3d145bc7e86fa9ffb6ea8206ac476e4da11b701a8965af05b715f283450356dcd641cb0c9a472306f268fe2f622d0d050f9f379bf5baabd7991df6050a63230daee2cba4dfb73c2a9193dddb1a76267c3e6066fae6d675d2d266575572a4626007312b72ce0842ed3d02cb854e3e235c114a52290094c4e4020485ac4022c809f056c2d2910ae9790de21f0010ae80f6839045114f5f34e6918eb6960db36913024d16a349e9ec95275956b80bd2c49385b801596a6778b6585f70e056840724a4e2b947de1b334b421105bb5efb224d7c60e58b24f4bbb0ee453878f74b5fcf9e6fae48c11d3cf61931cd6e65f5ab1c6ce8de180f6f57cb7d723cb0d03cf8bcc5566189b9d16e56fb0656b6756ea3d1d8bcfa3f0128a7f982fb36fdfd411c5015bea88723abd7efcd88e4b7ad7fbdc205a834c1ff1090b74e949a5b7ce7d862cfe565bc82c5fc4afc304bce30fe3838143c2096bb6fd8a65c654bd59ecf2350c905c412cf130a2ea83d43f6594ebadd38930d26dde3a58c4adf2f3d121396069488194839d151c9fab1386fa7081e4502a16ac729d954858cd8a07b3f08bf0adfffcee91348019e8b3974eee310c1d4bcfa02ae6c675b2f54ad3af65597f416a951943088d1436a0ba3b91032cecf50e2a5939f7c476d7d65d6a46d216a34b14191a0635c5df3f4f221d85bd7c0e9877800b520e42526b8e6fd074fce69c403f2e0415f69c0a55eb5df85a0a340e70cd65c483b38d0bb993538c780f7b1acd38227299eb6c9df4776f85a4d1475b8781151d36733bdfc2b082d33e2d4ced69bb99b5c4d300199c4373e38b03c968807f43f675cb200b4c78ca833ce7a386860f1d7583413feec745bb7303da139138dc96903004aadd1ba2ec7b067b5ec4a7efddab792a934b38011e2b1a8c42e16227863278981ee3e500740bfc0e3db180fc2934e8e91ee19c98f0382d1b2ba2c6cb179b367c879e4143900e81f1ae33e83974054980f3b808578c44d5663f0d81b9ed88002cf7e090130d803cee05de0e92bec728f9c3196e248630e9dea906a3265f10c373553613a813b7b920be605ed59d01cb8e2c0072d84379c62392269b387dd46e3bc42dad6695773416009f0441a8c761ed1e46c605cad885a7fc0b7df36ac55658a696b880bd66b711ac14287e6a8c4a1f393888b5c895c71914a9fda8ed2536a33e7fa95b3574d4eed61c84469d81730213cb7448504fb516632a4957923d53ea8b72bde51fbf20f832b2f8bcb0db818ac806ddc376c01448021fda0cf8291c34362710eb2baea745b7e97633dd57243bebf328603df2052a2584a259ea0ec3b4c5f19479e1e6020af488c2c878fd183b50d73f6140dc16ca54c9add92665a608cc42726dc0652b84219c085cfc98f58f1e90469dd02f42bdfa9d44e42d373969fd46e2e7ecd6014bbf436b1ea53a0df17adbe7350b51c51fff68b36b4d8184e59b470ae19b989cad9b3b178fcb3ce72d002f076471f8f87cd256b675d1e1b12dd596c1e9d4ac5f5781b6bfd2be0edfa21959da0ee2182bbc3de98e6bf13ec5d11f2f0b285bd7b4a47606f5b154fcd37ce5dae45e0e5ac701369ee41f9fb07d532449de528cec50ec0f36bf69d0ff60c5585c54996f0cf196600a562b32da85da97d06a7c5d1121ff79455f8f8140f23c31c6de8046cc8c2c6b64979307ae5913739a6c4e70a588ab0d27e5ec6820d93633684deae19a6c58e962946f30d4294f5352e31adadf54d1dd541ea9018f60de1c6a1ea5855c283e3eb94c9968f5427acdc50287c3056a54ce3a652fd63725ca955a138b6de96aa539e341ee1cd7eabd658d60de98d2dad3407ef119b3595a5f0b8cc1952c48b3050263df20b077d01e9f12533c8912f08c7803053e6a31c0ccd8d4750ee34075e9acf18521f956b8a61cfd93fa613f35bb8ad192602527cfb547e081035d7562ecf39185ae8869bc75b288e9df4b5aa5313ba8ef2a4c8a7dbf7f4ea6ff2f14ce45c7ce90b32f48a7a4ddcad84961406a4b43afd59ff24873dacdae365f7ebd7f858893dbe8bf186540234f751a01652c428350004158901c3a02456010bb5673e00d3ae5004106cecc0f8e517b9a42a3c1d53cab7d285a3911bfd9dba96b7ba588df3a6a47b34f686160c9db8bc0b32e7daae5f1e25221718f289843843ec8f8a9c2f94473e29b350af5f7eb4c7b38d62df98639f1f7434694d43d3ee5bac762afcda3cf89daea602df0415c07464b2298b544aa77318b19d87be9bc53d3523b05f4ac241a0d29883bfc484e66aa6101304b670d0ab40ed50c4b041af1b3eac86d01744c481373035beb336fb0b6a3faf19736e26b764c6aacccd198024077fb875ad8c48fbf87e1b8c077ed1f39c9900a9c16f31d57e081b1dec6ad1aa6c8d30d252b837c891db0e50e45ff76bfa05b51defdf010af48bbe312031fa138a37199028be363894329117dfb968445f8880549f4edc7170607857a92709f795774ed9f7576bb941c54692b31fad55b912bdfb45ed35565ed143e9c4f0f143742e1e229cef9424e6c4efc35e92cd5d11f074de98077858aaba375ff346803db89995db190a548bd03aa7a8aa8af7f969b362ff331fe3f33031102abc4bed49828af46f83c1ed1e891858b9fab6dbcbd8b910d17ae6f59761c2438b7deb58b406057c13170677fe352cea0705bd0f6f420996193fbd393de82d4b6168c0e0e09f5f4bfefae9e40fae219b70e026b5e3cebd90dae893c5ffb4886e3436c24bfb372a6cee184039fc2ea9f9bb0fbf5b24664a67ed8abf7fce985cb94fbd7defd9f5b5ab3f2ff17bfbaf4bac6d47d3b45501e66a4e8a01f0317f64e4ff010000ffff010000ffff7f725ba075640000") gr, _ = gzip.NewReader(bytes.NewBuffer(bs)) bs, _ = ioutil.ReadAll(gr) Assets["index.html"] = bs diff --git a/gui/app.js b/gui/app.js index e959daac3..5ea7694dd 100644 --- a/gui/app.js +++ b/gui/app.js @@ -86,9 +86,6 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) { id; prevDate = now; - $scope.inbps = 0; - $scope.outbps = 0; - for (id in data) { if (!data.hasOwnProperty(id)) { continue; @@ -100,8 +97,6 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) { data[id].inbps = 0; data[id].outbps = 0; } - $scope.inbps += data[id].inbps; - $scope.outbps += data[id].outbps; } $scope.connections = data; }); diff --git a/gui/index.html b/gui/index.html index 2f8c91d30..751dc52d6 100644 --- a/gui/index.html +++ b/gui/index.html @@ -212,11 +212,11 @@  Download Rate - {{inbps | metric}}bps + {{connections['total'].inbps | metric}}bps ({{connections['total'].InBytesTotal | binary}}B)  Upload Rate - {{outbps | metric}}bps + {{connections['total'].outbps | metric}}bps ({{connections['total'].OutBytesTotal | binary}}B)  Announce Server @@ -262,11 +262,11 @@  Download Rate - {{connections[nodeCfg.NodeID].inbps | metric}}bps + {{connections[nodeCfg.NodeID].inbps | metric}}bps ({{connections[nodeCfg.NodeID].InBytesTotal | binary}}B)  Upload Rate - {{connections[nodeCfg.NodeID].outbps | metric}}bps + {{connections[nodeCfg.NodeID].outbps | metric}}bps ({{connections[nodeCfg.NodeID].OutBytesTotal | binary}}B)  Version diff --git a/model/model.go b/model/model.go index 3b386f8f7..fcca355d1 100644 --- a/model/model.go +++ b/model/model.go @@ -181,6 +181,15 @@ func (m *Model) ConnectionStats() map[string]ConnectionInfo { m.rmut.RUnlock() m.pmut.RUnlock() + in, out := protocol.TotalInOut() + res["total"] = ConnectionInfo{ + Statistics: protocol.Statistics{ + At: time.Now(), + InBytesTotal: int(in), + OutBytesTotal: int(out), + }, + } + return res } diff --git a/protocol/counting.go b/protocol/counting.go index d7a3f6c0e..6ed261010 100644 --- a/protocol/counting.go +++ b/protocol/counting.go @@ -10,9 +10,15 @@ type countingReader struct { tot uint64 } +var ( + totalIncoming uint64 + totalOutgoing uint64 +) + func (c *countingReader) Read(bs []byte) (int, error) { n, err := c.Reader.Read(bs) atomic.AddUint64(&c.tot, uint64(n)) + atomic.AddUint64(&totalIncoming, uint64(n)) return n, err } @@ -28,9 +34,14 @@ type countingWriter struct { func (c *countingWriter) Write(bs []byte) (int, error) { n, err := c.Writer.Write(bs) atomic.AddUint64(&c.tot, uint64(n)) + atomic.AddUint64(&totalOutgoing, uint64(n)) return n, err } func (c *countingWriter) Tot() uint64 { return atomic.LoadUint64(&c.tot) } + +func TotalInOut() (uint64, uint64) { + return atomic.LoadUint64(&totalIncoming), atomic.LoadUint64(&totalOutgoing) +}