[Sip online and Sessions can now display multiple data sources Adrian Georgescu **20080531121559 Moved setting $servers from status/config/media_servers.php to global.inc $DATASOURCE['name']['mediaServers'] ] hunk ./cdrlib.phtml 2197 + +class SIPonline { + + function SIPonline ($datasource='',$database='db',$table='location') { + global $CDRTool; + + $expandAll = $_REQUEST['expandAll']; + $domain = $_REQUEST['domain']; + + $this->expandAll = $expandAll; + $this->domain = $domain; + $this->datasource = $datasource; + + if (strlen($CDRTool['filter']['domain'])) { + $this->allowedDomains=explode(" ",$CDRTool['filter']['domain']); + $allowed_domains_sql=""; + $j=0; + foreach ($this->allowedDomains as $_domain) { + if ($j>0) $allowed_domains_sql.=","; + $allowed_domains_sql.="'".addslashes($_domain)."'"; + $j++; + } + } + + $this->locationDB = new $database; + $this->locationTable = $table; + + $this->Registered=array(); + $this->countUA=array(); + + $where = " where (1=1) " ; + + if ($allowed_domains_sql) { + $where.= sprintf("and domain in (%s)",$allowed_domains_sql) ; + } + + $query=sprintf("select count(*) as c, domain + from %s %s + group by domain + order by domain ASC",$this->locationTable,$where); + + + $this->locationDB->query($query); + $this->domains=$this->locationDB->num_rows(); + while ($this->locationDB->next_record()) { + $this->Registered[$this->locationDB->f('domain')]=$this->locationDB->f('c'); + $this->total=$this->total+$this->locationDB->f('c'); + } + + $query=sprintf("select count(*) as c, user_agent + from %s %s",$this->locationTable,$where); + if ($this->domain) { + $query.=sprintf(" and domain = '%s' ",$this->domain); + } + + $query.=" + group by user_agent + order by c DESC"; + + $this->locationDB->query($query); + while ($this->locationDB->next_record()) { + $this->countUA[$this->locationDB->f('user_agent')]=$this->locationDB->f('c'); + } + + } + + function showHeader() { + print ""; + print " + "; + + if ($this->domain) { + print " + + + + + + + + + + "; + } else { + print " + + + "; + } + print " + + "; + } + + function showFooter() { + print " + + +
User@DomainSIP UA contactNAT addressUser AgentExpiresRemain + Users@Domain
+ $this->total users@ + $this->domains domains +
+ "; + } + + function showAll() { + global $found; + + $this->showHeader(); + foreach (array_keys($this->Registered) as $ld) { + + $onlines=$this->Registered[$ld]; + $rr = floor($found/2); + $mod = $found-$rr*2; + + if ($mod ==0) { + $bgcolor="lightgrey"; + } else { + $bgcolor="white"; + } + + if ($this->expandAll || ($this->domain && $this->domain==$ld)) { + $this->show($ld); + } else { + $found++; + + $url = sprintf("%s?datasource=%s&domain=%s", + $_SERVER['PHP_SELF'], + urlencode($this->datasource), + urlencode($ld) + ); + + print " + + $found + $onlines users@ + $ld + "; + + if ($this->domain) { + print " + + + + + "; + } + print " + + "; + } + } + + $this->showfooter(); + /* + print "

"; + $this->showUAdistribution(); + */ + + } + + function show() { + global $found; + + $query="SELECT *, SEC_TO_TIME(UNIX_TIMESTAMP(expires)-UNIX_TIMESTAMP(NOW())) AS remain + FROM location + "; + if ($this->domain) $query.=" where domain = '$this->domain'"; + + $query.= " ORDER BY domain ASC, username ASC "; + + $this->locationDB->query($query); + + while ($this->locationDB->next_record()) { + + $rr = floor($found/2); + $mod = $found-$rr*2; + + if ($mod ==0) { + $bgcolor="lightgrey"; + } else { + $bgcolor="white"; + } + + $found++; + + $username = $this->locationDB->f('username'); + $domain = $this->locationDB->f('domain'); + $contact = $this->locationDB->f('contact'); + $received = $this->locationDB->f('received'); + $user_agent = $this->locationDB->f('user_agent'); + $expires = $this->locationDB->f('expires'); + $remain = $this->locationDB->f('remain'); + + $contact_print=substr($contact,4); + + $c_els=explode(";", $contact); + $r_els=explode(";", $received); + + $transport="UDP"; + + if ($c_els[1] && preg_match("/transport=(tcp|tls)/i",$c_els[1],$m)) { + $transport=strtoupper($m[1]); + } + + $sip_account=$username."@".$domain; + + print " + + $found + $username@ + $domain + $transport + $c_els[0] + $r_els[0] + $user_agent + $expires + $remain + + "; + + $seen[$username]++; + $seen[$domain]++; + + } + } + + function showUAdistribution () { + print ""; + print " "; + print ""; + print ""; + print ""; + print " "; + + while (list($k,$v) = each($this->countUA)) { + $users=$users+$v; + $count++; + print " "; + print ""; + print ""; + print ""; + print ""; + } + + print " "; + print ""; + print ""; + print ""; + print " "; + + print "
User agentUsers
$count$k$v
$this->domain$users
"; + + } +} hunk ./cdrlib_ser.phtml 3829 -class SIPonline { - - function SIPonline ($datasource='ser_radius',$table='location') { - global $expandAll; - global $domain; - global $DATASOURCES; - global $CDRTool; - - if (strlen($CDRTool['filter']['domain'])) { - $this->allowedDomains=explode(" ",$CDRTool['filter']['domain']); - $allowed_domains_sql=""; - $j=0; - foreach ($this->allowedDomains as $_domain) { - if ($j>0) $allowed_domains_sql.=","; - $allowed_domains_sql.="'".addslashes($_domain)."'"; - $j++; - } - } - - if ($DATASOURCES[$datasource]['db_class_siponline']) { - $locationDB_class=$DATASOURCES[$datasource]['db_class_siponline']; - } else { - $locationDB_class=DB_openser; - } - - $this->locationDB = new $locationDB_class; - $this->locationTable = $table; - - $this->expandAll = $expandAll; - - $this->Registered=array(); - $this->countUA=array(); - - $where = " where (1=1) " ; - - if ($allowed_domains_sql) { - $where.= sprintf("and domain in (%s)",$allowed_domains_sql) ; - } - - $query=sprintf("select count(*) as c, domain - from %s %s - group by domain - order by domain ASC",$this->locationTable,$where); - - - $this->locationDB->query($query); - $this->domains=$this->locationDB->num_rows(); - while ($this->locationDB->next_record()) { - $this->Registered[$this->locationDB->f('domain')]=$this->locationDB->f('c'); - $this->total=$this->total+$this->locationDB->f('c'); - } - - $query=sprintf("select count(*) as c, user_agent - from %s %s",$this->locationTable,$where); - if ($domain) { - $query.=sprintf(" and domain = '%s' ",$domain); - } - - $query.=" - group by user_agent - order by c DESC"; - - $this->locationDB->query($query); - while ($this->locationDB->next_record()) { - $this->countUA[$this->locationDB->f('user_agent')]=$this->locationDB->f('c'); - } - - } - - function showHeader($domain) { - print ""; - print " - "; - - if ($domain) { - print " - - - - - - - - - - "; - } else { - print " - - - "; - } - print " - - "; - } - - function showFooter() { - print " - - -
User@DomainSIP UA contactNAT addressUser AgentExpiresRemain - Users@Domain
- $this->total users@ - $this->domains domains -
- "; - } - - function showAll($domain) { - global $found; - - $this->showHeader($domain); - foreach (array_keys($this->Registered) as $ld) { - - $onlines=$this->Registered[$ld]; - $rr = floor($found/2); - $mod = $found-$rr*2; - - if ($mod ==0) { - $bgcolor="lightgrey"; - } else { - $bgcolor="white"; - } - - if ($this->expandAll || ($domain && $domain==$ld)) { - $this->show($ld); - } else { - $found++; - - global $PHP_SELF; - $url=$PHP_SELF."?domain=".urlencode($ld); - - print " - - $found - $onlines users@ - $ld - "; - if ($domain) { - print " - - - - - "; - } - print " - - "; - } - } - - $this->showfooter(); - print "

"; - $this->showUAdistribution($domain); - } - - function show($domain) { - global $found; - - $query="SELECT *, SEC_TO_TIME(UNIX_TIMESTAMP(expires)-UNIX_TIMESTAMP(NOW())) AS remain - FROM location - "; - if ($domain) $query.=" where domain = '$domain'"; - - $query.= " ORDER BY domain ASC, username ASC "; - - $this->locationDB->query($query); - - while ($this->locationDB->next_record()) { - - $rr = floor($found/2); - $mod = $found-$rr*2; - - if ($mod ==0) { - $bgcolor="lightgrey"; - } else { - $bgcolor="white"; - } - - $found++; - - $username = $this->locationDB->f('username'); - $domain = $this->locationDB->f('domain'); - $contact = $this->locationDB->f('contact'); - $received = $this->locationDB->f('received'); - $user_agent = $this->locationDB->f('user_agent'); - $expires = $this->locationDB->f('expires'); - $remain = $this->locationDB->f('remain'); - - $contact_print=substr($contact,4); - - $c_els=explode(";", $contact); - $r_els=explode(";", $received); - - $transport="UDP"; - - if ($c_els[1] && preg_match("/transport=(tcp|tls)/i",$c_els[1],$m)) { - $transport=strtoupper($m[1]); - } - - $sip_account=$username."@".$domain; - - print " - - $found - $username@ - $domain - $transport - $c_els[0] - $r_els[0] - $user_agent - $expires - $remain - - "; - - $seen[$username]++; - $seen[$domain]++; - - } - } - - function showUAdistribution ($domain) { - print ""; - print " "; - print ""; - print ""; - print ""; - print " "; - - while (list($k,$v) = each($this->countUA)) { - $users=$users+$v; - $count++; - print " "; - print ""; - print ""; - print ""; - print ""; - } - - print " "; - print ""; - print ""; - print ""; - print " "; - - print "
User agentUsers
$count$k$v
$domain$users
"; - - } -} - -include("phone_images.php"); - +include_once("phone_images.php"); hunk ./cdrlib_ser.phtml 3868 - hunk ./doc/TODO.txt 1 +- Fix mrtg statistics to work with mediaproxy 2.0 hunk ./doc/TODO.txt 4 -- Add search by sip proxy -- Save relay IP in radius binary ./images/ClassicNode.png oldhex *89504e470d0a1a0a0000000d49484452000000af000000dc08060000000624f11a0000020f6943 *43504943432050726f66696c650000789cad924d6b135114869f494c0d28512452dccd428a8b54 *426369dd486ada4a4c1b631a6912d032999926a3f9b8ccdca42a6e04b72288888b5a043722b8d0 *9512c42cba70a148118affc0bd1fdd888e8b71260b296e3c70e1392fe7bcf79ec385f0a6264433 *04b4dad22e9e39ad962b5575ef36514689b087494d77c44ca1b0c0aeb1b38d02f0715c13a2f9b4 *73f3887c7eebe1f7fbafdceed15a7ff73e006276b952052501c4eb1ea78178cde312105f934282 *d200e27a433340b90124ec523103ca132056f7f82510ab79fc1688f5f4ba04e513906c1b561b42 *5160da301d1d426960c570f416841e01ef5aad8e01e126704c17b684f03d60bc5ca9aade937b9f *e1d40684ee0cb54a0d9e9d84c353436dec36c4a7a0af0db56f7751006574c3594d4d00a0ec5b81 *c845d7fd3a0d231fe0d709d7fdf1c2757f3e80f00ebcd9d2bb76efcfbe14e53dfc2bf766f672d8 *923eedc6de5e0048c2e3012c03b901ac0f606c0d0ef5a1908612845229ff783b0420622d6a3eff *b76835bbbee70160bf25b325200a6caedaf3459fdbb5fc399f4d676e29a8b1e6b33e0b59087aaf *374acb3e5fd6ce16029f667ec167c39c9df3f94a2717dc65b62f04fe4e6f29a831b4d9dcd03f93 *f7198b453474ef5f018c1c84f5f300afbf5cfa6b66695e9500998eb8665bf586546784689a6aa6 *d3125d69da0935dbd68f27d489647212e03734c1a699a18dc5900000200049444154789ced9d7b *7c14d5ddffdfb397ece646362181840408c89d404045541444b1a006b5b65ea0deb5d856db5f5b *a8d6f6b168ede3056aad5aacd20b541fb480edf3086d2dc6827247402080dc8484106eb96793cd *ee6677f6fcfed89dc9ec66373772d98479bf5ef34af6cc3967cecc7ce63bdf7399734047474747 *4747474747474747272a913a205e6bf3d0d10945b4731fd0b2f024cd5f89e0f8ba685b4622f826 *28d7aca3c27a1342f35784096b82a999cc14b11a02bf0d4021c0f7bffffdd16eb75baaabab33bc *f7de7b0701e6ce9d3bd6e3f14800ab57af3e0070e79d77e628995dac613367cecc01f07abdd27f *fef39ffd0037dc70c338259e12d6d67800ebd6ad6bf1b8da78ad4ddb5c98dd6eef90fce6ce9d3b *56090b68483cf9e493a33c1e8ff7d5575ff5d228585fe06f130147b29e5ae12a7f8de7ce9d9bdd *bf7fffbf4648a3a34108a1fed56e5a24490afa1b9a2e34aeb2454a1b9a47b87c9a3b766bce2734 *2c5cfad6e6190e599677984ca6eb0119bf7085e66f502122595e55b081bf06c0e470389ab3d43a *01b402f4f97cea5f9fcfa78687136338c12bfb2449c26030a87f43d3842b43687edabcda7b4ea1 *e7d7d68720124afaf4f4f4898019bf067d345a5e45c02ae1c4a8b5b68a80cd80392727e78dfafa *fa0b2ae4c58256b0b22c23cbb22ae450f12a9b56b48ad00155b0068301a3d108a00a38f498cadf *709b36afd0636bd387cb335cfedaf28513714b820e7d7035f12df875d7a01c3ab01968147344cb *ab15ae0988096c7a25ad952837589665bc5e2f55350e64d98bcfe7bfe926a381f8384b134b58ef *74e36ef0aa429724094b8c89b8580b26932948345a016b1f8cd0cde7f35153ebc42049f4498c0d *b2e0a1c78fe4b6447a1880b00f4224e16af7877bf31417171f888b8bb3d0a8b5061ac52b6bf30a *27de50abab0837f6fffeefff7e01bc1eb6543a4128a251c4fbc4c2d5389c0d417112e262983575 *14b7cd188bc1604008c18a0f77f1f1e6a34df24b4b89e79ebc894c9b3c22e2b1944debae0821a8 *77ba7960c10a92fbc4b2f4857b542bae6ca19637928fae7d180e1f3fcfa1afce91333283e1d9fd *9af5c743adb1f64da23d3e802ccb46208e46f12aae83e2fbaa848a57db34a6b5ba1620d6e17058 *9a5c399d26686fb222601170d7a65f3914abc58cd3d9c097c7cbf8e0df051c2d2ae3870f4c512d *35c0c8217d193cc00680dde166fbde12de7867334307a632382b35c8ea0a21f07abd41ae8956bc *1e8fc71f0f68686850dd0fad78427d64257db8f31242b0f7cb537cf0ef02e6ce9ec8c0f43e11c5 *1b2e4c39b6c9646ab24f9665037ef1fa349b5279034df3636b2caf09bf782df5f5f5ba78db80d6 *fa2accba76042949b1489284bbc1cb8f5ef8270587cf72e0e859860f4e51e38e1e9acaf4c9d980 *df3da8b6bb387ca29ca2d315646524abe2d5ba26ffd97a844fb61cc55ee762ccb07e4cce1dc498 *61fd6968f02805a2a1a181ea5a174bffba83145b3cdfbfff5a244962f78153ac5d7f90cb73b298 *3575148e7a371b771e67c7de5354d73a197d493fa64e1acaf0ec54b67e51c4d62f0a01f8ecf3e3 *c8b2cccc6b47506d77b2f25f051c2b2a273e2e8609a30770c7d7c661341af87c5f319f6cfb8a99 *d78ee4c4a94abe2a2ae7a5a76e0f725f00860d1b360a8805bcf845ebc5af419956f8bc8af55584 *6b0e6cb18f3efae853dffad6b72ef0965e1c44aadc68f79b4d06b2d2fb70e25415c78aca199a95 *a4c62d396767d781d348489457d7f3d5c94a62cc46460f4d6bd27221cb32eb367ec91f57ed4092 *249212ad7cbae3049f7d7e829f7d673ae9a909feb880c7e3a1bedecda1e3a5f44f4da0a1a10149 *9228aface5d057e7c9484bc0ed76f3c755dbf9bca084618353e86b8b63d3ae4276ec2be6c5f933 *71d4bb71bafc0f84d3e5a1cee1a2ce51cf7fff7e0315d54e526cb194553a58bbfe1015550e1ebc *e3524a2b6a397cbc948a2a0765950e5293e3832aa52158f1fbba0df835e8a169275944f16a9bca *14bf57b7ba6d246ce527e4f53ca05f22274e5561af73f9dd8bc0be5d07cfb2ebe0d9a0fc6e9a32 *1cabc5d444bc5eaf97bfad2b00e0870f5ecde8a169acfad77e3ed9769ccf0b4e9177dd48f5d8b2 *2ce395bd6a5a45bc5eaf3fcc27fb686868e0e0b1f300dc39730c99fdfbf0d9ce93149fada1bcb2 *8e29970ea4a6d6c9da0d47b8ee8a6ca64fce66f3ee9354543bc9199ec623df9c484383ccc2df7d *c6b6bdc5e44d1faebe51ec752ebe3bf72a460fcb087bcd0e1e3c58d8bf7f7f0b7e83a9e84ff104 *a005b7418900c1ae83e9e5975f7e1b5810218d4e3ba875f82b71097131411597f123fa317c70b2 *1a67c3e727f968e3310667f665dae4e14d5a12aa6a9cc4988d8cb9a41f4208be31732cb7de300a *a3c180576eb470420884c6e229a2521e069ff0e1f57ab964503205474a7971e966d253e3193fb2 *3f5f9f318a3e09d6c003167800f197e3f4797ba0ac6e56acdd0f80c56cc4e5f672aca8427d2873 *476570d5c4c158add6481d2c127e63a9bcf515f13619a2d0522785d6fa9a0235419d5612a9d948 *6902d3def4fea909188d4635ee902c1bd75c36484deff5c1faed85ec3d748669938707e5e7a8f7 *3f00b156b32a12a3d180c9e4bf5d72e015afdc76b53ca251b41e8f570d03b8fba61cfaf72d64eb *9e12ce953b38577e824f3f3fc933df9b466a72bc9a9914f8eb6e9003f9f8a875b801484f4b2023 *2d81f858333575feb0d494f8a08a6298b6668980b1a45183e1c6d6b47a6c832ede3612aec6ad45 *08c1bacd5f515e554f8cd9c884d199188d06b52266300677481496540390186f6972f3fb26c703 *5053ebc2e9f6126735b363df2936ec38c15513077365ee40a554188d4692126301a8ab6f6cba3b *5b5ea744a1dee5e58b2fcfd23f3581fffed1f59c3a6b67cdfa231c3b59c9cefd67b8e5ba91180c *52a06cfe3cd352e200189891c4dcbc1c2449e2f4f95a1a3c3203336c9caff0776e1903ad0ce19a *ca244962dcb871d904bb0c61850be19bca42478ea9227ee699671e5eb040f71a5a8bf606292c79 *6f0726a381f24a07f68085fad6ad13494c884508a1c6fdecf393ec3de4f73babed4eaaec2e00ae *9c908dd16854850d106b8de1f29c2c761d28e1cd153b1833ac1f1b769ca0daeee4bedb2f532db0 *0498cd664c26134989566a6a5dfc66d956066624b17977b1bfcc9281586b0c6b371cc5e39529af *723178401246a3bf5c7d12ac98cd662c3166000e1c2b6370660a57e40ee2e32d27d87df02cfd53 *1371ba3c7cb2ed384909565e5c301343a0bc46831193c9a49e4384873bd4e286a5259fb7b92191 *3a11d0be0a95f64ce5f55a7cc66f4163cc46c60cebcfb42b8672cde5435537421165658d93ca1a *2700961813833393b9ed86b18c1f9da5de7c68ec657be8ce2ba9b46fe0486119470acb301a24ee *fffa658c18d21f975b711b2462626200b8f7b64bf9c3ca1d1c3b594159a58319570fe3e3cdc730 *1a8d2426c4f1edbb27f397bfefe2df9b8ea9e775c5f881dc3065246693914b7306f1afcf8e70f8 *44194989b17c77ee95ccbbfb0adefd700f6bd61f06a0af2d8eefcebd8a84f838b54dd7606c146f *a8d505d8bb776f71565616046baf695f384dc568c06fb22df8dbda12035b32d0f7a5975e9af6d4 *534f3ddeda9b78b1a2eda0f07abdeaa6ed4408ed695208ed2983c6867d63e0c62baf5de5584a3b *af2ccb9496dbb1d7b9c94a4fc2623147ecfe55ca5659e3c49668c5680c16921082068f97f3e5b5 *b8dc5ed2fa2690dc272e6860902cfba8ab7763321ad45610afece36ca91db3c948ffd4444c2663 *93b119ca16eafe009c3e7dfa445656d62f8072a00aa801ea0007e0c2df6c2643f33eafce05a0dc *10c5422aff870ecc09ed1e0ded1d53d26a6fbef6866bf3321a8d6466f46540c808b27015462104 *313131c4c6c63629b782c52248888f8b381e01c06ab504e509307c485c93f891ba852f64349a2e *de4e2274e08b327621d28016854823c1b4f9850e89d40a39d2f0c770c750fe0f2db7365ee8be48 *95cfe6f20a27e248a29d3061c2205ae99eb6c96db05aadcb9c4e677c6b32bed88934c825d250c2 *70e9b434376a2bd2401a6ddae6ca17296e68595b8ad39a349106eb28a4a5a579cbcbcb1f02cad0 *dd86ee25a40d33ecfe505a1b2ff4186d491749e8ad21d203d7daf8cded0b54d85a55b83689f7d9 *679f5d0ee815b65610ee86b5d6bf6baf1fd89674ad8d1bc992b6f7b81d896e79759aa5bb84d91a *c2b69fe9e87417bdaec22684c0e572e1f57a9b544e0c060356ab556d7cd769449665eaebebd5c1 *375abfd8683412171717d453170df4e80a9bc3e15087e8151515f1c5175f505c5cccd9b367a9a8 *a8a0a1a181fafa7a121313494a4a222929099bcd466a6a2a975c720963c78e25232383fafa7ae2 *e21a7b767a334208eaeaeab0582cd8ed768e1e3d4a414101151515545757535353434d4d0d5555 *55242727abd72d292989d4d454c68f1fcf881123e8d3a70f6eb79b8484846e73177a5c85cdebf5 *e2f1783870e0006fbdf5169b366de2d8b1632d278c80d96c66ca9429cc9a358b471f7d14abd54a *7c7cef6be173bbddc8b2cc071f7cc0dffffe773efbec33aaababdb9d9fcd6663dab469dc71c71d *7cf39bdfc4683462b1f49c61dc06fc2e431fa03f300c98085c0fdcf9d24b2ffd4e7430e5e5e5e2 *ecd9b362ecd8b1ca20d10edd24491277dd75574717bbdb71b95ce2c9279f142693a953ae9bc964 *124f3df554979f574949c971e05bc04ce00a60249009d8f07f61a1fa39ddfe4eeddbb72f898989 *d4d5d5754afe420856ad5a454949095bb66ce994637407f3e7cf67c992259d96bfd7ebe5e5975f *a6b6b6b6538f134a5b2a6c6d6a6d78f6d9671f6c4f815a22b47fbd33b8f9e69b3bfd185dc9ef7e *f73bcc6673a71ec36c363377eedc4e3dc68510154d65070e1c60c18205a4a7a77768be922471c3 *0d37f0f1c71f336fdebc0ecdbbbb59b16205870e1de29e7beec16ab57668de56ab957beeb98723 *478e70faf4e90ecdbb25f6eedd5b4cc8b44e91888a0adb8d37dec882050b387cf8305f7cf1059b *366d62cb962d1c39728493274fb63a9fd8d858c68c19c3d8b163993e7d3ad3a74fa7a2a282b7de *7a8b3beeb883dadada8e2e7ab771df7df7317dfa747efad39ff2e69b6fb271e346d6af5fcf9e3d *7b3874e810e5e5e5adce2b3535953163c63071e244a64f9fced4a953d9b973278f3cf2081b366c *e0aebbeeeac433693f51319e576996b15aad4c9b368d69d3a671f9e5973366cc18929292282b2b *e3dcb973545555e176bba9afafc762b1a85b464606e9e9e9c4c7c773ecd8310e1e3cc8a64d9bf8 *f4d34f397cf8b07a1c7101fdf9d186b629ab5fbf7eaae8264e9cc8e8d1a3916599f2f2724e9f3e *8dd3e9c4e572e1743a898b8bc362b1101b1b4b666626696969180c06befcf24bf6eddbc7679f7d *c6860d1b282d2d55f3efcaebd663c7f3ba5c2ed6ad5bc7ba75ebd4b0f8f878d2d3d3494f4f2731 *3151bdf85eaf17b7db8dcbe5e2fcf9f39c3b778ed2d2d25e25d0d6525a5acaca952b59b972a51a *96929242fffefdd5875ae9c871bbddb8dd6e1c0e07e7ce9d538d42b4d0e37ad8baaa41bc3709bb *2b3b11baf2bab5a5872d2a2a6c3a3a0a6da9b0b5b5a96c797b0aa4a3d319e89657a7c7a28b5727 *aae8713d6c3a3aed41b7bc3a51855e616b07bb76ede2873ffc61771783575e7985b56bd7aa538e *ea44262a2defcb1b4b9bcc5fe0b17fc5b21f8e0fc4b88ded954d17f8282df890dbda709c73e7ce *f1eb5fff9a9c9c1c264d9ac49b6fbed919a7d326f2f3f3b9f5d65bc9caca62fefcf9ecdfbfbf95 *29235c93431f716f20c6f4973736d92f8493edcbbaffa16d0f51295e6bbc1538c97baf2fe2f5d7 *5fe7edf7fe4da9f9121e7c75072b02e36bccb140d90e163dff3c8b16bdce7beb0f9336ee56defc *e8e966f376bbdd7cf0c107e4e5e5919999c94f7ef2130e1e3c08f8670d972489af7ffdeb11d37f *ed6b5f533f35efcc78e7cf9fe737bff90de3c78fe7b2cb2ee38d37dea0a2a2a2d97333c7026736 *f1faa2d779fdf5d7f960fd619247cde2ddcaeddc06f4b1c6035ed62f5fc4f38b16b1e8f5b7d974 *dcc3e4075f64595b9efa4ea42d15b6509a1d8c6eb55aeb3a6300322103a15fdbed14c2b35b4c0f *0a7f5a9c164288a2d5026e13bb9d423877bfacd97f9b3824847016bc157180f5810307c4983163 *5a1c887dfbedb7472ceb8d37ded8a9f166ce9c19b15c494949e26f7ffb5bd86ba65e9382d782c2 *a7bfb65d0821c4f697a78bdb5edb2d84b08bd7c66bd2fdd2bfffc31f8e8f78dcae243535d503dc *4b2b06a347b5786f0b097fabc02984a740dccb6d62bb5d08613f2456af582156affe50ec2eb20b *2184f8a8859be0f178c4dab56bc537bef10d61369b83f69bcde6ce38bd36114ebc53a64c117ff8 *c31f444d4d8d1a2fb278431fdea7459110a272fbcb01f17a44c147abc58ad5abc5ea0f378ad34e *2184b340cc6be661ee4a3aed4b8aee9e74c41d589249257114dfbc6b987fb998c0879699936e01 *0a22e6613299c8cbcb232f2f8fcaca4ade7bef3d962f5fceeeddbb3bafe0ed60e0c081dc7ffffd *3cf0c0030c1f3ebce50411f9920a1764c625057e9b1837e3764603984c0101f4e5d27bc7c3ff44 *be6ed14854fabc9118d037119cd59c06cc66f0ee7f1bc96cc66c362349b7f3ef935ec6cd9da356 *505a22252585279e78825dbb76b17fff7ee6cf9fdf99c56f15797979e4e7e7535454c4af7ef5ab *0b142e30fe6a8658e1abdd9b03012edefe9aff9a992589dcfbdea68c013cf0a3472eb8ec5d4dcf *11ef6d6f71c360701ddbc3864090d7e3d644f8908dc7ab803e0c0c93bc2572727278f1c5172fbc *9c17c8134f3cc18c1933c2ae2ddc3adc41bfe63d732bc9404d69f82f220afee74d4eb8c014d7a7 *9dc7eb58da52616babdbf0e0534f3dd5ae42b50d0f98fa72fbcb2f73b5d54a529f11ccbe7716c9 *54f1f62fff1f041ac4ac0327f3da2f5f060b58864ee381ebd3a06c3dffec8212462bd6be1379f9 *972f63ed97c480e1d3f8e6f5a3e0ccbf99f7d40686bc066062ccfdaff1f22cffdcba23a6dfc164 *2b1c3fb0afbb8b7ec1444585ede5eda54de2782abf122b9e9eae564eb6db9be6632fda287e383e *3a2a1e9d4dd3f3bb4d6caf6c1aaff4d07fc4bcc03599fef2f6303979c4a18f5e13e37b60852daa *3e03ea6c843e18bd5d74e5756bcb67403dc7e7d5d1094117af4e54a10f89d4b928d02daf4e54a1 *0f89d4b928d02daf4e8f4517af4e54a157d8742e0a74cbab1355e815b6304c9b36adbb8bd06178 *bd5eb66eddda25c77af4d147bbe438eda1db2dafc7e361ebd6ad0c1932a453f2371a8d3cf8e083 *ac5dbbb653f2ef0e4c2613575d75156fbcf1068989899d720cabd5ca73cf3dd7a5b3a2b7956e17 *afd96c66f2e4c97cf9e597ecd9b387ef7ce73be4e4e45c509ef1f1f1dc7cf3cdbcf1c61b545555 *f1bbdffdaed36e7277f2e8a38f525a5aca871f7ec8dcb9732f7872eef4f474eeb9e71e3ef8e003 *2a2b2bf9e94f7fdae54b84f5b85922b5389d4e6459c66432515c5cccfefdfb3979f22425252541 *f3f3c6c7c763b3d9484a4a223939997efdfa3164c810468f1e8dcd66c3e9749290907001e3627b *16b5b5b598cd663c1e0fc78f1f67fffefd14171753525212343fafcd660bba6e6969698c1d3b96 *4b2eb9048bc582c7e3212121a1dbcea32db344469d7823d1d0d080c7e3c1e7f3a99f6d4b9284c1 *60202e2eeea211695b1042e076bb83165f5430994cc4c6c646ddf2ac9d36b974777ec3161313a3 *af72d9462449eaf0f52aa209dd5ce9f45874f14619ca7205bd69e07c5be8f21eb669d3a6214912 *6e77f0c77fbb76ed4292a40b9a46a9f5d31d4546299f767bf6d967d5fd6565654df64b92c4d1a3 *472ff8d8adc5ed763361c204cc663356ab1583c1a09651f1ef3b7b59a955ab5635b90613264ca0 *bebe5e8d13ee5a2e5ebcb853cb15890eb1bc353535007cfcf1c741e11df129f9f8f1e32fd80a15 *17173367ce1c4a4b4b29292961cd9a353cf7dc736ac74543430300478e1c51e3cc9f3f9f912347 *e2f3f92ef81c5ac3430f3d444d4d0d76bb1d5996c9cfcfe7b9e79e63d5aa55eaf97b42e7ade860 *94e5af4a4a4a282929a1a0a0809a9a1ae2e3e355c3545c5cacce79515a5aca9a356b78f2c927f9 *e4934f3aa40cddd6c3f6831ffc40fddfebf5b271e3c6a0fd5555554c9830014992484e4e66f3e6 *cdeabe679f7d567d92972ff71f46e9b8484949515b191e7bec31244962c89021aa65acaaaa62ee *dcb92c5fbe1c4992c20a6ee2c489a4a5a5919999c9ecd9b329292961e3c68d949595a971468c18 *a1c6f9f9cf7f0ef85728ea0ab66ddbc6f7bef73d12131331180ccc983183850b17866d11f8e493 *4f9a58c6b2b2329293938366979c3b772eab56ad0260eddab56a9ae6de84369b8dcccc4c323333 *19376e1c85858540f0bdbde9a69bd466b6d9b36703b067cf9e0ebb16eda55d0b676767678b356b *d60840b85c2e2184109b366d12369b4d6467678b458b1609e1371f62ead4a9a2b2b2522c5bb64c *00429665b173e74e0188929212f5ff828202919f9f2f00b166cd1af538369b4d1416168a850b17 *0a40d8ed76515252a27ee9ba72e5cab0e553caa00510cb962d53d3e7e7e78b9d3b778a4d9b3689 *ecec6c919d9d7d415fc2b685bcbc3c01883973e6884d9b360987c3a1eef3f97c0210858585a2b2 *b2523dcfcaca4a3175ea54919b9babc651ae95c7e351afa9726f94f303c492254b9a9461c99225 *c266b335095fb468911a9e9b9b2b72737345414181d8b973a798376f9e0082ca7b21b4e5ebe10e *11afcd6613252525223b3b5b158ff2ffd4a95355e16cdab44915b7221859965521979696aafbec *76ffb7ed043ebd2e2d2d1580a8ac6cfcbe5bb9094a5e4adea14412af12aea4b7d96cc266b3057d *f6edf178da7513da83221eedf1ed767b90783d1e8fc8cfcf1742f845ad15d6bc79f3446e6eae10 *42a80fbe10fefba3156b2491b6263c373737ecb52a2828e8906bd0e513edd96c36515a5a2af2f3 *f385cd6613b22cab62cacdcd5585b372e5ca267302c8b22c6459562f8a627d5c2e977ad364590e *b2aeda4d2b3e5996c35e90e62cef912347d4f43e9f4fdda758ae7016aa33d03e78b22c8b828202 *f5cda515af2ccb62ce9c3941d740794368cf233737572c59b2444d1bba857bab4412aff6a10877 *2d15ebdb11b445bc1dd654e67038b8eebaeba8aeaee6bbdffd2e369b0d8bc5a256e6eaebebb9fb *eebbd9b469133e9f2fc82f75b95cecd8b1035996d9b97327efbfff7ed0d44b9224a9951587c381 *2ccbf87c3e0a0a0af8ce77bed3aef2eedab50b80e4e4e4b0fb4d2613d9d9d941cb9876163e9f0f *abd5aaae8d6c301818376e1cafbefa2ad5d5d54171df79e71dde7fff7d2a2b2b1142909f9fafc6 *c9cccc04e0f7bfff3dfbf6ede3c1071f54fde5fcfc7c8410f87c3eb5a2d5dab22d5dba3468e1f1 *f8f8e04ed6bcbcbcf69d7818baadc2663299c8cdcd65e9d2a5bcfaeaab41fb1c0e070063c78e45 *92247ef2939f00fe1af42f7ef10bd2d3d331180c5c7ef9e54c9d3a15689cece2cc99330c1a3408 *80e5cb976330183873e60ce3c78fe7ecd9b3ad2afb9e3d7ba8aaaaa2a8a888b56bd73269d224e6 *cc99435a5a9a1ae7d8b16394959571faf469162f5e4c51515187de9848285ddbe3c78f579ba5aa *aaaaf8d18f7ec4e0c18383e22afb939393a9afafe7c61b6fc466b3a9fb972c59c2e38f3f4e6e6e *2e717171805f5cdffef6b7d54a6fbf7efdf8d9cf7e16b62cd5d5d5ea35387af4287dfbf6050832 *121f7df411555555949595b16bd72e6ebdf5d62eb94e2dd16e9fb7b0b05008d1e86b290ebcd66d *d0ba06797979aadf64b7db9bbcd6149f57f1ab645916478e1c098ab370e142218408fbdad73275 *ead426f92b698568f4a74337c5b7ec0aec767b137f37373757783c1ef5d55f5252a256d8944d79 *652bd758b9969b366d52f3966539286fc5b50b45a97b68b7a953a7aaf74288e07ba82d434711d5 *d33db9dd6e8c46a33a9fae0834c0837f6494d168542d8682368e1002a7d3a936e4f736eaebeb91 *6599d8d858f51a458aa734a3f97cbe565d8bd06b1f8df4ca51653a1707fac2d93a3d16fd1b369d *8b02ddf2eaf4585a2b5e010849922ece717a3a5d46604864a8cec2ea2e927895c83ecd6fb170e1 *c2072fb8743a3a2de3d36c110d66b83693d0c86a46c2df43e31542480003070e3400141717ab69 *060d1a24e9617a586bc22449128a864e9d3ae5932449ecd9b3e7c4c0810315d10a9a1170685399 *84bfa92c067f53593c9080bf8138197fe7852db02506f6c7e26f5a3305d2eb7eb44e4bf8002ffe *a58bdc403d500b54e36f1ab3e36f26537ed707b6065af101a6b607c51788ec09246ec0dfde66c2 *2f54a52026fcbd1fd1f539aa4e3422d3a829277e61baf06bcb4db048150d42a32681e6dd064594 *328da275070e62a6b19bce13d874cbabd31a420da26279b50256c4abe82facff1b49bc4a643990 *81721073e02086403c0ffefe6677202c7afb1d75a289d0b7b90bbfae1cf82db1627d15f12a1638 *88e6dc0645f1ca0114812ac2557c16177e2bac585edd6dd0690ee5d5af18462f7e0d396974219c *345a60990895b7e62caf225045bc4e4db812660e6c8affabbb0c3aad21545f5a8d39f18b59ebfb *7a69f47b5542c52b347f9527436b4d1513ee0e1c4411ae115db83a6d43711d149d691b03948a9c *52696bb5cfebd3fc950916af9259038da255dc8588df16e9e884415bafd2d6ad94cdad095304dc *626b0334ba0ede90dfa640468a70158bab585ddddfd5690dda16add0c601a59216dada10245c68 *b9a90c8205ac1cc040639baed23ca657d6745a4ba878156d297f15c16aff6fd2da10496c5a211a *349be21e28fbb4ae82eef3eab485d00a9856bcdae6dab01d14d0b2a5d4ba03e1b6d6e4a1a3d31c *da468248bd6961e7dc6aadf0a490ffc38d89d0d1692be1068135b73f88b688379c6075d1ea7404 *4d5c820861415c88db109a5e17b24e5b1061fe0f370501b4c36dd0b620689bc38c61c25aca4b47 *2714ad78435b1d42c3b4beb04a24c129c2d5b630180d06c357313131e6828282efbbdd6e23c0a4 *49937e0b485bb66cf9b19278ca9429bf01b858c36459e69a6baef90dc0e6cd9b7fecf3f92480a9 *53a7be02b071e34675e26225ac2df1346111cbb271e346354c5b166d98c160b8e073bb90fc4c26 *93cf60308880863878f0e0134ea7b3322727670bc13d6b8a8883041c4ebc8ab5553a208c048640 *1e3972e496112346bc13268d4e001198a24afb5784acc403a893a868e7ded5c6692ebeb285ee6b *4d3ecd1dbf39c2e5a39d0c265cdeedc1e3f1ec8c8989994570a745d8cf82c2755268fd5a45b826 *c062b7dbf5e5789a2154b0cadc60a1cb6f014d0418290f6d5c65e92eedffa1f96af3692e6e7a19 *5100001f5949444154aff69e5b6819dbfa104442493f60c0805cfcc36c1b34bb15014bb442bc8a *c53505360b6071381cba785b402b5c5996d5192d1501875bfb4249a74d1f4e70068301a3d1a8fe *9565591570737984e6a57d00c29521f47c42ff0f7d9368f368ee8d108a364dc803184ba350b53e *6f9080c3357f2983ca4df8bf65b3e2176f5c6c6cecd6fafafaa4664b7411a3dc5445b45eaf17af *d78bd3e9e6c4a972caab1cd81263b964702ab1d618f5a6d73b1bf07a65ac161346a30197db83cb *ed69143bd02731569d67cc6432a902d60a2fd2e6f3f9a8a975629024fa24c6aae2d58a587b0eda *bfa1e716ce0d0af72044126e38f7479baeaeaeaea04f9f3ef7d2f86585323c5219a4a3ba0ecdb9 *0dcac01b75ee32e5ab619dc86805ecf57a2938748a25ffb385f22a871a2731dec203775cce5513 *b39124895f2d59c7d1c232be7fff354c1a97c57b6bbe60dda6e09588d252e2b962fc206ebe6e0c *e9fd6c98cd668020f16a2dbcd655a977ba7960c10a92fbc4b2f4857b30180c415b73d63fdcb9f9 *7c3e0e1f3fcfa1afce91333283e1d9fdc20a379235561e9cd0e303c8b26cc06f79c30dd609d25f *a451654a335890057eebadb75e019e8b90e6a2477b737d3e1f8e7a178bffb801a7cbc3cdd34690 *9196c899d25a3eda789437576ca57fdf780666d8549178bd1edc6e37b2ec6f2dcaceb43172482a *5ed9c757272bf9e7a78728387296577e767b13d1296e4a38f12a13730bfc2b1f69dd0f259f501f *59491feefc8410ecfdf2141ffcbb80b9b3273230bd4f44f1860b538eadcc56a9dd27cbb211bf78 *b51ffc2a8d072d8a57dbb6ab15afc5ed76eb3e6f2b11425072ae9a7aa7877e7de3c9bb6e040097 *e70cc01263e44c692de55575a4a7c62302b3c42bd65a99357ee8c064f2ae1b8e2449389c1e7efa *4a3ea7ce565359ed2035253148bc5eaf97ff6c3dc2275b8e62af733166583f26e70e62ccb0fe34 *34789442d1d0d04075ad8ba57fdd418a2d9eefdf7f2d9224b1fbc029d6ae3fc8e53959cc9a3a0a *47bd9b8d3b8fb363ef29aa6b9d8cbea41f53270d6578762a5bbf2862eb1785007cf6f971645966 *e6b523a8b63b59f9af028e1595131f17c384d103b8e36be3301a0d7cbeaf984fb67dc5cc6b4772 *e254255f1595f3d253b707b92f00a3468d1a86ff4d1f43d30f1d146d36eb364018ebebf178f40f *2c5b406b9dfaa5242049505ae1e0b577b673e99874460e4965c6554354ab27cbb26ae114f10a9f *6201fd16dcef177b500ca1c9e8bf973e8de8d76dfc923faeda81244924255af974c7093efbfc04 *3ffbce74d253fdabb80bfc33d1d7d7bb3974bc94fea909343434204912e595b51cfaea3c196909 *b8dd6efeb86a3b9f1794306c700a7d6d716cda55c88e7dc5bc387f268e7a374e97ff8170ba3cd4 *395cd439eaf9efdf6fa0a2da498a2d96b24a076bd71fa2a2cac183775c4a69452d878f975251e5 *a0acd2416a727ca435ee241a851bfa8959abdc06adf5555a1dcc0b162c78fcf1c7bb65ddec1e49 *7c5c0cf7dc92cb5fffb98f2385e51c29f42fd2979196c0f5938770d5c481fe577620bef0055ed7 *8190af4e56f1bf9f1ca6c1e3e3cbe3fef5e2d2d3124988b7a8c75004ffb7750500fcf0c1ab193d *348d55ffdacf27db8ef379c129f2ae1b193840c01797bd819f4215afb27e9b4ff6d1d0d0c0c163 *e701b873e61832fbf7e1b39d27293e5b4379651d532e1d484dad93b51b8e70dd15d94c9f9ccde6 *dd27a9a87692333c8d47be399186069985bffb8c6d7b8bc99b3e5c7585ec752ebe3bf72a460fcb *087bcdf6efdf5f949191a17c1ba9edc96d3266bc25f16a05ac8fd76d86706db29224316bea2872 *86f763d781128e9c28e3d8c94ace96d5b1e21ffb713578993e7948503edacacba973764e9db303 *7e6b3b7e643a77de3c51f51915ec752eaa6a9cc4988d8cb9a41f4208be31732cb7de300aa3c180 *576eb4704208d54d0154512956d0277c78bd5e2e19944cc191525e5cba99f4d478c68feccfd767 *8ca24f823570ae81b703feb7cce9f3fe72d63adcac58eb5f72d76236e2727b395654a15e9fdc51 *195c35713056ab35523bb744f02766113f7408156fe8a01b6d37b1f1f9e79fff33f003749aa054 *7ab4bf6b1d6ece9cafc26236f0b529c39871d5509cae06fe9e7f98ad7b4eb1f7d0b920f14a8640 *2d5cf20bf3b2b1194c9d3404b3d9c4f0ec7e24c4c712131383d1d8f80d802ccb38eafdedf9b156 *b35a06a3d180c9e48f27075ef1ca9d5545231a45ebf178d53080bb6fcaa17fdf42b6ee29e15cb9 *8373e527f8f4f3933cf3bd69a426c7ab994981bfee0639908f8f5a877fa9d7f4b40432d212888f *355353e70f4b4d890faa2886369505bac8b5be6ec416aee62caff257b5c0819aa04e18c2b57b16 *9654f2c29bf964a425f2ccf7aec36030106b8d2167783fb6ee3985d118dc56abd4c02583ff776a *7202e3476562369b31994c98cd66cc66b3da31a1ac45d137d9bfd2424dad0ba7db4b9cd5cc8e7d *a7d8b0e304574d1ccc95b903959261341a494a8c05a0aebeb113eb6c799d12857a97972fbe3c4b *ffd404fefb47d773eaac9d35eb8f70ec64253bf79fe196eb4662302865f6e79996e25f47646046 *1273f372902489d3e76b69f0c80cccb071bec2bf8a9131708ee19aca02cbd16a577dd7befd9bd0 *da0a5858b3add348b8c6f731c3d2e96b8be36c592d3ffdf5c75c9693891082cf0b4a00989c3b10 *b3d9aca65504aa5856a3d188c562513b26947d5a2b6f341ab15acc5c9e93c5ae0325bcb9620763 *86f563c38e1354db9ddc77fb65aa0596407d109212add4d4baf8cdb2ad0ccc4862f3ee62000c92 *ff015bbbe1281eaf4c79958bc1039230062a897d12ac98cd662c31fe76e603c7ca189c99c215b9 *83f878cb09761f3c4bffd4449c2e0f9f6c3b4e5282951717ccc4a09c93c1dfd162341ad57309e3 *3eb44a6f6d9dd6ffc1b6c4bf58519a7fe2e3ac3cfddd1b1939240dbbc3cd861d27f8f4f342649f *8f3bbe96c38c2923898989c110b87966b3198bc51224de98981875d3de746533180c98cd661eba *f34a860eeacb91c232fe37ff20b5752eeefffa658c18d29f989818a560c4c4c460b158b8f7b64b *89311b3976b2822f0e9e61c6d5c3d4632626c4f1edbb27131f1bc3bf371de3ed95bb387ca29c2b *c60fe48640992fcd1944425c0c874f94b1797731d959a9ccbbfb0a62ad66d6ac3f4cfed6e3a424 *c5f1c47d5348888f53db740dc646f1865a5d50d7a468dd750ef9adaf067401841bd7a074115754 *d5515a518bd562a25fdf442c31a626bd4ba1d65be94cd00a355c8f9a720c5996292db763af7393 *959e84c5628ed8fdaba4abac71624bb46234060b49084183c7cbf9f25a5c6e2f697d1348ee13a7 *960b40967dd4d5bb31190d582d267f9eb28fb3a576cc2623fd531331998c413d6aa1e713da457d *faf4e913595959bf00ca696135a036b5db061654d1dbca9a412b3c6d58bfd424faa526851d9c13 *9a5ef91bea17461a3b603299d49eabcc8cbe0c08d3f2a14579c8626262888d8d0d7b7c008b4590 *101f17d62552b05a2d4179020c1f12d7247ea46ee10863205ae5a2ea9d0e9d40e8a017edd04565 *7fa41b176e1c40a4f8ca03a2ec8b341a2d34dfd0aee048c70fb72f42f356b379853b8f08a2552a *6cad42176f07a20828dcebbfb91bdb5c7ea171b46e03a0e61dda54172e1f2d6d156fb832844bdf *529ae6ce499b4dd8130941f7793b81e66ea896e684db9af8ad394ea463442a534794a3b56508b7 *afd37c5e9dd611ce8f8d64913afa38ed4d1b89d694bba3cea7ade82b6076112df97ad14a3795bb *f755d82a1d2e4aaaeada9dbe5f9f58d2fbf45eaf67e3b1d3fcefde13ed4e7f5bee10ae1b91d581 *256a3bbdb2c22684e00f9b0ff2d30fb7b52b7da2c5ccdb73af63cea4911d5cb2e8e064859d87de *f90f272aeced4afff5dca17c71aabcdbc51ba0550e798fe961db5e788e9fafd9deeef48f5d9b43 *9ddbd381258a1e64d9c79fb71d6ab77053e22c0c488aa7badeddc1256b3b6de961eb11c31ccb6a *eb59f0f72dc8edac215f734906bb8b4b3bb854d1c396136779fe5f3bdb9dfedbd78ce50f5b0e76 *6089ba861e5161fbe08be36c3d71ae5d69ad2623570f4d67c3d1d31d5caae8e06c8d831facdad8 *baf76c186e1c35908dc7ced02087fdaaa1bb6855852dea2def17c565fce86f9bda9d7ede356359 *bab9e75995d6f2fecea3ec3b5dd1aeb4091633e332fbb2adb07d86a133e83515b61aa79b67d66e *c7ed6d9f559898954a61859d6a6743cb917b2087ce55929618c7b2fb6e68577a9f10fc60d5c60e *2e5587d0aa17495b07e63cf8d4534fb5af38ede054551d0b6e9cc8821b27b62b7dadcbc36d6ffd *b3834b153d1c3e57c5632b36b43bfd7fdd7c398e066fcb11bb90bd7bf7166765b5aec523aa2def *eee2321e7ce79376a77f3e6f720796263a717adb2f3e9faffd5dc4d1803e24b217f0ca1d53c2b6 *c418248917febd8bca2868026b23bda3874d02fe3eef668e955537d997de278e67d6eee064656d *d7172c4a90809d274bf9ebee634df65d99dd9f3ed6981e25de5e53615358b9fb58c49bd3b3460a *741e59b678668c1aa8fede7fa67d2d105142cfafb069199d9ecc43578d567f6f385242550fb228 *9d4db5b3811d45e7d5df15752e86a6f6e9c612b58f5e5361d372e85c154ffeefd6a0b02bb3fb77 *5369a28bab87a6136ed0d7f07e36ded97eb8eb0bd445447d854d0037e70ce6d241694df625c5c6 *f0dc3fdbdf2dda1b10c0b26d87c2ee3b7cae8a33358eb0fba29cde516103b8ff2fed6f2ebb18d8 *5352dedd45e830da52618bfaee619d8b929e5f618bb7989973f9f076a74f8eb3766069a20f8bc9 *c8a2af5fddeef4a9f1b12d47ea627a4d85cd23fb3874aeaadde92f1bd8af034b137db8bd72934a *6cacd988d3234748114c4fef818cea0a5b8357666f883f77c3c82cfe73a4a455e9bf31e192361d *eff0e1c314161672d34d37b5295d67306fde3c468e1cc9dcb973c9c8083f976d2856b38135dfbd *85d9bfff072e4f540d716c2bbd6348a496b11929bcfff04c46f74feeb03cebeaeaf8f39fffcc35 *d75cc3e8d1a359bd7a7587e57d211c3c7890050b16909595c5ac59b358b16205f5f5f5cda6f9f1 *f51399316a108f4f1dd745a5ec787a5d0f9bc2af6e9d4c6a82959fdf7439f72ecfbfa0bcb66ddb *c69ffef427fefad7bfe2703436271d3f7e9cbffffdefcc9c3993f8f8a61f6bcab2ccaa55ab387f *fe3c66b399bbeeba8bb4b4a6cd786eb79b254b96a8f11e7df451b2b3b39bc4abababe3b9e79ee3 *dcb97398cd667efce31f939393a34eb6e7f3f958b76e1debd6ad233e3e9e6f7ce31bdc77df7d5c *7ffdf54df3727b786dfd5eeadcd13552ac1df4fc0a5b288fbcbb9e4d579de5cf5bbf6c771eefbe *fb2e2fbef822870e856f1bddb871231b376ee4e9a79fe685175e08bb7feedcb9eaef53a74ef1d2 *4b2f3589b765cb16e6cf57970ec6ebf5868db76bd72e7efdeb5fabbfd3d3d379e1851782e63a53 *70381cbcf3ce3b1c3d7a948686061810fc31e9eb9f16f0c76f5dcfdbcd0cbe1f9b91c2c1b39511 *f77737bda6c2164a65bd9b31e929cd0e2effeeb539fc7ed38188fbe7cc99434a4a0aefbefb2e1f *7ef8212e972b68ffa04183b8fefaeb8304aae5ca2bafe4f9e79fa7a2a282d8d858e6cd9b1736de *b5d75ecb9ffef427cacbcb898d8de59e7bee091b6fead4a9fceb5fffa2bcbc9cb8b83866cd9a05 *1034fb39406a6a2af7df7f3f8f3cf20863c68c01e07ff71e8f789e91f8fd9c69cc7a632df59e1e *6f9da3bbc2d61c123020293ea85bb4c1ebe367b32ee3f3a2f3ec3e5516369dc964e2965b6ee196 *5b6ec16eb7f3c1071ff0eebbeff2e9a79f0270d55557b16cd9b288c78d8d8de5bffeebbf5a2c9f *d96ce6e1871f6e319ec160085b415466529c3973268f3cf208b7de7aabba70604b245963f8c98d *13b97c703f75da7d80e3e5358ccf4ce5977957b020a49522cae83d3d6ca1dc30328b3fdd7b3d49 *b116926263381c684e3b74ae8a446b0cf75e3132a278b5f4e9d387871f7e98871f7e98e2e26256 *ac58415d5dfb2735e9489e78e209962f5f4e6666669bd24912fcdf776ee61ffb8bf8d3d6433c7b *cb15fc76fd5ef69faea0dee3252f279bbfb5c3627715bdb6c20660351bf965de64ae787935150e *178bef98c2be9272feb2c33f00e5b31f7d9d67fed1f6f91d060d1ac4d34f3fddd1c56d37b7dd76 *5bbbd20d4a4964f3f1b31c3e5fc5be9272967cb69f6b2e19c01fb6f8eb09cffc6307db0acfb790 *4bb7d3bb261d5118d9dfc6aa2f8ef1e894318cc948c168806f4c6c6ccf7df09dfff486da76bbc9 *b225b0edc4592664a591126f65647f1b06a9d179f84b948f32eb75938e6849b4c670f06c6560f2 *37008992ea3a2c26ffa914b673d698de82d7e76b3207c359bb832c5bef9ba3ad474c3aa225dc44 *7b314603a33ab0e3a227b3238c4b3069703fd2937a94787b6785ada8a216af2c88311a30190cc8 *3ec1e8f494764f05d5db707abcb83c3239035228aab05355ef2625ce8abd87cc5dd12b87440e49 *4904e044790df13126ee9878093fb97122c7cbabb1c55af0b4736292de802d36869fcfba0c80f7 *761ee5aecb86618bb5f0fcec2b397abe9a6a678ffb5caaf754d8ae1f91c95333fd37e78f5bbee4 *67b32ee7b7ebf7f2e5994a86a725b3ff4cef198cdd5624e04ff7ddc0a503fb31ff86095c3d349d *4983fb31c016cf27878bf9e1f5b9ac6fe540a668a02d15b6a8771b628c06de9e3b9d5395757cf9 *8cbfd72bce62e6f7f75c4795d3cdb26d87d855dc729b6e6fc56890e81b6fa5cae126dee2efc4f8 *f7c16286a5d9385a5acd4fff6f1b0f5f3da69b4bd939447d0f5b83ec63f5175f919114cf7d7f09 *1e8c53eb6ec0eef2b06046fba683ea0d787d8279ffb39eef4d1bcf2f2f609ad328a3f754d89e59 *bb836f4f19cbe99ef93161a773b4ac8667ffb9a3bb8bd121f4ba0a9b2c046f6d0e3fd8263ec6c4 *79bb038bd98839cc48ac8b85488395eec81dca94a119bc78fb5564a7247471a9da4defa9b035c7 *cd6307f3ce835f23fffbb79196d0bbbf596b0f9f1c2ee1d24169b8bd324595cd8fdb888fe9fe17 *71afaab0b5c4ea3dc7f9e45031eb8f9670c6defc9706193daba1be43b0bb1b7875fd5ef20f9d6a *365e729c855bc70fe9a252750c515f616b0dcfacddc1ded3cdb738cc1a3388e9c3db3642abb7f0 *dbf5fb5a8cb374ee744667a47441695a45efa8b0195bb178ddce93a5cdc6b5980cfc6af695c45b *633ab46cdd4d477dfafecd899730734cabeb499d4aaf1912698bb3f0ab5baf6c77fab404ffcd79 *e58e6bb86c70effb0c3edca7ef6de1f9bcc9c4c79878e6a6492446d783ddf3bf61abae77f3743b *170d04ffcdb932bb3f775e3aac034bd5bb78e3eea98ccf4aedee62a8f4da6fd8da8ad120f19b6f *5e43bf3e71dd5d94a864447f5bd09cbe3d8da8aeb0f54bb0f2c805746d5e3b7c00570e49efc012 *4517570d49e7c8c26fb53b7da2c54c4a7c54362ff6fc0adb4d39d9dc9493ddddc5885ad293e27b *da38dd16e9753d6c3a171d17470f9b4eefa2577fc3a6a3a3d0e3be61d3898cdbedc6ed0efe6a62 *f9f2e5dd53980ba3f7cd12a9131e210413264cc06ab562b55a9124099fcf87cfe7e3a1871ec2e7 *eb399f48f5f80adbb469d39024096fc8d2a4c9c9c94c9830a19b4a15bdecdebd9b7dfbf6e1f3f9 *104250585888c160406a45d77a94d2732b6c353535007cf4d1476a58515111d5d5d5eabeb6b27c *f972860ce959a3a65acbd9b36701703a9d0061a7520578f6d96703f35d48cc9e3d1b80c58b17b3 *78f162354e5151916a20f6efdfafc6ef2af7a32d15b6500c8005e803f40786011381eb813bad56 *6b9de8027273730520b2b3b3d5b0bcbc3c919d9dad86d9ed7661b3d904fea754141414a871172e *5ca88697949488caca4af5b712a6e409089bcd265c2e97104288d2d2523175ea54b168d1220108 *5996bbe2942f089fcf27b2b3b30520162e5c1814ae3d87828202e1f3f984c7e351af436161a100 *84cfe71342f8affd92254b84c3e11080b0dbed4296650188cacaca4e3f97929292e3c0b78099c0 *15c0482013b001562078faccd68af7a5975efa5da7975e08919d9d2d56ae5cd9e4e2eddcb953d8 *6c362184100e874315e1a2458b82c201e1703884cfe7536fdcfcf9f305203c1e8f1042883973e6 *883973e608218458b66c99c8cdcd552e9e00c4bc79f35441f714f2f3f3d507d4e3f13411af1042 *ac59b3467db80b0b0b851042bdb68aa83d1e8f58b3668d00d4eb048823478e74fa3904c47b6f6b *c41b953e6f75753553a64c2137379777df7d97ad5bb73267ce1c060f1e4c75b57f01edb8b83862 *626258bc78317bf6ecc166b301fe294801323333d9b2658b3a49f3d0a143b1d96c984cfe4ec5f7 *df7f9f6ddbb6f1d8638ff1dbdffe967dfb82c7bcbefdf6db582c96ae3ae50e61c68c19c8b27f31 *95eddb83271bf4f97c4892c4eeddbb8326bd0658b66c198f3efa28afbefa2a797979ea3502bf5b *f1c20b2f505252c2b0619d3fc0a92d15b650a2c2f2da6c365152522276eedca95a92d2d252515a *5a2a002184104b962c51ad417e7ebe6a791514cbad5857ad7516c26f6d962c59224a4b4b55d722 *f0e437c92bda2929291176bb5d082184cbe552af8bd6f22a6f1487c3a1be9d144baaa451aeb310 *8d6fb09d3b770a21fc2e88e25a7426a9a9a91e3ac36de82a9fd766b305bdd214c12a374008bf6b *114e981e8f4715a222702184fa1a549833678ec8cece566f88e222283e604f42394f659b376f9e *10a2a9cfabf8c5369b4d4c9d3a35689f52a7d05250501094af724f3a934ef379bb43bc050505aa *6fabb58a9b366d522faae2932996547bc1958a9c6249d054d8941b88a672d8132daf107ea1ba5c *ae162b98dafdadad8c7665a5b52de20d6d083400e680806381c4c0960cf47de9a597a63df5d453 *51f30d9b084caea734ca6b172109fdad4da36dff541af0c3c5d5e97a4e9f3e7d222b2b6b215006 *540135401de0005c80079021ca8744b6845684a1e28b24c6d0867b5db4d1458fef61d3b9e8e9b9 *3d6c3a172ffa90c88b88d3a74fab5db89224316ddab42623cb7a2b513f2472f9f2e5413767c182 *055d5d841e81dd6ea7b2b2928d1b37f2f39fffbcbb8b73a1f48e2191ca62d1b22c535050c02baf *bcc2fefdfbbbb954d147424202c9c9c9cc9933879d3b77525656c6b469d358bc78b1da1a535f5f *cf9021435443a05c4765008e72ad156bee76bb83c20166cf9ecdae5dbb3aed3c7a5d85cd66b361 *30181837cebf9af9a1438758b56a158b172f66f6ecd92427fb1753397af4a87a63860c19a25ef4 *c58b17070da55cb56a1573e7cee5e8d1a34123cd8410242727b7b8ba7a34e2743ad9bf7f3fefbf *ff3ecf3cf30c0d0d0d6cdcb891afbefa0a97cb85c160203e3e9e071e780021040505058c1f3f9e *dada5ac68d1bc7bc79f3888f8fc7ed76939595c5ce9d3bb1582c646767b368d122006a6b6bf9c7 *3ffec1a5975edad9a7d3ae0546a2a293428bd27b24cbb258b66c993a5847095fb3668df0783c4d *ba339551610a047a9e944e0ca5411f4d3769682f5c4f40e97554b6fcfcfca07005bbddde64908e *cd66132b57ae547f2b3d70f3e7cf57c3942e7a218498376f9edaabd989e7d3ea4e8a1ed3ce6b34 *1ac9cecea6b0b090c4c4441c0e07f3e6cd53c7a52a637f2fbffc7200162c58c0934f3e49555515 *c9c9c9783c1ecc66334b972e55ad0ac0bc79f3b8ebaebbd8bb772fb7de7a2b9b366dea9e13bc40 *64596ed266ad0c56029a0cec57f66bdf32caa0a7fefdfbab61caf57cf3cd3759ba74299595d1b3 *627cd457d8c07f9145e00b01ed40eb8c8c0cf57f65207628ca4d53465b817f057585975e7a897d *fbf6a983adafb9e69a0e2c79f7e1f178543102aa6bf5ce3bef007ebfb6a8a8485d2676eedcb98c *1f3f9ed2d2529e7cf2c920bf76d1a2453cfef8e3646767abf97432bda3c2d65a9495d38b8a8a00 *58bd7a35006969690058ad56d6ac59c39a356b18326488da9c949c9c4c7676360f3df490eadbf5 *44427b0ecd667390e505282d2de5a1871e429224b2b2b258b3660dc9c9c96cdebc99f7df7f9f4f *3ffd94b4b434f2f3f3993469926a957ff0831f00f0eebbef76fa7974d62c914292a46e59a92ff4 *2600c4c7c7e37034ae51919898487e7e7e5005aca4c4bf84d3638f3d465e5e9eea62cc993307ab *d5aa8e8d58bd7a3593264de2f1c7a366d846abc9cccc54cf2334bcaaaa2a282c2d2d0d21449371 *1fd75c734d501e3366cc08faad7c66d4856fa5567d311a69604e0c100724e0afbc25017dad56eb *72a7d319f50b1b441a941309c59fdbbb776f2796aae73264c8101e78e0019e7df6d94e3f566060 *ce7f0195814d1998534f0b0373945aabf67f19ff93d063be9f6e8b7085103cfef8e31416167662 *897a36c78f1fefb2014c068341d19c9746cd857de3472a91225c45b432e07df1c51797766c51bb *1f4992906539e217b73a5d3bf22ee09aca341a4d9960a3da1837cc6fc56db0d2744c6f82d96c4e *f6783c8b01c96432bd2d84b002165996bf054846a371b592992ccb7702e8617a5848982ccbf2dd *002693e96dfc2e81c3ebf53e855fa40fd23896b716ff585e277e9741751bc289d7845fbc16fc7e *6f1c7ef1f6c1ef032769feb706e2298dc752983c7574b4281654c62f44377e61d605363b7eb156 *e117aee2efba039bea4e846b6d0875179483340412bb6874379427c11d088bf87d918e8e06455f *8aae9c814da99429565611aaa2c920228957eb343704e299f15b558366bf62a14d81add7b41beb *742a8a78bdf845eac26f001d340ab88146017b096e4800c2b73668335704ec0ec45584edc1ef2a *c4d0286c03bacba0d33ab40652fb56575c08178dcd628af555f4a8d29ce5559e0c459052e0b74c *a3a98fc1ef2a28565717af4e6b087dbb2b16581171038dd658a9a035696d68c9e7f584ecd38a57 *b1b68a701597412b60e57fa187e961043779f908b6a84afd497155b52d0b4abca026b3962c2f81 *cc9470a50267c26f710d9abfbad5d5690b8a08b56e8197604bac586645c041441adba00855fb5b *eb036b450b91c51b0d4fba1e167d61a1bdb85a7d85765028ff37697168ce5a2ac254da6f95df26 *cd7ead6875cbabd3164205ac1568b8ff9bf4b2b546705a5fd640b090db928f8e4e28a19530ed58 *069f667fd871356d115d240babb7edea5c28e1c419763c838e8e8e8e8e8e8e4e3bf8ff3bc34586 *b8b281340000000049454e44ae426082 newhex * rmfile ./images/ClassicNode.png binary ./images/ClassicRectangle.png oldhex *89504e470d0a1a0a0000000d4948445200000268000001f4080600000089a3d1ec0000020f6943 *43504943432050726f66696c650000789cad924d6b135114869f494c0d28512452dccd428a8b54 *426369dd486ada4a4c1b631a6912d032999926a3f9b8ccdca42a6e04b72288888b5a043722b8d0 *9512c42cba70a148118affc0bd1fdd888e8b71260b296e3c70e1392fe7bcf79ec385f0a6264433 *04b4dad22e9e39ad962b5575ef36514689b087494d77c44ca1b0c0aeb1b38d02f0715c13a2f9b4 *73f3887c7eebe1f7fbafdceed15a7ff73e006276b952052501c4eb1ea78178cde312105f934282 *d200e27a433340b90124ec523103ca132056f7f82510ab79fc1688f5f4ba04e513906c1b561b42 *5160da301d1d426960c570f416841e01ef5aad8e01e126704c17b684f03d60bc5ca9aade937b9f *e1d40684ee0cb54a0d9e9d84c353436dec36c4a7a0af0db56f7751006574c3594d4d00a0ec5b81 *c845d7fd3a0d231fe0d709d7fdf1c2757f3e80f00ebcd9d2bb76efcfbe14e53dfc2bf766f672d8 *923eedc6de5e0048c2e3012c03b901ac0f606c0d0ef5a1908612845229ff783b0420622d6a3eff *b76835bbbee70160bf25b325200a6caedaf3459fdbb5fc399f4d676e29a8b1e6b33e0b59087aaf *374acb3e5fd6ce16029f667ec167c39c9df3f94a2717dc65b62f04fe4e6f29a831b4d9dcd03f93 *f7198b453474ef5f018c1c84f5f300afbf5cfa6b66695e9500998eb8665bf586546784689a6aa6 *d3125d69da0935dbd68f27d489647212e03734c1a699a18dc5900000200049444154789ceddd77 *941c779deffd4fe7c979a45118e52c59d15674920336c60663e21a160c6c00c3dd6559d8bd67ef *c3bdf0900ccfee9e3d5c60edc584b30b0bd880c1368e7290644b9615ad1c66469a9c73ecfcfcd1 *5d3dd53ddd33235baeed5adeaf73facca8a7bac2eff7abaa6f7dabbe2d09000000000000000000 *000000008037c7f15ff459000080ffeea26ff683d309b21c29d399ff4d90060000909e39408ba4 *fc2df5df49dc93fccd99f2bbd3f4bb11a439533e932e607bd3d1e37fb1c982cfd46d9a2a50b56b *1b000080b726a2581c108dff3ead402d5380660ec68c80cc555454d4e672b95ccdcdcd4f495234 *1a75cc9933e79d9274f1e2c5672529128968f1e2c5b799df73381c5ab060c16d92d4d0d0f08cf1 *5e7575f5ed92d4dcdcfc8cb1e0b973e7de2e494d4d4d97f55e241249cccf588624cd9b37ef7649 *6a6c6c7c46929c4ee7949f8d44228e6834aa850b17de2649b5b5b5cf1a9f35debb74e9d2b3f136 *98309da4a43670381c723a9d51f3ba389dceb7b41d9212d3a57bcff86c241271186d7fe9d2a567 *9d4e67d43cbf2bd1f66fe77be63648ddb62b3186a2d168a2fda2d168a25dac5c86a449df33f7af *f19e791973e6cc494c178d4627cccfe17024dacfe1706455ff5ec9f72ea79d8d7df04aed6fe9de *6b6e6e7e26128924bd77b9c7a66c6dbfe9ee0b99f65ff39834da20d33191f778cf6eef3537373f *6dbc67c448adadad4f391c8ee8c30f3ffc579ffdec67fb351e9445158bb3260469e9323fe6ec98 *cbf4d31d0c06f7ba5cae35c684914844d16834f1d3782566e470c8d811cd3fcd2ff3dfde0a63b9 *a9eb90693dd27dde78452291a46d4a5defc9966dfc34a6733a9d8a076869db62aaed302f3fddb6 *a45b76ba9fa96d71a5dbffed3255bfa6fb79a597619eef9b5946a63e35cf2f5d5f9a979f69ec65 *5a7ff318b44b5f5f09a96d9c6eff35b7c1e5ec6fa9cb499dbff967a6692fb76fad96da76998e7f *d35d5ff3f6661a9b862bdd06d9d2a68099cbe56a8f4422cb24852585349e5133b26b09e9326846 *806604679ef8749e4824e274b95c92c683b37038ac70389c14d448130f3ee61dd20856deae13ec *644149a6e5199f33b6c7d8a674c196f1ef74cb352fdb98dee572c9e57225b63d75dd331dc4ccaf *4ced996edac90eb2a901e3740e90a9ed39994c07f14cf3986cde93b5ef74fa34d3723205455305 *e5d319a7e6f1627ecf1cfc4f16f4a7db4e739f5d4e1b5dce36640a7e2f57baed4f673a17196f66 *1d532f1a0d4ea73369cc1b9f354f6f64bbcc9f499dfe722f0433ed9bc6b4d3e9db2b11684cb64f *661a4399c661a63649b7eee9e66f5ea7b71aa8a58eb7d4f5224843167248f24a0ac67f0fc6df0f *c7ff9dd84926bbc599c89c2916a4f9e6cc99b3b4a3a323299809854289806674d4afc6b63ee5e5 *7835b3a2502e973371e0098522f20742f27addcacbf54d2b489bea809c7a10185faf88da3afbe5 *743a555559346139990e32914844a15028f16a68e9514b7bbf5c2ea716ce2d5779697e62bd03c1 *90c6c68272bb9dcaf179140c86343c1a483a00e7e57ae5f37a12019adbed4ebb8de9022ae33532 *ea57201856419e4f6eb76bd220315346331a8d6a6824a081a131cdad2a95c7e34e3ae0a66bdb54 *a97d3159109c292b907a4298cedf32f5ebcc8ac28c170099da38d3ba9a4fd07e7f50236301793d *2ee5f83c19339f53050fe6e98df987c36145a3510583218df983f278c6f705432412d1f0c89842 *a1b0f272bd72b95c89e0c2bc2ea96d66eef34020a491b1807c5eb77273bc19f7b54c7d30dd20ce *982653909d6939a96d6fcc3b5d8099691dd3ada7b91f8dd7f068400e49458579496d690e98cd17 *9863fea042a1b07272bcf2a6d94f260b60321d57ccfd333c32a67038a2fc3cdfb4fa365d7b4e27 *504d6da7d4f99bdb2b5360168944d43f382aa7c3a1a2c2dc492feea6b3ff4eb51f66da96e9c874 *fc214843b6b9fffefbdff5bdef7dcf677a2b62fa99b403a50668e6db9b4ec5a23c8fa49cf84b52 *f20927140a6964744cfff9f8613dbdfb6c6207f47a5c7ad7ce557affedebe4743af4f2811a3df4 *8bfdbae38695fae407b7bda99d73aa13bef1737068549ffe7f7ea9a2821cfde43b1f491b9ca51e *188ded0987c3eaeb1fd6bffce4651d3fd79a5896d3e9d0cead8b75df3dd7c8e572e9993d67f5ef *8f1dd29675f3f4d98f6ed7854b9dfadaf75f485abf1c9f5b1b56cdd14ddb966afdaaea09db690e *a88cf54f3de97efbc1e775ec4cb3bef6377768e592aa8c2700e3f5e2fef3ea1b18d12ddb97c9e7 *75291a8deaa7bf3da817f6d548921efed6875454903be1a4309d0039dd55b1b96f52db35f5c496 *9aa1cad48799966beed71f7ffbde097d9a2980ca94b930d6cf7cc1f1e2beb3fafecff6ea8e1b57 *e9931fd83aede03e753b52976f0e028e9c6ad4b71f7a51575f55ad7fb8ffb6a4f50887c3fabb07 *7ea7c6d63e7defffdca3caf2c2c489dcc8c2a6db2e73dbbeb0efbc1efccf5727ddd7d2ad63a660 *2353bfa4eba3d43161fc34b7bdb9fd0da98155baf9a4ae636a5f9bdbd9f8f967fff317f20742fa *e577ef536e8e4f6eb73bb12ee60b3263fa077ffe8a76bf5ea7cffde9b5ba61cbd2b41744e6f67e *e9b50b1a181cd36dd7af547e9e2fedd833efe77fffedc7d5d436fdbe4dd757e9da39ddf1c0fc37 *733098a9cd53c7d1c8a85f1fffe2cf555a94ab7ffbe68727ddb7d32d3b755b229188ced6b6eb4c *4d9bd62c9fa5a50b664c7a7135d5f920751b8df54a6d4b209bf4f4f4e449ca35bd158dbf9c1a0f *d0a2d2d4b7385d8a05693992f26a6b6beba3d1e8127370160a85f4fdffd8abfd47eb95e3756beb *8679723a9d3a76ba458f3d7742034363baef9eab150e872549e14844814020ed4e98e9aa2cd3c1 *38734626aabb6f5d239fd7ad402090340ff301c638581b0f0b1bdbf5a347f7ebf8b956ad5d5ea5 *8dab66c91f0ceba9dde7f5c2be1a15e479f5de5bd728140ac5b727ac4020a0603096a5ccf1b975 *c3350b1495d4d533a2d78ed5ebf5371af4ad2fdda9c5f367249697eeeaddbc2de6839a24058341 *f9fdfe8c8194f17af285936a6cebd7a6d5b3545a94ab317f50bb0fd42937c7a33fb9739d1cd1b0 *fc7effb403b44ced6dfedd7c8034670b533f9feed9be4c57efe94575f72d6be4f5ba92dac2e857 *731f670a608dbf1beb689cb012017abcbd2319c6696a9061deb6746d62fcdb1c381863251a892a *140a254e28d168ecdfc67cfc8180fc7e7fa24dcd27d8d440c13c7e42a1607c6c66ded7ccdb922e *b84c17d065ea97a9b223e6f7cc2751a39d8cf6318e29e96e03670a80cd7d6dde9f8c9f865030a8 *703c23664c6f2c2f180c9aee04c43e130a8512fb49a67d2d1a8deac9174faab1b55f9bd755cbed *9a780c4bbd851a8dc6e63fe6f7cbeff74edab7a91715a96d9ea99dcdfb98f958677ed4c2dce6e6 *c739cc9f4d8c5349814020d16fe92e6e8c754abdb59cba3dc74e37ead7cf1cd7bd776d5075d5c4 *bb1be66d32bf671e43e9c682799f36a4cb1a02ffd5868686f224f994fcdc99717b73ca5b9cc6ad *4de3f6a637feca8d46a30ef389211c0eebc8c946ed3f5aaffc5cafbef3f777283f37764ba5e7e6 *11fded379fd09ed76b75cfadab13073ef3896fcfc13aed7ebd4e3d7d23aa9e55a235cbaaf48e6b *97c9e9746a6434a0bd872eeac0b106f50d8e6ad59299ba61f3622d5f344392d4dcd6a7970fd4ea *e0894615e6fbb46ac94cdd71e34a15e6fb343616d0d9da76e5e57a1327f2a6b67e3dfaf47135b6 *f569feec326d5c3357efb86e95727c5e49c901c4f98b9d92a4bb762ed79c998592a499e5f9da77 *a441d14844c16070fc841889260ef0929497e3d1bb6e58923838fcdf9f0574b6ae4b27cfb56861 *7545e200138944f4f26be7b5ebd5f3ba79fb12d5d677e9d899169595e4e9c3ef5aa7ea5925b1e9 *a2e3015a201050737bbf1e79fa849adbfa555c98a3a50b2a74fb75cb545c98a3fff8fd1175f50e *4b927ef2eb43ba76d33ced3d54af50382297cba1a3a79ab566e90c1517e66affb106ed7ab546ad *9d832a2fc9d3d6f5f3f4ee9b57cbe974e8f5371ab46b5f8d6ebd76a9ea1a7a74a1be4b5ffeec2d *fae96f0eaab5634077dcb8422fecaf517bd7a036afadd62d3b96ea67bf3faabac61e2d9c5ba6bf *f893ed2a2d2e90dbed4e3a79beb8ff9c76bd7256d75dbd483bb72d9524fdfb630755d7d8ad8fdd *7db5aa6715aba9ad4fbb5fafd5a1134de9fbb52ed6af814040474fb7e8f9572f68c7c6f96a6aeb *d7b1b3adaaae2ad64ddb96eaaae5b3125992c79e3ba1d78e3548923e7ecf263dbbf7bc02c188be *f2d7ef4c9cb0c64feaf10b89703811dcb7740ce8174f1cd3c5a61e79dc2e2d5d58a98fbf77934a *8bf3254923a301fdea0fc774baa65da150584b1654e8baab176ad5929992a481a131fdc7ef0eab *a6be5bb366146afd8a59b136894612172ec64582711b54926aeb3bf5935f1f5447cfb0562e9ea1 *3fbd7b93727362e3b5b1b557bf78e2a89ae2e360c9fcf2c4380885c253ee6bab97ce4cec6bbf78 *f298ea9b7b74e7ce557ae940ad1a5bfbb46ec52cbdf38695aa2c2b90248df983fad51f8ee9e4f9 *36f9bc6ead5f395bd76f5ea4cab20245a3519d38d7aadf3d7f526d5d839a3da348b75fbf5c9bd6 *544b925e3fdea85daf9ed76dd7af505d43b72e5cead2b7feee3d929494c9aa6be8d0cf7e77488d *ad7d2a2eccd1b205157ae78d2b545298ab63675af4ecde73dab169811a5bfb75ec4ccb84be0e87 *c37a7cd729ed3b7a496e9753efba7179e258670422e6802f140ae9d8e9463dfaf431f5f48d6ac3 *aa5989b60b85420a04020a04c37af499133a5bdba15028a2c5f3cbb57dc33cad5854a99f3f7e4c *5d3db1fdede15fbda6bb6f5dad25f32b92da7a6e55b1562f9da99bb62e4a0a666aeb3bf593df1c *5467cfc8947dbb6c61a5eeb861854a8bf32449474e3569df917a9dbbd8a18573cbb47ed51cddb2 *7d59e23876e25c8b1e7bfea4da3a07356766b1eeb871a5b6ac5f288fc793687363fb43a1905ed8 *774ebb5e3daf81a131ad5a32435bd6cdd3aa25331508c41f8d8946150804d43738a67ffbe50195 *95e4eb7f7cec3a391c0e1d3ed9a8275e3ca5abd7ccd5edd7afd0f0885f7b0ed6eac0b146f50d8e *6ae5e219bafe9a455abaa042fb8e5cd2be23172549bb5faf55381cd66dd72d53dfc0a87ef5d471 *5db8d4a5fc3cafd6af9cad7bde71955c2e67ec58b4bf46efd8b14cb58dddaab9d4a52f7fee568d *8c06b4e7609d0ebcd1a0be8151ad5e5aa59bb72fd79ae57312019bf90211c8164f3ef9e4cf25dd *ae586016d278bc158ebf12d2dde2347e1a819a47b1682f371c0ebba4e4abf7f3173b24491b57cf *565e8e277100ac282dd08f1ff8a02291a8a2d1f1ab2ae3607cea42bb7ef4e841b95c0ecd9f5da2 *f3173bf5c6d956391d515d7fcd42fde8d1837afd789396cc2f5779499ef61cacd36bc7eaf5ed2f *dd21b7cba1fff77bcfcb1f0869edf22a35b6f5ebc997cea8a1a5579fbfef5af9fd019dadeb5461 *7eec44dedb3faaaffedf5d0a04c32a2dcad591534d3a72aa499ddd43fac407b62736ded8aeaa8a *4275f60ceba15f1ed4e67573b46a71a516ce2dd6b2051b122702e3c43a7e251a0fd8349ecd703a *9d1a1a8e9de4dd6e57d295642814527bd780ced4b6abbeb947fe60488a4aad9d83fafa0f5ed437 *fee65615e67b158dc4da2d140a696cccaf071e7a59432301cd9959a4fec1313dbbf7bcea9b7bf4 *f98f6f57ffc0a842f1f518181ed3983fa8e1d140bcdda31a181e533018d24bafd5e8678fbf2149 *9a595ea0968e01fdf6b993eaed1fd19fdcb9561ddd833a5bd7a1eebe6175f60cabac3857814040 *b50dddbad4dcab8bcd3d8a44a2f207c2faddaed37ae5f0250d8d0434e60fa9a37b485e8f4b7f75 *df8d4957c2914844ed9d033a75a14d4be6972b10883daf77a9a95b676adad53730ac825ca7befe *fd5df20742ba6a79959a26e9d76030a8ae9e419da9ed507d73af5c2e87c291a80e9e18d4d1332d *faf6176f5769719e1e7fe1b47eb7ebb42429d7e7d63ffd684f6c4cc6dbd4e8a7f1007d7c9c0683 *41f50ec4c68e3f105271814fa3fea05e7fa341750d5dfae6176e97c7e3d2bf3f76507b0e5e5261 *be4fe525b97af5f0251d38d6a007bef80e15e6fbf4c0432faba9ad5f0e472c583b5bdb191f3bb1 *c0c19cc135677d7ef8c841b95cce44bbf6f48de80b9fbc4ea150585ffffe2ed33818d573af5c50 *4373affefae3db126333128965eb4ed77424ed6be752f6b5ba862e9dbbd8a54b4dbd2ac8f7aab3 *6758cfee1d54434b9fbef467d74b92fee9477b74baa643b93eb7e470e8b1e74f6adfd14bfadae7 *dfa19afa2e7de7877b2449b32a0b75b6ae53e72e76eab31fd9aaf52b67aba36b40676a3bd4dd3b *ac8e9e615594e62b128924c647ecd9bf80bef2dd673534ec4f8ced67f69ed7a5e65e7de1133bd4 *d135a0d3351dbad434bdbef6795d7ae89707154d09d0cc19d38b8d5d7ae0c117148e44e5f3baf4 *fcab3572bb9c89e983c1a07ef6fb637ae5707da26ff71da9d7eb6f34ea6b7f7d93fa07c7f7b7fe *a1518d8ef975ec7453f271ed52978e9f6b9314d18e0dd589e3e0c38f1e9a66df8ee9993de754df *d4a32f7cf25a1d3dd3a21ffcfc80ca8a73b5a8ba4ca76b3a74f4748b9c0e69c7c6f93a5bd791d4 *17676a3b74b6ae535ff8a4b46de3e2c478378ec3cfee39ad871f392087c3a1e2c21cbd7c20165c *fec3a777aaaaa2207e4c8b5d208e8cf875a6b643332b0a12817f57cfa0ced4b46b566581fc7ebf *1e7ee4b5f871bb4ce52579b18bec371af4adbfbd4dc3237e8d8ec582bed1b1a08686c734343ca2 *6ffceb4beaee1b555949ae3a7b86f5c48b67d4dd3bacfbeed9183b16c5c74e67cfb0ca4af2140c *06f5a3470fe8c01b8d5a1a3f3fec7ebd56fb8fd6ebfb5ffd802acb8b92327cd29529b400ae20e3 *f1318f62450246c140d2409dce2dce4491c0f2e5cbe7b6b5b525051aad9d0392a4f292bcb4b71f *a48822114722b56f04278dad7d5a30a74477deb84ccb17966bd7fe3afdfe8573aa6de8d6d67573 *74ea42bb24e983b7afd2ec1985da73a85e0d2dfdeaea19d4f06840432301cd9b5dac8fdc7595dc *6ea77ef1e449b95c0e050281c45570341a3b093ffbca790582615dbb699e3efede4dbad8d4a76f *3ef892f61eaad37defdf362125ff2777add7c57f7d515d7d237a6af7053db5fb82f2723cdab1b1 *5a376f5ba4c27cdf84b4be71a53e321ad463bbcec9e170a8bea54f4dedb1f659b6b03231ffd4db *5285053e7ded5337696824a01f3e7a584d6d037af940adde79fdd2c472c2e1b01a5b7b55519aa7 *6debe7eaae9dcbd4d33faaaf7c6fb72e35f729180cea93efdba06f3eb4572d1d83faf30f6c5469 *51ae96cc2bd597bffbb2ca8a73f5f98f6d95243df1e25949d227eed9a06bae9aa386963e3df0c3 *57b4fbe045ddb27da142e158e0323034a63ffbc0d55a545d9694d9b96dc712eddcb2403f7dec98 *8e9e69535e8e475ffad40ed535f6eaa15f1dd2b9ba0e8542a1a42bd958f06164a7c6b390461b84 *8241d5d477c5fa7556b13e72e71a793cae49fbd5b81d5998efd53f7cfa7a8542517de7e1bd6aef *1ed6a5a66ee5fa5c7aeed50b92a4fbefbd462b1655e8e93d357a7acf85d849de74c236fad2dcaf *a150484fbd7c56fe40489b56cfd6c7dfbb5ec16044dffdd96baa6feed38baf5dd0ce2d8bd4db3f *aa25f3cbf4990f5f2d8fdba97ffcf17e35b4f6abaea14b522c7b5b5298a34f7f7893ca4b72f56f *8f1cd185fa1e49e3173ae6763286e3759be6e9ee5b56a8a56348fff8e37d3a71be4df5cddd0a85 *c2aa28cdd3f60dd5ba6be73275f50eebabdfdfa34b2d7db15b8489002d1a1f3729fbdabe5afdfe *c5f3897d2d125fe0f68dd57adf3b56ebc2a56efdf34ff7a9aeb15bc16050b50d3d3a5dd3a1d2a2 *1c7df5af6e96e4d0371e7c59ed5d43aab9d4a1c75f888da78fde759536af9da3a367daf493df1e *d3b37bcf6bf592ca44bff70f8de9fe8f6cd38ac5b392da3c1c0eabbea54733caf275edc679ba6b *e73275f60cc5c7766facefe3db5498efd5fffaf40d0a8622497d9de375eab957627dfde13bd668 *db86b97af1b58bfafd0be792fad6186fe170584fbe784ae148541b56ced2bd77ae5177df88fef9 *a7af49e1f10bc9be81512d9957a6cffc89d1b7fbd4d03aa086965eddf7de757ae087afa8a56348 *7ff9a1ab55569ca717f6d726da7ad98232edda57a7c75f3aaf8b8d3ddabca62a31be766cacd67b *6f59a1d6cee149fbb6bb6f445ff9de6e5d8cb7c3f1b3b1e762b7ae9bab775ebf440dad03da73a8 *5e63637ef9fd7e3d1e0f503ffaeeabb465ed5c1d3bdbae1ffdfa889e7ce9b4ae593b3f29831f0e *87f59b678f4b923e7fdf76ad5c54a9479e3aa15dfb6bf5faf146dd79e372a39362b783e3c78568 *3ca3e6703812173991702c5b6b1cb73f70db2acd9959a4dd07ebd5d0daafae9e21edd858adfec1 *513df1d239ddb87981766e59a0570ed7abbb6f546b9656ea53efdfa04020acfff3bdddda7fac41 *77ee5c9ab8d8308e458be7952b140ae9e4f93649d287ee58add9338ab4e760bd1adb06d4d93da0 *f2d20245221119df38006493ad5bb7feedbe7dfb8c3b93634afef2ff2493150998833423d29b10 *cc78dcb1135c30347ee59fee1904f3efd168543bb72cd082d9453a79a1432fbe56a79a86ded87c *82b1b4fbe2ea521d3fdfa16f3eb4575515f95abb7ca6eebe6545ec5697df278fdba986967efddd *fff7bc16cc29d1b6f573b579eddcd8013f329e258c44226a6aeb9724ad5d3e53d168544be697eb *87df78bf3c1e6fdae766aa6795ea812fdeaec3271b75aaa643e72f76a96fd0afe7f7d5a9b6b157 *5fb86f625067f007c2da7db03ef1efea59c5ba79db322d9e3f63c2f33246b666d3ea59f2795df2 *7a7274f5ea596a6a1b506be760ec641d0ffca28a6a5665813e79cf3a1d3fdfae9f3e764c179bfb *24c52a648d937ceab6a43e03d4db3faafe21bfbc1e97d6af98a94824a239330b357b46a15a3a06 *55dfdc9bb8037ed5b299bae6aa3989e0c1b06251855c2ea716cc29d1d1336d5ab6a04cf9b91ecd *9b5d2c490a04c3933e5b669cfccccfab842311555715c6fab5b55f7fff8fbbb4604eb1b6adaf4e *f4ab39bb1489446444324b1794cbe376c9e39666cd28547bf7b046c682eaea1dd2c8685085f95e *ad58582e45a3dab161ae9ede73c1d407910c57d7b1f5bdd8141b971b5755c9e990727c2ead5d36 *53f5cd7daa6becd1f557cfd727dfb75ea72e74e8b7cf9f5173fb801a5afbe3ed10527bf770bccd *ca35ab329691b876d3bc788036de2fe96c5d3f5792347b4681e6cf2e566d63af9adbfab57e6595 *3ef5bef53a7ebe433ff9ed515d6c1a1f07e170381170196d96715f0b8593da71f592d833928be7 *954a8a8de57038ac86d6d8fc972fac90d713bb25fce5cfdc18bf75aec445c8a99a0e9dbbd8a570 *7c5cd7d4f72405f6eb56ccd2b60d0be4f57ac75b393e2eaaab8a75ff47b6ead08946fdf8374754 *d7d89bb44dd178df2f5b502eb7db29b7db99d2d7b19fb9396e6d59375b8a4675e335f3f5f88be7 *64de55cd63b1a125b68c1d1bab95e3736b566581562c2ad7f1731d8ac4dbee13f7acd3e99a4e53 *df0e24b79d693c46a351ddb8798116cc2ecedcd6715bd6cebeecbe0d85425a34b744af1c6ed053 *7b2e68cfa17a2d5f58ae9bb62cd0bcd9250a87c3e37d71a143e72e76278e31e72f7626c6bbb13f *f70f8eaab77f545e8f4bab16c7fafe7db7add6bb6f5e2197d399c80e26dacdb4fee359daf8a32b *d1d8fa2d9e57aae3e73af4ad7f7b2571dc7eef2d2b545490131f07e3c7b36834aae6f8fa0e0efb *f5f3274e48927c1e97c6fc215db8d49d183b6b975769cbbaea4480b9747eb98e9d6dd3d7ff758f *aa2a0ab47e65953e78c755aa282b4e5b8c04648b7038ec55ecaee48862319839409b3283262557 *72bae32fcfa953a7da1c0ec75cf3c97f4679ec19ad968e81a4abd46854faed7327140a85f58e6b *978dcf38bef8dd072fe991a74f29d7e7d6f285e5dab072a60e1c6f494cf7c177aed2cc8a7ced3b *daa4b6ae61b575d5e9e5d7ebf5bf3e7d9dca4bf2f4f98f6dd573fb6a75e27c876a1a7a54d3d0a3 *d7de68d2dfdc377ecbd2303c1a4babe7fa3c89f7727c1e79bde3ff4edc6e894655dfdcab6028a8 *adebe7e9ea35b3150e8775fc5cbb1efef551d535f66a60c8f480ba43490ff816e67bf5a9f76f92 *cbe5d2ec9925aaaa2c96d7eb9df03c564cec00929feb49b45d6e8e3b3ecdc4e7273aba87f54f3f *d9af517f508be6966adbba397a7a6f6dd2fa1b120ff4c6af228d6c56201e48e7f8dc89dbae9254 *90176b0b7f603cb8ad887fadc8f8f31cb1f78daf4f71c56f07251e1a9ee47fbc4a3e588e3fef97 *b8351c8dc8e775e9affe74b376edbba813173a54d3d0ab9a86de44bf46951c4c1b2b9497e349b4 *bfd3d4067e7feceadeeb712502318fdb99d88e7407f0f18fc77e090463ed51903ffeac62bea9ad *c2e1b07ef09f0775a1be4795a5795ab6a04cd16854f52db1fdc1187b0579dec47a7b3daec432d2 *151f18ebe0f38e8f19af37f6997024a2b6ae41fdd38fc7c7c1d675b3f5cc2b75e3ed92d2ee93ed *6be63630da31b55d864762b7c97373c6f7178fc725b73b76abcc1f88b5f3c8685072c446c18a85 *e5f1fd69bc2d2bcb0a3216a7b4b4f7eb2bdf7d5e2363412daa4ede26f3fae466e8eb91f8adb382 *5caf5cc6df9d0eb95d4e0543c941b8f1bb71fbbfa860bce2dde81b477cb90ffef270dabe4d6d6b *2370d873a83e635b9ba7f79a0a1626ebdb6debc7f77149dab0b24a9148442f1da85773c7a00e9f *6ad5e153adfac06dab74ddd5f392fac2e108490e87562dae94d3e554381c91c7331ea49afbd568 *6397cb29b73bbe3ef1363576ebc4fa47c78f61c16028f19e247de89d6b34b3fce284e3f697efbf *4115a5f9899919c70ae378130c463438ec972455551668566581f2733dea1f8abd57519a9774db *f2a3ef59afaaca1aed3d54afb6ae213db3b7462f1db8a807bef42e55cf367f8301905dc2e1b047 *e37727cdb1d6941934337326cd781e2df607c778e9f6fa9573f4eb678eebd899165d6cead5a2ea *32399d4eed7ebd4e8fbf705ac505397adf6d57c9e170267d76efa1d843dbf7df7b8de6cd2ad253 *f1ac861c0e8d8e8574f44cbb665614e8eb9fdfa9c6d6013df1d2795da8efd1a193ad5ab1a84217 *9bfb74cbb645fae85d6b75b6ae53fff98793ba50dfa38eee611515e418b392d3e95479499e9adb *07d5d635a4158b676a60c8afefffec65959715e8effff2d6a4e0c6e574ea1b3f7841a3fea0fef7 *676fd2ec19b1acc79a6533e5f3bae40f8413df23666c8f512125c50ebc6b57cc91c7e391dbed96 *c7e391c7e34954ad25576bc6e661645c1c0e87ea1a6357cc1565f949e5e24e8753474eb76a642c *a89bb62cd07b6e5eaed6ce213db52776f03657684992dbe596dbed96db48f33b24b7dbadd06d83 *a70000200049444154991585723a1d1a18f2abab77449565f90a0643892bf559330a351ccfeec4 *0ed66ed3493bde46f179274e94469598e97bded27df7567161acb27830fe5c5e38124964981c0e *a7ea5bfa75a9b95f376f5ba88fdc7595ce5dec4af46b67cf880af37d897e75b95c8913b4118c1a *cb89b5974395e5057248eaee1b5547f7b02acbf274a6b6339151315f658faff3f83875b95caaaa *28546be7906aea7bb5747e85a458664892aa2a0ad4d133a20bf53daa28c9d53ffce5b57238a46f *fddbab893eab2c8d3dd87da9b93fd126c6e78df169fe7e297316b4b6a15715ebf2150e4712fd53 *519aaf23a7e2e360eb42bde7a6656ae918d4d37beb126d61ccc3d88609fbdaee0bf121e1481e63 *f13164e6743a5511df86d6cec1449ffefbef8eaab563501fbb7bbd2a4af3d4da39a49d5b176ad5 *e24a85235135b4f4cbeb75cbe71d0fa85caef12a5f633d8dfde1b5630d1a1e0dead6ed8bf5ee9b *96a9a9ad3fb14dc6f4e6be368f2da7d3a9cad258c14667ef888647832accf7c56efd87c69f074d *bed870a8a2345f9d3dc3aa6becd59c99b18ac2da78c6cbe174aa33a56f9d4e87bef9d02b89758a *550c8eef9f4ea733735b3b92dbbaaea94f332b0a158944a7ec5b631f773a9d3a74b2592363217d *eea3d7c81f086bdfd1463df76a9df61d6bd40d9b1724f5c5ea25331495434d6d83cacbcb91d79b *fcbd7ee5f136eb1f1cd3a83fa4bc1c8f0ebcd1a8970ed469db86f9dabaae3a3e0a62eb6eecbf43 *f1c04e925abb868c49343216d291d3ad9a5951a06ffccd4d6a6c1dd0e32f9ed385fa1e1d3cd1a2 *77ddb85c4ea7d167b1795696c5c656f5ac62dd7be71a391c0e35b70f2a100cab7a5689dabb4792 *dadbe17068607054874eb6a8aaa2500f7cf156d537f7e9f117cfe9fca56ebd7af8923e3c3bb69f *924143363a72e4c837247d5cc98159daec46a667d08c9f49cfa345a351877160340e76cb16cdd4 *9675f374e08d067de787bbb57ee56cb5760eaa317e5be49edbae92c7e34e5cd53a1c4e793c1e95 *16e5a8b57350f52dfdeaee1bd5fea3cdf1bf3b949bebd3e32f9d5728145657efa8e6cf2e49646b *8a0a72d43f18d0af9f3dad8ad23cddb26d91f272bd89cc4351616ee2415fc9218fc7a3cd6bab75 *fc5cbb9e78e99cc6fc119daa69d785fa2ead5a9afcbd62c6c17ffba6857a61df797de3c197b46e *f92c5596e5e9744d87fc81b0562eaa5449515ee244e6743a1341586cfd25afd79b08d08c973933 *915afe7de08d6639e381e9b1b3b1672bb66f5c208fc723673c6070bbdd2a2b891d50634141af5e *d85f979887d71bab9ef5c4af7e5f3a7051376f5f22b7b15e7224d6ebfa6b16eae50375fa977f7f *4d3b36ccd3d1d32d0a86225a545daac5f32a75b129962170b95cf2783ce34156fce0ea76bbe5f5 *7ae572b913d379bd5e79dca1441fa6fb52d0b9552592a4578fd42b1a8daaa76f4403f12b6497cb *a58121bf7ef3dc99b4fd5a589093d836a35f8d80d0195fbed1b6c67bb9395e6d5e3b57078e37e9 *bb3f3ba8b9330b75fe52f2ad45733029c9947d89f5ebcddb97e8e899563dbde7820686fc1a1a09 *e8c8e916b95c0eddb07991727c6eb95c0e8d06c2aa6dea574d7d7722e874b95ddab87aae7ef7c2 *39d534f4e807bf38a4a2029f5e3fde94d44ee64a52f349fc177f38a1fad67ed536f468cc1fd2ac *19855a32bf42ad9db1936267cfb02ed4f76a97691c181703c636b8ddee89fbdab1e6447f7abdde *c4f23c1e8fbcdee4dbfe1e8f47eb57cd51ce1f4ee86c5d971e79fa64a20fcb4bf235a7aa44dbd6 *cfd36f9f3fadc75f3cafde01bf4e9c6fd7e99a4eddb879a1562c9e959469357fdd83f19ed3e954 *5949ec44ddde3dacf3f5bd7afed59aa4b19d983e4d5fbb5d2e9514e7ebaa653375e27cbbfef1c7 *fbb461d56ced3fda909887393034dcb079b1ced476e8d7cf9d565bd7b0ea1a7bd43b30961807c5 *457919fbd6e98ced1b46c66df7c17aeddcb268425bef3b66f4b5337e8c88b5f5234f9f5253dba0 *6a1b2faf6f4fd574eac8e9565da8efd196b5d5897629c8f3c9e3f168ebfa797accd41727cf77e8 *544d876ed9be546b9657278df5dc1cafae5e3357874e36e9073f3fa0554b66e8a50375ea1b18d5 *9fdebd29914973c497ed76bb555c98a3fec131fdf34ff6a97a56b15e391c6b63a7c3a9dc1caf9e *78e9bc82a1b0ba7ac7347f7671d271dbe3f1c817bf6b71f242a7e6cf29d3e675f3f4dcab753a7c *aa55332b0a353a16d4aefdb52a2ec8d1b7be785be20e80b13f4a524e8e4fbf7dee9482a1b03a7a *8693cf0fa62fd4a5300059cc697a491902b489ffbf48fa691c929c6bd6aca932073246f0f1b98f *5dafdbae5bae6028a2d78f37aab1b54f3eaf5b1f79f746dd7aedf2787625b6a31927f33b76ae52 *51814fbf7ef6b41e79fa946ed8b24892d4d436a082fc3cfdc507372b3fd7ab67f6d6e8a15f1dd2 *d9ba2e5d73d55ceddcb654db372dd4cead8bd5dd37aa5f3e75523ffecd1145c2517dfcbd9b5451 *5624af6f3cd3e2f3f9b463d322bde3da65f100e0a4ced675eaeaabaaf5c1776d9a90c170b95cfa *e407b6ea96ed4b253974e4748b9e7da5468d6d03dab87a8e3e7def36f97cbec4f7ed389daed8bf *e3070f391cf2f97cf27abd49815abaab7ee3f76bae9aa333755d3a76b64d2e97431f7df7062d9e *57299f6ffc5be63d1e8f766c5aa8f9b34b74f242877ef08b83aaaa2c526559be42e188dabb47e4 *f57a75dd358be47038f4ccdef36a6a1f94d7545a6facd3bd776dd4e6b5d5eaed1fd5932f9f5373 *c7a016cf2bd7673fba2369db5c4e57e2335eaf3791b1f27a3df1e9c6fbd4e7f3c91bffca12235b *673e19bbdd6ead5c324bd75d13fbba81570ed72b2a87ae5a5615df3eb7b66d5c10efd791b4fdea *f11ab70963fd6a6407ddaef1f54c9cb4e3d9cb7bef5aa7cd57cd5128145147cf88de7df332b99c *0eb99cc95fba69040f4e9733699bd6ad9cab8fddbd510e47ecb6fce1532dcacbf1ea731fdda1b9 *b3ca545e5aa877ec58a6317f48dffbd9019dadeb4a641e9ada8734a3a2587ff1a1cdcaf1ba75a6 *b653874fb5e83db7ac8e8d018773421b99b332376e59ac570f37a8a96d40e52579ba3f3ef6aebd *7a91e6cf2ed189f3e3e3a0a2344fa170441d3d63f2b89303e709fbdae685897dcde319cf7079e2 *81b7cf377e8bc8e7f3a9aca4509fb9779bf2723d7a617fad5ed85fabb2e23c7dfebeebe4f3f974 *d7cdab75f3f6256aed1cd2af9e3aa9d3359d5abf72b63e74e786587065da578ced35b7bbcbe5d2 *759b9768c19c521d3fd7a6effffc40d236b5778f9ac6a473625f7b62e3f113efdfac79b34bd4dd *37aa5dfb6a75cddaeaf86d35c9656a67e375e3d665ba65c752854211bdfcfa450543116ddf302f *31cf8ab222ddba6399c6fcc1347d3b18ef8b8572381c7af6950b6aee18d21d37ae4c6aeb1b37c7 *8f6bed03f278bc890cd2f5d72cd4ab47a6dbb7f98976b8f7dd1bb5606ea94e9cefd0c3bf3eaca7 *f75c505565a13e76f726e5e4e4e8ae9b56e9e66de37d71aaa6431b57cfd1bdefb92669ac19e3ed *131fd8aa45f3ca75ee62a71e7bfe940687c6f4b1f76ed2b28533c79f158c1f3b7c3e9f3efa9e8d *f27a5cba50dfad23a75a74cbf62589b1565890a73fffd096f871fb42e2b8bd796db56edeb15c5e *af571bd7cc53419e5767eb3af5cae1062d985ba1bff8d066e5e678f4f88b67f5fcbed8d8fadc9f *ee50417ede78bfc72f163d1e8f8a0af3f4998fec507eae574fed3eaf7ffdc5eb3a53dba92debe6 *e9d66b5724c617011ab2d1ba75ebbea6e4ac59c6382c75041b5f4ceb93942fa9405289a4524915 *9595953f6d6f6f7799ab80ccdfc43d3a1650536bafe47068eecc62f952feab9cd4cac77038ac96 *8e01555514a47d2e25100ca9ad73507e7f5095e5052a29ca4b9ad7e0d0983aba87e4763b35a3bc *d0947199f81c8ef1cc455bd780665614a9b4387fc2d5bcb15ec6360d8f8ca9ad734081604833ca *0b55549093947133afab39f0321f04cdb79ccc5fc6e9f7fbf5e85347f4e8d3c7f5a13bd6eaf6eb *97c76ec395172837c737e100637ebeafbd6b5085f93ee5e58e3fd7649e3e180c6bd41f545eae57 *1ef7c46fd5361ea21d1c1a536be780ca8a735556929f341ff3cfd475482dfa487d16c7fc8596c6 *3323e6f132343ca69151bf4a8a72139fb9dc7ecdd4fea9cbaa6be8522814526559ae5c4e873a7a *86f5d5efbdac45d565fac6dfbe2bf17ca0f9eb1752bf593d128928100ca9a5bd5f6eb74bb32a0b *93325dd1685443c37e8d8c05541ecf04a56e973f10525be780aa2a8be4f3260765e6764afdc256 *7f20564938a3bc2069ba68349a180739bee45bcbe6f630d62f755f33c6aa39db90dad7a97d1e0c *86d4d231208fdba559338a12d31bed34321a505bd7a02a4af3555c98fcbf559883b1d4b6337f61 *6c6b479ff273bd13b629f5b6b9b91dccaf7038acd68e01e5e57a5552949b7804c11c181ad31afb *796fffb00687c654555938613c49d2d0885f23a381c477c2196d673e4e8d8c06949feb95cbe54c *ac435565e184c21df3be130c452eab6fcd6dd6d933a4defe511515e424fe5b3d73df197d31a3ac *50a525e98f75e6ffaaafa36b4003437ecdad8a1db753f7b7d4029f9efe519514e6c8e54a3e6e47 *a3d158714cd7a0c6fc21559617a8347edc1e3f0e463434e297dbe5548ecf1d9b6738a2d6f8d89a *595128b7db95346e52b73f1c0ecbef0faaa5a32fb69cb202959716242ecc5233a6046bc8161b37 *6efce2d1a3472f4aea91d42b6950d2906245037ec5be1bcdf4f4eeb84903b4f6f6f6072a2b2be7 *48c927b274ff59ba34317090927774f349c0983e55eadfd2057bc6fba9c193791ec62bf516ad79 *27361fe4cddfae6d0e42d2edf0e67533cf3bf5c062fe26f96030a847fe7044bffac351dd7bd706 *bd6be7aa09815dba002df5b9a9d46d4f275d7ba4fecf05a9eb9f1a84a6b677bacf1a320577e66f *794f7d3ee4cdf46bba3e30facc38f97ce95bbf57436b9f562f9da1b9338bf5cae17a0d8f0674e7 *ce55fad83d9b9302347330696eeb74df8e9e7ac230aff764e3d8f8ec54e32ff53bd1cccb4c6da3 *746d95baec4cfb5aea8551ba7e48d7f7a9ed9fa97d525fa94502e6803a759f9b6c3ea9cb35f755 *ea7aa466ec244d387665daaf32b55bbab64a6daf54a9015abaf94dd5b753ad4fbaf99bc79a79ba *c9b67faae3e85463c1bc1f4ca7df52e73559bf9b2f9c8cfe36b633f5c2385dc00dfc57ba9c006d *b2228149a5bb9a4df75fb44c1658653a904d663a278554990e7699aec88ded330731e90ecce9d6 *69b29389f177a36020c7e789650b72bc89db99e60c43ba0364ea764ff7009429d84bd77e93cd73 *3a7d96e980ec708c3f67355580966e7e536d97f179e3ab041c0e87bef8e737e937cf1cd3d9da0e *9daee9546559be6edcba58f7be7b53da2b6d69fc8b6b8df94d7542322ffb72b629d3f84b1d8bd3 *5d9e79ba74fd3dd5b499da385d1b4ce784973a96d28d8bd4e06db27179b9eb68fe6cba8b8ed467 *24533f679e77ba6dcbb41ed3917a4c99ce7cd2056093ad8bf9efe9b63f75dca51e1f53e7fd5683 *f54cdb3855d09a6efea9fd96dacf0467c8566fbcf1c697257d2ac39f8d5b9f6f2e833663c68c39 *e9ae18273bc84d77e7bcdc83e2749797babe535dd94de7a43c55c0903aadf90a3f35eb28255799 *a57bc835751b265b874ceb3cdd7965fa7dba279f749f4f3db84f76b2bf9c7194cadccea9b70b8d *2fa6359e374bfdff09d36deb9b6df774eb956e7b260bc2a71b104d77bd32cdef723e67de7fa623 *dd72d26df36499a3cb5dcfd4edbc9ce5665acee56cf764c7aecb0db0d2b5c3742e16d22dc3dc0e *d3b9507e334155eadfa67b2c99ce6752d7dbfc73b2633a011ab289cbe5ea8f44229f92d4ad8919 *b4806219b488749919b4356bd654757474241d6ccc3bc3db71a579b9a6bbbcc902ac4c57aa537d *76aa698d2b3b83b9e43f3593906e3953b559ba7eb8dcf69f6cdbdeca816eaa71329dcf4f87390b *95294b927a7b31dd03c5d30d4ca71a2b9349b74dd3dd972e677c4e77dc4c66b2f1f266c652ea74 *538d8d2b111c657affed3a165d8e37732194691ed339d6a50bd6a6facc5b59b774f37c33e3f272 *2ee209cc908dd6ad5bf7b5a3478f661afcd1f84bd25bb8c5294ddc01cc3bfb543bc79b39e04e37 *d3f25696679efecd5ca94e67bee6e79dccefa75ee94f16344cb58c2b31cddbe5723236d3993edd *fc5383b4746d9deeb6cf9b59dfb7a32dafe432afd4b87d3be77fa5e6f5663e9f6d27f2cb0d98df *ec71e2cd4c7f258edb6f66b9993e3fdd2c3360479715a09d3c79b24dd29cc9a6b9d23b89552786 *b77bfee982d7c90eac7fcc079b2b1950981fc037ff6daaa00cc866d93e6ead5abf6c6f07e0ad98 *cef7a0e10a490dc0525fe9a6c3e5490dbe52bfdec15c216b9e8e360700bcdde24502994e380ef3 *dfded22d4e5c3e02016bd0ce00003bbbac0cda9a356baadeae15010000f8ef2cfe3f094cab4880 *5b9c00000059e6b202b4789100000000de4664d00000002c703945020468000000598622010000 *000b5024000000606314090000006419326800000016a048000000c0c62812000000b000450200 *00003646910000004096218306000060018a040000006c8c22010000000b502400000060631409 *0000006419326800000016a048000000c0c62812000000b0004502000000364691000000409621 *8306000060018a040000006c8c22010000000b5024000000606314090000006419326800000016 *a048000000c0c62812000000b00045020000003646910000004096218306000060018a04000000 *6c8c22010000000b5024000000606314090000006419326800000016a048000000c0c628120000 *00b00045020000003646910000004096218306000060018a040000006c8c22010000000b502400 *0000606314090000006419326800000016a048000000c0c62812000000b0004502000000364691 *0000004096218306000060018a040000006c8c22010000000b5024000000606314090000006419 *326800000016a048000000c0c62812000000b00045020000003646910000004096218306000060 *018a040000006c8c22010000000b5024000000606314090000006419326800000016a048000000 *c0c62812000000b00045020000003646910000004096218306000060018a040000006c8c220100 *00000b5024000000606314090000006419326800000016a048000000c0c62812000000b0004502 *0000003646910000004096218306000060018a040000006c8c22010000000b5024000000606314 *090000006419326800000016a048000000c0c62812000000b00045020000003646910000004096 *218306000060018a040000006c8c22010000000b50240000006063140900000064193268000000 *16a048000000c0c62812000000b00045020000003646910000004096218306000060018a040000 *006c8c22010000000b5024000000606314090000006419326800000016a048000000c0c6281200 *0000b00045020000003646910000004096218306000060018a040000006c8c22010000000b5024 *000000606314090000006419326800000016a048000000c0c62812000000b00045020000003646 *910000004096218306000060018a040000006c8c22010000000b50240000006063140900000064 *19326800000016a048000000c0c62812000000b000450200000036469100000040962183060000 *60018a040000006c8c22010000000b5024000000606314090000006419326800000016a0480000 *00c0c62812000000b00045020000003646910000004096218306000060018a040000006c8c2201 *0000000b5024000000606314090000006419326800000016a048000000c0c62812000000b00045 *020000003646910000004096218306000060018a040000006c8c22010000000b50240000006063 *14090000006419326800000016a048000000c0c62812000000b000450200000036469100000040 *96218306000060018a040000006c8c22010000000b502400000060631409000000641932680000 *0016a048000000c0c62812000000b00045020000003646910000004096218306000060018a0400 *00006c8c22010000000b5024000000606314090000006419326800000016a048000000c0c62812 *000000b00045020000003646910000004096218306000060018a040000006c8c22010000000b50 *24000000606314090000006419326800000016a048000000c0c62812000000b000450200000036 *46910000004096218306000060018a040000006c8c22010000000b502400000060631409000000 *6419326800000016a048000000c0c62812000000b0004502000000364691000000409621830600 *0060018a040000006c8c22010000000b5024000000606314090000006419326800000016a04800 *0000c0c62812000000b00045020000003646910000004096218306000060018a040000006c8c22 *010000000b5024000000606314090000006419326800000016a048000000c0c62812000000b000 *45020000003646910000004096218306000060018a040000006c8c22010000000b502400000060 *6314090000006419326800000016a048000000c0c62812000000b0004502000000364691000000 *4096218306000060018a040000006c8c22010000000b5024000000606314090000006419326800 *000016a048000000c0c62812000000b00045020000003646910000004096218306000060018a04 *0000006c8c22010000000b5024000000606314090000006419326800000016a048000000c0c628 *12000000b00045020000003646910000004096218306000060018a040000006c8c22010000000b *5024000000606314090000006419326800000016a048000000c0c62812000000b0004502000000 *3646910000004096218306000060018a040000006c8c22010000000b5024000000606314090000 *006419326800000016a048000000c0c62812000000b00045020000003646910000004096218306 *000060018a040000006c8c22010000000b5024000000606314090000006419326800000016a048 *000000c0c62812000000b00045020000003646910000004096218306000060018a040000006c8c *22010000000b5024000000606314090000006419326800000016a048000000c0c62812000000b0 *0045020000003646910000004096218306000060018a040000006c8c22010000000b5024000000 *606314090000006419326800000016a048000000c0c62812000000b00045020000003646910000 *004096218306000060018a040000006c8c22010000000b50240000006063140900000064193268 *00000016a048000000c0c62812000000b00045020000003646910000004096218306000060018a *040000006c8c22010000000b5024000000606314090000006419326800000016a048000000c0c6 *2812000000b00045020000003646910000004096218306000060018a040000006c8c2201000000 *0b5024000000606314090000006419326800000016a048000000c0c62812000000b00045020000 *003646910000004096218306000060018a040000006c8c22010000000b50240000006063140900 *00006419326800000016a048000000c0c62812000000b000450200000036469100000040962183 *06000060018a040000006c8c22010000000b5024000000606314090000006419326800000016a0 *48000000c0c62812000000b00045020000003646910000004096218306000060018a040000006c *8c22010000000b5024000000606314090000006419326800000016a048000000c0c62812000000 *b00045020000003646910000004096218306000060018a040000006c8c22010000000b50240000 *00606314090000006419326800000016a048000000c0c62812000000b000450200000036469100 *00004096218306000060018a040000006c8c22010000000b502400000060631409000000641932 *6800000016a048000000c0c62812000000b0004502000000364691000000409621830600006001 *8a040000006c8c22010000000b5024000000606314090000006419326800000016a048000000c0 *c62812000000b00045020000003646910000004096218306000060018a040000006c8c22010000 *000b5024000000606314090000006419326800000016a048000000c0c62812000000b000450200 *00003646910000004096218306000060018a040000006c8c22010000000b502400000060631409 *0000006419326800000016a048000000c0c62812000000b0004502000000364691000000409621 *8306000060018a040000006c8c22010000000b5024000000606314090000006419326800000016 *a048000000c0c62812000000b00045020000003646910000004096218306000060018a04000000 *6c8c22010000000b5024000000606314090000006419326800000016a048000000c0c628120000 *00b00045020000003646910000004096218306000060018a040000006c8c22010000000b502400 *0000606314090000006419326800000016a048000000c0c62812000000b0004502000000364691 *0000004096218306000060018a040000006c8c22010000000b5024000000606314090000006419 *326800000016a048000000c0c62812000000b0004502000000d927537036c17402b4a8a488a428 *45020000006f4934c3ef49260bd0a24a4eb745aec04a010000fc517ae38d37fe77fc5723a64aba *ad69962e408ba6fc8cc45f2187c331edd41c0000002688985e8609f1953bc3878d882e119c498a *dc72cb2d4d3939393d77de79676d3018f4854221efbffccbbf5c27c9f199cf7ce6882445a351c7 *830f3eb841923efde94f1f3566c87bbcc77bbcc77bbcc77bbcf7dffdbdfbefbfffb0c3e108bb5c *aed077bffbddad92f4e52f7ff9f1dcdcdc91d2d2d2dddddddd0149e1f82ba20c19b4d4efe27049 *f248f24aca91942fa95052b1a412d3ab30feb7bcf8b43ec5b271141d0000803f66114941490149 *a3f1d7b0a47e497d927ae33f07240d491a91e48fbfc28a076ca919b444418092b36701d36bd4f4 *b98862c1995fb1e02ee94bd6000000fe8818772083f1975fe301daa8a431c562a990c6e32c23e6 *4a922e40939283b3507c21638a457946962c1c7fdf179f0f19340000f0c7ceb87d69cea28d683c *40f36b3c8033076949d23d8366aede3416e057ecd6a739736604675ec5b2674e91410300007fbc *8c6c5858c97720cd59347ffcbda0c63369c66713d20568e6ec9953b1e0cb78197f0f28f68c9a27 *fe729afe0e0000f0c7cc08d08c4cd998c63368469016d278a1c094b7380de6ec999119332fd0ab *f167d1ccb737c99e0100803f66460c6524bb8c5b9d018ddfe2346e731a41da84ef434bf70c9af9 *6135677c0632bd1fd4f8ed9ba30070000000c449444154ced4e08c000d0000fc3133175c1ab730 *8d20cd1cac05351e9c19d32782b44ccfa019015a38e5bd70fc332ea5cf9c5124000000fe98454c *3f8dd8c99c4d3367ce8cd794193429398b66447ee600cd2808709a7e97c89e01000048130b2ecd *3195f9f7c4f79ea59a2ca832dfb634bee3cca9e4afd33067ccb8c509000090fcd07f6a462df595 *3abda4a9032a7376cca1f48119b735010000264a0dd4529ff54f9d2661ba19af74d93132660000 *00939bf07c9932046500000000000000a6ebff0786e94b120a06c3390000000049454e44ae4260 *82 newhex * rmfile ./images/ClassicRectangle.png binary ./images/Node.png oldhex *89504e470d0a1a0a0000000d49484452000000950000008a0806000000a32208010000020f6943 *43504943432050726f66696c650000789cad924d6b135114869f494c0d28512452dccd428a8b54 *426369dd486ada4a4c1b631a6912d032999926a3f9b8ccdca42a6e04b72288888b5a043722b8d0 *9512c42cba70a148118affc0bd1fdd888e8b71260b296e3c70e1392fe7bcf79ec385f0a6264433 *04b4dad22e9e39ad962b5575ef36514689b087494d77c44ca1b0c0aeb1b38d02f0715c13a2f9b4 *73f3887c7eebe1f7fbafdceed15a7ff73e006276b952052501c4eb1ea78178cde312105f934282 *d200e27a433340b90124ec523103ca132056f7f82510ab79fc1688f5f4ba04e513906c1b561b42 *5160da301d1d426960c570f416841e01ef5aad8e01e126704c17b684f03d60bc5ca9aade937b9f *e1d40684ee0cb54a0d9e9d84c353436dec36c4a7a0af0db56f7751006574c3594d4d00a0ec5b81 *c845d7fd3a0d231fe0d709d7fdf1c2757f3e80f00ebcd9d2bb76efcfbe14e53dfc2bf766f672d8 *923eedc6de5e0048c2e3012c03b901ac0f606c0d0ef5a1908612845229ff783b0420622d6a3eff *b76835bbbee70160bf25b325200a6caedaf3459fdbb5fc399f4d676e29a8b1e6b33e0b59087aaf *374acb3e5fd6ce16029f667ec167c39c9df3f94a2717dc65b62f04fe4e6f29a831b4d9dcd03f93 *f7198b453474ef5f018c1c84f5f300afbf5cfa6b66695e9500998eb8665bf586546784689a6aa6 *d3125d69da0935dbd68f27d489647212e03734c1a699a18dc5900000173f49444154789ced9d7b *7414559ec7bffd48e8cefb0121c46444220641c12783e063405c7106cceca84716755d5644473d *67f5ccba7be0acaeeb63c05d47dd9722aec38eeb38eca2a31c0f8ea0820262e0a83c441e238344 *848436098410ba934ebaf68fe426bffef5ef567542a0abe17ecfe95355f7deba75abebd3bfdfef *feaa52018c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c9ce549f50052a4813c6f6b00 *fb3a2d74264095aa733c63613b1da1eaeb39f5f73be82b34670c64a70b54c99c87ae4d7fbe031d *20c982735a0396ee50d98d5faa3b99e72b81e204cf690957ba42d517ab63d7f644cedf42df2cd6 *895ab7b4513a42950c38baf3f20ef058a8629a720e4d7f2c5a5a299da0ea2f4c762079d8321959 *6c294902ec8c812b5da07282876feb40727279767576eeab2f80599a75a7e3a48dd2012a3b80fa *0bd389c6534a1c281d60523b5eafab4b3ba51b5476ebc9b83ebadd1fd707c8ee4f82497281b4ec *b405cbed50250394649d383c1c203b6be72409064b585792dc9f2e2e3b2dc0723354fd014a0793 *531def9bd63901a0032aa659e76d752019a84e829cac8a04946491746e92ef9fcc7721b93cbbb8 *8a2fb9fb3b2dc1722b5412483aa0bc9a763acb44e1e3fdfa010cbde79e7b2e2f2f2f2f0780fdfb *f77fbb78f1e2cf001c02d0d9dd8e5e6c5a960c5c7d01cb40354072727b1c283beb44d77dacafb8 *be4b4a4acae7cd9b77dfd4a9537feaf7f94bdefbcff750766e19aebde35ad4d7d787de7ffffdb7 *162c58f0422814faae7b1feef6626c5b2926b477022badad95cfb9c929979ddb7302ca2bac7b11 *6fcdbcbc6eca9429a31f7becb15f4f9e3cf986aaaaaaec3fbcf607ecfdd55ed46ea845d52d5518 *397264764949c965575d75d595b1586ccdf6eddb8f22f107298d47ad5b4804dd62f5d27790963a *99b72dfa235df06c171b71e0142c1e74fd683c8887497d7c00bc83070faea8aeae7e79dfbbfbc6 *2cbe6931bedaf4152ebbf632042e0ba0ecc765281d568a67fee6192cb97909328f665e3873e6cc *570b0a0a2a481ff478ea98749b8f8d8ed1ee1cedbe1357cb6d964a174bf12fdcc7da78c9925b23 *fae160f99f78e28987a74d9b76ddfa85ebe1fdc68bc6fc46fce4b69f605cf5384cfad924e4e5e5 *e1fda7df8767bb07f519f5b8e3c13b4a82c1a077d5aa55eb106f81a471aba5c596b45c6acbbf8b *b4925ba1b2034a6705d4d20719241f90e0faca9e7df6d927478d1a95d598d188ccca4cccb86f06 *f20bf2110c06919191010088e444102e0e63fafdd351565186bcbcbc1fbcf8e28b6f033866334e *35260e941358692fb743c5dd068f5b24a0541d872ac15acd9e3d7b727575f52d7b77ee45d54555 *987aeb54e417e4270c6ae4989198f0e309e84427766cde818a732ab21b1a1a366fd9b2e56be178 *5c3ab0e87e34a64a7bd0fca91e009164a5e89297e92c1420b8c3c183077b274e9c98158bc53cea *3362c48891356b6af0eedc7791519881f91be66358d9307170adadad5872f712d47f588ff18f8d *477979f970721c9eaf8a751f37d65de64357eac1db5de62575baa05e079aebe526a8b82457c2cb *754025c4538b577cf4d26b5b6aa7d20e9b3a9a7c8579854027108805d0d8d8a885aaa3a303cdcd *cdf0593e1c3c7810be425f067a2d234d13a863f384a7024b9af979119f66482b88b8dc06955dd0 *2bc104c4bb700928ef1bab3f99f9cf1f7d35b9665f28403bbf2418c1bc5baec74dbfbb09e56797 *a36a4c957660f9f9f998fdd26cecdbbe0f63ae1883a79e7a2a44c6412d138583d6abb176221124 *ea06d3da4a01ee4929e86052e2e90255e663e53c76f2cd9f3fbf646bb3757fcdbe50363fe8970d *611c6a3c8ceb665c87ad9f6cc593d39ec4074b3f48185c5d5d1d1ebfe571bcfde4dbb87afad508 *87c3adcb962dfb8c1c93a616784a818e4b3a07c9cdd3734e3bb975e04e01aa7491783ac10bc073 *d18db39e5bf0c196115227d1413958bc72033a3a3ab067e51ec43e8961ddabeb0000cdcdcd3872 *e4080060fba6ed685ed18cd05b21ac5db516ab57af5ed3d8d8d880f8192585296e0ca48c02e5f4 *434a5bb965f627a5105419b7466a9da60e78bac007c0fbfb8f37ddffc887db6f09b5446437eff5 *61f7c1ef7149712686fea000f56df5b8f8e68b915d948d45b72fc29a57d660dc8c71281f518ecd *b59b5131a902de326fc3d34f3fbdb0a1a1e110e2a1b183474a74aac09ebb7529f7054d992be546 *a8a43482daa62e2621450002dbe38fff72f8f6cc92c7dffd6a7fa1dd81db7c8350b36d27ae1a5d *8afb1e9d8351178dc2ee2f7763e3828de8aceb44c68519b868fc45b8e6cfaf415b113afffd5f9f *7faaa6a666136450e8c7e90950ee25a4fb7e3caf951672cb60a56426fdd553d82437e3e3db9bf7 *d5bdb7b7f1589965e9635c0b56cff97fffed37deb3b23332c78f1dedcbc9c9f1bcf6ec6bc8f267 *61fabdd3d1d6d6865756aec7dea6d6d0925fcc9e8ef8d95e14bde9814ef406eb76db9d6c1ba44d *8cf5afbb51ed5ab975f66717bc3a0205c0f37acd8eda7ff978877e3a27a93d8cb2dfd7e0f2d25c *0ccb0be2bcc181e37ffd6fbfcdda54d782bace0cdc7df5d876f47e670a880c001de89d01aab401 *dfeeecde97b605a9a3e7a8725a52b21470395c6e804a4a6ed275bbe096b68d8f672cabef563833 *8883086279084028827b879c7d78792894055f5e17aa5d7d72b707c48345c7a3ac0ed06b69bce8 *fade39385ed69e9f1f902670b9012a4086458a591252066cbbe7637543f5e2cc6b7024dc2e1eb4 *b6a9058bd66dd78f4a06d38f5e4ba3ac480cbd5688ba72954d57a2ae8dba7bbaad32ee14420aab *ea576dbb0e2cb74045958c85e13326f551753d406ed85b8fffd9b45bece48ef17df38e96050fba *ac128d8980f8a4277f3a54011345ef4442b5eb2465743648b3ef92b84b7415586e848a4b8aaf68 *4a416dc7e5ab2c62650a8299f8fb3fbbb467e7e6701b16aefac2f1c034902752d652c1c2676b1e *74592caa4ef4c2a4f653d608880fc275210090782c5782e526a874b99984db2e88ffb23549c65e *208e84db316ff9a70330448b5a151550535728c14301a31028cb456f32d3d91f8dcb686ac1f560 *b9092a2a29d3affb0573c0e2dcdfc411a5183dac483c486d534b7fc6e6873ce507d9a61648c142 *6f3e03bd702a1069e04ec5735fae07cbad50d9c555dc5a49b9ac9e40fde74b3feeff28e4409d06 *d60a0c9a1650635196c84fea954552f1921a2fddb69018acab7ee34647d65d019352aaa1e2d687 *7f711c1cbb1bb3d2fa80aa1b54957ca5494d90a5b25c7eb2ad20a101397571d2a32f3ec4bbc29e *619036baec7b4a014b35544eb28383ba05beed29c9cd1a74d7c4f34fe8e0593e4b3abe741b89bb *371aeb01bd30f1591e4d2f500b48a1d0592c3b80520a961ba1e2331e6ec1b8eba3653dd6eb4838 *d2f1d11feb4e6820d78f2c8dbf305d968ae6a968cc04b6a45029a03a48394f7a7a90f84351e260 *01323829b752803ba1b213b74c806676d816ed8cfda9e168dcce375e381cab767d8b4854f7d2bb *78758c182215d3d91d9d7946491dcf985370d43e2a40e7494e7e8ef40634b772bc8d2b7452628f *3e4a1747f5653fc9bac5a9209889e76ebe120f4dbee844c6a6ca545ce547bc8be333507e5f52ba *c5e3153e3c95228d49aa7385dc00959374e903dd0507847b7f7f3bf562f8bd5eccbc6c240a8299 *fd1a48773294c74b1432090cee9a79191dbbcefd7177cf65f7033be572b3fb73b43e48844cfbeb *fd877736e2f0f136fcd7273bd01c91ef052629ead280de4759e86c8da71dd418792cc5effbf199 *a02ebeb29b15a65c6eb4544ef0d8d5d98255519803bf4f7fca77fe7014ae3867a8d3f8f8233776 *2e8f02c5db0389164b3a07db732292ac554ae4164bd5d72f817ec9529c62db5f30c3872bce2945 *cea07837589a17c4bc699762f2736fa1eee871bb634b69039a77a2e3e3a9060a162fe3e7468f45 *c5ad952bf2534a6e814a929d55eab7c69e558c97664dc6cefa268c3f7b281a5b23d8b4ef1000a0 *b13582929c208617e7a2eee8715842463d2323c357525292595050e02f2c2cf47a3c9ee8b163c7 *da9a9a9ada42a1507b381c6e432f48ea5118357609243b883cacacafe0a404343743a59353e0ee *012002e1f178f0e48c097860e9c758b56b3f2655966261f5443cf8c63a1c8d4471f7a4d1b8f777 *1fe1d36f0ea1383b801f9d7ff6a0f1e794e2dce25c9c3d381fa585f9435efeabc8a28e8e8e587b *7bbbd5d6d616b32ccb0a0402decccc4cafdfeff744a3d1584b4bcbb1969696e67038fcdd912347 *766ddcb871ebfcf9f3b74522116aa5a4a4273f0f9e46a0526909fedda4dc5ab905aa5312030c2f *cac5f2ad7bf1c48d13b06ad77e2ca89e88e73edc8259975761d1baedf84dcd2eb477c670eba5e7 *62e95dd3b0eccd3773bef8f043bcb663076a6b6bd1d8d8e8696969a1315182f2f2f27ca5a5a585 *c3860d2baca8a8187ec925975cf6d0430fcdb9f3ce3bb7161717df47ce5541c1f36cdc2225fc60 *9098a372950b740b544e4a265055edb42ace0960fdde3adc74c9b93d656bf71cc43f4dff2100a0 *bdb36bd2b57e4f57267eea9429defcdc5c5c70c1050a2a1c3e7c18ededed686b6b432412816559 *080402080402c8cccc444141018a8a8a307cf87054565662ca94290100282a2a1a87c4591f5f26 *13b4277b23396580a50b5403a22ddf35a0aeb935aeacb53d8a2b2be3df9f70a0bbcde8d1a3316e *dc388c1c3912e5e5e5a8aaaa425e5e1e82c120060d1a84402080582c8668348a48248270388c96 *961634343460f7eedd58b16205e6cc998303070ea0fbaf7a686ecb6e9627592ac91aa57496a753 *3a42c5efb3f17540e39e36efff1ee79514c2efedba16d9997e540e497c7590527d7d3deaebebb1 *72e54a0040f5dc0731ba3808a0112b162cc6364d998da8eba38fcdd0475e7840af7383f4f60dbf *1799dc7da8932437e6a924f19ba97d6a7bdbf8f30000ef6eafc5dc2bc7e0b36f43d8f58fb7a1ae *f938eebffa42ec3f724cea87e9763cf1cc02dc757335fee29e85f8bce973cced2efbcbea1b70f3 *5d0bb17ecf328cb5ef84bb71fe280f2de31fde36a9f44912f503ae74b45480fc6cb7da8efb127f *7ed505b86d7c15be3ed4f55e84c6d6082a0a72f06acd2e0ccdcb42cea00c1c39de96c421b3106d *d98a5f5c3a01cb012cd973140f2c2a43b4e56bfc7aeed5d83a6539963f3a14c5ce1d71b0383c31 *b694f657e74acb521ea02bb9052a69cacceba5761612dd615c3fb78fafc2a00c1f1eeb0ec601a0 *2c3f1b3fbbb812fffde94ebcb0f64bbc7ae775490cf138800ca87cfb1f6b9b70556e1e9a83c3f1 *f0ffee44b4f82c641cfdc4a9139e2ee07f7aa583488ab592d1199da7a2b0f029326d63b70fd03b *9382c7e3b10060ee6f5763c14f27e2c6452b4e70885900baded00f4cc60d979f8583cf1f457678 *076e387f02b66132765aef624e35b066b9b6136ea5745978beadebcb3c4f3500ea818648b2543d *81ea57f587f1776f395a90247408d1e0682c098580dc42746c7d05258fee46cd03e3b03e740091 *4011f0c552dca6078aaa2f3191b49f134c2985cbcd50e95c9e54af966240bfab3b9ee2f27a8085 *d513118976e0c1c9e3f0fc9aad36c3598e0945c18452a9cc417c9c3af7dd1fe85ca17498fd496e *8f5f18fee752494da96316e0f37a70d7a4313890d40c7040245910bbf48853b9a49482e8664ba5 *245920ba4eff9c496dfbd01d533969e1aacf31243788659bff34106375123f07e9051ebab66923 *374295ec3d2c05136dab2e52d217e1fb6311dcf99bf8f77cde78e139008059b366e1f3cf3fc7de *bd7b118d4693ed1200e0f7fb51515181b163c762c68c19cdd168d40e1a49d279f425579732b901 *2abb74029fe1f1bfa9e3bf7215a47b2b8af2830baaafe8f7a0d6ecfe0e8f3efdab765856666559 *89d5d4d8186d6e6eee686a6ab2dadbdb110e873d9148c4138bc5acacac2c0402012b3333d31a32 *648877c89021fedcdc5cffe1c3875b9a9a9af68542a14d93264d7a07bd7f03988c7b96ee1ca485 *dc001517052499205dc1466f55c4f63735879fdbb0e7840632777ce5e177761d1cf2c8a525ab96 *fec733ef555656e60c1d3a34989d9dedcfcacacac8cacaf2793c1eabadadadbdbdbdbd2d1289b4 *d5d7d7b76cdbb6ad69c3860d4d9d9d9dea5163f5d7c992b58ab13a274b9b0c6467bca5524ae626 *298fa580c43f998a01f078928ca9ece481178ffc68d49e876fbefef5d6d6566beddab58d88bff0 *fc558b20dbd42ad17ab5dec9faa19698aa2f10b9c2aaa57af6974c5c01f45e00a0f74282d4a9b6 *3d177220a0ba75fc7919ab97bcf0726b6b6b145d4f7176a0178a18647062c2d262f5f4dcf8b95a *902d177fcb9e6b2d969b2c9524ea0a21acf32fbde7e6ebe86cabe6cd5957345b96e5b1ac982716 *8b79639d312f00c462b1ae17785856cf7bace8d2b22c8fc7e3b1766dfaa4f68dff7bbdb6bb7f35 *c38c22fe5d0a1234fc3d0b1dac2c8a4408b9c5d2b9c21309e04f89dc905893eec803bd6e4dfd15 *0a7f6fbaf40259f5516f5a517fece9effef8d807a43d487f40fcb34f16d99660a61feefe1444b4 *9e7e3a106fd5681b0954201e58bb9784f469263c5072c37bd47550e9ca74fbf2f482f4220de901 *38400ef8291c407ccc442fbe148ceb00e12e51b26c523c46e1b0739b20e34d99dce4fe74333edd *2320743f7581543bfaaba68f94a8f634b8e7ff2d821e5381a99e25a7b19cea4fc559dc52a93a3b *f7c8632c5e46cf8f9fb3ae2ee5721354c948fa35fac836fd4be14e613f3f2ba3964a4149610259 *e78132b72c3c98ee60e51c3e6a893a485ff4432721528c75a2a987932237b83f20f1a135baae73 *793acba6b6bd421dfd93273edba2eb140ee94dc4b44c9ae9d1ff0261b13a0a123fbe9466a0f5aa *3d5fd7b9c694c82d5001f2dd795d3cc5eb2cd64e5d0c7a4f10c2ba728b3c31c9ad0fbfe81c24da *968341677edc452a28c1fa021b9364a5b8e5e4e79732b9052a099e64ad97ddbe525b201e280aa1 *bad0dc5a0089c94d1e544bf15227eb1748049183cb8feb64a5e05076cae526a8d492bb2c276bc5 *67721c281e3b2949d3732900e660e8826e6eb168ffbc5c9ae5e97254ba582a19d79712c8dc0895 *b454eb3ae02cd64689b697ee1e4890f18badabe301398fabf8368552729b604b27a8ecce25a516 *cbad5049eb76ae4db258bc8d92ce7201726cc52d949dcba3fb7137ca419592a47c0c9215922cab *742e29935ba002f4f14f32d68ad6d132fe0ba7653c43ceeb794c23591fbb009cc3465d9b049414 *c7e9c62f9d0f57ca2073335480deeaf4052ca92fea72947840ccad873433932c906e06c781e2c7 *a1edc0cac0fa03f4d0a4dc62b929f92959190e02af578a417e13b0d407bf5dc3ff751a3d86eef6 *103d3e058867ee39343aab6497d2a0634bd64aa5546eb25480b3b5e2654eb76fa4363a7762e706 *699df4bc946ef6e734b3d3c5537c9c1c28d7b93c2a37592a251e484bd60ae8b50a3cc149dbd25b *38349652fdd2fb827c762801cefbe763925c97ce0ae97253762e8f1fcf952ed08d968a2e9329e7 *5f322db3583ba98e5f48c94249ae4e2d752e8e9701f140d131d3384b1a9b533984ed94c9ee9798 *2a4900e95e16cbad097fff932af30875fcb929a96f695c807c71a532c9727157c75fb1e8943270 *022ae570a50b546a5b97abd2cd122948ba75be8fdd18b874718e646124f7a6cb8bd905e476b154 *ca8102dc091570e260018916487a1714dfd729a5a1a42eb207f6300172565e2d79194f73485690 *cb554001ee850ad007ca3ab074fbd0321f2bd7ed2ba52dec66917630d17a3ba074ae8ed7e98eef *1ab91d2abae4753a97a764379be3ee911f47b7cef35814140f6b43ebed6673bc6fc0d9fab81628 *c0dd50017d074b6a2bc125954b6d74c7b68b7968bd9df5e2edfa932a701d5080fba1029c83661d *34766e506a2fed63d9d44b56ca0e261d10c9c4444eeecf554a07a880e4666392e5e94fde4b2727 *eba1bbf0bafdb8d54af698ae8549295da002929fe63bfd4fbc64cf3919c0fa0b4cb2eecda9dc95 *4a27a800e758872bd9b829197157c8d51fcbd3579797164a37a894fa0a976a3790e79b0c4454a7 *254092d2152aa5fec0e5d40fd7895c70d725264f85dc764379a094ca1fcb19091255ba5b2a270d *9425d3e98c0748d2e90e954efd3d6f038f91919191919191919191919191919191919191919191 *919191919191919191919191919191919191919191919191919191919191919191919191919191 *919191919191919191d1e9aeff076038e6a873c5ac8b0000000049454e44ae426082 newhex * rmfile ./images/Node.png binary ./images/P2PThorTitle.png oldhex *89504e470d0a1a0a0000000d494844520000027f0000026c08060000008c0cc5ce0000020f6943 *43504943432050726f66696c650000789cad924d6b135114869f494c0d28512452dccd428a8b54 *426369dd486ada4a4c1b631a6912d032999926a3f9b8ccdca42a6e04b72288888b5a043722b8d0 *9512c42cba70a148118affc0bd1fdd888e8b71260b296e3c70e1392fe7bcf79ec385f0a6264433 *04b4dad22e9e39ad962b5575ef36514689b087494d77c44ca1b0c0aeb1b38d02f0715c13a2f9b4 *73f3887c7eebe1f7fbafdceed15a7ff73e006276b952052501c4eb1ea78178cde312105f934282 *d200e27a433340b90124ec523103ca132056f7f82510ab79fc1688f5f4ba04e513906c1b561b42 *5160da301d1d426960c570f416841e01ef5aad8e01e126704c17b684f03d60bc5ca9aade937b9f *e1d40684ee0cb54a0d9e9d84c353436dec36c4a7a0af0db56f7751006574c3594d4d00a0ec5b81 *c845d7fd3a0d231fe0d709d7fdf1c2757f3e80f00ebcd9d2bb76efcfbe14e53dfc2bf766f672d8 *923eedc6de5e0048c2e3012c03b901ac0f606c0d0ef5a1908612845229ff783b0420622d6a3eff *b76835bbbee70160bf25b325200a6caedaf3459fdbb5fc399f4d676e29a8b1e6b33e0b59087aaf *374acb3e5fd6ce16029f667ec167c39c9df3f94a2717dc65b62f04fe4e6f29a831b4d9dcd03f93 *f7198b453474ef5f018c1c84f5f300afbf5cfa6b66695e9500998eb8665bf586546784689a6aa6 *d3125d69da0935dbd68f27d489647212e03734c1a699a18dc5900000200049444154789ceddd69 *b064677ddff15f77df6d768d461a8d460b1aedeb0809ac0502c8028c8d04d824718c890b07a748 *ca2e08182ab15310e1544130253b541c97edf24279051c1c198130c4c248c248ac42689b1969b4 *a05d1a8d349a4d77efbcb8b77bfaf63c774663a4440ffdf95475f59d73bbcfe9bed28b7f3da7bf *7d12000000000000002ad67891ed070080c5b57fd81d3cd7a1ad59785eff730d8000002facfee1 *afddb7adffdffb39d8c0d619fa3ac35e330b07bfdea1d0f00700f0c2ea0c76b33ddb667bee4bdb *1738d0c0d63be8b5b26ff8ebfdb977102cad060200f0fce85dd59bedf9f7ec22b7a430000e2db2 *f3ce60d7ecb90db55aadad4b972e5db275ebd64f4c4d4d3593e4f4d34f7f4f92dc76db6dbfdb79 *f239e79cf32b83be6de3c68dbf9224b7df7efbef26c9ecececa2cf6d341addc725c9d9679fbde0 *b9ff946db7de7aeb415ff30b715cdb6cb3cd36db6cb3ed85ddb669d3a6df69369bed2439edb4d3 *de9324575c71c5391ff8c0079e4a329d7d8b71edcccd700b06c0d24add7e43dffc6df8dbdffef6 *6b5efef2977fb6dd9e1b3adbed76f7d6f97777278dc682fb8ece637ab7f73e6fb17d746efdfbea *7f0dfdcfedfcdcfffbc51edf7f9c76bb5d7c7ebfc5de6f49679f8bede387b5d8dfb3749ce7eb98 *00c0ff3f9ffef4a75ff9b6b7bd6d73e686bfe92433f3b7de15c2248baffc25fb4ef10e25194e32 *ba63c78ed1de416f767676c17dffe0d63b101d6c78ea1f227b07be66b3b9df00d879fcececec7e *c73fd0b058baef3f56efb6ce317a8fb9d8f0d47fdcfef75dfa1bf5efe3f9d2fff73cd8dfa6ff35 *0100f578eaa9a746938c2599ecfbd57e014869f8eb5df9eb0e7e49c676edda359a64c1d0353333 *93999999050358ef80d13b441d48ef309764c130d66ab5d26c36bbb7dec7f61fbf33bc7406c6d2 *31161b543bc7ea1d029364666666c1f3fa87b6d2fbedfd7d698574b1e73e17075ae52cbdcffee1 *aff3b7e91d7401807abde73deff9eb241766ffcf0536fbb615bfaea577e81bcedc14b924c99291 *91917f1c1f1f3fac33f84d4f4f677a7a3a3b76eec9d4d4546667e7f63b3cd4cc92b191eeb0d63f *042d38e0fc60383e3195f189a97d434a92952b96a4d56a65686828434343ddc1acd1682c38fef4 *f4741e78e4a93cf2f83369b59ad970ec9aac59bdac7bec89c9b97d0fb59a191d19ea1eaba3d968 *2c385667d8ecbce6999999ecd93b91c9c9a90c0d3533363adc7d1d53d33399989cc9d8e870c646 *8717ac5276f40eabfd43e7a10e62073bc5ddfb98de0179726a268d46323a32bcdf40bdd8d00a00 *d461686868fbccccccab93ec4d329e642273ab8053d9770a78eeb18beca333047606c0d1cc0d80 *8d240b868ae9e9e9fcea47aeca533bf6ee7b722339e5842372c1c6e3f313ffecd40c0d0d657a7a *267f79f5cdb9fdae47b3e7d9a99c78dce1f9d9379e9b63d71d9676bb9dbfbafae67ce9862d0b5e *c491872fcb051b8fcf4fbde68cac5f7778daed767748ea0c7f3b9ed9934f7cf2badcbae5d1eef3 *9acd467efca293f28b6ffdb1349bcd7ce986cdf9f3bffd6e2ed8785c7ef9ed17e7539fbf255ffe *c7bb8ac77ae3256766dddac3ba8366e77dfefe5f7e2d5ffbcebd3962f5b2fce67fbcac3b005efb *f5bbf2279ffd562ebff4acbce3ad172c18763b836def6df33d8f65d3d6c773f66947e79413d62e *18fefa87aed210565ac9eb7f6cff29f96ddb77e597aff86c4e38f6f07cfc3fbd39ad562bb3b3b3 *69b55adddb62c703005efcdef5ae77bdf7f77eeff79664dfe7fc6632f7d9bfe6fccf8dccaffe2d *76dab7f3f52e0b06c08f7ce423bfd96eb73f9a24bdab7f991f442e7ae97159b57c347b9e9dccad *5b1ecf5f7ceee6ecd93b919f7efdd9f9e3fff5addcf0edfbb27eedca9c7ee291b9f98e87b3e99e *2772c5bb5f9b23572fcbccccdc407ac23187e5b40d47647a66365b7ff054aeb96e536eddf268ae *fcf5b7a4dd6e770795ceb1fff8af6fcaad5b1ecdc6d3d6e5bc338fcee4d44cbe78fd5df9ca8d5b *b37ce9487ee6f56777f73d3b3b9bc9c9c94ccf4c1ff058bff59f7fba3b08cdcececead6ab6e74e *473ff9f49e7cfe2bb7e74d979e9146a331f7fe33776a786262a2f899bfdedb2d773e94bff9f26d *f9f99c97e3d6ad5c703afb9f32fcf53eae7785b577f89b9c9cec6e9f9898e8ae700e0f0f779fd7 *6ab5160d51008017b7f1f1f1b1cc9dad9d9abf75e6b8fdbe8aef409ff9eb0c80434946928c4e4e *4e8e24d9ef9462670c79d5cb8ecbf147af4aa3d1c871eb56e553d7dc96dbef7a2c97fff8e9b9f9 *8e87b362d968feeb7f785ddaed76c6465ab9ee5bf7e5bbb73d94d7bde2a4ee67fd4e3a6e752ebf *e494341a8decde3b995fffed6bf3e0a33bb2fde95d59b37a4577e8e90c7f5beedb9624b9fc9253 *73ecba954992a3d62ccb8d373f90f6fce0d63ffc758e75e2b187e5b2d79c9c66b3993dcf4ee5d7 *7eebeff3e0a33bf2d48e3d59b37a7977e56feebdce1d7774a4952f5ebf25176e5c9fd5ab96ee1b *fea6a7bbc3df9d5b1fcfe7beb2298f3fb92bebd7aecceb5f79725e7ac6fadc74cb03b9f1e6fb93 *24d77feb9ecccccce4b12777e5b12777e7e72f7f69361cb7267ffbf7b7e7cead8fe7920b4fca2b *5fb621dfdff448aeb96e53369ebe3e6fbaf4cc4c4c4ee5539fbf25b76e7e243bf74ce4d875abf2 *cfdf704ece3a655d92e44ffff777f2f0e33bf373976dcc17aedb9c63d6aecc2bce3f3e49d29e9d *cdf8f8789e9d98c99f5d7573a667dbf9d9cb5e9673cf38ae3b000200f5999fd14632b76037947d *c35fff55daf6dfd0f7bb4ef13b9c64646a6a6ab8f3cbdee8a3a3b7bcddbd776eb56968a899e9e9 *d9bce367cecfbffbb90bba83e3934fef49922c5b323c3740ceb6f7dbefde67a73a8b8a6934d23d *cddc893c66666672d411cb93247ff099efe40bd76dc9bd0f3e950dc7aeca2fbef5bcfcd4ab4fc9 *f4f4f4825ab7136f1ce85843ad7d7f966e8432ffcbd75eb42153d333f99bff73c782c172667636 *131313b9fdae4772e51f7f2d77dfff64962d19cee67bb7e57ffec54df9f6ad0f64cf9ef13c3bff *59c367c7a7b27bcf785acd46b6dcbb2db7dff568c6c7c7f3cdef3f90cdf76ecb776f7f30e3e3e3 *f9de9d0f65d33d4f64e9582b131313f9ed3fb93ed7de7877b63fb337cb978e64eb0fb6e7e37f78 *5dbebfe9c14c4c4ce4be07b767f3bd4fe477fff2a67ce7b687b2777c3233f3036abbddceb3cf8e *e777fefcebf9ceed0fe5c8d5cb72da86230f1ae300002f6e9ffef4a73f92fd07bfde0b71741de8 *b46f67f0eb9efefde8473ffa9e0f7de843fb7f8fdcfc3fbffacdfbb372f96876ec9ac81d773f91 *2439e9f835191e6ee5fcb38ee90e5a9bee7922776c7d22cd6623679fba766e209cdfc9dd3f782a *575dbb399353b3b973ebdcaadeba239667e9d87071d0fcd99f3a3b1f7ff8e96cdfb1375fbcfeee *7cf1fabbb3746c38af3cffb8bcf6e213b37ce9c882e1af37bab8fb81a772d5b55b32353d9b3bef *993fd6912bb27cd9e87e5f2bd3b1ee88e5b9e8dc6373d32d0fe595e71d9b99f97d774e0f7fe1ab *9b93246fbffcec5cb0f198dcb2e9b17cf2aaefe7da1bb7e63dbf706176ee1ecf35d7df9d4b2e38 *21afbdf8c4dc76d7e3f9876fdc9b7b1fdc9edd7bd6e7d16dbbb27ce970ee7fe8e94c4c4ce4de07 *9f4a929cbe614d36ddf358eeb8fb89ac5c369a5f7bd7abb272c568aef9ea96fcddd7b6e6735fd9 *94138f3d2cb3f3af75d992e1bce3975e99756b96e7d9897da77d3f75cd6db9fbfeedd978dababc *fdcd2fddefab729cf605802a353237fcf5ce6ec545be03051f9dfbde21f0808fbef9cec7ba9b56 *2c1bcd452f3d3a6fbaf4cc349bcdee0076dd37efcb67feeeb6341a8dfcc25bcecdb225230b868e *071fdb99071fdb39f7e25acd9c7dea5179ebebcf4e92fcebf7ff5577ff2b978fe67f7ce82d39e6 *a855f9c87b5f97ef6d7a249bb63e91bbeedf9e1dbb26f2f737de9b7b1e7c3aef7bc745dd55bb7e *0f3db62b0f3db6ab7bac8da7adcbbf7ce379dd08a21398349bcdee7b6c341b79e3ab4fce77ef78 *34575dbb252f3ffbe82473a754676666f2c81373fbbb63ebb66cb97f7bf774f13d0f3c5d5c613b *e52587a7d96ce4fe8777e4e1c7766676b69d0b361e937ff8c6fd7966e7de3cf4d83359bf764556 *2c1bc9376f7d284972ea863559b56234ed763b2f3bfbe8fcddd7b6e6070fefe89e824e9237fcb3 *9373ca4b8e985bed9b1ffe1ed9b63b0f3d3ef7fa7ef25527eff7994400a04e6f7ef39b3f76d555 *570d65e1e7fc7a6f5d07fa92e7de273493b4def7bef7fd61925f2d7d297292bcedb27372f4da55 *59b16c341b8e5b93a1a1b9dd7756973e73cdadb9f6a67bb274c970fecd5bcfcf39a71eb55facf0 *b2b3d6e7d53f764286878772d2f14764e992d1f9412c59ba64feac733b593236922479e0d16732 *3b33938bce3d2e179c734c66666672eb96c7f3479ffd5eee7df0e9ecdc3d3177ce380bbf5a2549 *ce3ff3e8bce6820d191e1eca2927accdf2654b323232d27ddd9da1a8f739cd6633ab572dcdeb2e *de902fdeb075df4ad9fcdf636272ee34f0def1a9f9c33672fa863549a391761a6936177ebfdf92 *b1916c38f6b0dcf3c0d3b9eb07db33363a94979d7954fee11bf7e7dbb73f9aa9e9d99c71d21149 *9289c9b9e16ef9d291eedf7cd9fcdf647a7a36b33df3db11872febfeb769353b914c3ba323ad4c *4ccee4735fd99c334f596fe803801f01b3b3b39dd5bede55bfe2e9bc83adfc757e6e2469b4dbed *05cb879d48a0f3e0934f383227bfe4c805dfc99724d3d3d3f9d20d9b73ed4df764fdda15f995b7 *5f9423562f5d303c76ee8f387c59ce3de3d8fdbe73afd168e4cfaefc85ee40d6f9fcdfc7fff0fa *8c4f4ce783bf7c498e59bb224972f6a94775879ce1e1a105dfa1373c3c9c56cfb1369e7e4c8687 *87bbf5ebf0f07077d5af733ab477f81b6acd3dee275f756abe7ef383f9c123cf2cf85b1cb17a69 *1eddb63b975e7842ce3c796d6666db79e09167323c3c94b1d19105ef77686828ed763b679eb436 *f73cf074be71cbc339fee895397aedca8c8eb472d32d732b7d679f72545aad568e3e722e68b9fb *074f75bfecfade07772449d6ac5e9ad191e1eeeb1c9eff6ec42469cddfaf5c3e9a0fbcf315f9f8 *1f7d3d5bee7b32dfbbf391bcf2e5272ff2bf0000508bf919ad54f7ee37001e68e5aff7090b9ed8 *7b358c56abd55d591b1919c9e8e8e88281ad33ac7df96b777577f5e79ffb5e77973fb6f1b8bcf6 *e293f7ad52b55addd5b7cefe7bbf70b933947556ce2e3eef847cf51b5bf3dffee0fa9c7bdad139 *f2f0a5b973eb1399989cc919271e99d5ab96752bd666b399e1e1e134e7ffdd6ab5323a3adafd12 *e9cee0d719ac3ac76cb55a6936e65ec3d0d050464747333c3c9c9f7efd59f9d3ab6e5ef0ba2f3c *f7b8fcedb59b72f557efced3bb2673db5d8fe7ceaddb72c9051b72fa49eb323a32b75277fbdd4f *64c3716b72fa8947e69cd38ecee7bfba25db9ede9bf3cf5a9f25636379c9fac372d7fddb3332dc *ca99a71c9d91e1a15cb0f1f8fccd97efc8c38fefcc7fffd39bb2e1d8d5b9e1dbf725492ebde8c4 *8c8c8cec1b528787333232774a7d64fe2b5d0e5b31967547aeca9b2e3d3d9ffac2adf9d4176ec9 *85e79d98b1c29744fbec1f00d4e39a6baef94092773e97c71ea8f6ddcf273ef1897fdb7bcab7b3 *3ad74867b5696ee0181919e9aea6b55aadecd8359eedf35f02fdc8133bb3f9de27b3f9de6dd97c *efb66cdbbe27232323dd5393ad66abbb8fce7e0e747be7bfb830afbdf894248ddc7ce723f9f23f *6ecd838fedccf9671d937ffff3177787bb646ef8eb0ca7c9dc2a5eefb17a571a7b6f4343fb560f *3bc3dfd8d8585efb8ad372ecba55dded63636379d3a567e5d28b4fcaa3db76e7335fbc3d776edd *96979eb13effeaf2f332323292979df3922c5f369a4df73c911bbe737f46474773da894765e9d8 *dc8076ea8947656c6c2c271d3f77aaf78c938fcaf2654b333a3a9a65cb96e4fdbff49a1c75c4f2 *dc75df93f9f2d7eeceb3e3d379c3ab4ecd1b5e7d46464747bba7958787f7fdb718199d3b4ddc68 *36333636969f78d51939ea88e57962fbee7ce986cd8774693900a06ea5cbbbf55ed26d59925549 *0e4bb2666464e493e3e3e3cb7bafebdbb94ff6ad08f69e26edbf0c5befb57bfb2f6dd63b70f55f *7e2c59f805c7bdc79e9e9ece9ebde379fcc95d999c9aceda352bb272f9d87e434dfff5747baf70 *d1bb5ad93956e7b46fe758bd556cefef7b57093bf77b9f9dcc634feeca91872fcfaa154b165c42 *6d666636bbf74e6478a8952563c3c57df45fa3b8b38ada791d4f6cdf9d9dbbc7b37eed8aeea5f4 *faffa6bdff0dfa5f6bef60dbfbfe5def1700eaf396b7bce5bf5c7df5d57726d99e6447929d4976 *27793673977a9bca01aef0b1a8f7bef7bd7f94e4bdfdd7a2edfdb93f02e91db83a9715eb7d6cff *adff8a178b5d27b7f305ccbd43ccca15cb169cb25c6c90e95fbd3cd0f56d7b87a5fe216db1c12f *4946474773f8ea950b8ed7f9b9dd6e676c6c74c16b2a8517fdafa977e83cf6e891058fed7f0fa5 *e7f55f16aef7fdf75f960e00f8d17448c35f47ffaa54ffef7a878ede95a8035d96acffe7c586b1 *d2f37abf4aa677f85bec74e6c18ed5ffb84e00d23fa0f50f7cfd3f97f675a8fa9f77b0cbbb2d36 *c0f5bfc6d2caa2a10f007ef41d72f0d159b9ea3d15b9df93fa56b97a878dfec7f70f2b071af67a *7586c9ce317a571b9fcbf30f76acfef778a061eab96c3fd86b79ae4a83e66203df627ff3d2630c *7e0050af43093e0ef699bfe5495626599de4f09191914f4e4c4c2c4f0e3ee4f47b2e03c8a1fcee *b9acb61d6cdf077bec3ff53bf09eefd5bfe7b2ffe76bdf864000a8cfd0d0d0ce99999977e679f8 *cc5fbbefbeeb508784e77ba8e85fad5b6c45f1f93ac6ff8be7bd58f60f00d4e5b2cb2ebbf2eaab *af7e4e8f3da4af7a990f3e5e940ef4d93d0000e61cd2f0070040dd0e36fc15aff00100c08bc77c *f0f19c1cf2153e0efde50000f06271b0e16fd1e00300801787cb2ebbeccae7fad81f99e0030080 *83137c00000c10c1070040e5041f000014093e00002a27f80000a048f001003040041f00009513 *7c00005024f80000a89ce003008022c10700c000117c0000544ef001004091e00300a072820f00 *008a041f00000344f001005039c107000045820f0080ca093e000028127c00000c10c1070040e5 *041f000014093e00002a27f80000a048f001003040041f000095137c00005024f80000a89ce003 *008022c10700c000117c0000544ef001004091e00300a072820f00008a041f00000344f0010050 *39c107000045820f0080ca093e000028127c00000c10c1070040e5041f000014093e00002a27f8 *0000a048f001003040041f000095137c00005024f80000a89ce003008022c10700c000117c0000 *544ef001004091e00300a072820f00008a041f00000344f001005039c107000045820f0080ca09 *3e000028127c00000c10c1070040e5041f000014093e00002a27f80000a048f001003040041f00 *0095137c00005024f80000a89ce003008022c10700c000117c0000544ef001004091e00300a072 *820f00008a041f00000344f001005039c107000045820f0080ca093e000028127c00000c10c107 *0040e5041f000014093e00002a27f80000a048f001003040041f000095137c00005024f80000a8 *9ce003008022c10700c000117c0000544ef001004091e00300a072820f00008a041f00000344f0 *01005039c107000045820f0080ca093e000028127c00000c10c1070040e5041f000014093e0000 *2a27f80000a048f001003040041f000095137c00005024f80000a89ce003008022c10700c00011 *7c0000544ef001004091e00300a072820f00008a041f00000344f001005039c107000045820f00 *80ca093e000028127c00000c10c1070040e5041f000014093e00002a27f80000a048f001003040 *041f000095137c00005024f80000a89ce003008022c10700c000117c0000544ef001004091e003 *00a072820f00008a041f00000344f001005039c107000045820f0080ca093e000028127c00000c *10c1070040e5041f000014093e00002a27f80000a048f001003040041f000095137c00005024f8 *0000a89ce003008022c10700c000117c0000544ef001004091e00300a072820f00008a041f0000 *0344f001005039c107000045820f0080ca093e000028127c00000c10c1070040e5041f00001409 *3e00002a27f80000a048f001003040041f000095137c00005024f80000a89ce003008022c10700 *c000117c0000544ef001004091e00300a072820f00008a041f00000344f001005039c107000045 *820f0080ca093e000028127c00000c10c1070040e5041f000014093e00002a27f80000a048f001 *003040041f000095137c00005024f80000a89ce003008022c10700c000117c0000544ef0010040 *91e00300a072820f00008a041f00000344f001005039c107000045820f0080ca093e000028127c *00000c10c1070040e5041f000014093e00002a27f80000a048f001003040041f000095137c0000 *5024f80000a89ce003008022c10700c000117c0000544ef001004091e00300a072820f00008a04 *1f00000344f001005039c107000045820f0080ca093e000028127c00000c10c1070040e5041f00 *0014093e00002a27f80000a048f001003040041f000095137c00005024f80000a89ce003008022 *c10700c000117c0000544ef001004091e00300a072820f00008a041f00000344f001005039c107 *000045820f0080ca093e000028127c00000c10c1070040e5041f000014093e00002a27f80000a0 *48f001003040041f000095137c00005024f80000a89ce003008022c10700c000117c0000544ef0 *01004091e00300a072820f00008a041f00000344f001005039c107000045820f0080ca093e0000 *28127c00000c10c1070040e5041f000014093e00002a27f80000a048f001003040041f00009513 *7c00005024f80000a89ce003008022c10700c000117c0000544ef001004091e00300a072820f00 *008a041f00000344f001005039c107000045820f0080ca093e000028127c00000c10c1070040e5 *041f000014093e00002a27f80000a048f001003040041f000095137c00005024f80000a89ce003 *008022c10700c000117c0000544ef001004091e00300a072820f00008a041f00000344f0010050 *39c107000045820f0080ca093e000028127c00000c10c1070040e5041f000014093e00002a27f8 *0000a048f001003040041f000095137c00005024f80000a89ce003008022c10700c000117c0000 *544ef001004091e00300a072820f00008a041f00000344f001005039c107000045820f0080ca09 *3e000028127c00000c10c1070040e5041f000014093e00002a27f80000a048f001003040041f00 *0095137c00005024f80000a89ce003008022c10700c000117c0000544ef001004091e00300a072 *820f00008a041f00000344f001005039c107000045820f0080ca093e000028127c00000c10c107 *0040e5041f000014093e00002a27f80000a048f001003040041f000095137c00005024f80000a8 *9ce003008022c10700c000117c0000544ef001004091e00300a072820f00008a041f00000344f0 *01005039c107000045820f0080ca093e000028127c00000c10c1070040e5041f000014093e0000 *2a27f80000a048f001003040041f000095137c00005024f80000a89ce003008022c10700c00011 *7c0000544ef001004091e00300a072820f00008a041f00000344f001005039c107000045820f00 *80ca093e000028127c00000c10c1070040e5041f000014093e00002a27f80000a048f001003040 *041f000095137c00005024f80000a89ce003008022c10700c000117c0000544ef001004091e003 *00a072820f00008a041f00000344f001005039c107000045820f0080ca093e000028127c00000c *10c1070040e5041f000014093e00002a27f80000a048f001003040041f000095137c00005024f8 *0000a89ce003008022c10700c000117c0000544ef001004091e00300a072820f00008a041f0000 *0344f001005039c107000045820f0080ca093e000028127c00000c10c1070040e5041f00001409 *3e00002a27f80000a048f001003040041f000095137c00005024f80000a89ce003008022c10700 *c000117c0000544ef001004091e00300a072820f00008a041f00000344f001005039c107000045 *820f0080ca093e000028127c00000c10c1070040e5041f000014093e00002a27f80000a048f001 *003040041f000095137c00005024f80000a89ce003008022c10700c000117c0000544ef0010040 *91e00300a072820f00008a041f00000344f001005039c107000045820f0080ca093e000028127c *00000c10c1070040e5041f000014093e00002a27f80000a048f001003040041f000095137c0000 *5024f80000a89ce003008022c10700c000117c0000544ef001004091e00300a072820f00008a04 *1f00000344f001005039c107000045820f0080ca093e000028127c00000c10c1070040e5041f00 *0014093e00002a27f80000a048f001003040041f000095137c00005024f80000a89ce003008022 *c10700c000117c0000544ef001004091e00300a072820f00008a041f00000344f001005039c107 *000045820f0080ca093e000028127c00000c10c1070040e5041f000014093e00002a27f80000a0 *48f001003040041f000095137c00005024f80000a89ce003008022c10700c000117c0000544ef0 *01004091e00300a072820f00008a041f00000344f001005039c107000045820f0080ca093e0000 *28127c00000c10c1070040e5041f000014093e00002a27f80000a048f001003040041f00009513 *7c00005024f80000a89ce003008022c10700c000117c0000544ef001004091e00300a072820f00 *008a041f00000344f001005039c107000045820f0080ca093e000028127c00000c10c1070040e5 *041f000014093e00002a27f80000a048f001003040041f000095137c00005024f80000a89ce003 *008022c10700c000117c0000544ef001004091e00300a072820f00008a041f00000344f0010050 *39c107000045820f0080ca093e000028127c00000c10c1070040e5041f000014093e00002a27f8 *0000a048f001003040041f0000957b3e838f059ff9137c0000d46db1e1afddf7733ba20f008017 *a5cb2fbffce34966b3ffdcb6dffc76a095bff6fc4e3ab7e9f7bffffdbffffcbe5400007e58cd66 *732673f35ae77ed185bbd2f0d73f31767634d36ab5669ef7570b00c00f657ef89bc9c239ae3800 *0e2db28fce837ba7c8e91b6fbcf1a1e5cb973f9ba471e595575e3f3d3d3d3c3d3d3dfcc10f7ef0 *c224f9f0873ffcbd76bbdd4892dff88ddf7869925c71c515b774766a9b6db6d9669b6db6254dbb *170000023349444154d966dba16f6b341aed24f9f0873f7c5e92f6c73ef6b1af0f0d0d4d8d8e8e *8ebffbddeffe89bd7bf7fe7a929f4b329d85676e93be01b0bfe26d246925199dbf2d49b22cc98a *24ab921c367fbf627efb92f9c78d646e906c14f60900c00fa7b33037357f9b48f26c925d497627 *7926c98e243be7b7ed49b237c9e4fc633bab828baefc75a6c5ce1262e720e3991bf49af3bf9f9e *df3e3cbf2fdf1b0800f0c2e89dcb263337fced9dbf8dcf6f9bcadc7cd6397b3bdbbf93d2f0d799 *2c3bc35fef84b937732b7bbd83dfe8fc7e5ab1f20700f042e8fd485e6706ebacfeed9dbf1f9fdf *d63bfcedf7b9bffee1af3ff298cedc14d959d5eb1ffc3aa77b3bc35f62f8030078bef52ece4d67 *df8c369eb9c1af33fc7556053b9ffd7b4ec14769e56fbce77733d9b7d43894b953beadec7fcab7 *d1f31cdb6cb3cd36db6cb3cd36db7ef86dbdf3596700ecac028ecfdffa4ffbb67bf7b1d8f0d7fd *6ebfbe8377b68d646ee0ebacf8b57a1ef342bd59db6cb3cd36db6cb3cdb641dfd6db657486bcc9 *c2adb7faed7dfe01bfeaa5f301c1c6fc4e3adb3aa77c3ba7827b57fd041f00002f8cd99efbfe01 *703afb3a8d4e187248a77d1b3d07e83d673c937dc35ee7bef359c0f4dc0300f0fc6b67df825c3b *fbe6b4cec077c8dff3d7ab7735af746bccdf3a8f33f80100bcb03a835cef67f96617b9a5e7beeb *60035bb3efe7d2e95dc31f00c00bafddf773ef20d8b92f6d5fe0b90e6c9d55bee7b20d0080e7df *7e9fdfcbc261afa338f401000000000000f023e1ff02c8ba460b222eea610000000049454e44ae *426082 newhex * rmfile ./images/P2PThorTitle.png addfile ./media_sessions.phtml hunk ./media_sessions.phtml 1 + "CDRTool_Session", + "auth" => "CDRTool_Auth", + "perm" => "CDRTool_Perm" + )); + +$perm->check("statistics"); + +$title="Media sessions"; +include("header.phtml"); + +global $CDRTool; +if (strlen($CDRTool['filter']['domain'])) $allowedDomains=explode(' ',$CDRTool['filter']['domain']); + +require("media_sessions_lib.phtml"); + +$layout = new pageLayoutLocal(); +$layout->showTopMenu($title); + +if ($_REQUEST['datasource']) { + $datasources=array($_REQUEST['datasource']); +} else { + $datasources=array_keys($DATASOURCES); +} + +foreach ($datasources as $datasource) { + if (in_array($datasource,$CDRTool['dataSourcesAllowed'])) { + if ($DATASOURCES[$datasource]['mediaDispatcher']) { + printf ("

%s

",$DATASOURCES[$datasource]['name']); + + $filters=array('user'=>$_REQUEST['user']); + + $MediaSessions = new MediaSessions($DATASOURCES[$datasource]['mediaDispatcher'],$allowedDomains,$filters); + $MediaSessions->show(); + } + + if ($DATASOURCES[$datasource]['mediaServers']){ + printf ("

%s

",$DATASOURCES[$datasource]['name']); + $MediaSessions = new MediaSessions1($DATASOURCES[$datasource]['mediaServers'],$allowedDomains); + $MediaSessions->show(); + } + } +} + +page_close(); +?> addfile ./media_sessions_lib.phtml hunk ./media_sessions_lib.phtml 1 +userAgentImages = $userAgentImages; + + $this->filters = $filters; + $this->allowedDomains = $allowedDomains; + + list($ip,$port) = explode(":",$dispatcher); + + $this->dispatcher_ip = $ip; + + if ($port) $this->dispatcher_port = $port; + + return $this->getSessions(); + + } + + function getSessions () { + + if (!$this->dispatcher_ip) return false; + if (!$this->dispatcher_port) return false; + + if ($fp = fsockopen ($this->dispatcher_ip, $this->dispatcher_port, $errno, $errstr, $this->timeout)) { + + if (!count($this->allowedDomains)) { + fputs($fp, "summary\r\n"); + + while (!feof($fp)) { + $line = fgets($fp); + + if (preg_match("/^\r\n/",$line)) { + break; + } + + $this->relays[] = json_decode($line); + } + } + + fputs($fp, "sessions\r\n"); + + while (!feof($fp)) { + $line = fgets($fp); + + if (preg_match("/^\r\n/",$line)) { + break; + } + + $line=json_decode($line); + + if (count($this->allowedDomains)) { + list($user1,$domain1)=explode("@",$line->from_uri); + list($user2,$domain2)=explode("@",$line->to_uri); + if (!in_array($domain1,$this->allowedDomains) && !in_array($domain2,$this->allowedDomains)) { + continue; + } + } + + if (strlen($this->filters['user'])) { + $user=$this->filters['user']; + if (preg_match("/$user/",$line->from_uri) || + preg_match("/$user/",$line->to_uri) + ) { + $this->sessions[] = $line; + } + + } else { + $this->sessions[] = $line; + } + + } + + fclose($fp); + return true; + + } else { + printf ("

Error connecting to %s:%s: %s (%s) \n",$this->dispatcher_ip,$this->dispatcher_port,$errstr,$errno); + return false; + } + } + + function showSearch() { + printf ("

+ + +

+ ", + $_SERVER['PHP_SELF'], + $_REQUEST['user'] + ); + } + + function showHeader() { + print " + + + Media sessions + + + + + "; + } + + function showFooter() { + print ""; + print " + + + "; + } + + function show() { + + $this->showHeader(); + + print "

Media sessions

"; + + $this->showSearch(); + + if (!count($this->allowedDomains)) { + $this->showRelays(); + } + + $this->showSessions(); + + $this->showFooter(); + } + + function showRelays() { + + print " + + + + + + + + + + + + + + + + + + "; + + $i = 1; + + foreach ($this->relays as $relay) { + + unset($media_types); + + foreach ($relay->stream_count as $key => $value) { + $media_types++; + } + + if ($media_types > 1) { + $streams = "
AddressVersionUptimeRelayed trafficSessionsStreamsStatus
"; + + foreach ($relay->stream_count as $key => $value) { + $streams .= sprintf("",$key,$value); + } + + $streams .= "
%s%s
"; + } else { + foreach ($relay->stream_count as $key => $value) { + $streams=sprintf("%s %s",$key,$value); + } + } + + printf (" + + %d + + %s + + %s + + %s + + %s + + %d + + %s + + %s + ", + $i, + $relay->ip, + $relay->version, + $this->normalizeTime($relay->uptime), + $this->normalizeTraffic($relay->bps_relayed), + $relay->session_count, + $streams, + ucfirst($relay->status) + ); + + $i++; + } + + print " + +
+ "; + } + + function showSessions () { + print " + + + + + + + + + + + + + + + + + + + "; + + $i = 1; + foreach ($this->sessions as $session) { + $from = $session->from_uri; + $to = $session->to_uri; + $fromAgent = $session->caller_ua; + $toAgent = $session->callee_ua; + $fromImage = $this->getImageForUserAgent($fromAgent); + $toImage = $this->getImageForUserAgent($toAgent); + $sc = count($session->streams); + + print " + + + + + "; + + $duration = $this->normalizeTime($session->duration); + + foreach ($session->streams as $streamInfo) { + $status = $streamInfo->status; + + if ($status=="idle" || $status=='hold') { + $idletime = $this->normalizeTime($streamInfo->timeout_wait); + $status = sprintf("%s %s", $status, $idletime); + } + + $caller = $streamInfo->caller_remote; + $callee = $streamInfo->callee_remote; + $relay_caller = $streamInfo->caller_local; + $relay_callee = $streamInfo->callee_local; + + $codec = $streamInfo->caller_codec; + $type = $streamInfo->media_type; + + if ($caller == '?.?.?.?:?') { + $caller = '–'; // a dash + $align1 = 'center'; + } else { + $align1 = 'left'; + } + if ($callee == '?.?.?.?:?') { + $callee = '–'; // a dash + $align2 = 'center'; + } else { + $align2 = 'left'; + } + if ($codec == 'Unknown') + $codec = '–'; // a dash + if ($type == 'Unknown') + $type = '–'; // a dash + $bytes_in1 = $this->normalizeBytes($streamInfo->caller_bytes); + $bytes_in2 = $this->normalizeBytes($streamInfo->callee_bytes); + print " + + + + + + + + + + + + "; + } + $i++; + } + print " +
 CallersPhonesMedia Streams
Caller addressRelay callerRelay calleeCallee addressStatusCodecTypeDurationBytes
Caller
Bytes
Called
$i + From: $from
+ To: $to
+
+ \"$fromAgent\" + + \"$toAgent\" + $caller$relay_caller$relay_callee$callee$status$codec$type$duration$bytes_in1$bytes_in2
+
"; + + } + + function normalizeBytes($bytes) { + $mb = $bytes/1024/1024.0; + $kb = $bytes/1024.0; + if ($mb >= 0.95) { + return sprintf("%.2fM", $mb); + } else if ($kb >= 1) { + return sprintf("%.2fk", $kb); + } else { + return sprintf("%d", $bytes); + } + } + + function normalizeTime($period) { + $sec = $period % 60; + $min = floor($period/60); + $h = floor($min/60); + $min = $min % 60; + + if ($h >= 1) { + return sprintf('%dh%02d\'%02d"', $h, $min, $sec); + } else { + return sprintf('%d\'%02d"', $min, $sec); + } + } + + function normalizeTraffic($traffic) { + // input is in bytes/second + $mb = $traffic/1024/1024.0; + $kb = $traffic/1024.0; + if ($mb >= 0.95) { + return sprintf("%.2fMbps", $mb); + } else if ($kb >= 1) { + return sprintf("%.2fkbps",$kb); + } else { + return sprintf("%dbps",$traffic); + } + } + + function getImageForUserAgent($agent) { + + foreach ($this->userAgentImages as $agentRegexp => $image) { + if (preg_match("/$agentRegexp/i", $agent)) { + return $image; + } + } + + return "unknown.png"; + } +} + +class MediaSessions1 { + function MediaSessions1 ($servers=array(),$allowedDomains=array()) { + $this->servers = $servers; + $this->allowedDomains = $allowedDomains; + global $userAgentImages; + require_once("phone_images.php"); + $this->userAgentImages = $userAgentImages; + } + + function isDomainAllowed($from,$to) { + $els = explode("@",$from); + $fromDomain = $els[1]; + $els = explode("@",$to); + $toDomain = $els[1]; + + if (count($this->allowedDomains)) { + if (in_array($fromDomain,$this->allowedDomains) || in_array($toDomain,$this->allowedDomains)) { + return 1; + } else { + return 0; + } + } else { + return 1; + } + } + + function normalizeBytes($bytes) { + $mb = $bytes/1024/1024.0; + $kb = $bytes/1024.0; + if ($mb >= 0.95) { + return sprintf("%.2fM", $mb); + } else if ($kb >= 1) { + return sprintf("%.2fk", $kb); + } else { + return sprintf("%d", $bytes); + } + } + + function normalizeTime($period) { + $sec = $period % 60; + $min = floor($period/60); + $h = floor($min/60); + $min = $min % 60; + + if ($h >= 1) { + return sprintf('%dh%02d\'%02d"', $h, $min, $sec); + } else { + return sprintf('%d\'%02d"', $min, $sec); + } + } + + function normalizeTraffic($traffic) { + // input is in bytes/second + $traffic = $traffic * 8; + $mb = $traffic/1024/1024.0; + $kb = $traffic/1024.0; + if ($mb >= 0.95) { + return sprintf("%.2fMbps", $mb); + } else if ($kb >= 1) { + return sprintf("%.2fkbps",$kb); + } else { + return sprintf("%dbps",$traffic); + } + } + + function getImageForUserAgent($agent) { + + foreach ($this->userAgentImages as $agentRegexp => $image) { + if (preg_match("/$agentRegexp/i", $agent)) { + return $image; + } + } + + return "unknown.png"; + } + + function getRTPSessions($ip, $port) { + if ($fp = fsockopen ($ip, $port, $errno, $errstr, "3") ) { + fputs($fp, "status\n"); + $proxy = array('status' => 'Ok'); + $crtSession = 'None'; + while (!feof($fp)) { + $line = fgets($fp, 2048); + $elements = explode(" ", $line); + if ($elements[0] == 'version' && count($elements)==2) { + $proxy['version'] = $elements[1]; + } else if ($elements[0] == 'proxy' && count($elements)==3) { + $proxy['sessionCount'] = $elements[1]; + $traffic = explode("/", $elements[2]); + $proxy['traffic'] = array('caller' => $traffic[0], + 'called' => $traffic[1], + 'relayed' => $traffic[2]); + $proxy['sessions'] = array(); + } else if ($elements[0]=='session' && count($elements)==7) { + if ($this->isDomainAllowed($elements[2],$elements[3])) { + $crtSession = $elements[1]; + $info = array('from' => $elements[2], + 'to' => $elements[3], + 'fromAgent' => quoted_printable_decode($elements[4]), + 'toAgent' => quoted_printable_decode($elements[5]), + 'duration' => $elements[6], + 'streams' => array()); + $proxy['sessions'][$crtSession] = $info; + $allowed_session=1; + } else { + unset($allowed_session); + } + } else if ($elements[0] == 'stream' && count($elements)==9) { + if (!$allowed_session) continue; + $stream = array('caller' => $elements[1], + 'called' => $elements[2], + 'via' => $elements[3], + 'bytes' => explode("/", $elements[4]), + 'status' => $elements[5], + 'codec' => $elements[6], + 'type' => $elements[7], + 'idletime' => $elements[8]); + $proxy['sessions'][$crtSession]['streams'][] = $stream; + } else { + //print "Invalid line: '$line'
\n"; + } + } + fclose($fp); + + if (!isset($proxy['version'])) { + if ($fp = fsockopen ($ip, $port, $errno, $errstr, "2") ) { + fputs($fp, "version\n"); + $line = fgets($fp, 2048); + $version = trim($line); + if (!$version) + $version = 'unknown'; + $proxy['version'] = $version; + fclose($fp); + } + } + + return $proxy; + } else { + return array('status' => "$errstr"); + } + } + + function haveSessions() { + foreach ($this->servers as $server) { + if ($this->sessions[$server]['sessionCount'] > 0) { + return True; + } + } + + return False; + } + + function showSummary() { + // IE seems to ignore border on elements + // that's why we used bordertb on and + print " + + + + + + + + + + + + + + + + + + "; + + $i = 1; + foreach ($this->servers as $server) { + list($ip, $port) = explode(":", $server); + $sessionInfo = $this->sessions[$server]; + $status = $sessionInfo['status']; + if ($status=='Ok') + $version = $sessionInfo['version']; + else + $version = " "; + if ($status!='Ok' || $sessionInfo['sessionCount'] == 0) { + $caller = " "; + $called = " "; + $relayed = " "; + $sessionCount = " "; + } else { + $caller = $this->normalizeTraffic($sessionInfo['traffic']['caller']); + $called = $this->normalizeTraffic($sessionInfo['traffic']['called']); + $relayed = $this->normalizeTraffic($sessionInfo['traffic']['relayed']); + $sessionCount = $sessionInfo['sessionCount']; + } + print " + + + + + + + + + + + + + + + + + "; + $i++; + } + + print " +
ServerVersionCaller trafficCalled trafficRelayed trafficSessionsStatus
$i$ip$version$caller$called$relayed$sessionCount$status
+
+ "; + } + + function showSessions() { + + if ($this->haveSessions($this->servers, $sessions)) { + print " + + + + + + + + + + + + + + + + + + + "; + + $i = 1; + foreach ($this->servers as $server) { + $serverSessions = $this->sessions[$server]['sessions']; + foreach ($serverSessions as $id => $sessionInfo) { + $sc = count($sessionInfo['streams']); + $from = $sessionInfo['from']; + $to = $sessionInfo['to']; + $fromAgent = $sessionInfo['fromAgent']; + $toAgent = $sessionInfo['toAgent']; + $fromImage = $this->getImageForUserAgent($fromAgent); + $toImage = $this->getImageForUserAgent($toAgent); + print " + + + + + "; + $duration = $this->normalizeTime($sessionInfo['duration']); + foreach ($sessionInfo['streams'] as $streamInfo) { + $status = $streamInfo['status']; + if ($status=="idle" || $status=='hold') { + $idletime = $this->normalizeTime($streamInfo['idletime']); + $status = sprintf("%s %s", $status, $idletime); + } + $caller = $streamInfo['caller']; + $called = $streamInfo['called']; + $via = $streamInfo['via']; + $codec = $streamInfo['codec']; + $type = $streamInfo['type']; + if ($caller == '?.?.?.?:?') { + $caller = '–'; // a dash + $align1 = 'center'; + } else { + $align1 = 'left'; + } + if ($called == '?.?.?.?:?') { + $called = '–'; // a dash + $align2 = 'center'; + } else { + $align2 = 'left'; + } + if ($codec == 'Unknown') + $codec = '–'; // a dash + if ($type == 'Unknown') + $type = '–'; // a dash + $bytes_in1 = $this->normalizeBytes($streamInfo['bytes'][0]); + $bytes_in2 = $this->normalizeBytes($streamInfo['bytes'][1]); + $bytes_rel = $this->normalizeBytes($streamInfo['bytes'][2]); + print " + + + + + + + + + + + "; + } + $i++; + } + } + print " +
 CallPhonesMedia Streams
Caller addressCalled addressVia addressStatusCodecTypeDurationBytes
Caller
Bytes
Called
Bytes
Relayed
$i + From: $from
+ To: $to
+
+ \"$fromAgent\" + + \"$toAgent\" + $caller$called$via$status$codec$type$duration$bytes_in1$bytes_in2$bytes_rel
+
"; + } + + } + + function showHeader() { + print " + + + Media Sessions + + + + + +

Media Sessions

+ + "; + } + + function show() { + $this->sessions = array(); + + foreach ($this->servers as $server) { + list($ip, $port) = explode(":", $server); + if (!$port) + $port = "25060"; + $this->sessions[$server] = $this->getRTPSessions($ip, $port); + } + + print "

Media sessions

"; + + $this->showSessions(); + + if (!count($this->allowedDomains)) { + $this->showSummary(); + } + } +} + +?> hunk ./phplib/local.inc 734 - print " | Registrar"; - print " | Sessions"; + print " | Registrar"; + print " | Sessions"; hunk ./setup/global.inc.in 230 - "purgeCDRsAfter" => 120 // how many days to keep old CDRs + "purgeCDRsAfter" => 120 // how many days to keep old CDRs + "mediaDispatcher" => "10.0.0.1", + "mediaServers" => array( + "10.0.0.2", + "10.0.0.3" + ) hunk ./setup/global.inc.new.installation 156 + "mediaDispatcher" => "10.0.0.1", addfile ./sip_login.phtml hunk ./sip_login.phtml 1 + + + + +"; +print _("Login"); +print ""; +print "

"; +print _("Use your own SIP account credentials. "); +print _("Example"); + +if ($example_domain) { + print ": account@$example_domain"; +} else { + print ": account@example.com"; +} + +?> + + + + +"; + print _("Username"); + print ":"; +?> + + + "; +?> + + + > + + + +hidden_session(); ?> + + + + + + +
auth["uname"] ?>" + size=35 maxlength=50> + +
"; + print _("Password"); + print ":
+
+ + + +
+ + "; + + if ( isset($username) ): + print "

"; + + +?> + + + + +

+ + "; + print _("Either your username or your password are invalid"); + + print "
+ +

$login_msg"; + +} +?> + + + + + + +

+ + + + addfile ./sip_logout.phtml hunk ./sip_logout.phtml 1 + "SIP_Subscriber_Session", + "auth" => "SIP_Subscriber_Auth") + ); + + +$loginname=$auth->auth["uname"] ; + +$auth->logout(); +$sess->delete(); + +$title="Logout"; +include("header_sip.phtml"); + +print "

