U2NyaXB0Cg==

This commit is contained in:
lovelywcm 2009-03-11 08:36:57 +00:00
parent 1e2cf10439
commit a75ab263ce
3 changed files with 331 additions and 167 deletions

65
addChecksum.pl Executable file
View File

@ -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 = <FILE>;
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);
}

View File

@ -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

99
sendGFWList.sh Executable file
View File

@ -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;