diff --git a/addChecksum.pl b/addChecksum.pl new file mode 100755 index 0000000..b47045a --- /dev/null +++ b/addChecksum.pl @@ -0,0 +1,65 @@ +#!/usr/bin/perl + +############################################################################# +# This is a reference script to add checksums to downloadable # +# subscriptions. The checksum will be validated by AutoProxy on download # +# and checksum mismatches (broken downloads) will be rejected. # +# # +# To add a checksum to a subscription file, run the script like this: # +# # +# perl addChecksum.pl subscription.txt # +# # +# Note: your subscription file should be saved in UTF-8 encoding, otherwise # +# the generated checksum might be incorrect. # +# # +############################################################################# + +use strict; +use warnings; +use Digest::MD5 qw(md5_base64); + +die "Usage: $^X $0 subscription.txt\n" unless @ARGV; + +my $file = $ARGV[0]; +my $data = readFile($file); + +# Remove already existing checksum +$data =~ s/^.*!\s*checksum[\s\-:]+([\w\+\/=]+).*\n//gmi; + +# Calculate new checksum: remove all CR symbols and empty +# lines and get an MD5 checksum of the result (base64-encoded, +# without the trailing = characters). +my $checksumData = $data; +$checksumData =~ s/\r//g; +$checksumData =~ s/\n+/\n/g; + +# Calculate new checksum +my $checksum = md5_base64($checksumData); + +# Insert checksum into the file +$data =~ s/(\r?\n)/$1! Checksum: $checksum$1/; + +writeFile($file, $data); + +sub readFile +{ + my $file = shift; + + open(local *FILE, "<", $file) || die "Could not read file '$file'"; + binmode(FILE); + local $/; + my $result = ; + close(FILE); + + return $result; +} + +sub writeFile +{ + my ($file, $contents) = @_; + + open(local *FILE, ">", $file) || die "Could not write file '$file'"; + binmode(FILE); + print FILE $contents; + close(FILE); +} diff --git a/gfwlist.txt b/gfwlist.txt index 4880952..7e973ce 100644 --- a/gfwlist.txt +++ b/gfwlist.txt @@ -1,5 +1,5 @@ -W0F1dG9Qcm94eSAwLjEuMF0KISBDaGVja3N1bTogMG5hc3Q2RStnRFFuWno1dnNjY3E1QQohIExh -c3QgTW9kaWZpZWQ6ICBXZWQsIDExIE1hciAyMDA5IDE1OjU5OjE2ICswODAwCiEgICAgIC0tLS1o +W0F1dG9Qcm94eSAwLjEuMF0KISBDaGVja3N1bTogSG1qUWxqZ2llbXJNdEpMdy9ZeVBodwohIExh +c3QgTW9kaWZpZWQ6ICBXZWQsIDExIE1hciAyMDA5IDE2OjM2OjEzICswODAwCiEgICAgIC0tLS1o dHRwOi8vYXV0b3Byb3h5LWdmd2xpc3QuZ29vZ2xlY29kZS5jb20vCiEtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tTnVtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfGh0dHA6Ly9uc2YuMTEwbWIu Y29tCnxodHRwOi8vd3d3LjFiYW8ub3JnCnxodHRwOi8vM2NjLmNjLwp8aHR0cDovL3d3dy4zY2Mu @@ -9,171 +9,171 @@ LS0tLS0tLS0tLS0tLS0Kd3d3LmFib2x1b3dhbmcuY29tCnxodHRwOi8vd3d3LmFib3V0dXMub3Jn Ci5hbW5lc3R5Lm9yZwphbW5lc3R5dXNhLm9yZwp8aHR0cDovL3d3dy5hbW9paXN0LmNvbS8KfGh0 dHA6Ly93d3cuYW5keWxhdS5jb20KYW5vbnltaXplci5jb20KfGh0dHA6Ly9hbm9ueW1vdXNlLm9y Zwp8aHR0cDovL25ld3MuYW9sLmNvbS8KfGh0dHA6Ly9wcm94eXB5LmFwcHNwb3QuY29tLwp8aHR0 -cDovL3d3dy5hcml6b25hY2hpbmVzZS5jb20Kd3d3LmFzaWFkZW1vLm9yZwouYXRqLm9yZy50dwoK -IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmJh -aWR1LmpwLwp8aHR0cDovL3d3dy5iYXJuYWJ1LmNvLnVrCmJiYy5jby51aypjaGluZXNlCmJlaWpp -bmdzcHJpbmcuY29tCmJlc3Rmb3JjaGluYS5vcmcKYmlnbmV3cy5vcmcKLmJsaXAudHYKLmJsb2cu -Y29tLwp8aHR0cDovL3Jjb252ZXJzYXRpb24uYmxvZ3MuY29tLwp8aHR0cDovL3d3dy5ibG9nZ2Vy -LmNvbS9mZWVkcwp8aHR0cDovL2Jsb2dsaW5lcy5jb20KfGh0dHA6Ly93d3cuYmxvZ2xpbmVzLmNv -bQouYmxvZ3NvbWUuY29tCmJsb29vb29vb29nZ2VyLmJsb2dzcG90LmNvbQpjaGluYWdmdy5ibG9n -c3BvdC5jb20KeWV0YWFpLmJsb2dzcG90LmNvbQp8aHR0cDovL3d3dy5ib29rcy5jb20udHcvCmJv -eC5uZXQvc2hhcmVkL3ltY20zazBjeTgKYm94dW4uY29tCmJ1bGxvZ2dlci5jb20KCiEtLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLUMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8aHR0cDovL2Nh -b2Rhbi5uZXQKfGh0dHA6Ly93d3cuY2FybmVnaWVlbmRvd21lbnQub3JnCnd3dy5jY2R0ci5vcmcK -fGh0dHA6Ly93d3cuY2RlZi5vcmcKd3d3LmNkcDE5OTgub3JnCmNkcHd1Lm9yZwp3d3cuY2VjYy5n -b3YKfGh0dHA6Ly9jZ2lwcm94eS51cy8KfGh0dHA6Ly93d3cuY2dpcHJveHkudXMvCmNoaW5hY29t -bWVudHMub3JnCmNoaW5hZGlnaXRhbHRpbWVzLm5ldC8KY2hpbmFnZncub3JnCi5jaGluYXRpbWVz -LmNvbS8KY2hpbmF3YXkub3JnCmNoaW5lc2VuZXdzbmV0LmNvbQp8aHR0cDovL2Rldi5jaHJvbWl1 -bS5vcmcvCnxodHRwOi8vYmxvZy5jaHJvbWl1bS5vcmcvCnBzaXBob24uY2l2aXNlYy5vcmcKfGh0 -dHA6Ly93d3cuY2l2aXNlYy5vcmcKfGh0dHA6Ly9jb2RlcGFkLm9yZy8KfGh0dHA6Ly93d3cuY29v -bGxvdWQub3JnLnR3LwpjcmQtbmV0Lm9yZwpjdWlodWEub3JnCgohLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS1ELS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfGh0dHA6Ly9hay4qLmRhaWx5bW90 -aW9uLmNvbS8KbGlzdHMuZGViaWFuLm9yZwpkaXNjdXNzLmNvbS5oawp8aHR0cDovL3d3dy5kb2Ni -b29rLm9yZy8KZG91YmxlYWYuY29tCnd3dy5kb3dubG9hZC5jb20vRnJlZWdhdGUvMzAwMC0yMDg1 -XzQtMTA0MTUzOTEuaHRtbAp8aHR0cDovL3d3dy5kcHAub3JnLnR3Lwpkdy13b3JsZC5kZQp8aHR0 -cDovL3d3dy5keW5hd2ViaW5jLmNvbS8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUUtLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQplZG9vcnMuY29tCnxodHRwOi8vd3d3LmVkdWJyaWRnZS5j -b20vCnxodHRwOi8vZW5kc29mdHBhdGVudHMub3JnLwpldHJlZS5vcmcvCgohLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS1GLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfGh0dHA6Ly9mZWVkcy5m -ZWVkYnVybmVyLmNvbS8KfGh0dHA6Ly9mYXJtMS5zdGF0aWMuZmxpY2tyLmNvbS8KfGh0dHA6Ly9m -YXJtMi5zdGF0aWMuZmxpY2tyLmNvbS8KZnJlZWZvcnVtcy5vcmcvCmZyZWVtb3Jlbi5jb20vCnxo -dHRwOi8vd3d3LmZyZWVuZXQtY2hpbmEub3JnLwpmcmVlbmV0cHJvamVjdC5vcmcvCnxodHRwOi8v -d3d3LmZyZXNobWVhdC5uZXQvcHJvamVjdHMvZnJlZW5ldC8KZnJpZW5kZmVlZC5jb20lMkZlJTJG -CmZyaWVuZGZlZWQuY29tL2UvCnxodHRwOi8vd3d3LmZzdXJmLmNvbS8KLmZ1dHVyZWNoaW5hZm9y -dW0ub3JnCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1HLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0KfGh0dHA6Ly93d3cuZ2xvYmFsaW50ZXJuZXRmcmVlZG9tLm9yZy8KfGh0dHA6Ly96aC5n -bG9iYWx2b2ljZXNvbmxpbmUub3JnLwpnb29nbGUuY29tKmFuYWx5dGljcyp6aC1DTgpmZWVkcHJv -eHkuZ29vZ2xlLmNvbQp8aHR0cDovL3BhZ2VzLmdvb2dsZS5jb20vCnxodHRwOi8vd3d3Lmdvb2ds -ZS5jb20vdXJsKmN0PWNsbmsKfGh0dHA6Ly9nb29nbGVibG9nLmJsb2dzcG90LmNvbS8KLmdvb2ds -ZXBhZ2VzLmNvbS8KZ3Bhc3MxLmNvbQp8aHR0cDovL3d3dy5ncHJveHkuY29tCnxodHRwOi8vd3d3 -LmdyZWFzZXNwb3QubmV0LwpncmVhdC1maXJld2FsbC5jb20KfGh0dHA6Ly93d3cuZ3V0ZW5iZXJn -Lm9yZy8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUgtLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLQp8aHR0cDovL2hhY2thZGF5LmNvbS8KfGh0dHA6Ly93d3cuaGVhcnR5aXQuY29tLwp8aHR0 -cDovL3d3dy5oZW1pZGVtaS5jb20vCm15d2ViLmhpbmV0Lm5ldAp8aHR0cDovL3RpbWVzLmhpbmV0 -Lm5ldC8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUktLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLQp8aHR0cDovL2kxLmhrLwp8aHR0cDovL3d3dy5pYW1maXNoZXIubmV0LwpocC5pbmZvc2Vl -ay5jby5qcC8KfGh0dHA6Ly93d3cuaW0udHYvCnxodHRwOi8vd3d3LmlubWVkaWFoay5uZXQvCnxo -dHRwOi8vd3d3LmludGVybmV0ZnJlZWRvbS5vcmcvCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS1KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfGh0dHA6Ly9qYWlrdS5jb20KfGh0dHA6Ly93 -d3cuamFpa3UuY29tCi5qaXJ1YW4ubmV0CnxodHRwOi8vanByYTExMTMub3JnCgohLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS1LLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Ka2FuemhvbmdndW8u -Y29tCnxodHRwOi8vbG9nLmtlc28uY24vCnxodHRwOi8vd3d3LmttdC5vcmcudHcvCnxodHRwOi8v -d3d3Lmt6ZW5nLmluZm8vCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1MLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0KbGliZXJ0eXRpbWVzLmNvbS50dwp8aHR0cDovL2NsZS5saW51eC5vcmcu -dHcvCnxodHRwOi8vd3d3LmxpdmVqb3VybmFsLmNvbQoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tTS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1haWwtYXJjaGl2ZS5jb20KfGh0dHA6Ly9j -cS5tYWlsMTYzLnRvLwp8aHR0cDovL3d3dy5tYXRodHVubmVsLmNvbS8KfGh0dHA6Ly9tZW1lZGlh -LmNuLwoubWluZ2h1aS5vcmcKd3d3Lm1pbmdwYW8uY29tCm1pbmdwYW9uZXdzLmNvbQp8aHR0cDov -L3d3dy5taW5ncGFvbnkuY29tLwptaW56aHV6aG9uZ2d1by5vcmcKfGh0dHA6Ly93d3cubXBpbmV3 -cy5jb20vCm5ld3MubXNuLmNvbS50dwp3d3cubXNuLmNvbS50dwp8aHR0cDovL214ZXhwcmVzcy50 -d2Jicy5vcmcvCnxodHRwOi8vd3d3Lm15Y291bGQuY29tLwp8aHR0cDovL3ZpZHMubXlzcGFjZS5j -b20vCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1OLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0KbmV0Y29sb255LmNvbQp8aHR0cDovL3d3dy5uZXdzdmluZS5jb20vCnxodHRwOi8vYmxvZy5u -aWhpbG9naWMuZGsvCnxodHRwOi8vdGFpd2FueWVzLm5pbmcuY29tL2dyb3VwL3RhaXdhbnBvd2Vy -Cm50ZHR2LmNvbQoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTy0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tCm9tbml0YWxrLgovb24uY2MvKgoub24uY2MvCm15Lm9wZXJhLmNvbQp8aHR0cDov -L29zZGlyLmNvbS8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVAtLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLQpwYndpa2kuY29tCnxodHRwOi8vbmV3cy5wY2hvbWUuY29tLnR3LwoucGVhY2Vm -aXJlLm9yZwpwZWFjZWhhbGwuY29tLgpwaGlsbHkuY29tCnBzaXBob24uY2EKfGh0dHA6Ly93d3cu -cHR0LmNjLwoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tCnxodHRwOi8vcGl4ZWwucXVhbnRzZXJ2ZS5jb20vCnxodHRwOi8vcXVrZS5jbgp8aHR0 -cDovL3d3dy5xdWtlLmNuCnF4YmJzLm9yZy8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVIt -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8aHR0cDovL3d3dy5yc2Yub3JnLwp8aHR0cDovL3d3 -dy5yc2YtY2hpbmVzZS5vcmcvCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0KfGh0dHA6Ly9zLnNjcmliZC5jb20vCm5ld3Muc2luYS5jb20udHcK -bmV3cy5zaW5hLmNvbS5oawp8aHR0cDovL3Jzcy5zbGFzaGRvdC5vcmcvCi5zb3VwLmlvLwp8aHR0 -cDovL3BvcnRpczIxLnNwYWNlcy5saXZlLmNvbS8KfGh0dHA6Ly93YW5neWk2NC5zcGFjZXMubGl2 -ZS5jb20vCnxodHRwOi8vd2VueXVuY2hhby5zcGFjZXMubGl2ZS5jb20vCnVzaW5mby5zdGF0ZS5n -b3YKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LQp8aHR0cDovL3RhbnNpb2tzaW9rLmNvbS8KdGVjaG5vbG9naXplci5jb20KfGh0dHA6Ly93d3cu -dGVjaG5vcmF0aS5jb20vCnxodHRwOi8vdGhlcGlyYXRlYmF5Lm9yZy8KY2hpbmEuYmxvZ3MudGlt -ZS5jb20KdGlhbmFubWVubW90aGVyLm9yZwp0bGRwLm9yZwp0b3Jwcm9qZWN0Lm9yZwp8aHR0cDov -L2NzYWkudHNpbmdodWEuZWR1LmNuLwp8aHR0cDovL3R0dGFuLmNvbS8KdHVtYmxyLmNvbQouZ292 -LnR3Lwp0d2lzdGVybm93LmNvbQp0d2l0dGVyLmNvbS9hbW9paXN0CnR3aXR0ZXIuY29tL2JpbGx6 -aG9uZwp0d2l0dGVyLmNvbS9rY29tZQp0d2l0dGVyLmNvbS9zaGl6aGFvCnR3aXR0ZXIuY29tL1ZP -VENoaW5lc2UKdHdpdHRlci5jb20vemVuZ2ppbnlhbgp0d2l0dGVyLmNvbS96dW9sYQp8aHR0cDov -L2FwaXdpa2kudHdpdHRlci5jb20vCnxodHRwOi8vYmxvZy50d2l0dGVyLmNvbS8KfGh0dHA6Ly9k -ZXYudHdpdHRlci5jb20vCnxodHRwOi8vc3RhdHVzLnR3aXR0ZXIuY29tLwoKIS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tVS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnxodHRwOi8vYmxvZy51 -ZG4uY29tLwp8aHR0cDovL2NpdHkudWRuLmNvbS8KfGh0dHA6Ly9wYXBlci51ZG4uY29tLwp1bmN5 -Y2xvcGVkaWEuCnxodHRwOi8vdW5pZm91bmRyeS5jb20vCnxodHRwOi8vd3d3LnVua25vd25zcGFj -ZS5vcmcvCnxodHRwOi8vd3d3LnVybC5jb20udHcvCnxodHRwOi8vd3d3LmNhZmMudXNjb3VydHMu -Z292LwpodHRwOi8vZWFydGhxdWFrZS51c2dzLmdvdi9lcWNlbnRlci9yZWNlbnRlcXN3dy9NYXBz -LzEwLzEwNV8zMC5waHAKLnV3YW50cy5jb20KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVYt -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2MmV4LmNvbQp8aHR0cDovL3d3dy52aXN1d29yZHMu -Y29tLwp8aHR0cDovL3d3dy52b2FuZXdzLmNvbS8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LVctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp3d3cud2FuZ3J1b3dhbmcub3JnCi53ZWJzaG90 -cy5jb20vCndlbnh1ZWNpdHkuY29tLwp8aHR0cDovL3N0YXRpYy53ZXRwYWludC5jb20vCnxodHRw -Oi8vd3d3LndldHBhaW50LmNvbS8KfGh0dHA6Ly93d3cud2V0cGFpbnRpbmplY3RlZC5jb20vCnxo -dHRwOi8vd2lkZ2V0LndldHBhaW50c2Vydi51cy8KfGh0dHA6Ly9ldmNoay53aWtpYS5jb20vCndp -a2lkb3QuY29tCkBAc3RhdGljLndpa2lkb3QuY29tCi53aWtpbGVha3Mub3JnLwohLVdpa2lMZWFr -cyBJUAoqLzg4LjgwLjEzLjE2MC8qCnNlY3VyZS53aWtpbWVkaWEub3JnCgohLS0tLS0tLS0tLS0t -LXpoLldpa2lQZWRpYS0tLS0tCiEtLURhIEppIFl1YW4Kemgud2lraXBlZGlhLm9yZyolRTUlQTQl -QTclRTclQjQlODAlRTUlODUlODMKIS0tRGEgSmkgWXVhbiBTaGkgQmFvCnpoLndpa2lwZWRpYS5v -cmcqJUU1JUE0JUE3JUU3JUI0JTgwJUU1JTg1JTgzJUU2JTk5JTgyJUU1JUEwJUIxCiEtLURhIEpp -IFl1YW4gU2hpIEJhbzogemgtY24Kemgud2lraXBlZGlhLm9yZyolRTUlQTQlQTclRTclQkElQUEl -RTUlODUlODMlRTYlOTclQjYlRTYlOEElQTUKIS0tRGEgU2UgR3VvIEpJCnpoLndpa2lwZWRpYS5v -cmcqJUU1JUE0JUE3JUU4JUI1JUE2JUU1JTlCJUJEJUU5JTk5JTg1CiEtLUUgTHVvIFNpCnpoLndp -a2lwZWRpYS5vcmcqJUU0JUJGJTg0JUU3JUJEJTk3JUU2JTk2JUFGCiEtLUZhIEx1biBHb25nCnpo -Lndpa2lwZWRpYS5vcmcqJUU2JUIzJTk1JUU4JUJDJUFBJUU1JThBJTlGCiEtLUZhIEx1biBHb25n -OiB6aC1oYW5zCnpoLndpa2lwZWRpYS5vcmcqJUU2JUIzJTk1JUU4JUJEJUFFJUU1JThBJTlGCiEt -LUZhbmcgSHVvIENoYW5nIENoZW5nCnpoLndpa2lwZWRpYS5vcmcqJUU5JTk4JUIyJUU3JTgxJUFC -JUU5JTk1JUJGJUU1JTlGJThFCiEtLUh1YSBZdWFuIFJ1YW4gSmlhbgp6aC53aWtpcGVkaWEub3Jn -L3dpa2kvJUU4JThBJUIxJUU1JTlCJUFEJUU4JUJEJUFGJUU0JUJCJUI2CiEtLUh1YSBZdWFuIFdh -bmcKemgud2lraXBlZGlhLm9yZyolRTglOEElQjElRTUlOUIlQUQlRTclQkQlOTEKIS0tTGl1IFNp -IFNoaSBKaWFuCnpoLndpa2lwZWRpYS5vcmcqJUU1JTg1JUFEJUU1JTlCJTlCJUU0JUJBJThCJUU0 -JUJCJUI2CiEtLU1laSBHdW8gWmhpIFlpbgp6aC53aWtpcGVkaWEub3JnKiVFNyVCRSU4RSVFNSU5 -QiVCRCVFNCVCOSU4QiVFOSU5RiVCMwohLS1XZW4gQ2h1YW4gRGEgRGkgWmhlbgp6aC53aWtpcGVk -aWEub3JnKiVFNiVCMSVCNiVFNSVCNyU5RCVFNSVBNCVBNyVFNSU5QyVCMCVFOSU5QyU4NwohLS1X -dSBHdW8gSmllIEppIFpoZQp6aC53aWtpcGVkaWEub3JnKiVFNiU5NyVBMCVFNSU5QiVCRCVFNyU5 -NSU4QyVFOCVBRSVCMCVFOCU4MCU4NQohLS1XdSBKaWUgV2FuZyBMdW8Kemgud2lraXBlZGlhLm9y -ZyolRTYlOTclQTAlRTclOTUlOEMlRTclQkQlOTElRTclQkIlOUMKIS0tWGkgWmFuZyBMaXUgV2Fu -ZyBaaGVuZyBGdQp6aC53aWtpcGVkaWEub3JnKiVFOCVBNSVCRiVFOCU5NyU4RiVFNiVCNSU4MSVF -NCVCQSVBMSVFNiU5NCVCRiVFNSVCQSU5QwohLS1aaG9uZyBHdW8gRGEgTHUgRmVuZyBTdW8gV2Vp -IEpJIE1laSBUaSBTaGkgSmlhbgp6aC53aWtpcGVkaWEub3JnKiVFNCVCOCVBRCVFNSU5QiVCRCVF -NSVBNCVBNyVFOSU5OSU4NiVFNSVCMCU4MSVFOSU5NCU4MSVFNyVCQiVCNCVFNSU5RiVCQSVFNSVB -QSU5MiVFNCVCRCU5MyVFNCVCQSU4QiVFNCVCQiVCNgohLS1aaG9uZyBHdW8gRGEgTHUgV2FuZyBM -dW8gRmVuZyBTdW8Kemgud2lraXBlZGlhLm9yZyolRTQlQjglQUQlRTUlOUMlOEIlRTUlQTQlQTcl -RTklOTklQjglRTclQjYlQjIlRTglQjclQUYlRTUlQjAlODElRTklOEUlOTYKIS0tWmhvbmcgR3Vv -IFdhbmcgTHVvIFNoZW4gQ2hhCnpoLndpa2lwZWRpYS5vcmcqJUU0JUI4JUFEJUU1JTlCJUJEJUU3 -JUJEJTkxJUU3JUJCJTlDJUU1JUFFJUExJUU2JTlGJUE1CiEtLVpob25nIEh1YSBSZW4gTWluIEdv -bmcgSGUgR3VvIFdhbmcgTHVvIFNoZW4gQ2hhCnpoLndpa2lwZWRpYS5vcmcqJUU0JUI4JUFEJUU1 -JThEJThFJUU0JUJBJUJBJUU2JUIwJTkxJUU1JTg1JUIxJUU1JTkyJThDJUU1JTlCJUJEJUU3JUJE -JTkxJUU3JUJCJTlDJUU1JUFFJUExJUU2JTlGJUE1CiEtLVppIFlvdSBNZW4Kemgud2lraXBlZGlh -Lm9yZyolRTglODclQUElRTclOTQlQjElRTklOTclQTgKIS0tWmkgWW91IFlhIFpob3UKemgud2lr -aXBlZGlhLm9yZyolRTglODclQUElRTclOTQlQjElRTQlQkElOUElRTYlQjQlQjIKIS0tWmkgWW91 -IFlhIFpob3UgRGlhbiBUYWk6IHpoLWhhbnMKemgud2lraXBlZGlhLm9yZyolRTglODclQUElRTcl -OTQlQjElRTQlQkElOUElRTYlQjQlQjIlRTclOTQlQjUlRTUlOEYlQjAKCi53b3JkcHJlc3MuY29t -CkBAaHR0cDovL3Muc3RhdHMud29yZHByZXNzLmNvbS8KQEBodHRwOi8vczEud29yZHByZXNzLmNv -bS8KQEBodHRwOi8vc3RhdHMud29yZHByZXNzLmNvbS8KQEBodHRwOi8vd3d3LndvcmRwcmVzcy5j -b20KLnd1amllLm5ldAoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWC0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tCnxodHRwOi8vd3d3LnhhbmdhLmNvbS8KfGh0dHA6Ly93d3cueGluaHVhbmV0 -Lm9yZy8KfGh0dHA6Ly9ibG9nLnh1aXRlLm5ldC8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LVktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8aHR0cDovL2Jsb2cueWFtLmNvbS8KbmV3cy55 -YW0uY29tCnxodHRwOi8vd3d3LnlvdXBhaS5vcmcvCnxodHRwOi8vd3d3LnlvdXItZnJlZWRvbS5u -ZXQvCnxodHRwczovL3d3dy55b3VyLWZyZWVkb20ubmV0Lwp5b3V0dWJlLmNvbQpAQHlvdXR1YmUu -Y29tL2dldF92aWRlbwp5dGh0Lm5ldC8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVotLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8aHR0cDovL2x1bnRhbi56YW9iYW8uY29tLwouemVuZ2pp -bnlhbi5vcmcKemVuZ2ppbnlhbi5zcGFjZXMubGl2ZS5jb20KenVvbGEuY29tCgohLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS1PdGhlci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIS0tZG9uZyB0YWkg -d2FuZwolRTUlOEElQTglRTYlODAlODElRTclQkQlOTEKZmFsdW5kYWZhCiEtZmEgbHVuIGRhIGZh -CiVFNiVCMyU5NSVFOCVCRCVBRSVFNSVBNCVBNyVFNiVCMyU5NQohLS1MaXUgWGlhbyBCbwolRTUl -ODglOTglRTYlOTklOTMlRTYlQjMlQTIKc2VhcmNoP3E9Y2FjaGUKc2VhcmNoP3E9c2FmZXdlYgpV -bHRyYXJlYWNoCgoKCiEtLS0tLS1VblNvcnRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLQoKCgp8aHR0cDovL2Rsc3RhdHVzYmFyLnByb2JvYXJkczQzLmNvbS8KfGh0dHA6 -Ly93d3cud3JldGNoLmNjLwp8aHR0cDovL21hb215Lm1vdGltZS5jb20vCnxodHRwOi8vY2guc2h2 -b29uZy5jb20vCnxodHRwOi8vd3d3LmxhbmNza3kuY29tLwp8aHR0cDovL3d3dy5sZW5pbmxlZS5j -bi8KfGh0dHA6Ly93d3cuYm94Lm5ldC9zaGFyZWQvcDF0MG5meHpyZAp8aHR0cDovL3d3dy5yZmku -ZnIvYWN0dWNuL3BhZ2VzLzAwMS9ob21lY2hpbm9pcy5hc3AKfGh0dHA6Ly93d3cueXp6ay5jb20v -CnxodHRwOi8vd3d3LndlZWttYWcuaW5mby8KYmVuZGlrZW4ubmV0Ci5iYWRvbmdvLmNvbS8KLmVj -c3RhcnQuY29tLwp8aHR0cDovL2JzaWVnZWwuYXRoLmN4Lwp8aHR0cDovL3d3dy50eWNvb2wuY29t -Lwp3d3cubXNndWFuY2hhLmNvbQp8aHR0cDovL3d3dy5tZWV0dXAuY29tLwp8aHR0cDovL3d3dy5t -dWx0aXBseS5jb20vCnxodHRwOi8vdHJ1dmVvLmNvbS8KfGh0dHA6Ly9mdW5wLmNvbS8KfGh0dHA6 -Ly93d3cub3hmYW0ub3JnLmhrLwp8aHR0cDovL3d3dy5zYWx2YXRpb24ub3JnLmhrLwp8aHR0cDov -L3d3dy50YWNlbS5vcmcvCi5waXhuZXQubmV0Lwp8aHR0cDovL215c2luYWJsb2cuY29tLwp8aHR0 -cDovL3d3dy5rd29uZ3dhaC5jb20ubXkvCnxodHRwOi8vd3d3LmRhaWx5bW90aW9uLmNvbS8KfGh0 -dHA6Ly9vcmllbnRhbGRhaWx5Lm9uLmNjLwp8aHR0cDovL25ld3MuZnR2LmNvbS50dy8KfGh0dHA6 -Ly93d3cubWl0YmJzLmNvbS8KLmF0bmV4dC5jb20KfGh0dHA6Ly93d3cueHlzLm9yZy8KZ2FyZGVu +cDovL3d3dy5hcml6b25hY2hpbmVzZS5jb20Kd3d3LmFzaWFkZW1vLm9yZwouYXRqLm9yZy50dwou +YXRuZXh0LmNvbQoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQi0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tCmJhaWR1LmpwLwp8aHR0cDovL3d3dy5iYXJuYWJ1LmNvLnVrCmJiYy5jby51aypj +aGluZXNlCmJlaWppbmdzcHJpbmcuY29tCmJlc3Rmb3JjaGluYS5vcmcKYmlnbmV3cy5vcmcKLmJs +aXAudHYKLmJsb2cuY29tLwp8aHR0cDovL3Jjb252ZXJzYXRpb24uYmxvZ3MuY29tLwp8aHR0cDov +L3d3dy5ibG9nZ2VyLmNvbS9mZWVkcwp8aHR0cDovL2Jsb2dsaW5lcy5jb20KfGh0dHA6Ly93d3cu +YmxvZ2xpbmVzLmNvbQouYmxvZ3NvbWUuY29tCmJsb29vb29vb29nZ2VyLmJsb2dzcG90LmNvbQpj +aGluYWdmdy5ibG9nc3BvdC5jb20KeWV0YWFpLmJsb2dzcG90LmNvbQp8aHR0cDovL3d3dy5ib29r +cy5jb20udHcvCmJveC5uZXQvc2hhcmVkL3ltY20zazBjeTgKYm94dW4uY29tCmJ1bGxvZ2dlci5j +b20KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQp8aHR0cDovL2Nhb2Rhbi5uZXQKfGh0dHA6Ly93d3cuY2FybmVnaWVlbmRvd21lbnQub3JnCnd3 +dy5jY2R0ci5vcmcKfGh0dHA6Ly93d3cuY2RlZi5vcmcKd3d3LmNkcDE5OTgub3JnCmNkcHd1Lm9y +Zwp3d3cuY2VjYy5nb3YKfGh0dHA6Ly9jZ2lwcm94eS51cy8KfGh0dHA6Ly93d3cuY2dpcHJveHku +dXMvCmNoaW5hY29tbWVudHMub3JnCmNoaW5hZGlnaXRhbHRpbWVzLm5ldC8KY2hpbmFnZncub3Jn +Ci5jaGluYXRpbWVzLmNvbS8KY2hpbmF3YXkub3JnCmNoaW5lc2VuZXdzbmV0LmNvbQp8aHR0cDov +L2Rldi5jaHJvbWl1bS5vcmcvCnxodHRwOi8vYmxvZy5jaHJvbWl1bS5vcmcvCnBzaXBob24uY2l2 +aXNlYy5vcmcKfGh0dHA6Ly93d3cuY2l2aXNlYy5vcmcKfGh0dHA6Ly9jb2RlcGFkLm9yZy8KfGh0 +dHA6Ly93d3cuY29vbGxvdWQub3JnLnR3LwpjcmQtbmV0Lm9yZwpjdWlodWEub3JnCgohLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS1ELS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfGh0dHA6Ly9h +ay4qLmRhaWx5bW90aW9uLmNvbS8KbGlzdHMuZGViaWFuLm9yZwpkaXNjdXNzLmNvbS5oawp8aHR0 +cDovL3d3dy5kb2Nib29rLm9yZy8KZG91YmxlYWYuY29tCnd3dy5kb3dubG9hZC5jb20vRnJlZWdh +dGUvMzAwMC0yMDg1XzQtMTA0MTUzOTEuaHRtbAp8aHR0cDovL3d3dy5kcHAub3JnLnR3Lwpkdy13 +b3JsZC5kZQp8aHR0cDovL3d3dy5keW5hd2ViaW5jLmNvbS8KCiEtLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLUUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQplZG9vcnMuY29tCnxodHRwOi8vd3d3 +LmVkdWJyaWRnZS5jb20vCnxodHRwOi8vZW5kc29mdHBhdGVudHMub3JnLwpldHJlZS5vcmcvCgoh +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1GLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfGh0 +dHA6Ly9mZWVkcy5mZWVkYnVybmVyLmNvbS8KfGh0dHA6Ly9mYXJtMS5zdGF0aWMuZmxpY2tyLmNv +bS8KfGh0dHA6Ly9mYXJtMi5zdGF0aWMuZmxpY2tyLmNvbS8KZnJlZWZvcnVtcy5vcmcvCmZyZWVt +b3Jlbi5jb20vCnxodHRwOi8vd3d3LmZyZWVuZXQtY2hpbmEub3JnLwpmcmVlbmV0cHJvamVjdC5v +cmcvCnxodHRwOi8vd3d3LmZyZXNobWVhdC5uZXQvcHJvamVjdHMvZnJlZW5ldC8KZnJpZW5kZmVl +ZC5jb20lMkZlJTJGCmZyaWVuZGZlZWQuY29tL2UvCnxodHRwOi8vd3d3LmZzdXJmLmNvbS8KLmZ1 +dHVyZWNoaW5hZm9ydW0ub3JnCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1HLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0KfGh0dHA6Ly93d3cuZ2xvYmFsaW50ZXJuZXRmcmVlZG9tLm9yZy8K +fGh0dHA6Ly96aC5nbG9iYWx2b2ljZXNvbmxpbmUub3JnLwpnb29nbGUuY29tKmFuYWx5dGljcyp6 +aC1DTgpmZWVkcHJveHkuZ29vZ2xlLmNvbQp8aHR0cDovL3BhZ2VzLmdvb2dsZS5jb20vCnxodHRw +Oi8vd3d3Lmdvb2dsZS5jb20vdXJsKmN0PWNsbmsKfGh0dHA6Ly9nb29nbGVibG9nLmJsb2dzcG90 +LmNvbS8KLmdvb2dsZXBhZ2VzLmNvbS8KZ3Bhc3MxLmNvbQp8aHR0cDovL3d3dy5ncHJveHkuY29t +CnxodHRwOi8vd3d3LmdyZWFzZXNwb3QubmV0LwpncmVhdC1maXJld2FsbC5jb20KfGh0dHA6Ly93 +d3cuZ3V0ZW5iZXJnLm9yZy8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUgtLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQp8aHR0cDovL2hhY2thZGF5LmNvbS8KfGh0dHA6Ly93d3cuaGVhcnR5 +aXQuY29tLwp8aHR0cDovL3d3dy5oZW1pZGVtaS5jb20vCm15d2ViLmhpbmV0Lm5ldAp8aHR0cDov +L3RpbWVzLmhpbmV0Lm5ldC8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUktLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQp8aHR0cDovL2kxLmhrLwp8aHR0cDovL3d3dy5pYW1maXNoZXIubmV0 +LwpocC5pbmZvc2Vlay5jby5qcC8KfGh0dHA6Ly93d3cuaW0udHYvCnxodHRwOi8vd3d3LmlubWVk +aWFoay5uZXQvCnxodHRwOi8vd3d3LmludGVybmV0ZnJlZWRvbS5vcmcvCgohLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS1KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfGh0dHA6Ly9qYWlrdS5j +b20KfGh0dHA6Ly93d3cuamFpa3UuY29tCi5qaXJ1YW4ubmV0CnxodHRwOi8vanByYTExMTMub3Jn +CgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1LLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K +a2FuemhvbmdndW8uY29tCnxodHRwOi8vbG9nLmtlc28uY24vCnxodHRwOi8vd3d3LmttdC5vcmcu +dHcvCnxodHRwOi8vd3d3Lmt6ZW5nLmluZm8vCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1M +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbGliZXJ0eXRpbWVzLmNvbS50dwp8aHR0cDovL2Ns +ZS5saW51eC5vcmcudHcvCnxodHRwOi8vd3d3LmxpdmVqb3VybmFsLmNvbQoKIS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tTS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1haWwtYXJjaGl2ZS5j +b20KfGh0dHA6Ly9jcS5tYWlsMTYzLnRvLwp8aHR0cDovL3d3dy5tYXRodHVubmVsLmNvbS8KfGh0 +dHA6Ly9tZW1lZGlhLmNuLwoubWluZ2h1aS5vcmcKd3d3Lm1pbmdwYW8uY29tCm1pbmdwYW9uZXdz +LmNvbQp8aHR0cDovL3d3dy5taW5ncGFvbnkuY29tLwptaW56aHV6aG9uZ2d1by5vcmcKfGh0dHA6 +Ly93d3cubXBpbmV3cy5jb20vCm5ld3MubXNuLmNvbS50dwp3d3cubXNuLmNvbS50dwp8aHR0cDov +L214ZXhwcmVzcy50d2Jicy5vcmcvCnxodHRwOi8vd3d3Lm15Y291bGQuY29tLwp8aHR0cDovL3Zp +ZHMubXlzcGFjZS5jb20vCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1OLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0KbmV0Y29sb255LmNvbQp8aHR0cDovL3d3dy5uZXdzdmluZS5jb20vCnxo +dHRwOi8vYmxvZy5uaWhpbG9naWMuZGsvCnxodHRwOi8vdGFpd2FueWVzLm5pbmcuY29tL2dyb3Vw +L3RhaXdhbnBvd2VyCm50ZHR2LmNvbQoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tCm9tbml0YWxrLgovb24uY2MvKgoub24uY2MvCm15Lm9wZXJh +LmNvbQp8aHR0cDovL29zZGlyLmNvbS8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVAtLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpwYndpa2kuY29tCnxodHRwOi8vbmV3cy5wY2hvbWUuY29t +LnR3LwoucGVhY2VmaXJlLm9yZwpwZWFjZWhhbGwuY29tLgpwaGlsbHkuY29tCnBzaXBob24uY2EK +fGh0dHA6Ly93d3cucHR0LmNjLwoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tCnxodHRwOi8vcGl4ZWwucXVhbnRzZXJ2ZS5jb20vCnxodHRwOi8v +cXVrZS5jbgp8aHR0cDovL3d3dy5xdWtlLmNuCnF4YmJzLm9yZy8KCiEtLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLVItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8aHR0cDovL3d3dy5yc2Yub3Jn +Lwp8aHR0cDovL3d3dy5yc2YtY2hpbmVzZS5vcmcvCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS1TLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfGh0dHA6Ly9zLnNjcmliZC5jb20vCm5ld3Mu +c2luYS5jb20udHcKbmV3cy5zaW5hLmNvbS5oawp8aHR0cDovL3Jzcy5zbGFzaGRvdC5vcmcvCi5z +b3VwLmlvLwp8aHR0cDovL3BvcnRpczIxLnNwYWNlcy5saXZlLmNvbS8KfGh0dHA6Ly93YW5neWk2 +NC5zcGFjZXMubGl2ZS5jb20vCnxodHRwOi8vd2VueXVuY2hhby5zcGFjZXMubGl2ZS5jb20vCnVz +aW5mby5zdGF0ZS5nb3YKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVQtLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQp8aHR0cDovL3RhbnNpb2tzaW9rLmNvbS8KdGVjaG5vbG9naXplci5jb20K +fGh0dHA6Ly93d3cudGVjaG5vcmF0aS5jb20vCnxodHRwOi8vdGhlcGlyYXRlYmF5Lm9yZy8KY2hp +bmEuYmxvZ3MudGltZS5jb20KdGlhbmFubWVubW90aGVyLm9yZwp0bGRwLm9yZwp0b3Jwcm9qZWN0 +Lm9yZwp8aHR0cDovL2NzYWkudHNpbmdodWEuZWR1LmNuLwp8aHR0cDovL3R0dGFuLmNvbS8KdHVt +YmxyLmNvbQouZ292LnR3Lwp0d2lzdGVybm93LmNvbQp0d2l0dGVyLmNvbS9hbW9paXN0CnR3aXR0 +ZXIuY29tL2JpbGx6aG9uZwp0d2l0dGVyLmNvbS9rY29tZQp0d2l0dGVyLmNvbS9zaGl6aGFvCnR3 +aXR0ZXIuY29tL1ZPVENoaW5lc2UKdHdpdHRlci5jb20vemVuZ2ppbnlhbgp0d2l0dGVyLmNvbS96 +dW9sYQp8aHR0cDovL2FwaXdpa2kudHdpdHRlci5jb20vCnxodHRwOi8vYmxvZy50d2l0dGVyLmNv +bS8KfGh0dHA6Ly9kZXYudHdpdHRlci5jb20vCnxodHRwOi8vc3RhdHVzLnR3aXR0ZXIuY29tLwoK +IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnxo +dHRwOi8vYmxvZy51ZG4uY29tLwp8aHR0cDovL2NpdHkudWRuLmNvbS8KfGh0dHA6Ly9wYXBlci51 +ZG4uY29tLwp1bmN5Y2xvcGVkaWEuCnxodHRwOi8vdW5pZm91bmRyeS5jb20vCnxodHRwOi8vd3d3 +LnVua25vd25zcGFjZS5vcmcvCnxodHRwOi8vd3d3LnVybC5jb20udHcvCnxodHRwOi8vd3d3LmNh +ZmMudXNjb3VydHMuZ292LwpodHRwOi8vZWFydGhxdWFrZS51c2dzLmdvdi9lcWNlbnRlci9yZWNl +bnRlcXN3dy9NYXBzLzEwLzEwNV8zMC5waHAKLnV3YW50cy5jb20KCiEtLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLVYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2MmV4LmNvbQp8aHR0cDovL3d3 +dy52aXN1d29yZHMuY29tLwp8aHR0cDovL3d3dy52b2FuZXdzLmNvbS8KCiEtLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLVctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp3d3cud2FuZ3J1b3dhbmcu +b3JnCi53ZWJzaG90cy5jb20vCndlbnh1ZWNpdHkuY29tLwp8aHR0cDovL3N0YXRpYy53ZXRwYWlu +dC5jb20vCnxodHRwOi8vd3d3LndldHBhaW50LmNvbS8KfGh0dHA6Ly93d3cud2V0cGFpbnRpbmpl +Y3RlZC5jb20vCnxodHRwOi8vd2lkZ2V0LndldHBhaW50c2Vydi51cy8KfGh0dHA6Ly9ldmNoay53 +aWtpYS5jb20vCndpa2lkb3QuY29tCkBAc3RhdGljLndpa2lkb3QuY29tCi53aWtpbGVha3Mub3Jn +LwohLVdpa2lMZWFrcyBJUAoqLzg4LjgwLjEzLjE2MC8qCnNlY3VyZS53aWtpbWVkaWEub3JnCgoh +LS0tLS0tLS0tLS0tLXpoLldpa2lQZWRpYS0tLS0tCiEtLURhIEppIFl1YW4Kemgud2lraXBlZGlh +Lm9yZyolRTUlQTQlQTclRTclQjQlODAlRTUlODUlODMKIS0tRGEgSmkgWXVhbiBTaGkgQmFvCnpo +Lndpa2lwZWRpYS5vcmcqJUU1JUE0JUE3JUU3JUI0JTgwJUU1JTg1JTgzJUU2JTk5JTgyJUU1JUEw +JUIxCiEtLURhIEppIFl1YW4gU2hpIEJhbzogemgtY24Kemgud2lraXBlZGlhLm9yZyolRTUlQTQl +QTclRTclQkElQUElRTUlODUlODMlRTYlOTclQjYlRTYlOEElQTUKIS0tRGEgU2UgR3VvIEpJCnpo +Lndpa2lwZWRpYS5vcmcqJUU1JUE0JUE3JUU4JUI1JUE2JUU1JTlCJUJEJUU5JTk5JTg1CiEtLUUg +THVvIFNpCnpoLndpa2lwZWRpYS5vcmcqJUU0JUJGJTg0JUU3JUJEJTk3JUU2JTk2JUFGCiEtLUZh +IEx1biBHb25nCnpoLndpa2lwZWRpYS5vcmcqJUU2JUIzJTk1JUU4JUJDJUFBJUU1JThBJTlGCiEt +LUZhIEx1biBHb25nOiB6aC1oYW5zCnpoLndpa2lwZWRpYS5vcmcqJUU2JUIzJTk1JUU4JUJEJUFF +JUU1JThBJTlGCiEtLUZhbmcgSHVvIENoYW5nIENoZW5nCnpoLndpa2lwZWRpYS5vcmcqJUU5JTk4 +JUIyJUU3JTgxJUFCJUU5JTk1JUJGJUU1JTlGJThFCiEtLUh1YSBZdWFuIFJ1YW4gSmlhbgp6aC53 +aWtpcGVkaWEub3JnL3dpa2kvJUU4JThBJUIxJUU1JTlCJUFEJUU4JUJEJUFGJUU0JUJCJUI2CiEt +LUh1YSBZdWFuIFdhbmcKemgud2lraXBlZGlhLm9yZyolRTglOEElQjElRTUlOUIlQUQlRTclQkQl +OTEKIS0tTGl1IFNpIFNoaSBKaWFuCnpoLndpa2lwZWRpYS5vcmcqJUU1JTg1JUFEJUU1JTlCJTlC +JUU0JUJBJThCJUU0JUJCJUI2CiEtLU1laSBHdW8gWmhpIFlpbgp6aC53aWtpcGVkaWEub3JnKiVF +NyVCRSU4RSVFNSU5QiVCRCVFNCVCOSU4QiVFOSU5RiVCMwohLS1XZW4gQ2h1YW4gRGEgRGkgWmhl +bgp6aC53aWtpcGVkaWEub3JnKiVFNiVCMSVCNiVFNSVCNyU5RCVFNSVBNCVBNyVFNSU5QyVCMCVF +OSU5QyU4NwohLS1XdSBHdW8gSmllIEppIFpoZQp6aC53aWtpcGVkaWEub3JnKiVFNiU5NyVBMCVF +NSU5QiVCRCVFNyU5NSU4QyVFOCVBRSVCMCVFOCU4MCU4NQohLS1XdSBKaWUgV2FuZyBMdW8Kemgu +d2lraXBlZGlhLm9yZyolRTYlOTclQTAlRTclOTUlOEMlRTclQkQlOTElRTclQkIlOUMKIS0tWGkg +WmFuZyBMaXUgV2FuZyBaaGVuZyBGdQp6aC53aWtpcGVkaWEub3JnKiVFOCVBNSVCRiVFOCU5NyU4 +RiVFNiVCNSU4MSVFNCVCQSVBMSVFNiU5NCVCRiVFNSVCQSU5QwohLS1aaG9uZyBHdW8gRGEgTHUg +RmVuZyBTdW8gV2VpIEpJIE1laSBUaSBTaGkgSmlhbgp6aC53aWtpcGVkaWEub3JnKiVFNCVCOCVB +RCVFNSU5QiVCRCVFNSVBNCVBNyVFOSU5OSU4NiVFNSVCMCU4MSVFOSU5NCU4MSVFNyVCQiVCNCVF +NSU5RiVCQSVFNSVBQSU5MiVFNCVCRCU5MyVFNCVCQSU4QiVFNCVCQiVCNgohLS1aaG9uZyBHdW8g +RGEgTHUgV2FuZyBMdW8gRmVuZyBTdW8Kemgud2lraXBlZGlhLm9yZyolRTQlQjglQUQlRTUlOUMl +OEIlRTUlQTQlQTclRTklOTklQjglRTclQjYlQjIlRTglQjclQUYlRTUlQjAlODElRTklOEUlOTYK +IS0tWmhvbmcgR3VvIFdhbmcgTHVvIFNoZW4gQ2hhCnpoLndpa2lwZWRpYS5vcmcqJUU0JUI4JUFE +JUU1JTlCJUJEJUU3JUJEJTkxJUU3JUJCJTlDJUU1JUFFJUExJUU2JTlGJUE1CiEtLVpob25nIEh1 +YSBSZW4gTWluIEdvbmcgSGUgR3VvIFdhbmcgTHVvIFNoZW4gQ2hhCnpoLndpa2lwZWRpYS5vcmcq +JUU0JUI4JUFEJUU1JThEJThFJUU0JUJBJUJBJUU2JUIwJTkxJUU1JTg1JUIxJUU1JTkyJThDJUU1 +JTlCJUJEJUU3JUJEJTkxJUU3JUJCJTlDJUU1JUFFJUExJUU2JTlGJUE1CiEtLVppIFlvdSBNZW4K +emgud2lraXBlZGlhLm9yZyolRTglODclQUElRTclOTQlQjElRTklOTclQTgKIS0tWmkgWW91IFlh +IFpob3UKemgud2lraXBlZGlhLm9yZyolRTglODclQUElRTclOTQlQjElRTQlQkElOUElRTYlQjQl +QjIKIS0tWmkgWW91IFlhIFpob3UgRGlhbiBUYWk6IHpoLWhhbnMKemgud2lraXBlZGlhLm9yZyol +RTglODclQUElRTclOTQlQjElRTQlQkElOUElRTYlQjQlQjIlRTclOTQlQjUlRTUlOEYlQjAKCi53 +b3JkcHJlc3MuY29tCkBAaHR0cDovL3Muc3RhdHMud29yZHByZXNzLmNvbS8KQEBodHRwOi8vczEu +d29yZHByZXNzLmNvbS8KQEBodHRwOi8vc3RhdHMud29yZHByZXNzLmNvbS8KQEBodHRwOi8vd3d3 +LndvcmRwcmVzcy5jb20KLnd1amllLm5ldAoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWC0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnxodHRwOi8vd3d3LnhhbmdhLmNvbS8KfGh0dHA6Ly93 +d3cueGluaHVhbmV0Lm9yZy8KfGh0dHA6Ly9ibG9nLnh1aXRlLm5ldC8KCiEtLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLVktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8aHR0cDovL2Jsb2cueWFt +LmNvbS8KbmV3cy55YW0uY29tCnxodHRwOi8vd3d3LnlvdXBhaS5vcmcvCnxodHRwOi8vd3d3Lnlv +dXItZnJlZWRvbS5uZXQvCnxodHRwczovL3d3dy55b3VyLWZyZWVkb20ubmV0Lwp5b3V0dWJlLmNv +bQpAQHlvdXR1YmUuY29tL2dldF92aWRlbwp5dGh0Lm5ldC8KCiEtLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLVotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8aHR0cDovL2x1bnRhbi56YW9iYW8u +Y29tLwouemVuZ2ppbnlhbi5vcmcKemVuZ2ppbnlhbi5zcGFjZXMubGl2ZS5jb20KenVvbGEuY29t +CgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1PdGhlci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K +IS0tZG9uZyB0YWkgd2FuZwolRTUlOEElQTglRTYlODAlODElRTclQkQlOTEKZmFsdW5kYWZhCiEt +ZmEgbHVuIGRhIGZhCiVFNiVCMyU5NSVFOCVCRCVBRSVFNSVBNCVBNyVFNiVCMyU5NQohLS1MaXUg +WGlhbyBCbwolRTUlODglOTglRTYlOTklOTMlRTYlQjMlQTIKc2VhcmNoP3E9Y2FjaGUKc2VhcmNo +P3E9c2FmZXdlYgpVbHRyYXJlYWNoCgoKCiEtLS0tLS1VblNvcnRlZC0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgp8aHR0cDovL2Rsc3RhdHVzYmFyLnByb2JvYXJkczQz +LmNvbS8KfGh0dHA6Ly93d3cud3JldGNoLmNjLwp8aHR0cDovL21hb215Lm1vdGltZS5jb20vCnxo +dHRwOi8vY2guc2h2b29uZy5jb20vCnxodHRwOi8vd3d3LmxhbmNza3kuY29tLwp8aHR0cDovL3d3 +dy5sZW5pbmxlZS5jbi8KfGh0dHA6Ly93d3cuYm94Lm5ldC9zaGFyZWQvcDF0MG5meHpyZAp8aHR0 +cDovL3d3dy5yZmkuZnIvYWN0dWNuL3BhZ2VzLzAwMS9ob21lY2hpbm9pcy5hc3AKfGh0dHA6Ly93 +d3cueXp6ay5jb20vCnxodHRwOi8vd3d3LndlZWttYWcuaW5mby8KYmVuZGlrZW4ubmV0Ci5iYWRv +bmdvLmNvbS8KLmVjc3RhcnQuY29tLwp8aHR0cDovL2JzaWVnZWwuYXRoLmN4Lwp8aHR0cDovL3d3 +dy50eWNvb2wuY29tLwp3d3cubXNndWFuY2hhLmNvbQp8aHR0cDovL3d3dy5tZWV0dXAuY29tLwp8 +aHR0cDovL3d3dy5tdWx0aXBseS5jb20vCnxodHRwOi8vdHJ1dmVvLmNvbS8KfGh0dHA6Ly9mdW5w +LmNvbS8KfGh0dHA6Ly93d3cub3hmYW0ub3JnLmhrLwp8aHR0cDovL3d3dy5zYWx2YXRpb24ub3Jn +LmhrLwp8aHR0cDovL3d3dy50YWNlbS5vcmcvCi5waXhuZXQubmV0Lwp8aHR0cDovL215c2luYWJs +b2cuY29tLwp8aHR0cDovL3d3dy5rd29uZ3dhaC5jb20ubXkvCnxodHRwOi8vd3d3LmRhaWx5bW90 +aW9uLmNvbS8KfGh0dHA6Ly9vcmllbnRhbGRhaWx5Lm9uLmNjLwp8aHR0cDovL25ld3MuZnR2LmNv +bS50dy8KfGh0dHA6Ly93d3cubWl0YmJzLmNvbS8KfGh0dHA6Ly93d3cueHlzLm9yZy8KZ2FyZGVu bmV0d29ya3MuY29tCnNlY3JldGNoaW5hLmNvbQpkb25ndGFpd2FuZy5jb20Kc291bmRvZmhvcGUu b3JnCmJvbGluLm5ldGZpcm1zLmNvbQp8aHR0cDovL3d3dy5yZmEub3JnLwplcG9jaHRpbWVzLmNv bS8KZGFqaXl1YW4uY29tLwpjb21lZnJvbWNoaW5hLmNvbQpnb3BldGl0aW9uLmNvbQpjcmVhZGVy diff --git a/sendGFWList.sh b/sendGFWList.sh new file mode 100755 index 0000000..5d2895e --- /dev/null +++ b/sendGFWList.sh @@ -0,0 +1,99 @@ +#!/bin/bash +# +# A simple script help to maintain AutoProxy gfwList easily. +# +# Function: +# Update local svn repository; +# Commit decoded changes(by others in your team) to local git repository +# with decoded message and authors name; +# Update "Last Modified" time; +# Update "Checksum"; +# Commit your changes to local git repository; +# Commit your encoded changes to remote svn repository with encoded log. +# Usage: +# Initialize: +# $svn checkout https://autoproxy-gfwlist.googlecode.com/svn/trunk/ gfwList --username your-google-user-name +# $cd gfwList +# $git init +# $base64 gfwlist.txt > list.txt +# $git add list.txt +# $git commit -a -m "init" +# Normal Usage: +# edit list.txt as usual; +# $./synGfwList.sh "say something about this edit" +# Note: +# 1: You can use "git" to show, diff, log...what's you want; +# 2: "gfwlist.txt" is a fake file, do NOT commit "list.txt" to svn server; +# 3: Do NOT use any unicode character in the list, there is a known bug. +############################################################################### + +# dependence +for cmd in sed date base64 gawk svn git +do + which $cmd &> /dev/null; + if [ $? -ne 0 ]; then + echo "Depends on $cmd, please install it first."; + exit 1; + fi +done + +# get current revision number +oriLang=$LANG; export LANG="en_US"; +curRevNum=$( svn info | gawk '/^Revision:/ { print $2 }' ); +export LANG=$oriLang; + +# save local modification +git diff > temp.patch && + +svn update && + +# get formated author and log information +log=$(svn log -r $curRevNum:HEAD) && +log=$(echo $log | gawk -v RS='------------------------------------------------------------------------'\ + 'NR > 3 { if (NF > 10) printf "%s:%s;", $3, $NF; }' ) && + +# convert from base64 +i=0 && +convertedLog="" && +while [ "$log" != "" ] +do + if (( $i%2 == 0 )); then # author + temp=${log%%:*}; + convertedLog+=$temp; + convertedLog+=":\""; + log=${log#*:}; + else # log, decode it + temp=$( echo ${log%%;*} | base64 -d); + convertedLog+=$temp; + convertedLog+="\"; "; + log=${log#*;}; + fi + ((i++)); +done + +# replace last ";" symbol to "." +convertedLog=$( echo $convertedLog | sed 's/;$/\./' ) && + +if [ "$convertedLog" != "" ]; then + # modified by others, commit to local repository. + # log format: author1:"message1"; author2:"message2"... + base64 -d gfwlist.txt > list.txt && + git commit -a -m "$convertedLog" && + + # apply local modification + git apply temp.patch; +fi + +# update date and checksum +sed -i s/"Last Modified:.*$"/"Last Modified: $(date -R -r list.txt)"/ list.txt && +./addChecksum.pl list.txt && + +# save self change to git +git commit -a -m "$*" && + +# commit to remote svn server +base64 list.txt > gfwlist.txt && +svn ci -m $( echo "$*" | base64 ) && + +rm temp.patch; +