"; +print _("Login"); +print "

"; +print "

"; + +print _("You have been logged in as "); +print " +$loginname +

+"; +print _("You have been logged out"); +print " +
+
+

+Login again +"; + +page_close(); +print " + + +"; +?> addfile ./sip_online.phtml hunk ./sip_online.phtml 1 + "CDRTool_Session", + "auth" => "CDRTool_Auth", + "perm" => "CDRTool_Perm" + )); + +$perm->check("statistics"); + +$title="SIP registrar - online subscribers"; +include("header.phtml"); + +require("cdrlib.phtml"); + +$layout = new pageLayoutLocal(); +$layout->showTopMenu($title); + +if ($_REQUEST['datasource']) { + $datasources=array($_REQUEST['datasource']); +} else { + $datasources=array_keys($DATASOURCES); +} + +foreach ($datasources as $datasource) { + + if (in_array($datasource,$CDRTool['dataSourcesAllowed'])) { + if ($DATASOURCES[$datasource]['enableThor'] && $DATASOURCES[$datasource]['thorStatusNode']) { + printf ("

%s

",$DATASOURCES[$datasource]['name']); + + printf (" +

+ + ", + $DATASOURCES[$datasource]['thorStatusNode']); + + } else if ($DATASOURCES[$datasource]['db_class_siponline']){ + printf ("

