From 611563174675f67fc29e9ff4f4722a881e458bde Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 29 Jul 2014 11:54:00 +0200 Subject: [PATCH] Fix status updates for remote nodes --- auto/gui.files.go | 4 ++-- gui/app.js | 51 +++++++++++++++++++++++++++++++++-------------- gui/index.html | 4 ++-- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/auto/gui.files.go b/auto/gui.files.go index dc9ba2f9..479530f3 100644 --- a/auto/gui.files.go +++ b/auto/gui.files.go @@ -28,7 +28,7 @@ func init() { bs, _ = ioutil.ReadAll(gr) Assets["angular.min.js"] = bs - bs, _ = hex.DecodeString("1f8b080000096e8800ffec7dff73dbb692f8effe2b107df22a29912927e9ebbc4f1ca7d7bac93bbfa649268e7b37e3fadd502264b1a648955fec6812ffefb7bb00497ca52827cddd9b394d224bc462b1582c16bb8b05349db2e36cbdc9e3cb65c946c763f6f8e0d1b7ec1fe15536633f66f9250bd30820d2328f675599e5051b159cb372c9d9f19bd7efdf9dfc78f6fecdbb53b688133e0ef600dd0f49c2085dc1725ef0fc9a47013b2b38cb16502d2e589155f99cb3791671065f2fb36b9ea73c62b30d34c67e3979bf5f949b8423ae249ef3b4c0e6c292cda174c6d922ab80a438251a5e9d1cbf787dfa829a0ff6f6a60f7e2f92382dd92ccf6ea0eda7accc2b3e81b6d2324e2b5e7f5f275581ffc577f6600a352f936c1626ecfe53b608930280c2f4b24ac25c7e47a0bd61051f0ae0c5bc1c1eeeed5d87392b36e91cba955eb2a3ba46b0caa22ae1a36153369cb0f3e13a2ce661b2cef97c5906651ea64512967c78313e2444559ecc42407fc486c037c48f4fafc3248e5e01e2020ace07111f4c063cc5b702de1639bcad4b782bae07174051d362005d5ec497a345050fe22c65a3fbcbb25cbfcdb3eb38e2f984dd6f28a89f8dd9c73d062f0d3088f822ac92b2083e14f9e2df7908cf5e872b22f33ff78f4fdfbddc7f9f5df114c8dd52f738cbae625ed7d56a8aaa16410170fbb40ccb78fe1286b7789561e3234124be80958bf8c353364c803ffbc3495350540b5110fc5e64e9909edf029bf1bfcea232cf9204900e5f5cf3b43c2ef304864ae15931cfd6200ad4ad863ff43048c2a2a45ad09db44a12c1001cb32c0519c45e92e0b4cfb1c6c94ff0fc407699e4a79acf7951bc4c11be69380acbb06e0f5ff1828dee09bcea63859cfb7c1597a3e1d9c91b821a8e0f35a8862614f8b6e8764f6b4252f89c1d98ad2041c122cb5f84f3a522541c1960c25a541154506e9095a2864edcadf2fdf6b025c9c169a4e39c8849787a592ed93e7b74d1d66e586c560de248415cf0f27dbce259552a7db1188b831e5cf272544fcd876c3825fa8bef8b389df3a3213c124d8eb5aa811cd55133ba4639cff32c1fd13b9429bd9fb0bf1e1cc807b78a9848d0ad42d25346168b4e2151049708f917655c2721490ccc387a346c1be86adc6ab843979cd64fbbf589aa83e17392cd4384aab989a30e1aeefa2728163aa37e0a1d7af3b33695f1292e1a615e8a95480ea0aaafe6d96a9d70a2e3887dbc3dd4cb70b1f03d3f49b1475a836d79caa96f855d997845cbd685f61c56479ed8e0ab0d4ddce1507b9a02b003c73acfca6c9e25c74b50fd603b68222b6172becef212d817da8d89b2b7c0de98df786b3b3a05c64ffa023b66935aad2f7358a14ed24526ebb985f0e1608a0bd660dcc85b2b205850a8f349ac1be9652be9a084d9081fc72415f0e71941145223c293870fcd298900004e70e7f1853eed516fb4764610a711fff06641b48cd9f3237b31a06e35b28bcbb4003eb4a066390faf0c656fa895dbb126a6f7b3743468268318df53c1a7813a955c4c42bd5fd784910a7358abc681ce3eb1cc61cf0ca5d5d99fdbc686d08493f3e88756fc1be861be1a82f5f1134f14a3041e46712e9f83f28ef3b15a8aaa040b71aaa9cfcbac9a2fb1e06c1da1b9288a6e4d324ee61e2272be0203db49875d54131165376902e696931050db3c8f8bab861473f85a23441d3052bb6055e71aeb65b538858549e1f7fdd1f0ffa5bcbcc9f22b9a6dc331aa8d30190d9760190e0dc856f575c315cbaac4aeb9a1ccd1adbb22d7caed7d2123ada5c592305f9f3ecec2f95594676b606e41f62e3476c537b32ccc23e97edc6e15462217cd652e95620f8a71e24442414249801ff599a2aa6c6176a15ebcf0d817265880bde1d26a0bcaac57175ec1044e4e50070989ffec7e80970083b27c07148d1adac68a35088ea6688a296b24925e15a46d43f068c53a447ee80db880cb30e7c29b4564ec262e978129d3b482a8dc788d381c4634e23e5e58f212f119b8ba731ebd131d386e88ab6b10c6939f264ced56c3e22eb17e0753bfe45f83cb46b9d20982c29ed8f43b69c6cefe1417d2e6e8453188238761b5ad95f3ba03e0175c6c69f378870649056c69ce33797ce09a526fda4967ebe2293b985825609afb8a4ed21f37252fde6765983801de54e516881fa2084611d0371486f04487bbed35cd8fc9b4249fdec15893a79a3d1abc59139b82b3773f8061b02ed10074982930af4f16ac2ac24bce84c187c6f1322cd80cac38967298b51ca6778d2385b91ef1396afb68626282597f13820b5a662c2cae28f80476428edf57e11567219b2fb378ce03f663453a22cad26149754c545065565d228a158baa1c89c2f52f0e13f4af2a700c8a8cb40c2f112dc54d48c55888808812dc31115ae36c11e745c9aee3222e03f61f4b9ecac099c000ca6a8d11399b208cf135b8006c9591760b530cb6e56c096f050b2fb30952257b6fe2f8a382850fedae3dad04750691f52b52854b4136af56e8900baa70d627e19c8fa6a3ef9fc2bf7f7e0a1e1cfe563c18b795e0db6f47f0363affe7e1c58371f0e0fef8d33fe17d3a6183fb8f0663db98bdd7567699ae060940d4a0ad70340027117d2e504d3760653e6483c355f8611f84888a9e1c3c78fced8327df1d1c18662de31825744c5520e8a1c282672af67d26703d787400deab5d195f68375477b7161a027b59e1cd3c54f5396966d56873fad5b4fa7f8fb0e4def31423bc67ef4e50e56729f05be071b93d6624831a516d0a5a40a521e158e2dcb49f6ec0525d8db6535e10e07057ca84c34a5a103f1fba8004ea6d94e32c696d8f97d0baea7a9afd320c810933c707450e4b402b1ea9d49a1dc941dbe4a92209fa3a6650748e281f3aed3f3f24f65cda311d1123ffd0b498bf47a42459d43528fce68bc99ad66d2b5e42ddb1faec186cb38a3286e6ebd63dd5dd7834f1574a0ff79c58509aca0c95edc184cd296c7ae0a6a28925cc576bdc52b943d7b1a187475eca01f185bb6d7c217150f9d117e051f05f255a2d18a5028aa688daa103bb02cfcd27bf348fba15ce7163c2a11f56f4d03c8ad1d75bfde078c1ea013d6d1712dd5c293120364298fd268438069ee022a3436a51717c291147a8af738ba425a6bd37df24a20944520a66d69b9bf42dac533c2f37506dec93a27a736edb92453dcb371e2cb43100e67240a63190ff4b083e19acdc2398047f630f042f0942b58381430efbdb8442e695916351d55a16a67767d39a85ed6f5b03f3367ecbe661395f82c9ec63adc5148f1eb0bbe000f41910f872c683775aac2924d267ca88b0f2ae8b75138cde8928e1a4f49bc700b8d3148609725c87ddefc5c58bd5badcbc99fd0eecd3bd9db13143cd90bdde210ba271965ec560898062cad951278474f182dfb318dcb4091b7a08a823f33a2e8a7138c921f8a0002f4c842f40c98639f720afa3eff8f797706df87f689482299de5312f8c79213818803d5c8c545c6347dcc5349bea9765fada73410bf1dc29ba6334d611dcf190e05acb6c4fa891b2ad9bb4ba476e22df7336d33519a6144cde719a1a1b4ed2de699f7967ae124756f648b5996b78058ed09498ecae027d59dfca816b9e1700be6bef6535a796dad2a2886fecdaa0b645b6739b72c36bd746f57d32b355b9d1dab1bbecdb6db324438f3ac9c1d476d077140f530a0c887a09f334bfce4e454c59a5c0e5ba61a244b6703ac0e0cf0dab34e20b8c510dddfe1c425ca5b8cd71e873ed6cd43073680b90ddc326bc988b325bafa16527e61a083d32470bb419e0e5cd7112165f813531c8cb9fc09708775c723762caf2911b213d7853d322ab409d384ab87f44c4d41bba1c191d0dea63da22f3605ae7f12acc374e4c0ef6196388d8dff27c0ebe37c65bffec817ca4c6df6eb70da2c8ed23939af05ba16237566d08d7735c5900020c7aa79ce0fa249a98ba00141a0e4dbe92c3b04832507cd08c5b81a05980bbbc1a6b1dc6851e2e6fdc0addaab05c7aad96e6592b95d837df78dc6f05a871c48f885b6e034b48537635ec1944ad6b484d6b56ebd2462bf02d0bb7cc12e596def9d7e6a9ad0f7a31d69efc5b19ebd705483dba11dbd82ac29e69aa79113eeeeada11013d93188b02e9c574e9b2ef3b8442cd95fa9fea824204585b7fe9d4cbfeaefccab70e431d2e6e29ed173836cc56177d7f267b9218d69a5ffd6d6f1967585ea2d7142437b8a377177bb0c2308beaec0a5f76112725574d55a4b76e366d59c904d643cd65c32e4abc752aeb3d98dc9e1e37eb61474725b6f3830baf30c8ecebadd220576759da73491e0c7c2b7233ced0bca7b20ad2d1475d62c0ef9815658e61b6efdc8b26a668bc7675dc1c62b15d62561b1903a6f0a52f5346d218a74ae34e166de34f1fe6f4e60c8fe2f29497b8255e7839339d8269429bdb98b5841bd55077d3ba85925babb50c2129672010d0bd6daf2665990882b3772fd27096504ae7c855dcecf86392ba0bd3dfcf4ebac90000332f4cf2a1ef1e2be6c17abccc22bce64d58cf1986209588938afde3f4cdeb004f93a497f1626345fdd40ad9baa41dc1251dc0289eb28f18ae294101eebf0799a4b4bcf53a8945eee3948e3ddc2a3eb170e0d759e10c5b4e90a00935e2f2e5fbe577df25eaa330ae7fe487b8ee4a74b247a2b78017550e6fd98a8ba33c739141a78f59936a7caf162efe471526855bca27b6708fd9a74f56f7c5ab1b2548ec449770432f49da1c0930c74b3ebf42186f1a0c97f30d935fe2823efbac58e73c6ded57f73c7de64b20eeaa4466ae3bc342dda3bd1341a838762667ff9169197b395de7a6b39b18130739d4c78c1fde4810ed2f5096a8c1687bd883b382bf7f754ad1074d006481bf237686bc7ef2c7dd891f40896c80e61b56eb448609d549b2d973b4a14bbc47eb2af2dfb54de157db96c47b29d07730b6ec739c96795080ca2c47c3092afe70ad28ab0f8a25f72100158d11413bc46e29fdd1d8193f702e32034c3e1ef8a285241f1dc14ae5b0873eb03a0680781f97092539bd6b1e0dfcd03f66d106819b432c8c925cebe260a075ca9179bd6b7e926769929887f61aef3c94a26af4d39b18b7456ff86c8d3aaf998f303771362afaad9d72c67431e695388b23d180d987240faded16eff4b567a989ccf2d775dc8e635723c7d4bf019726bb099a23104a2bf547a39909e9598f58771eb21154d2bb2eba3230ef155dbf7c9e51cd3b88675557fc6ad2d9b5f5615bf0deb9dabf8b0a923885e504d335514d4bdf5be9789f2d949e67267c96953c467127ede4e6a77232a387fde93acab1f3218a9e8ac5d17f749d9c9103c393aed156790e86baac713fe01f60f589461f61f2d5952c52b00960df8b0fb0547528790976ca9385c8f83182385a0cc7ee6f4b581d2fe3854810a831358fb57400030f02bf88703f3eb80f9aea6d4e4473f33c4fcdb62fe065c576e446633cb416477f28a7868a65763374e30aa32dc85ca3f851e5171e98daa4e18ae8c7a81d96001ed9851e836be855e7e8ba61be3eefc5998aadfcb75ab4b48b6ac81b2c710741dca695331ba52340e78caed45346b1b3d5d9214a7b280f910562d0a1acaeede1cd48c9b714192afe2d7a911466a0360a7a74f6333a6c76da1e00db0676f8e39d525387e18e31161165299fb0f8706f47a16a42968e5e5950ad7a73a9bccf7510b00bf6bc154994edd15d4d603b4ef02a6e38c19ec7176ab05e57fd1dfe765db9edf1a1052a29b76d157c6d39d2ab4f6fc4e4116cd1e375552c47f632e899e0aef43103aedf3cec2bb4199e10aa71f98c1d752fc4ab787aeb1dfd28814709d701eacec914838161ea9e3b485e6ab0d1797e3cedb973a476de2f448e1e8749d23d0eb5fa5046bd1dbd91a122a4e059e17e2da9a709aa176e3310ad6c8c25f4140d91826acb862fe4cf03f4f9d8f34658ebab07b64ac73ce161fea2ce78ed346bd4fb0c343acf75aa95db5688acad163dd59b12251ec36b91c76007271b7b588b32574975dd78d05778db687ba7081764f5c27b731e6dae64601a3b685836769e1c902307783c519d75d647606a383d83d5eb8b60a2ea6ebe88aca145dbbcbe885207c425a1a3b0f5987db4ad5b15dc9b13eb4bfff435759e36f912d615468649e940253789d1d656b22d9c00016ea790121b1431eebf0ffa904a90784995d25287af6fd7fd99f335d478d84ddbdb300f57457005c02ee9db86bdbbfcd327f6d7bbfaa128a03dbd106cf60b7821e0b55962bf55de3f6a32f514a4f7eeced9d7ef321a2b9d7d16b700adb32d06b4468e65404b044e71b1a01a33ebfcc22ed327b06213d873b8d1f02253025d2327169751ec6e2eadb5c59168cb6d87289d1006c147a1659e4a42ac1c7bc7ac93770c38c938d4cde106c6a12f6c2340c06a1ac5eec3b0defe153887f691fda1d01a0063d7a672542788015353750a512fd8088d73403a874c6e387adaa3c2cfba867325af19f55ce86d27a23daf81758424ca6f3e47423d6b22a15d4bf3eeee305e215218f3b99610cbae05abc337cdbc6b2ce69b98a63ce2d14cdfc6a6a98d32991535529249c6634fdc54a0239fcc61385321850d0713e6d9e712a3d8adc97ba9ad2f134cd2ef0b11d2e25835b55cb5af242ebcfce1edc9cf7ca3f169ae8b0adaac0d541ea651b63aa5f492d19383097bf25841ad2fa6b4cf7df66eeb6aeabf7e43ecd7e3eedbab30bfc47b31f0fa08dca548f03bd8bcbc5e51450e42bd73b19d13b510549e5ba02c91a21b3c3eaf37ea76ff97220c63d0afb9d847f3e6c6d7d392f629c5592c8709423749713aa7b5bb5941181c293c8329e21417380cbedc050e82d0ae838a4667dde6bd99cdd85cbda6b193ae213694e7e22731ab8fd8b707ffffbb43a32cce61b9ce729c318fbe7bf2b76f8d259b30062f93f0b260df007e81eb615b6f3c261bc351e0396621ae5fb35637bb318952c3ef47da0f634b9c40ba8d5871e9db96a5b8493dc7d42fd33131036a30edf338ea3e20e20c290cc40523d31ac3dd04d51b65a77305a3ed9b9fe12cabfc0e3cce4c82e8b5f5a4de7a070afe242d797e0d7574a2c41e3d6ed25378b9695809838ec2099bd5742889aa21a58c8ab34b6daa2a3ac11260e60430d381259a67127cec1a7d5563ca47b2da73594db2604fc12aac7dc26bc5ad0dbca25e8b59547dde5405ee28bc21e3c8c39b3068273d36ed9c04ddadb7089eab086c1af0ec7252e3a55472256892b8ce24ab44accef3da4895644861a933beed06c9d858a92d268add686c3fadd4c6126117ae704b69acf63a11169ec2529d8a44a702d6df7885398c20c91396561a31517c1997c504816ae748de3e6a9fcb92e80f6a5ae88f40c08ed42353f431c92ec58770464d8ff1da84a6e4d1416dc362cb4cbfa2016864fb12b3de3541a6c663d5aa4a780ab285b5f604d933411bfdf9f4893d91ab0d65f056a5d85a1f80359cf29bd33a4678b30415cd46a2bc8eb33e63f041ccb39621a2564dbca064340eca4c92439404055e9a3f7aac6832d9f4c32389418240cf0517c0429705a2f509c39e014b349a1a2f409b0b12a4cc5e65373c3f06558d0a4de5987eb54136fb5d9587b4d10b249af81505538152da52ac208d066130e832a85c39346137615c4e58bc5a816710b68b28dd9323d2aae822bf42fc5000ff005ff139d851ab359ebf2faaa454eee2c64b62f3aef46ebcd99a1de9f77c3508759f85409f1185e6d22449c3b8749bfe456d8b1e0152ac3ddeb23ab768da5bea550aee597c515fa2f3b2b301e6986f460d9390678e9b096439a36b220b67c3becd9e7aa45d9c6dd1e27e4d8b4f36027fe85637a5a4e1b93618ba0538a78d25bc4da7e103ae8ff724db0c0f533edd75a89c9b0594b82d5a77a48cedc4f52d1cb70fefd5322d797fab5e652e37a8866908a0a17e81794da8314e6c14a76b9c457456da3175a918b4c4cbf8038f46cd12a1d56a6d24e36ef59aa0599ce211c5fef498760c3da485a6b1757c86ef01f39ea816589e8355f6f85bf640fd63852709727ae4003d74b5dacda5c763bc8d70c8fe1eef425a1f9a3e83985ffa11d349c56734ffb3bb79f558758ebf1753cb03d6196e93b315c75f78f95f246774e65cf9d3c14d13f473e46c17cafa90f43962d68b964e223ea3f5ab3f41c8c02dcccb3bca9846bcf3a49fa7d130b90937c5eb6a35e3f957916fe7250d2af9bdd8f41658fc85c97511ab1e60a58cff3027735ef29952c1a6e7bf4d7ffbed626a869e052cd8fcf4a131e38fd8130f6794de3bb9330882608ad10d815098ec2af2fdc763195d9f0eb62f9d6098a371fdafc945efb1e86d4c2434e71ad71e5d6ce315e6aca49f37331d112901da5e77fc97e9e5042f94f15113515021bee6a36146116ab1d9dc45974a86f891b2a76c78ac6c09cac6e5afa0b56632fef2c53ca922ab84e250e6c6a13cc804b88fe447a5895b052d5fadd10606c067427830e87434404b75c0d2cb7d8ae71d0df438fcb9c489579f0f9e3f9b52cde7f56f4d74b1a94ae33f2ada4b5298d4c5a33f2aa80cd4a597bf20254a2f9238bd7adae220364cc0b95a81f55d96393a8a659e984289cf82fb206d05cf8ba04a8b65bc500eece04fcdfc1a26eebd68baaaa7cfee55fd125792837aac92082f1a271b1ab8ed04169401677f45a8b8dc18dca21d72db915302c9ea8e58d311efc5b0f26e72fa6d04daf7295898e43c8c3677228f1c7f3f7ddb69c0334284f08b72c7e12c938c35fc317c5ecb0bec14671a508c6dc6eafdf823eda7e8fe4fa8f561d379d62dd56e0adc67db5342f97d1c1d0d1fb63d766c2f80e25dfb3a57730461445a651764af1efa2646afaed62f5ff63f6d5f03a971e46fa017959e71688874966cbfc21e5f5f74c6d186cdce0bec8ba1bde49de5099410be6059ae922fbe06977866129af83723e147fc6a8da3209ee37924ebf13cc90a171edab4379edfd6bff7841cfc6f000000ffff010000ffff78a09d1f38760000") + bs, _ = hex.DecodeString("1f8b080000096e8800ffec7dff73db36b2f8effe2b107d72a594c89493f43af789e3f4b56e7acfd734c9c471df9b717d6f2811b25853a4ca2f763c89fff7b7bb00497ca56827cd5d679e26912562b1582c168bddc5029acdd861beb92e92f355c5c68713f678efd1d7ec1fd1453e67dfe7c5398bb21820b2aa48e6759517251b979cb36ac5d9e1eb57efde1e7d7ff2eef5db63b64c523e097700dd7769ca085dc90a5ef2e292c7213b2939cb97502d295999d7c582b3451e73065fcff34b5e643c66f36b688cfd7cf46eb7acae538eb8d264c1b3129b8b2ab680d23967cbbc0692928c68787974f8e2d5f10b6a3edcd9993df8ad4c93ac62f322bf82b69fb2aaa8f914dacaaa24ab79f37d93d625fe17dfd98319d43c4ff37994b2fb4fd9324a4b008ab2f33a8d0af91d8176821a3e94c08b4515ecefec5c46052bafb305742b3b67074d8d709dc775cac7415b164cd969b089ca45946e0abe5855615544599946150fce26fb84a82ed27904e80f58007c43fcf8f4324a93f825202ea1e07414f3d174c4337c2be16d59c0dba682b7f272740614b52d86d0e565723e5ed6f020c93336bebfaaaacd9b22bf4c625e4cd9fd9682e6d9847dd861f0d200c3982fa33aadcaf07d592cff9347f0ec55b42632ff7bf7f0f8ed8fbbeff20b9e01b95bea1ee6f945c29bba5a4d51d52228046e1f5751952c7e84e12d5fe6d8f85810892f60e53279ff940529f0673798b60565bd1405e16f659e05f4fc06d88cff751655459ea680347871c9b3eab02a52182a8567e522df802850b75afed0c3308dca8a6a4177b23a4d050370ccf20c64107b4982d33dc71a473fc0f33dd965929f7ab1e065f96386f06dc37154454d7bf84a966c7c4fe0551f2be4dce7eba41a072747af092a98ec6b502d4d28f05dd1cd8ed684a4f039db335b4182c2655ebc88162b45a83832c084c517f0b6cc614ea6f9f9784450a329a3bf6112379faa6b64aef84c3ddeb7f068bdb36a19156e94ef37fb5dd71c2386cd9d52a7529e9d572bb6cb1e9d75b5dba132ab02f50ae29257ef9235cfeb4ae1893540283ce139afc6cd147fc88219d15f7e5b26d9821f04f0483439d1aa86523ac6ad9418e5bc28f2624cef50a6f47ecafebab7271fdc28e22641b70adb40595b2e7b854d990044c89f9471bd84a40930e3e051d035d0d7b8d5708f4e3a6e9ef6eb255597c3e7345f4408d57013471d34e5e50f502c744ff3143af4fa274d25e0535c7ca2a2122b9a1c4055ef2df2f526e544c701fb70b3af97e1a2e37b7e94618fb406bbf28c53df4abb32f18a96bf33ed39acb23cb5c1d7d7347183407b9a01b003c7a6c8ab7c91a7872b5842c006d14456c2147c931715b02fb21b13656f80bd09bff2d676740a8ca8ec0576cc26b5de9c17b0d21d65cb5cd6730be1c3d10c17bed1a495b74e40b0a054e793587fb2f34ed24199b3313e4e482ae0cf338228a54684270f1f9a531201009ce04e93337ddaa3dee8ec9530c962fefef5926899b0e707f6a242dd6a6517977b016c2f03f382471786b237d4cacd4413d3fb79361eb593418cefb1e0d3489d4a2e26a1de6f6ac2484505ac799350679f582eb16786d2eaedcf4d6b8b68c2c979fc5d27fe2d7450ac03b0627ee0a962dcc0c33829e47350de4931514b519560214e35f57995d78b15169c6c62343b45d18d49c6d1c24344c1d760a83be9b08b1a22e2fc2a4bc16c7312026a9b174979d192620e5f67cca803466a17acf34263bdac9664b03029fcbe3f0efe5fc6ababbcb8a0d9164c506d44e9385881851918909deaeb872b5775855d734399a3db7445ae95dbfb42c65e478b2561be3e7d98478b8bb8c837c0dc92ec6668ec825fcff3a888a51b73b35518895c34bbb9548a0328c689130b05092564cbe9334555d9c2ec42bd78e6b12f4cb0107bc3a5d51656f9a02ebc84099c1ea10e1212ffc9fd006f030665f516281ab7b44d146b101c56d11453d64824bd2e49db46e0198b7588fcd92b70255751c185578cc8d85552ad4253a6690551b9f10a71388c71c47db8b4e445d27dd8d2d40012a2a31fa64ced4dcbd93e697e0b33bee25f82b9fe4e1014f6c4a6df493376f687a494a6c6208a410a398ca66da49c361d0077e06c4b9b87b7689066fe96e63c73c607aee9f2b69d6cbe299fb2bda9550216b9afe828fbfebae2e5bbbc8a5227c0ebbada02f15d1cc32802fa96c2089ee870378366f721599414127030d6e4a9668686af37c4a6f0e4ed77600f6c2ab4fb1cd6094ce7a325abcbe89c3361e7a14dbc8a4a3607e38d651c262b8759dde0c8608ac77c814a3e9e9a9860b25f45e07956398bca0b8a5d817950e0f77574c159c416ab3c59f0907d5f936a88f32ca8a88e890aaacceb7344b166715d2051b8ec25518a6e550dfe40999372e115a2a5b00b69160b11105181172622739c2d93a2acd865522655c8fe6bc5331977131840476d30a067138421c2161780ad73526a5186b1ba82ade0ad64d1793e45aa64ef4d1cbfd7b0dea1b9b5a395a0ce20b27e41aa7005c817f51afd704115cefa345af0f16cfced53f8f7cf8fe183fd5fcb0793ae127cfbf500dec6a7ffdc3f7b30091fdc9f7cfc27bccfa66c74ffd16862dbb0f7baca2e8bd52001881a75150e46e01ba2ab05aae90a8ccb876cb4bf8edeef821051d193bd078fbf7ef0e49bbd3dc39a651c838c8ea90a043d5458f04cc5becb04ae078ff6c069b52be30bcd85faee46424be020e39b743c9fe7301d79fc23bc97aa0bd3ce5255db93de369609a007d9aa8021ef1052372beee96d9d423d4b3f3a40508ee4d39ef00331cfe9f9937df22d924301089e612cfbe4ed11ae4e7906a2213ae572cccc588bd6986afdd0522f4d1e7b34f0a585d854564d89536259748da419359b32149f29b9e59679e861616364dfb847f6f81a8cfbb5c652372b4b020c86b24af7f16905c1cffb2e2081dac94217eb04c9238b6d37fd3d35cc2ac17b73fdc11258630e54fa6d33adaa8b4ce17ecf8ce81ac57941d8ff8da64767fd7e8ba4d11c9134065f7df659a3db4c4dcba7d8a0d5598794985594508df9bae99bb5261e6d022ba5fb3b4e2c38c6558e2b1c4cc40585a8f7dc54b4719bc57a83db6077e83ab20c6ba3448efea742736dd4078faf660bcd4d949f3df8c28e3d3cf0720a4839f3a3456640e5479f614c42d1578c4002453344ed190e97825026dd9475737dea1d817f8dea3d6c1d0174e2cb013a58711d062b621440b04180959d39a21bbd154653c708b3dbc69f27c074eab06e73c5c62828e16aa8afb38cc43fa10d609f5610aa0fa71d18ebafafb23760edf0a2ba866a139f98fbc5db96b0aab8f660a15d2570ba4272b080fc9f2370e8c1fe1bc318ff8d3d10bc2408d59b020e39bc38130a9957c50ea9d25a160e5c6fd39a9fe66f5b03f3367ec31651b55881e3e563adc5148f62b3bbe000f499a1f8726e260c5bfcbb4953deda02a020dc90792636326e6bebb4db1fc37a22a8b9831943e90283940500de4a4fc02c3c6c3686ee25e58bf5a6ba7e3dff0df8ad3be613430d989b4a3603dc7efdcb042c39d07e053be88590d188f0b73cc9c6e005051e029abd231d1745e19ce4107c58e64525226db02e4405f7206ff687f0efcfd1c60855a03d0f5e5f5e24bc34269fe060082b423956714d1c9141d3266d5e961f664f382d0879a7f8a3d1584f1cd24382b56a9aac2485df4a99d350d536aeb5e091897c6788b280eaee293668f6cc687fe4967ac0d843956665f7cc3bd595ad1165db5f9bea86d7e608bb0aede02ad08d8dad1cb8e44509e0b7edbdac666981013c17b1bbdb36a8edfadeba4db9877bdb46f5ad5fb355993bd09330e1db40b624438fa8cac1d492426e291ea6141810cd1ae9697e931f8b6d12950297238db93ff9d21929015f26a8b3982f31fe1ab8bd6b84b8c870e76edfe5685b3b5542df2519ed6ab37bd884177359e59b0db4ecc4dc00a1e3eb6881f6b7bcbc394ca3f20bb0260179f903f812e32662e1464c0970726f6f006f1a5a6415a893c429f78f88987a81cbafd2d1a03ea65d5f0fa64d91aca3e2da89c9c13e630c11fb1b5e2c7856e15ec21f3d908fd4d8f2cdb6411469af64e8137e6b1bc48d551bc2cd025716800037c32927b83e8926662e0085867d93afe4c62cd31c141f34e35620684760e282c65a8735a26f05b5ce8e6e86589113ad96e6e22b95d8575f79e2000a501b7f38206eb92d32214df945307083a0a92135ad59ad4f1badc1e32ddd324b945b7ae7cfcd535b1f0c62ac3df9b732d6af0b907af43bb6b195027cc04fcdedf07157d78e08e899c458144ab7a74f977ddb23146afadfbfaa0b0a11606dfda5572ffbbbf20bdf3a0c4df0bea3745818df305b5df4fd91ec4913586b7ef1b7bd659c6179895fd19685c11dbdbbd88335067f54ef5838bfcb24adb86aaa22bd4db359c74a26b0ee6b3e1e7651e26db2b3efc1e4f6f4b85d0f7b3a2ab19dee9d7985411e4cd82a0d727596a50397e4d1c8b722b7e30ccd7b2aab203d7dd42506fc8e79591518fcfbc6bd6862d6d12b57c7cd21169b5766b5b131600a5f8632652c8d71aa34e965d136fe0c61ce60cef038a98e7985e91ea59733b319982694b881897898840175af3bb750726bbd913127e5781002ba5352d43c43134178f2f64516cd53ca521ebb8adb6c163cbfe1c2f4f793a37e3200c04c75947c189a3f801b191e2fb38c2e791b077486214825e2a462ff387efd2ac48356d979b2bcb6c2846a857c535192c18ace26954fd9078cef54a00077df814c52a6e9669326229d774627826e149f5838f09bbc74c639a748d0941a71f9f2c38e2cdc25eaa3306e78e487b8ee0afada233158c0cbba80b77ccdc529b785480ad5c7accd9ebfd70817ffbd8ed2d22de5535bb827ece347abfbe2d58f122476aa4bb8a197246d8ee4aec3155f5c208c37c58bcbf986895d49499f7d56ac739e76f6ab7b9e3ef3e5c4f7552233d79d3da46e85df8920541cb72667f7516f0455e57473dc825d25980bcba13e66b3f15682684382129f0d46dbc31e9e94fcddcb638a3e6802200bfc1db10f7de887e2dc9df80e94c835d07cc51a9dc8f08c409a5eef38dad025dea37515f9efdbd7f0ab6d4be2bd14e85b1e5b36468eab222c416556e3608a8a3fda28caeabd62c9bd0f41456344d08ec95b4a7f3c71c60f9c8bcc08f3e947be6821c9474fb05239bfa40fac8e0120de25554a097c6fdb47233ff4f7794c4938edb92c4679db4d7138d23ae5384c70dbdc3bcfd2243107f61aef3c67a56af4e3ab04376baff87c833aaf9d8f303771362afaad9b72c67431e695385e26d180d9872407d6fe8c77fadab3d44466f9eb3a6ec749c2b163ea5f814b935f85eda91ea595e6a3d18c48cdf08875efb9314125bdeba22b03f35ed1f5cbe709d5bc8378d64dc52f269d7d5b1fb605ef9dabc3bba8204932584e301519d5b4f4bd958e0fd94219780cc86759c9934177d24e6e7e2a878d06d89faed349b73e173450b138fa8fae9333726078d20ddaba28c0509735ee87fc3dac3ef1f8c3cdb471676d52b00960df8bf7b054f528790976ccd3a5c8433282385a0cc7ee6f4758132fe3a5c8286830b58fb5fc01030f02bf8871033fbc0f9aea4d414473f3885ac3b6cfe0652576e446633cb496c4bf2b07e1ca557e15b87145f11664ae51fca0f20bcf005e67d19ae8c7a81d96001ed98501836be855e7e8ba61be3cefc579a1adfcb75ab4b48b6ac81b2c710741dca695337da52740e78cae345346b1b3d5d9214a07280f913662d0a1acaedd79e458496b15292dfe2d7a91aa66a0360a0674f6133a6c76da1e00db0676f8e3bd52d384e10e311611e7199fb2647fe79642d5862c1dbdb2a03af5e652799fea206017ec792b523bbbd3e89ac0f61c4a57dc70823d4dced460bdaefa7bfceda672d7e37d0b54526edb2af8da724a5d9fde88c923d8a2c79bba5c8ded65d033c15df96606dcb079385468733cfdd6e0f2193bea5e8857f10cd63bfa510f8f126e02d4bd93290103c3d43d7790bccc60a3f34a846ce0ce91da79bf10397a1ca569ff3834ea4319f56ef4c6868a90826785fbb5a49e36a85ebacd40b4b23196305034448eab2d1bbe903f0fd1e763cf5b616d6ed3d82a1d8b9447c58b26a5b6d7ac51afe8d0e83cd5a9562e1022b2b65af4546f4694780caf6591801d9c5edbc35a56854aaaeb128fa1c2db45db7b45b824ab17dedbb3960b2565d3d841c3b289f320831c39c0e389ea6cf22102d3c0e929af5e5f04335b6fe78bc81a5ab4cdeb8b2875405c523ae6dd8cd907dbba55c1bd49b4bef44f5f53a7599b2f61ddee6598940e547293186d6d25dbc20910e2768a38335426b8ff6e9d1972914a90787f9bd2528faf6fd7fd89f30dd478d84fdb9ba888d6657801c02ee9db86bdbffce347f6d7bbfaa128a003bd106cf6337821e0b55962bf55de3f6832f514a4f7eeced997ef321a2bbd7d16175b6df22d06b4468e65404b044e71b1a05a33ebf4cc2ed327b06213d873b8d5f02253025d2327169751ec6e2e6bb4c58168cb6d87289d1006c107a1659e4a42aca47cc7ac93f76738c9d8d7cde116c6a12f6c2340c06a1ac5ee43d06cff0a9c817d1d4520b406c0d8b5a91cd5096208e4f1da8e42d40b3642e37492ce21931b8e9e0ea8f093aee15cc96b463d177adb89e80e78601d2189f29bcf91500fa74868d7d27c7b77186fc5298df9dc488865d782d5e19b66de3516f34d4c531ef168a66f6bd3344699cc8a1a2bc9249389276e2ad0914fe6309ca990c286a329f3ec738951ecd7e483d4d6e70926e977e1086971ac9a5aaeda1712175e7df7e6e8273a20dff169a18b0adaac2d54116571be3ea6f492f193bd297bf25841ad2fa6b4cf7df276eb6aeabf5a46ecd7e3eedbcba838c73b5ff06a14dca548f13bd8bcbc5951450e42b373b19d138d10d49e8bcd2c91a2db693ead37ea76ffe7220c63d0afb8d847f3e6c637d392f629c5e12d87094297a3713ad8757bb382303852784633c4296efc187d86bb0bb4aef49d6c343aeb36efcd6cc6f636418d9d7443b7a13c973f88597dc0bedefbffdfec1b654901cb755ee08c79f4cd93bf7d6d2cd98431fc318dce4bf615e017b81e76f52613b2311c059e6316e246416b75b31b932835fc7ea4c33076c409a4db8815f7186e598adbd4734cfd321d1333a006d3be48e2fe0322ce90c248dc48336b30dc4d50bd51763a5730debef919cdf3daefc0e3cc2488415b4fea458ea0e08fb28a17975047274aecd1e3263d8597db869530e8389ab279438792a81a51caa838bbd4a5aaa2132c01e64e00331d58a27926c127aed15735a67c24ab3d97d5240b7614acc2da27bc56dcdac02bea759845d5e76d55e08ec21b328e3cbc89c26ed263d3ce49d0df7a87e0b98ac0a6010f3ba70d5e4a25578226a9eb10b34ac4fab4688c544986149626e3db6e908c8db5da62aad88dc6f6d35a6d2c1576e11ab794266aaf5361e1292cd5a948752a60fd4dd698c308923c6559ad111327e749554e11a8718ee485baf6b92c897eafa185fe0804ec403d32451ff1ec327d88e6d4f4042f73684b1eed35362cb6ccf48b238046b62b31eb5d13646a3c56adaa9467205b586b47903d17b4d19f8f1fd913b9da50066f5d89adf5115eacc2af8e9b18e1d50a54341b8bf226cefa8cc10731cf3a86885a0df18292f124ac72490e511296f87b12e3c78a26934d3f3c90182408f45c70012c7459205a9f32ec19b044a3a9f502b4b92041aafc657ec58b4350d5a8d0548ee97721e4f3df5479c85abd40a2895f51301528a52dc50ad2681006832e83cacd4e5376157597dcd11d4422978a6ea62cc50f67f0f7f0159f83f1b4dee029fdb24e11e23c4a32e56a79bcf3b8e84bedc68bdad9817e7f5d8b57f75708f499465df39214624cba4bfda2b6456f0029d69e6c59993b34dd8f37a81450efdca111ecbeec6788a9e5d7e3964dc835c70d06b29cd1cda7a5b34d7c519bb64ddb8d6af7a9592e9bf177f1bc6b1577713a7c9206f843f7182a25ed6868c3a4db850bda6ec29b7fee491e1aaea67c7adb7133d8765b366f61b153061a7e7b7f13a3dd74405a5a3be546bdb05fee59055904a0917e4d7fc3026390d838c93638c7e8f8b463365331288e1f93f73c1eb7ab8656ab339b8c5f1068089a27199e5a1c4e8f69dad0435a7b5af3c7670bef31ef216b81e539186a8fbf660fd43f56c4922067070e5053340670e9f1042fdf0cd8df93db903684a64f20e6e761c4f452f109cdffe46e5e3d695de0af2b35f28075826d72b6e6f87b48ff467246c7d0953f3ddc34413f45ce6e43d910923e45cc06d1d24bc427b47ef1070819788a45754719d388771efef3341aa557d175f9aa5ecf79f145e4db796f834afe2036bd01167f66725dc4aa675ae910405490852ff94cd961b3d35f67bffe7a3633a3d10216dc00fad05af607ec8987334aef9ddc19856138c380874028ac7815f9eee3890cb8cf46db974eb0d5d1defe7372d17b527a1b1309cda9c6b54767db7885692cd9a7cd4c47904a8076b77bff65763ec53b667cd4c41467482ef938c829682df69ffbe852c9103fe9f7940587ca2ea16c5cfe66606723e3efbb2cd23ab64a283465ee25cab34d80fb407e549ab851d0f2f506ad61007c268407e3500723346a472c3bdfa510dfc1480fcd9f4a9c78d3ffe8f9b319d57cdefca24a1f9bea2cf9bda6ed2585497d3cfabd86ca405d76fe3352a2f4224db28ba71d0e62c314eced3518ea5555a01b5915a92994f82cbc0fd256f2a20cebac5c254be50c0ffea0d22f51eade9ea6db7b866c68352f71033fa8c73a8df15e7db2a181db4e60411970f617844aaa6b835bc665aded6076b1657593aced88f74a5e79153ffd02086d05952c4a0b1ec5d777228fbc473f7ddb69c0634384f0b372c7e148938cb5fc311c5e2b8bac579c694031dc99a83f0731d67eb8f1ff845a1f369d67fd52eda6c07ddc3d2394df26f141f0b0ebb163c70114efc6d7b986230823322dfb2007f5d037310675b579f90e04d08e36909ac4fe060651e91987964867c9f65f6cc0d7679d71b48773eb05f645602f7927450a25842f5c55ebf4b3afc1151ea38426fec3c80112bfcde42848167844c97abc48f3d28587f6f18de737cdaf9a2107ff170000ffff010000ffff4aa3521666790000") gr, _ = gzip.NewReader(bytes.NewBuffer(bs)) bs, _ = ioutil.ReadAll(gr) Assets["app.js"] = bs @@ -73,7 +73,7 @@ func init() { bs, _ = ioutil.ReadAll(gr) Assets["favicon.png"] = bs - bs, _ = hex.DecodeString("1f8b080000096e8800ffec7d697bdb36b6f0f7fe0a44d3c59ed794ec24cdf4756dddeb259dba4be2c776a6b7b74fef3c100949a8498201403b1ad7f3dbef3900f745a42cdbf1dce987c422b11d1c9c1dc0e1deb3e3b747173f9fbe26731df8e34ff69e39ce27a3113912d142f2d95c938da34df27c7be725f98e5e8a093914724668e8418d504b3e89b5908a6c28c6889e3372f4f6cdc5d9c9e1bb8bb767e764ca7db639c4ee0e7c9f98ee14914c3179c5bc2179a718115368c6155122962e23aef01881c799b86232641e992c6030f2e3c985a3f4c267d897cf5d162a1c8e6ae242e98491a98801241e1a187e38397afde6fcb5197ef889e3c0ac7072c4a7e16c7fc0c20109670e8da2fd815a842e0c1fcecc2b1767247c9fc9fdc1795a72a4a53f20ae4f95da1f60255fd0cb0176c9a837fe8490bd80694adc39958ae9fd41aca7ce5783bc60ae75e4b0f731bfda1ffc97f3eec039124144359ff80cba85115908ad4e5eef336fc60aed421ab0fdc11567d79190ba50f59a7b7abeefb12b4083631eb660e25c73ea3bcaa53edbdf196ed73af29872258f341761a1af5a351aebb990b51a3e0f2f61e17cc018146b37d684bbd8d35cb2e9fe604aaff071180122c79f6003cdb5cfc61912c9efe4e606d7f90dacef1b186963f3f6766f646b6503d8ce264268a5258d46ae52a3ec6918f070086f06091c480d6ace98b6109a67a217114c42b30f1a1b9b124226c25b901bf39390887a1e00e44c84d622d8257fd98e3e7c9d944d61d2ce9406dc5fec92c1b7ccbf629abb94bc61311b6c91ecc516399080ed2da268a81ca0663eb55ddc7e62fec4feff9b7f998d185039e3a1a345b44b76865fb2a0547788c03a8108858a2830c04d132c3fb2d0175be447115217fe02e7290104b9450647c0369c4900f11a20ccbaa90c4181d890ba3de41b6fac0de96a3946d2a99722beda4ba7b020eda559cfded29e1b4bb39ebd0c0b13213d262dee421156e6e58b99a8a079976c7f5d5ee9c21bd38df365bee091501c396217690a78f2aa3a0057da098533894128e86c28f3da109c83046741ab348489f97110666d3cae229fc25af210689d39135fb897291c40da9693811e53fac808c7884d209dbc6042ddcb99448987a30809e0cf261bcf5fbcda22cf5f6ee37f3b9b5f973128a9c763b54b5e14269fe26727fa405ee6ef53443e87d7cfd3d7b7d579019985438f82e0a8d0b9cfa600ed764ee8a5e9ed6ce7af0de5539fcf10ff38c9afbb7195223815c475fce25a90673c40a94943ddc009a023b266d773ae996378069b5e83a02949836b66b1ff727bbbb127af2658ecfc9f8358e982c21baa80fabe53c2622b4049e3ff0c98c729d908e88704a77f79f597e8c366d641c257a06523101340d263fba6c87d596542467f06da075dab092599ac25a0c9348a6d369c0d77b3bae4cf8014095266028a954473c0b402a6223009714d70a92692d14b857ad817d05cb2480a68e303098e14684850e8d75ccf8b3d5a7a5243f2e751f6ba820409684a57e53623c7bd916141d0c423ab8a3fd93333c4228f5f5515faeb2bd06746998ff746506ef514583be44244c05292a0a180ef427a95e97b7a8525f60f8aa1f4a7c7a634f6412d43f7ccd4e3336a94abd5390682a41384820272645286da0ab8a73c8633916054016c3c98a52528df06444917d59d834fcecef3af8c9625d60a18bc780e3ad8d0a8fd3d1a934ce9ee19f24a3b9b730f04adf301b462797cab8062cd60f4df01a950346ed4d6a6bb7152239d49ec17e69162a7f0d330763671a3e971653828fa389a81586227e1540c43765dc08fa90896a51661a2d2ed4366874d74980e803fe15fbe22d68ab0061d988a97d9401b9be5018a4898f98b688e360cc97e39ee9c5d49f81b478374d69fb340650222ef04782654a04058fecbb9a27e0cff33a9802af6073737c5e9620da56f6f07e377f62d1021b9f92ca9fdd96d19c966a09145410193239f97f19accc59322f2c475589e2d4d10f3a741b51ed0f56c86d6280aa2e4a1d84b658ee3d71ed716c0f79f8713c0c7de24237560718dd89ac03f5a1a3f27946cdc8085710948338d71066a710d41ba9eb148e01a762edcdcf32a2b569dc281e711ec0ed4bf908ba42a425c466a1744c81fbd2002ac5c338b990ea8b0cb2e783244f22bee21dbac0035680f7d6ea5bbea05ba2b661d60a7dddd0d8dbc3f16df4b740fbba099832e3a397e481caa79ac91807b012da6d34e886d7777c31f287a4da5ee498653a83eef80e7ccf6f89018a41311f7031954bbd40e0b22bde8e21eec7309d07ba3d86f969e79496219e00f502fd61c68d1e4b63eda0fdf70a9341802d75b4484fe82808b7c1d123e2521739952542ebe26094ec93595211a5689ad919b2aa8109f41ff533e3b09518567621a3ace0d871230be1378601114b56ba11cf0c07c62fe779261cb1aa15a1771ed995a7bf317059d56aa635cf6414a23e077328f796081bd1867b86b1f00edb3aac08f0a4b7831c70810e22096c69a2273aac88431f037e8154683620df620d8aa2e386bd0c21be6e60e09625c860430344b934a2626040646b9ebe1de282a934727f8e8a056ac941e760a1a272a28da2824027f32b18c1e9593ab26448da47ce0b629ff306858ccf28bd263e12137adcbccc166b10f8634d07285f44b449ef6870d73f56cfc6db281d6373a579b790f8d0cf16a193f38e8374703c23dc4773202676a3967245c7473834d8eb060037f0d4f8ec130364b088f8c6adb27ba3ff8f70700bb62732ee5ba523da8094cd8c47a956ac6b42b596e80079f462a35e822b0c93092f7a7d27c536b105fc2c43ee5a1c73ea0415aebbe87a55c34b888c5d2f0984be69ae5fb9d98a0e129d5f3dbdbaeee73d620b9c7821856e038ba738be1734d759caf4123d075db3cebc4b99e3330c9e3f0323406ee3bfba36e74f7ef4b017546e8419ddb1f6bf5e5d2d04aebf3e457776fb53e402a3611550b0c2652db3110211b3737d8ef29932e50149db102177cb6d90cddca9073af91c89bc13e81ca8f08735b49c5d7b1af40259639bf2a521361908aa2221796193f65689271766db43eaab65ab11a286ae67d1bac2a362195c86df2acb4e486059a91aad3e04c73a96c2bc2c279b74284a5ed5486994229b807d0f79281bd52902489652402eee4d86c6178ad731ab54f6afdf9daa09a23221676ccfb1b53f31e269c49f4b5e69d1abb01b872fe2f09267f1df2f08afabc8d7a7aa32531741dc5675d78792da558132dcd73f8986431f3c5a4cb43fe2bd4a17e53fce33e903033bd7fc37da640f353ff9a2ed49b389830797b5b93df5c0384c9f05ba4a5afc385367d4d784891f80e3f1e7ae722e8c2ee0fc27d38e4fad8f9fde0d674f58450ebfa22f61c8c83f88276c5efde821ff8766a7cbf75f0db5e9fb688a910fc5d8bff31d92ec784c4353ac3b9519a863deaab9877b2ee22624f0d6b58b3460a334b8daea593dbdf87d98db73bc0d92687cb8d2f43331f899e70cfb0838a7ea40afc79c3ab0f42458da63ee2dd60fc0cfcbeb7a10f56dacf4c75e1b1b5ab6795bede88a7bb2471e8ce997bc9bab8fb64160ac908d8ec0157b821a23ec2f258201006751f2b54eaee292f92d9a675a8dfb559716eb7737fe27abe9e8a33032ab3b98398dabcabf904256d2e0614992df006c7ade69399d7cd1189660789b604fb22c90310c84d1b92b809934fb847b80fac7c97fb5d066db62f57dd7ceb84d5a3e18cc941a37c229f7f4efa6a413cb527b9c71ab460b77488fa28fe640072344790d5b2f936f358931b7e8760673154891b588520a5a1957b8b5286d079bff064b6035e884762eba3e90c4392bfa43bfa1b9bbf3e9da0a49d5e1a8dc42707e1ecb33354b4c5c1340ad3c30ac99c8d2059332e93c3d311910104ff1194a907653a37280e7e24ef34f7f93fcc9ecc9a8a6401e65c30843f4fc3a3d1545daa0e041c9dbebb7704b8519c843b2bfe053c8654c792fabb3bb7b79ffd8bf87ac7493572064feb2108c60e998b8856bf7ca185a6fe1718b59944483101035e716f6ff169a3a5ee4968bcad0b7c2c12d9e6c7c6652fe5f92e7a483c8a58f7472438f0f78fc9d47c49f800403e0843015e077bfb3d79b64f62908d531eb68ac3de38c7f3c07321bb228ce9e8e41c2f3cac156bec743bd2c3187896d43454b18ba70f06cb90523fdbf5d69cb8cd20ede7f2d4c6ae9893cf7a8e3d9dae30f8c794eb5d5b0d7fb3e7f8d663b2e430e0537687eeeafb182b3435d31ec8fd59dbfaef61715ba3d31e08c8adce36035ce839933875f5944e053418e0eb1e07a89e766ce8a3d15cef1aabf16c40c7de32ca9fa2064a461be23a802b8bcead2b82c867585c2d1dfedde82b0c87ee6c6ff7de957e17e1f1a3e35ccd920d68bece0ef9bdcc626fa549944f045415797588a36cf4358e02d443674b861c8c8fb94aca979db778b03dfb2aabfcb1675f2aec13a2e7615788fec0f360b26bc57fada8c18e4a91818f66af8b2000c9db155d05ee9b4b11de8b5fd82d1aaafb501fd337046071c93b7709f0f6f05152791514d5a44c8a9342678326449a4d8076b4b4f4feac6ff7b829f0efec905749b3875f5e6df2877bde89d53e5e7ab5cd8338ebff1a4e18a2023a5a5b73fce18d3de05e4cfed3eec78ccac7ccf19539eca59aaf5d302cb387b5873e0b677a6eb7b53eeefd8b2627af8ae4374273371716eb5cc228b8ac800f74570b68c191cde5cf9b1b783bbce0010331007e24db1d7cbb1b04bb4a0d6e6f77d32ba2e0dd4d2567a1e72facbb8b8dcc0a18fe79f86b170547b1f906469105cca5074b1ffd2e7475d9ac6fbfff28172e4a1c90dd54ca6e35e3eb4393f4a2df65e7f4ae4af20840322fc99a51f3be3b6e3bb7dd112e5f0b2ec8afa48af10f12a185695476473045f0f962a9d8304bdd320c991ed579e33c8ef0f23d19916f848c83d68b61bd465630f48ceb793c19827d3a72a91fcc47190423c9601d155375287e30177dc999adb01e104ba6efc230332117234fb831ba17c95df4bae956287e509470a5e226841cc64b2e8adec3c00d8460330b1db55fac5d7effcfecf0337d2de4a59589781a02eca09483ec938908d85a46960c88329754302c6e83e1283c40b87e80d90506fff6903231b21d2f887f7194d960565f7d0142369b47168c2bdd984b66905f82530c6412869f268ca03dbf4500600c3c9ab44a94445280b11198340c6401a82127a1c6544b9ae426e0100856cb05f4f7f99cf93e4faebc27a27b6f64a69c6327b96666eee0b5a04666555244a437d8f2f9e7752ef0158654521cf2702ab2e98f8b550f419b359c9b3c35fc46ae696685a433699b447a0bb7750ae9addf740278b1370330db6d496693f59604c658d3e2e5ab965f73847666dd866d709e1cb742c8bdf740673e953380608151dd12fe80af844a4bec1c921bd5051a3467594e40ba6b3ee5aea1d30a1992cf038faaf9d7c5186e7eb46433a7d38252b806dc13fc0ff57025e39179c4dd6a54193737c1c25eacc8351c66c4480fac4261a6e56d1b9b1d864025076442300929d8a63669c67b394afb1b8c1a9169668b36708dabd3285f6a2067a3da6a53eab186799a42c7e3d417092f38feacd17ab485499aad160bd2d641abb09a1b63feb2727f6c2eaef707cf105820a7d71fc06a33ac56ea283122f32c03f3973d3aedd5275afb0d9d566d98dadc6ab6e8de54c82049aa823f07495e32a4b4d7669d96ec9c6083f4e894b1efccdb9b2f80bb1c23b9bfc06c326947c3d0b8b7c34f936b1b18446f28f5b8d48bfa46c89e4f2760dee70883c12d9840a163cb45c7a064b056ad2d0f23bcc89c04886a18cea78cd49ec69a0b946f269a24b7a9b0d3a09003cd60c11cdd036689256ef82060895f8f89d4dec71c0f719af93b3808f740331af01ac3d5a9c7d442134bd8dcc4256a309418bd305694f608423bb21cde14186fde35685844bbc0bfffdeb4c0e01de32c0042bc7e1eda95430d6ac40b31aab329cbe0c010fd982409270624617b618bcd6e9fe96e48ce1103ca644d44d1893fa15361b2f18130d9e0e670b0b7396cddaca8cfb499e5918837ee8800707e7e9a830eb289acc056c03bf358698b5c3216e1bc030e533079174dd246832c73ed1e9003cd80944ab3577852530bb1cabc5a56d0f0ef30a3d825bc5a5e47bc412b0c7c139f8697f7068941e81bc331ddc0184a02a853a03cc194c963e00b7169b96f484e34de938e7dcf20937cf9dce494a42e1221eed3c092b8b8e963d7594c0998155066c92a34817bb565ed3a55a3b709338d128a6bc142c5356fdffeaacbdb9ee291e2914d231cd16c582e1e231f2631379717f707df8a203d46934844ecaa491ef61280d41e1d6d1674513df745510c9ddbf41ea1d2a098711d12619fca05d78f955d33b4bdaa6926ee1fa9d46e91a1b37590fe5c01b3de0250c95d832a702f3114e935a90bdc04b7e617a23f1ff4ae6b90c17aaee59dd7e2b511d1b8a546c1f389805d34b0d98047bb36696a06267a41f95441b8474c1a5383c65aa03be612e35b037d2d6c4e5a9636bed7152c064af02ecc447c68526c8dab5758418bdeac87161417779cc6f5530a8dfb670d51e86652ea15ba4554ac600e3644fa7aa557c902dc85fb78f48a2589a5ca945d90d49f66978ed70ffa9dc3784bc27ebda6910527cd091d0019af3f25b8e995132610575dd7538fd007ec0168b3a587aa2e3539ce993f1d744cc8843e6cba1b4cdd525c20a056708b7be7fe02cb23ee3a4c7d6cba6c9d5c4708b5144b4d33d0743b8758ebc939872bba843dd3e3d5fdc5d5bcc4a63da2ae71eecf85c42b499d2e6471b3a7a9bc69d3a7a95e1f57340768883f2bae6843698b2b6ac6b6a68131086cf53aba9b136074a99a1c79a8fbcba643124d5615115b238634c5498b0bdb612e9cd9bb64057f350ef9fb188f41018342f588a2211cee0f46fff30b75fe71e0fcf7b6f3ff9dbf0f7fbdd9d97af5f2f6d351ab7d61e6d9cfd934559b9d8486a5cafcad86b2dce13cc7bc48801d1b6d034939b5c15a92a56a5a0cc98f897f85ef152c06ba5836afabb533cd01ce56bf6635b0ad6f63d16b049b715f649170327fcfd6bad7818bee5d1bfd3781d4d7c9bb0b4c0971ad0a52e615dbe457c545de78f53277ed8c65ea8309b6d9ecdd6da5ae9df1e69006f09f07b3dd186e6e19f78e6c389ba614ef3748653ea1b0f1f7cdd218a1bf5882959a856b5f361f3f584fca6116b06572ce96774bba8a1394361d14a51cbe5845c0990eca22ee9fa3e35cc8a562ccd6bba320cbb2e8e4f2ec51a59345709b7cb2a5b984c2677497ca42298df2981c22e6e4710c6436243f71904b40f4ae64c611e353c2751eed60a8108604994573c06f21c0b1f1cfcd34c816e3f154aa52cec16f4d4cb3443d640fc93bbfeb66fac128a2793d5c1b2f9d72a8409f35b68f1059fd65517faeebe36cddc98e79d5df8c699c413f77d6546d654353dad3ad3d2b27bba8f9b405e6b7c93d966a8225a2a159f6750724ecad788cee46127c593c9a4ea6520448ea785f9d0498ec5b8485f03088784c6b5aad900758af13ae5278a333e345502f499c223104ea718a253379f28b5cca9751cffbd79621e451171a8348c9f864c2b55df724964f309ba189efa23e47bb2e59e0e4b34721f9e6e0c27ca1c84ab28630d312f85659bed68d2a35b0493c4c0e0f13c56c8b1b56872c2d5ef1a653c735a7324cf742270a7c7ee43233a039b99a5f10a9de326abe62f430f4716ee0b2a9871134645c93e9c43276416b60c47e85c56f7ef97f44b42b8ea72590b792d3bbe6444f8dfd0df3e5353e9e90c7809b874b8b672131e21f44b89d6a2133df41a164a874f6c2666db4b20148002d4d0f1d001b0c335f3bcb0f76dd93556eee8e75e1b88ff96e1b7ecf58d466c0176bac6cc2e78d0763fc3f5de0a542a968c2173ab007760acf4b8c75eb5f2da748db496616063cdc1fec3c5e54a188d726cbbd585ed9ceb6891fc05200cacb09132816b774b75083d9cfe4ade7321701586a42d728a40a660662ee402785e8e1deafa35f871a16b61be09f456ca133bbe254133c6b06d658c852e8ef68f4dfc3164b2209fa1c0e6ad8eccfb552f3963f23a518229e2834de1a1aa5bce00a71a3ef66ccd8b813731b384ce254e8fd2d8cec74f1801ed8b4f809b62b6696d76035a0da9d83af088ea1bfc85a63c42b8d74b51f8c7e844da5e42b34e588678160fed8545a755369ed4da4de1f06fa089b48e9c7715a7690920fada927b7835433804a3b39f9277fee79afa62ba2f1f0766fa36d82d76058684e2ae0a15d720acebd8001892d205d072f4ccfd656c155cfbb5b258aa883e8ad39c0a38605781ecd65fc917e3867a1f7fd2402167a1beb9940c581b715010b01d764e37b7e38529bfd5050ec6d35ebac808612488f868833865f6830c7e641d29f9b8fe160ec327d4336fa22a1dad39d115103e91191915c1b28e12379772794d4fa5b032b75d81e0d31a75482cdc2fc33308499d240a040ad04f806bcc4d0d85c69493fc4d4fabb335aea903da60cb1893b2dcb22468c2f6f5f5a61b2aa182974b88e2029c2f5a4a3a8d51b66660fe6383dbc96ed9314b40dd63808c3d7a1b156074b623145155369755fe1958722ad14de533cf857c50ac1b73de208459bfed9126494f07a6abfcf7e47d22bc3fdaf4479c9772496919eadb232edd59a3d21e27b286cdaa99277a7e1690322f1f56a382cb67850f4b5042f1ec9324f2cefc1f8afef4eee688da75dac688bc380c36cf4471373ef143a6b38d98358cff14c89bda487bb4ab2df7c4d177798ac1dfa110d28a5ae85f41a679b16f6b59d92ae96cd3aca2ad5669e83f274254ad3f1ee6f2f2e4ecfcde623cca249aa2876f1c379874049961e2bfe1b88e173f3f5d04329ae15930d2833e549714f495c6a72cf28acbf9fcb51d3eb55b9b17e26f8f4847ccf3225bfb1470b0cdb2b49811e5d6d3b5f393b2f1d1a71e7922dd4e8c58b2f0740a974c6f04efe529bbfdf6d62bc6698cae6d3138017774a06cea0e5a2a1e9398da266b359e153aea5e830d376cc0d0bc126482e163269f23935650279e0757c2816390845b80844ac885939b32760eee2374998b315ad96b38f66b33cb9eb2b2b7da6fddf642f61d5f0bba5506928b425041fcb8f1d7c27d467009ef93fcbdbbd5a40fec0f7c53569e5ccff582f505ffb48370b5db988f0c4425c443057f6909a47b9bf30375a8b3b8492ba97e6ae1e1045045d2177a92dd39628fe8fe4c22a8da26c1318ba9866474f250e67728c83a0c58eed812a0fb3986467e42229020397b9076b8eda242b466794573efa5d3ae791fd72aea81f3327967e9e6f06872d6b33bb6f4d6733c966e6ac2b5ef7c4fd2c3739fe174f8093fd05a157800ce3da514d6e6ea0db4a0eac15f54f51f1243bbb163ba7925d71765dfea278a180ecc310319ee94d9e8b34d2c069912ced99e703e4c9c0ecfb635c93dfc96fca262bb7853045c91e417616d3dc27b3a6f026d2efceee476efe5cf8c8d05dc5669e0e3fdbb77431d57d4f187bc9cd37e2de84a6fda8bf3d9cb824d911565a966ec6a698a9a41625c5243449da19fc9aa3b05f730499c1822cad586b1ee3246f7135ab712e8dedc720d2a389533cc890028c341d72784b8123f0e581c979b4312d9e562c248434f4eca004e8b1543737d8e3095ee5f885fe8ab9700a1f28cac6b265e54c9226796c9a86676aaea863f3f437a6dda4205ccdeb7acb144759f24a52073b61e6e9f01c84ad4971687a374fa50fe6a40933bd9c66d2bc96856495b5643a07131157956c4e2f144bcbe452248532e92488303da6c430df29cd32cd1864d20399743f4a3b20e885b3f3fcab6184c70a945e602fa04d306ee03bd4e7b37097383baf22b03fafb9a7e7fb83572f0764ce1065e6f7689c27d3da9b800d9e09bbc2f718521137df4961cb8cf592aa3c12d1c2aec6e72efcfc9a3cdfde7949bea39762420e859c65777aa602f5376e0a1d61508203070ba976333dd176b4bfebc36271c952c6f46a075402c11e723631e1225e2b0f3d09bae1380ee73468ac20f53c96e4e0035e373c7bfd133977e701a0b2b16eec490ed6c861ac2f4177b8f0bba9da210bc939f7e6a271c04340a787219f39f77954e9204fdd5617742be3e63b602e85b786f0ce14de88af03f31dc81972cc59d08c3d0b63c4102998e75b36cef76c01dc781efb3ebfa28da3fc8d31cd01101ad290853d675cfcd9428f79c2311eba7e6c8e2597a84f89a9be36b9692431a6a3392c882970c4b4408d390449c6be92ff3f133e28bc21d0f7c85a497f15786062266910e0203f40698c2a117dfe2dd2c424cf49d20ec37ec009c352babeea9868a14db89ec4ee25d366dc4b2ac1ec0b851a8184f90022a4f262d9c8c734e440db008088c0c2643d06c7cb47c39910339f999c84d1488560c72e9c99001464bfdb47dd31f33db7155799762111a245fbc804045c0a7ef6609cff1ef9326e1ffe05a01a812727a1bbd298bfc5bfc5230c70f8780264302e3fb70ff8921cc162842895c90fda5b694c30c33d2d71baec8af9de04105c79b36475b780ef24b09f47654c2e24c75f215d65f82b0e5674387a4f71bbaef0d032e8aa748cbc013af23795f0cf817dfeeebc7d52db8ec1a85dc2adee35c4f9303d01831bcc281a99590dc687e9f3122ab5035d806f0512b23a522a9872bb001f940b969ab60a3a991b9eb21dfe66cfe199d2714b4527935c7768e2a0b9c97a0cf6dbfb98c985f37cb83d7cd15d3b43dbe83735ca71d80d5f14552a809d6e32828319a10340d7ff020000ffff010000ffff4682f6258a9d0000") + bs, _ = hex.DecodeString("1f8b080000096e8800ffec7d6b7bdb3696f0f7fe0a44d38b3daf29d9499ae9ebdadaf5259dba97c48fed4cb7dba73b0f4442126a926000d08ec6f5fcf63d07e0fd225296ed7876fa21b14882c03907e70ee070efd9f1dba38b9f4f5f93b90efcf1277bcf1ce793d1881c896821f96caec9c6d12679bebdf3927c472fc5841c0a392334f4a045a8259fc45a484536146344cf19397afbe6e2ece4f0ddc5dbb37332e53edb1c627707be4f4c778a48a698bc62de90bc538c8829bcc6155122962e23aef01881cb99b86232641e992c6030f2e3c985a3f4c267d897cf5d162a1c8e6ae2c2d30923531103483c3430fc7072f4facdf96b33fcf013c701ac1039e2d370b63f60e18084338746d1fe402d4217860f67e6968b1809df67727f709e3e39d2d21f10d7a74aed0fb0912fe8e500bb64d41b7f42c85ec03425ee9c4ac5f4fe20d653e7ab41fe60ae75e4b0f731bfda1ffc97f3eec039124144359ff80cba851159086f9dbcde67de8c15de0b69c0f607579c5d4742ea42d36beee9f9bec7ae800c8eb9d802c4b9e6d477944b7db6bf33dcae75e431e54a1e692ec2425fb56634d673216b2d7c1e5ec2c4f9403178acdd5813ee624f73c9a6fb8329bdc2cb6104841c7f822f68ae7d36ce88487e27373738cf6f607edfc0481b9bb7b77b23db2a1bc0763611422b2d693472951a6557c3808743b83348e0406e5073c6b485d05c13bd880009cd3e687cd93c216422bc05b9313f0989a8e70140ce44682d825df297ede8c3d7c9b32920ed4c69c0fdc52e197ccbfc2ba6b94bc91b16b3c116c96e6c910309d4de228a86ca016ee653dbc5ed27e64fecffbff997d9880195331e3a5a44bb6467f8250b4a6d8708ac138850a8888200dc34c1f2230b7db1457e142175e12f489e12c0905b64700462c3990410af01c2ac9bca1014980db9db43b9f1c6dab0ae9663649dfa53a457fbd3294c48fbd3ac676f69cf8d4fb39ebd8c0a13213d262ded421156f0f2c54c54c8bc4bb6bf2ecf74e18ee9c6f9329ff048288e12b18b3c053279551d802bed84c299c4a014743694b96d18ce4186b3a0555e04c4fc3808b3773cae229fc25cf210789d39135fb897291cc0da5692811f53fec818c7a84d609dfcc184ba9733891a0f471112c09f4d369ebf78b5459ebfdcc6ff7636bf2e5350528fc76a97bc28209fd26727fa405ee6f753423e87dbcfd3dbb755bc80cdc2a147417154f8dc675380763b67f4127a3bdbf96dc3f9d4e733a43f22f97537ad5202a78ab84e5f9c0bf28c07a83569a81b24016c44f6daf59c6be61899c157af41d194b4c135b3d47fb9bdddd89357532c16ffe7a056baa0f0862aa0beef94a8d80a50f2f27f06cce3946c04f44342d3bfbcfa4bf46133eb20912bb0b211a80960e9b1bd5394beac3121a33f03ef83add584924cd712b0641ad5361bce86bb595bf267208a042d3301c34aa239505a81501140425c139caa8964f452a11df605bc2e592405bce3030b8e14584830e8d75ccf8b3d5a7e5243f2e75176bb420409644a67e53663c7bd911141b0c4236b8a3fd93318e2238f5f550dfaeb2bb067c6988ff746f0dcda29f076c8858840a424414701ef85f42ab3f7f40a9fd83fa886d29f1e9bd2d807b30cdd33d38ecfa831aed6e61808924e100a0ac491c933b456203de5319c8904a70a60e3c12c7d82fa6d409474d1dc3978e5ec3cffca585962bd80c18be760830d8fdadfa331c98cee9e61afb4b339f740d13a1fc02a96c7b70628d60c46ff1d880a8fc68dd6da74374e5aa498c47e018f943a859f46b033c48da5c799e160e8e368066a899d8453310cd975813ea62178965a848949b717991f36d1613a00fe847ff98c582fc23a74e02a5e66036d6c9607281261e62fa239fa3024fbe5b8737625e16f1c0d52ac3f6781ca1444de09c84ca8c080b0fc977345fd18fe67520157ec0f6e6e8ae8620ba56f6f07e377f62e3021b9f92c69fdd96d99c866a09125418192239f97e99ae0e2491179e23a2c634b13c2fc69506d077c3d9ba1378a8a28b928f652c171fcdae3da02f8fef37002f4d89b64ac0e22ae915a13f8474be3e78c928d1bb0302e0169d01867a016e710b4eb198b04ce61e7c4cd3daf326355140e3c8f607760fe855c244d11e23251bb2042f9e8051150e59a59ca7440855d76c19311925f710fc56605a8c17ae873abdd552fd05d31eb003bedee6e64e4fda9f85e6278d805cd1c6cd1c9f143d250cd638d0cdc0b68319d76426cbbbb1bfdc0d06b2a754f369c42f379073c67b6c787a4209d88b81fc860daa5765810e94597f4609f4b80de1bc57eb3f6cc9f249e01fe00f362dd81164b6edba3fff00d974a832370bd4544e82f0884c8d721e1531232972945e5e26b92d0945c5319a26395f81ab9ab8206f119f43fe5b393104d78a6a6a1e3dc712801e33b81071e41d1ba169e031d984fccff4e326cd92254db22ad3dd36a6ffea260d34a6d4cc83e487904e24ee6310f3cb017e38c76ed03a07f5655f851610a2fe69801421ac4d27853644e15993006f106bdc26c50acc11f045fd585600ddef086b9bb438218a721010cddd2a491c909818351ee7ab8378acaecd1093e06a8152fa5879f82ce890a8a3e0a89209e4c3ca34795e4aa0b5163291fa46dca3f0c1a26b37ca37459b8c85debb270b059ec83230dbc5c61fd1293a7fde18bb97936f136d940ef1b83abcdbc87468178b54c1e1c8c9ba301e11ed23b198133b55c321229bab9c1578ef0c106fe1a9e1c83636ca6102e19d5b64f0c7ff0ef0f0076c5e75c2a75a576d01284b049f42acd8c6b57f2dc800e3e8d54ead045e0936126ef4f257c536f106f02629ff2d0631fd021ad75dfc3532e3a5cc4526978cc2573cdf4fd4e4cd2f094eaf9ed6d57f7b968903c62410a2b081cddb9a5f0b9a63acee7a011e8ba6f9e75e25ccf19b8e47178191a07f79dfd5177bafbf7a5803b238ca0ceed8fb5fa726968b5f579f2abbbb75a1fa0159b98aa050693a9ed1888908d9b1becf7944917388ace58410a3edb6c866e65c8b9d7c8e4cd609f40e34784b9ed4925d6b1b7c0249625bfaa52136590aaa2a21496053f15689249766db43ea6b6dab09a286a967d9bac2abe422a99dbe45a69c98d08341355a7c999e6a7b2ed113e9c771b4498da4e639819944278007d2f19d82b2549925c46a2e04e8ecd1286d78ad3a81da9f5f1b5493547442cecc0fb1bd3f21e10ce34fa5a78a7ce6e00a19cff4b42c95f873cbca23e6fe39ede64491c5d47f159175d5e4b29d6244b330e1f932d66be987445c87f8536d46fca7fdc071166a6f76fb8cf14587eea5fd3857a130713266f6f6bfa9b6b8030197e8bb4f475b8d0a6af090f2932dfe1c723ef5c045dd4fd41b80f475c1f3bbf1fda9aae9e10695d5fc49e8379105fd0aefcdd5b8803df4e4decb70e7ddbdbd316351542bc6be93f26dbe59c90b8c66038774ad3b4477d16f34ed69d44eca9610e6bde4801b3d4e95a8adcfe3e6037deee00679b1c2e77be0ccf7c247ec235c30e2efa912a88e78dac3e081735bafa487743f13388fbde863e78693f33d545c7d6ae9e55fa7a239eee94c4a13b67ee25eb92ee9359282423e0b3075ce18288fa08d363814018d47dcc50a9bba73c496699d6a17ed762c5b95dcefd89ebf97a26ce0ca8cce20e526af3aeee133c690b31e09159026f08dc6a3199b9dd9c91680e90684bb22f923c0085dcb420898b3039c23dd27de0e5bbdcef7268b375b9eae25b27ac1e0d674c0e1af513f9fc73d2d70ae2ae3dc93dd66005bbb543d4c7f0270390a33982ac96e1db2c634d61f81d929dc554252e601592948657ee2d4b1942e7fdd293d90a78211f896f1f4d679892fc255dd1dfd8fcf5e924252d7a693612af1c84b3cfca50d11707d7284c372b24381b45b2665e2687a723230304fe2329534fca742e501cfc48de69eef37f983599350dc902dcb960087f9e4644a3a9ba541d04383a7d77ef0470a338497756e20bb80ca98e25f577776e6f3ffb1789f58e9366e40caed623108c1d321709ad7ef9420b4dfd2f306b338990630206b2e2dedee2d5464bdb93d0445b17785964b2cd8f4dcb5ec6f35df4907414b1ee4f4808e0ef9f92a9fb92c801807c108602a20ef6f67bf26c9fc4a01ba73c6c5587bd698efb81e742766518d3d1c9391e78582bd7d81976a49b31702fa97951c52eee3e182c234a7d6fd75bb3e33683b45fc8531bbbe24e3eeb39f674bac2e01f53af772d35fccdeee35b4fc892cd804f391cba6bec63bcd0d44d7ba0f0676defbf87c76d9d4ebb2120f73adb1c70a1e74c22eaea29ed0a6870c0d7dd0e50ddedd8d047a3bbde3556e3de808eb565d43f450b948c36c479805016835b570491cff071f5e9f0efc65e613a74677bbbf7aaf4bb08b71f1de766966cc0ebebac90df0b167b2b2151de11600d79d708e05f1a4773777b8d0d01f504da12cc07e363ae92e7cb765d3cd8ca7d5560fe58b92f3dec93a8e76157a2fec0f300d9b5b2c056e16047a5fcc047f3da451080feedcab1820ccea508ef253aec23bed5683197e68f4aaa0867bf73d9008f131f258d57a1564de1a4e429743668a2a9591568274b4befcffa768fab04ffce117a954b7b04ead557fe88d73ba9da276cafbef320d1fbbf465486a4808ed636227f84670fb83893ffb40b34a3f2be73bc65767fa9e673180c9fd9dddb439f85333db7eb5c1ff7404653d45725f21ba1b99b2b8b754e65146258a007c6af05b2e0c8e634e8cd0ddc1d5ef080811a80c092ed0ebedd0d825da506b7b7bbe9995108f7a692b3d0f31736fec597cc0c18f979f8731885c8b1f948465104cc2908cb1ffd4e7875b9af6fbfff2827304a12901d5dca8e39e3ed435305a3dfe9e7f4f04a720940322f29a3510bc73b8e3fb71d1a2e9f132ee8afa489091512a585755576478022847fb1546c98d57219864c8feab2711e47781a9f8cc83742c641eb49b15e232b187ac6f53c9e0cc13f1db9d40fe6a30c829164308f8aa93a143f9893bfe4cc36580f8825e8bb30cc4cc8c5c8136e8c91467238bdeeba151e3f2849b8527113410ee3252747ef61e00646b0a5868eda4fda2e3f106896fc99be16f2d2ea44dc1e017e502a41f6ca24076c2ba34b064499532b9827b7d971541ea05c3f007681a1bfddb54c8c6ec713e35f1c653e98b5575f8092cdf0c8b273a523740906f9a938c54027613e6ac208faf35b0400c64ca4a9b344492405381b81a9cb4016401a72126aacbda449ee020e8161b55c407f9fcf99eff3e40c7ca2baf74606e59c3ac9b9337328af8534326b9212223dd296e39fb7b9c05b985d4969c8c3a9c8d01f179b1e82356bd848796ae48d5cd3cc0b49316943223d96db8a427a0c3845004ffa660066cb2f0936596f47360c674d9397cf5a7eee11de33f3366c83f3e4b81542eebd073ef3a99c01040b4cf396e807722554fac4e2901cb12ef0a0d9dc7202da5df329770d9f56d8907c1e7854cdbf2e2675f3bd269b399f168cc235d09ee07f68872b2590cc252e5fa3c9b8b90916f6a4456ee1b04446ba83151e6656debe63cbc51068e4804e08262105dfd456d1782f47697f835123310db6e803d7a43a4df8a50e7236aa6d36a51e6bc0d33c743c4e7d91c882e3cf1abd47fb30a9bbd5e241da36e815568b65cc5f560e94cdc5f5fee019020becf4fa03786d46d44a1d254e645e7660feb247a7bdfa446fbfa1d3aa0f53c3ade68bee4d850c922a2bf87390142a434e7b6de669c9520abe90eea532fe9db97bf30548976334f717585e26ed68189af076f869728e03b3ea0d4f3d2ef5a2be32b2e7d309b8f739c160700b2670e8d84ad13118196c557b9787119e6c4e1244350ae72823b7a769e702e71b44936a3715711a148aa2192a98bd7c202cb1c41520042c89ebb1b2dafb98e3ae4e83bf8383700f2ca301af31739d464c2d3cb144cc4d5ea2064349d00b6345698fa0b4232be14d39f2e605848649b413fcfbef4d130cd131620110e279f4d0ce1c5a50a35e88319d4d65070786e9c724a940312089d80bfbd82cff99ee86e41c29a04c1945549df8133a15a63c1f28930d6e760b7b9bc3d6758b3aa6cd228f4cbc71470240f0f3d31c6c90ad6c05be021ea2c7465be492b108f10e38a0600a319a2a8e8658e61c3e10075e03562a61af70eba6166215bc5a66d0c8ef30e3d825b25a9e473c522b0c7c139f8697f7068921e81b2331ddc0184e02a853a03cc194296ce00b7169a56f484e341e9c8e7dcf10937cf9dc1499a42e32212ed9c094b8b8fe63e7594c09b815f0ccb2954dddab2debd7a91abf4d987929e1b8162a5442f3f695b0babeeda91e29eee134ca11dd86e5ea31f20189b939cdb83ff85604e9be9a442362574dfab09702a4762f69b3a28beac5308a6ae8dcd6fb089506c38cf39028fb542fb87eacec9ca1ef55ad3b71ff44a576b50c83ad83f4e70a94f516404aee1a52417889a948afc95ce0aab875bf90fcf9a0779d830cd6732def3c17af8d8ac6d5350a914f04e2a241cc063cdab555543330310aca5105e51e31695c0d1a6b81e1984b4c6c0dfcb5b0456a59faf2bdce60315182876326e24393616b9cbdc20c5af2663db490b8b8e234ae6f5b685c3f6bc84237b352afd42d92620577b021d3d7abde4a96e02e1cd0a3572ca93455e6ec82a6fe343b85bc7ed2ef1cc65b92f6eb8546969c345b7600643c0f95d0a6579198405c759d573dc218b007a0cd9e1e9abad4e53867fe74d08190497dd8fa3758cba53841c0ad1016f72e06069e47dcb5bbfad874d98a5c470ab5944b4d4bd2740787d8eac905872b86843debe5d5e3c5d5a2c4a635a2ae71ee2f84c4334a9d216471b1a7e979d3a24f53bb3ea1680ed0107f5642d186a72da1a819dbba06c621b0cdebe46eae88d1656a72e2a1ed2fbb0e49365955546c8d19d29a272d216c87bb70660f9715e2d538e4ef63dc1105020acd238a8e70b83f18fdcf2fd4f9c781f3dfdbceff77fe3efcf56667ebd5cbdb4f47adfe85c1b35fb0699a3607090d5395c55b0dcff280f31c0b2501756cb60d34e5d4266b4956bb6931243f26f115de5730191862d942afd6cf343b3a5be39ad5c0b6b18d25af516c267c9145c6c9e23ddbea5e072e86776dfcdf0452df20ef2e3025ccb52a4859546cab61152779e3d5cb3cb4339ea90f2ed8667374b7958676269a431ec07f1e60bb31dcdc32e11dd97036cd533cf02095f9a6c2c6df374b6384fe6209556a1eaebdd9bcfd603d2d8765c196e939fbbc5bd35582a0f4d54151cbe18d55149ce9a0ace2fe393ace955caac66cbb3b2ab2acac4eaecf1e553b5902b7e927fb34d750788de1525929a5591e5354c46c458e81cd86e4270e7a0998de95cc04627c4ab8ceb31d0c0dc290a0b0680ef42d243836feb99926d962dca94a552a39f8f1896956b987ec217be787df4c3f984534b7876bd3a5530f15f8b326f61112abbf2eea2f757d82ad3bf931affabb318d18f40b674dd35631344f7b86b567e5ea17b598b620fcb6dac7524bb0443534ebbeee84843d268fd9dd48422c8bbbd4c9548a00591d0fb09300ab7f8bb0901e06158f754eab0df204eb7522550a8f7866b208e625c953248e403d4fb10493273fc9a5021af542806d25431e75a23189948c4f265cdb794f72f904cb1b9afc2eda73f4eb92094ebe8314926f0e2ecc278bac266b48332d816f95e96b5da852035bd5c314f53059ccb6bc6175c8d2e4158f3e759c7b2ac3742f7ca220e6472933039a9dabf95991eab1a3e633470fc31fe7062e5b8b184143c135a54fac6017ac0666ec5798fce69bff4754bbe2b85b02652bd9bd6b76f4d4c4df085fdee2e329794cb87938b5b8171233fe4184cba91632f361144a864a67376c1947ab1b8005d0d3f43000b0c930f3f9b37c63d73d79e5e63059178dfbb8eff6c5ef198bda1cf8628b955df8fce5c118ff4f2778a9522abaf0850eec869dc2f51267ddc657cb39d27692b985010ff7073b8f975528d2b5c9732f3eaf2c67dbb33de02900e7e58c091c8b4bba5b68c1ec77f3d60b998b002c75a16b1c52053303310fa0938718e1de6fa05f871a26b61be09f456ca133abe25413dc6b06de58c852e8efe8f4dfc3124ba209fa6c0e6a58eccfad52f3923f23a51c22ee2834d11a3aa5bc100a7163ef66ccf8b813733c384cf25418fd2d8cee7471831ef8b4f84db62b66a6d75035a0da9d43ac0881a1bfc8dec68c579ae96adf18fd088b4ac96769ca19cf02c3fcb1a8b4eaa2d2da8b48bdbf14f4111691d2afe5b4ac20255f5e534f6e05a9e600955672f26f00ddf35a4d5746e3e1fdde46df048fc1b0d0ec54c04dbbe414827b010312fb80746dbc303d5b5f05673def6e952ca20ea2b766038f1a16e079b490f147fae19c85def7930844e86dac67020d079e56042a045c938deff9e1486df62341b1b7d5bcb302194a203d1a21ce187eb2c16c9b074d7f6ebe8e83b9cbf40ed9e84b846a4f7726440da4472446726ca0448fe4de9d4852eb6f0daad4617b34c29c52093e0bf3cfc011664a038302b712901b881243e373a54ffa11a6d6df9dc95287ec317588ade4694516296262797bd32a9355d548a1c375144911ae279d45ad9e30336b30c7e9e6b56c9da4606db0c54118be0e8db73a58928b299a98ca5bf7955e7928d64ae13dc58d7f55aa10bcdb238f50f4e99f2d214689aea7f683ed7764bd32dcff4a9c977c586219ebd9262bf35eedb527c47c0f454d8b2a79771a9e3610126faf46c3e21b0f4abe96e4c52379e689e73d18fff5ddc91dbdf1b48b157d711870988dfe686aee9dc2600d913d88f51cf794d8437ab8aa24fbe16bbab803b276e84774a094ba16d26bc4367dd8d7774aba5a86759435aa619e83f274354ad3f6ee6f2f2e4ecfcde22360d1a45514bbf8e1bc43a124538f0dff0dd4f0b9f99ce8a114d78ac9069299e7c9e39e9ab8f4ca3d93b07e7f2e474db75795c6fa9ee0d313f23dcb8cfcc61e2d086caf22057a74b5ed7ce5ecbc7468c49d4bb650a3172fbe1c00a7d219c333f94b7dfe7ea789f19861aa9b4f4f005e5c29193883968386a6e7348b9a61b3c2b75d4bd961a6ed981b16824dd05c2c64d2d4736aaa04f2c0f3f8502272108a70118858113373664dc09cc56fd230672b7a2d671fcd677972c75756fa6efbbfc95ac2aae977cba1d270684b0a3e961f3bf94ea8cf003cf37f56c87bb584fc81ef8b6bd22a99ffb15ea2bef6d56e16ba7211e18e85b84860aeec26358f727f614eb416570825752fcd593d608a08ba42e9525be65da2f83f9203ab348ab24560e8629a6d3d95389c293a0e8a163bb61baa3cac6292ed918ba4080c5ce61cacd96a93cc189d515ef90a78699f47f6cbb9a27ecc9c58fa79bd191cb66ccdecba359dcd249b99bdae78dc13d7b3dc64fb5f3c0149f617845e01314c684735b9b9816e2b35b056b43f45c393acec5aea9c4a76c5d975f913e38507641f8688714f6f725de49106498b6469cd3c1f202f0666ef1fe39cfc4e7e53b67ab97d08284af608bab358f73ec19ac29d48bf3bbb1fbdf973e1ab4377559b797dfc6cddd2c5daf73d61eca537df887b539af62bff7673e2926247d86859b9195b62a6525a94148bd0246567f0f38ec27ede1174060bb2b262ad258d9312c6d502c7b936b65f8748b7264e7123430a30f274c8e12e0589c09b07a6e6d1c6b4b85bb15010d2f0b3831aa0c754dddc608f277894e317fa2bd6c2297cb1281bcb3e2b579234c563d3323c5373441d5f4f7f63d94d0acad5dcaebf99d2282b5e49ea6027c23c1d9e83b235250e4defe6aaf4059db460a697f34c5ad7b250acb2564ce76022e2aa91cdf985e2d332bb1459a1cc3a09214c8f2933cc774a58a615834c792053ee47690714bd70769e7f358c705b81d20bec05ac09e60d7c87fa7c16ee1267e75504fee735f7f47c7ff0eae580cc1992ccfc1e8df3625a7b13f0c1336557f84043aae2e63b296c99b35e329547225ad8d9f8dc859f5f93e7db3b2fc977f4524cc8a190b3ec4ccf54a0fdc645a1234c4a70906021d56e6627dab6f6777d692c2e79ca585eed804a60d843ce26265dc46bcf434f826d388ec3390d1a1b483d8f2539f880c70dcf5eff44cedd7900a46c6c1b7b9283377218eb4bb01d2efc6e6a76c84272cebdb9681cf010c8e961ca67ce7d1e553ac84bb7d515ddcab4f90e844be1a9213c338527e2ebc07c077a861c73163453cfc21831240a96fc968df89e2d401acf63dfe757b47194bf31a6390042431ab2b027c6c59f2dfc98171ce3a1ebc7665b7289fb9498ea6b539b4612e33a9acd825802474c0bdc98439054ec2bc5ff33e183c11b027f8fac97f457811b26669206010ef2033c8dd12462ccbf459a84e43949dec3b41f48c2b054aeaf3a267a6813ae27b17bc9b419f7924a70fb42a146a0613e800aa9dc5836f2310d39f036002022f030598fc1f1f0d17026c4cc67a62661345221f8b10b67268004d9eff651770cbee7b6e12a68170a215ab28f4c42c0a510670fc6f9ef912fe3f6e15f00a911787212ba2b8df95bfc5b3cc204878f3b4006e3f275fb802fc9114c46885a99fca0bd95c60437dcd312d16557ccf72640e0ca9d25b3bb05722741fc3c2a63722139fe0ae92ac35f71f0a2c3d17b8acb75858b964157e563940db091bfa9447e0eecf577e7ed486d3b86a2760ab7bae710f1617a020e37b8513432580dc687e9f5122eb5035d406c051ab23a52aa9872bf002f940b9e9ab6063ac10d77d90e7fb3fbf0ccd3714b4327d35c7778c5417793f518ecb7f731930be7f9707bf8a2bb7546b6d16f6a94d3b01bbe28aa34003fdd54040737420740aeff050000ffff010000ffff1545ebf69b9d0000") 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 0dd89490..f0fdd312 100644 --- a/gui/app.js +++ b/gui/app.js @@ -34,6 +34,7 @@ syncthing.controller('EventCtrl', function ($scope, $http) { if (lastID > 0) { data.forEach(function (event) { + console.log("event", event.id, event.type, event.data); $scope.$emit(event.type, event); }); }; @@ -142,7 +143,7 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca // Update completion status for all nodes that we share this repo with. $scope.repos[data.repo].Nodes.forEach(function (nodeCfg) { - debouncedRefreshCompletion(nodeCfg.NodeID, data.repo); + refreshCompletion(nodeCfg.NodeID, data.repo); }); }); @@ -188,27 +189,37 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca } }) + var debouncedFuncs = {}; + function refreshRepo(repo) { - $http.get(urlbase + '/model?repo=' + encodeURIComponent(repo)).success(function (data) { - $scope.model[repo] = data; - }); + var key = "refreshRepo" + repo; + if (!debouncedFuncs[key]) { + debouncedFuncs[key] = debounce(function () { + $http.get(urlbase + '/model?repo=' + encodeURIComponent(repo)).success(function (data) { + $scope.model[repo] = data; + console.log("refreshRepo", repo, data); + }); + }, 1000, true); + } + debouncedFuncs[key](); } function refreshSystem() { $http.get(urlbase + '/system').success(function (data) { $scope.myID = data.myID; $scope.system = data; + console.log("refreshSystem", data); }); } - var completionFuncs = {}; function refreshCompletion(node, repo) { if (node === $scope.myID) { return } - if (!completionFuncs[node+repo]) { - completionFuncs[node+repo] = debounce(function () { + var key = "refreshCompletion" + node + repo; + if (!debouncedFuncs[key]) { + debouncedFuncs[key] = debounce(function () { $http.get(urlbase + '/completion?node=' + node + '&repo=' + encodeURIComponent(repo)).success(function (data) { if (!$scope.completion[node]) { $scope.completion[node] = {}; @@ -217,14 +228,19 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca var tot = 0, cnt = 0; for (var cmp in $scope.completion[node]) { + if (cmp === "_total") { + continue; + } tot += $scope.completion[node][cmp]; cnt += 1; } $scope.completion[node]._total = tot / cnt; + + console.log("refreshCompletion", node, repo, $scope.completion[node]); }); - }); + }, 1000, true); } - completionFuncs[node+repo](); + debouncedFuncs[key](); } function refreshConnectionStats() { @@ -247,12 +263,14 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca } } $scope.connections = data; + console.log("refreshConnections", data); }); } function refreshErrors() { $http.get(urlbase + '/errors').success(function (data) { $scope.errors = data; + console.log("refreshErrors", data); }); } @@ -277,6 +295,8 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca if (!hasConfig) { $scope.$emit('ConfigLoaded'); } + + console.log("refreshConfig", data); }); $http.get(urlbase + '/config/sync').success(function (data) { @@ -837,8 +857,8 @@ function isEmptyObject(obj) { return true; } -function debounce(func, wait, immediate) { - var timeout, args, context, timestamp, result; +function debounce(func, wait) { + var timeout, args, context, timestamp, result, again; var later = function() { var last = Date.now() - timestamp; @@ -846,9 +866,10 @@ function debounce(func, wait, immediate) { timeout = setTimeout(later, wait - last); } else { timeout = null; - if (!immediate) { + if (again) { result = func.apply(context, args); context = args = null; + again = false; } } }; @@ -857,13 +878,13 @@ function debounce(func, wait, immediate) { context = this; args = arguments; timestamp = Date.now(); - var callNow = immediate && !timeout; + var callNow = !timeout; if (!timeout) { timeout = setTimeout(later, wait); - } - if (callNow) { result = func.apply(context, args); context = args = null; + } else { + again = true; } return result; diff --git a/gui/index.html b/gui/index.html index 9b89da31..e448bd49 100644 --- a/gui/index.html +++ b/gui/index.html @@ -294,7 +294,7 @@ Up to Date (100%) - Syncing ({{connections[nodeCfg.NodeID].Completion}}%) + Syncing ({{completion[nodeCfg.NodeID]._total | number:0}}%) Disconnected @@ -312,7 +312,7 @@ Synchronization - {{completion[nodeCfg.NodeID]._total | alwaysNumber}}% + {{completion[nodeCfg.NodeID]._total | alwaysNumber | number:0}}% Use Compression