From: Tietew Date: 2002-03-08T20:58:48+09:00 Subject: [ruby-dev:16289] win32/registry.rb and resolv.rb patch for win32 platform --------_3C88A2B00E670A9D9008_MULTIPART_MIXED_ Content-Type: text/plain; charset="ISO-2022-JP" Content-Transfer-Encoding: 7bit Tietew です。 遅くなりましたが,win32/registry.rb の最新版+日本語ドキュメント と resolv.rb へのパッチ (一カ所修正漏れがあったのを追加) です。 VMWare3.0 を導入したんですけどファイル共有がおかしくて Win9x で のテストがまだです… —[ Tietew ]—————————————————————————— メ : tietew@tietew.net / tietew@raug.net / tietew@masuclub.net ホペ: http://www.tietew.net/ Tietew Windows Lab. http://www.masuclub.net/ 鱒倶楽部 指紋: 26CB 71BB B595 09C4 0153 81C4 773C 963A D51B 8CAA --------_3C88A2B00E670A9D9008_MULTIPART_MIXED_ Content-Type: text/plain; charset="US-ASCII" Content-Disposition: attachment; filename="resolv.rb.diff" Content-Transfer-Encoding: 7bit Index: lib/resolv.rb =================================================================== RCS file: /src/ruby/lib/resolv.rb,v retrieving revision 1.8 diff -u -2 -r1.8 resolv.rb --- lib/resolv.rb 2002/03/08 03:19:44 1.8 +++ lib/resolv.rb 2002/03/08 11:02:45 @@ -263,5 +263,14 @@ class Hosts - DefaultFileName = '/etc/hosts' + if /cygwin|mingw|mswin32/ =~ RUBY_PLATFORM + require 'win32/registry' + Win32::Registry::HKEY_LOCAL_MACHINE.open( + 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters') do |reg| + path = reg.read_s_expand('DataBasePath') + DefaultFileName = File.join(path.gsub(/\\/, '/'), 'hosts') + end + else + DefaultFileName = '/etc/hosts' + end def initialize(filename = DefaultFileName) @@ -511,5 +520,5 @@ super() @sock = UDPSocket.new - @sock.fcntl(Fcntl::F_SETFD, 1) + @sock.fcntl(Fcntl::F_SETFD, 1) if Fcntl.const_defined? :F_SETFD @id = {} @id.default = -1 @@ -566,5 +575,5 @@ @sock = UDPSocket.new @sock.connect(host, port) - @sock.fcntl(Fcntl::F_SETFD, 1) + @sock.fcntl(Fcntl::F_SETFD, 1) if Fcntl.const_defined? :F_SETFD @id = -1 @thread = Thread.new { @@ -617,5 +626,5 @@ @sock = TCPSocket.new @sock.connect(host, port) - @sock.fcntl(Fcntl::F_SETFD, 1) + @sock.fcntl(Fcntl::F_SETFD, 1) if Fcntl.const_defined? :F_SETFD @id = -1 @senders = {} @@ -698,4 +707,7 @@ } rescue Errno::ENOENT + if /cygwin|mingw|mswin32/ =~ RUBY_PLATFORM + initialize_win32 + end end @@ -712,4 +724,69 @@ end } + end + + def initialize_win32 + require 'win32/registry' + + Win32::Registry::HKEY_LOCAL_MACHINE.open( + 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters') do |reg| + begin + slist = reg.read_s('SearchList') + @search = slist.split(/,\s*/) unless slist.empty? + rescue Win32::Registry::Error + end + + if add_search = @search.nil? + @search = [] + begin + nvdom = reg.read_s('NV Domain') + unless nvdom.empty? + @search = [ nvdom ] + if reg.read_i('UseDomainNameDevolution') != 0 + if /^[\w\d]+\./ =~ nvdom + devo = $' + end + end + end + rescue Win32::Registry::Error + end + end + + reg.open('Interfaces') do |reg| + reg.each_key do |iface,| + reg.open(iface) do |regif| + begin + [ 'NameServer', 'DhcpNameServer' ].each do |key| + ns = regif.read_s(key) + unless ns.empty? + ns.split(/,\s*/).each do |ns| + @nameserver << ns unless @nameserver.include? ns + end + break + end + end + rescue Win32::Registry::Error + end + + if add_search + begin + [ 'Domain', 'DhcpDomain' ].each do |key| + dom = regif.read_s(key) + unless dom.empty? + dom.split(/,\s*/).each do |dom| + @search << dom unless @search.include? dom + end + break + end + end + rescue Win32::Registry::Error + end + end + end + end + end + @search << devo if add_search and devo + end + @search = nil if @search.empty? end --------_3C88A2B00E670A9D9008_MULTIPART_MIXED_ Content-Type: application/octet-stream; name="win32-registry.tar.gz" Content-Disposition: attachment; filename="win32-registry.tar.gz" Content-Transfer-Encoding: base64 H4sIAAAAAAAAC+09/XdUx3X+WX/FBMXWLl4/fSCwo2PZyGIxOhYSrCRjR5DtavcJPbN6K+97ayEj +r9gv03bGGocm4LAWP6ggMEWcXLsNKc9dtKenMTYTVqR/pK0Ob13vue9eatFgJM4VhK0mrlz586d O/dr7mzq7mEvCOtLznMlp16575789Pb07Nixg9zXQ3/Ub0J/+vr6tz1MyMP92/q39z68fUc/Ib29 O7b3Adx9X8FPIwhLdSBp0nNDd/G+v7afwRkQAL9jkBzw/G19pPll81xzpXm1eZOMdO/uWMTG7jqX ERLdEGA/bX7efA/APm7+w4k3mz+PrqiB0XrzpearzQvNlWgl+iJajX4RrXUAeNT8BP69GV2JVk68 zNAM7Rsh0dq5y9FPLv4oOhtdZ9hp6/qFq1EUfYqwHR2Dg8Q9WppfqLodhMEMDBQ4UQMDe57KP1sc nioU8mOTxamJfMGpLbh+pmtifPfkgaFC/uBsrdaVJZUaWYaVLHeg0L1QqjZcMkigYboL+w+R1j+d 5L0Po7XL70efrfwx+syOI5ekrZB/sjjx3UMCx9nVaP3cu5duwmJXDVzh0oKb0zE6dbdUyXQx0tuj R1vLIOmaKdW72lrTxf+OTiVxtFiLgRzXdOFfLt18/+PolA2bs1j3QjfTGmeOYczaKJKI3FJ5rsg4 dIws+6V5YBhjW6UUlpaJ4zjkuLm0tVtnbpnjj7hLOBp+5chi6M27sXFqfPMMyOupE29qWCSqilsF ZcGIabFHOinnf3vxf+PjgYoNR5uktMQC7Kg33GwbWC6feYljcv0KHC/SvAkn+QSc4VvNFXrcYhtF ytVSEGDPIPH8crVRcStkvlZpVF1o3UryfmPerZdm4IBuJWp3h2s+aFc/5CMpEjLvhnO1StDx0EMP SVDHdxczdFOCxgz9XXEDrw6TDBI83YX80K4cqS2E8DeKzPi+yZHxMWiG0/50flf2riJDAUFFwSTD RE01y10j9E6xxSjFfVZ6GPeaZDIo68vZLPkhbLxoYrNha7T++ivRqRMRHQsfo2iVysj6+xejlYQU NH8AInSu+Xeg3q9G69c+ATXGNDSOVlNFN1Yvs8mi9dY4rqDqMLDIkdejG5dunnnn/EeUaKrjt1Kz 8OFHYEJO4RCSeenDTObRspCyx7LZrDqoQA/nJqNJWKXmp/C/V5kZAhjgLu+nZwPI+2nzbPNXzVsM gqJ669/O/wxsH8y1d2LXGBn1Zuql+tLyVGF0YC4MFwa6u+eDiu/Me+V6LajNhk65Nt9dZVDdrv9Q I+gOlgLPn62hLS0teMXvzLwYOqVg4TG6Bxd++NZV4MLl6NXo7ehMFPFp2YZ+0vxPMLWvRic/XI3+ Pvo8+hKM6tUTESX3xpuvXD79zz+Irl+7FJ2jfdxiGmJWBlsCOriFoA2NjhaHhofzExPtC+/dwnqb QnzdJsTnf/P2P0Znv5ZiLNX2yTf+EF1/99z5z6ikRLDXP2IyAC7W27DmV6IvT0SAJ5M5JqjsZHtU efx4NvsYR9r8RfMiyNP70UkyW6oGLklw4G6JnXt0oeRXiq7/glev+RloywoOw2fK4TX449j9Bxcf vP84/oku3/evvRv9JFp/49I/nbr20ervouvvffLGikEfClH+mX1DY7vAdSDRFeBkpBEhl6BObZ5S kmeEzLt+OBHWPf9wsKkTzH8X+5eCF8UR1txZ22E2+YJOSx/6Lxn8lI1JPDoL6Ca+fRoW/0r0+Q8v XX7/2rkLv1+7Bez+SGOFiZQ6M334T4Z+ZGh39M94IbJ598hofnJkbx7oI5PQbcpvK8QUL0WZUXiT KD4FKbxBRvzQPezWYyfszf+JXnvz19FNfj4tRMUIYG4Gnoaya/UXOqnl3KQJZjJ4jJ9oEA/DHsN2 ZgK3OptQahRnlsnp5ddA7q8kucUPXOaOtGw6fQz7HVJYrQWu0JOgM6gu+YJpOXqcY6dIHvHVc78E hDdORO+ugmivST1yY+0/Xj8drV999e1zdhHqpKEMc9i31u0yj0oBIZg6x7DmRDSNjQgOjTlqztHP B4BDjLJo7cq/wqm4klTgEtNJ4ntVAHzry5VfgXJ8/9zFn2fNs3aSh1CfJvWHmh29g/gBZf4D1dwW h5c7x1KVa9THcTWvQAQN+EC3vgoB8kp04/Q1dNYufRDRYHmAIpCRkqH9Orh3z/SZAtw7NTo5kujn HFNguw6MF3YxlPRj8YkRQD62a2RojLXux1aBhB9uNfyJkbGhwrOxOTLNH0Gofw1MN1vX+hufRp8h a3WbJp2s079f/R0ypy45fZLa0jNcMFfZziW4f5LikaZp1cTBBIMZS8xBvNJ8B3QRWrMzaCS5Eb0W RYg9us5UGgzO1+u1OpDQQpandTk+1JYcRxejNSBbM7Nio7loGCYbDwsz16AWL/48eSCTvIhbxLej 9wTjpBk9Sc3oGUPKUzAlpIz9KWRKk5ectMctxIecvgb6QdIEViKV1W0JyNrpjz94mdn1NL6laz+E KgZUGWUtPV5qz4zn8z6kD3kF2/pl9Fb0JedZhqHOauxhTR5vYqclI7AxREDkS6B9b1uCFKuQFAhp 3mu+Q0X6FbX3bUo0o7vIvLXYGvnaCDfvcc+rHdrZMjdYwO1J8CrqbUB1M+YUphFqCmDbjGGZq3ii aQPbdf3sqmE4rhiqf12ktjZtr65bMNxTa7UmlFX6gTPjCqa0UHlfi17DKAV+405diG6ladNFpBzc IVg8phdpXm0DNuNfFC6VrymKZFFyaZ1HbVwtsWOGvLIg46DG+TIoEGy6/tofcfVvnkii4oZcN6Oa 8mSdmiEXMs06hur10pLWLi28RWa5guP55KwNwtsQQig8CXN39iMumDfiapSvwNCjnOassjdcmUpS 8aRZjjDmfOPZYkalJbnXmZ5hNsbQddCI/ML/RZeMFa1jrjhFnej5Z+G46ylohXdNxvwmPv2sa9mP Gyqz+8Fb75zmSQ/h8l3RFQ2bjw46f+XiD1ZWVs9e+OPKb/kQGY9ldvQ/hDEaxqBZAwXVIJoW0OJO pguysVWzJLXNrBpJdGV20u0JpqxNT9+iHxkUOn2vR1dBuliOxaZ7tPQ52+q6W27UA+8F1EQ0NZI1 EjAGMVdRVyghgAl/BipvTRJg2zKJn6t6nn7hyp4iFBuptnQd0L9HtellWI2uSem1Ub2hMLCRmNzH 1Awl44w9NdM5W20Ec5rAvfMGUi88di39hrcCUfOLhNmxRb2Vx7WjkclsXT0LbHh1azZLs3PUcDNC V1eTWbeEYDGcdqHCON2cDlC9LSNVZnsi62QmooVS3fVDM2O3iZyhyvBhhMxsePqkIHEoRxbnnyYg hBPLPJkWXAGtK2OlVYteiHtcMfH3goVa4IVezdcEgWjNxOKxZVD5DhfyQ5P5XcWx/IHiU/lndadr fF9+DHryz4xMTI6MPYnd8c2jazdawlox0LXfx80vmh+BLV3HNEhX4nr3oH6xexAvDo9zHyRai34d fT+6dvYdIytgzobJOznbW/917Va0zgJutEhmRoFbbL8xj2oi4OZXqdtzl1Z/x0DmS0cRpFh1/cPh XAzwg7eitfNX3v3VpRWFj6o9gRFnNnHR7iKyykSJkFTJGwjViASwDlZxg3LdWwhr9RidF5qnmr+E 0365+fKZUxd/fOHH0dolcLXZKKrhOaRuNEhG2IusLecK/N7fcOtLI8Dup6n5vIPrku1HjyxsJtfa KbfOaI3tVmIE35zEmOSupIDYepPcN70uyWYplyATJ1aSx5hepaqbVcTCzsjo0MREfqJYGB+f1Fq1 k6NaR8eHh0aLe4eG94yM5VXzvnxh93hh79DYcL64a2hyKIlmeHxs98iTqn3Xs2MMkod51JcD8VEa sQ19ei9v2no9329504bX3ekxUUfHn+DyT7F3a8y+gFl970MwqQ7j9+vA68+1vDtmETfg9A0I2uPh GCjurVb3nPUrQnRNYd6nKkiWz54QI4BoFYSp+WI2RLZbDIhm5plLcf43LOkXvXIieuMP755jfTyd ja0v2xJrmmXj9lOGrP9uFQusjfja13+J2i6nPnPP5mhd/7e9v7+/F+v/+vt6e3f07+jF+r++/u3f 1P/9Cer/pNawVP95AZGfS+WyGwS1OuGKjszCZ4ZioVoK4a95p2MkJI3ADVRVX1gj5VK1Gp8LugLn z6TKD7NapKSloDZR5afjIIteOEezCJut80tQtIk6P5onsSNpv9DPQBJb1yYq/ZI0bbbUj1efATbN q95EyZ/Cw6KooEXVH01YtOD4LgocZ7kTSzpkW+6axMHISUPSqu4vgURlOapLqv6v4M66EAmX3W+K //6Si//GASUJ51ylp3HHjaxAw6+AnyiLnJxYzZMXJHa/NvOcWw5JbZawbAniZMOerTVAn/uo5MkC EO7Oej6Qj3PyQqdM4Lqk3RK9kl8hqiAPKGFGhsyXgiO0ExFDLzhwbP7dYHMqbljyqsBDNtE9cNEd Re/ILJmp1spHkLjDcIT8HOU20gUttLICVHUjrM2XQg8tHTDqL7wUb5iiJsDp2iaF646lBLjOdRfK RBXt4RJ4CkBDkBO8ZxlBLkIblcAxJQQWDFyRuhs26j7Lxd7VnU6rfiu44CCVXaPwzfPBM0L8ripR 42YWjp2sl2P0Tc55Qo8iLQ2kBL0v485TW4rllHx19XBOG7VvYChecOuhkit6G8iWD3zB/UbjQgJK pNNW4ZvAyS8y5M2GxwNlynFaxcbUm9NO1ZtAqo3DgyGCb95CUcfmdb6KmrYJYCspBXdU23aPytla k9ZuWVtqJdswflJ2if4zNBvCnrCTmgN3JQjFoamXPIxKXKwAcNorVSswH1xKKBNOhKvo10KofrhC KeF9LZxeOjy9ko0RfGAOVCsiwQPt40FFZfA3oCpLjWrYxaej8Vep4ljv/KGTnxhocKRKvb3LfokE G3LECwPutnnB3ahCG+I8SQDekzo0sCag9PyAzHg+RqiqeEPxXC8sgsUHC27Zm/VQYHADFEPJfAPk Z8ZV/u/MkrzWEwjoludQI6gCE9wzFLeKs3Ed2e0LGW6Q2jBhHly+acBoKTiBPIApNRym7YutHhDE CsIYAfrsZHEOD6FmwXj4XPdQe4PlrqPrQI0fl2HrRL4LgaVbNyrRbrP0zOfWcD8TK+tuyNUiv+bd ko8yw4ytIREb8+2eFJhxWWijtIyv1VpdtoEopex5wPaiUoNPfg3UZiksz+XaEeq0UjJjNSTuq2yS zDTRNH2odOmb8qsYXdjxWchsiwOtasYO0ISHpm7BTyi1t/ikgWDZE+42xixFqoVQjtVtWYhhoU40 2oVCFAdkcc4rz21QIibsL9Mdzm3Wgkn2yTKj9vknhEev/2qp76HTC9nYcVRHi7DZNqCKC25VhdR8 pXM1Cr8GFV93zPXJlPPVutALTl96rZfzVVV5xROLzmZKuhJZRSelkAtYw30XdpikA0MPfk1EwU6i mAsGgvCFQid47EQmqrl47CNyPvz839NiLpl8bE/LuTRRgDaH4bMrt82VccXzoFa/Ci8npFMVJHSH UcEFXKfomVrgWKlaxAXMlV6IbbihR1QIz+gP6NQcnpLCTbGWrnVSi7jYIUUMSEopBCmaaSBSmViQ /J/1qgkWGuVbBe7ZebMy28G6gQFbfXexuiSvn20i1G7ZVnIa5BoL15z0Kq12kpPUJ8IaLMDNEk6u yDg5LUqxVIyqnUktCZNWqMU1VatCLbbVzgYVWLu00is2r7Xaivsltkorp/1Sq90NkJaFUjiHi8Md CBqgcliI3mbJlZNWWCX2lm6sj3eBJboowC5CQHtlFdoKaJrBZMqseXrsFVZ7S0e9+cY8YY04yNSV YnCi4sqcST/uLcuv0udLQbHBaClexvC0Oq1ROS5AreCFS0SBOslqrdF0oxC3CS3Thfe+lMv5GpRt CakvYVzuzotzpR0AJ1679WdUupWiWFlQzzW0mb2/53cwWuWWs2GV1ld1FxQvzdpn3miAjaSitFVl 611gIEafPArIUUMXY7cTL8QqmP4STerFi7EmhBLQ7smctDqsp+TdWeBsvgqLx98xx4B6BeKKCP6m dzPox0opmXDRPQlqG9dkSVNJy6866u7zDQ+Y1yVqSLo6OtiWMxYCdhZ4CZQs0GQQ6gaa6cPEUQMP sefoI6wcqccA0k6eDtSrAxkHUYfq06Hi51IH3Gabkx1THaxfBxOnVgfYzgG0aHFsnNFkBJbQ0Ks1 qAzMIOnT2lnABY3b4iErtPXH24qjI5OTo3mefbNCqOQcdG/XukdHxp6Cph2WMBeaH9aaC/mJ8akC 8HAURBL6HtH6dk+NjiqAXfmJ4cLIvslx3Lnv2FAU8vunRgr5vcDtCYGvV+fUfr7W3t54Y2KxEoT/ mpgElg4BYGHkyT2AHm9u6FahXGhiFoc7UBiZzNsAcc/3T+ULzxafHhqdkiC9WvdEftLs7NM62REv Tkw9Qb1HDtGvQeTHpvbmCxrQhIB6RIMaG58c2S3G9/YkZ+B7id19ejfngJUxyyJpn1jmchppyxo1 2iyCf3a+mvMofi1bWKRz5pn88BRFKxaidarrL62fY+SzxtmTPKax2zLB+J4kCBzo4tPjo0OT4MG1 AIuD9CZBkvvV05eEemJo+KmpfUgZnKR8XG40QLQVBjL9aI7mnwQdySDtF4Ta3qStdjmNeuvQGOHL VlqTOxEPs0xVaTGImtLUAA/sGQf1sGfk6XzLrSjkdwOBeyigbRPGxoujQ999trh7dGpij435YFOo JjN25xGTnr1DzxSpocqPPTmJWLb39mtd9Aiozm19D+9gCNDy4m9+2RWzo/Sfzg5eMofpcK2FGWOW JH+UDAxMLAXgCw+XqlUFSZ1G8Ij3gtNSOuyiJRPWnVZvdR1x675b3dbnVKrVrhzpMsGxZXTfKPx3 H/3YleVYwQ8DksGZKFW9F91MuVZxs1JAduKfBJ3viisb5Yf54DD0bTnYs4VsBVPQ1y97wOeHHpMC Bws+Mj1He0FP5wj8F5HSD4AnR8fDX2ruoLEAcSb0TQMIIDzkhPXMloP1LUB+V9Ypz9XmFziwYD2h WZwiJtBh6ICkWvQbm6D5oE+JYFrfDtWPXuCjpq9EwK33XgA/rkiBizwtNQA7YUpTjL1zNNPCEyga n7EdODYnChZpI0/O0Ky+auWDoVnPw9Au/RnaYEuXVOdZhyh6NL3yANOK6HXPuDzDpC1JVRHQGzO8 1WHyS2Vxe5Z0gpQXCuMFruzBvxgbye9Kn3t36Yi4gaVlOXr2KxdPummEyFpa3f9Pn2YvTgNyyBvk GXVkeOkEbhVjuGNkubxMur9H3cduMvi3pEyO09pYWi1dXk7MynAUAzck5Ry695kY+uJhN8yUsyD5 2RiFVgGVcb4um9xJh1aOYlrScf9iN5CC1YwgsPmjQzSZgUdeAIx252LArE5NgCMwgO/bZwfGlDxN ZDDMCMhhU4A1MgB4VFCSBKZ5Eooa4VFH7duXSvOEG0pQvsDRVGCWv6bwFFgr8k0DxtNONgbejXlk AUtGSUtgWmrTLrDMGtEBnM2M1wr4kBLFWV/JohLBWX+655CDmaq6n4uZilLlBQjRpanYOutn044M k7fibMMvy5SrodzKc275SKbuBo1qmLVpBLxbwM4cfcXg1jN9Wcwxs0byLRVtqbkR70KpfKSymKks KqTTlcVDDrZnup7uylpHNXzLuMqiw9rpOGBL6oTPL2ae1yckzy+SB8BL2M1/ctjw2GNg9YmkpDUp MYwwfBD+UfSo0YQA5HTvIfLoo4A/Cy4Y/GmhVZuCn3VuVdhFTm0hlDVg2n4wbg8Ktmp2lm4gMTQH M9VpWMWGKhSS62aHyQ+pa+6MXLRxrdehK7XkSpjvYayng2z806PEGCnQZSS++pwmhQhK7PIm1Skn z/Mr7lGFl9v4LvjPVmWnBgZM91R5S+BdKLakwlvYpdS6zixKjeAZIhec6zGcNOxH/0yuGEGz6QtW 2/8VL5dmnOUEj9jZkJSZVmzQCmeZIKQwI6dUARuSIhDKCmoCq/DzCo+k4Ju8sJ0Iw75ajwS7yu9h a9QOG5aoCaaZy9r8LKxM0kSinSJaP8qgLMxM4Z1wCowZ06eTNGvOxG1RbM6ueRnWrZPTaYDx6Vph NpVmKl4Aaw+r8F0ooAWd6FfYUlQ6d2vS8Ij+jfDoHk8Ml7jct8n3fOko62bhZhKAVwOkjKW9yKS0 4QImrT9wy3jPZZ9gQ4WjL1rfNqlf+NJzxjqxR7NXbIW5+HJyOu05SahFZ6njxWbTrZc+r97OJs3q dOhjdEJi6ARJ9rGCzOzGGtMaMDVCr4o3O8JZ1eMmFDOsk099YULwpYRzGBac6b4/M/29+w89mL2/ Gx/35Meenv42+GXLy+TbD/DyJGN+rHAs9hXHmAk7xkHuX5yO3yzw+wTzFkG7OzCL3FLuAuQNgKVY PJnzb5Xpby/Lb1aSa3EHLQkUlQGKBdOWqJfqUSxMlOG6YKA20Jmtu+6Lrrldtqcv5nQMNWwOve6T pRrGDkl09ncv7KuZnVKYYa3kIfw/0+nv7394244e8ZMl3aRXfDamUMTa3r8QWkaAhHk0Tcbf8T9o mSJdtCkn641yWKsnM1UQMOD0IgVW9UoBqdW9w0UI9ojKSPGMFRkQffZFYIQ4dyfvNXXFDTC8/o7m 6zJdBw/KgAcmYhAYl+qhjKNPT3c0rNsjhdrMczBeXysdaZLfOg/m8TdrRfpg7XGpl9gLf6Wlljy3 WsEJZZvrB426q4FAp2MmxpSZc6tas8IS12dyF/gbork7f/OoMzsnwidkuRmQ3WWm4zx/lhxucWTw qWb8WBincNbzaRpXz93v3Elb0Qeo18qYNkRGLIu/KKN1NwlCepr/4J/JcW4ujIlUxjhmwhKpZJYj linlnP5VZGLDLNlllVvWygRbJJdjqeV4ER6fQ3Bimk4ljfY4rYqZAIvuOizBXJScJOzxGuci84MU LlPPGsl9tvwBsf4ByYCBOHEGZ1WZZ4yzRjlnfMGD1rqP+MHVKzUJ+RZdhuN71ccTkBpn5UZo8si3 YKe5B4tzXtUlsY1zjP2TQ3mn2M4HCSpe+KWhUydHNiZspudjsb/AvuVg56PxiieYYbDzGGJwOPDx x7akn6D5Uj2Ygz0WxfuK/8VKA+xDxV0I54TcsiSifD+SI1vKJb8rJAgZrwVqMSduS7fSGp3Gfm3u 6WiOPDBTPSLtOzoeDFnqS0x9hC4Jd/5W1EKLQHr71Gi61dBcO/WoTOgTpUQ0vaHuqtQxRj2neqyb 5IVY7W/ciiJB6tmBMCaYkNFKdNihwK/ySLUr0hPBFams205rHqoOAUjDJfq9K8UJHD1iMTrJ2VTG gH5VTanC93bDKXz3aGidgdlFsY0KvwRgPHlQ3b2r0bTLfrbFM4w7ZWxOhrqCv1Jg7py75tr1Mt3N LlsrnMaPRXzkChZLBpixL79ZVlDgM2DH8djodJlmpiom0SlvpWOCg6zU8oE7VUaHPPAA/c1dNDG6 wd7lUYyOO78QLj2OtYXsb16S8LgRQ9n06yR9tesF9PEiyUCsjFeh053HGJ5yrYp3o8eW68uWLycg 9ePOczXPz3TlurLHDxGwsqTzWNqXGBzHwtgA1Ed2S2L7yqXA1W92F/EhX8tH1OByKP5hrLEgvQ85 OP6w2hwTLFS9MNN9sKc7mxxqvpU2BiaB9QheweKOqnsBfN6YMlKL9e2UirujMXqXlcSyf4P5n4/P b3jOKULRaiP5M5SgsbBQq4MP5WxpEd1MH9pY+lPPyIaCob2J368+JnZeU58SRVKm0r6VRD1O/Yp5 ZzyTFhpVsorxITvdeyhlYPKJcTrfractqyI6dhsxeLc4p21I6sK9Vgtv78sQ0pljPiRPoGcKIDHc UPf0zUhc3bd62rwpRUe36kFWdrWhhuP7StUGVc04KgtxAPy2jI+pOX00szatVZ1mu3Q917aW4+On 8be4Xh/ryrbWb7FJn1+8neM55cuDxyS6xVFNmimcU148pZto8xaJcpO9iclalOOgeI9pfuch+M7a 4dMdYsLfKiWH2VhABU5+kaJRPEX5az66jmPXDlqMBBxrvMm2DUWhtozTn2zbhqnvsTAHGwuz7y5z YNTmsrew+IfcTiOFJD+pmfTtsb4a32Ct+slJ4vLawaWznOaRebyfRGd9jJ5EyM55CwIl2pQXykz2 9WvPnfE7R5m0obk1/jJZR2edaMMHyYTVDvE+le/D6JsNNAPn2HebCuV+2KHvHOVdBqbsjDKQeKxj +RZJFo7VG5pH3SLGUWbBFueYf+mfFaO1sMoSABinIU69ZI+VHUSP3Ogq+U1kCnkpK+Rfr9MuwTGc mywhTUiset/NliXvurUUhtV8x54dJhKv/JkuUbGZuLG2YFaXf+JRJrE+xVUPMIn1zSVJeRSbeF+p xcbsiq6IXzVbZDEy7nkAwbjYdBcwQjj7UBEtcLGobCkstPNYcFzbVFw3xH/e8UOWbdPHs1b896/i G8C/+fnm55ufv9af/wcvZrX9AIgAAA== --------_3C88A2B00E670A9D9008_MULTIPART_MIXED_--