%s

",$DATASOURCES[$datasource]['name']); + + $online= new SIPonline($datasource,$DATASOURCES[$datasource]['db_class_siponline']); + $online->showAll(); + } + } +} + +page_close(); + +?> hunk ./sip_statistics_lib.phtml 538 -class ThorNetwork { - var $imgsize = 630; - var $demo_node = "node03.dns-hosting.info"; - - function ThorNetwork() { - - if ($fp = fsockopen ($this->demo_node, "2000", $errno, $errstr, 5)) { - fwrite($fp,"get\r\n"); - while(!feof($fp)) { - $json.=fgets ($fp,200000); - } - fclose($fp); - } else { - print "Error: cannot connect.\n"; - exit; - } - - $this->nodes=json_decode(trim($json),1); - } - - function buildImage() { - $img = imagecreatetruecolor($this->imgsize, $this->imgsize); - $white = imagecolorallocate($img, 255, 255, 255); - $black = imagecolorallocate($img, 0, 0, 0); - - imagefill($img, 0, 0, $white); - - $c=count($this->nodes); - imagestring ($img, 5, 20, 20, "SIP UA distribution", $black); - - $cx=$this->imgsize/2; - $cy=$cx; - - $radius=0.7*$cx; - - // Get ThorNode image - $node_img = @imagecreatefrompng('images/Node.png'); - list($nw, $nh) = getimagesize('images/Node.png'); - - // Get ClassicNode image - $cnode_img = @imagecreatefrompng('images/ClassicNode.png'); - list($cnw, $cnh) = getimagesize('images/ClassicNode.png'); - - // Get Cloud Image - $cloud_img = @imagecreatefrompng('images/InternetCloud.png'); - list($cw, $ch) = getimagesize('images/InternetCloud.png'); - - // Get Thor rectangle image - $thor_img = @imagecreatefrompng('images/P2PThorTitle.png'); - list($tw, $th) = getimagesize('images/P2PThorTitle.png'); - - // Get Classic rectangle image - $cthor_img = @imagecreatefrompng('images/ClassicRectangle.png'); - list($ctw, $cth) = getimagesize('images/ClassicRectangle.png'); - - if (count($this->nodes)) { - if (count($this->nodes) > 1) { - imagecopy ($img,$thor_img, $this->imgsize/2-$tw/2, $this->imgsize/2-$th/2-5, 0, 0, $tw, $th); - imagecopy ($img,$cloud_img, $this->imgsize/2-$cw/2, $this->imgsize/2-$ch/2, 0, 0, $cw, $ch); - - $dash=false; - $dashsize=2; - - for ($angle=0; $angle<=(180+$dashsize); $angle+=$dashsize) { - $x = ($radius * cos(deg2rad($angle))); - $y = ($radius * sin(deg2rad($angle))); - - if ($dash) { - imageline($img, $cx+$px, $cy+$py, $cx+$x, $cy+$y, 'black'); - imageline($img, $cx-$px, $cx-$py, $cx-$x, $cy-$y, 'black'); - } - - $dash=!$dash; - $px=$x; - $py=$y; - } - } else { - imagecopy ($img,$cthor_img, $this->imgsize/2-$ctw/2, $this->imgsize/2-$cth/2+50, 0, 0, $ctw, $cth); - } - - $dashsize=360/count($this->nodes); - $j=0; - - $node_names=array_keys($this->nodes); - - for ($angle=0; $angle<360; $angle+=$dashsize) { - - $x = ($radius * cos(deg2rad($angle))); - $y = ($radius * sin(deg2rad($angle))); - - $text = $node_names[$j]; - $px=$x; - $py=$y; - - if (count($this->nodes) > 1) { - if (($angle >= 120 && $angle < 240)) { - imagestring ($img, 3, $cx+$px-70, $cy+$py-60, $text, $black); - } else { - imagestring ($img, 3, $cx+$px-110, $cy+$py-30, $text, $black); - } - imagecopy ($img,$node_img, $cx+$px-$nw/2+7, $cy+$py-$nh/2+5, 0, 0, $nw-20, $nh-20); - } else { - imagecopy ($img,$cnode_img, $this->imgsize/2-$cnw/2-100, $this->imgsize/2-$cnh/2, 0, 0, $cnw, $cnh); - imagestring ($img, 3, $this->imgsize/2-$cnw/2-60, $this->imgsize/2-$cnh/2+220, $text, $black); - } - $j++; - - } - } - - return $img; - } - -} hunk ./status/config/media_dispatcher.php.sample 1 - rmfile ./status/config/media_dispatcher.php.sample hunk ./status/config/media_servers.php.sample 1 - rmfile ./status/config/media_servers.php.sample hunk ./status/config/phone_images.php 1 - "asterisk.png", - "AVM FRITZ" => "avm-fritzbox-wlan.png", - "Cisco ATA" => "cisco-ata.png", - "Cisco.*Gateway" => "cisco.png", - "CSCO" => "cisco-7960.png", - "DrayTek" => "draytek-vigor2600vg.png", - "eStara" => "eStara.png", - "Eyebeam" => "eyebeam.png", - "Grandstream" => "handytone.png", - "ipDialog" => "ipDialog.png", - "Linksys\/PAP" => "linksys-pap2.png", - "Session.*Wave" => "session.png", - "SIPPS" => "sipps.png", - "Sipura" => "spa2000.png", - "sjphone" => "sjphone.png", - "Snom100" => "snom100.png", - "Snom(190|200)" => "snom200.png", - "Snom320" => "snom320.png", - "Snom360" => "snom360.png", - "snomSoft" => "snom360.png", - "Talkin" => "xten.png", - "unidata" => "hitachi-wip5000.png", - "Vizufon" => "vizufon.png", - "voipster" => "zoep.png", - "Windows RTC" => "messenger.png", - "X-Lite" => "xten.png", - "X-PRO" => "xten.png", - "ZyXEL P2000W" => "zyxel-p2000.png", - "-IMVP" => "innomedia-mta5000.png", - "3610\/" => "siemens-3610.png", - "cirpack" => "cirpack.png", - "Brcm Callctrl" => "aastra.png", - "Audiocodes-Sip-Gateway-MP-124" => "audiocodes-mp124.png" - ); - -?> rmfile ./status/config/phone_images.php hunk ./status/media_sessions.phtml 1 - "CDRTool_Session", - "auth" => "CDRTool_Auth", - "perm" => "CDRTool_Perm" - )); - -$perm->check("statistics"); -global $CDRTool; -if (strlen($CDRTool['filter']['domain'])) $allowedDomains=explode(' ',$CDRTool['filter']['domain']); - -########################## -# Generic code starts here -########################## - -set_time_limit (60); -$errorReporting = (E_ALL & ~E_NOTICE); -$errorReporting = 1; // comment this out to enable PHP warnings -error_reporting($errorReporting); - -if (is_readable("config/media_dispatcher.php")) { - include("config/media_dispatcher.php"); -} else { - print "Please copy config/media_dispatcher.php.sample to config/media_dispatcher.php and set up your own dispatcher\n"; - exit; -} - -require("media_sessions_lib.phtml"); - -$filters=array('user'=>$_REQUEST['user']); - -$MediaSessions = new MediaSessions($dispatcher,$filters,$allowedDomains); -$MediaSessions->show(); - -########################## -# Generic code ends here -########################## - -page_close(); -?> rmfile ./status/media_sessions.phtml hunk ./status/media_sessions_lib.phtml 1 -userAgentImages = $userAgentImages; - - $this->filters = $filters; - $this->allowedDomains = $allowedDomains; - - list($ip,$port) = explode(":",$dispatcher); - - $this->dispatcher_ip = $ip; - - if ($port) $this->dispatcher_port = $port; - - return $this->getSessions(); - - } - - function getSessions () { - - if (!$this->dispatcher_ip) return false; - if (!$this->dispatcher_port) return false; - - if ($fp = fsockopen ($this->dispatcher_ip, $this->dispatcher_port, $errno, $errstr, $this->timeout)) { - - if (!count($this->allowedDomains)) { - fputs($fp, "summary\r\n"); - - while (!feof($fp)) { - $line = fgets($fp); - - if (preg_match("/^\r\n/",$line)) { - break; - } - - $this->relays[] = json_decode($line); - } - } - - fputs($fp, "sessions\r\n"); - - while (!feof($fp)) { - $line = fgets($fp); - - if (preg_match("/^\r\n/",$line)) { - break; - } - - $line=json_decode($line); - - if (count($this->allowedDomains)) { - list($user1,$domain1)=explode("@",$line->from_uri); - list($user2,$domain2)=explode("@",$line->to_uri); - if (!in_array($domain1,$this->allowedDomains) && !in_array($domain2,$this->allowedDomains)) { - continue; - } - } - - if (strlen($this->filters['user'])) { - $user=$this->filters['user']; - if (preg_match("/$user/",$line->from_uri) || - preg_match("/$user/",$line->to_uri) - ) { - $this->sessions[] = $line; - } - - } else { - $this->sessions[] = $line; - } - - } - - fclose($fp); - return true; - - } else { - printf ("

Error connecting to %s:%s: %s (%s) \n",$this->dispatcher_ip,$this->dispatcher_port,$errstr,$errno); - return false; - } - } - - function showSearch() { - printf ("

- - -

- ", - $_SERVER['PHP_SELF'], - $_REQUEST['user'] - ); - } - - function showHeader() { - print " - - - Media sessions - - - - - "; - } - - function showFooter() { - print ""; - print " - - - "; - } - - function show() { - - $this->showHeader(); - - print "

Media sessions

"; - - $this->showSearch(); - - if (!count($this->allowedDomains)) { - $this->showRelays(); - } - - $this->showSessions(); - - $this->showFooter(); - } - - function showRelays() { - - print " - - - - - - - - - - - - - - - - - - "; - - $i = 1; - - foreach ($this->relays as $relay) { - - unset($media_types); - - foreach ($relay->stream_count as $key => $value) { - $media_types++; - } - - if ($media_types > 1) { - $streams = "
AddressVersionUptimeRelayed trafficSessionsStreamsStatus
"; - - foreach ($relay->stream_count as $key => $value) { - $streams .= sprintf("",$key,$value); - } - - $streams .= "
%s%s
"; - } else { - foreach ($relay->stream_count as $key => $value) { - $streams=sprintf("%s %s",$key,$value); - } - } - - printf (" - - %d - - %s - - %s - - %s - - %s - - %d - - %s - - %s - ", - $i, - $relay->ip, - $relay->version, - $this->normalizeTime($relay->uptime), - $this->normalizeTraffic($relay->bps_relayed), - $relay->session_count, - $streams, - ucfirst($relay->status) - ); - - $i++; - } - - print " - -
- "; - } - - function showSessions () { - print " - - - - - - - - - - - - - - - - - - - "; - - $i = 1; - foreach ($this->sessions as $session) { - $from = $session->from_uri; - $to = $session->to_uri; - $fromAgent = $session->caller_ua; - $toAgent = $session->callee_ua; - $fromImage = $this->getImageForUserAgent($fromAgent); - $toImage = $this->getImageForUserAgent($toAgent); - $sc = count($session->streams); - - print " - - - - - "; - - $duration = $this->normalizeTime($session->duration); - - foreach ($session->streams as $streamInfo) { - $status = $streamInfo->status; - - if ($status=="idle" || $status=='hold') { - $idletime = $this->normalizeTime($streamInfo->timeout_wait); - $status = sprintf("%s %s", $status, $idletime); - } - - $caller = $streamInfo->caller_remote; - $callee = $streamInfo->callee_remote; - $relay_caller = $streamInfo->caller_local; - $relay_callee = $streamInfo->callee_local; - - $codec = $streamInfo->caller_codec; - $type = $streamInfo->media_type; - - if ($caller == '?.?.?.?:?') { - $caller = '–'; // a dash - $align1 = 'center'; - } else { - $align1 = 'left'; - } - if ($callee == '?.?.?.?:?') { - $callee = '–'; // a dash - $align2 = 'center'; - } else { - $align2 = 'left'; - } - if ($codec == 'Unknown') - $codec = '–'; // a dash - if ($type == 'Unknown') - $type = '–'; // a dash - $bytes_in1 = $this->normalizeBytes($streamInfo->caller_bytes); - $bytes_in2 = $this->normalizeBytes($streamInfo->callee_bytes); - print " - - - - - - - - - - - - "; - } - $i++; - } - print " -
 CallersPhonesMedia Streams
Caller addressRelay callerRelay calleeCallee addressStatusCodecTypeDurationBytes
Caller
Bytes
Called
$i - From: $from
- To: $to
-
- \"$fromAgent\" - - \"$toAgent\" - $caller$relay_caller$relay_callee$callee$status$codec$type$duration$bytes_in1$bytes_in2
-
"; - - } - - function normalizeBytes($bytes) { - $mb = $bytes/1024/1024.0; - $kb = $bytes/1024.0; - if ($mb >= 0.95) { - return sprintf("%.2fM", $mb); - } else if ($kb >= 1) { - return sprintf("%.2fk", $kb); - } else { - return sprintf("%d", $bytes); - } - } - - function normalizeTime($period) { - $sec = $period % 60; - $min = floor($period/60); - $h = floor($min/60); - $min = $min % 60; - - if ($h >= 1) { - return sprintf('%dh%02d\'%02d"', $h, $min, $sec); - } else { - return sprintf('%d\'%02d"', $min, $sec); - } - } - - function normalizeTraffic($traffic) { - // input is in bytes/second - $mb = $traffic/1024/1024.0; - $kb = $traffic/1024.0; - if ($mb >= 0.95) { - return sprintf("%.2fMbps", $mb); - } else if ($kb >= 1) { - return sprintf("%.2fkbps",$kb); - } else { - return sprintf("%dbps",$traffic); - } - } - - function getImageForUserAgent($agent) { - - foreach ($this->userAgentImages as $agentRegexp => $image) { - if (preg_match("/$agentRegexp/i", $agent)) { - return $image; - } - } - - return "unknown.png"; - } -} -?> rmfile ./status/media_sessions_lib.phtml hunk ./status/media_sessions_version1.phtml 1 - "CDRTool_Session", - "auth" => "CDRTool_Auth", - "perm" => "CDRTool_Perm" - )); - -$perm->check("statistics"); - -// Image height in pixels (30, 35 or 40) -$imageHeight = "30"; - -// include external config files -if (is_readable("config/media_servers.php")) { - include("config/media_servers.php"); -} else { - print "Please copy config/media_servers.php.sample to config/media_servers.php and add your own servers in there.\n"; - exit; -} - -include("config/phone_images.php"); - -$errorReporting = (E_ALL & ~(E_NOTICE | E_WARNING)); -error_reporting($errorReporting); - -// functions - -function isDomainAllowed($from,$to,$allowedDomains=array(),$rId) { - global $perm; - - $els=explode("@",$from); - $fromDomain=$els[1]; - $els=explode("@",$to); - $toDomain=$els[1]; - - global $CDRTool; - - if (strlen($CDRTool['filter']['domain'])) { - $allowedDomains=explode(' ',$CDRTool['filter']['domain']); - - if (in_array($fromDomain,$allowedDomains) || in_array($toDomain,$allowedDomains)) { - return 1; - } else { - return 0; - } - } else if ($perm->have_perm('admin')) { - return 1; - } - return 0; -} - -function normalizeBytes($bytes) { - $mb = $bytes/1024/1024.0; - $kb = $bytes/1024.0; - if ($mb >= 0.95) { - return sprintf("%.2fM", $mb); - } else if ($kb >= 1) { - return sprintf("%.2fk", $kb); - } else { - return sprintf("%d", $bytes); - } -} - -function normalizeTime($period) { - $sec = $period % 60; - $min = floor($period/60); - $h = floor($min/60); - $min = $min % 60; - - if ($h >= 1) { - return sprintf('%dh%02d\'%02d"', $h, $min, $sec); - } else { - return sprintf('%d\'%02d"', $min, $sec); - } -} - -function normalizeTraffic($traffic) { - // input is in bytes/second - $traffic = $traffic * 8; - $mb = $traffic/1024/1024.0; - $kb = $traffic/1024.0; - if ($mb >= 0.95) { - return sprintf("%.2fMbps", $mb); - } else if ($kb >= 1) { - return sprintf("%.2fkbps",$kb); - } else { - return sprintf("%dbps",$traffic); - } -} - -function getImageForUserAgent($agent) { - global $userAgentImages; - - foreach ($userAgentImages as $agentRegexp => $image) { - if (preg_match("/$agentRegexp/i", $agent)) { - return $image; - } - } - - return "unknown.png"; -} - -function getRTPSessions($ip, $port, $allowedDomains) { - if ($fp = fsockopen ($ip, $port, $errno, $errstr, "3") ) { - fputs($fp, "status\n"); - $proxy = array('status' => 'Ok'); - $crtSession = 'None'; - while (!feof($fp)) { - $line = fgets($fp, 2048); - $elements = explode(" ", $line); - if ($elements[0] == 'version' && count($elements)==2) { - $proxy['version'] = $elements[1]; - } else if ($elements[0] == 'proxy' && count($elements)==3) { - $proxy['sessionCount'] = $elements[1]; - $traffic = explode("/", $elements[2]); - $proxy['traffic'] = array('caller' => $traffic[0], - 'called' => $traffic[1], - 'relayed' => $traffic[2]); - $proxy['sessions'] = array(); - } else if ($elements[0]=='session' && count($elements)==7) { - if (isDomainAllowed($elements[2],$elements[3],$allowedDomains)) { - $crtSession = $elements[1]; - $info = array('from' => $elements[2], - 'to' => $elements[3], - 'fromAgent' => quoted_printable_decode($elements[4]), - 'toAgent' => quoted_printable_decode($elements[5]), - 'duration' => $elements[6], - 'streams' => array()); - $proxy['sessions'][$crtSession] = $info; - $allowed_session=1; - } else { - unset($allowed_session); - } - } else if ($elements[0] == 'stream' && count($elements)==9) { - if (!$allowed_session) continue; - $stream = array('caller' => $elements[1], - 'called' => $elements[2], - 'via' => $elements[3], - 'bytes' => explode("/", $elements[4]), - 'status' => $elements[5], - 'codec' => $elements[6], - 'type' => $elements[7], - 'idletime' => $elements[8]); - $proxy['sessions'][$crtSession]['streams'][] = $stream; - } else { - //print "Invalid line: '$line'
\n"; - } - } - fclose($fp); - print_r($allowed_sessions); - - if (!isset($proxy['version'])) { - if ($fp = fsockopen ($ip, $port, $errno, $errstr, "2") ) { - fputs($fp, "version\n"); - $line = fgets($fp, 2048); - $version = trim($line); - if (!$version) - $version = 'unknown'; - $proxy['version'] = $version; - fclose($fp); - } - } - - return $proxy; - } else { - return array('status' => "$errstr"); - } -} - -function haveSessions($servers, $sessions) { - foreach ($servers as $server) { - if ($sessions[$server]['sessionCount'] > 0) { - return True; - } - } - - return False; -} - -function showSummary($servers, $sessions) { - // IE seems to ignore border on elements - // that's why we used bordertb on and - print " - - - - - - - - - - - - - - - - - - "; - - $i = 1; - foreach ($servers as $server) { - list($ip, $port) = explode(":", $server); - $sessionInfo = $sessions[$server]; - $status = $sessionInfo['status']; - if ($status=='Ok') - $version = $sessionInfo['version']; - else - $version = " "; - if ($status!='Ok' || $sessionInfo['sessionCount'] == 0) { - $caller = " "; - $called = " "; - $relayed = " "; - $sessionCount = " "; - } else { - $caller = normalizeTraffic($sessionInfo['traffic']['caller']); - $called = normalizeTraffic($sessionInfo['traffic']['called']); - $relayed = normalizeTraffic($sessionInfo['traffic']['relayed']); - $sessionCount = $sessionInfo['sessionCount']; - } - print " - - - - - - - - - - - - - - - - - "; - $i++; - } - - print " -
ServerVersionCaller trafficCalled trafficRelayed trafficSessionsStatus
$i$ip$version$caller$called$relayed$sessionCount$status
-
- "; -} - -function showSessions($servers, $sessions) { - global $imageHeight; - - if (haveSessions($servers, $sessions)) { - print " - - - - - - - - - - - - - - - - - - - "; - - $i = 1; - foreach ($servers as $server) { - $serverSessions = $sessions[$server]['sessions']; - foreach ($serverSessions as $id => $sessionInfo) { - $sc = count($sessionInfo['streams']); - $from = $sessionInfo['from']; - $to = $sessionInfo['to']; - $fromAgent = $sessionInfo['fromAgent']; - $toAgent = $sessionInfo['toAgent']; - $fromImage = getImageForUserAgent($fromAgent); - $toImage = getImageForUserAgent($toAgent); - print " - - - - - "; - $duration = normalizeTime($sessionInfo['duration']); - foreach ($sessionInfo['streams'] as $streamInfo) { - $status = $streamInfo['status']; - if ($status=="idle" || $status=='hold') { - $idletime = normalizeTime($streamInfo['idletime']); - $status = sprintf("%s %s", $status, $idletime); - } - $caller = $streamInfo['caller']; - $called = $streamInfo['called']; - $via = $streamInfo['via']; - $codec = $streamInfo['codec']; - $type = $streamInfo['type']; - if ($caller == '?.?.?.?:?') { - $caller = '–'; // a dash - $align1 = 'center'; - } else { - $align1 = 'left'; - } - if ($called == '?.?.?.?:?') { - $called = '–'; // a dash - $align2 = 'center'; - } else { - $align2 = 'left'; - } - if ($codec == 'Unknown') - $codec = '–'; // a dash - if ($type == 'Unknown') - $type = '–'; // a dash - $bytes_in1 = normalizeBytes($streamInfo['bytes'][0]); - $bytes_in2 = normalizeBytes($streamInfo['bytes'][1]); - $bytes_rel = normalizeBytes($streamInfo['bytes'][2]); - print " - - - - - - - - - - - "; - } - $i++; - } - } - print " -
 CallPhonesMedia Streams
Caller addressCalled addressVia addressStatusCodecTypeDurationBytes
Caller
Bytes
Called
Bytes
Relayed
$i - From: $from
- To: $to
-
- \"$fromAgent\" - - \"$toAgent\" - $caller$called$via$status$codec$type$duration$bytes_in1$bytes_in2$bytes_rel
-
"; - } - -} - -// main page from here - -?> - - - Media Sessions - - - - - -

Media Sessions

- -have_perm('admin')) { - showSummary($servers, $sessions); -} - -$REMOTE_ADDR = $_SERVER['REMOTE_ADDR']; -$db =new DB_CDRTool; -$loginname=$auth->auth["uname"]; - -$log_query=sprintf("insert into log -(date,login,ip,datasource,description) -values (NOW(),'%s','%s','Media sessions','View media sessions')", -addslashes($loginname), -addslashes($REMOTE_ADDR) -); - -dprint($log_query); -$db->query($log_query); - -print " - - -"; - -page_close(); -?> - - rmfile ./status/media_sessions_version1.phtml hunk ./status/sip_online.phtml 1 - "CDRTool_Session", - "auth" => "CDRTool_Auth", - "perm" => "CDRTool_Perm" - )); - -$perm->check("statistics"); - -$title="OpenSER online subscribers"; -include("../header.phtml"); - -include("../cdrlib.phtml"); - -print "

$title

"; -print "

"; - -if ($_REQUEST['datasource']) { - $datasource=$_REQUEST['datasource']; -} else { - $datasource='ser_radius'; -} - -$expandAll=$_REQUEST['expandAll']; - -$online= new SIPonline($datasource); -$online->showAll($_REQUEST['domain']); - -$REMOTE_ADDR = $_SERVER['REMOTE_ADDR']; -$db =new DB_CDRTool; -$loginname=$auth->auth["uname"]; - -$log_query=sprintf("insert into log -(date,login,ip,datasource,description) -values (NOW(),'%s','%s','Registrar','View online users')", -addslashes($loginname), -addslashes($REMOTE_ADDR) -); -dprint($log_query); -$db->query($log_query); - -page_close(); - -?> rmfile ./status/sip_online.phtml hunk ./thorNetworkImage.php 1 -buildImage(); - -header("Content-type: image/png"); -imagepng($img); -imagedestroy($img); -?> rmfile ./thorNetworkImage.php