diff --git a/tags/ripnews-release_0_5_3/ripnews/CHANGELOG b/tags/ripnews-release_0_5_3/ripnews/CHANGELOG new file mode 100644 index 0000000..02df063 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/CHANGELOG @@ -0,0 +1,120 @@ +# $Dwarf: CHANGELOG,v 1.39 2005/05/10 20:52:58 ward Exp $ +# $Source$ + +from 0.5.2 to 0.5.3 + - fix the occasional deadlock + - implement Mark Remaining Read option + - throw articles that are marked read out of the caches + - implement username & password option + - lots of small improvements + +from 0.5.1 to 0.5.2 + - major improvement in memory usage + - speed ups + - don't try to fetch really old headers + +from 0.5.0 to 0.5.1 + - fix some yenc problems with threads + - fix some thread return problems + +from 0.2.3 to 0.5.0 + - changes to make it work with ruby 1.8.1 + - internal structures changed in article.rb + - huge of memory usage improvements... - 90% less memory usage + - (more) gracefully handle bad yencodings + - enable file inclusion + - add MODE READER command + - use a thread for decoding for multi-part posts + - locking cleaned up, no more calling of ps(1) + +from 0.2.2 to 0.2.3 + - notify when cachedir doesn't exist + - expand ${HOME} in config to your homedir + - fix problem where the limiting of the number of headers + to get in one call wouldn't work + - don't change cache files in place + - keep old config if there are errors while reloading + - change cache format to a file per server model (use + cacheconverter to convert cache files) + - add license text + - lots of small fixes + +from 0.2.1 to 0.2.2 + - improve output layout + - show running time + - PID lockfile implementation + - catch another error + - fetch subjects sorted so you get a better chance at getting + full series + - now your TEMPDIR can be on another drive than your DATADIR + - reread config on SIGHUP + +from 0.2.0 to 0.2.1 + - fail gracefully at a lack of configuration + - fail gracefully if tempdir doesn't exist or isn't writable + - implement DELEXT configuration option + - implement OPT_MR configuration option + +from 0.1.0 to 0.2.0 + - fix extension enforcing + - code cleanups + - split of uudecoding and ydecoding + - add some regression tests + - various bug fixes + - remove articles from newsrc that aren't on the server any + longer + - major speed improvements + +from 0.0.9 to 0.1.0 + - allow comments after continuing lines, like this: + OPT_I=(?i)( \ + agresion| \ # Paul + apex theory| \ + at the drive in| \ # Paul + bad religion| \ + - some speed ups + - many more exceptions are handled + - more consistent error messages + +from 0.0.8 to 0.0.9 + - maxfilelength check + - improved subject checking + - linebuffered stdout + - always use push when adding stuff to an array, this is way more + efficient than += + - always use << when adding stuff to a string, this is way more + efficient than += + +from 0.0.7 to 0.0.8 + - more and simpler exceptions + - better argument checking + - more helpful help + +from 0.0.6 to 0.0.7 + - use exceptions for a lot of problems + - code cleanups + +from 0.0.5 to 0.0.6 + - new option -C for combined filenames eg. "subject-[filename]" + - prevent reconnect loops + - be more paranoid with decoding yEnc-encoded articles + - more/better timeouts + +from 0.0.4 to 0.0.5 + - implement timeouts on article fetching + (no more "hangs", hopefully) + - remove servers from list on connection failure + - much more robust + +from 0.0.3 to 0.0.4 + - server reconnects now work + +from 0.0.2 to 0.0.3 + - filtering on file extensions + - multiple servers are now tried in order + +from 0.01 to 0.02 + - yEnc support by Stijn Hoop. Thanks. + - change cache file format + - sort cache file + - minor bugs diff --git a/tags/ripnews-release_0_5_3/ripnews/INSTALL b/tags/ripnews-release_0_5_3/ripnews/INSTALL new file mode 100644 index 0000000..15b86bd --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/INSTALL @@ -0,0 +1,8 @@ +# $Dwarf: INSTALL,v 1.1 2002/05/05 20:05:11 ward Exp $ +# $Source$ + +For now the easiest way to install this is just extract the tarball in +its own directory and run ./ripnews.rb from there. Before running you +should make your own .ripnewsrc configuration file which is described in +the README file. You may have to change the first line in ripnews.rb to +point to your ruby executable. diff --git a/tags/ripnews-release_0_5_3/ripnews/README b/tags/ripnews-release_0_5_3/ripnews/README new file mode 100644 index 0000000..0585510 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/README @@ -0,0 +1,206 @@ +# $Dwarf: README,v 1.20 2005/03/01 09:18:25 ward Exp $ +# $Source$ + +Ripnews is a bulk downloader for usenet. It's quite flexible in terms of +configuration. Some of it's features are: + +- basic support for multiple servers per group +- cacheing of article headers to speed up reading of newsgroups +- newsrc file support (one newsrc file per server) +- flexible but simple configuration + +Configuration: +============== + +I'll just give a commented example config, it should be pretty clear, +after that I'll list the possible options. + +<== cut here ==> +# Set the default NNTPSERVER to localhost +NNTPSERVER=localhost + +# Set the cachedir, this is where the subject caches are stored +# without this ripnews will be much slower (but should still work) +CACHEDIR=/mnt/newspace/News/.ripnews_caches + +# PID lockfile, prevents multiple ripnews processes from running at the +# same time [global keyword] +LOCKFILE=/local/newspace/News/.ripnewslock + +# Set the datadir, this where a subdir for each group will be made to +# store the ripped articles +DATADIR=/mnt/newspace/News + +# Set the tempdir, used to store the undecoded data. Without this ripnews +# uses a lot more memory +TEMPDIR=/mnt/newspace/News/ripnews_temp + +# Set include pattern to a case insensitive "grateful.dead" +OPT_I=(?i)grateful.dead + +# Set the base newsrc name. The server name will be appended. +NEWSRCNAME=/ward/src/ruby/ripnews/.newsrc + +# Set the permission to create subdirs with +PERMISSION=0700 + +# Set the niceness of the ripnews process [global keyword] +NICE=20 + +# For alt.binaries.e-book and alt.binaries.e-books change from defaults... +alt.binaries.e-book| \ +alt.binaries.e-books { + # Set another include pattern + OPT_I=(?i)(bible|dickens|shakespeare) +} + +alt.binaries.e-book.flood { + # Add to default pattern, this will not be case insensitive + # anymore, because that's how ruby patterns work + OPT_I+=|george.orwell +} + +# For both alt.binaries.e-book, alt.binaries.e-books and +# alt.binaries.e-book.flood change some value +alt.binaries.e-book| \ +alt.binaries.e-books| \ +alt.binaries.e-book.flood { + # Sets long filenames. If this is set the subject will be used + # as a filename instead of the name specified in the encoding. + OPT_L = true +} + +# Change default server to news.tilbu1.nb.nl.home.com, since the config +# is parsed in order this will be used from her on down +NNTPSERVER=news.tilbu1.nb.nl.home.com + +alt.binaries.music.classical| \ +alt.binaries.sounds.lossless.classical| \ +alt.binaries.sounds.mp3.classical { + # Add news4.euro.net as a second server for + # alt.binaries.music.classical, + # alt.binaries.sounds.lossless.classical and + # alt.binaries.sounds.mp3.classical + NNTPSERVER+=|news4.euro.net +} + +alt.binaries.music.classical| \ +alt.binaries.sounds.lossless.classical| \ +alt.binaries.sounds.mp3.classical { + OPT_L=true + OPT_I=(?i)( \ + verdi| \ + vivaldi| \ + mozart| \ + beethoven \ + ) +} +<== cut here ==> + +Supported commandline options: +------------------------------ + +"-I", "--include" Set include pattern. +"-c", "--configfile" Specify a different config file. Default + .ripnewsrc +"-L", "--longname" Sets long filenames. +"-C", "--combinedname" Sets combined filenames. +"-M", "--multipart" Get multipart articles +"-s" Exit silently if already running +"-S", "--singlepart" Get singlepart articles +"-T", "--test" Set test mode. Newsrc files will not be writen + to. +"-X", "--exclude" Set exclude pattern. + +Supported config options: +------------------------- + +OPT_I= Set include pattern. +OPT_L= Set long filenames. +OPT_C= Sets combined filenames. +OPT_X= Set exclude pattern. Ripnews will read articles + matching this pattern but it will not attempt + to download them. +OPT_MR= Set "mark read" pattern. Ripnews will place + articles matching this pattern in your newsrc, + afterwards they will never be present in memory + again. Great for reducing memory usage when + checking a group for the first time. +OPT_MRR= Mark Remaining Read. If this is set to + true and the article doesn't match an exclude or + include pattern, the article will be + marked as read. The purpose of this is + to keep the caches of extremely large + groups small as to make processing + quicker. +OPT_T= Set test mode. Newsrc files will not be written + to. +TEMPDIR= Set tempdir location. +NNTPSERVER=[|server] Set NNTPSERVER names + You can also use this notation: + :@ for each server + if you need to authenticate by username + and password. +CACHEDIR= Set cachedir location. +DATADIR= Set output dir location. +NEWSRCNAME= Specify newsrc basename. Server names + will be appended. +PERMISSION= Set permission bits for directory + creation. Standard unix style, eg. 0755. +EXTENSIONS= Set extension include pattern. +OPT_M= Set EXTENSIONS just for multi part messages. +OPT_S= Set EXTENSIONS just for single part messages. +DELEXT= Set extension "mark read" pattern. +OPT_MD= Set DELEXT just for multi part messages. +OPT_SD= Set DELEXT just for single part messages. +INCLUDEFILE= Include another file, only works in main config. +PRIMARYTHRES= At least this percentage of the post has to be found + on the first server. + +Ruby patterns: +-------------- + +Ruby patterns are a lot like perl patterns, but there are some +differences. (?i) is the modifier to turn on case insensitivity, unlike +perl this modifier only works on the following block. Luckily you can +group multiple blocks into one by enclosing them with ()'s. So while +'OPT_I=(?i)foo|bar' would match 'foo' case insensitve and 'bar' case +sensitive 'OPT_I=(?i)(foo|bar)' will match both 'foo' and 'bar' case +insensitivly. + +Caveat: if for some reason you use a | at the end of a list of patterns +(for instance: OPT_X=(?i)(foo|bar|) ) the pattern will also match an +empty string. This can have the result that you exclude everything if +you use it with OPT_X, or include everything with OPT_I. You have been +warned. + +Other features: +=============== + +You can make a running ripnews process reread it's configuration by +sending it a SIGHUP. + +Where can I find newsservers: +============================= +freenews.maxbaud.net +www.newzbot.com +www.gj.net/~bhkraft + +Known bugs: +=========== + +There are no known bugs at this moment. If you find any, please let me +know. As with all my software, if it breaks you get to keep _both_ +pieces. + +Credits: +======== +- Stijn Hoop for adding yEnc support + +Contact info: +============= + +New problems can be reported directly to me at . Patches +welcome ;) + +Ward Wouts diff --git a/tags/ripnews-release_0_5_3/ripnews/TODO b/tags/ripnews-release_0_5_3/ripnews/TODO new file mode 100644 index 0000000..94c04fa --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/TODO @@ -0,0 +1,33 @@ +# $Id$ +# $URL$ + +[ ] check for multiple servers (ip adresses) for each name and pick + one that works +[ ] support mime encoding +[ ] support base64 +[ ] support quotedprintable +[ ] documentation +[ ] code cleanup +[ ] finish intspan +[ ] profiling/speed ups +[ ] improve error handling +[ ] use exceptions for error handling +[ ] check if xhdr implemented +[ ] write man page +[ ] more regression tests +[ ] update documentation +[ ] implement "skip current article" signal handle +[ ] optionaly save parts of incomplete posts +[ ] with multipart articles, don't write every body to the same file. + This will mess up things if a get_body is repeated because of + exceptions. Use buffering for each body, before writing... +[ ] there is a bug in handling half fetched parts, they'll be fetched + twice this should be buffered until it's gotten correctly, then + added to the main buffer +[ ] match on poster +[ ] running without a tempdir doesn't work at all +[ ] don't drop connections to servers when switching groups +[ ] keep connections to newsservers alive (don't timeout) +[ ] a markread mechanism for every post that is not specifically + included, this could be used to prevent excessively big caches +[ ] limiter on running time. if running longer than X, abort diff --git a/tags/ripnews-release_0_5_3/ripnews/encode/tests/testdata b/tags/ripnews-release_0_5_3/ripnews/encode/tests/testdata new file mode 100644 index 0000000..a32a434 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/encode/tests/testdata @@ -0,0 +1 @@ +1234567890 diff --git a/tags/ripnews-release_0_5_3/ripnews/encode/tests/testdata.uu b/tags/ripnews-release_0_5_3/ripnews/encode/tests/testdata.uu new file mode 100644 index 0000000..39fbc7e --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/encode/tests/testdata.uu @@ -0,0 +1,4 @@ +begin 644 testdata ++,3(S-#4V-S@Y,`K/ +` +end diff --git a/tags/ripnews-release_0_5_3/ripnews/encode/tests/testdata.ync b/tags/ripnews-release_0_5_3/ripnews/encode/tests/testdata.ync new file mode 100644 index 0000000..70210f8 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/encode/tests/testdata.ync @@ -0,0 +1,3 @@ +=ybegin line=128 size=11 name=testdata +[\]^_`abcZ4 +=yend size=11 crc32=E2910DCA diff --git a/tags/ripnews-release_0_5_3/ripnews/encode/tests/uu_test.rb b/tags/ripnews-release_0_5_3/ripnews/encode/tests/uu_test.rb new file mode 100755 index 0000000..84cba25 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/encode/tests/uu_test.rb @@ -0,0 +1,80 @@ +#!/usr/local/bin/ruby + +# $Dwarf: uu_test.rb,v 1.1 2003/04/20 16:33:02 ward Exp $ +# $Source$ + +require '../uuencode.rb' +require 'ftools' + +def test1 + print "Test 1: decoding a file\n" + file = File.open("testdata.uu", "r") + tmpfile = Tempfile.new("uutmp") + tmpfile.sync=true + mode, filename, body = UUEncode.uudecode(file, tmpfile) + if mode != "644" + print " Failed, mode should be 644, but is #{mode}\n" + elsif filename != "testdata" + print " Failed, filename should be \"testdata\", but is \"#{filename}\"\n" + elsif ! File.compare("testdata", tmpfile.path) + print " Failed, result doesn't match reference data\n" + else + print " Succesful\n" + end + file.close + tmpfile.close +end + +def test2 + print "Test 2: decoding an array\n" + file = File.open("testdata.uu", "r") + lines = file.readlines + file.close + file = File.open("testdata", "r") + reference = file.readlines + file.close + + mode, filename, body = UUEncode.uudecode(lines) + + if mode != "644" + print " Failed, mode should be 644, but is #{mode}\n" + elsif filename != "testdata" + print " Failed, filename should be \"testdata\", but is \"#{filename}\"\n" + elsif reference != body + print " Failed, result doesn't match reference data\n" + else + print " Succesful\n" + end +end + +def test3 + print "Test 3: is_uuencoded\n" + file = File.open("testdata.uu", "r") + lines = file.readlines + file.close + if UUEncode.is_uuencoded(lines) + print " Succesful\n" + else + print " Failed\n" + end +end + +def test4 + print "Test 4: get_filename\n" + file = File.open("testdata.uu", "r") + lines = file.readlines + file.close + + filename = UUEncode.get_filename(lines) + if filename == "testdata" + print " Succesful\n" + else + print " Failed\n" + end +end + +test1 +test2 +test3 +test4 + diff --git a/tags/ripnews-release_0_5_3/ripnews/encode/tests/yenc_test.rb b/tags/ripnews-release_0_5_3/ripnews/encode/tests/yenc_test.rb new file mode 100755 index 0000000..12e7e0e --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/encode/tests/yenc_test.rb @@ -0,0 +1,103 @@ +#!/usr/local/bin/ruby + +# $Dwarf: yenc_test.rb,v 1.1 2003/04/20 18:32:39 ward Exp $ +# $Source$ + +require '../yenc.rb' +require 'ftools' + +def test1 + print "Test 1: decoding a file\n" + file = File.open("testdata.ync", "r") + tmpfile = Tempfile.new("ynctmp") + tmpfile.sync=true + mode, filename, body = YEnc.ydecode(file, tmpfile) + if filename != "testdata" + print "Failed, filename should be \"testdata\", but is \"#{filename}\"\n" + elsif ! File.compare("testdata", tmpfile.path) + print "Failed, result doesn't match reference data\n" + else + print "Succesful\n" + end + file.close + tmpfile.close +end + +def test2 + print "Test 2: decoding an array\n" + file = File.open("testdata.ync", "r") + lines = file.readlines + file.close + file = File.open("testdata", mode = "r") + reference = file.readlines + file.close + + print " with dos linebreaks\n" + mode, filename, body = YEnc.ydecode(lines) + + if filename != "testdata" + print "Failed, filename should be \"testdata\", but is \"#{filename}\"\n" + elsif reference != body + print "Failed, result doesn't match reference data\n" + else + print "Succesful\n" + end + + lines.collect!{|x| x.chomp("\r\n")} + print " without linebreaks\n" + mode, filename, body = YEnc.ydecode(lines) + + if filename != "testdata" + print "Failed, filename should be \"testdata\", but is \"#{filename}\"\n" + elsif reference != body + print "Failed, result doesn't match reference data\n" + else + print "Succesful\n" + end + + lines.collect!{|x| x.sub(/$/, "\n")} + print " with unix linebreaks\n" + mode, filename, body = YEnc.ydecode(lines) + + if filename != "testdata" + print "Failed, filename should be \"testdata\", but is \"#{filename}\"\n" + elsif reference != body + print "Failed, result doesn't match reference data\n" + else + print "Succesful\n" + end + + +end + +def test3 + print "Test 3: is_yencoded\n" + file = File.open("testdata.ync", "r") + lines = file.readlines + file.close + if YEnc.is_yencoded(lines) + print "Succesful\n" + else + print "Failed\n" + end +end + +def test4 + print "Test 4: get_filename\n" + file = File.open("testdata.ync", "r") + lines = file.readlines + file.close + + filename = YEnc.get_filename(lines) + if filename == "testdata" + print "Succesful\n" + else + print "Failed\n" + end +end + +test1 +test2 +test3 +test4 + diff --git a/tags/ripnews-release_0_5_3/ripnews/encode/uuencode.rb b/tags/ripnews-release_0_5_3/ripnews/encode/uuencode.rb new file mode 100644 index 0000000..2b7a5d9 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/encode/uuencode.rb @@ -0,0 +1,186 @@ +# $Dwarf: uuencode.rb,v 1.7 2004/06/16 08:14:50 ward Exp $ +# $Source$ + +# +# Copyright (c) 2002, 2003 Ward Wouts +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# + +require 'tempfile' + +class UUEncode +class << self + +Debuglevel = 0 + +def uudecode(data, outfile=nil) + case data.class.to_s + when "Array" + print "Calling _uudecode_array\n" if Debuglevel>0 + mode, filename, body = _uudecode_array(data) + when "File", "Tempfile" + unless outfile + print "uudecode: need outfile\n" + exit + end + print "Calling _uudecode_file\n" if Debuglevel>0 + mode, filename, body = _uudecode_file(data, outfile) + else + print "Funny stuff in uudecode. Data of class \"#{data.class.to_s}\"\n" + end + return mode, filename, body +end + +def _uudecode_file(file, outfile) + mode = 0600 + filename = "unknown" + c = 0 + lines = file.pos # horrible assumption FH is at end of file + percent = 0 + mark = lines/100 + file.pos = 0 + + while (! file.eof) + line = file.gets + print "line: #{line}" if Debuglevel > 0 + if line =~ /^begin(.*)/ + m = $1 + print "beginning matched; rest: #{m}\n" if Debuglevel > 0 + if m =~ /^(\s+(\d+))?(\s+(.*?\S))?\s*\Z/ + mode = $2 + filename = $4 + print "found beginning\n" if Debuglevel > 0 + else + print "mode, file set to defaults: #{m}\n" + end + break + end + end + + if file.eof + print "Not UUencoded!\n" + return false + end + print "c: #{c} mark: #{mark} lines: #{lines}\n" if Debuglevel > 1 + + while (! file.eof) + if Debuglevel > 1 + c = file.pos + if c > mark + print "#{percent}%\n" + print "c: #{c} mark: #{mark} lines: #{lines}\n" if Debuglevel > 1 + percent += 1 + mark = (lines/100)*(percent+1) + end + end + line = file.gets + print "line: #{line}" if Debuglevel > 1 + return mode, filename if line =~ /^end/ + next if line =~ /[a-z]/ + next if line == nil + next unless ((((line[0] - 32) & 077) + 2) / 3).to_i == (line.length/4).to_i + outfile.print line.unpack("u") + end + + print "No \"end\" found!!!\n" + #return mode, file, outfile + return false +end + +# gaat volgens mij niet verder als er meerdere uuencoded blocks zijn... +# zal dan meerdere keren aangeroepen moeten worden, grmbl... +# tis getting a mess as we speak... +# toch maar een keer aparte class van maken... +def _uudecode_array(data) + decode = [] + mode = 0600 + filename = "unknown" + c = 0 + lines = data.length + percent = 0 + mark = lines/100 + + i = 0 + while (i < data.length) + if data[i] =~ /^begin(.*)/ + m = $1 + print "beginning matched; rest: #{m}\n" if Debuglevel > 0 + if m =~ /^(\s+(\d+))?(\s+(.*?\S))?\s*\Z/ + mode = $2 + filename = $4 + print "found beginning\n" if Debuglevel > 0 + else + print "mode, filename set to defaults: #{m}\n" + end + break + end + i += 1 + end + + unless (i < data.length) + print "Not UUencoded!\n" + return false + end + + while (i < data.length) + if Debuglevel > 1 + if c > mark + print "#{percent}%\n" + print "c: #{c} mark: #{mark} lines: #{lines} i: #{i}\n" if Debuglevel > 1 + percent += 1 + mark = (lines/100)*(percent+1) + end + c += 1 + end + line = data[i] + i += 1 + return mode, filename, decode if line =~ /^end/ + next if line =~ /[a-z]/ + next if line == nil + begin + next unless ((((line[0] - 32) & 077) + 2) / 3).to_i == (line.length/4).to_i + rescue NoMethodError + return false + end + unless line.unpack("u").eql?([""]) + decode.concat(line.unpack("u")) + end + end + + print "No \"end\" found!!!\n" + return false +end + +def is_uuencoded(data) + if data.to_s =~ /begin\s+\d+?\s+.*?\S?\s*$/m + return true + else + return false + end +end + +def get_filename(data) + i = 0 + while i < data.length + line = data[i] + if line =~ /^begin(\s+(\d+))?(\s+(.*?\S))?\s*$/m + return $4 + end + i += 1 + end + return false +end + +end # class +end diff --git a/tags/ripnews-release_0_5_3/ripnews/encode/yenc.rb b/tags/ripnews-release_0_5_3/ripnews/encode/yenc.rb new file mode 100644 index 0000000..035d948 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/encode/yenc.rb @@ -0,0 +1,318 @@ +# $Dwarf: yenc.rb,v 1.14 2005/02/01 10:16:03 ward Exp $ +# $Source$ + +# +# Copyright (c) 2002, 2003 Ward Wouts +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# + +require 'tempfile' + +class YencError < RuntimeError; end + +class YEnc +class << self + +Debuglevel = 0 +@@ymap = {} + +def ydecode(data, outfile=nil) + if @@ymap.empty? + (-106..255).each do |b| + @@ymap[b]=((b-42)%256) + end + end + + case data.class.to_s + when "Array" + print "Calling _ydecode_array\n" if Debuglevel>0 + mode, filename, body = _ydecode_array(data) + when "File", "Tempfile" + unless outfile + print "ydecode: need outfile\n" + exit + end + print "Calling _ydecode_file\n" if Debuglevel>0 + mode, filename, body = _ydecode_file(data, outfile) + else + print "Funny stuff in ydecode. Data of class \"#{data.class.to_s}\"\n" + end + return mode, filename, body +end + +def _ydecode_line(line) + i = 0 + ll = line.length + ostr = '' + while i < ll + if line[i] == 0x3d + if i == (ll - 1) + raise YencError, "Escape char found as last char of line. This is not allowed by the yEnc standard" + else + i += 1 + line[i] -= 64 + end + end +# begin + ostr << @@ymap[line[i].to_i] +# rescue TypeError +# puts "this should not happen!!!" +# puts "line[i] contents: '#{line[i]}'\n" +# end + i += 1 + end + return ostr +end + +def _ydecode_file(file, outfile) + mode = 0600 # mode is a bit stupid with yencoding... it don't get it + filename = "unknown" + lines = file.pos + file.pos = 0 + bytes = 0 + total = 0 + oldpartbegin = 0 + oldpartend = 0 + search_begin = false + skip = false + + while (! file.eof) + line = file.gets + print "line: #{line}" if Debuglevel > 0 + if line =~ /^\=ybegin\s+(.*line\=.*)/ + m = $1 + print "ybegin match; rest: #{m}\n" if Debuglevel > 0 + if m =~ /^\s*(part\=(\d+)\s+)?(total\=(\d+)\s+)?(line\=(\d+))(\s*size\=(\d+))(\s*name=(.*?\S))\s*$/ + part = $2.to_i + total = $4.to_i + linesize = $6.to_i + totalsize = $8.to_i + filename = $10 + if Debuglevel > 0 + print "found beginning" + if part != nil + print " of part #{part}" + end + if total != nil + print " of #{total}" + end + print ", linesize = #{linesize}, size = #{totalsize}, filename = #{filename}\n" + end + break + else + print "not a valid yenc begin line\n" + end + end + end + + if file.eof + print "Not yencoded!\n" + return false + end + + while (! file.eof) + print "at #{file.pos} need to go to #{lines}\n" if Debuglevel > 1 + line = file.gets + line.chop! + + if line =~ /^=yend\s+(.*)\Z/ + m = $1 + m =~ /(\s*size=(\d+)\s+)(\s*part=(\d+))?(\s+crc32=(\S+))?/ + size = $2.to_i + part = $4.to_i + crc = $6 + if size != bytes + print "#{Thread.current.inspect} part size mismatch, is #{bytes}, should be #{size}\n" + end + if part == nil + return mode, filename + end + total += bytes + if total >= totalsize + if total != totalsize + print "#{Thread.current.inspect} total size mismatch, is #{total}, should be #{totalsize}\n" + end + return mode, filename + end + search_begin = true + bytes = 0 + next + end + if search_begin && line =~ /^\=ybegin\s+(.*)\Z/ + m = $1 + search_begin = false + if m =~ /^\s*(part\=(\d+)\s+)?(total\=(\d+)\s+)?(line\=(\d+))(\s*size\=(\d+))(\s*name=(.*?\S))\s*$/ + part = $2.to_i + total = $4.to_i + linesize = $6.to_i + totalsize = $8.to_i + filename = $10 + print "found beginning of part #{part}, linesize = #{linesize}, size = #{totalsize}, filename = #{filename}\n" if Debuglevel > 0 + end + next + end + if search_begin == true + next + end + if line =~ /^=ypart\s+(\s*begin=(\d+))(\s+end=(\d+))/ + skip = false + b = $2 + e = $4 + print " #{Thread.current.inspect} next part begin #{b}, end #{e}\n" + if b.to_i == oldpartbegin && e.to_i == oldpartend + print "Skipping duplicate part\n" + skip = true + next + end + if b.to_i == oldpartend + 1 + oldpartend = e.to_i + oldpartbegin = b.to_i + else + raise PermError, "#{Thread.current.inspect} Parts not continuous! last end #{oldpartend}, begin #{b}" + end + next + end + +# This seems to be a common 'error' - maybe I misunderstand the spec or +# something +# if line.length != linesize +# print "linesize mismatch, was #{line.length}, should be #{linesize}...\n" +# end + + if !skip + print "line: #{line}" if Debuglevel > 0 + ostr = _ydecode_line(line) + outfile << ostr + bytes += ostr.length + end + end + + print "No \"=yend\" found!!!\n" + return mode, filename, outfile +end + +def _ydecode_array(data) + decode = "" + mode = 0600 + filename = "unknown" + oldpartend = 0 + oldpartbegin = 0 + c = 0 + lines = data.length + bytes = 0 + percent = 0 + mark = lines/100 + + i = 0 + while (i < data.length) + if data[i] =~ /^\=ybegin\s+(.*line\=.*)/ + m = $1 + print "ybegin match; rest: #{m}\n" if Debuglevel > 0 + if m =~ /^\s*(part\=(\d+)\s+)?(total\=(\d+)\s+)?(line\=(\d+))(\s*size\=(\d+))(\s*name=(.*?\S))\s*$/ + part = $2.to_i + total = $4.to_i + linesize = $6.to_i + size = $8.to_i + filename = $10 + print "found beginning, linesize = #{linesize}, size = #{size}, filename = #{filename}\n" if Debuglevel > 0 + i += 1 + break + else + print "not a valid yenc begin line\n" + end + end + i += 1 + end + + unless (i < data.length) + print "Not yencoded!\n" + return false + end + + while (i < data.length) + line = data[i] + line.chomp!("\n") + line.chomp!("\r") + print "at #{i} need to go to #{data.length}\n" if Debuglevel > 1 + print "line: #{line}" if Debuglevel > 0 + i += 1 + if line =~ /^\=yend(\s+size=(\d+))(\s+crc32=(\S+))?/ + size = $2.to_i + crc = $4 + if size != decode.length + print "#{Thread.current.inspect} size mismatch, was #{decode.length}, should be #{size}\n" + end + dec = [ decode ] + return mode, filename, dec + end + if line =~ /^=ypart\s+(\s*begin=(\d+))(\s+end=(\d+))/ + skip = false + b = $2 + e = $4 + print " #{Thread.current.inspect} next part begin #{b}, end #{e}\n" + if b.to_i == oldpartbegin && e.to_i == oldpartend + print "Skipping duplicate part\n" + skip = true + next + end + if b.to_i == oldpartend + 1 + oldpartend = e.to_i + oldpartbegin = b.to_i + else + raise PermError, "#{Thread.current.inspect} Parts not continuous! last end #{oldpartend}, begin #{b}" + end + next + end + +# This seems to be a common 'error' - maybe I misunderstand the spec or +# something +# if line.length != linesize +# print "#{i}: linesize mismatch, was #{line.length}, should be #{linesize}...\n" +# end + + if !skip + print "line: #{line}" if Debuglevel > 0 + ostr = _ydecode_line(line) + decode << ostr + bytes += ostr.length + end + end + + print "${i}: no \"=yend\" found!!!\n" + dec = [ decode ] + return mode, filename, dec +end + +def is_yencoded(data) + if data.to_s =~ /=ybegin/m + return true + else + return false + end +end + +def get_filename(data) + i = 0 + while i < data.length + line = data[i] + if line =~ /=ybegin\s*(part\=(\d+)\s+)?(total\=(\d+)\s+)?(line\=(\d+))(\s*size\=(\d+))(\s*name=(.*?\S))\s*$/m + return $10 + end + i += 1 + end + return false +end + +end # class +end diff --git a/tags/ripnews-release_0_5_3/ripnews/net/nntp.rb b/tags/ripnews-release_0_5_3/ripnews/net/nntp.rb new file mode 100644 index 0000000..56808c8 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/net/nntp.rb @@ -0,0 +1,325 @@ +################################ +# +# nntp.rb - an NNTP client implementing RFC 977 +# ported from the Python code by Jefferson Heard +# this software is released under the terms of the GNU Library General Public License +# (C) 2001, Jefferson Heard +# +# Contributors: Jefferson Heard, Ward Wouts +# +# Release History +# 0.1: 11.7.2001 - Initial revision. +# 0.2: 11-9-2001 - fixed regexp bugs, +# fixed XHDR bugs, +# made internal methods private, +# changed constructor default arg +# 0.3: 11-14-2001 - Fixed numerous bugs and made things a little cleaner +# as per the suggestions of Ward Wouts +# 0.4: 11-15-2001 - Fixed statcmd bug - Ward Wouts +# 0.5: 12-06-2001 - Fixed post buf - Ozawa, Sakuro +################################# + +require 'socket' +require 'net/protocol' + +module Net + +# Exceptions raised by NNTP + +class NNTPError < RuntimeError; end +class NNTPReplyError < NNTPError; end +class NNTPTemporaryError < NNTPError; end +class NNTPPermanentError < NNTPError; end +class NNTPDataError < NNTPError; end + +class NNTP + NNTP_PORT = 119 + LONGRESP = ['100', '215', '220', '221', '222', '224', '230', '231', '282'] + CRLF = "\r\n" + + def initialize(host, port=NNTP_PORT, user=nil, password=nil, readermode=nil) + @debuglevel = 0 + @host = host + if port then @port = port else @port = NNTP_PORT end + @socket = TCPSocket.new @host, @port + @welcome = getresp + readermode_afterauth = false + + if readermode + begin + @welcome = shortcmd('mode reader') + rescue NNTPPermanentError + rescue NNTPTemporaryError + if user and $!.response[0...3] == '480' + readermode_afterauth = true + else + raise + end + end + end + + if user + resp = shortcmd "authinfo user #{user}" + if resp[0...3] == '381' # then we need a password + raise NNTPReplyError, resp, caller unless password + resp = shortcmd "authinfo pass #{password}" + raise NNTPPermanentError, resp, caller unless resp[0...3] == '281' + end + end + + if readermode_afterauth + begin + @welcome = shortcmd('mode reader') + rescue NNTPPermanentError + end + end + end + + def welcome + puts "*welcome*, #{@welcome}" if @debuglevel > 0 + return @welcome + end + + attr_writer :debuglevel + + def putline(line) + puts '*put* '+line+'\r\n' if @debuglevel > 1 + if ! @socket + puts '*put* '+line+'\r\n' + end + @socket.send "#{line}\r\n", 0 + end + + def putcmd(cmd) + puts "*cmd* #{cmd}" if @debuglevel > 0 + putline cmd + end + + def getline + line = @socket.readline + print "*getline* '#{line}'" if @debuglevel > 0 + line.chomp!("\r\n") + return line + end + + def getresp + resp = getline + puts "*getresp* #{resp}" if @debuglevel > 0 + c = resp[0] + case c + when c.nil? then raise NNTPProtocolError, resp, caller + when c == '4' then raise NNTPTemporaryError, resp, caller + when c == '5' then raise NNTPPermanentError, resp, caller + when '123'.include?(c) then raise NNTPProtocolError, resp, caller + end + return resp + end + + def getlongresp + resp = getresp + raise NNTPReplyError, resp, caller unless LONGRESP.include? resp[0...3] + list = [] + while true + line = getline + break if line == '.' + line.slice!(0) if line.to_s[0...2] == '..' + list << line + end + return resp, list + end + + def shortcmd(line) + putcmd line + return getresp + end + + def longcmd(line) + putcmd line + return getlongresp + end + + def newgroups(date, time) + return longcmd("NEWGROUPS #{date.to_s} #{time.to_s}") + end + + def newnews(group, date, time) + return longcmd("NEWNEWS #{group} #{date.to_s} #{time.to_s}") + end + + def list + resp, list = longcmd "LIST" + list.each_index {|ix| + list[ix] = list[ix].split " " + } + return resp, list + end + + def group(name) + resp = shortcmd "GROUP #{name}" + raise NNTPReplyError, resp, caller unless resp[0...3] == '211' + words = resp.split " " + count, first, last = 0 + n = words.length + if n>1 + count = words[1] + if n>2 + first = words[2] + if n>3 + last = words[3] + if n>4 + name = words[4].downcase + end + end + end + end + return resp, count, first, last, name + end + + def help + return longcmd("HELP") + end + + def statparse(resp) + raise NNTPReplyError, resp, caller unless resp[0...2] == '22' + words = resp.split " " + nr = 0 + id = '' + n = words.length + if n>1 + nr = words[1] + if n>2 + id = words[2] + end + end + return resp, nr, id + end + + def statcmd(line) + resp = shortcmd line + return statparse(resp) + end + + def stat(id) + return statcmd("STAT #{id}") + end + + def next + return statcmd("NEXT") + end + + def last + return statcmd("LAST") + end + + def articlecmd(line) + resp, list = longcmd line + resp, nr, id = statparse(resp) + return resp, nr, id, list + end + + def head(id) + return articlecmd("HEAD #{id}") + end + + def body(id) + return articlecmd("BODY #{id}") + end + + def article(id) + return articlecmd("ARTICLE #{id}") + end + + def slave(id) + return shortcmd("SLAVE") + end + + def mode_reader() + return shortcmd("MODE READER") + end + + def xhdr(hdr, str) + pat = Regexp.new '^([0-9]+) ?(.*)\n?' + resp, lines = longcmd "XHDR #{hdr} #{str}" + lines.each_index {|ix| + line = lines[ix] + m = pat.match line + lines[ix] = m[1..2] if m + } + return resp, lines + end + + def xover(start, ed) + begin + resp, lines = longcmd "XOVER #{start}-#{ed}" + xover_lines = [] + lines.each {|line| + elements = line.split("\t") + elements[5] = elements[5].split(" ") + xover_lines << elements + } + return resp, xover_lines + rescue RuntimeError + raise(NNTPDataError, lines, caller) + end + end + + def xgtitle(group) + line_pat = Regexp.new "^([^\t]+)[\t]+(.*)$" + resp, raw_lines = longcmd "XGTITLE #{group}" + lines = [] + raw_lines.each {|line| + match = line_pat.match line.strip + lines << match[1..2] if match + } + return resp, lines + end + + def date + resp = shortcmd "DATE" + raise NNTPReplyError unless resp[0...3] == '111' + resp.split! " " + raise NNTPDataError unless resp.length == 2 + date = resp[1][2...8] + time = resp[1][-6..-1] + raise(NNTPDataError, resp, caller) unless date.length == 6 and time.length == 6 + return resp, date, time + end + + def post(f) + resp = shortcmd "POST" + raise NNTPReplyError unless resp =~ /^3/ #[0] == 3 + lines = f.readlines + lines.each {|line| + line.chop! + line = '.' + line if line[0] == '.' + putline line + } + putline '.' + return getresp + end + + def quit + resp = shortcmd "QUIT" + @socket.close_read + @socket.close_write + return resp + end + + private :statparse, :getline, :putline, :articlecmd, :statcmd + protected :getresp, :getlongresp +end + +end + +if __FILE__ == $0 + s = Net::NNTP.new('news') + resp, count, first, last, name = s.group('comp.lang.ruby') + puts resp + puts "group #{name} has #{count} articles, range #{first} to #{last}" + resp, subs = s.xhdr('subject', "#{first}-#{last}") + puts resp + subs.each do |sub| puts sub end + resp = s.quit + puts resp +end + diff --git a/tags/ripnews-release_0_5_3/ripnews/net/nntp.rb.txt b/tags/ripnews-release_0_5_3/ripnews/net/nntp.rb.txt new file mode 100644 index 0000000..6929f28 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/net/nntp.rb.txt @@ -0,0 +1,319 @@ +################################# +# +# nntp.rb - an NNTP client implementing RFC 977 +# ported from the Python code by Jefferson Heard +# this software is released under the terms of the GNU Library General Public License +# (C) 2001, Jefferson Heard +# +# Contributors: Jefferson Heard, Ward Wouts +# +# Release History +# 0.1: 11.7.2001 - Initial revision. +# 0.2: 11-9-2001 - fixed regexp bugs, +# fixed XHDR bugs, +# made internal methods private, +# changed constructor default arg +# 0.3: 11-14-2001 - Fixed numerous bugs and made things a little cleaner +# as per the suggestions of Ward Wouts +# 0.4: 11-15-2001 - Fixed statcmd bug - Ward Wouts +# 0.5: 12-06-2001 - Fixed post buf - Ozawa, Sakuro +################################# + +require 'socket' +require 'net/protocol' + +module Net + +# Exceptions raised by NNTP + +class NNTPError < RuntimeError; end +class NNTPReplyError < NNTPError; end +class NNTPTemporaryError < NNTPError; end +class NNTPPermanentError < NNTPError; end +class NNTPDataError < NNTPError; end + +class NNTP + NNTP_PORT = 119 + LONGRESP = ['100', '215', '220', '221', '222', '224', '230', '231', '282'] + CRLF = "\r\n" + + def initialize(host, port=NNTP_PORT, user=nil, password=nil, readermode=nil) + @debuglevel = 2 + @host = host + if port then @port = port else @port = NNTP_PORT end + @socket = TCPSocket.new @host, @port + @welcome = getresp + readermode_afterauth = false + + if readermode + begin + @welcome = shortcmd('mode reader') + rescue NNTPPermanentError + rescue NNTPTemporaryError + if user and $!.response[0...3] == '480' + readermode_afterauth = true + else + raise + end + end + end + + if user + resp = shortcmd "authinfo user #{user}" + if resp[0...3] == '381' # then we need a password + raise NNTPReplyError, resp, caller unless password + resp = shortcmd "authinfo pass #{password}" + raise NNTPPermanentError, resp, caller unless resp[0...3] == '281' + end + end + + if readermode_afterauth + begin + @welcome = shortcmd('mode reader') + rescue NNTPPermanentError + end + end + end + + def welcome + puts "*welcome*, #{@welcome}" if @debuglevel > 0 + return @welcome + end + + attr_writer :debuglevel + + def putline(line) + puts '*put* '+line+'\r\n' if @debuglevel > 1 + @socket.send "#{line}\r\n", 0 + end + + def putcmd(cmd) + puts "*cmd* #{cmd}" if @debuglevel > 0 + putline cmd + end + + def getline + line = '' + line.concat @socket.recv 1 until line.length > 2 and line[-1] == "\n" or line[-2..-1] == "\r\n" + puts '*getline* '+line if @debuglevel > 0 + line = line[0...-2] if line[-2..-1] == "\r\n" + line = line[0...-1] if "\r\n".include? line[-1].to_s + return line + end + + def getresp + resp = getline + puts "*getresp* #{resp}" if @debuglevel > 0 + c = resp[0] + case c + when c == '4' then raise NNTPTemporaryError, resp, caller + when c == '5' then raise NNTPPermanentError, resp, caller + when '123'.include?(c) then raise NNTPProtocolError, resp, caller + end + return resp + end + + def getlongresp + resp = getresp + raise NNTPReplyError, resp, caller unless LONGRESP.include? resp[0...3] + list = [] + while true + line = getline + break if line == '.' + line = line[1..-1] if line.to_s[0...2] == '..' + list << line + end + return resp, list + end + + def shortcmd(line) + putcmd line + return getresp + end + + def longcmd(line) + putcmd line + return getlongresp + end + + def newgroups(date, time) + return longcmd "NEWGROUPS #{date.to_s} #{time.to_s}" + end + + def newnews(group, date, time) + return longcmd "NEWNEWS #{group} #{date.to_s} #{time.to_s}" + end + + def list + resp, list = longcmd "LIST" + list.each_index {|ix| + list[ix] = list[ix].split " " + } + return resp, list + end + + def group(name) + resp = shortcmd "GROUP #{name}" + raise NNTPReplyError, resp, caller unless resp[0...3] == '211' + words = resp.split " " + count, first, last = 0 + n = words.length + if n>1 + count = words[1] + if n>2 + first = words[2] + if n>3 + last = words[3] + if n>4 + name = words[4].downcase + end + end + end + end + return resp, count, first, last, name + end + + def help + return longcmd "HELP" + end + + def statparse(resp) + raise NNTPReplyError, resp, caller unless resp[0...2] == '22' + words = resp.split " " + nr = 0 + id = '' + n = words.length + if n>1 + nr = words[1] + if n>2 + id = words[2] + end + end + return resp, nr, id + end + + def statcmd(line) + resp = shortcmd line + return statparse(resp) + end + + def stat(id) + return statcmd "STAT #{id}" + end + + def next + return statcmd "NEXT" + end + + def last + return statcmd "LAST" + end + + def articlecmd(line) + resp, list = longcmd line + resp, nr, id = statparse(resp) + return resp, nr, id, list + end + + def head(id) + return articlecmd "HEAD #{id}" + end + + def body(id) + return articlecmd "BODY #{id}" + end + + def article(id) + return articlecmd "ARTICLE #{id}" + end + + def slave(id) + return shortcmd "SLAVE" + end + + def xhdr(hdr, str) + pat = Regexp.new '^([0-9]+) ?(.*)\n?' + resp, lines = longcmd "XHDR #{hdr} #{str}" + lines.each_index {|ix| + line = lines[ix] + m = pat.match line + lines[ix] = m[1..2] if m + } + return resp, lines + end + + def xover(start, ed) + begin + resp, lines = longcmd "XOVER #{start}-#{ed}" + xover_lines = [] + lines.each {|line| + elements = line.split "\t" + elements[5].split! " " + 0.upto(7) {|ix| xover_lines << element[ix]} + } + return resp, xover_lines + rescue RuntimeError + raise NNTPDataError line, caller + end + end + + def xgtitle(group) + line_pat = Regexp.new "^([^\t]+)[\t]+(.*)$" + resp, raw_lines = longcmd "XGTITLE #{group}" + lines = [] + raw_lines.each {|line| + match = line_pat.match line.strip + lines << match[1..2] if match + } + return resp, lines + end + + def date + resp = shortcmd "DATE" + raise NNTPReplyError unless resp[0...3] == '111' + resp.split! " " + raise NNTPDataError unless resp.length == 2 + date = resp[1][2...8] + time = resp[1][-6..-1] + raise NNTPDataError resp, caller unless date.length == 6 and time.length == 6 + return resp, date, time + end + + def post(f) + resp = shortcmd "POST" + raise NNTPReplyError unless resp =~ /^3/ #[0] == 3 + lines = f.readlines + lines.each {|line| + line.chop! + line = '.' + line if line[0] == '.' + putline line + } + putline '.' + return getresp + end + + def quit + resp = shortcmd "QUIT" + @socket.close_read + @socket.close_write + return resp + end + + private :statparse, :getline, :putline, :articlecmd, :statcmd + protected :getresp, :getlongresp +end + +end + +if __FILE__ == $0 + s = Net::NNTP.new('news') + resp, count, first, last, name = s.group('comp.lang.ruby') + puts resp + puts "group #{name} has #{count} articles, range #{first} to #{last}" + resp, subs = s.xhdr('subject', "#{first}-#{last}") + puts resp + subs.each do |sub| puts sub end + resp = s.quit + puts resp +end + diff --git a/tags/ripnews-release_0_5_3/ripnews/news/article.rb b/tags/ripnews-release_0_5_3/ripnews/news/article.rb new file mode 100644 index 0000000..556b698 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/news/article.rb @@ -0,0 +1,1002 @@ +# $Dwarf: article.rb,v 1.114 2005/05/12 07:39:53 ward Exp $ +# $Source$ + +# +# Copyright (c) 2002, 2003, 2004, 2005 Ward Wouts +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# + +require 'set/intspan' +require 'net/nntp' +require 'news/newsrc' +require 'tempfile' +require 'timeout' +#require 'yaml' + +class ArticleError < RuntimeError; end +class TempError < ArticleError; end +class PermError < ArticleError; end + +module Net +class KANNTP < Net::NNTP + +def initialize(host, port=nil, user=nil, password=nil, readermode=nil) + @host = host + @semaphore = Mutex.new + @resettime = 60 + @timecounter = @resettime + @thr = Thread.new{ + Thread.pass + while true +# puts "timecounter #{@timecounter} #{@host}" + if @timecounter > 0 + @timecounter -= 5 + sleep 5 + else + sendka + sleep 5 + end + end + } + super +end + +def putline(line) +# puts "timerreset #{@host}" + @timecounter = @resettime + super +end + +def longcmd(line) + @semaphore.synchronize{ + return super + } +end + +def shortcmd(line) + @semaphore.synchronize{ + return super + } +end + +def setresettime(time) + @resettime = time +end + +def sendka +# puts "SENDING KEEP ALIVE TO #{@host}" + res = shortcmd("DATE") +# puts res +end + +def quit + @thr.exit + begin + super + rescue EOFError + end +end + +private :sendka + +end # class KANNTP +end # module Net + +############################################################ + +class Article + +Debuglevel = 1 + +Message = Struct.new(:messid, :id, :server, :subject) + +def initialize(nntpservers, groupname, newsrc="~/.newsrc") + @messageinfo = [] + + @grouped = false + @groups = {} + @gotten = {} + @group = groupname + @preselectpattern = Regexp.new('^') + @cache_buf = {} + @serverlist = [] + @serverpasses = {} + + tmplist = nntpservers.split('|') + tmplist.each{ |server| + if server.match(/([^@]*)@(.*)/) + userpass = $1 + server = $2 + @serverlist.push(server) + @serverpasses[server] = {} + if userpass.match(/([^:]*):(.*)/) + @serverpasses[server]['user'] = $1 + @serverpasses[server]['pass'] = $2 + else + @serverpasses[server]['user'] = userpass + @serverpasses[server]['pass'] = nil + end + else + @serverlist.push(server) + @serverpasses[server] = {} + @serverpasses[server]['user'] = nil + @serverpasses[server]['pass'] = nil + end + } +p @serverlist +p @serverpasses + #@serverlist = nntpservers.split('|') + + @connections = {} + @serverlist.collect{|server| + @connections[server] = {} + @cache_buf[server] = [] + begin +# p server +# p Time.now + begin + timeout(60) do +p "connecting" + @connections[server]["nntp"] = Net::KANNTP.new(server, 119, @serverpasses[server]['user'], @serverpasses[server]['pass']) + end + resp = @connections[server]["nntp"].mode_reader +p resp + rescue TimeoutError, Errno::ECONNRESET + sleep 3 + retry + end +# p Time.now + @connections[server]["skip_ids"] = Set::IntSpan.new() + @connections[server]["newsrc"] = News::Newsrc.new("#{newsrc}.#{server}") + set_skip_ids(server, @connections[server]["newsrc"].marked_articles(@group)) + rescue SocketError, Errno::EINVAL, EOFError, Errno::ETIMEDOUT + print "Connection to #{server} failed: #{$!}\n" + @connections[server]["nntp"].quit + del_server(server) + end + } +end + +def reconnect(server) + retries = 0 + begin + @connections[server]["nntp"].quit + rescue Errno::EPIPE, Errno::ECONNRESET, EOFError, Errno::ETIMEDOUT + end + begin + sleep 3 + #timeout(180) do + timeout(60) do + @connections[server]["nntp"] = Net::KANNTP.new(server, 119, @serverpasses[server]['user'], @serverpasses[server]['pass']) + end + resp = @connections[server]["nntp"].mode_reader + rescue SocketError, Errno::EINVAL, EOFError, Errno::ETIMEDOUT, TimeoutError, Errno::ECONNREFUSED + print "Reconnect to #{server} failed: #{$!}\n" + if retries > 1 + del_server(server) + raise PermError, "Couldn't connect to #{server}" + else + retries += 1 + retry + end + end + print "Succesfully reconnected to #{server}\n" +end + +def memusage + print "memprof:\n" + print "global:\n" +# for i in global_variables +# print "#{i}\n" +# end +# print "local:\n" +# for i in local_variables +# print "#{i}\n" +# end + for i in self.instance_variables + puts i + print "X: " + begin + puts self.instance_eval(i).size + rescue NoMethodError + end + end +end + +def set_preselect_pattern(regexp) + @preselectpattern = Regexp.new(regexp) +end + +def preselect(subject) + if subject =~ @preselectpattern + return true + else + return false + end +# return ( subject =~ @preselectpattern ) +end + +def add(id, messid, subject, server) + @messageinfo.push(Message.new(messid, id, server, subject)) + @grouped = false +end + +def del_server(server) + print "Removing server #{server} from list\n" + @connections.delete(server) + @serverlist.delete(server) +end + +def get_articles(cachedir=false) + if cachedir != false + cache_check(cachedir) + end + for server in @connections.keys + begin + first, last = get_group_info(server) + rescue PermError + print "Error: #{$!}\n" + del_server(server) + next + end + if first.to_i <= last.to_i + # available articles on server + @connections[server]["first"] = first ? first.to_i : 0 + @connections[server]["last"] = last ? last.to_i : 0 + if Debuglevel > 0 + print " Server: #{server} First: #{first} Last: #{last}\n" + end + # clean up old newsrc entries + if @connections[server]["first"] > 0 + @connections[server]["newsrc"].unmark_range(@group, 0, (@connections[server]["first"] - 1).to_s) + @connections[server]["newsrc"].save + end + else + print " First article has higher number than last article on server #{server}.\n" + del_server(server) + end + end + cache_read(cachedir) + + # spul dat echt te oud is gaat nooit gevuld worden, dus doe ook geen poging het op te halen + # wil wel wat ophalen aangezien logging aantoont dat er wel oudere articles gedownload worden + for server in @connections.keys + if @connections[server]["skip_ids"].max && @connections[server]["skip_ids"].max < @connections[server]["last"] + articles = @connections[server]["last"] - @connections[server]["first"] + if articles > 10000 + fillerend = (@connections[server]["skip_ids"].max - (articles/3)).to_i + else + fillerend = @connections[server]["skip_ids"].max - 2000 + end + if @connections[server]["skip_ids"].min && fillerend > @connections[server]["skip_ids"].min + @connections[server]["skip_ids"] = @connections[server]["skip_ids"].union("#{@connections[server]["skip_ids"].min}-#{fillerend}") + # p "filling #{@connections[server]["skip_ids"].min}-#{fillerend}" + end + end + end + + for server in @connections.keys + print " reading articles from server: #{server}\n" + range = Set::IntSpan.new("#{@connections[server]["first"]}-#{@connections[server]["last"]}") + + rangelist = rechunk_runlist(range.diff(@connections[server]["skip_ids"]).run_list) + + print "rangelist: #{rangelist}\n" if Debuglevel > 2 + print "rangelist: #{rangelist.class.to_s}\n" if Debuglevel > 2 + print "rangelist elements: #{range.diff(@connections[server]["skip_ids"]).elements}\n" if Debuglevel > 2 + begin + unless rangelist == nil or rangelist =~ /^$/ + for i in rangelist.split(',') + print "i: #{i}\n" if Debuglevel > 2 + begin +# resp, xover_lines = get_xover(server, i) + resp, subj_lines = get_xhdr(server, i, "subject") + resp, messid_lines = get_xhdr(server, i, "message-id") + rescue TempError + printerr(server) + next + end + + art = {} +# xover_lines.collect{|x| +# art[x[0]] = {} unless art.has_key?(x[0]) +# art[x[0]]["subject"] = x[1] +# art[x[0]]["messid"] = x[4] +# print "art id: #{x[0]} subj: #{x[1]}\n" if Debuglevel > 2 +# print "art id: #{x[0]} messid: #{x[4]}\n" if Debuglevel > 2 +# } + subj_lines.collect{|x| + art[x[0]] = {} unless art.has_key?(x[0]) + art[x[0]]["subject"] = x[1] + print "art id: #{x[0]} subj: #{x[1]}\n" if Debuglevel > 2 + } + messid_lines.collect{|x| + art[x[0]] = {} unless art.has_key?(x[0]) + art[x[0]]["messid"] = x[1] + print "art id: #{x[0]} messid: #{x[1]}\n" if Debuglevel > 2 + } + for id in art.keys + if art[id].has_key?("subject") and art[id].has_key?("messid") + print "adding: #{art[id]["messid"]}, #{id}, #{server}, #{art[id]["subject"]}\n" if Debuglevel > 2 +# @newids[server][id.to_i] = true + # dit wellicht alleen doen indien preselector hem uitkiest + # en anders een leuk regeltje aan de cache toevoegen, + # maar niet in het geheugen houden + if preselect(art[id]["subject"]) + add(id.to_i, art[id]["messid"], art[id]["subject"], server) + end + cache_add(cachedir, id, art[id]["messid"], art[id]["subject"], server) + end + end + end + end + rescue PermError + del_server(server) + next + end + cache_save(cachedir, server) + end + GC.start +end + +def get_group_info(server) + timedout = 0 + errs = 0 + resp = "" + first = "" + last = "" + begin + timeout(30) do + begin + resp, count, first, last, name = @connections[server]["nntp"].group(@group) + rescue Net::NNTPReplyError + printerr(server) + if ( $!.to_s =~ /^503|^400/ ) + reconnect(server) + retry + else + raise PermError, "#{$!}" + end + rescue Errno::EPIPE, Errno::ECONNRESET, Errno::ETIMEDOUT, EOFError, Errno::EINVAL + printerr(server) + raise PermError, "Too many errors! (get_group_info)" if errs > 3 + reconnect(server) + retry + end + end + rescue TimeoutError + timedout += 1 + raise PermError, "Too many timeouts! (get_group_info)" if timedout > 1 + print "Time out, reconnecting to server... (get_group_info)\n" + reconnect(server) + retry + end + return first, last +end + +def get_xhdr(server, range, header) + timedout = 0 + resp = "" + lines = [] + begin + timeout(180) do + begin + p Time.now if Debuglevel > 1 + print "getting headers: #{header}, #{range}\n" if Debuglevel > 1 + resp, lines = @connections[server]["nntp"].xhdr(header, range) + if resp.to_i == 500 + print "xhdr not implemented\n" + print "Error: #{$!}\n" + end + unless resp.to_i >= 200 and resp.to_i < 300 + print "got response #{resp} while reading group #{@group} from #{server}\n" + raise TempError + end + rescue Net::NNTPReplyError + printerr(server) + if ( $!.to_s =~ /^503|^400/ ) + reconnect(server) + get_group_info(server) + retry + else + print "Won't handle this... yet :(\n" + end + rescue Errno::EPIPE, Errno::ECONNRESET, EOFError + printerr(server) + reconnect(server) + get_group_info(server) + retry + end + end + return resp, lines + rescue TimeoutError + print "Time out, reconnecting to server (get_xhdr)\n" + timedout += 1 + raise PermError, "Too many timeouts! (get_xhdr)" if timedout > 1 + reconnect(server) + get_group_info(server) + retry + end +end + +def get_xover(server, range) + timedout = 0 + resp = "" + lines = [] + start, ed = range.split("-") + unless ed + ed = start + end + begin + timeout(180) do + begin + p Time.now if Debuglevel > 1 + print "getting headers: #{range}\n" if Debuglevel > 1 + resp, lines = @connections[server]["nntp"].xover(start, ed) + if resp.to_i == 500 + print "xover not implemented\n" + print "Error: #{$!}\n" + end + unless resp.to_i >= 200 and resp.to_i < 300 + print "got response #{resp} while reading group #{@group} from #{server}\n" + raise TempError + end + rescue Net::NNTPReplyError + printerr(server) + if ( $!.to_s =~ /^503|^400/ ) + reconnect(server) + get_group_info(server) + retry + else + print "Won't handle this... yet :(\n" + end + rescue Errno::EPIPE, Errno::ECONNRESET, EOFError + printerr(server) + reconnect(server) + get_group_info(server) + retry + end + end + return resp, lines + rescue TimeoutError + print "Time out, reconnecting to server (get_xover)\n" + timedout += 1 + raise PermError, "Too many timeouts! (get_xover)" if timedout > 1 + reconnect(server) + get_group_info(server) + retry + end +end + +def get_groupname + return @group +end + +def get_body(server, message) +#p "get_body" + timedout = 0 + retries = 0 + resp = "" + id = "" + messid = "" + list = [] + begin + timeout(180) do + begin + list = [] + resp, id, messid, list = @connections[server]["nntp"].body(message) + rescue Net::NNTPReplyError + a = '' + a += $! + printerr(server) + if retries == 0 && (a =~ /^503/ || a =~ /^400/) + reconnect(server) + get_group_info(server) + retries = 1 + retry + end + return false + rescue EOFError, NameError + printerr(server) + return false + rescue Errno::EPIPE, Errno::ECONNRESET + printerr(server) + reconnect(server) + get_group_info(server) + retry + end + end + return resp, id, messid, list + rescue TimeoutError, Errno::ETIMEDOUT + print "Time out, reconnecting to server (get_body)\n" + timedout += 1 + raise PermError, "Too many timeouts! (get_body)" if timedout > 1 + reconnect(server) + get_group_info(server) + retry + end +end + +def get_group_body(subj) +#p "get_group_body" + result = [] + group_subject_sort(subj) +# puts @groups[subj].to_yaml + return false if @groups[subj]["messageinfo"] == nil + for i in (0...@groups[subj]["messageinfo"].length) + unless @gotten.has_key?(@groups[subj]["messageinfo"][i][:messid]) + print "getting article: #{i}\n" if Debuglevel > 1 + print "getting article: #{subj}\n" if Debuglevel > 1 + print "full subject: #{@groups[subj]["messageinfo"][i][:subject]}\n" if Debuglevel > 0 + print "message id: #{@groups[subj]["messageinfo"][i][:messid]}\n" if Debuglevel > 1 + print "id: #{@groups[subj]["messageinfo"][i][:id]}\n" if Debuglevel > 1 + print "server: #{@groups[subj]["messageinfo"][i][:server]}\n" if Debuglevel > 0 + resp = false + while resp == false + if @serverlist.include?(@groups[subj]["messageinfo"][i][:server]) + resp, id, messid, list = get_body(@groups[subj]["messageinfo"][i][:server], @groups[subj]["messageinfo"][i][:messid]) + else + resp = false + end + if resp == false + if Debuglevel > 1 + print "mess-id i: #{@groups[subj]["messageinfo"][i][:messid]}\n" + # XXX dit moet netter kunnen + print "mess-id i+1: #{@groups[subj]["messageinfo"][i+1][:messid]}\n" if @groups[subj]["messageinfo"][i+1] != nil + end + if (i+1 < @groups[subj]["messageinfo"].length) and + (@groups[subj]["messageinfo"][i][:messid] == @groups[subj]["messageinfo"][i+1][:messid]) + print " Trying next server...\n" + i += 1 + else + raise TempError, " Message-id not on another server" + end + end + end + @gotten[ @groups[subj]["messageinfo"][i][:messid] ] = true + result = list + end + end + return result +end + +def get_group_body_first(subj) +#p "get_group_body_first" + group_subject_sort(subj) + i = 0 + unless @groups[subj]["messageinfo"] != nil && @groups[subj]["messageinfo"][0][:messid] + p "ieks komt niet door lame check heen" + return false + end + p "komt wel door lame check heen" + while @gotten.has_key?(@groups[subj]["messageinfo"][0][:messid]) == false + print "getting article: #{subj}\n" if Debuglevel > 0 + print "full subject: #{@groups[subj]['messageinfo'][0][:subject]}\n" if Debuglevel > 0 + print "message id: #{@groups[subj]['messageinfo'][i][:messid]}\n" if Debuglevel > 1 + print "id: #{@groups[subj]['messageinfo'][i][:id]}\n" if Debuglevel > 1 + print "server: #{@groups[subj]['messageinfo'][0][:server]}\n" if Debuglevel > 0 + resp = false + while resp == false + resp, id, messid, list = get_body(@groups[subj]["messageinfo"][i][:server], @groups[subj]["messageinfo"][i][:messid]) + if resp == false + print "mess-id i: #{@groups[subj]['messageinfo'][i][:messid]}\n" + # XXX dit moet netter kunnen + print "mess-id i+1: #{@groups[subj]['messageinfo'][i+1][:messid]}\n" if @groups[subj]["messageinfo"][i+1] != nil + if (i+1 < @groups[subj]["messageinfo"].length) and + (@groups[subj]["messageinfo"][i][:messid] == @groups[subj]["messageinfo"][i+1][:messid]) + print "Trying next server...\n" + i += 1 + else + raise TempError, "Message-id not on another server" + end + end + end + @gotten[@groups[subj]["messageinfo"][i][:messid]] = true + end + return list +end + +def get_group_body_rest(subj, file=nil) +#p "get_group_body_rest" + result = [] + for i in (1...@groups[subj]["messageinfo"].length) + unless @gotten.has_key?(@groups[subj]["messageinfo"][i][:messid]) + print "getting article: #{i}\n" if Debuglevel > 1 + print "getting article: #{subj}\n" if Debuglevel > 1 + print "full subject: #{@groups[subj]['messageinfo'][i][:subject]}\n" if Debuglevel > 0 + print "message id: #{@groups[subj]['messageinfo'][i][:messid]}\n" if Debuglevel > 1 + print "id: #{@groups[subj]['messageinfo'][i][:id]}\n" if Debuglevel > 1 + print "server: #{@groups[subj]['messageinfo'][i][:server]}\n" if Debuglevel > 0 + resp = false + while resp == false + resp, id, messid, list = get_body(@groups[subj]["messageinfo"][i][:server], @groups[subj]["messageinfo"][i][:messid]) + if resp == false + print "mess-id i: #{@groups[subj]["messageinfo"][i][:messid]}\n" + # print "mess-id i+1: #{@groups[subj]["messageinfo"][i+1][:messid]}\n" + # XXX dit moet netter kunnen + print "mess-id i+1: #{@groups[subj]["messageinfo"][i+1][:messid]}\n" if @groups[subj]["messageinfo"][i+1] != nil + if (i+1 < @groups[subj]["messageinfo"].length) and + (@groups[subj]["messageinfo"][i][:messid] == @groups[subj]["messageinfo"][i+1][:messid]) + print "Trying next server...\n" + i += 1 + else + raise TempError, "Message-id not on another server" + end + end + end + @gotten[ @groups[subj]["messageinfo"][i][:messid] ] = true + if file + list.collect{|line| file.print "#{line}\n"} + else + result.concat(list) + end + end + end + return result +end + +def get_group_subjects + group_subjects unless @grouped + return @groups.keys +end + +def group_is_complete(subj) + group_subjects unless @grouped + #print "Subject: #{subj}\n" + messids = [] + @groups[subj]["messageinfo"].each {|x| + messids.push(x[:messid]) + } +#p "group complete?: #{messids}" + umessids = messids.uniq + if (umessids.length ) >= @groups[subj]["total"].to_i + return true + else + return false + end +end + +def group_percentage_primary(subj) + group_subjects unless @grouped + groupsize = @groups[subj]["messageinfo"].length + primarycount = 0 + @groups[subj]["messageinfo"].each {|x| + if x[:server] == @serverlist[0] + primarycount += 1 + end + } + percentage = ((100.0/groupsize)*primarycount).to_i + return percentage +end + +def group_percentage_fallback(subj) + group_subjects unless @grouped + groupsize = @groups[subj]["messageinfo"].length + fallbackcount = 0 + if @serverlist[-1] == @serverlist[0] + return 0 + end + onmain = {} + @groups[subj]["messageinfo"].each {|x| + if x[:server] != @serverlist[-1] && onmain[x[:subject]].nil? + onmain[x[:subject]] = 1 + end + } + @groups[subj]["messageinfo"].each {|x| + if x[:server] == @serverlist[-1] && onmain[x[:subject]].nil? + fallbackcount += 1 + end + } + percentage = ((100.0/groupsize)*fallbackcount).to_i + return percentage +end + +def group_is_singlepart(subj) + @groups[subj]["total"].to_i == 1 +end + +def group_is_multipart(subj) + @groups[subj]["total"].to_i > 1 +end + +def group_subjects + @groups = {} + for i in (0...@messageinfo.length) + print "group subjects: #{i} #{@messageinfo[i][:subject]}\n" if Debuglevel > 3 + # misschien is het wel belangrijk dat er voorkeuren in deze + # match zitten... geen idee + if @messageinfo[i][:subject] =~ /(.*)\((\d+)\/(\d+)\)(.*)/ || @messageinfo[i][:subject] =~ /(.*)\[(\d+)\/(\d+)\](.*)/ + #if @messageinfo[i][:subject] =~ /(.*)[\(\[](\d+)\/(\d+)[\)\]](.*)/ + j = "#{$1}#{$4} (#{$3})" + number = $2 + total = $3 + else + j = @messageinfo[i][:subject] + number = 1 + total = 1 + end + if @groups.has_key?(j) and number.to_i != 0 + @groups[j]["messageinfo"].push(@messageinfo[i]) + elsif number.to_i != 0 + @groups[j] = {} + @groups[j]["total"] = total + @groups[j]["messageinfo"] = [ (@messageinfo[i]) ] + end + end + @grouped = true +end + +def set_skip_ids(server, ids) + set = Set::IntSpan.new(ids) + set.finite? or return false + min = set.min + min != nil and min < 0 and return false + @connections[server]["skip_ids"] = set + return true +end + +def group_update_newsrc(subject) + for i in (0...@groups[subject]["messageinfo"].length) + if @connections[@groups[subject]["messageinfo"][i][:server]] + @connections[@groups[subject]["messageinfo"][i][:server]]["newsrc"].mark(@group, @groups[subject]["messageinfo"][i][:id]) +#p @group +#p @groups[subject]["messageinfo"][i][:id] + end + end +end + +def save_newsrc() + for server in @connections.keys + @connections[server]["newsrc"].save + end +end + +def cache_add(cachedir, id, messid, subject, server) + if @cache_buf.has_key?(server) + @cache_buf[server].push("#{id}|#{messid}|#{subject}\n") + else + @cache_buf[server] = [ "#{id}|#{messid}|#{subject}\n" ] + end + if @cache_buf[server].length > 100 + cache_save(cachedir, server) + end +end + +def cache_check(cachedir) + if ! FileTest.exists?(cachedir) + print "Cachedir '#{cachedir}' doesn't exists, performance will suffer\n" + end +end + +def cache_read(cachedir) +puts "#{Time.now} Reading & scrubbing caches" + filename = "#{cachedir}/#{@group}.ripnewscache" + excludes = {} + regexp = Regexp.new('^([^\|]*)\|([^\|]*)\|(.*)') + for server in @connections.keys + first = @connections[server]["first"] + last = @connections[server]["last"] + #cache_scrub(cachedir, server) +puts " #{Time.now} Reading cache for #{server}" + excludes[server] = {} + @connections[server]["skip_ids"].elements.collect!{|x| excludes[server][x]=true} + if FileTest.directory?( cachedir) and FileTest.file?( "#{filename}.#{server}" ) and FileTest.readable?( "#{filename}.#{server}" ) + outfile = File.new("#{filename}.#{server}.new", "w") or puts "Couldn't open cachefile for writing" + File.new( "#{filename}.#{server}" ).each{ |line| + line =~ regexp + id_i = $1.to_i + messid = $2 + subject = $3 + if first <= id_i and id_i <= last + unless excludes[server].has_key?(id_i) + outfile.puts(line) + if preselect(subject) + add(id_i, messid, subject, server) + end + # XXX alle traagheid van de cache_read zit in deze regel: + @connections[server]["skip_ids"].insert(id_i) + end + end + } + if ( File.move("#{filename}.#{server}.new", "#{filename}.#{server}") ) + print " #{Time.now} Cache scrubbed for #{server}\n" + else + print "Couldn't scrub #{server} cache\n" + end + end + end +puts "#{Time.now} Caches read" +#memusage +end + +def cache_save(cachedir, server) +#p "writing cache" +#p Time.now + filename = "#{cachedir}/#{@group}.ripnewscache" + if FileTest.directory?( cachedir ) + file = File.new( "#{filename}.#{server}", "a+" ) or print "couldn't open cachefile for writing\n" +# print "Updating cache...\n" + @cache_buf[server].sort! + file.print @cache_buf[server] + file.close + @cache_buf[server] = [] +# print "Cache updated for #{server}\n" + end +#p Time.now +end + +def cache_scrub(cachedir, server) +# XXX this could and probably should be done in a separate thread... +# XXX but it'll work for now +# XXX also read articles aren't removed right now +# XXX this could be done, but I don't know if I want to pay the overhead +p "scrubbing cache" +p Time.now + filename = "#{cachedir}/#{@group}.ripnewscache" + if File.exists?("#{filename}.#{server}") +# regexp = Regexp.new('^(\d+)\|') + infile = File.new("#{filename}.#{server}") or puts "Couldn't open cachefile for reading" + outfile = File.new("#{filename}.#{server}.new", "w") or puts "Couldn't open cachefile for writing" + infile.each{ |line| + id, messid, subject = line.split("|", 3) + if id.to_i >= @connections[server]["first"] and + id.to_i <= @connections[server]["last"] + outfile.puts(line) + end + } + end +p Time.now +end + +############################################################### + +# a base64 decoder... +def decode64(str) + string = '' + for line in str.split("\n") + line.delete!('^A-Za-z0-9+') # remove non-base64 chars + line.tr!('A-Za-z0-9+', ' -_') # convert to uuencoded format + len = ["#{32 + line.length * 3 / 4}"].pack("c") + # compute length byte + string += "#{len}#{line}".unpack("u") # uudecode and concatenate + end + return string +end + +############################################################### + +def group_subject_sort(subj) + # XXX Waarom gebruik ik hier eigenlijk sort_arr ipv in place sorting? + #print "Sorting articles\n" + serverhash = {} + for i in (0...@serverlist.length) + serverhash[@serverlist[i]] = i + end + total = @groups[subj]["total"] + sort_arr = [] +#p "pre sort length: #{@groups[subj]['messageinfo'].length}" + for i in (0...@groups[subj]["messageinfo"].length) + print "subj sort #{@groups[subj]['messageinfo'][i][:subject]}\n" if Debuglevel > 2 + print "subj sort #{@groups[subj]['messageinfo'][i][:messid]}\n" if Debuglevel > 2 + print "subj sort #{@groups[subj]['messageinfo'][i][:id]}\n" if Debuglevel > 2 + print "subj sort #{@groups[subj]['messageinfo'][i][:server]}\n" if Debuglevel > 2 + sort_arr.push( + @groups[subj]["messageinfo"][i].dup + ) if serverhash[@groups[subj]["messageinfo"][i][:server]] != nil + end + +#p "sort_arr length pre sort: #{sort_arr.length}" + if sort_arr.length != 0 + sort_arr.sort!{|a,b| + r = ward_sort(a[:subject], b[:subject]) + if serverhash[a[:server]] == nil or serverhash[b[:server]] == nil + print "serverhash[a[:server]]: #{serverhash[a[:server]]}\n" + print "serverhash[b[:server]]: #{serverhash[b[:server]]}\n" + print "a[:server]: #{a[:server]}\n" + print "b[:server]: #{a[:server]}\n" + print "strange things going on here...\n" + end + if r == 0 + r = serverhash[a[:server]] <=> serverhash[b[:server]] + end + r + } + end + + @groups[subj].clear + @groups[subj]["total"] = total +#p "sort_arr length post sort: #{sort_arr.length}" + sort_arr.collect{|i| + if @groups[subj].has_key?("messageinfo") + @groups[subj]["messageinfo"].push(i) + else + @groups[subj]["messageinfo"] = [ i ] + end + print "subject sort: #{i[:subject]}\n" if Debuglevel > 2 + print "server: #{i[:server]}\n" if Debuglevel > 2 + } +#if ! @groups[subj]['messageinfo'].nil? +# p "post sort length: #{@groups[subj]['messageinfo'].length}" +#end + #print "Done sorting\n" +end + +def ward_sort(a, b) + c = a.to_s.split(/([0-9]+)/) + d = b.to_s.split(/([0-9]+)/) + + c.collect{|x| + y = d.shift + r = ((x.to_s =~ /^[0-9]+$/) && (y.to_s =~ /^[0-9]+$/)) ? + (x.to_i <=> y.to_i) : + (x.to_s <=> y.to_s) + if r != 0 + return r + end + } + return -1 if (d != []) + return 0 +end + +def rechunk_runlist(runlist) + return nil if runlist == nil + chunksize = 500 + blalist = runlist.split(',') + + # hmmm, als het aantal articles wat tussen de komma's ligt < pak um beet 3 + # dan is het volgens mij heel erg de moeite die 3 ook gewoon binnen te halen + # en minder network requests te doen... + # de manier om dat te doen is dan iets van die komma weghalen en + # een van de 2 getallen... + + blalist.collect!{|x| + result = "" + if x =~ /(.*)-(.*)/ + a = $1 + while ($2.to_i - a.to_i) > chunksize + result << "#{a}-#{a.to_i+(chunksize-1)}," + a = a.to_i + chunksize + end + result << "#{a}-#{$2}" + else + x + end + } + blup = blalist.join(",") + return blup +end + +def printerr(server) + print "Caught #{$!.class} reading from server #{server} (#{caller[0]})\n" + print "Error: #{$!}\n" +end + +def disconnect + for server in @connections.keys + begin + @connections[server]["nntp"].quit + rescue Errno::EPIPE, Errno::ECONNRESET, EOFError, IOError + end + end +end + +def quit + # just testing if these should be reset... + @messageinfo = [] + disconnect +end + + private :ward_sort + +end # class diff --git a/tags/ripnews-release_0_5_3/ripnews/news/newsrc.rb b/tags/ripnews-release_0_5_3/ripnews/news/newsrc.rb new file mode 100644 index 0000000..10ab949 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/news/newsrc.rb @@ -0,0 +1,465 @@ +# $Dwarf: newsrc.rb,v 1.13 2004/06/16 08:16:58 ward Exp $ +# $Source$ + +# +# Copyright (c) 2002, 2003 Ward Wouts +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# + +require "set/intspan" + +module News + +class Newsrc + +def initialize(file=nil) + @newsrc = { "group" => Hash.new, "list" => Array.new } + if file + unless load(file) + print "Can't load #{file}\n" + exit + end + end +end + +def load(file=nil) + file = "#{ENV['HOME']}/.newsrc" unless file + @newsrc["file"] = file + @newsrc["group"] = {} + @newsrc["list"] = [] + + if FileTest.file?( "#{file}" ) and FileTest.readable?( "#{file}" ) + lines = IO.readlines("#{file}") + import_rc(lines) + end + + return true +end + +def import_rc(lines) + @newsrc["group"] = {} + @newsrc["list"] = [] + linenumber = 1 + for line in lines + parse(line) + end +end + +def parse(line) + unless line =~ /^([^!:]+)([!:])\s(.*)$/x + print "Newsrc.parse: Bad newsrc line: #{line}\n" + exit + end + + name = $1 + mark = $2 + articles = $3 + + unless Set::IntSpan.valid(articles) + print "Newsrc.parse: Bad article list: #{line}\n" + end + + + group = { "name" => name, "subscribed" => (mark == ":"), + "articles" => Set::IntSpan.new(articles)} + + @newsrc["group"][name] = group + @newsrc["list"].push(group) +end + +def save + unless @newsrc.has_key?("file") + @newsrc["file"] = "#{$ENV['HOME']}/.newsrc" + end + save_as(@newsrc["file"]) +end + +# this is not thread safe! +def save_as(file) + if FileTest.exists?("#{file}") + begin + File.rename(file, "#{file}.bak") + rescue + print "Can't rename #{file}, #{file}.bak: #{$!}\n" + exit + end + end + begin + newsrc = File.new(file, "w") + rescue + print "Can't open #{file}: #{$!}\n" + exit + end + @newsrc["file"] = file + for group in @newsrc["list"] + newsrc.print format(group) + end + newsrc.close +end + +def save_group(group) + unless @newsrc.has_key?("file") + @newsrc["file"] = "#{$ENV['HOME']}/.newsrc" + end + save_as(@newsrc["file"], group) +end + +# this should be thread safe +def save_group_as(file, group) + if FileTest.exists?("#{file}") + if ( ! File.copy(file, "#{file}.bak") ) + print "Can't copy #{file} to #{file}.bak: #{$!}\n" + end + end + begin + newsrc = File.new(file, "r+").flock(File::LOCK_EX) + rescue + print "Can't open ${file}: #{$!}\n" + exit + end + + # read file + lines = newsrc.readlines + + # pointer -> 0 + newsrc.rewind + + # write read stuff & replace group + for line in lines + if line =~ /^#{group}(:|!)/ + newsrc.print line + else + newsrc.print format(group) + end + end + + newsrc.flock(File::LOCK_UN) # what's the right order here? + newsrc.close +end + +def format(group) + name = group["name"] + sub = group["subscribed"] ? ':' : '!' + articles = group["articles"].run_list + #space = articles ? ' ' : '' + #return "#{name}#{sub}#{space}#{articles}\n" + return "#{name}#{sub} #{articles}\n" +end + +def export_rc + lines = @newsrc["list"].collect{ |group| + name = group["name"] + sub = group["subscribed"] ? ':' : '!' + articles = group["articles"].run_list + space = articles ? ' ' : '' + "#{name}#{sub}#{space}#{articles}\n" } + return lines +end + +def add_group(name, options) + + if @newsrc["group"].has_key?(name) + options.has_key?("replace") or return false + del_group(name) + end + group = {"name" => name, + "subscribed" => true, + "articles" => Set::IntSpan.new } + + @newsrc["group"][name] = group + _insert(group, options) + + return true +end + +def move_group(name, options) + if @newsrc["group"].has_key?(name) + group = @newsrc["group"][name] + else + return false + end + + @newsrc["list"] = @newsrc["list"].delete_if{|x| x["name"] == name} + + _insert(group, options) + return true +end + +def _insert(group, options) + list = @newsrc["list"] + + where = "" + arg = "" + if options.has_key?("where") + where = options["where"] + end + arg = where.slice!(1) if where.class.to_s == "Array" + + case where.to_s + when "first" + @newsrc["list"].unshift(group) + when "last" + @newsrc["list"].push(group) + when "" + @newsrc["list"].push(group) # default + when "alpha" + alpha(group) + when "before" + before(group, arg) + when "after" + after(group, arg) + when "number" + number(group, arg) + end +end + +def alpha (group) + name = group["name"] + for i in (0...@newsrc["list"].length) + if ((name <=> @newsrc["list"][i]["name"]) == -1) + upper = @newsrc["list"].slice!(i..@newsrc["list"].length) + @newsrc["list"].push(group) + @newsrc["list"].push(upper) + return; + end + end + @newsrc["list"].push(group) +end + +def before(group, before) + name = group["name"] + for i in (0...@newsrc["list"].length) + if (@newsrc["list"][i]["name"] == before.to_s) + upper = @newsrc["list"].slice!(i..@newsrc["list"].length) + @newsrc["list"].push(group) + @newsrc["list"].push(upper) + + return; + end + end + + @newsrc["list"].push(group) +end + +def after(group, after) + name = group["name"] + + for i in (0...@newsrc["list"].length) + if (@newsrc["list"][i]["name"] == after.to_s) + upper = @newsrc["list"].slice!((i+1)..@newsrc["list"].length) + @newsrc["list"].push(group) + @newsrc["list"].push(upper) + return; + end + end + + @newsrc["list"].push(group) +end + +def number(group, offset) + offset = @newsrc["list"].length if offset[0] > @newsrc["list"].length + upper = @newsrc["list"].slice!(offset..@newsrc["list"].length) + @newsrc["list"].push(group) + @newsrc["list"].push(upper) +end + + +def del_group(name) + if @newsrc["group"].has_key?(name) + group = @newsrc["group"][name] + else + return false + end + + @newsrc["group"].delete(name) + @newsrc["list"] = @newsrc["list"].delete_if{|x| x["name"] == name} + + return true +end + +def subscribe(name, options = {"where" => ""}) + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + @newsrc["group"][name]["subscribed"] = true +end + +def unsubscribe(name, options = {"where" => ""}) + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + @newsrc["group"][name]["subscribed"] = false +end + +def mark(name, article, options = {"where" => ""}) + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + @newsrc["group"][name]["articles"].insert(article) +end + +def mark_list(name, list, options = {"where" => ""}) + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + articles = @newsrc["group"][name]["articles"].union(list) + @newsrc["group"][name]["articles"] = articles +end + +def mark_range(name, from, to, options = {"where" => ""}) + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + range = Set::IntSpan.new("#{from}-#{to}") + articles = @newsrc["group"][name]["articles"].union(range) + @newsrc["group"][name]["articles"] = articles +end + +def unmark(name, article, options = {"where" => ""}) + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + @newsrc["group"][name]["articles"].remove(article) +end + +def unmark_list(name, list, options = {"where" => ""}) + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + articles = @newsrc["group"][name]["articles"].diff(list) + @newsrc["group"][name]["articles"] = articles +end + +def unmark_range(name, from, to, options = {"where" => ""}) + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + range = Set::IntSpan.new("#{from}-#{to}") + articles = @newsrc["group"][name]["articles"].diff(range) + @newsrc["group"][name]["articles"] = articles +end + +def exists(name) + return @newsrc["group"].has_key?(name) ? true : false +end + +def subscribed(name) + exists(name) and @newsrc["group"][name]["subscribed"] +end + +def marked(name, article) + exists(name) and @newsrc["group"][name]["articles"].member?(article) +end + +def num_groups + return @newsrc["list"].length +end + +def groups + list = @newsrc["list"].dup + list.collect!{|x| x["name"]} +end + +def sub_groups + list = @newsrc["list"].dup + list.collect!{|x| x["subscribed"] ? x["name"] : nil}.compact! +end + +def unsub_groups + list = @newsrc["list"].dup + list.collect!{|x| x["subscribed"] ? nil : x["name"]}.compact! +end + +def marked_articles(name, options = {"where" => ""}) + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + return @newsrc["group"][name]["articles"].elements +end + +def unmarked_articles(name, from, to, options = {"where" => ""}) + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + range = Set::IntSpan.new("#{from}-#{to}") + return range.diff(@newsrc["group"][name]["articles"]).elements +end + +def get_articles(name, options = {"where" => ""}) + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + @newsrc["group"][name]["articles"].run_list +end + +def set_articles(name, articles, options = {"where" => ""}) + Set::IntSpan.valid(articles) or return false + set = Set::IntSpan.new(articles) + set.finite or return false + min = set.min + min != nil and min < 0 and return false + unless @newsrc["group"].has_key?(name) + add_group(name, options) + end + @newsrc["group"][name]["articles"] = set + return true +end + +end # class + +end # module + + +# TODO +# Do not kill an item until it's tested! + +# [x] new +# [x] load +# [ ] _scan # Initializes a Newsrc object from a string. Used for testing. +# [x] import_rc +# [x] parse # parses a single line from a newsrc file +# [x] save +# [x] save_as +# [ ] save_group +# [ ] save_group_as +# [x] format +# [x] export_rc +# [ ] _dump # Formats a Newsrc object to a string. Used for testing +# [x] add_group +# [x] move_group +# [x] Splice(\@$$@) # heet nu number en is simpeler +# [x] _insert +# [x] Alpha +# [x] Before +# [x] After +# [x] del_group +# [x] subscribe +# [x] unsubscribe +# [x] mark +# [x] mark_list +# [x] mark_range +# [x] unmark +# [x] unmark_list +# [x] unmark_range +# [x] exists +# [x] subscribed +# [x] marked +# [x] num_groups +# [x] groups +# [x] sub_groups +# [x] unsub_groups +# [x] marked_articles +# [x] unmarked_articles +# [x] get_articles +# [x] set_articles diff --git a/tags/ripnews-release_0_5_3/ripnews/news/tests/newsrc.news.wizeazz.nl b/tags/ripnews-release_0_5_3/ripnews/news/tests/newsrc.news.wizeazz.nl new file mode 100644 index 0000000..b39916c --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/news/tests/newsrc.news.wizeazz.nl @@ -0,0 +1,7 @@ +alt.binaries.sounds.audiobooks: 5521364,5521368,5521370,5521372,5521376,5521378-5521379,5521383,5521385-5521386,5521389-5521390,5521394,5521397,5521399,5521401,5521403,5521406-5521407,5521410-5521412,5521414,5521420,5521422-5521426,5521428-5521430,5521432,5521434-5521435,5521438,5521440-5521442,5521445-5521446,5521448,5521452,5521454,5521457,5521460-5521462,5521465-5521466,5521468,5521470,5521472-5521475,5521477,5521479-5521480,5521483,5521486-5521487,5521489-5521490,5521493,5521495,5521499,5521501-5521503,5521505-5521510,5521512-5521517,5521520-5521522,5521528-5521530,5521532-5521533,5521535-5521536,5521540,5521542,5521544-5521545,5521547-5521548,5521552,5521554,5521556-5521557,5521565,5521567,5521569,5521576,5521578,5521580-5521584,5521586,5521588-5521593,5521596-5521609,5521615-5521620,5521625-5521628,5521630,5521632-5521634,5521636,5521642-5521644,5521646,5521649-5521650,5521654-5521658,5521663,5521665-5521666,5521668-5521669,5521672-5521673,5521677,5521679-5521680,5521685,5521688,5521691-5521692,5521695,5521698,5521706,5521708,5521711,5521716,5521719,5521721-5521722,5521725,5521728-5521729,5521734-5521735,5521737,5521739,5521741,5521743,5521748,5521751,5521753,5521756-5521758,5521765,5521768,5521771,5521773,5521777,5521779,5521797-5521798,5521800,5521802-5521805,5521809,5521812,5521817-5521818,5521821,5521830,5521832,5521834-5521836,5521839-5521842,5521845,5521847,5521853-5521854,5521856,5521861,5521864,5521866,5521868,5521873,5521875,5521879-5521881,5521886-5521888,5521890,5521892-5521896,5521898-5521899,5521901-5521902,5521904,5521910,5521912,5521914,5521916-5521920,5521924,5521926,5521928,5521930,5521932,5521934,5521938-5521939,5521944,5521947,5521949,5521953,5521955,5521957-5521959,5521961-5521962,5521979,5530084,5530111,5530150,5530152,5530155,5530164,5530167,5530173,5530184,5530195-5530196,5530203-5530204,5530212,5530217-5530218,5530224,5530227-5530228,5530233,5530239,5530242,5530246-5530247,5530263,5530268,5530271,5530275,5530277,5530285-5530287,5530302-5530305,5530314,5530318,5530320,5530324,5530326,5530329-5530330,5530335-5530336,5530340,5530342-5530345,5530350,5530358,5530363,5530366,5530374,5530384,5530389,5530398,5530400,5530408,5530425-5530426,5530433,5530436,5530440,5530452,5530455,5530457,5530474,5530482-5530483,5530486,5530497,5530499,5530507,5530511,5530517-5530518,5530524,5530526,5530545-5530546,5530550,5530556,5530563,5530565,5530568,5530572,5530580,5530583-5530584,5530587-5530588,5530600,5530617,5530624-5530625,5530635-5530637,5530640,5530651,5530654,5530656,5530659,5530663,5530676,5530686,5530692-5530693,5530703,5530708,5530710-5530711,5530716-5530718,5530726,5530731,5530734,5530756,5530759-5530760,5530769,5530772,5530774,5530778,5530782,5530784-5530785,5530787,5530789,5530793,5530805-5530806,5530812,5530816,5530825,5530833-5530834,5530837,5530839,5530843-5530844,5530850-5530851,5530853,5530856,5530864,5530866,5530869,5530874,5530876-5530878,5530884,5530886-5530887,5530891,5530893-5530894,5530897-5530898,5530900,5530903,5530908,5530911,5530914,5530918-5530919,5530924-5530926,5530930,5530934,5530942-5530944,5530947,5530951-5530952,5530956-5530960,5530962-5530963,5530965,5530967-5530968,5530971,5530975-5530976,5530982-5530983,5530987,5530992-5530993,5530998,5531002-5531004,5531009,5531017-5531018,5531021,5531024,5531028,5531031-5531032,5531036,5531038,5531041,5531047,5531049,5531052,5531055,5531058,5531061,5531064,5531067-5531068,5531078,5531083,5531092,5531102,5531104,5531108-5531109,5531111,5531113,5531117,5531119,5531122,5531124-5531126,5531136-5531137,5531142-5531146,5531153,5531155-5531156,5531158-5531159,5531161,5531166,5531168,5531174-5531175,5531180,5531182,5531187-5531188,5531194-5531195,5531201,5531203,5531208,5531212,5531218,5531229,5531237,5531242,5531251,5531253,5531267,5531274,5539082,5539090-5539091,5539102,5539114,5539119,5539122,5539125,5539129,5539139-5539140,5539144-5539145,5539148,5539151,5539160,5539162,5539167,5539170,5539176,5539189,5539192,5539194,5539196-5539197,5539207,5539214,5539219,5539228,5539232,5539236,5539238,5539250,5539253,5539256,5539259,5539266,5539274,5539282,5539286,5539290,5539296,5539299,5539302-5539303,5539308-5539309,5539313,5539318,5539322,5539324,5539333,5539342,5539353,5539364-5539365,5539372,5539375,5539379,5539388,5539394,5539399-5539400,5539405,5539412,5539421,5539424,5539429,5539433,5539438,5539441,5539446,5539448,5539463,5539467,5539472,5539477-5539478,5539482,5539489,5539498-5539501,5539503,5539515,5539517,5539520-5539521,5539527,5539529,5539531,5539534,5539539,5539543,5539548,5539550,5539559,5539561,5539568,5539574,5539580,5539582,5539587,5539592,5539598,5539600,5539602,5539604-5539605,5539615-5539616,5539622-5539623,5539626,5539628,5539637,5539646-5539647,5539662,5539664-5539665,5539667,5539672-5539674,5539677,5539680,5539686,5539692,5539703,5539707,5539712,5539728,5539739,5539744,5539747,5539752,5539754,5539761-5539762,5539765,5539771,5539781,5539788,5539832-5539833,5539835,5539845,5539855,5539864,5539869,5539875,5539877,5539883,5539891-5539892,5539903,5543008,5543025,5543043,5543107,5543147,5543163,5543174,5543193,5543214,5543230,5543233,5543282,5543287,5543332,5565862,5565890,5565904,5565906,5565922,5565925,5565929,5565934,5565945,5565949-5565951,5565965-5565967,5565969,5565976,5565979-5565980,5565982,5565988,5565994,5566012-5566013,5566019,5566022,5566027-5566028,5566032,5566038,5566045-5566046,5566064-5566066,5566075,5566078-5566079,5566084,5566090-5566091,5566103,5566108,5566110,5566114,5566118,5566127,5566137-5566139,5566143,5566149,5566154,5566165,5566170,5566174,5566178,5566184,5566191-5566192,5566195-5566196,5566210,5566212,5566215,5566224,5566231,5566238,5566240-5566241,5566245,5566258,5566260-5566261,5566269,5566272,5566280,5566283,5566301-5566302,5566304,5566307,5566310,5566318-5566320,5566322,5566330-5566331,5566343-5566344,5566350,5566379,5566387,5566397,5566402,5566405,5566408,5566420,5566429,5566431,5566434-5566435,5566444,5566457,5566459,5566467-5566468,5566474,5566483-5566485,5566488,5566495,5566503,5566527,5566530,5566540,5569669-5569671,5569680,5569685,5569695,5569701,5569711,5569715,5569721-5569722,5569725,5569738,5569742,5569749,5569751,5569757,5569761,5569769,5569779-5569780,5569782,5569786-5569787,5569792,5569794,5569796,5569798-5569799,5569803,5569808,5569813,5569818,5569820-5569821,5569824,5569828-5569830,5569832-5569835,5569840-5569843,5569845-5569846,5569849,5569853-5569858,5569860,5569862,5569866-5569868,5569871,5569873-5569874,5569876,5569878-5569880,5569883-5569886,5569888-5569889,5569892,5569894,5569897-5569900,5569903-5569932,5569934-5569942,5569944-5569946,5569950-5569952,5569957-5569958,5569965,5569968,5569970,5569974,5569978,5569983,5569985-5569986,5569991,5569993-5569994,5570000,5570002,5570005-5570006,5570008,5570010,5570012,5570016-5570017,5570019,5570028,5570034,5570038,5570041,5570045-5570047,5570049,5570051,5570054-5570055,5570065-5570069,5570072,5570079,5570082-5570085,5570092,5570094,5570098-5570099,5570107,5570109,5570111,5570120,5570123-5570125,5570129,5570131-5570132,5570135-5570137,5570139-5570141,5570143-5570145,5570147,5570149-5570183,5570185-5570192,5570194-5570204,5570206-5570227,5570229-5570261,5570265-5570266,5570268-5570314,5570316-5570317,5570319-5570329,5570331-5570355,5570357-5570450,5570452-5570462,5570466-5570467,5570469-5570470,5570472-5570473,5570475,5570477-5570480,5570483,5570485-5570486,5570488-5570489,5570493-5570494,5570496,5570498-5570499,5570501,5570506,5570508-5570509,5570512-5570514,5570518,5570522,5570528-5570531,5570533-5570535,5570538,5570541-5570542,5570546-5570548,5570550-5570551,5570557-5570558,5570563,5570565,5570567,5570574-5570576,5570578-5570579,5570581-5570582,5570584,5570589-5570591,5570595,5570597-5570600,5570604,5570606-5570608,5570613,5570615,5570619,5570626-5570627,5570629,5570634,5570639,5570644,5570647,5570649,5570653-5570654,5570656,5570663-5570664,5570668,5570670,5570673-5570674,5570676-5570678,5570681,5570684,5570688,5570690-5570692,5570695-5570698,5570701,5570705,5570711,5570719,5570722,5570724-5570725,5570728,5570730-5570733,5570735-5570736,5570739,5570741,5570744,5570751,5570754-5570756,5570758-5570761,5570765-5570767,5570771,5570773,5570775,5570778-5570779,5570782-5570784,5570786,5570789,5570791-5570794,5570796-5570797,5570800-5570804,5570806,5570809,5570812,5570815-5570816,5570818,5570823-5570824,5570826,5570828-5570829,5570831,5570841,5570846-5570848,5570850,5570853-5570854,5570859,5570862-5570863,5570865,5570867,5570869,5570871,5570873,5570877-5570880,5570885,5570888,5570894,5570896,5570898,5570901,5570903,5570905-5570906,5570909,5570911,5570915,5570918,5570920,5570922-5570925,5570932,5570934,5570938-5570939,5570943,5570946,5570951,5570955,5570957,5570962,5570966,5570968-5570969,5570972,5570974,5570976-5570977,5570979,5570981,5570986,5570990,5570993,5570995,5570997,5571001-5571002,5571004,5571007,5571015,5571017,5571019,5571021,5571026,5571030,5571033,5571035-5571036,5571040,5571043,5571048,5571051,5571057,5571062-5571063,5571065,5571068,5571070,5571072,5571075,5571078-5571081,5571085-5571086,5571088,5571091-5571092,5571096,5571099,5571101-5571102,5571104,5571106,5571108-5571109,5571111-5571112,5571114,5571117,5571119,5571121,5571124,5571129,5571131,5571133,5571135,5571137,5571139-5571140,5571142-5571143,5571146-5571147,5571149-5571150,5571152,5571155,5571157,5571160,5571164,5571166,5571168,5571170,5571172,5571175,5571334,5571347-5571349,5571352,5571354-5571355,5571358,5571360,5571364-5571366,5571368,5571371-5571372,5571376,5571378,5571380-5571381,5571383,5571385,5571389,5571391-5571392,5571394,5571396,5571399-5571401,5571403-5571404,5571406,5571408,5571414,5571416,5571418,5571421,5571428-5571429,5571431,5571433,5571435-5571436,5571440,5571442,5571445,5571450-5571451,5571453,5571455,5571457,5571461,5571463,5571465-5571466,5571468,5571474-5571475,5571477,5571480,5571482-5571483,5571485,5571489,5571491,5571494,5571498,5571503,5571505,5571508,5571512,5571515-5571516,5571519,5571522,5571524,5571526,5571528,5571533,5571535-5571536,5571541-5571543,5571547,5571550-5571551,5571555,5571557,5571562,5571566,5571569-5571570,5571572,5571576-5571578,5571584-5571585,5571589,5571591,5571594,5571596-5571599,5571601-5571603,5571606-5571609,5571611,5571619,5571629,5571633-5571634,5571638,5571641,5571643-5571644,5571651,5571653,5571657-5571658,5571663,5571669,5571671-5571672,5571674,5571676,5571682,5571684,5571690,5571699,5571701,5571710,5571714,5571718-5571719,5571724,5571726,5571731,5571735,5571740,5571746,5571750-5571751,5571755-5571756,5571763,5571769-5571770,5571777,5571780-5571781,5571786,5571792,5571795,5571807,5571809-5571810,5571812-5571813,5571815,5571820,5571822,5571826,5571831,5571839,5571843,5571847,5571851,5571858-5571859,5571862,5571867,5571869-5571870,5571876,5571879,5571881,5571883-5571884,5571886,5571890,5571893,5571897,5571905,5571907,5571909,5571911,5571914,5571919,5571921-5571922,5571928,5571931-5571932,5571934,5571938,5571948,5571953,5571955,5571957-5571958,5571961,5571967,5571969,5571974-5571975,5571979,5571988,5571992-5571993,5571995,5572005-5572006,5572010,5572012,5572017,5572023-5572024,5572028,5572033,5572035,5572039,5572043,5572046,5572053-5572054,5572058,5572062,5572065-5572066,5572070-5572075,5572079,5572081,5572083,5572087,5572089-5572093,5572095-5572098,5572100-5572102,5572104-5572105,5572107,5572111-5572112,5572117-5572119,5572121-5572124,5572126-5572127,5572129,5572132-5572134,5572136-5572138,5572140,5572143-5572144,5572146-5572152,5572154,5572156,5572158-5572159,5572161-5572163,5572165,5572168-5572172,5572174,5572176-5572177,5572179-5572180,5572183,5572185,5572187-5572188,5572191-5572193,5572195,5572197,5572199-5572200,5572202-5572203,5572205-5572207,5572211-5572212,5572214-5572215,5572218-5572219,5572747,5572759,5572769,5572775,5572783,5572791,5572796,5572804,5572807-5572808,5572822,5572854,5572861-5572862,5572864,5572869,5572872,5572887-5572888,5572897,5572899,5572907,5572910,5572918,5572946,5572965,5572986,5572993-5572994,5573005,5573012,5573016,5573032,5573043,5573052-5573053,5573055,5573063-5573064,5573085,5573087-5573088,5573101,5573109,5573129,5573138-5573139,5573150,5573179,5573202,5573205,5573209,5573215,5573223,5573227-5573228,5573232,5573236,5573251,5573265,5573275,5573286,5573298,5573312-5573313,5573327,5573340,5573355,5573357,5573360,5573384,5573390,5573394,5573397,5573404,5573414,5573416,5573419,5573429,5573431,5573437,5573439,5573441,5573449-5573450,5573452,5573455,5573470,5573473,5573475,5573481,5573486,5573493-5573495,5573500,5573505,5573547,5573554,5573568,5573574,5573584-5573585,5573594,5573599,5573605,5573612,5573617,5573636-5573637,5573649,5573660,5573672,5573692,5573705,5573707,5573715,5573718,5573721,5573723,5573754,5573761,5573768,5573792,5573822,5573841,5573844,5573862-5573863,5573888,5573893,5573895,5573899,5573913,5573944,5573946,5573981,5573989,5573998,5574003,5574005,5574010,5574012,5574018,5574025-5574026,5574039,5574041,5574044,5574046,5574050,5574057,5574059,5574065,5574067,5574076,5574083-5574085,5574088,5574094,5574099,5574101,5574103,5574107,5574110,5574114,5574117,5574126,5574131,5574136-5574138,5574144,5574148,5574154,5574159,5574161,5574165,5574168,5574174,5574177,5574180-5574181,5574187,5574194-5574196,5574205,5574212,5574218-5574220,5574231,5574234-5574235,5574238-5574239,5574249,5574251,5574257-5574258,5574267,5574270,5574275,5574282,5574290,5574293,5574296,5574300-5574301,5574305,5574309,5574314,5574317,5574326,5574329,5574336,5574363,5574382,5574395,5574403-5574404,5574419,5574436,5574450,5574452,5574474,5574480,5574495-5574496,5574522,5574524,5574526,5574529,5574550-5574551,5574559,5574577,5574604,5574636,5574638,5574640,5574646,5574662,5574665,5574669,5574677,5574679,5574695,5574712,5574728,5574735,5574747,5574765,5574790,5574792,5574796,5574806,5574813,5574842,5576276,5576283,5576296,5576302,5576306,5576314,5576316,5576321,5576325-5576326,5576329,5576331,5576334,5576337,5576343,5576350,5576357,5576361-5576363,5576371,5576379-5576382,5576399,5576404,5576412-5576414,5576417,5576427,5576429-5576430,5576448,5576451,5576460-5576462,5576468,5576474-5576475,5576479,5576482-5576484,5576494,5576498,5576501,5576504-5576516,5576518-5576521,5576523,5576526,5576528,5576531,5576534,5576540-5576542,5576547,5576551,5576556,5576558,5576561,5576563-5576564,5576566,5576569,5576571,5576574-5576575,5576577-5576578,5576585,5576589,5576593-5576596,5576601,5576605-5576606,5576609-5576632,5576634,5576636,5576639,5576641-5576642,5576644,5576647,5576650,5576652,5576655,5576657,5576659-5576660,5576662-5576663,5576666-5576667,5576669,5576673-5576674,5576676,5576678,5576682,5576684,5576692,5576694-5576697,5576699,5576702,5576705,5576707,5576709,5576711,5576714,5576717-5576718,5576722-5576723,5576725-5576726,5576730-5576731,5576734-5576735,5576737-5576738,5576742,5576744,5576746,5576749,5576751,5576754,5576756,5576758,5576760,5576763-5576764,5576766,5576768-5576769,5576771-5576772,5576775,5576778,5576780,5576783,5576785,5576787-5576788,5576790,5576792,5576794,5576796,5576798,5576800,5576802,5576804,5576809-5576810,5576813,5576815-5576817,5576819,5576821,5576823-5576824,5576827,5576830,5576833,5576835,5576837,5576839,5576842,5576844-5576845,5576848-5576849,5576851,5576853,5576857,5576859,5576861,5576863,5576865,5576867,5576869,5576873,5576875,5576877-5576878,5576883,5576885,5576890,5576896-5576897,5576902-5576903,5576907,5576910,5576913,5576917-5576918,5576927,5576929-5576930,5576933-5576934,5576940,5576944,5593229,5593232,5593234,5593240,5593242-5593243,5593246-5593247,5593250,5593254,5593258,5593265-5593268,5593270,5593272-5593273,5593276-5593277,5593280-5593281,5593283-5593285,5593287,5593289-5593290,5593292,5593294-5593296,5593298,5593300-5593301,5593303,5593305-5593308,5593312-5593313,5593315-5593316,5593318-5593319,5593321-5593322,5593324-5593325,5593327-5593328,5593333,5593335-5593337,5593339,5593341-5593343,5593346-5593348,5593350-5593352,5593354,5593357-5593358,5593360,5593362,5593365,5593368,5593370-5593371,5593373-5593374,5593377-5593380,5593382,5593386-5593387,5593390-5593391,5593393-5593395,5593399,5593406-5593408,5593410-5593413,5593416,5593418-5593423,5593425-5593427,5593432,5593443-5593444,5593447,5593449-5593453,5593455-5593456,5593462,5593465-5593467,5593471,5593474-5593475,5593477-5593480,5593484,5593486-5593487,5593489,5593493,5593495-5593496,5593500-5593501,5593504-5593505,5593507-5593508,5593510,5593513-5593515,5593517-5593518,5593520-5593522,5593525,5593527-5593531,5593533-5593535,5593538-5593539,5593542,5593546-5593548,5593551-5593552,5593554,5593560,5593563,5593565-5593567,5593569-5593570,5593574,5593577-5593578,5593581-5593583,5593585,5593588,5593592,5593594-5593596,5593600,5593602,5593605,5593609,5593613,5593615-5593617,5593619,5593629,5593638,5593640-5593641,5593644-5593646,5593649,5593654,5593661,5593666,5593671,5593674,5593678-5593680,5593682-5593687,5593691,5593694,5593696,5593702-5593703,5593705,5593709,5593713,5593715,5593717,5593719-5593721,5593725,5593727-5593728,5593730-5593733,5593736,5593742-5593744,5593748,5593751,5593754-5593756,5593758,5593760,5593765,5593767,5593771,5593773-5593774,5593777,5593781,5593790-5593791,5593793-5593794,5593796-5593797,5593801-5593802,5593804,5593809,5593811,5593813-5593814,5593817-5593818,5593824,5593827-5593828,5593830,5593841,5593845-5593846,5593848,5593857-5593858,5593863-5593864,5593868-5593869,5593873-5593876,5593884-5593886,5593892-5593893,5593897,5593902-5593903,5593911,5593916,5593919,5593924,5593928,5593930-5593931,5593934,5593938-5593939,5593941,5593948-5593949,5593959-5593960,5593962,5593964,5593966,5593970-5593971,5593974,5593978,5593982,5593988,5593996,5593999,5594003-5594005,5594007,5594009,5594013,5594017,5594025,5594028-5594029,5594033,5594039,5594043,5594052-5594053,5594056,5594058,5594066,5594070,5594074-5594075,5594078,5594088,5594092,5594095,5594105,5594109-5594110,5594113,5594115-5594116,5594122-5594123,5594125-5594126,5594128,5594132-5594133,5594136,5594148,5594155,5594164-5594168,5594173-5594174,5594182,5594186,5594192,5594200,5594207,5594209,5594218-5594219,5594221,5594232,5594234,5594236,5594241,5594249-5594250,5594257-5594258,5594260-5594261,5594263,5594266,5594273,5594283,5594286-5594287,5594291,5594301,5594304-5594305,5594311,5594313,5594319,5594322,5594324,5594327,5594331,5594341,5594343,5594349,5594351,5594356-5594357,5594359-5594360,5594369-5594370,5594373-5594375,5594378,5594382,5594386-5594387,5594392,5594395,5594399,5594401,5594404,5594406-5594409,5594415-5594416,5594421,5594428,5594433-5594434,5594439,5594444,5594452,5594461,5594465-5594466,5594468,5594475,5594484-5594485,5594487,5594490,5594492,5594494-5594495,5594501,5594503,5594514,5594520,5594535-5594537,5594540,5594544,5594546,5594556,5594558,5594561,5594563,5594574-5594575,5594588,5594596,5594599,5594603-5594605,5594607-5594609,5594613,5594617,5594624-5594625,5594631,5594633,5594635,5594642,5594645,5594652,5594655,5594658,5594660,5594669,5594677,5594681,5594684,5594687-5594688,5594692,5594695,5594697-5594698,5594701,5594708,5594711,5594715,5594719,5594722,5594725-5594726,5594731,5594736-5594738,5594744-5594746,5594749,5594758,5594771,5594775,5594778,5594792,5594795,5594799-5594800,5594805-5594806,5594808-5594809,5594811,5594820-5594821,5594823,5594829,5594837,5594841,5594846,5594850,5594858-5594859,5594863,5594871,5594875,5594879,5594890,5594897,5594905,5594908,5594910,5594914,5594918-5594919,5594923-5594924,5594927,5594931-5594933,5594938,5594944,5594952,5594955-5594959,5594970,5594972,5594976,5594981-5594983,5594990-5594991,5594993,5594997,5594999,5595006-5595007,5595009,5595011,5595016,5595018,5595026,5595033,5595040,5595042,5595046-5595049,5595051-5595052,5595055,5595059,5595063-5595064,5595066,5595068-5595069,5595074,5595079,5595083,5595090-5595091,5595093,5595097-5595099,5595102,5595105-5595106,5595108,5595110,5595116,5595118,5595125,5595132,5595134,5595142,5595146,5595149,5595151,5595153,5595157,5595160,5595169-5595170,5595176,5595182-5595183,5595185-5595186,5595191,5595197,5595207-5595208,5595223,5595226,5595233,5595241,5595244,5595246,5595257,5595260-5595262,5595273-5595274,5595277-5595278,5595282,5595285,5595289,5595299,5595301,5595303,5595310,5595312-5595313,5595317,5595320-5595321,5595327,5595330,5595344-5595345,5595350,5595352-5595353,5595357-5595358,5595360,5595363,5595369-5595370,5595372,5595378,5595390-5595391,5595393,5595396-5595397,5595405,5595411,5595415,5595424-5595426,5595429,5595431,5595448,5595452,5595457,5595463,5595468-5595469,5595480,5595484,5595488-5595490,5595494,5595497,5595508,5595523-5595524,5595529-5595531,5595541,5595544,5595552,5595557-5595558,5595564,5595583,5595585,5595587,5595591,5595593,5595596,5595599,5595605,5595608,5595610,5595613,5595621,5595626,5595629,5595637,5595640-5595641,5595646,5595651-5595652,5595661,5595665-5595666,5595671,5595687,5595689,5595701,5595710,5595712,5595716,5595724-5595725,5595735,5595740,5595742,5595746,5595756,5595763,5595765-5595766,5595768,5595772,5595788,5595790-5595791,5595803,5595806,5595808,5595817,5595825,5595840-5595841,5595851,5595853,5595861,5595868,5595879,5595888,5595890,5595892,5595894,5595896,5595909,5595911,5595913,5595915,5595922,5595924,5595928,5595955,5595959-5595960,5595965,5595971,5595975-5595978,5595980,5595983,5595988,5595992,5595996,5595998-5595999,5596002,5596014,5596017,5596026-5596027,5596034,5596036,5596040,5596042,5596048,5596056,5596060-5596061,5596063-5596064,5596070,5596075,5596079,5596082-5596083,5596093,5596095,5596103,5596108,5596111,5596113,5596118-5596119,5596130-5596131,5596135,5596137,5596139-5596141,5596143,5596149,5596157,5596167,5596171,5596174,5596177-5596179,5596183,5596186,5596189-5596190,5596194,5596197-5596198,5596209,5596215,5596217,5596222-5596223,5596232,5596234,5596236-5596238,5596240,5596246,5596253,5596260,5596262,5596266,5596270-5596271,5596275,5596282-5596283,5596285,5596288,5596290-5596291,5596293-5596294,5596298-5596300,5596310,5596313,5596316,5596318,5596321-5596323,5596326,5596330-5596331,5596336,5596339,5596345,5596348,5596350,5596354,5596356-5596357,5596370,5596373,5596376,5596385,5596395,5596398,5596400,5596403,5596415,5596417,5596419,5596423,5596429-5596430,5596440-5596441,5596444-5596445,5596450,5596454,5596460,5596464,5596469,5596476,5596479,5596488,5596491,5596494-5596496,5596501,5596504-5596505,5596511,5596516,5596518,5596520-5596521,5596527,5596530-5596531,5596533,5596535,5596537,5596545-5596546,5596555,5596561,5596566,5596568-5596569,5596575-5596576,5596581,5596584,5596586,5596589-5596590,5596593,5596599,5596604-5596606,5596609,5596611,5596613,5596617-5596618,5596620,5596624,5596626-5596627,5596632-5596633,5596643,5596649,5596651,5596654-5596655,5596658-5596661,5596668,5596671-5596672,5596674,5596676-5596678,5596680,5596691-5596693,5596701,5596703,5596713,5596715,5596717-5596719,5596727,5596733,5596737-5596738,5596740,5596742,5596744,5596746,5596749,5596754,5596760,5596763,5596771-5596772,5596775-5596776,5596782,5596787,5596791,5596803-5596805,5596808,5596810,5596814,5596820,5596823,5596826,5596828-5596830,5596840,5596846,5596850-5596851,5596855,5596860,5596863,5596872,5596874,5596877,5596881,5596887,5596895,5596900,5596903-5596904,5596917,5596919-5596920,5596928-5596929,5596934,5596936-5596938,5596941,5596949,5596953,5596956,5596958,5596964,5596970,5596972,5596978,5596980,5596982,5596987,5596991-5596995,5597000,5597005,5597007-5597008,5597016,5597022-5597025,5597031-5597032,5597037,5597043,5597045,5597049-5597050,5597056,5597059-5597060,5597062,5597064,5597066,5597068,5597088,5597093-5597094,5597097,5597099,5597106,5597117,5597121,5597127,5597134-5597136,5597138,5597147-5597149,5597152,5597156,5597158,5597161,5597163-5597164,5597171,5597174,5597177,5597184,5597190-5597192,5597194-5597196,5597201-5597203,5597208,5597212,5597217,5597223-5597224,5597226,5597231,5597233,5597237,5597253,5597257,5597262,5597265,5597294,5597297-5597298,5597306,5597313-5597314,5601835-5601836,5601847-5601848,5601852-5601854,5601860,5601862,5601867-5601869,5601876,5601878,5601884-5601886,5601894-5601895,5601901-5601903,5601909-5601910,5601919-5601921,5601929-5601930,5601936-5601938,5601946-5601947,5601950,5601952-5601953,5601957-5601958,5601964-5601966,5601973-5601974,5601980-5601982,5601989-5601990,5602001-5602002,5602012-5602014,5602021-5602022,5602027-5602029,5602040-5602041,5602047-5602049,5602055-5602056,5602064-5602066,5602074-5602075,5602081-5602083,5602092,5602094,5602101-5602103,5602107-5602108,5602115-5602117,5602128-5602129,5602141-5602142,5602151-5602153,5602161,5603749,5603761,5603763,5603776,5603786,5603797,5603805,5603807,5603811,5603817,5603837,5603848-5603849,5603851,5603870,5603901,5603905,5603913,5603916,5603918,5603924,5603931,5603933,5603938,5603952,5603957,5603960,5603962,5603996,5604005,5604027,5604029,5604032,5604034,5604049,5604057-5604058,5604064,5604085,5604093,5604096-5604097,5604125,5604133,5604139,5604148,5604162,5604169,5604183,5604187,5604189,5604197,5604210,5604221,5604225,5604231,5604242,5604250,5604256,5604259,5604262,5604277,5604279,5604295,5604303,5604315,5604324,5604334,5604336,5604345,5604360,5604362,5604367,5604372,5604374,5604380,5604382,5604387,5604389,5604397,5604417,5604422,5604431,5604433,5604437-5604438,5604456,5604463,5604469,5604590,5605244,5605253,5605261,5605265,5605274,5605289,5605294,5605306,5605309,5605316,5605327,5605334,5605344,5605373,5605380,5605384,5605392,5605404,5605417,5605422,5605427,5605440,5605457-5605458,5605463,5605488-5605489,5605510,5605512,5605517,5605528,5605551,5605554,5605571,5605582,5605586,5605595,5605612,5605624,5605644,5605653,5605661-5605662,5605664,5605673,5605681-5605682,5605716,5605731,5605751-5605752,5605758,5605767,5605793-5605794,5605803,5605825,5605829,5605837,5605848,5605850,5605877-5605878,5605881,5605887,5605898,5605911,5605927-5605928,5605940,5605947,5605968,5605970,5605998,5606009,5606025,5606033,5606040,5606052,5606054,5606077,5606081,5606083,5606112,5606118,5606122,5606128,5606136,5606140,5606156,5606172,5606174,5606192,5606202,5606215,5606224,5606238,5606247,5606257,5606264,5606275,5606287,5606302,5606306,5606323,5606339,5606341,5606354,5606358,5606370,5606379,5606390,5606398,5606405,5606423,5606432,5606443,5606461,5606472,5606477,5606484,5606493-5606494,5606521,5606551,5606562,5607528-5607530,5607544-5607546,5607558-5607559,5607565-5607567,5607577-5607578,5607590-5607592,5607600-5607601,5607610-5607612,5607616-5607617,5607622-5607624,5607631-5607632,5607637,5607639-5607640,5607648-5607649,5607657-5607659,5607665-5607667,5607673-5607674,5607680-5607682,5607690-5607691,5607701-5607703,5607713-5607714,5607720-5607722,5607733-5607734,5607738-5607740,5607747-5607748,5607755-5607757,5607762-5607763,5607768-5607770,5607777-5607778,5607782-5607784,5607786-5607787,5607792-5607794,5607800-5607801,5607804-5607806,5607810-5607811,5607817-5607819,5607826-5607827,5607836-5607838,5607843-5607844,5607855-5607857,5607861-5607862,5607872-5607873,5607875,5607880-5607881,5607887-5607889,5607895-5607897,5607906-5607908,5607913-5607914,5607920-5607922,5607929-5607930,5607939-5607941,5607946-5607947,5607953-5607955,5607961-5607962,5607968-5607970,5607981-5607982,5607987-5607989,5607993-5607994,5608000-5608002,5608011-5608012,5608020-5608021,5608023,5608029-5608030,5608035-5608037,5608042-5608043,5608051-5608053,5608059-5608060,5608066-5608067,5608069,5608077-5608078,5608086-5608088,5608092-5608093,5608100-5608102,5608107-5608108,5608118-5608120,5608124-5608126,5608135-5608136,5608143-5608145,5608155,5608157,5608163,5608165-5608166,5608176-5608177,5608190-5608192,5608204-5608205,5608216-5608218,5608226-5608227,5608233-5608235,5608243,5608245,5608255-5608257,5608268-5608270,5608278-5608279,5608288-5608289,5608291,5608297-5608298,5608312-5608313,5608324-5608326,5608335-5608337,5608350-5608351,5608362-5608364,5608377-5608378,5608387-5608389,5608401,5608403,5608414-5608416,5608425-5608426,5608433-5608435,5608442-5608443,5608454-5608456,5608468-5608469,5608471,5608483-5608484,5608491-5608492,5608494,5608507-5608508,5608518,5608520-5608521,5608528-5608529,5608543-5608545,5608550-5608551,5608560-5608562,5608568-5608569,5608577-5608579,5608586-5608587,5608595,5608597-5608598,5608604-5608605,5608613-5608615,5608621-5608622,5608631-5608632,5608634,5608641-5608642,5608647-5608649,5608660-5608661,5608665-5608667,5608678-5608679,5608687-5608689,5608697-5608698,5608710-5608712,5608721,5608723,5608730-5608732,5608738-5608740,5608749-5608751,5608760-5608761,5608768,5608770-5608771,5608774-5608775,5608781-5608783,5608789-5608790,5608796-5608798,5608801-5608802,5608811-5608813,5608818-5608819,5608824-5608826,5608833-5608834,5608838-5608840,5608846-5608847,5608853-5608855,5608858-5608859,5608862-5608864,5608871-5608872,5608874-5608876,5608881,5608883,5608889-5608891,5608894,5608896,5608899-5608901,5608906-5608907,5608910-5608912,5608916-5608917,5608921-5608923,5608927-5608928,5608934-5608936,5608940-5608942,5608944-5608945,5608950-5608952,5608955-5608956,5608958-5608960,5608964-5608965,5608969-5608971,5608978-5608979,5608983-5608985,5608990-5608991,5608996-5608998,5609003-5609004,5609012-5609014,5609018-5609019,5609023-5609025,5609030-5609031,5609034-5609036,5609047-5609048,5609053-5609055,5609060-5609064,5609067-5609068,5609072-5609074,5609076-5609077,5609079-5609083,5609087-5609089,5609096-5609098,5609101-5609102,5609110-5609112,5609115-5609117,5609119-5609120,5609125-5609127,5609130-5609131,5609134-5609136,5609140-5609141,5609145-5609147,5609153-5609154,5609157-5609159,5609161-5609162,5609167-5609169,5609174-5609175,5609178-5609180,5609184-5609188,5609193-5609194,5609201-5609203,5609206-5609207,5609212-5609214,5609219-5609220,5609225-5609227,5609229-5609230,5609233-5609235,5609237-5609238,5609242-5609244,5609253-5609254,5609257-5609259,5609266-5609268,5609270-5609274,5609279-5609280,5609283-5609285,5609288-5609289,5609294-5609296,5609298-5609299,5609303-5609305,5609311-5609312,5609315-5609317,5609320-5609321,5609323-5609330,5609333-5609337,5609340-5609387,5609389-5609433,5609435-5609457,5609459-5609473,5609475-5609477,5609479-5609483,5609485-5609491,5609493-5609586,5609591-5609598,5609601-5609602,5609609-5609611,5609613-5609614,5609621-5609623,5609628-5609629,5609634-5609636,5609640-5609641,5609644-5609646,5609651-5609652,5609657-5609659,5609664-5609665,5609670-5609672,5609676-5609677,5609681-5609683,5609688-5609689,5609693-5609695,5609701-5609702,5609706-5609708,5609712-5609713,5609718-5609720,5609727-5609728,5609731-5609733,5609737-5609738,5609745-5609747,5609753-5609755,5609758-5609759,5609763-5609765,5609768-5609770,5609776-5609777,5609781-5609783,5609786-5609787,5609792-5609794,5609798-5609799,5609807-5609809,5609812-5609813,5609819-5609821,5609824-5609825,5609829-5609831,5609837-5609838,5609843-5609845,5609848-5609849,5609858-5609860,5609865-5609866,5609869-5609871,5609878-5609879,5609883-5609885,5609888-5609889,5609894-5609896,5609898-5609899,5609903-5609905,5609910-5609911,5609916-5609918,5609921-5609922,5609926-5609928,5609932-5609933,5609938-5609941,5609947-5609948,5609955,5609957-5609958,5609965-5609966,5609971-5609973,5609977-5609978,5609986-5609988,5609993-5609994,5610001-5610003,5610010-5610011,5610020-5610022,5610029-5610030,5610034-5610036,5610048,5610050,5610055-5610057,5610063-5610064,5610070-5610072,5610079,5610081,5610085-5610087,5610091,5610093-5610094,5610100-5610104,5610108,5610112,5610114-5610115,5610119,5610121-5610123,5610126,5610129-5610131,5610139-5610142,5610144-5610145,5610150-5610152,5610155-5610158,5610161,5610165-5610167,5610169,5610174,5610177-5610179,5610183,5610186-5610187,5610191,5610194,5610196-5610197,5610199-5610200,5610203-5610204,5610209-5610211,5610214,5610219-5610223,5610226,5610230-5610232,5610239,5610241-5610242,5610248,5610252,5610254-5610256,5610258,5610261-5610262,5610264,5610267,5610269-5610271,5610274,5610276-5610278,5610284-5610285,5610289-5610290,5610296-5610298,5610301,5610304-5610306,5610308,5610311-5610312,5610314,5610322-5610325,5610328,5610331-5610332,5610335,5610337-5610339,5610342,5610346,5610351-5610354,5610358-5610360,5610365-5610368,5610373,5610378,5610380-5610381,5610385-5610388,5610390,5610394-5610396,5610398,5610402-5610404,5610408,5610412-5610413,5610416,5610420-5610422,5610430-5610434,5610437-5610438,5610442-5610443,5610446,5610451,5610453-5610455,5610457,5610460-5610461,5610466,5610468-5610470,5610475-5610477,5610483-5610486,5610491,5610495-5610496,5610499,5610504-5610506,5610508,5610511,5610513,5610517-5610518,5610524-5610526,5610528,5610530-5610531,5610534,5610539-5610541,5610543,5610546-5610549,5610555-5610557,5610565-5610568,5610573,5610577,5610579-5610580,5610585,5610588,5610590,5610592,5610595,5610597-5610598,5610600-5610602,5610607,5610609-5610610,5610616-5610619,5610622-5610624,5610626,5610628-5610630,5610632,5610635-5610637,5610641-5610643,5610645-5610649,5610651,5610653-5610656,5610659-5610660,5610663,5610667-5610676,5610682-5610685,5610687,5610690-5610691,5610696-5610699,5610701,5610703,5610705-5610706,5610709-5610715,5610718,5610720,5610723-5610725,5610727-5610730,5610734-5610737,5610739,5610741-5610742,5610745-5610746,5610748-5610751,5610754-5610755,5610757-5610759,5610761-5610763,5610767-5610768,5610770,5610773-5610776,5610780-5610781,5610784-5610785,5610787-5610790,5610792-5610794,5610796,5610799-5610802,5610807-5610809,5610811-5610814,5610817-5610819,5610824,5610826-5610828,5610830-5610833,5610840-5610842,5610845-5610846,5610852-5610854,5610858-5610859,5611646,5611652,5611656,5611660,5611665,5611671,5611676,5611680-5611682,5611695-5611697,5611699,5611703-5611705,5611710-5611713,5611715-5611717,5611719,5611721-5611723,5611725,5611728-5611729,5611732,5611734-5611735,5611737,5611740-5611742,5611744-5611745,5611747,5611751-5611753,5611756-5611757,5611759-5611761,5611763,5611766-5611768,5611770-5611773,5611776-5611780,5611782,5611784,5611786,5611792-5611797,5611801-5611803,5611805,5611807-5611808,5611810,5611813-5611815,5611817,5611820-5611823,5611825-5612032,5612034-5612067,5612069-5612090,5612092-5612106,5612108-5612146,5612150-5612151,5612153,5612157-5612158,5612164-5612165,5612170-5612171,5612175-5612176,5612182-5612184,5612189-5612190,5612197-5612198,5612203-5612204,5612210-5612211,5612217,5612219,5612224-5612225,5612230-5612231,5612237-5612239,5612244-5612245,5612251-5612252,5612257-5612258,5612264-5612265,5612270-5612271,5612276-5612278,5612283-5612284,5612289-5612290,5612295-5612296,5612302-5612303,5612308-5612309,5612316-5612318,5612323-5612324,5612329,5612331,5612336-5612337,5612344-5612345,5612350-5612351,5612356-5612357,5612364-5612366,5612371,5612373,5612376,5612378,5612383-5612384,5612389-5612390,5612395-5612397,5612402,5612404,5612409-5612410,5612415-5612416,5612423-5612424,5612429-5612430,5612435-5612437,5612443-5612444,5612448,5612450,5612456-5612457,5612461-5612462,5612468-5612469,5612475-5612476,5612482-5612484,5612489-5612490,5612495-5612496,5612501-5612502,5612508-5612509,5612514-5612515,5612520-5612522,5612527-5612528,5612533-5612534,5612541-5612542,5612548-5612549,5612553-5612554,5612556,5612561-5612562,5612568-5612569,5612574-5612575,5612579-5612580,5612586-5612587,5612591-5612592,5612594,5612600-5612601,5612606-5612607,5612612-5612613,5612618-5612620,5612628-5612629,5612633-5612645,5612647-5612687,5612689-5612694,5612698-5612743,5612745-5612750,5612754,5612757-5612758,5612763,5612765,5612767-5612768,5612773-5612774,5612778,5612784,5612786,5612790,5612792,5612796-5612797,5612801-5612802,5612804,5612807,5612810,5612814-5612815,5612821-5612822,5612825-5612826,5612830-5612831,5612833,5612837-5612838,5612843-5612845,5612849-5612857,5612859-5612860,5612863,5612868-5612870,5612873-5612874,5612877-5612878,5612880,5612882-5612885,5612887,5612889,5612891,5612894,5612896,5612899-5612901,5612907,5612909,5612912-5612913,5612916,5612920-5612922,5612925-5612926,5612930,5612932-5612933,5612935-5612939,5612941-5612958,5612963,5612965,5612967-5612970,5612972-5612974,5612976-5612977,5612979-5612980,5612983,5612988,5612990,5612994,5612997,5613001,5613005,5613007,5613011,5613016,5613020,5613023,5613026-5613027,5613030-5613031,5613033-5613034,5613038-5613039,5613053,5613057-5613058,5613061,5613068-5613069,5613075-5613076,5613078,5613080,5613082,5613086-5613087,5613090,5613092-5613094,5613099,5613101,5613104,5613106,5613111,5613114,5613117,5613120-5613121,5613123,5613125,5613129-5613131,5613135-5613137,5613142-5613144,5613147,5613151,5613153-5613154,5613157,5613159,5613164-5613167,5613169,5613171,5613174,5613176-5613177,5613179,5613182,5613185,5613187-5613188,5613190,5613193,5613196,5613198,5613200-5613201,5613205,5613207-5613208,5613211-5613214,5613216-5613219,5613221-5613222,5613224,5613226,5613228,5613232-5613233,5613235-5613236,5613238,5613240-5613242,5613245-5613246,5613249-5613251,5613253-5613255,5613258,5613261,5613263,5613267-5613268,5613270-5613271,5613276-5613277,5613279,5613281-5613286,5613288,5613291-5613292,5613295,5613297,5613301,5613303,5613305-5613306,5613312-5613314,5613316,5613319-5613324,5613327,5613333-5613334,5613337,5613340,5613345-5613346,5613350,5613352,5613354,5613357-5613358,5613362-5613368,5613372,5613374-5613376,5613379-5613383,5613385-5613386,5613388-5613479,5613481-5613660,5613662,5613664-5613667,5613669-5613670,5613673-5613675,5613677-5613682,5613684-5613687,5613689,5613692,5613695-5613696,5613698-5613702,5613704-5613707,5613709,5613712,5613714-5613717,5613719-5613720,5613722-5613726,5613728,5613730-5613731,5613733,5613735,5613739,5613741-5613743,5613745-5613748,5613750-5613757,5613761-5613762,5613766-5613767,5613769-5613771,5613774-5613781,5613784-5613787,5613789,5613791-5613794,5613796-5613799,5613801,5613803,5613805,5613807-5613808,5613813-5613815,5613817,5613820-5613821,5613824,5613826-5613830,5613833-5613840,5613843,5613848-5613856,5613859-5613860,5613863,5613866,5613869-5613872,5613874-5613875,5613877-5613880,5613883-5613886,5613890-5613892,5613896,5613900-5613904,5613906-5613915,5613918,5613921,5613923-5613924,5613927-5613928,5613930,5613933-5613934,5613936-5613937,5613940-5613944,5613947,5613949,5613951,5613953-5613954,5613956-5613957,5613959-5613963,5613965,5613967-5613968,5613970-5613971,5613973,5613975-5613976,5613978,5613980-5613982,5613984-5613985,5613989-5613990,5613992-5613997,5613999,5614002-5614003,5614005-5614007,5614009-5614010,5614012-5614013,5614015,5614018,5614020-5614021,5614023-5614025,5614027,5614029,5614033-5614035,5614037-5614040,5614042,5614045-5614047,5614049-5614050,5614052-5614053,5614055,5614057-5614058,5614060-5614062,5614064-5614066,5614068,5614070-5614071,5614074,5614076,5614078,5614080-5614083,5614086-5614087,5614089-5614090,5614092-5614093,5614095-5614096,5614099,5614101,5614104-5614105,5614107-5614111,5614114,5614117-5614120,5614122,5614124,5614126-5614127,5614130-5614131,5614133,5614135-5614136,5614139-5614141,5614143-5614144,5614146-5614149,5614151-5614153,5614157-5614159,5614162,5614164,5614166,5614168-5614169,5614171-5614172,5614175,5614177-5614180,5614182,5614184,5614188,5614190,5614192,5614194,5614196,5614199-5614201,5614205-5614206,5614209,5614213,5614217,5614219,5614225,5614227-5614228,5614230,5614232,5614235,5614237,5614240,5614243,5614245-5614246,5614249,5614253,5614260-5614261,5614264,5614267,5614270,5614272,5614274,5614277,5614281,5614284,5614287-5614288,5614293-5614294,5614296,5614299-5614301,5614304,5614306,5614309-5614310,5614317,5614319,5614321,5614323,5614328,5614331,5614333,5614338-5614340,5614343-5614344,5614348,5614352-5614353,5614358,5614361,5614363,5614366,5614368,5614371-5614372,5614374,5614378,5614382,5614384,5614390,5614392,5614396,5614398,5614402,5614404,5614407,5614409,5614412,5614414,5614420-5614421,5614423,5614427,5614432-5614433,5614435,5614438-5614439,5614442,5614444,5614448,5614454,5614457,5614459,5614461,5614463-5614464,5614468,5614471-5614472,5614483,5614487-5614488,5614491,5614497,5614510,5614512,5614517,5614527,5614531-5614532,5614545-5614546,5614549,5614552,5614556,5614561-5614562,5614574,5614577,5614585,5614591-5614592,5614596,5614600,5614608,5614616,5614622,5614629,5614635,5614637,5614646-5614647,5614650,5614659,5614670,5614673,5614676-5614677,5614689,5614694,5614698,5614709,5614718,5614721,5614726,5614730,5614740,5614746,5614751,5614754,5614761,5614767,5614769-5614771,5614780,5614783,5614789,5614794-5614795,5614799-5614800,5614803,5614805,5614807-5614808,5614812,5614817,5614823,5614827-5614828,5614831-5614832,5614835,5614839,5614841,5614845-5614847,5614849-5614850,5614853,5614855,5614858,5614860,5614864-5614865,5614867,5614869,5614875,5614877-5614878,5614880,5614882-5614883,5614887-5614888,5614892,5614899-5614900,5614902,5614904,5614906,5614914,5614917-5614919,5614921,5614924,5614930,5614932,5614934-5614936,5614940,5614946,5614949-5614950,5614954-5614955,5614960,5614964-5614965,5614973,5614975,5614979,5614989,5614993,5614998,5615002,5615007,5615011,5615015,5615018,5615021,5615029,5615035,5615039,5615041,5615045,5615049-5615051,5615063,5615068,5615073-5615074,5615077-5615078,5615092-5615093,5615101,5615107,5615110,5615112,5615118,5615123,5615125,5615128-5615129,5615136,5615140,5615143,5615146,5615149,5615156-5615157,5615159-5615161,5615174-5615175,5615183,5615189,5615196-5615197,5615203,5615205,5615207,5615213,5615215-5615217,5615219,5615228,5615235,5615237,5615241,5615245,5615250-5615251,5615256,5615262-5615263,5615270,5615273,5615279,5615284,5615288-5615289,5615301,5615304,5615307,5615313,5615315,5615318,5615328,5615332,5615337,5615341,5615348-5615349,5615353,5615356-5615357,5615361,5615366,5615380,5615384,5615394,5615398,5615409,5615411,5615420,5615428,5615436,5615439,5615441,5615445,5615449,5615458,5615465,5615476,5615478,5615497,5615501-5615502,5615514-5615515,5615518,5615522,5615532,5615534,5615541,5615546,5615562,5615567,5615569,5615584,5615595,5615608,5615611,5615614,5615616,5615622,5615629,5615641-5615642,5615648,5615653,5615663,5615666,5615672,5615681,5615687,5615690,5615693,5615700,5615705,5615718,5615721,5615732,5615734,5615742-5615743,5615758,5615764,5615767,5615769,5615773,5615778,5615782,5615790,5615794,5615798,5615803,5615819,5615824,5615831,5615846,5615851-5615852,5615860,5615864,5615867,5615869,5615878,5615881,5615883,5615885,5615899,5615907,5615913,5615921,5615930,5615935,5615944,5615946,5615951,5615953,5615958,5615972,5615992-5615993,5616000-5616001,5616005,5616007,5616009,5616015,5616019,5616026-5616027,5616034,5616036,5616042,5616055,5616067,5616079,5616082,5616088-5616089,5616092,5616094,5616100,5616105,5616113,5616116,5616119,5616121,5616138-5616139,5616144,5616155,5616163,5616167,5616171,5616177,5616186,5616188,5616194,5616197-5616198,5616207,5616211,5616217,5616222,5616225,5616234,5616240,5616244,5616255,5616259,5616262-5616264,5616275,5616278,5616281,5616285-5616287,5616297,5616316,5616318,5616328-5616329,5616332,5616338,5616341,5616347,5616349,5616367,5616369-5616370,5616374,5616380,5616388,5616393,5616397,5616402,5616408,5616412,5616415,5616419,5616434,5616440-5616441,5616443-5616444,5616450-5616451,5616464,5616468,5616476-5616477,5616480,5616487,5616497-5616499,5616502,5616504-5616505,5616508-5616509,5616514-5616515,5616520,5616522,5616534-5616536,5616544-5616546,5616557,5616559,5616561,5616567,5616575-5616576,5616585-5616587,5616589,5616592,5616597-5616599,5616604,5616606-5616607,5616615,5616623-5616624,5616633,5616636,5616638-5616639,5616641,5616643,5616649,5616655,5616659-5616661,5616664,5616671,5616673-5616675,5616682,5616686,5616692,5616696,5616701,5616711,5616717-5616719,5616723,5616739,5616884,5616888-5616889,5616891-5616892,5616896-5616898,5616903-5616904,5616907,5616909,5616911,5616917-5616918,5616920,5616924,5616930-5616931,5616937,5616941-5616942,5616946,5616950,5616953,5616956,5616963-5616964,5616966,5616971,5616978,5616982,5616987,5616990,5616993,5616995-5616996,5616998,5617005,5617008,5617015,5617017,5617022,5617024,5617029,5617032,5617034,5617041,5617045-5617046,5617049,5617053,5617059-5617060,5617062-5617063,5617066,5617070,5617072,5617076-5617077,5617081,5617090-5617091,5617097-5617099,5617104,5617106,5617108,5617110,5617113-5617114,5617118-5617119,5617125-5617127,5617129,5617133,5617139,5617142,5617144,5617147,5617150,5617154,5617156,5617158,5617160,5617164,5617171,5617176,5617178-5617179,5617183,5617186,5617190,5617192,5617195,5617201-5617203,5617211,5617213,5617219,5617222,5617225-5617226,5617232,5617234,5617241-5617242,5617247,5617250,5617253,5617256,5617263,5617265,5617270-5617272,5617275,5617290-5617291,5617293,5617295,5617300,5617304,5617311,5617315-5617316,5617322,5617324,5617326,5617333,5617336-5617337,5617350-5617351,5617354,5617360-5617361,5617365,5617372,5617374,5617377,5617381-5617382,5617384,5617391,5617395,5617402,5617409-5617410,5617413,5617417,5617420,5617425,5617428,5617431,5617437-5617438,5617442,5617445,5617449,5617453,5617461,5617463,5617468,5617470,5617475,5617477,5617482,5617488,5617495,5617501,5617507,5617511,5617516,5617520,5617522,5617526,5617531,5617534,5617544,5617548,5617553,5617561,5617564,5617570,5617573,5617577,5617582,5617586,5617588,5617593,5617595,5617600,5617607,5617616-5617617,5617619,5617623,5617632,5617637,5617642,5617646,5617650,5617652,5617657,5617662,5617667,5617672,5617677,5617680,5617682-5617711,5617713-5617784,5617788-5617841,5617843,5617845,5617849,5617853,5617855,5617857,5617863,5617865,5617868,5617873,5617876,5617879-5617880,5617883,5617889,5617891,5617895,5617898,5617901-5617902,5617906,5617909,5617912,5617916,5617920-5617921,5617923,5617929,5617931,5617935,5617939,5617945,5617947,5617951,5617955,5617958,5617964,5617970,5617973,5617980,5617985,5617990,5617994,5618000,5618007,5618014,5618016,5618021,5618024,5618031,5618034,5618039,5618046,5618049,5618053,5618058,5618064,5618069,5618074,5618080,5618084,5618089,5618096,5618099,5618101,5618111,5618115,5618123-5618124,5618131,5618136,5618141,5618143,5618151,5618154,5618157,5618161,5618167,5618172,5618176,5618181,5618186,5618190,5618193,5618201,5618210,5618214,5618218,5618224,5618230,5618236,5618239,5618245,5618250,5618254,5618259,5618264,5618268,5618278,5618281,5618288,5618292,5618296,5618299,5618307,5618312,5618317,5618319,5618326,5618331,5618334,5618338,5618348,5618355,5618359,5618361,5618369,5618375,5618379,5618383,5618386,5618391,5618395,5618399,5618405,5618409,5618412,5618419,5618428,5618431,5618436,5618442,5618448,5618452,5618459,5618463,5618468,5618470,5618478,5618483,5618489,5618494,5618501-5618502,5618510,5618520,5618529,5618533,5618541-5618542,5618549,5618554,5618556,5618558,5618561,5618572,5618581,5618587,5618595,5618597,5618601,5618609,5618618,5618623,5618629,5618634,5618640,5618646,5618656,5618669,5618675,5618678,5618686,5618691,5618696,5618700,5618704,5618707,5618714,5618717,5618721,5618725,5618727,5618731,5618734,5618738,5618745,5618748,5618753,5618757,5618761-5618762,5618765,5618767,5618771,5618774,5618776,5618780,5618784,5618788,5618793,5618796,5618799,5618802,5618805,5618807,5618810,5618812-5618813,5618816,5618823,5618828,5618831,5618833,5618836,5618843,5618845,5618849,5618853,5618855,5618857-5618858,5618861-5618862,5618865,5618871,5618874-5618875,5618880,5618885,5618888,5618891,5618895-5618896,5618898-5618900,5618903-5618906,5618909-5618925,5618927-5618999,5619001-5619038,5619040-5619044,5619046,5619048,5619050,5619053,5619057-5619058,5619062,5619065-5619066,5619068,5619070,5619073,5619078,5619081-5619082,5619086,5619097,5619100-5619101,5619104-5619105,5619107-5619108,5619112,5619114,5619121-5619123,5619128,5619132,5619137,5619142,5619155,5619157,5619159-5619161,5619164,5619166-5619167,5619174,5619176,5619181,5619185,5619189,5619193-5619194,5619198,5619203,5619208,5619213,5619216-5619217,5619222,5619224,5619230,5619234,5619238-5619239,5619245,5619248-5619251,5619259,5619262,5619265,5619273-5619274,5619278-5619280,5619282-5619283,5619285-5619287,5619290,5619296,5619298,5619300-5619302,5619307,5619309,5619313,5619317-5619318,5619327,5619331,5619338-5619340,5619346,5619352,5619358,5619361,5619366,5619368,5619373,5619375,5619378,5619383,5619388-5619392,5619395,5619399-5619400,5619407-5619409,5619414,5619417,5619420,5619423-5619425,5619427,5619429,5619434,5619437,5619440,5619445,5619447,5619449,5619451,5619454-5619455,5619458,5619464,5619467-5619468,5619473-5619474,5619478-5619479,5619481,5619484-5619486,5619490-5619491,5619494-5619495,5619499,5619501,5619503,5619506,5619514,5619518,5619525-5619526,5619529-5619530,5619533-5619535,5619537-5619538,5619546,5619548-5619549,5619553-5619555,5619557,5619559,5619563,5619565,5619567,5619569-5619570,5619572-5619573,5619578-5619579,5619581,5619584-5619587,5619593-5619594,5619597,5619600-5619601,5619604-5619606,5619608,5619610-5619613,5619620-5619622,5619624,5619627,5619629,5619631,5619635,5619639,5619641-5619643,5619645,5619650,5619654-5619655,5619660-5619665,5619668,5619670,5619674-5619675,5619677-5619679,5619683,5619685-5619686,5619688,5619691,5619697-5619699,5619703,5619706,5619710-5619711,5619713,5619718-5619719,5619724,5619726-5619730,5619732-5619735,5619738-5619739,5619746,5619748,5619750,5619752-5619754,5619756,5619760,5619762-5619764,5619767,5619770-5619771,5619778,5619780,5619785-5619786,5619789,5619792,5619794,5619800-5619802,5619804,5619806,5619809,5619812,5619814-5619815,5619817-5619818,5619822,5619824-5619825,5619827-5619829,5619831,5619833-5619834,5619843,5619845,5619847-5619848,5619850,5619854-5619855,5619859-5619861,5619863,5619867,5619870,5619873,5619878-5619879,5619882-5619884,5619887,5619889-5619890,5619897-5619900,5619902,5619906-5619907,5619913,5619915-5619918,5619922,5619925,5619927-5619928,5619930,5619934-5619936,5619938,5619940,5619943,5619946-5619947,5619949,5619953-5619954,5619956,5619960,5619963,5619965,5619968,5619974,5619980-5619981,5619988,5619991,5619993-5619994,5619997-5619998,5620001-5620002,5620005,5620010,5620013,5620015,5620019,5620022-5620023,5620026-5620028,5620031,5620034,5620038-5620039,5620042,5620047,5620052-5620053,5620055-5620056,5620060,5620063-5620065,5620067,5620076,5620079,5620081,5620083,5620091,5620097,5620102,5620106,5620111,5620115,5620119-5620120,5620122-5620123,5620126,5620130,5620137-5620138,5620140,5620142,5620147,5620153-5620154,5620161-5620162,5620166-5620167,5620174,5620181,5620183,5620190,5620192,5620194-5620195,5620197,5620203,5620205,5620208,5620213,5620218,5620221-5620224,5620227,5620229,5620231,5620233-5620234,5620237-5620241,5620243-5620244,5620246-5620247,5620249,5620251-5620252,5620255,5620257,5620259-5620260,5620262-5620264,5620266-5620267,5620269,5620272-5620273,5620276-5620282,5620285,5620287,5620290,5620294,5620358,5620360,5620363-5620364,5620366,5620368,5620370-5620371,5620373-5620374,5620376,5620383,5620390,5620395,5620398,5620404,5620413,5620423-5620424,5620431,5620434-5620436,5620439,5620441-5620442,5620444-5620446,5620449,5620451,5620453-5620454,5620456,5620458-5620461,5620464-5620467,5620471-5620472,5620474,5620477,5620481,5620490,5620494,5620510,5620533,5620540,5620551,5620558,5620570,5620584,5620587,5620604,5620607,5620622-5620623,5620648,5620654,5620658,5620666,5620693,5620697,5620705,5620725,5620739-5620740,5620760,5620767,5620769,5620779,5620805,5620814,5620817,5620825,5620832,5620838,5620847,5620870,5620879,5620906,5620933,5620945,5620955,5620971,5620975,5620987,5620995-5620996,5621001,5621015,5621044,5621051,5621054,5621071,5621082,5621092,5621110,5621114,5621119,5621151,5621169,5621177,5621189,5621195,5621206,5621220,5621229,5621234,5621261,5621266,5621268-5621269,5621276,5621280,5621333,5621339,5621350,5621373,5621382,5621392,5621400-5621401,5621416,5621426,5621436,5621452,5621459,5621469,5621477,5621483,5621488,5621501,5621523,5621535,5621543,5621546-5621547,5621555,5621569,5621575,5621583,5621585-5621586,5621607,5621640,5621650,5621666,5621673,5621699,5621742,5621751,5621753-5621754,5621770,5621786,5621802-5621803,5621810,5621813,5621822,5621824,5621856,5621866,5621871,5621891,5621904,5621910,5621915,5621922,5621930,5621935,5621949,5621956,5621978,5621986,5621993,5621999,5622012,5622017,5622020,5622029,5622057,5622062,5622070,5622100,5622108,5622115-5622116,5622133,5622135-5622136,5622153,5622155,5622160,5622163,5622165,5622180-5622184,5622188,5622198,5622212,5622230,5622232,5622239,5622245,5622261-5622262,5622269,5622275,5622279,5622286,5622289,5622293,5622295,5622316,5622331-5622332,5622337,5622351-5622353,5622360,5622365,5622367,5622371,5622380,5622394,5622398,5622400,5622404,5622411-5622412,5622423,5622427,5622431,5622436,5622446,5622454,5622470,5622481-5622482,5622500,5622512,5622516,5622526,5622530-5622532,5622539,5622541,5622549-5622550,5622556,5622566,5622570,5622576,5622582,5622590,5622592,5622596,5622608,5622619,5622621,5622629,5622634,5622639-5622640,5622644,5622653-5622654,5622656,5622659,5622673,5622676,5622678,5622680,5622684,5622689,5622691,5622695,5622700,5622708,5622712-5622713,5622717,5622721,5622726,5622734,5622740-5622742,5622748-5622749,5622752,5622755-5622757,5622763,5622774,5622777,5622787,5622789-5622790,5622795,5622802,5622806,5622810-5622811,5622813,5622815,5622820-5622821,5622824-5622825,5622827,5622829,5622833-5622834,5622843-5622844,5622847,5622849,5622851,5622854,5622859,5622865-5622866,5622868,5622873,5622875,5622879,5622881,5622883-5622885,5622888-5622890,5622892-5622893,5622899-5622901,5622904-5622905,5622907-5622909,5622911,5622913,5622916,5622918-5622920,5622925,5622929,5622932,5622937-5622939,5622941,5622945-5622946,5622948,5622950-5622951,5622957,5622963,5622965-5622968,5622973-5622974,5622976,5622980-5622981,5622983,5622986,5622989-5622991,5622993-5622994,5622996,5622999,5623003,5623009,5623012,5623014,5623016-5623017,5623025,5623028,5623038,5623040,5623048-5623049,5623061,5623063,5623065-5623066,5623072,5623074,5623078,5623082,5623088,5623095,5623097,5623099,5623106,5623109,5623117,5623124-5623125,5623129-5623176,5623178-5623214,5623216-5623224,5623226-5623228,5623230-5623255,5623257-5623263,5623265-5623336,5623338-5623408,5623410-5623412,5623414-5623416,5623420-5623421,5623423,5623426,5623429-5623430,5623436,5623440,5623443,5623449,5623453,5623463,5623466,5623468,5623470,5623472-5623473,5623476,5623481-5623482,5623484,5623486,5623492,5623496,5623503,5623508,5623510,5623514,5623523,5623525,5623533,5623537-5623538,5623542,5623546,5623549,5623551,5623556,5623559,5623565-5623566,5623574,5623576-5623577,5623583-5623587,5623589,5623604-5623605,5623607-5623608,5623610,5623617,5623623,5623628,5623636,5623639-5623640,5623645,5623652-5623653,5623656,5623661,5623667,5623669-5623670,5623673-5623674,5623676,5623682-5623683,5623688,5623694,5623699-5623700,5623703,5623707,5623712,5623716-5623717,5623731-5623732,5623735,5623741,5623748,5623754,5623756,5623762-5623763,5623770,5623779,5623784,5623795-5623796,5623808,5623814,5623820-5623821,5623829,5623833,5623835,5623841-5623842,5623853,5623861,5623885,5623887-5623889,5623895,5623909,5623918,5623934,5623937,5623942-5623943,5623945,5623948,5623959,5623963,5623968-5623969,5623975,5623983,5623989,5623995-5623996,5624011,5624020,5624023,5624029,5624032,5624052,5624056,5624060,5624066,5624070,5624076,5624082,5624087,5624100,5624107,5624116,5624119,5624121,5624125,5624140,5624143,5624145,5624161,5624166,5624182,5624187,5624201,5624224,5624240,5624253,5624256,5624262,5624265,5624270,5624280,5624282,5624303,5624314,5624322,5624324,5624349,5624356,5624368,5624377,5624380,5624396,5624398,5624409,5624417,5624431,5624448,5624468,5624486,5624500,5624510,5624512,5624521-5624522,5624549,5624551,5624553,5624576,5624584,5624599-5624600,5624609,5624622,5624630,5624638,5624648,5624657,5624680,5624703,5624717,5624728,5624740,5625710,5625720,5625738,5625766,5625800,5625843,5625856,5625907,5625973,5625986,5625990,5626002,5626008,5626019,5626034,5626041,5626051,5626058-5626059,5626070,5626102,5626109,5626111,5626123,5626151,5626170,5626204,5626211,5626235,5626241,5626244,5626247,5626249,5626261-5626262,5626278,5626291,5626301,5626330,5626344,5626353,5626364,5626385,5626392,5626411,5626421,5626426,5626430,5626437,5626463,5626473,5626477,5626492,5626498,5626504,5626510,5626523,5626526,5626530,5626536,5626556,5626559,5626561,5626566,5626578,5626595,5626598,5626600,5626632,5626639,5626654-5626655,5626662,5626672,5626682,5626685,5626691,5626701,5626708,5626717,5626742,5626755,5626766,5626773,5626775,5626779,5626786-5626787,5626796-5626798,5626829,5626836,5626841,5626855,5626866-5626867,5626872,5626877,5626910,5626918,5626922,5626940-5626942,5626959,5626970,5626972,5626975,5626994,5627001,5627005,5627017,5627023,5627033,5627048,5627054,5627057,5627063,5627091,5627099,5627105,5627110,5627112,5627121,5627144,5627156,5627161,5627170,5627175,5627178,5627181,5627193,5627201,5627216,5627221,5627254,5627261,5627282-5627283,5627305,5627313,5627322,5627359,5627363,5627365,5627375,5627377,5627392,5627410,5627418,5627420,5627437,5627439,5627449,5627457,5627501-5627502,5627506-5627507,5627510,5627512,5627527,5627534,5627555,5627563,5627574-5627575,5627579,5627583,5627622,5627645,5627651,5627657,5627663,5627665,5627679,5627681,5627687,5627704,5627711,5627713,5627732,5627755-5627756,5627777,5627785,5627788,5627794,5627799,5627801,5627818,5627821,5627824,5627862-5627863,5627890,5627892,5627899,5627917,5627919,5627923,5627929,5627946,5627958,5627961,5627975,5627979,5627993,5627995,5627997,5628004,5628016-5628017,5628023,5628025,5628045-5628046,5628055-5628056,5628063,5628066,5628069,5628071,5628078,5628110,5628117,5628119,5628136-5628137,5628140-5628141,5628145,5628151,5628153,5628160,5628168,5628177,5628182,5628193,5628209,5628217-5628219,5628229,5628239,5628244,5628248,5628252,5628254-5628255,5628281,5628295-5628296,5628298,5628320,5628322-5628323,5628332,5628334,5628353-5628354,5628361,5628369,5628374,5628381,5628393,5628403,5628406,5628410,5628431,5628434,5628453,5628455,5628466-5628467,5628476,5628487,5628495,5628504,5628507,5628509,5628511,5628523,5628530,5628535,5628539,5628551,5628554,5628560,5628563,5628572-5628573,5628578,5628599,5628608,5628614,5628616,5628630,5628633,5628635,5628642,5628645,5628648,5628650,5628661,5628680-5628681,5628683,5628693,5628710,5628721,5628723,5628726,5628728,5628739,5628752,5628762,5628767,5628770,5628773,5628783-5628784,5628786,5628797,5628801,5628813,5628816,5628821,5628832-5628834,5628837,5628840,5628854,5628859,5628866,5628870,5628872,5628883,5628896,5628903,5628919,5628921-5628923,5628951,5628956,5628963,5628969,5630801,5630804,5630806,5630815,5630817,5630822,5630824-5630828,5630832-5630833,5630837,5630839-5630840,5631050,5631053,5631066,5631071,5631074,5631081,5631083,5631086,5631091,5631094-5631095,5631102,5631106-5631108,5631114,5631120,5631122,5631132,5631144,5631147,5632346,5632350,5632362,5632365-5632366,5632368,5632374,5632385,5632389,5632396,5632401,5632411,5632416,5632422,5632427-5632428,5632432,5632435,5632438,5632450,5632455,5632458,5632463,5632469,5632474,5632483,5632488,5632493,5632501,5632506,5632510,5632512,5632519,5632524,5632528,5632531,5632534,5632543,5632548,5632565,5632577,5632581,5632585,5632588,5632591,5633977-5633978,5633982-5633983,5634009-5634010,5634012-5634014,5634018,5634026,5641806-5641807,5641810-5641811,5641813,5641815,5641818-5641820,5641823-5641824,5641827,5641829-5641830,5641832,5641835,5641837,5641848,5641850,5641852-5641853,5641855-5641857,5641862,5641864,5641866-5641868,5641871-5641872,5641874,5641876-5641879,5641883,5641885,5649234-5649235,5649275-5649276,5649283,5649296,5649303,5649310,5649318,5649321,5649347,5649351,5649354,5649360,5649366,5649401,5649413-5649414,5649416,5649434,5649440,5649446,5649449,5649453,5649478,5649482,5649493,5649500,5649505,5649509,5649513,5649516-5649518,5649525,5649537,5649545,5649572,5649587,5649600-5649601,5649611,5649614,5649634-5649635,5649638,5649642,5649670,5649679,5649682-5649683,5649686,5649697-5649698,5649700-5649701,5649705,5649722-5649723,5649727,5649739,5649749,5649753-5649754,5649765,5649777,5649779,5649791,5649800,5649802,5649807,5649811,5649824,5649826,5649830,5649846,5649855,5649857,5649861,5649865,5649868,5649871,5649874-5649875,5649883-5649884,5649887,5649891,5649894,5649898,5649900,5649904,5649912-5649913,5649916-5649917,5649926,5649932,5649934,5649936,5649939-5649949,5649951-5649977,5649980-5649981,5649983,5649986,5649989-5649990,5649995,5649997-5649998,5650000,5650004-5650005,5650009,5650011,5650013-5650016,5650018-5650019,5650024,5650026,5650028,5650031,5650033-5650034,5650036,5650039,5650046-5650047,5650051,5650053-5650055,5650057,5650059,5650062,5650064-5650065,5650067,5650069-5650070,5650074-5650075,5650079,5650081,5650085,5650087,5650089-5650092,5650097-5650099,5650103,5650106-5650107,5650109-5650110,5650115,5650117-5650118,5650123,5650125-5650126,5650129,5650132-5650134,5650136,5650139,5650141,5650143,5650147,5650149-5650150,5650155-5650157,5650163,5650172,5650181,5650191-5650193,5650198,5650203,5650212,5650214,5650217-5650218,5650220,5650233,5650235,5650240,5650251,5650268,5650275-5650276,5650279,5650285,5650287,5650289,5650292,5650301,5650313-5650314,5650336,5650344,5650348,5650350-5650351,5650357,5650359-5650360,5650370,5650377,5650380,5650383,5650404-5650405,5650412,5650416,5650430,5650434,5650436,5650445,5650451,5650461,5650465-5650467,5650472,5650480,5650505,5650509,5650514,5650531,5650539,5650546,5650554,5650566,5650569-5650570,5650572,5650580,5650594-5650595,5650614,5650641,5650643,5650650,5650655,5650660,5650662,5650669,5650674,5650687,5650708,5650710,5650727,5650739,5650742-5650743,5650747,5650753,5650755-5650756,5650762,5650796,5650800,5650824,5650828,5650837,5650848-5650849,5650872-5650873,5650882,5650890,5650893,5650901,5650920,5650939-5650940,5650949,5650952,5650971,5650981-5650982,5650991,5650993-5650994,5650998,5651003,5651010,5651035,5651041,5651045,5651082,5651086,5651089,5651107,5651115,5651137,5651140,5651151-5651152,5651157,5651159,5651187,5651195,5651219,5651222,5651226,5651244-5651245,5651253-5651254,5651269,5651283,5651293,5651295,5651327,5651330,5651333,5651368,5651371,5651373,5651381,5651384,5651401,5651411,5651424,5651431,5651438,5651448,5651457,5651472,5651481,5651484,5651496,5651502,5651504,5651516,5651518,5651540,5651542,5651554,5651566,5651568,5651586,5651588,5651598,5651600,5651608,5651615,5651644,5651649,5651658,5651679,5651682,5651692,5651695,5651697,5651713,5651715,5651720,5651727,5651734,5651740,5651759,5651787,5651805-5651806,5651819,5651831,5651835,5651837,5651841,5651860,5651864,5651874-5651875,5651878,5651895,5651915,5651929,5651931,5651946,5651958,5651964,5651972,5651984,5652005,5652011,5652024,5652035,5652038,5652046,5652053,5652055-5652056,5652059,5652067,5652074,5652096,5652105,5652119,5652143,5652145,5652149,5652159,5652166,5652171,5652187,5652195,5652198,5652214-5652217,5652229,5652236,5652240,5652245,5652257,5652264,5652280,5652319-5652320,5652330,5652332,5652335,5652344,5652350,5652357,5652362,5652381,5652393,5652399-5652400,5652407,5652413,5652416,5652418-5652419,5652429,5652436,5652446,5652456,5652486,5652500,5652506,5652515,5652520,5652534,5652536-5652537,5652543-5652544,5652551,5652555,5652570,5652583,5663311,5663321,5663323,5663330,5663339,5663343,5663347,5663350,5663353,5663359,5663362-5663363,5663366-5663367,5663369,5663373-5663374,5663383,5663387,5663389,5663392,5663395,5663399,5663404,5663408,5663414,5663418,5663423,5663428,5663431,5663435,5663438-5663439,5663441,5663445-5663446,5663449,5663456,5663463,5663467,5663471,5663473,5663477,5663482,5663485,5663488,5663491,5663495,5663501,5663503,5663510-5663511,5663520,5663524,5663528,5663533,5663540,5663546,5663548,5663550,5663556,5663563,5663567,5663573,5663579,5663583,5663588,5663592,5663596,5663604,5663608,5663613,5663616,5663623,5663625,5663632,5663638,5663646,5663656,5663658,5663665,5663667,5663678,5663682,5663688,5663691,5663694,5663701,5663703,5663707,5663709,5663712,5663715,5663717,5663725-5663726,5663731,5663736-5663737,5663741,5663751,5663755-5663756,5663758,5663761,5663763,5663770,5663773,5663776,5663778,5663781,5663785,5663788,5663792,5663797,5663801,5663807,5663811,5663814,5663817,5663821,5663823,5663827-5663828,5663834,5663837,5663839,5663842,5663845,5663849,5663858,5663866,5663869,5663871,5663874,5663877,5663881-5663882,5663884,5663887-5663888,5663893,5663902,5663904,5663910,5663913,5663919,5663922,5663929,5663935,5663943,5663950,5663954-5663955,5663963,5663965,5663968,5663971,5663974,5663976,5663978,5663982,5663987,5663991,5663994,5663996-5663997,5664003,5664010,5664012,5664018,5664021,5664024,5664032,5664036,5664042,5664049,5664052,5664056,5664060,5664064,5664071,5664079,5664087-5664088,5664093,5664099,5664108,5664116,5664124,5664130,5664136,5664144,5664149,5664151-5664152,5664158,5664161-5664162,5664164,5664167-5664168,5664171-5664172,5664175,5664465-5664491,5664493-5664494,5664496,5664498-5664499,5664503,5664509,5664513,5664516,5664521,5664523,5664525,5664527,5664529,5664534,5664537,5664541,5664546,5664549,5664554,5664558,5664561,5664564,5664567,5671292,5671295,5671297-5671298,5671305,5671308,5671310-5671312,5671314-5671317,5671319,5671323-5671324,5671329,5671336-5671337,5671339-5671341,5671344-5671347,5671349,5671352,5671355,5671665,5671677-5671678,5671682,5671684-5671685,5671687-5671690,5671692,5671695-5671697,5671699-5671701,5671703,5671705-5671707,5671709-5671711,5671713-5671715,5671717,5671719-5671721,5671723,5671725-5671728,5671730-5671733,5671735-5671736,5671738-5671742,5671744,5671746-5671748,5671750-5671753,5671755-5671757,5671759-5671762,5671764-5671767,5671769-5671770,5671772-5671778,5671780-5671782,5671784-5671786,5671788,5671790-5671795,5671798,5671800-5671803,5671805,5671807-5671809,5671811-5671812,5671814-5671815,5671817-5671819,5671821-5671823,5671825-5671827,5671829-5671832,5671834-5671836,5671839-5671841,5671843-5671844,5671846,5671848-5671854,5671856-5671858,5671860-5671869,5671872-5671879,5671881,5671883-5671886,5671888-5671890,5671895-5671898,5671900-5671902,5671904-5671907,5671909-5671911,5671914-5671915,5671919-5671920,5671924-5671928,5671932-5671936,5671941-5671943,5671947,5671949-5671952,5671954,5671956,5671958-5671961,5671963-5671965,5671967-5671971,5671976,5671980-5671986,5671989-5671991,5671993,5671995-5671996,5671999-5672000,5672002-5672004,5672007,5672010,5672012-5672013,5672016,5672018,5672022,5672024-5672029,5672034,5672037-5672038,5672040-5672041,5672045-5672046,5672048,5672050-5672053,5672056,5672058-5672060,5672062-5672065,5672067,5672069-5672071,5672073-5672074,5672076-5672078,5672081-5672082,5672086-5672088,5672090,5672096,5672101-5672103,5672107,5672110-5672114,5672117,5672119,5672121-5672123,5672126,5672128,5672131,5672133-5672134,5672136-5672137,5672139,5672141-5672145,5672148-5672149,5672151,5672153,5672160,5672162,5672164-5672165,5672167-5672168,5672171-5672172,5672174,5672176-5672180,5672182,5672184-5672185,5672189-5672192,5672194-5672195,5672200,5672204-5672205,5672208-5672211,5672215,5672217-5672223,5672225,5672228-5672232,5672234-5672236,5672239-5672243,5672248-5672250,5672255,5672257-5672258,5672260-5672263,5672267-5672270,5672272,5672274,5672277-5672278,5672280-5672281,5672283-5672284,5672287-5672289,5672291-5672292,5672295-5672299,5672301-5672302,5672305-5672307,5672310-5672312,5672314-5672317,5672319,5672321-5672322,5672324,5672327,5672331-5672333,5672338-5672340,5672342-5672343,5672345-5672346,5672348,5672352,5672354-5672358,5672360-5672362,5672364-5672365,5672367-5672370,5672375,5672377-5672382,5672384-5672389,5672392-5672394,5672397,5672401-5672402,5672404,5672406-5672407,5672409,5672411-5672416,5672419-5672423,5672425,5672427-5672428,5672430-5672437,5672440-5672441,5672444,5672447-5672451,5672454-5672457,5672459-5672460,5672462,5672465,5672467,5672470,5672472,5672475-5672479,5672482-5672484,5672487-5672489,5672492,5672494-5672496,5672498-5672499,5672501,5672503,5672506,5672510-5672512,5672514-5672515,5672517-5672520,5672525-5672531,5672533,5672535,5672539-5672542,5672545-5672546,5672552-5672553,5672555-5672556,5672558-5672559,5672561-5672562,5672564-5672565,5672567-5672572,5672574,5672576,5672580-5672582,5672586-5672590,5672592,5672594-5672597,5672600-5672602,5672604-5672607,5672613-5672617,5672619-5672626,5672632,5672634-5672638,5672640-5672641,5672643-5672646,5672648-5672650,5672652,5672655-5672656,5672659,5672661,5672667-5672670,5672672-5672673,5672675-5672676,5672680-5672681,5672683,5672685-5672688,5672691-5672692,5672696-5672699,5672702,5672704-5672705,5672707-5672708,5672710-5672713,5672715,5672718-5672722,5672724-5672727,5672729-5672731,5672733-5672735,5672737,5672739-5672742,5672748-5672751,5672753,5672756-5672757,5672759-5672761,5672763,5672766-5672768,5672770,5672773-5672774,5672777-5672779,5672781-5672783,5672786,5672788,5672790-5672791,5672796-5672800,5672803,5672805-5672810,5672812,5672814-5672818,5672823,5672827-5672828,5672831-5672832,5672836-5672840,5672843-5672848,5672850-5672851,5672854-5672855,5672857-5672858,5672861-5672862,5672866-5672867,5672869-5672874,5672876-5672878,5672880,5672885,5672888-5672890,5672893,5672897,5672899,5672904,5672907-5672910,5672912,5672914-5672916,5672919,5672921-5672923,5672927-5672929,5672932-5672934,5672937,5672939-5672940,5672943,5672945-5672946,5672949-5672950,5672954-5672955,5672957,5672960,5672962-5672963,5672966,5672969-5672970,5672973,5672976,5672979,5672983,5672985,5672990,5672992-5672993,5672995,5672997-5672998,5673000,5673003-5673004,5673006,5673008-5673011,5673014-5673016,5673018-5673019,5673026,5673028-5673032,5673035,5673037,5673040-5673043,5673046,5673050-5673051,5673055-5673060,5673062,5673064-5673066,5673068,5673071-5673074,5673076,5673078,5673082-5673085,5673089-5673090,5673092-5673093,5673095,5673097,5673101-5673105,5673107,5673111-5673112,5673114-5673115,5673117-5673119,5673122-5673125,5673127-5673129,5673131,5673133,5673138-5673139,5673141-5673146,5673148,5673152-5673153,5673156-5673161,5673163,5673168,5673170,5673173-5673175,5673177-5673179,5673183-5673185,5673188,5673191-5673194,5673196-5673197,5673204-5673205,5673207-5673208,5673211-5673216,5673220-5673221,5673224,5673226,5673228-5673231,5673233-5673237,5673239,5673241,5673243-5673245,5673248,5673252,5673254,5673256-5673259,5673262-5673265,5673270-5673272,5673274-5673276,5673278,5673280-5673282,5673284-5673285,5673287,5673289-5673292,5673294,5673297-5673306,5673308-5673309,5673311,5673313-5673314,5673316,5673318-5673320,5673322-5673324,5673326,5673328,5673331-5673332,5673335-5673336,5673338-5673339,5673341-5673344,5673346-5673347,5673349-5673351,5673353-5673357,5673359,5673361,5673363,5673365-5673368,5673376,5673378-5673379,5673382-5673384,5673388,5673390-5673393,5673395,5673399,5673401-5673402,5673404,5673406,5673408,5673410,5673412-5673413,5673416,5673418,5673421,5673423-5673426,5673428-5673430,5673435-5673438,5673440-5673444,5673446-5673448,5673450,5673452-5673457,5673460-5673461,5673463,5673465-5673467,5673469-5673472,5673474-5673479,5673481-5673483,5673485-5673489,5673491-5673492,5673494-5673496,5673498-5673502,5673505-5673796,5673798-5673803,5673805-5673883,5673885-5673891,5673893-5673898,5673900,5673902-5673904,5673906-5673910,5673912,5673914-5673915,5673917,5673919-5673921,5673924-5673926,5673928-5673931,5673936-5673937,5673941,5673947-5673948,5673950,5673954,5680992-5681025,5685294-5685483,5685485-5685557,5685560-5685561,5685565,5685569,5685573,5685576-5685577,5685579,5685581-5685582,5685584,5685588-5685589,5685592,5685594,5685596-5685597,5685599,5685602-5685603,5685605,5685609,5685611,5685615,5685617-5685618,5685620-5685622,5685627-5685628,5685631,5685635-5685639,5685646-5685647,5685649,5685652-5685654,5685659,5685662-5685663,5685665-5685666,5685668-5685669,5685671-5685672,5685678,5685683,5685686,5685689-5685690,5685692-5685695,5685697-5685698,5685700,5685704,5685712-5685713,5685718,5685725-5685726,5686042,5686044,5686046,5686051-5686053,5686057,5686061-5686063,5686066,5686069-5686070,5686073-5686075,5686080,5696859,5696875,5696877,5696879-5696880,5696890-5696891,5696897,5696903,5696909,5696911,5696915-5696916,5696918,5696925,5696929,5696933,5696936,5696939,5696942,5696946,5696951,5696953-5696954,5696965,5696968,5696971,5696973-5696974,5696978,5696983-5696984,5696986,5696994-5696995,5697003,5697006-5697010,5697012,5697018,5697024,5697041,5697043-5697044,5697053-5697054,5697059,5697061-5697062,5697065,5697070,5697076,5697081-5697082,5697088,5697090,5697093,5697096,5697098,5697101,5697107,5697118,5697120,5697122-5697123,5697127,5697132,5697134-5697137,5697141,5697144,5697149-5697150,5697152,5697158,5697161,5697177,5697180,5697183-5697184,5697193,5697199-5697201,5697207,5697210,5697213,5697219,5697224-5697225,5697230,5697234,5697242,5697249,5697254,5697256,5697260,5697265,5697268-5697269,5697271-5697274,5697283,5697287,5697289-5697290,5697292,5697300-5697301,5697306,5697309-5697310,5697318,5697323,5697327,5697339,5697347,5697349-5697350,5697352,5697359,5697364,5697370,5697374,5697378,5697380-5697383,5697387,5697390,5697393,5697396,5697409,5697412,5697415,5697420-5697421,5697426,5697432-5697433,5697435,5697437,5697446,5697449,5697451,5697454,5697461,5697468,5697471,5697474-5697475,5697486-5697487,5697492,5697494,5697500,5697502,5697511-5697512,5697514,5697516,5697523,5697526,5697532,5697535,5697539,5697544,5697547,5697551,5697553,5697565,5697571,5697576,5697589,5697615,5700122,5700127-5700128,5700180,5700209,5700212,5700215,5700218,5700229,5700232,5700236-5700237,5700241,5700244,5700248,5700254,5700260-5700262,5700268,5700272,5700275-5700276,5700295,5700304,5700309,5700318,5700337,5700351,5700353,5700356,5700363,5700366,5700372,5700374,5700377-5700378,5700383,5700387,5700392,5700399,5700404,5700412,5700415,5700419,5700428,5700431,5700433,5700435,5700437,5700445-5700446,5700448,5700451,5700453,5700456-5700457,5700459,5700468,5700472,5700476-5700477,5700479,5700495,5700501-5700502,5700506,5700515,5700520,5700523,5700530,5700532,5700534,5700536,5700539-5700540,5700547,5700552,5700556,5700565,5700570,5700577-5700578,5700585,5700591-5700593,5700597-5700598,5700602-5700604,5700608,5700612,5700617,5700623,5700633,5700636,5700645,5700651,5700653,5700658,5700661,5700664,5700669,5700673,5700676,5700679,5700685-5700686,5700689,5700691,5700693,5700700,5700709,5700716-5700717,5700722-5700723,5700726,5700732,5700737,5700744-5700745,5700751-5700752,5700757,5700766-5700767,5700773,5700778,5700780,5700782,5700784,5700788,5700792,5700797,5700799,5700802,5700807,5700810,5700814,5700818,5700826,5700833,5700839,5700842-5700844,5700849,5700857,5700867,5700869,5700881-5700882,5700889,5700895,5700900,5700905,5700908-5700909,5700915,5700918,5700920,5700926,5700933,5700938,5700944,5700949,5700951-5700952,5700961,5700963,5700965,5700972,5700993,5701005,5701009,5701012,5701027-5701029,5701033,5701037,5701040,5701046,5701048,5701056,5701062,5701068,5701078,5701084,5701091,5701110-5701111,5701120,5701125,5701134,5701142,5701145,5701162,5701164,5701169,5701171-5701172,5701188-5701189,5701197,5701213,5701221,5701224,5701231,5701238,5701243,5701253-5701254,5701264,5701270-5701271,5701277,5701285-5701287,5701292,5701299,5701303,5701317,5701328,5701332,5701346,5701353,5701357,5701362,5701375,5701380,5701395,5701401,5701414,5701416,5701433,5701441-5701442,5701449,5701452,5701454,5701457,5701467,5701477,5701485,5701499,5701510,5701513,5701517,5701527,5701535,5701545,5701557,5701559,5701564,5701579,5701584,5701594,5701596,5701607-5701608,5701621,5701623,5701633,5701637,5701640,5701653-5701654,5701656,5701660,5701667,5701681-5701683,5701702,5701709,5701726-5701728,5701731,5701733,5701735,5701739,5701755,5701759,5701774,5701781,5701794,5701800,5701804,5701808,5701816-5701817,5701826,5701834,5701837,5701841,5701847,5701853,5701863,5701870,5701877,5701885,5701897,5701905-5701906,5701916,5701921,5701925,5701928,5701935,5701947,5701953,5701955-5701956,5701960,5701966,5701972,5701976,5701985,5701987,5701991,5702010,5702015-5702016,5702027,5702042,5702046,5702055,5702060,5702063,5702067,5702071,5702076,5702079,5702093,5702096,5702105,5702123,5702141,5702152,5702156,5702161,5702169,5702176,5702189,5702199,5702201,5702203,5702206,5702218,5702227,5702243,5705357,5705376,5705379,5705386,5705393-5705394,5705400,5705403,5705408,5705418,5705422,5705427,5705430,5705439,5705444,5705450-5705452,5705454,5705456,5705465-5705466,5705473-5705474,5705484,5705488,5705490,5705500,5705504,5705507,5705510,5705512,5705516,5705520,5705522,5705539,5705543,5705547,5705553,5705555-5705556,5705563,5705579-5705580,5705584,5705588-5705589,5705598,5705622,5705629,5705640,5705645-5705646,5705648,5705659,5705664,5705666,5705678,5705683,5705693,5705701,5705705,5705717,5705734-5705735,5705748,5705752,5705762,5705765,5705774,5705786,5705791,5705798,5705800,5705803,5705820,5705827,5705831,5705836,5705845,5705851,5705864,5705879,5705892,5705895,5705900,5705907,5705914,5705923,5705943,5705947,5705959,5705964,5705966,5705974,5705996-5705997,5706006,5706008,5706018,5706028,5706035,5706042,5706052-5706053,5706064,5706066,5706078,5706082,5706089,5706108,5706110,5706127,5706142-5706143,5706166,5706168,5706172,5706175,5706189,5706195,5706199,5706204,5706228,5706236,5706239,5706267,5706278-5706279,5706301,5706314,5706324,5706336,5706358,5706368,5706372,5706379-5706382,5706388,5706399,5706408,5706429,5706436,5706443,5706451,5706479,5706497,5706522,5706531-5706532,5706535,5706546,5706559-5706560,5706566,5706572,5706588,5706609-5706610,5706616,5706623,5706631,5706638,5706652-5706653,5706658,5706664,5706669,5706674,5706696,5706699,5706703,5706720,5706724,5706730,5706732,5706739,5706742,5706745,5706764,5706767,5706780,5706784,5706796,5706800,5706817-5706818,5706821,5706826,5706832,5706834-5706835,5706843,5706845,5706847,5706851,5706860,5706867,5706876,5706886,5706895,5706900,5706906-5706907,5706915,5706917,5706925,5706933,5706942,5706949,5706956,5706962-5706963,5706969,5706974,5706985,5706995,5707001,5707016,5707023-5707024,5707031,5707038,5707043,5707045,5707048,5707060,5707063,5707096,5707099,5707104-5707105,5707113,5707119,5707124,5707137,5707148,5707150-5707151,5707155,5707160,5707164,5707167,5707172,5707179,5707182,5707199-5707200,5707215-5707216,5707223,5707225,5707233,5707239,5707253,5707257-5707259,5707261,5707267,5707274,5707280,5707282,5707284,5707289-5707290,5707295,5707301-5707302,5707306-5707307,5707311,5707313,5707317,5707320-5707321,5707324-5707325,5707327,5707329,5707332,5707335-5707336,5707338-5707342,5707345,5707348-5707349,5707351,5707354,5707356-5707357,5707359,5707365,5707372,5707374-5707376,5707381-5707383,5707385,5707393,5707396-5707397,5707400-5707401,5707408-5707410,5707420,5707425,5707428-5707429,5707432,5709791,5709810,5709813,5709816,5709819-5709820,5709822-5709825,5709827-5709831,5709833,5709835-5709836,5709839-5709840,5709842-5709846,5709848-5709851,5709853-5709856,5709861-5709866,5709868-5709872,5709874-5709876,5709878,5709880-5709881,5710393-5710438,5710440-5710468,5710470-5710481,5710483-5710550,5710552-5710558,5710560-5710639,5710641-5710697,5711203,5711206,5711227,5711234,5711250,5711254,5711258,5711271,5711276,5711288,5711291-5711292,5711295,5711297-5711299,5711301,5711303,5711310,5711312,5711316,5711318,5711321-5711322,5711324,5711326,5711328-5711329,5711335,5711337-5711339,5711352,5711355,5711358,5711361,5711363,5711365-5711366,5711368,5711370,5711376-5711377,5711380,5711382,5711385,5711392-5711393,5711401,5711404-5711405,5711417-5711418,5711422,5711425-5711426,5711429,5711431,5711436,5711442-5711443,5711450,5711458,5711463-5711464,5711469-5711471,5711473-5711475,5711478-5711479,5711481-5711483,5711489,5711491,5711494,5711497,5711499,5711501-5711502,5711505,5711510,5711512,5711515-5711518,5711520,5711523,5711527-5711528,5711536-5711538,5711542,5711544,5711548,5711556,5711559,5711564,5711568-5711569,5711574,5711578,5711582-5711583,5711588,5711591,5711596,5711615,5742753-5742754,5743218,5774613-5774621,5774667,5774803-5774812,5774814,5774827-5774833,5774835,5774837-5774838,5774846-5774848,5774850-5774856,5775014-5775024,5775037-5775041,5775057-5775067,5775069-5775074,5775076-5775080,5775086,5800268-5800269,5800275,5800278,5800280,5800288-5800289,5800292,5800298,5800305,5800312,5800316,5800320,5800323-5800324,5800331,5800335,5800340,5800344,5800347,5800352-5800353,5800360,5800364-5800365,5800372,5800376,5800379-5800380,5800388,5800390,5800394,5800398,5800400,5800405,5800411,5800415,5800418,5800422,5800426,5800429,5800432,5800437,5800439,5800448,5800450,5800455,5800458,5800462-5800463,5800470,5800473,5800478,5800480,5800486,5800489,5800495,5800497-5800498,5800502-5800503,5800508,5800511,5800515,5800519,5800523,5800527,5800532,5800537,5800540,5800544,5800554,5800556,5800558,5800561,5800564,5800566,5800570,5800572,5800577,5800584,5800587,5800593,5800599,5800601,5800605,5800607,5800610,5800614,5800620,5800627,5800634,5800643,5800653,5800656,5800665,5800677,5800681,5800685,5800697,5800706,5800713,5800721,5800728,5800736,5800745,5800748,5800755,5800762,5800774,5800779,5800792,5800799,5800809,5800821,5800830,5800837,5800841,5800853,5800856,5800866,5800873,5800888,5800892,5800902,5800911-5800912,5800915,5800925,5800930,5800941-5800942,5800955,5800963,5800974,5800980,5800990,5801007,5801010,5801013,5801025,5801030,5801037,5801046,5801053,5801062,5801067,5801077,5801086,5801092,5801102,5801111,5801128,5801146,5801158,5801168,5801177,5801183,5801198,5801209,5801220,5801225,5801233,5801241,5801249,5801253,5801264,5801270,5801274,5801281,5801286,5801292,5801295,5801306,5801308,5801313,5801318,5801323,5801325,5801328,5801334-5801336,5801342,5801347,5801351,5801354,5801361,5801366,5801373,5801376,5801380,5801382,5801386,5801388,5801393,5801396,5801400,5801406,5801410,5801412,5801414,5801419,5801427,5801431,5801435,5801439,5801446,5801453,5801456,5801462,5801472,5801477,5801479,5801489,5801496,5801499,5801501-5801502,5801505,5801508,5801514,5801517-5801518,5801524,5801526,5801528,5801531,5801534-5801535,5801539,5801541,5801547,5801550,5801556,5801559-5801560,5801564,5801571-5801572,5801574,5801577-5801578,5801581,5801583,5801585,5801590,5801596-5801597,5801600,5801603-5801605,5801608,5801612,5801615,5801618-5801619,5801623,5801625,5801628,5801630,5801635-5801637,5801647,5801650,5801656,5801660,5801664,5801668,5801671,5801673,5801680,5801682,5801684,5801686,5801688,5801690-5801691,5801693,5801699,5801701,5801703,5801707 +alt.binaries.sounds.mp3: 32748735,32748825,32748841-32748842,32748853-32748854,32748860,32748870-32748871,32748874,32748891,32748898,32748904,32748916,32748919,32748923,32748926,32748934,32748937,32748940,32748950,32748957,32748966,32748973-32748974,32748982,32748986,32749000,32749002,32749005,32749007-32749009,32749011,32749016,32749022,32749027-32749028,32749032,32749036,32749050,32749068,32749073,32749077-32749078,32749084,32749092,32749099,32749105-32749106,32749108,32749111-32749112,32749123,32749127,32749129,32749131,32749141,32749143,32749151,32749160,32749162,32749171,32749175,32749184,32749187-32749188,32749206,32749214,32749217,32749236-32749237,32749239,32749245,32749247,32749251,32749253-32749254,32749257,32749259-32749260,32749271,32749276,32749281,32749285,32749288,32749290-32749291,32749297,32749305,32749309,32749312,32749315,32749324,32749331,32749341-32749342,32749365,32749375,32749385,32749390-32749391,32749403,32749406,32749410,32749418,32749423,32749427-32749428,32749441,32749444,32749460,32749471-32749472,32749474,32749477,32749480,32749508,32749514,32749516,32749524-32749525,32749527,32749532-32749534,32749542,32749550,32749564,32749566,32749569,32749572,32749579,32749587,32749595,32749601,32749605,32749612,32749619,32749622,32749626,32749644-32749645,32749655-32749656,32749663,32749670,32749686,32749691,32749693,32749724,32749727,32749738,32749741,32749770,32749774,32749779,32749786,32749794,32749797,32749804,32749806-32749807,32749896,32749912,32749924,32749948,32749964,32749970,32749975,32749981,32749987,32750006,32750009,32750027,32750029-32750030,32750035,32750038-32750040,32750052-32750053,32750068,32750076,32750082,32750085,32750090,32750092,32750096,32750107,32750122,32750124,32750126,32750131,32750143,32750145,32750151,32750155,32750163,32750183,32750188-32750189,32750195,32750201,32750203,32750206-32750207,32750209,32750217,32750229,32750237,32750239,32750274,32750276,32750279,32750288,32750291,32750297,32750304,32750315,32750327,32750333,32750368,32750378,32750383,32750393,32750398,32750403,32750410-32750411,32750424-32750425,32750462,32750471,32750478,32750494,32750497,32750513,32750519-32750520,32750526,32750532,32750534,32750566,32750573,32750582,32750605,32750614,32750652,32750657,32750667,32750673,32750678,32750692,32750716,32750730,32750734,32750746,32750749,32750753,32750755,32750767,32750771,32750784,32750786,32750794,32750833,32750838,32750842,32750907,32751046,32751059,32751088,32751097,32751136,32751138,32751175,32751193,32751216,32751225,32751232,32751248,32751257,32751279,32751293,32751302,32751321,32751325,32751357,32751372,32751387,32751434-32751435,32751479,32751490-32751491,32751500,32751518,32751528,32751544,32751572,32751857,32751869,32751939,32751975,32752036,32752047,32752057,32752087,32752104,32752122,32752125,32752138,32752155,32752157,32752219,32752225,32752228,32752230,32752249,32752266,32752270,32752275,32752278,32752282,32752286,32752289,32752306,32752316,32752332,32752360,32752380,32752395,32752410,32752429,32752438,32752445,32752459,32752464,32752470,32752477,32752483,32752494-32752495,32752498,32752510,32752512,32752518,32752540,32752544,32752546,32752551,32752557,32752579,32752595,32752609,32752611-32752612,32752630,32752648,32752655,32752669,32752680,32752711,32752715,32752722,32752732,32752742,32752750,32752764,32752778-32752779,32752784-32752785,32752787,32752793,32752795,32752801,32752803,32752810,32752841,32752880,32752885,32752902,32752970,32753007,32753017,32753022,32753029,32753038,32753043,32753075-32753076,32753123,32753132,32753139-32753140,32753160,32753207,32753249,32753255,32753262,32753359,32758417-32758419,32758507,32758529,32758734,32758739,32758758,32758836,32758888,32758926,32758936,32758942,32758955,32759106,32759120,32759124,32759148,32759159,32759185,32759191,32759201,32759206,32759224,32759233,32759251,32759257,32759259,32759262,32759265,32759268,32759276,32759278-32759279,32759301,32759304,32759312,32759329,32759332-32759333,32759346,32759350,32759380,32759394,32759400,32759404,32759407,32759415,32759418,32759438,32759446,32759449,32759456,32759465,32759467,32759476-32759477,32759488,32759498,32759504,32759519,32759543-32759544,32759568,32759582,32759587,32759592,32759603,32759634,32759656,32759669,32759679-32759680,32759683,32759699,32759706-32759709,32759716,32759731,32759735,32759745,32759756,32759761,32759768,32759774,32759778,32759797,32759802,32759817,32759820,32759826,32759842,32759848,32759856,32759874,32759876,32759900,32759902-32759903,32759934,32759939,32759941,32760017,32760029,32760044-32760046,32760051,32760055,32760071,32760098,32760104,32760153,32761486,32761497,32761503,32761513,32761526,32761536,32761542,32761547,32761558,32761573,32761586,32761597,32761606,32761618,32761631,32761637,32761650,32761655,32761664,32761671,32761676,32761693,32761706,32761722,32761727,32761742,32761752,32761760,32761770,32761784,32761798,32761807,32761819,32761826,32761839,32761848,32761851,32761861,32761870,32761876,32761881,32761889,32761894,32761902,32761908,32761915,32761924,32761933,32761947,32761958,32761964,32761969,32761978,32761987,32761989,32761996,32762000,32762007,32762011,32762017,32762019,32762027,32762039,32762045,32762060,32762065,32762073,32762089,32762100,32762107,32762110,32762117,32762126,32762132,32762138,32762144,32762152,32762160,32762169,32762174,32762182,32762187,32762196,32762204,32762213,32762221,32762232,32762243,32762248,32762267,32762272,32762287,32762292,32762310,32762315,32762331,32762337-32762338,32762348,32762357,32762362,32762372,32762383,32762386,32762391,32762399,32762417,32762443,32762456,32762487,32762515,32762535,32762562,32762582,32762611,32762638,32762667,32762691,32762696,32762720,32762747,32762761,32762780,32762787,32762801,32762811,32762826,32762843,32762855,32762868,32762889,32762899,32762911,32762927,32762938,32762958,32762975,32762984,32762992,32762999,32763007,32763021,32763028,32763047,32763054,32763063,32763081,32763091,32763105,32763114,32763124,32763134,32763152,32763164,32763191,32763219,32763234,32763245,32763254,32763261,32763266-32763267,32763277,32763284,32763292,32763301,32763317,32763322,32763335,32763344,32763354,32763369,32763376,32763389,32763400,32763410,32763417,32763427,32763441,32763449,32763466,32763476,32763487,32763491,32763505,32763508,32763521,32763523,32763531,32763542,32763551,32763565,32763569-32763570,32763582,32763589-32763590,32763615,32763619,32763627,32763635,32763640,32763665,32763691,32763700,32763708,32763722,32763728,32763735,32763742,32763751,32763756,32763766,32763782,32763790,32763795,32763797,32763811,32763816,32763822,32763831-32763832,32763852,32763858,32763868,32763872,32763881,32763886,32763891,32763894,32763899,32763902,32763907,32763910,32763914,32763921,32763926,32763929,32763934,32763944,32763949,32763952,32763957,32763961,32763965,32763968,32763975,32763978,32763987,32763994,32763998,32764005,32764010,32764015,32764020,32764029,32764034,32764040,32764046,32764054,32764061,32764066,32764070,32764072,32809894,32809911,32809922,32809932,32809941,32809947,32809950,32809956,32809960,32809966,32809968,32809971,32809974,32809982,32809987,32809991,32810001,32810020,32810024,32810029,32810035,32810045,32810053,32810074,32810082,32810084,32810091,32810105,32810111,32810114,32810128,32810170,32810188,32810208,32810213,32831020,32831024-32831026,32831029-32831032,32831034-32831035,32831037,32831040-32831042,32831044-32831047,32831049,32831052-32831055,32831057-32831062,32831065-32831066,32831072-32831075,32831077-32831082,32831084-32831086,32831090,32831093,32831097-32831100,32831105-32831106,32831108-32831110,32831112,32831117,32831119-32831120,32831123-32831124,32831127,32831130,32831135-32831140,32831142-32831143,32831146,32831148,32831150,32831152-32831154,32831156-32831157,32831160,32831162-32831163,32831165,32831167,32831169-32831171,32831174-32831175,32831177,32831179,32831181,32831183-32831185,32831187,32831189,32831192,32831195-32831196,32831199,32831201-32831202,32831204,32831206,32831208-32831210,32831212-32831213,32831215,32831218,32831220,32831223,32831226,32831228,32831230,32831232-32831233,32831235-32831236,32831239,32831241,32831245,32831248-32831252,32831255,32831260,32831262-32831265,32831268,32831270,32831275-32831276,32831278-32831279,32831284-32831286,32831289,32831291,32831294-32831295,32831297-32831299,32831301-32831304,32831306,32831308,32831313,32831315-32831320,32831322,32831324-32831326,32831330-32831331,32831333-32831335,32831337,32831340-32831344,32831347,32831350-32831353,32831355,32831357,32831359,32831362,32831365-32831366,32831368,32831370,32831372-32831373,32831376,32831378,32831381,32831383-32831384,32831386,32831388,32831391-32831393,32831395,32831397,32831399,32831401,32831404-32831405,32831408-32831409,32831411-32831412,32831415-32831416,32831418,32831422-32831423,32831427,32831429,32831432,32831434,32831438-32831439,32831441,32831445,32831447-32831448,32831451,32831453-32831454,32831457-32831458,32831460,32831462,32831466,32831469,32831473,32831478-32831480,32831484-32831485,32831490-32831493,32831496-32831497,32831499-32831500,32831502-32831504,32831510,32831513-32831516,32831520,32831522,32831524-32831525,32831530,32831534,32831536,32831542-32831545,32831548,32831552-32831553,32831557,32831559,32831562,32831564,32831567,32831569,32831572-32831573,32831575,32831578,32831581-32831583,32831585,32831590,32831593-32831596,32831599,32831601,32831604,32831606,32831609,32831611-32831613,32831618,32831620,32831622,32831627,32831630-32831631,32831633,32831636,32831638-32831640,32831642-32831643,32831646-32831647,32831649-32831650,32831653,32831655,32831658,32831662-32831663,32831667,32831671,32831674-32831675,32831677-32831679,32831686,32831690,32831692,32831694-32831695,32831698-32831699,32831702,32831706-32831707,32831709,32831711,32831713,32831719,32831721-32831722,32831724-32831725,32831727,32831730-32831731,32831734-32831735,32831739-32831740,32831743,32831745-32831746,32831750,32831754,32831756-32831757,32831760-32831764,32831770,32831772,32831777-32831779,32831785-32831787,32831791-32831794,32831799,32831803,32831807,32831810-32831811,32831813,32831817-32831819,32831822,32831825,32831827,32831829,32831832,32831834-32831835,32831837,32831841-32831844,32831846,32831848-32831851,32831853,32831855-32831857,32831863,32831866,32831868,32831870,32831872-32831874,32831877,32831880-32831881,32831886,32831888-32831889,32831891,32831894-32831895,32831898,32831903-32831905,32831907,32831911-32831912,32831914,32831916-32831917,32831919,32831921-32831922,32831925,32831928-32831929,32831932,32831934,32831936,32831939-32831940,32831944,32831946,32831949,32831952,32831954-32831955,32831957,32831959-32831961,32831965-32831966,32831970-32831971,32831974,32831976,32831979,32831981-32831983,32831987-32831989,32831994,32831996-32831997,32832000-32832002,32832005-32832007,32832009,32832011-32832012,32832016-32832018,32832020-32832021,32832024,32832032,32832035,32832037,32832039,32832041,32832044-32832045,32832048,32832053-32832054,32832056,32832058,32832061,32832065-32832068,32832070-32832072,32832077,32832079,32832085-32832086,32832091,32832093,32832096,32832100-32832101,32832103,32832107,32832110-32832111,32832113-32832114,32832117,32832120,32832122,32832124-32832125,32832128,32832130,32832133-32832135,32832138-32832139,32832141-32832142,32832145,32832150-32832152,32832158-32832159,32832161,32832164-32832165,32832170-32832172,32832175-32832179,32832181,32853368,32853387,32853393,32853404,32853409,32853428,32853443,32853451,32853457-32853458,32853461-32853463,32853468,32853470,32853474-32853475,32853477-32853478,32853480,32853485,32853490,32853492-32853493,32853498,32853500,32853512,32853514,32856027,32856054,32856068,32856071,32856085,32856098,32856104,32856130,32856158,32856169,32856179,32856187,32856198-32856199,32856325,32856334,32856507-32856508,32856513,32856517,32856522,32856524,32856526,32856528,32856532-32856533,32856536-32856539,32856545,32856551-32856552,32856554,32856556-32856557,32856559,32856563,32856566,32856568,32856571-32856572,32856576,32856578,32856581,32856583-32856585,32856587,32856589,32856593,32856595,32856597,32856600,32856609-32856610,32856614,32856622,32856628,32856631,32856635,32856639-32856641,32856643-32856646,32856650,32856652,32856655,32856659,32856668,32856670,32856679,32856686,32856688,32856705,32856708-32856709,32856717,32856720-32856723,32856734,32856739,32856742-32856744,32856749,32856751,32856754,32856756-32856757,32856760,32856764,32856766,32856768,32856771,32856774,32856782,32856790,32856796,32856798,32856804,32856807,32856809,32856811,32856819-32856820,32856824,32856830-32856831,32856833,32856836-32856837,32856839-32856841,32856843-32856845,32856849-32856851,32856855-32856856,32856859,32856862,32856870-32856873,32856879,32856881,32856888,32856892,32856894-32856897,32856905,32856910,32856912,32856917,32856919,32856921,32856927-32856928,32856931,32856934-32856935,32856938,32856943,32856947,32856949-32856952,32856959,32856965,32856969,32856971-32856977,32856984,32856990,32856996,32857000-32857001,32857003,32857010,32857012-32857013,32857016,32857021-32857022,32857025-32857027,32857032,32857034,32857040,32857042-32857043,32857045-32857047,32857049,32857052-32857053,32857057-32857059,32857062,32857064-32857065,32857069,32857075,32857078,32857081-32857083,32857085,32857089,32857095,32857098,32857101-32857103,32857106,32857108,32857110,32857112,32857114,32857117,32857119-32857122,32857124-32857125,32857127-32857128,32857133,32857136,32857141,32857148,32857156-32857157,32857160,32857167,32857176,32857178,32857180,32857186,32857189,32857194,32857197-32857199,32857204,32857216,32857218,32857221,32857224-32857225,32857229-32857230,32857232,32857234,32857243,32857250,32857254,32857256-32857257,32857259,32857261,32857263,32857269,32857273-32857274,32857279,32857292-32857293,32857297,32857299,32857306,32857310,32857314,32857323,32857328-32857329,32857334,32857336,32857338,32857344-32857345,32857349-32857350,32857358,32857364,32857370,32857389,32857391,32857395,32857398,32857403,32857408,32857418,32857420,32857422-32857423,32857427-32857428,32857434-32857435,32857440,32857445,32857453,32857455-32857456,32857458,32857461-32857463,32857465,32857467-32857469,32857471,32857475,32857482,32857484-32857485,32857490-32857491,32857493,32857498-32857500,32857504-32857506,32857511-32857512,32857518,32857524,32857527-32857528,32857533,32857537,32857542-32857543,32857547,32857549,32857560,32857563,32857565,32857567,32857569-32857570,32857574,32857582,32857590,32857595,32857597,32857601-32857602,32857609,32857613,32857620,32857622,32857625-32857626,32857634,32857652,32857656,32857669,32857679,32857683,32857689-32857690,32857692,32857695,32857700,32857702,32857707,32857712-32857713,32857715,32857719-32857720,32857763-32857764,32857769,32857774,32857797,32857805-32857806,32857816,32857824,32857827,32857835,32857839,32857841,32857852-32857853,32857872,32857876,32857878,32857885-32857886,32857907,32857914,32857919,32857922-32857923,32857946,32857952,32857961,32857968-32857969,32857975,32857977,32857985,32857994,32858004,32858008,32858015-32858016,32858090,32858189,32858254,32865625,32865634-32865635,32865637-32865638,32865650,32865659,32865663,32865665,32865668-32865669,32865674,32865678,32865689,32865694,32865696,32865704-32865705,32865710,32865712-32865713,32865717,32865731-32865732,32865735,32865737,32865745,32865750,32865756,32865762,32865765,32865768,32865772,32865784,32865789,32865803,32889405,32889408,32889576,32889578,32889580,32889582-32889583,32889587,32889589-32889590,32889754,32889757-32889758,32889761-32889762,32889764,32889971,32889974,32889982,32889984-32889986,32929001,32929094-32929095,32929236,32929240,32929287,32929306,32929376-32929377,32929391-32929392,32929429,32929473,32931589,32931635,32931641,32931654,32931671,32931673,32931677,32931694,32931697,32931705,32931708,32931712,32931724,32931729,32931739,32931741,32931743,32931745,32931765,32931783,32931796,32931811,32931814,32931816,32931825,32931835,32931842-32931843,32931873,32931883,32931895,32931902,32931912,32931916,32931932,32943271,32943283,32943310,32943314,32943317-32943318,32943322-32943323,32943329,32943340,32943343,32943347,32943349,32943352,32943356,32943364,32943369,32943373,32943375,32943381-32943382,32943392-32943393,32943398-32943399,32943403,32943408,32943415,32943421,32943423,32943436-32943437,32943444,32943449,32943459,32943465,32943467-32943468,32943470,32943473-32943474,32943479,32943487,32943496,32943498,32943502-32943503,32943505,32943507,32943516-32943517,32943519,32943522,32943525,32943530,32943533-32943534,32943536,32943539-32943540,32943546-32943548,32943552-32943553,32943556,32943559-32943562,32943565,32943567-32943570,32943573-32943574,32943577-32943579,32943588-32943590,32943593-32943595,32943597-32943600,32943602,32943604,32943607-32943609,32943611-32943615,32943619-32943620,32943622-32943623,32943626-32943627,32943629,32943631,32943633-32943634,32943640-32943641,32943643-32943644,32943646,32943650,32943654-32943655,32943657,32943660-32943663,32943666-32943673,32943677-32943680,32943682,32943687,32943690-32943691,32943698-32943699,32943705-32943706,32943709,32943713,32943718-32943719,32943726,32943734,32943741,32943749,32943760,32943764,32943770,32943773,32943776,32943782,32943786,32943789,32943798,32943800-32943801,32943807,32943809,32943812,32943815,32943824,32943827-32943828,32943839-32943840,32943851,32943857,32943859-32943860,32943863,32943873,32943875,32943879,32943885,32943907,32943909,32943914,32943917,32943933,32943937,32943941,32943948,32943953,32943955-32943956,32943966,32943971,32943976,32943980,32943992,32943996,32943998,32944032,32944038,32944048,32944065,32944067,32944080,32944087-32944089,32944105,32944113,32946980,32946982,32946985,32946988,32946992-32946993,32946999,32947004,32947006,32947012,32947016,32947022,32947024,32947031,32947035,32947038,32947042,32947044,32947048,32947052,32947055,32947059,32947064,32947067,32947071,32947077,32947080,32947082,32947086,32947091,32947099,32947102,32947105,32947108,32947111,32947116,32947121,32947126,32947130,32947138,32947143,32947146,32947149,32947157-32947158,32947164,32947170,32947173,32947179-32947180,32947182,32947186,32947192,32947196,32947202,32947208,32947210,32947214,32947216,32947225,32947228,32947233,32947238,32947240,32947244,32947250,32947252,32947258,32947261-32947262,32947268,32947271,32947276,32947281,32947283,32947287,32947295,32947298,32947300,32947306,32947308,32947313,32947316,32947322-32947324,32947331,32947334-32947335,32947339,32947342,32947347,32947353,32947356,32947361,32947364,32947372,32947374,32947378,32947382,32947385,32947389,32947393,32947397-32947398,32947405,32947407,32947412,32947416,32947419,32947423,32947425,32947428,32947431,32947435,32947437-32947438,32947441,32947444,32947449,32947451,32947454-32947455,32947458,32947462,32947466,32947468-32947469,32947475-32947476,32947478,32947484,32947488,32947490,32947492,32947494,32947498,32947500,32947503,32947509,32947511-32947512,32947515,32947518,32947522,32947524,32947528,32947531,32947534,32947542-32947543,32947546,32947549,32947552,32947556,32947558-32947559,32947562,32947566,32947570,32947572,32947574,32947577,32947580,32947584-32947585,32947589,32947591,32947596,32947599,32947601,32947607,32947609,32947612,32947614,32947617,32947622,32947627,32947629-32947630,32947633,32947637,32947639,32947641,32947643,32947645,32947647,32947649,32947654,32947657,32947661,32947665,32947670,32947672,32947675,32947678,32947681,32947683-32947684,32947687,32947690,32947692,32947694,32947697,32947700,32947702,32947707,32947715,32947718,32947720,32947723,32947729,32947731,32947736,32947738,32947741,32947743-32947744,32947748,32947750-32947751,32947755,32947761,32947767,32947769-32947770,32947772,32947774,32947776,32947779,32947781,32947784,32947786-32947787,32947791,32947794,32947798,32947802,32947804,32947808,32947811,32947814,32947818,32947823,32947829,32947833,32947835,32947839,32947843,32947846,32947848,32947854-32947855,32947861,32947866,32947869,32947871-32947872,32947874,32947876,32947880,32947884,32947889,32947891,32947894,32947899,32947901,32947903-32947904,32947906,32947911,32947913,32947917,32947920,32947922,32947925-32947926,32947929,32947931,32947935,32947942-32947943,32947946,32947948-32947949,32947951,32947954-32947955,32947957-32947958,32947962,32947964,32947966,32947971,32947973-32947974,32947981-32947983,32947988,32947990,32947994,32947997,32948000,32948006,32948008,32948011,32948013,32948015,32948018,32948023-32948024,32948028,32948030,32948032,32948034-32948035,32948041,32948047,32948052,32948058,32948063,32948065,32948067,32948069,32948072,32948074,32948076,32948079,32948085,32948088,32948090,32948097-32948098,32948101,32948104,32948108,32948111,32948114,32948116,32948119,32948123,32948128,32948132,32948134,32948136,32948138-32948139,32948142,32948145,32948148,32948150,32948152,32948157,32948159,32948164-32948165,32948168,32948175,32948183,32948185,32948188,32948193,32948196-32948197,32948201,32948210-32948211,32948215,32948219,32948222,32948228,32948232,32948234,32948236,32948239,32948241,32948247,32948251-32948252,32948255,32948258,32948261,32948266,32948271-32948272,32948275,32948279,32948282-32948283,32948289,32948294,32948296,32948300,32948302-32948304,32948308,32948313,32948315,32948317,32948321,32948324,32948330-32948331,32948334,32948339,32948342,32948345-32948346,32948348,32948350,32948354,32948356,32948361,32948365,32948368,32948372-32948373,32948376,32948380-32948381,32948386,32948389,32948394,32948398-32948399,32948402,32948409,32948412,32948415,32948417,32948419,32948426-32948427,32948432,32948435,32948438,32948442,32948445,32948447,32948451,32948454,32948459,32948462,32948465,32948468,32948474,32948477,32948482,32948485,32948491-32948492,32948495,32948498,32948500,32948507,32948509,32948514,32948517,32948522,32948524,32948527-32948528,32948530,32948536,32948538,32948543,32948547,32948549,32948553,32948556-32948557,32948560,32948563,32948568,32948575-32948576,32948581,32948583-32948585,32948590,32948592,32948596,32948599,32948602-32948603,32948608,32948610,32948617,32948619,32948622,32948626,32948628,32948634,32948638,32948640-32948641,32948646,32948649,32948654,32948657,32948661,32948667,32948669,32948674,32948676,32948678,32948682-32948683,32948686-32948687,32948691,32948698-32948699,32948704,32948706,32948713,32948717-32948718,32948720,32948723,32948726-32948727,32948732,32948738,32948743,32948745,32948750,32948753,32948759,32948763,32948765,32948769,32948772,32948776,32948778,32948782,32948785,32948791,32948796-32948797,32948800,32948804,32948806,32948811,32948817,32948820,32948824,32948830,32948833,32948835,32948841,32948843,32948850,32948853,32948855,32948864-32948865,32948868,32948873,32948876,32948879,32948885,32948887,32948891,32948897,32948900,32948904,32948908,32948910,32948916,32948923-32948924,32948930,32948933,32948936,32948945,32948948,32948950,32948952,32948954,32948960,32948963-32948965,32948974-32948975,32948978-32948979,32948981,32948989,32948993,32948998,32949001,32949004,32949010-32949011,32949016,32949023,32949026-32949027,32949029,32949037,32949041,32949044-32949045,32949049,32949052,32949056,32949062-32949063,32949065,32949068,32949071,32949077,32949081,32949083,32949165,32949168,32949170,32949183,32949187,32949224,32949230,32949236,32949238,32949243,32949279,32949302,32949317,32949322,32949333-32949334,32949336,32949341,32949352-32949353,32949360,32949381,32949384,32949400,32949418,32949425,32949431-32949432,32949444-32949445,32949454,32949462-32949463,32949469,32949476,32949484,32949510-32949511,32949514,32949525,32949530,32949537,32949545,32949565,32949573,32949584,32949604,32949642,32949646,32949648,32949666,32949678,32949685,32949698,32949703,32949709,32949714,32949718,32949725-32949726,32949728,32949739,32949760,32949767,32949769,32949779,32949788,32949807,32949816-32949817,32949823,32949832,32949842,32949851,32949866,32949874,32949878,32949880,32949898,32949941,32949947,32949954,32949962,32949970,32949974,32949976,32949990,32949996,32950006,32950120,32950248,32950274,32950303,32950316,32950334,32950341,32950361,32950363,32950373,32950381,32950386,32950392,32950403,32950411,32950414,32950431,32950437,32950443-32950444,32950454,32950457,32950478,32950484,32950487,32950509,32950517,32950532,32950549,32950551,32950558-32950559,32950562,32950564,32950569,32950578,32950593,32950604,32950609-32950610,32950624,32950659,32950675,32950684,32950693,32950696-32950697,32950704,32950717,32950724,32950729,32950758,32950760,32950764,32950801,32950812,32950818,32950820,32950822,32950829,32950845,32950858,32950876,32950879,32950894,32950896,32950918,32950920,32950934,32950938,32950955,32950966,32950973,32950982,32950988,32950993-32950995,32951013,32951016,32951024,32951029,32951047,32951049,32951051,32951053,32951066-32951067,32951071,32951076,32951082,32951102,32951106,32951128,32951130,32951135,32951145,32951150,32951159,32951174,32951176,32951188,32951191,32951193,32951203,32951206,32951221,32951225,32951241,32951245,32951247,32951249,32951254,32951262-32951263,32951289,32951294,32951297,32951300,32951303-32951304,32951310,32951317,32951319,32951326,32951328,32951331,32951334,32951336,32951345,32951349-32951350,32951356,32951361,32951365,32951378,32951384,32951391,32951393-32951394,32951412,32951433-32951434,32951438,32951446,32951455,32951457,32951459,32951465,32951468,32951473,32951480,32951484-32951485,32951496-32951497,32951521,32951527,32951535,32951542,32951566-32951567,32951585,32951591,32951597,32951640,32951722,32951729,32951752,32951823,32951855,32951911,32951919,32951930,32951932,32951941,32951944,32951968,32951985,32952016,32952045,32952064,32952087,32952090,32952093,32952107,32952109,32952138,32952165,32952172,32952198,32952204,32952214,32952248,32952257,32952274,32952291,32952296,32952307,32952322,32952365,32952375,32952386,32952390,32952406,32952413,32952421,32952424,32952435,32952445,32952461,32952492,32952503,32952511,32952513,32952517,32952519-32952520,32952522,32952564,32952567,32952585,32952591,32952605,32952607,32952624,32952637,32952657-32952658,32952671,32952695,32952707,32952714,32952718,32952736,32952753,32952763,32952793,32952830,32952833,32952850,32952852,32952867,32952878,32952885,32952888,32952899,32952923-32952924,32952945,32952949,32952970,32952979-32952980,32952985,32952992,32953039,32953046,32953066,32953080,32953085,32953091,32953096,32953108,32953116,32953126,32953137,32953147,32953156,32953172-32953173,32953181,32953190,32953192,32953194,32953200,32953205,32953207-32953208,32953211-32953212,32953215,32953218,32953222,32953225-32953226,32953229,32953236,32953240,32953244,32953251,32953256,32953258,32953262,32953264,32953270,32953274,32953276-32953278,32953281,32953283,32953286,32953290,32953295,32953300,32953304,32953308-32953310,32953314,32953316,32953319,32953322,32953327,32953330,32953333,32953335-32953337,32953339,32953343,32953346,32953348,32953352,32953358-32953360,32953364,32953367,32953370,32953374-32953375,32953380,32953386-32953390,32953396,32953402,32953405,32953407,32953410,32953412,32953417,32953419-32953420,32953423,32953425,32953427,32953431,32953438-32953439,32953443,32953447,32953455-32953456,32953461,32953463,32953472,32953474,32953477,32953482,32953492,32953495-32953497,32953506,32953510,32953514,32953520,32953524,32953530,32953538,32953541-32953542,32953548,32953550,32953556-32953557,32953561-32953562,32953567,32953569,32953575,32953584,32953587,32953593,32953599,32953607,32953611,32953613,32953616,32953625,32953627,32953634,32953639,32953648,32953654,32953660,32953663,32953668,32953673,32953675,32953678,32953682,32953688,32953699,32953704,32953709,32953711,32953719,32953721,32953725,32953729,32953732,32953736,32953740,32953743,32953751,32953759,32953769,32953774,32953782,32953791-32953792,32953797,32953803,32953805,32953807,32953813,32953820,32953823,32953825,32953827,32953833,32953838,32953840,32953851-32953852,32953856,32953858-32953860,32953865,32953871,32953874,32953876,32953885,32953892,32953895,32953898,32953909,32953915,32953919,32953921-32953922,32953928,32953933,32953936,32953941,32953949,32953958,32953964,32953968,32953971-32953972,32953980,32953986,32953991,32954000,32954003,32954006,32954010,32954021-32954022,32954026,32954032,32954040,32954046,32954055,32954060,32954065,32954069,32954072,32954076-32954077,32954084,32954088,32954090,32954096,32954100,32954105,32954109,32954113,32954119,32954129,32954131-32954132,32954142,32954148,32954152,32954156,32954162,32954167,32954171,32954178,32954188,32954192,32954199,32954203,32954209,32954212,32954216,32954224,32954235,32954241,32954243,32954248,32954250-32954251,32954255,32954258,32954263,32954265,32954267,32954270,32954272,32954274,32954276,32954278-32954279,32954283,32954286,32954289,32954291,32954293,32954297,32954304,32954306,32954309,32954314,32954318,32954322,32954329,32954335,32954341,32954346-32954347,32954351,32954353,32954358,32954364,32954371,32954373,32954378,32954382,32954385,32954391,32954397,32954400,32954403,32954407,32954409,32954413,32954418-32954419,32954422,32954425,32954427-32954428,32954430-32954431,32954437,32954441,32954444-32954445,32954451-32954453,32954457,32954459,32954462-32954464,32954466,32954468-32954469,32954471,32954473,32954477-32954478,32954481,32954485,32954487-32954488,32954490,32954493,32954496,32954499,32954505-32954506,32954508,32954514-32954515,32954517,32954519,32954521,32954523,32954526,32954528,32954531,32954533-32954534,32954538-32954539,32954541-32954542,32954544,32954548-32954549,32954552,32954556,32954562,32954564,32954566,32954570-32954572,32954574,32954576-32954577,32954580-32954582,32954585,32954590,32954592,32954594,32954596-32954597,32954602,32954604,32954607,32954610,32954612,32954615,32954620-32954622,32954627,32954629,32954632,32954634,32954636,32954638,32954640,32954642-32954644,32954647,32954656,32954658,32954661,32954666-32954667,32954675,32954682,32954691-32954692,32954694,32954696,32954700,32954709-32954710,32954712,32954721-32954722,32954725,32954749,32954755,32954767,32954772,32954775,32954782-32954783,32954790-32954791,32954796,32954800,32954805,32954807,32954812,32954816,32954822,32954826,32954828,32954831,32954835,32954838-32954839,32954843,32954845-32954846,32954848,32954851,32954862,32954865-32954866,32954870,32954878,32954880,32954883,32954885,32954892,32954898-32954899,32954902,32954908,32954911,32954914,32954918,32954921-32954922,32954924,32954932,32954936,32954940,32954942-32954943,32954946,32954948,32954953-32954954,32954956-32954958,32954965-32954966,32954968,32954970,32954973-32954974,32954976-32954978,32954980-32954981,32954988,32954991,32954999,32955004,32955007-32955008,32955012,32955014,32955018,32955023,32955033,32955035,32955038-32955039,32955041-32955042,32955045,32955048,32955051,32955057,32955059,32955061,32955063,32955065,32955074-32955075,32955078,32955089,32955091-32955092,32955098-32955099,32955101,32955104,32955110,32955112,32955117,32955121,32955127,32955129,32955131-32955133,32955139-32955141,32955147,32955154,32955156-32955157,32955161,32955163-32955164,32955169-32955170,32955173,32955177,32955181,32955183,32955187-32955188,32955192-32955193,32955200,32955209-32955210,32955212,32955216-32955217,32955221-32955222,32955226,32955230-32955231,32955233,32955237-32955238,32955241,32955243-32955244,32955246-32955247,32955250-32955251,32955255,32955263-32955264,32955267,32955269,32955271,32955274-32955277,32955280,32955285-32955286,32955288,32955291,32955304-32955305,32955308,32955311,32955313,32955317,32955319,32955327,32955330,32955338,32955356,32955359,32955365,32955377,32955385,32955387,32955394-32955396,32955398,32955400,32955406,32955409-32955410,32955413,32955416,32955423,32955425,32955427,32955429-32955430,32955437,32955439,32955442,32955445,32955448,32955451,32955454,32955463,32955469-32955471,32955477,32955479,32955484,32955488,32955494-32955495,32955500,32955507,32955509,32955512,32955518,32955523,32955528,32955535-32955536,32955545,32955548,32955552,32955554,32955557,32955564-32955565,32955569,32955575,32955584,32955589,32955596,32955605-32955606,32955608,32955611,32955625,32955627,32955630-32955631,32955647,32955649,32955655,32955661,32955663,32955669,32955677-32955680,32955691,32955700-32955701,32955703,32955705,32955708-32955709,32955713,32955719,32955722-32955723,32955726-32955727,32955731,32955734,32955737-32955738,32955742,32955748-32955749,32955760,32955763,32955767,32955782-32955783,32955787,32955795,32955803-32955804,32955808,32955811,32955825-32955826,32955838,32955849-32955850,32955857,32955883,32955886,32955898-32955899,32955908,32955911,32955916-32955917,32955924,32955927,32955939,32955947,32955949-32955950,32955957,32955959,32955968-32955969,32955984,32955987,32955989,32955996,32956003,32956005,32956008-32956009,32956017,32956027-32956028,32956030,32956036,32956050-32956051,32956062,32956074,32956076,32956080,32956084,32956088,32956090,32956095,32956109,32956125,32956128,32956130,32956145,32956150,32956152,32956181,32956185-32956186,32956190,32956196-32956197,32956206,32956213,32956224,32956233,32956243,32956247,32956249,32956267,32956272,32956275,32956284,32956292,32956295,32956302,32956309,32956323-32956324,32956327,32956337,32956345,32956349,32956357-32956358,32956361,32956364,32956366,32956380,32956390,32956392,32956406,32956415,32956418,32956423-32956424,32956435,32956439,32956448,32956461,32956463,32956478,32956480,32956484,32956487,32956491,32956496,32956506,32956509-32956510,32956516,32956535-32956536,32956547-32956549,32956556,32956562,32956564,32956569,32956580,32956582-32956583,32956586,32956606-32956607,32956614,32956616,32956621-32956622,32956628,32956640-32956641,32956649,32956654,32956659-32956660,32956673,32956680-32956681,32956686,32956700,32956702,32956709,32956711-32956712,32956723-32956724,32956726,32956734,32956747,32956749,32956761,32956767,32956786,32956788-32956790,32956804,32956808,32956810,32956823-32956824,32956832,32956842,32956844,32956848,32956853,32956860,32956866,32956868,32956870,32956885,32956893,32956898,32956901,32956910,32956919,32956927,32956933,32956937,32956946,32956948,32956961,32956963,32956969,32956981-32956982,32956997-32956998,32957001,32957003,32957006,32957010,32957013,32957026,32957029,32957046,32957052,32957063,32957074,32957087,32957092,32957105,32957119,32957121,32957137,32957140,32957144,32957148,32957153,32957155-32957156,32957167,32957169,32957183,32957185,32957194,32957211,32957217,32957232,32957237-32957238,32957245,32957262,32957273,32957279-32957280,32957287,32957303,32957313,32957321,32957333,32957339-32957340,32957353,32957405,32957407,32957419,32957427,32957432,32957445,32957456,32957474,32957490,32957495,32957502-32957503,32957507,32957516,32957532,32957545,32957554,32957556,32957573,32957577,32957585,32957595,32957600,32957605-32957606,32957609,32957630,32957637-32957638,32957640,32957696,32957698,32957709-32957710,32957718,32957722,32957732,32957751,32957757,32957768,32957772,32957774,32957790,32957793,32957802,32957813,32957823,32957826,32957830,32957844,32957860,32957871,32957880,32957893,32957896,32957899,32957905,32957910,32957914,32957938,32957948,32957950,32957959,32957969,32957971,32957979,32958003,32958015,32958024,32958052,32958075,32958087,32958094,32958097,32958104-32958105,32958128,32958149,32958175,32958177,32958179,32958186,32958191,32958197,32958212,32958214,32958233,32958254,32958262,32958294,32958323,32958335,32958354,32958374,32958388,32958399,32958433,32958456,32958460,32958486,32958488,32958567,32958580,32958651,32958708,32958745,32958793,32958816,32958821-32958822,32959776,32959942,32960014,32960019,32960028,32960045,32960060,32960063-32960064,32960075,32960131,32960144,32960172,32960198,32960206,32960213,32960222,32960228,32960234,32960242,32960278,32960291,32960293,32960303,32960307,32960310,32960319,32960334,32960336,32960358,32960379,32960381,32960386-32960387,32960409,32960425,32960427,32960429,32960464,32960477,32960483,32960515,32960534,32960549,32960560,32960595,32960616,32960620,32960628,32960663-32960664,32960679,32960683,32960706,32960715,32960723,32960734,32960753,32960759,32960777,32960798,32960809,32960831,32960852,32960878,32960896,32960925,32960927,32960934,32960952,32960965,32960967,32960975,32960995,32961030,32961046,32961059,32961063,32961079,32961107,32961143,32961164,32961166,32961186,32961208-32961209,32961249,32961269,32961288,32961302,32961315,32961322,32961327,32961348,32961355,32961363,32961378,32961380,32961384,32961396,32961426,32961434,32961443,32961450,32961467,32961525,32961572,32961576,32961578,32961610,32961619,32961628,32961636,32961642,32961656,32961666,32961673,32961698,32961712,32961719,32961739,32961744,32961746,32961755,32961763-32961764,32961768,32961803,32961830-32961831,32961838,32961850,32961884,32961886,32961900,32961903,32961917,32961919,32961941,32961943,32961957,32961966,32961980,32961983,32962003,32962006,32962014,32962021,32962045,32962049,32962060,32962065,32962076,32962081,32962102,32962107,32962111,32962115,32962118,32962129,32962136,32962159,32962164,32962193,32962199,32962215,32962234,32962241,32962254,32962275,32962295,32962300,32962307,32962314,32962325,32962335,32962344,32962367-32962368,32962382,32962394,32962402,32962423,32962433,32962700,32962725,32962739,32962746,32962778,32962804,32962806,32962809,32962812,32962814,32962819,32962824,32962831,32962834,32962839-32962840,32962845,32962848,32962850,32962854,32962857,32962863,32962877-32962878,32962890-32962891,32962894,32962902,32962908,32962912-32962913,32962915,32962920-32962921,32962924,32962931,32962933,32962938,32962943,32962946,32962949,32962952,32962958-32962960,32962964-32962966,32962968,32962976,32962997,32962999,32963004,32963015,32963026,32963038-32963039,32963058,32963061,32963067,32963073,32963075,32963081-32963082,32963102,32963113,32963116,32963120,32963124,32963132,32963140,32963155,32963165,32963169,32963171-32963172,32963176,32963178,32963182,32963192,32963211,32963214,32963224-32963225,32963227,32963233-32963234,32963241,32963250-32963251,32963267-32963268,32963276,32963290,32963301,32963303,32963306,32963309,32963320,32963340,32963349,32963369,32963375,32963384-32963385,32963392,32963400-32963401,32963408,32963410,32963430,32963435,32963438,32963445,32963453,32963461,32963463-32963464,32963473,32963481-32963482,32963492,32963501,32963508,32963511,32963517,32963527,32963539,32963541,32963546,32963551,32963555,32963559,32963561,32963566-32963567,32963572,32963587,32963592,32963598,32963600,32963603,32963605,32963619,32963626,32963634,32963644,32963656,32963662,32963665,32963668,32963674,32963691,32963702,32963708,32963722-32963723,32963732-32963734,32963747,32963762,32963771-32963772,32963778,32963781,32963789,32963793,32963816,32969291,32969300,32969427,32969435,32969446,32969461,32969465,32969470,32969491,32969494,32969504,32969507,32969514,32969516,32969540,32969555,32969561,32969589,32969638,32969666,32969678,32969716,32969738,32969751,32969755,32969758,32969777,32969779,32969790,32969800,32969846,32969848,32969853,32969859,32969866,32969879,32969891,32969900,32969907,32969911,32969925,32969929,32969937,32969952,32969961,32969982,32969985,32969991,32969995,32970025,32970056,32970085,32970093-32970094,32970115,32970132,32970153,32970158,32970161,32970172,32970178,32970191,32970220,32970243,32970248,32970269,32970305,32970317,32970320,32970326,32970331,32970336,32970346,32970379,32970433,32970445,32970458,32974166,32974190,32974215,32974240-32974241,32974257,32974260,32974284,32974340,32974350,32974370,32974382,32974404,32974438,32974442,32974454,32974456,32974460,32974467,32974473,32974503,32974535,32974541,32974553,32974561,32974573,32974576,32974585,32974591,32974597,32974617,32974620,32974624,32974628,32974645,32974693-32974694,32974697,32974701,32974710,32974714,32974733,32974757,32974772,32974791-32974792,32974812,32974815,32974821,32974826,32974842,32974864,32974866-32974867,32974895,32974906,32974910,32974915,32974946,32974972,32974977,32974981,32974983,32975004,32975007,32975014,32975044,32975059,32975065,32975098,32975105,32975123-32975124,32975150,32975166,32975176,32975192,32975211,32975230,32975253,32975283,32975293,32975295,32975297,32975312,32975344,32975361,32975364,32975370,32975375,32975377,32975392,32975396,32975399,32975408,32975424,32975433-32975434,32975439,32975454,32975468,32975470,32975483,32975486,32975516,32975535-32975536,32975569,32975627,32975640,32975646,32975649,32975687,32975702,32975706,32975711,32975748,32975774,32975788,32975795,32975799-32975800,32975822,32975824,32975832,32975838,32975842,32975846,32975848,32975867-32975868,32975878,32975914,32975916,32975918,32975929,32975944,32975950,32975953,32975962,32975964,32975978,32975981,32975993,32975996-32975997,32976032,32976034,32976042,32976048,32976050,32976108,32976125,32976143,32976145,32976150,32976156,32976159,32976171,32976177,32976186,32976202,32976204,32976226,32976251,32976258,32976260,32976271,32976273,32976291,32976295,32976314,32976334,32976350,32976355,32976364-32976365,32976375,32976408,32976410,32976415,32976433-32976434,32976441,32976448,32976457-32976458,32976467,32976515,32976529,32976533,32976539-32976540,32976546,32976553-32976554,32976559-32976560,32976562,32976570-32976571,32976575,32976583,32976596-32976597,32976608,32976610,32976616,32976636,32976638,32976644-32976645,32976647,32976668,32976675,32976688,32976694,32976747,32976755,32976789,32977607,32977622,32977637,32977647,32977665,32977676,32977687,32977696,32977709,32977721,32977733,32977745,32977764,32977776,32977779,32977789,32977795,32977811,32977821,32977831,32977836,32977851,32977856,32977867,32977872,32977879,32977891,32977901,32977910,32977919,32977923,32977932,32977942,32977952,32977960,32977973,32977978,32977981,32977986,32977993,32978006,32978010,32978019,32978026,32978036,32978043,32978050,32978055,32978067,32978095-32978096,32978101,32978108,32978115,32978129,32978136,32978146,32978158,32978164,32978172,32978178,32978188,32978194,32978199,32978207,32978222,32978231,32978239,32978251,32978265,32978276,32978281,32978291,32978305,32978315,32978328,32978337,32978349,32978359,32978369,32978373,32978388,32978396,32978405,32978414,32978431,32978445,32978455,32978471,32978481,32978488,32978501,32978520,32978531,32978543,32978558,32978566,32978573,32978583,32978596,32978603,32978615,32978625,32978641,32978653,32978663,32978673,32978688,32978699,32978707,32978725,32978735,32978744,32978754,32978773,32978782,32978790,32978803,32978815,32978822,32979733,32979745,32979760,32979772,32979788,32979800,32979813,32979830,32979852,32979865,32979881,32979900,32979910,32983394,32983403,32983420,32983434,32983456,32983462,32983481,32983494,32983544,32983562,32983579,32983581,32984396,32984413,32984422,32984428,32989910,32989928,32989940,32989953,32989969,32989983,32989997,32990007,32990023,32990037,32990048,32990059,32990074,32990088,32990106,32990118,32990132,32990151,32990160,32990174,32990187,32990195,32990215,32990225,32990231,32990243,32990254,32990267,32990281,32990289,32990304,32990316,32990326,32990340,32990352,32990366,32990385,32990399,32990414,32990423,32990435,32990453,32990460,32990818,32990840,32990865,32990879,32990894,32990931,32990935,32991292,32991313,32991330,32991353,32991386,32991605,32991620,32991645,32991660,32991678,32991701,32991715,32991728,32991745,32991766,32991777,32991785,32991791,32992947,32992998,33000850,33000870,33000892,33000913,33000933,33000948,33000962,33000983,33000997,33001014,33001033,33001054,33001069,33001085,33001105,33001119,33001138,33001157,33001171,33001190,33001195,33010206,33010228,33010232,33010235,33010241,33010244,33010249,33010260,33010270,33010274,33010278,33010287,33010292,33010300,33010307,33010316,33010325,33010331,33010341,33010345,33010357,33010362-33010364,33010371,33010379,33010382,33010387,33010395,33010398,33010402,33010406,33010413,33010418,33010426-33010427,33010432,33010435,33010437-33010438,33010445,33010454-33010455,33010460,33010462,33010464,33010466,33010477,33010479,33010488,33010491,33010494,33010499,33010507,33010509,33010511,33010514,33010518,33010523,33010526,33010532,33010536,33010543,33010549,33010555,33010562,33010571,33010576,33010581,33010585,33010591,33010593,33010605,33010610,33010621,33010625,33010631,33010638,33010642,33010645,33010654,33010657,33010679,33010683,33010694-33010695,33010699,33010709,33010719,33010731,33010733,33010739,33010742,33010758-33010759,33010778,33010782,33010790-33010791,33010796,33010800,33010813-33010814,33010822,33010825,33010832-33010833,33010841,33010843,33010855,33010866,33010868,33010874,33010877,33010890-33010892,33010897,33010906,33010914,33010916,33010921,33010925,33010931,33010936,33010947,33010949,33010958-33010959,33010969,33010975,33010979,33010987,33011000,33011005,33011010,33011021,33011023,33011031,33011038,33011046,33011055,33011058,33011068,33011077,33011083,33011096,33011104,33011118,33011120,33011140,33011160-33011161,33011166,33011178,33011205,33011213,33011218,33011224,33011228,33011238,33011241,33011250,33011262,33011272,33011287,33011293,33011307-33011308,33011333,33011342,33011351,33011358,33011369,33011371,33011396,33011405,33011416,33011430,33011434,33011442,33011461,33011466,33011472,33011479,33011489,33011493,33011496,33011503,33011513,33011517,33011529,33011533,33011542,33011544,33011552,33011557,33011568,33011580-33011581,33011597,33011612,33011614,33011634,33011638,33011647-33011648,33011660,33011672,33011678,33011681,33011694,33011697,33011702,33011706,33011722,33011732,33011737-33011738,33011749,33011760,33011764-33011765,33011769,33011772,33011776-33011777,33011794,33011803,33011814,33011820,33011830,33011833,33011850,33011855,33011870-33011871,33011902,33011910,33011917,33011934,33011948,33011953,33011964,33011978,33011981,33011986,33012016,33012025,33012027,33012032,33012037,33012042-33012043,33012053,33012060,33012073,33012078,33012096,33013571,33013591,33013690,33013715-33013716,33013730,33013762,33013786,33013794,33013802,33013806,33015218,33015239,33015258,33015270,33015299,33015309,33015312,33015327,33015335,33015347,33015372,33015375,33015395,33015415,33015436,33015449,33015466,33015494,33015518,33015526,33015533,33015573,33015584,33026873,33026875,33026883-33026885,33026888,33026893-33026894,33026897,33026900,33026904,33026909-33026910,33026912,33026916,33026920,33026922,33026925,33026927,33061251-33061252,33061257,33061268,33061275-33061276,33061281,33061289,33061293,33061301,33061306,33061312,33061317,33061324,33061330,33061335,33061341,33061347,33061352,33061354,33061360,33061367,33061371-33061372,33061379,33061385,33061387,33061393,33061397,33061400,33061406,33061411,33061416,33061420,33061422,33061430,33061436,33061438,33061442,33061450,33061454,33061460,33061469,33061472,33061480,33061483,33061490,33061495,33061498,33061504,33061507,33061513,33061522,33061525,33061529,33061537,33061542,33061549,33061552,33061558,33061565,33061567,33061575-33061576,33061587,33061593,33061596-33061597,33061609,33061611,33061614,33061622,33061624,33061631,33061634,33061641,33061645,33061650,33061655,33061661,33061673-33061674,33061679,33061683,33061692-33061693,33061706,33061708,33061713,33061720,33061727,33061739,33061744,33061749,33061753,33061763,33061769,33061778,33061786,33061795,33061799,33061809,33061812,33061819,33061830,33061840,33061843,33061858,33061861,33061866,33061871,33061877,33061883,33061893,33061896,33061903,33061908,33061917-33061918,33061927,33061935,33061947,33061950,33061957,33061963,33061974,33061976,33061987,33061992,33062000,33062005,33062014,33062022,33062032,33062039,33062045,33062058,33062060,33062069-33062070,33062073,33062087,33062092,33062101,33062104,33062116,33062122,33062130,33062140,33062150,33062163,33062167,33062171,33062179,33062192,33062196,33062207,33062212,33062218,33062226,33062236,33062247-33062248,33062259,33062264,33062273,33062279,33062289,33062293,33062298,33062309,33062315,33062324,33062330,33062344,33062362,33106658,33106684,33106694-33106695,33106708,33106725,33106739,33106774-33106775,33106778-33106781,33106783-33106785,33106799,33106802,33106804-33106805,33106808,33106813-33106814,33106817,33106822,33106830,33106832,33106836-33106837,33106840-33106842,33106852-33106853,33106859-33106860,33106862,33106866-33106867,33106871,33106873,33106877,33106880-33106883,33106886,33106889,33106898,33106900,33106912,33106918,33106921,33106923,33106932,33106934,33106937,33106952,33106955,33106962,33106966,33106972,33106979,33106986,33106989,33106995,33106997,33107000,33107003-33107004,33107008,33107010,33107015,33107017,33107025,33107033,33107036,33107043,33107045,33107048,33107055,33107060,33107066,33107068,33107080,33107089,33107093,33107097,33107115,33107118,33107123,33107130-33107131,33107137,33107145,33107160,33107169,33107181,33111713,33111724,33111741,33111753,33111775,33111793,33111807,33111832,33111846,33111856,33111877,33111890,33111916,33111936,33111953,33111980,33112000,33112024,33112053,33112079,33112108,33112136,33118177,33118185,33118198,33118208,33118217,33118230,33118244,33118256,33118277,33118293,33118305,33118313,33118326,33118337,33118349,33118354,33121426,33121445,33121455,33121458,33121481,33121520,33121552,33121582,33121585,33121612,33121679-33121680,33121690,33121716-33121717,33121726,33121773,33121796,33121829,33121873,33121881,33121889,33121900,33121915,33121919,33121959,33122009,33122034,33122045,33124445,33124527,33124542,33124562,33131155,33131168,33131181,33131210,33131221,33131236,33131254,33131271,33131287,33131306,33131325,33131345,33135975-33135978,33136000-33136004,33136025-33136028,33136030,33136055-33136059,33136082,33136084-33136085,33136088-33136089,33136107-33136111,33136113,33136126-33136127,33155885,33155910,33155924,33155951,33155974,33156003,33156018,33156034,33156055,33156076,33156094,33156102,33156115,33156126,33156153,33156172,33156178,33166213,33166217,33166234,33166247,33166256,33166264,33166274,33166284,33166296,33166307,33166318,33166327,33166339,33166355,33166364,33166373,33166376,33166383,33169689,33169697,33169717,33169752,33169757,33169768,33169782,33169803,33169808,33169825,33169840,33169855,33169871,33169885,33169894,33169912,33169921,33169936,33169945,33169958,33169972,33169993,33169998,33170005,33170011,33170021,33170030,33170034,33170042,33170048,33170058,33170062-33170063,33170066,33178873,33178890,33178904,33178924,33178944,33178962,33178979,33178995,33179016-33179017,33179036,33179044,33179063,33179076-33179077,33179101,33179116,33179134,33179148,33179167,33179184,33179187,33179204,33179218,33179234,33179254,33179260,33179277,33179293,33179313,33179330,33179343,33179349,33179363,33179383,33179398,33179410,33179425,33179446,33179466,33179489,33179505,33179512,33179532,33179552,33179563,33179581,33179583,33179605,33179635,33179660,33179680,33179702,33179724,33179750-33179751,33179779,33179804,33179827,33179855,33179864,33179903,33179931,33179960,33179991,33180023,33180053,33180081,33180109,33180138,33180143,33184490,33184500,33184506,33184513,33184523,33184534,33184542,33184553,33184559,33184598,33184616,33184626,33184632,33184648,33184652-33184653,33184657,33184662,33184667,33184677,33184680-33184682,33184700,33184702-33184703,33184705,33184710-33184711,33184718,33184729-33184730,33184732,33184736,33184747,33184757,33184764,33184774,33184779,33184781,33184783,33184792,33184801,33184809,33184811,33184813-33184814,33184819,33184831-33184832,33184840,33184844-33184845,33184847,33184849,33184858,33184861,33184878,33184889,33184891,33184902,33184913,33184918,33184925,33184942-33184943,33184947,33184951,33184954-33184955,33184978,33184986,33184996,33185010,33185021,33185039,33185041,33185046,33185048,33185050,33185052,33185069,33185083-33185084,33185093-33185094,33185100,33185111,33185118,33185123,33185126,33185129,33185133,33185144,33185147-33185148,33185152,33185165,33185173,33185181,33185184,33185186,33185188,33185194,33185197,33185199,33185201,33185203,33185211,33185227,33185232-33185233,33185237,33185242,33185245-33185246,33185251,33185258,33185278,33185284,33185294,33185297,33185300,33185313,33185329,33185336,33185352-33185353,33185360,33185362,33185364,33185367-33185368,33185376-33185377,33185379,33185387,33185396,33185416,33185424,33185430,33185434-33185435,33185439,33185444-33185446,33185453-33185454,33185468,33185480,33185482,33185490,33185492,33185507,33185511,33185517-33185518,33185544,33185557-33185558,33185567,33185589,33185609,33185627,33185661,33185670,33185676,33185706,33185717,33185722,33185724,33185728,33185733,33185742,33185744,33185749-33185750,33185765,33185771-33185772,33185775,33185780,33185784-33185785,33185790,33185792,33185798,33185800,33185804,33185811,33185815,33185824,33185830,33185832,33185835-33185836,33185845-33185846,33185849,33185855,33185857,33185860,33185862,33185865,33185868,33185874-33185876,33185881,33185887-33185888,33185891-33185893,33185910,33185916,33185919,33185926,33185929,33185931,33185938-33185940,33185943,33185948,33185952,33185954,33185963,33185966-33185967,33185982,33185987-33185988,33185994,33185999,33186002,33186005,33186007,33186009,33186011,33186015,33186017-33186018,33186020,33186030,33186036,33186041,33186046,33186060,33186065,33186067,33186074,33186090,33186093,33186102,33186104-33186105,33186109,33186113,33186115,33186140,33186147,33186152,33186159,33186164,33186181,33186188,33186196,33188386,33188408,33188442,33188483,33188502,33188563,33188567,33188585,33188594,33188639,33188655,33188661,33188683,33188699,33188713,33188725,33188733,33188755,33188758,33188761-33188762,33188809,33188819,33188823-33188824,33188841,33188847,33188859,33188907,33188916,33188931,33188945-33188946,33188957,33188962,33188990-33188991,33189001,33189003,33189005,33189029,33189044,33189058,33189072,33189094,33189121,33189144,33189146,33189150,33189157,33189183-33189184,33189196,33189205,33189207,33189211,33189227,33189236,33189239,33189257,33189260,33189264,33189292,33189305,33189317,33189319,33189329,33189335,33189342,33189347,33189350,33189353,33189376,33189380,33189385,33189389,33189391-33189392,33189413,33189415-33189416,33189420,33189434,33189441,33189446,33189477,33189483,33189496,33189499,33189508,33189510-33189511,33189513,33189527,33189537,33189545-33189546,33189548,33189557,33189565,33189580-33189581,33189601-33189602,33189614-33189615,33189626,33189647-33189648,33189650,33189656,33189664,33189679,33189689-33189691,33189706,33189729,33189734-33189736,33189742-33189743,33189751,33189764,33189774,33189794,33189804,33189815-33189816,33189823,33189832,33189835,33189838,33189843-33189844,33189847,33189859,33189864,33189870,33189886,33189889,33189893,33189903,33189907,33189909-33189910,33189912,33189923,33189925,33189947,33189956,33189968-33189969,33189981,33189990-33189991,33189996-33189997,33190002,33190010-33190011,33190027,33190035,33190038,33190052,33190057,33190067,33190078,33190083,33190109,33190115,33190118,33190126,33190132,33190145,33190155,33190167,33190183,33190186,33190193,33190200,33190214,33190222,33190236,33190252,33190254,33190263,33190276,33190284,33190291,33190295,33190305,33190308,33190313,33190317,33190321,33190332,33190345,33190365,33190369,33190373,33190380,33190392,33190406,33190426,33190428,33190432,33190460,33190468,33190478,33190483-33190484,33190503,33190510,33190512,33190516,33190518,33190526,33190534,33190551,33190557,33190573,33190580,33190602,33190604-33190605,33190631,33190634,33190636,33190653-33190654,33190661,33190680,33190698,33190705,33190724,33190730,33190742-33190743,33190766,33190800,33190803,33190822,33190830,33190837,33190840,33190892,33190901,33190904,33190912,33190936,33190938,33190963,33190973,33190998,33191004,33191012,33191028,33191030,33191062,33191074,33191093,33191095,33191112,33191137,33191142,33191158,33191168,33191171,33191227,33191246,33191248,33191261,33191266,33191269,33191286,33191289,33191295,33191310,33191319,33191337,33191354,33191367,33191393,33191397,33191428,33191438-33191439,33191444,33191453,33191455,33191494,33191509,33191514,33191516-33191517,33191526,33191536-33191537,33191540,33191547,33191549,33191559,33191578,33191584,33191591,33191599,33191605,33191616-33191617,33191619,33191624,33191637,33191639,33191651,33191665,33191672,33191674,33191682,33191687,33191691,33191693,33191701,33191703,33191711,33191720,33191732,33191734,33191738-33191739,33191757,33191767,33191774,33191776,33191778,33191793,33191802,33191810,33191816-33191818,33191830,33191839,33191843,33191854,33191864-33191865,33191871,33191877,33191880,33191887,33191891,33191898,33191906,33191916,33191918,33191925,33191938,33191940,33191942-33191943,33191954,33191968,33191986,33191992,33194188,33194217,33194227,33194231,33194242,33194244,33194247,33194249,33194255,33194259,33196930,33196994,33197015,33197028,33197066,33197081,33197105-33197106,33197111,33197116,33197118,33197131,33197135,33197149-33197150,33197158,33197167-33197168,33197203,33197206,33197229,33197239-33197240,33197247,33197263,33197281,33197284,33197294,33197296,33197300,33197309,33198557-33198559,33198586,33198589,33198591,33198595,33198597,33198626-33198627,33199225,33199276,33199299,33199302,33199304-33199305,33199308,33199326-33199328,33199335,33199337,33199339,33199341,33199344-33199345,33199348,33199367,33199371-33199372,33199374-33199376,33199382,33199387,33199391,33199393-33199394,33199403,33199406,33199410,33199417,33199419,33199421,33200434,33200444,33200446,33200458,33200462,33200472,33200479-33200480,33200490,33200516,33200522,33200524-33200527,33200530,33200534,33200537,33200540,33200542,33200544,33200547,33200551,33200558-33200559,33200562,33206160,33206167,33206180,33206189,33206192,33206206,33206255,33206269,33206281,33206297,33206304,33206314,33206327,33206344,33206357,33206367,33206373,33206400,33206406,33206412,33206416,33206421,33206430,33206444,33206449,33206470,33206487,33206524,33206527,33206555,33206571,33206585,33206610,33206620,33213281-33213283,33213323,33213340,33213351,33213356,33213359,33213375,33213384,33213388,33213410,33213415,33213418,33213423-33213424,33213426,33213429-33213430,33213436,33213443,33213447,33213453-33213454,33213461-33213462,33213467,33213472-33213473,33213477,33213482,33213486,33213490,33213498-33213499,33213501,33213510,33213524-33213525,33213534,33213536,33213540,33213543-33213544,33213547-33213548,33213554,33213556,33213558,33213561,33213567,33213570,33213572,33213580,33213586,33213590,33213596,33213598-33213600,33213602,33213606-33213607,33213610,33213612-33213613,33213615,33213623-33213624,33213628,33213631,33213634-33213635,33213637-33213638,33213644,33213647,33213649,33213653,33213655,33213658,33213660,33213662,33213665-33213666,33213669,33213671,33213679,33213681,33213686-33213689,33213691,33213693-33213694,33213697,33213700,33213703,33213711,33213716,33213718-33213719,33213728,33213734,33213736,33213752,33213754,33213761-33213762,33213770,33213774,33213776,33213778,33213780-33213781,33213784,33213795,33213800,33213802,33213805,33213808,33213810,33213812,33213822,33213826,33213833,33213835-33213836,33213846-33213847,33213852-33213855,33213857-33213860,33213866-33213867,33213876,33213878,33213880,33213887,33213892,33213895,33213897,33213903,33213908,33213912,33213914,33213918,33213920,33213922-33213923,33213925,33213930-33213931,33213935,33213939-33213941,33213946-33213947,33213954,33213957,33213961,33213974,33213977-33213978,33213982,33213993-33213995,33213999,33214005-33214008,33214018-33214019,33214021-33214022,33214024-33214027,33214031,33214039,33214041,33214043,33214049-33214050,33214055,33214061,33214066-33214067,33214071,33214084,33214088,33214091,33214093-33214094,33214103,33214108,33214110,33214114-33214115,33214119,33214124,33214126,33214130,33214133-33214134,33214136-33214137,33214139,33214144,33214146-33214148,33214152,33214160-33214162,33214167,33214173,33214176,33214179-33214180,33214184,33214188,33214190,33214194,33214197-33214198,33214202-33214204,33214209,33214214-33214215,33214217,33214223-33214224,33214227,33214231-33214232,33214234,33214236,33214238,33214247,33214251-33214255,33214264,33214273,33214279-33214280,33214283,33214285,33214301-33214303,33214305,33214311,33214317,33214322,33214326,33214335,33214344,33214346,33214349,33214361,33214363-33214364,33214367,33214370,33214372-33214373,33214377,33214387,33214389,33214396,33214400,33214417,33214419,33214428,33214436,33214446,33214449,33214481,33214492,33214507,33214515,33214535,33215499,33215614,33215625,33215665-33215666,33215679,33216903,33216905,33216921-33216922,33216924-33216925,33216927,33216932,33216935,33216937,33216946,33216951,33216955,33216959,33216961,33216966,33216972-33216973,33216976-33216977,33216986,33216999,33217001,33217007,33217017-33217019,33217024,33217027,33217029,33217034,33217036,33217041,33217047,33217054,33217057-33217059,33217064,33217071,33217080,33217082,33217086,33217090,33217097-33217098,33217106,33217108,33217110,33217119,33217127,33217129-33217130,33217132,33217136,33217165,33217167,33217169-33217170,33217174-33217175,33217181,33217183,33217192,33217194,33217202-33217203,33217213,33217217,33217219,33217224-33217225,33217228,33217231,33217238,33217244-33217245,33217251,33217254-33217255,33217263,33217266,33217268,33217277,33217279,33217284,33217286-33217287,33217293,33217295,33217298,33217303,33217306,33217316,33217320-33217322,33217326,33217330,33217333,33217345,33245998,33246010,33246012,33246014,33246018-33246019,33246024-33246025,33246029-33246030,33246032,33246038,33246042,33246048,33246050-33246052,33246060-33246061,33246063-33246064,33246068-33246069,33246075,33246080,33246082,33246085,33246089,33246093,33246096,33246098-33246099,33246101,33246103-33246104,33246108,33246113,33246115,33246117,33246119,33246122-33246124,33246126,33246129,33246134,33246136,33246138-33246139,33246141,33246143,33246145,33246150,33246155,33246157-33246158,33246161,33246164,33246168,33246171-33246172,33246174-33246175,33246179,33246181,33246184,33246186,33246190,33246193,33246196,33246198-33246199,33246202,33246205,33246209,33246212,33246215,33246218-33246219,33246222,33246225-33246226,33246230,33246232,33246235,33246237,33246240,33246246-33246247,33246250,33246253,33246256,33246262-33246264,33246266,33246269,33246273,33246277,33246281,33246283-33246284,33246288,33246291,33246294,33246297,33246300,33246303,33246305,33246307,33246309,33246313,33246315,33246318,33246322,33246325,33246327,33246329,33246331,33246337,33246340-33246342,33246345,33246348,33246351,33246353-33246354,33246358,33246360,33246363,33246367-33246368,33246370,33246373,33246378-33246379,33246384,33246386,33246389,33246392,33246395,33246397,33246403-33246405,33246409,33246413,33246417,33246420,33246424,33246426,33246430,33246432,33246434,33246437,33246443-33246444,33246446,33246452-33246453,33246457-33246459,33246461,33246466,33246468,33246470,33246473,33246475,33246477-33246478,33246483-33246485,33246493,33246495,33246499-33246500,33246503,33246505,33246508,33246510-33246511,33246519-33246520,33246523,33246526,33246532,33246554,33246557-33246558,33246560,33246566,33246568,33246573,33246575-33246576,33246578,33246582,33246585,33246592,33246594,33246597,33246600,33246603,33246605,33246608,33246614,33246616-33246617,33246619,33246621,33246624,33246628,33246630,33246632-33246633,33246638,33246640,33246643,33246646,33246656,33246660,33246662,33246668,33246671,33246674,33246677,33246679,33246681,33246686,33246690,33246692,33246699-33246701,33246704,33246712,33246714,33246717,33246721,33246724,33246729,33246731,33246733,33246736,33246742,33246744,33246748,33246751,33246754,33246756,33246761,33246764,33246769,33246771-33246772,33246775,33246778-33246779,33246786,33246788,33246795,33246797,33246800-33246801,33246806-33246807,33246809,33246816,33246818,33246820,33246826-33246827,33246830,33246834,33246836,33246839-33246840,33246844,33246847,33246850,33246853,33246856,33246860,33246865,33246868,33246871,33246878-33246879,33246881,33246886,33246888,33246891,33246894,33246896,33246901,33246903-33246904,33246910,33246916,33246918,33246922,33246924,33246927,33246930,33246935,33246938,33246941,33246943-33246944,33246947,33246950,33246952,33246955,33246959,33246962,33246965,33246968-33246969,33246973,33246976,33246979,33246983,33246985,33246988,33246991,33246993,33246995,33247000-33247001,33247003,33247006,33247009,33247012,33247018-33247019,33247025,33247029,33247032,33247035-33247036,33247038,33247043,33247046,33247050,33247055,33247058,33247062,33247065-33247066,33247068-33247069,33247072,33247075,33254085,33254087,33254091,33254095,33254101,33254104,33254106,33254110,33254113,33254118,33254121,33254124,33254128,33254132,33254134,33254139,33254141,33254144,33254150,33254154,33254157,33254161,33254163,33254167,33254169,33254416,33254481,33254508,33254521,33254541,33259572,33259577,33259636,33259684-33259685,33259687,33259692,33259706,33259711,33267973,33267996,33270470,33270482,33270497,33270528,33270535,33270539,33270545,33270565,33270571,33270595,33270601,33270623,33271224,33271235,33271245,33271258,33271276,33271295,33271310,33271318,33271346,33271352,33271361,33292238-33292239,33292257,33292263,33292265,33292270,33292272,33292274,33299024,33299030,33299041,33299048,33299051,33299060,33299064,33299070,33299080,33299107,33299114,33299119,33299132,33299136,33299141,33299150,33299166,33299171,33299191,33299198,33299212,33299217,33299223,33299252,33299260,33299271,33299281,33299288,33299296,33299311,33299318,33299320,33299327,33299332,33299340,33299345,33299348,33299357,33299363,33299367,33299376,33299386,33299397,33299404,33299409,33299418,33299431,33299435,33299446,33299454,33299458,33299462,33299469,33299482,33299488,33299504,33299506,33299516,33299523,33299531,33299548-33299549,33299565,33299578,33299582,33299603,33299614,33299625,33299632,33299656,33299658-33299659,33299677,33299683,33299692,33299695,33299709,33299720,33299728,33299741,33299752,33299756,33299775-33299776,33299790,33299795,33299805,33299822,33299836,33299847,33299850,33299868,33299872,33299887,33299901,33299916,33299934-33299935,33299940,33299951,33299968,33299978,33299986,33299990,33300007,33300010,33300049,33300053,33300098,33300102,33300113,33300138,33300145,33300160,33300182,33300189,33300202,33300216,33300241-33300242,33300296,33300305,33300312,33300321,33300332,33300373,33300385,33300416,33300429,33300432,33300444,33300466,33300490,33300498,33300506,33300522,33300551,33300559,33300618,33300631,33300656,33300662,33300672,33300681-33300682,33300716,33300754,33300775,33300796,33300815,33300831,33300841,33300869,33300902,33300911,33300919,33300928,33300977,33300986,33300997,33301016,33301042-33301043,33301069,33301092,33301119,33301143,33301158,33301170,33301183,33301208,33301214,33301225,33301261,33301264,33301267,33301305,33301314,33301331,33301344,33301386,33301407-33301408,33301413,33301420,33301453,33301472,33301509,33301530,33301535,33301539,33301599,33301609,33301617,33301657,33301660,33301683,33301693,33301741,33301760,33301762,33301778,33301800,33301808,33301837,33301852,33301899,33301919,33301935,33301969,33301975-33301976,33301995,33301998,33302012,33302023,33302070,33302091,33302117,33302130,33302142,33302159,33302181,33302196-33302197,33302225,33302240,33302245,33302257,33302259,33302291,33302298,33302305,33302321,33302327,33302335,33302359,33302364,33302374,33302386,33314553,33314562,33314570,33314575,33314584,33314592,33314598,33314605,33314607,33314614,33314624,33314631,33314638,33314643,33314652,33314663,33314668,33314675,33314682,33314688,33314698,33314706,33314709,33314733,33314737,33314745,33314748,33314860,33314865,33314876,33314887,33314890,33314898,33314905,33314913,33314921,33314930,33314936,33314943,33314953,33314963,33314968,33314970,33314976-33314977,33314985,33314997,33315005,33315010,33315016,33315026,33315033,33315037,33315047,33315059,33315064,33315072,33315076,33315083,33315096,33315115,33315119,33315137,33315139,33315154,33315156,33315161,33315175,33315186,33315191,33315203,33315208,33315215,33315221,33315225,33315230,33315240,33315250,33315255,33315262,33315274,33315284,33315290,33315297,33315305,33315307,33315314,33315325,33315332,33315343,33315350,33315355,33315362,33315365,33315376,33315384,33315388,33315396,33315404,33315423,33315427,33315437-33315438,33315444,33315452,33315460,33315466,33315473,33315479,33315491,33315494,33315503-33315504,33315513,33315517,33315526,33315534,33315538,33315551,33315553,33315562,33315575,33315588,33315592,33315601,33315607,33315612,33315619,33315629,33315643,33315650,33315656,33315668,33315680,33315690,33315694,33315701,33315708,33315714,33315719-33315720,33315727,33315745,33315751,33315755,33315768,33315773,33315782,33315786,33315792,33315802,33315810,33315814,33315825,33315828,33315834,33315839,33315852,33315856,33315865,33315877,33315887,33315897,33315902,33315911,33315916,33315928,33315938,33315944,33315958,33315962,33315976,33315984,33315994,33315998,33316010,33316013,33316023,33316029,33316034,33316040,33316049,33316060,33316065,33316069,33316079,33316087,33316100,33316110,33316116,33316130,33316137,33316143,33316149,33316159,33316162,33316174-33316175,33316183,33316190,33316198,33316205,33316211,33316218,33316227,33316242,33316251,33316253,33316266,33316275,33316284,33316297,33316301,33316314-33316315,33316324,33316331,33316344,33316356,33316366-33316367,33316376,33316382,33316399,33316403,33316415,33316427,33316431,33316443,33316451,33316458,33316467,33316479,33316489,33316496,33340163,33340204,33340209,33340228-33340229,33340241,33340243,33340260,33340263,33340271,33340288-33340289,33340318,33340322,33340331-33340332,33340335-33340337,33340343,33340354,33340385,33340389,33340403,33340411,33340413,33340421,33340424,33340430,33340436,33340439,33340449,33340457,33340462-33340463,33340467,33340480,33340486,33340489,33340501,33340504,33340538-33340540,33340543,33340549,33340556,33340565,33340573,33340576,33340579,33340593-33340594,33340615,33340627,33340632,33340634,33340642,33340646,33340656,33340660,33340663,33340665,33340673,33340679,33340698-33340700,33340707,33340710,33340727,33340761,33340790,33340833,33340850,33340858,33340867,33340880,33340895,33340926,33340928,33340933,33340952,33340954,33340961,33340964,33340973,33340985,33340990,33341010,33341012,33341017,33341068,33341070,33341090,33341096,33341113,33341122,33341127,33341129,33341136,33341154,33341161,33341167,33341184,33341191,33341204,33341218,33341227,33341234,33341263,33341281,33341289,33341292,33341300,33341304,33341308,33341311,33341315,33341322,33341326,33341352,33341356,33341363,33341376,33341380,33341388,33341390,33341408-33341409,33341418,33341422-33341423,33341442,33341466,33341468,33341471,33341476,33341478,33341485,33341500,33341503,33341509,33341511,33341524,33341530,33341534,33341551,33341563-33341564,33341577,33341582,33341586,33341592,33341594,33341612,33341615,33341633,33341643,33341646,33341650,33341657-33341658,33341666,33341671,33341684,33341693,33341697,33341700,33341702,33341707,33341727,33341735,33341740,33341745,33341770,33341772-33341774,33341785,33341787,33341795,33341807,33341809,33341814,33341822,33341828,33341839,33341849-33341850,33341857,33341870,33341883,33341885,33341900,33341905,33341912,33341916,33341918,33341923,33341936,33341939,33341946,33341948-33341949,33341963,33341991-33341992,33342007,33342022-33342023,33342028,33342030,33342044-33342045,33342049,33342058,33342064,33342069-33342070,33342079,33342092,33342114-33342115,33342122,33342131,33342150,33342159,33342161-33342162,33342180,33342196,33342198,33342212-33342213,33342236,33342238,33342246,33343711,33343713,33343728,33343745,33343749,33343760,33343781,33343786,33343799,33343803,33343820,33343830,33343836,33343848,33343855,33343866,33343876,33343882,33343899,33343908,33343933,33343951,33343955,33343973,33343986,33343988,33344015,33344022,33344043,33344052,33344059,33344073,33344090,33344094,33344113,33344127,33344149,33344156,33344176,33344234,33344245,33344251,33344273,33344290,33344297,33344324,33344341,33344356,33344366,33344385,33344392,33344426,33344437,33344451,33344463,33344483,33344500,33344514,33344535,33344547,33344568,33344584,33344600,33344646,33344654,33344656,33344674,33344687,33344692,33344709,33344721,33344739,33344744,33344763,33344767,33344776,33344789,33344804,33344812,33344814,33344825,33344837,33344848,33344852,33344858,33344864,33344867,33344872,33344880,33344887,33344890,33344894-33344895,33344898,33344902,33344906,33344908,33344911,33344913,33344916,33344919,33344921,33344924,33344927,33344930,33344932,33344935-33344936,33344939,33344942,33344944,33344946,33344948,33344951,33344954,33344956,33344959,33344961,33344964,33344966,33344969,33344972,33344974,33344977,33344980,33344983,33344985,33344988,33344990-33344991,33344994,33345001-33345002,33345009,33345019,33345031,33345037,33345053,33345055,33345068,33345076,33345083,33345092,33345094,33345104,33345117,33345131,33345139,33345146,33345153,33345166,33345172,33345183,33345193,33345195,33345200,33345206,33345214,33345221,33345229,33345237,33345245,33345257,33345261,33345266,33345270,33345275,33345277,33345279,33345281-33345282,33345288,33345290,33345295,33345303,33345305-33345306,33345319,33345324,33345328,33345333,33345337,33345347,33345354,33345359,33345365,33345368,33345372,33345375,33345381,33345391,33345394,33345402,33345429,33345436,33345438,33345442,33345449,33345454,33345461,33345468,33345478,33345488,33345491,33345502-33345503,33345511,33345520,33345524,33345557,33345572,33345579,33345586,33345592,33345601,33345608,33345610,33345623,33345628,33345640,33345645,33345651,33345662,33345673,33345682,33345691,33345723,33345728,33345734,33345744,33345750,33345761,33345768,33345776,33345783,33345791,33345797,33345803,33345812,33345821,33345827,33345835,33345845,33345873,33345887,33345897,33345902,33345913,33345920,33345926,33345934,33345939,33345947,33345953,33345959,33345967,33345973,33345979,33345984,33345988,33345993,33346026,33346029,33346033,33346035-33346036,33346040,33346047,33346050,33346054,33346060,33346062,33346067,33346073,33346079,33346084,33346091,33346094,33346099,33346129,33346136,33346139,33346146,33346153,33346157,33346167,33346171,33346185,33346192,33346197,33346205,33346216,33346225,33346230,33363379,33363431,33363521,33363603,33363661,33363712,33363876,33367912,33367922-33367923,33367927,33367936,33367940,33367944,33367946,33367949-33367952,33367957,33367960,33367964-33367965,33367967,33367971,33367975,33367978,33367980,33367984,33367986,33367990-33367992,33367994,33367997,33368001,33368004,33368015,33368021,33368024,33368036,33368046,33368048-33368050,33368052,33368054,33368060,33368064-33368065,33368070,33368073,33368076,33368078,33368083,33368088-33368089,33368091,33368094,33368099,33368110-33368111,33368120-33368121,33368125,33368132-33368133,33368141,33368143,33368154-33368156,33368167,33368172,33368174,33368176,33368180-33368181,33368184,33368186,33368193,33368196,33368210,33368212,33368220,33368222,33368226,33368230,33368233,33368235-33368236,33368247,33368249,33368253,33368255,33368259,33368272-33368273,33368287,33368295,33368297,33368303,33368306,33368308,33368319,33368329,33368334,33368341,33368359,33368361-33368362,33368367-33368368,33368373,33368375,33368382,33368392,33368396,33368410,33368433,33368436,33371666,33371682,33372943,33372967,33373014,33373091,33373106,33373115,33373119,33373159,33373165,33373190,33373205,33373207,33373227,33373229,33373256,33373277-33373278,33373281,33373284,33373287,33373291,33373297,33373304,33373322,33373327,33373333,33373354,33373370,33373373-33373374,33373397,33373421,33373426,33373429,33373442-33373443,33373447,33373449,33373451,33373456,33373462,33373483,33373636,33373656,33390255,33390286,33390311,33390347,33390362,33390386,33390397,33390410,33390428,33390450,33390490,33390509,33391920,33391924-33391925,33391931,33391933,33391937,33391939,33391941,33391943,33391945,33391948,33391952,33391954,33391959-33391960,33391965,33391968,33391971,33391973,33391975,33391977,33391983,33391988,33391993,33391997,33392001,33392007,33392010,33392017,33392025,33392031,33392036,33392048,33392053,33392058,33392062,33392071,33392075,33392077,33392085,33392091-33392092,33392094,33392096,33392102,33392104,33392109,33392120,33392125,33392129,33392135,33392140,33392142,33392147,33392153,33392159,33392161,33392170,33392174,33392178,33392184,33392190,33392198,33392200,33392209,33392212,33392215,33392219,33392227,33392233,33392240,33392250,33392256,33392259,33392264,33392274,33392283,33392288,33392294,33392310,33392315,33392321,33392329,33392341,33392348,33392354,33392367,33392379,33392388,33392397,33392410,33392417,33392425,33392434,33392449-33392450,33392462,33392470,33392481,33392492,33392498,33392510,33392522,33392527,33392536,33392553,33392563,33392571,33392590,33392592,33392600,33392609,33392621,33392630,33392641,33392648,33392664,33392670,33392679,33392691,33392704,33392711,33392720,33392735,33392746,33392751,33392764,33392774,33392785,33392792,33392808,33392813,33392826,33392834,33392847,33392857,33392862,33392877,33392883,33392894,33392903,33392916,33392921,33392937,33392946,33392957,33392962,33392971,33392979,33392988,33392997,33393006,33393012,33393018,33393029,33393040,33393046,33393055,33393064,33393074,33393078,33393082,33393090,33393100,33393107,33393111,33393120,33393130,33393133,33393142,33393153,33393158,33393163,33393174,33393178,33393186,33393192,33393209,33393216,33393222,33393233,33393239,33393246,33393250,33393260,33393265,33393272,33393278,33393288,33393292,33393304,33393309,33393325,33393329,33393342,33393350,33393360,33393365,33393373,33393380,33393390,33393393,33393408,33393413,33393416,33393421,33393431,33393433,33393435,33393443,33393449,33393454,33393463,33393472,33408165,33408169,33408173,33408175,33408182,33408186,33408192,33408195,33408199,33408206,33408212,33408217,33408225,33408228,33408239,33408243,33408250,33408253,33408258,33408265,33408269,33408276,33408280,33408284,33408287,33408292,33408294,33408299,33408303,33408309,33408315,33408319,33408322,33408325,33408332-33408333,33408336,33408339,33408347,33408349,33408352,33408354,33408360,33408362,33408368,33408371,33408377,33408381,33408384,33408386,33408391,33408394,33408397,33408404,33408407,33408410,33408412,33408420,33408424,33408426,33408428,33408431,33408436,33408441,33408443,33408446,33408451,33408453,33408460,33408466,33408472,33408482,33408487,33408491,33408496,33408502,33408509,33408515,33408521,33408526,33408530,33408535,33408542,33408548-33408549,33408557,33408561,33408567,33408572,33408579,33408583,33408588,33408592,33408597,33408605,33408610,33408615,33408618,33408622,33408624,33408632,33408634,33408641,33408645,33408649,33408654,33408660,33408662,33408667,33408673,33408676,33408683-33408684,33408691,33408696,33408699,33408710,33408712,33408716,33408722,33408726,33408735,33408742-33408743,33408747,33408754,33408758,33408762,33408772,33408782,33408792,33408798,33408802,33408807,33408811,33408815,33408818,33408827,33408831,33408835,33408841,33408849,33408854,33408866,33408872,33408878,33408882,33408886,33408892,33408898,33408903,33408907,33408912,33408922,33408927,33408937,33408943,33408953,33408955,33408962,33408967,33408973,33408982,33408991,33408996,33409002,33409005,33409012,33409021,33409028,33409035,33409044,33409048,33409054,33409063,33409070,33409076,33409084,33409094,33409098,33409107,33409116,33409124,33409134,33409143,33409149,33409156,33409162,33409172,33409184,33409197,33409204,33409211,33409216,33409218,33463933,33463957,33463959,33463961,33463963,33463965,33463969,33463971,33463974,33463977,33463980,33463984,33463987,33463995-33463996,33464000-33464001,33464006-33464008,33464011,33464015,33464019,33464023,33464026,33464029-33464030,33464035,33464037-33464038,33464040,33464043,33464048,33464051-33464053,33464059-33464061,33464064,33464066,33464073,33464076,33464079,33464083,33464086,33464088-33464089,33464092-33464094,33464100,33464104,33464108,33464112-33464114,33464116,33464124,33464127,33464130,33464133,33464138,33464140,33464142-33464145,33464149,33464152,33464154,33464157,33464165,33464168-33464170,33464175,33464178,33464182-33464183,33464185,33464188-33464191,33464196,33464202,33464205,33464212,33464214,33464217,33464219,33464221,33464226,33464234,33464237,33464241,33464246-33464247,33464249,33464251-33464252,33464255,33464258,33464265,33464272,33464275-33464276,33464281,33464284,33464287,33464290,33464293,33464298,33464300,33464304-33464305,33464308,33464315,33464322,33464327-33464328,33464334,33464339,33464342,33464344,33464351,33464356-33464357,33464369,33464373,33464375,33464377,33464382,33464388,33464392,33464397,33464402,33464405,33464407,33464413,33464415,33464422,33464427-33464428,33464431,33464437-33464438,33464443,33464446,33464449,33464453,33464462,33464467,33464469,33464480,33464487,33464492,33464508,33464514-33464515,33470192,33470210,33470214,33470232,33470242,33470246,33470250,33470258-33470259,33470276,33470281,33470291,33470296,33470301-33470302,33470308-33470309,33470315,33470324,33475688-33475689,33475720,33475724,33475745,33475806,33475810,33475814,33475919,33475938,33475987,33475995,33476047,33476091,33476128,33476144,33476203,33476209,33476261,33476280,33476329,33476337,33476357,33476373,33476410,33476442,33476462,33476476,33476553,33476567,33476586,33476647,33476659,33476695,33476719-33476720,33476739,33476767,33476789,33476809,33476819,33476832,33476852,33476859,33476877,33476913,33476939,33476948,33476953,33477032,33477048,33477091,33477113,33477129,33477165,33477170,33477183,33477192,33477215,33477232,33477248,33477266,33477298,33477327,33477339,33477348,33477355,33477393,33477418,33477436,33477464,33477469,33477480,33477491,33477494,33477497,33477509,33477515,33477529-33477530,33477545,33477563,33477572,33477587,33477592,33477631,33477633,33477655,33477679,33477694,33477718,33477723,33477769,33477776,33477806,33477808,33477810,33477824,33477826,33477839,33477853,33477885,33477903,33477908,33477913,33477931,33477943,33477957,33477981,33477998,33478003,33478014,33478063,33478086,33478127,33478137,33478161,33478169,33478172,33478183,33478185,33478208,33478213,33478220,33478243,33478291,33478298,33479996,33480003,33480013,33480016,33480046,33480059,33480066,33480087,33480092,33480097,33480124,33480130,33480139,33480160,33480169,33480176,33489965,33490024,33490038,33490042,33490049,33490058,33490066,33490079,33490092,33490095,33490097,33490099,33490109,33490113-33490114,33490118,33490132,33490134,33490160,33490162,33490170,33490172,33490174,33490182,33490185,33490195,33490200,33490203,33490206,33490215-33490216,33490219,33490230,33490237,33490246,33490248,33490265,33490267,33490290,33490292,33490314,33490335,33490354,33490361,33490371,33490381,33490384,33490401-33490402,33490413,33490415,33490418,33490424-33490425,33490431,33490433,33490444-33490445,33490451,33490459,33490471,33490474,33490478,33490480,33490491,33490496,33490506,33490512,33490519,33490531,33490547,33490549,33490574,33490577,33490580,33490589-33490590,33490610,33490612,33490615-33490616,33490620,33490623,33490635,33490638,33490657,33490660,33490663,33490672,33490706,33490717,33490730-33490731,33490777,33490804-33490806,33490822,33490827,33490842,33490846,33490850,33490873,33490888,33490896-33490898,33490902,33490917,33490945,33490947,33490952,33490954-33490955,33490969-33490971,33490991,33491008,33491025,33491028,33491032,33491046,33491049,33491057,33491059,33491085,33491090,33491092,33491095,33491103,33491105,33491118,33491125,33491135,33491140,33491149,33491153-33491154,33491161,33491178,33491184,33491187,33491189,33491191,33491203,33491222,33491240,33491246,33491254,33491256,33491290,33491295,33491300,33491308,33491314,33491318,33491320,33491326,33491360,33491363,33491389,33491424,33491435,33491438,33491440,33491480,33491486,33491550,33491557,33491579,33491667,33491755,33491831,33491918,33492041,33492053,33492122,33492201,33492220,33492261,33492266,33492271,33492299,33492312,33492351,33492376,33492489,33492515,33492522,33492533,33492564,33492679,33492701,33492707,33492942,33500784,33500824,33500827,33500847,33500857-33500858,33500862,33500865,33500867,33500883,33500891,33500917,33503973,33503981,33504077,33504088,33513261,33513285-33513286,33513289,33513298,33513305,33513316,33513318,33513324,33513332-33513333,33513337,33513342,33513350,33513364,33513375,33513396,33513399,33513408,33513416,33513419,33513422,33513429,33513432,33513446-33513447,33513456,33513460,33513469,33513471,33513484,33513492,33513496,33513524,33513540,33513552,33513557,33513562,33513571,33513585,33513587,33513596,33513602,33513610,33513616,33513626,33513628-33513629,33513631,33513634,33513640,33513655,33513657,33513661-33513662,33513666,33513672,33513676,33513678,33513680-33513681,33513688,33513700,33513710-33513711,33513714,33513718,33513729,33513742,33513747,33513750,33513759,33513783,33513796,33513814,33513824,33513826-33513827,33513836,33513843-33513844,33513847,33513862,33513879,33513888-33513889,33513895,33513899,33513907,33513911,33513916-33513917,33513922,33513931,33513935,33513938,33513948,33513951,33513955,33513967,33513972-33513974,33513982,33513996,33514006,33514010,33514018,33514022,33514033,33514050,33514060,33514063,33514067,33514075,33514078,33514081,33514093,33514096,33514099,33514102,33514120,33514130,33514132,33514136-33514137,33514158,33514182,33514185-33514186,33514189,33514210-33514211,33514215,33514219,33514226,33514228,33514233-33514234,33514238,33514240,33514247,33514249,33514253,33514268,33514272-33514274,33514280,33514286,33514311,33514326,33514330,33514334,33514351,33514354-33514355,33514359,33514366,33514368-33514369,33514371,33514378-33514379,33514381-33514382,33514387-33514388,33514391,33514393-33514394,33514408,33514419,33514428,33514433,33514444,33514446,33514455,33514457,33514467,33514474,33514479,33514484,33514494-33514495,33514503-33514504,33514508,33514511,33514522,33514531,33514533,33514541,33514543,33514548,33514553,33514555-33514556,33514563,33514568,33514571,33514573,33514578,33514582,33514591,33514598-33514599,33514604,33514609,33514617,33514625,33514633,33514641-33514643,33514649,33514653,33514663,33514688,33514690,33514693,33514697,33514701,33514706,33514708,33514715,33514718,33514721,33514726,33514729,33514734-33514735,33514739,33514748,33514751,33514753,33514756-33514757,33514760,33514765,33514779,33514785,33514788,33514792,33514800,33514803,33514812,33514815,33514829,33514833,33514836,33514841,33514854,33514857,33514864,33514868-33514869,33514871,33514878,33514893,33514897,33514900,33514910,33514930,33514941-33514942,33514945,33514964,33514975,33514999,33515016,33515019,33515028,33515036-33515037,33515047,33515065,33515074,33515085-33515086,33515093,33515096,33515100,33515111,33515130,33515144,33515152,33515155,33515168,33515173,33515181,33515197,33515199-33515200,33515205,33515213,33515219,33515227,33515231,33515242-33515243,33515246,33515256,33515259,33515263,33515265,33515269,33515272,33515280,33515292,33515294-33515298,33515300,33515304,33515317,33515319,33515322,33515324-33515325,33515329,33515341,33515345,33515348-33515349,33515353-33515354,33515358,33515373,33515375,33515378,33515381-33515382,33515388,33515393,33515399-33515400,33515403-33515404,33515407,33515415-33515416,33515421,33515426,33515429-33515430,33515437,33515440-33515441,33515443,33515445-33515447,33515453-33515454,33515459,33515461-33515464,33515468,33515471-33515472,33515474,33515478,33515480,33515484,33515486-33515487,33515489,33515491,33515494,33515500-33515502,33515505,33515508-33515509,33515512,33515516,33515520-33515521,33515525,33515527-33515530,33515532-33515533,33515537-33515538,33515541-33515543,33515547-33515548,33515551-33515553,33515555-33515557,33515559-33515561,33515563,33515565-33515566,33515568-33515570,33515572,33515574-33515576,33515578-33515580,33515584,33515590,33515592,33515595-33515596,33515598,33515600,33515602,33515604-33515606,33515609-33515611,33515613-33515614,33515616-33515623,33515625-33515626,33515628,33515630-33515631,33515633,33515635-33515640,33515643,33515645-33515646,33515649-33515650,33515653,33515655-33515658,33515660,33515662,33515665,33515667-33515668,33515671-33515673,33515675,33515678-33515683,33515686-33515689,33515691,33515694-33515696,33515698,33515701-33515702,33515704-33515709,33515712,33515714-33515716,33515718-33515719,33515721-33515722,33515724-33515727,33515730-33515731,33515734-33515741,33515743-33515756,33515758-33515761,33515763-33515764,33515766,33515768-33515774,33515776-33515778,33515781-33515784,33515786-33515791,33515793,33515796-33515797,33515799,33515801,33515803-33515807,33515810-33515811,33515814-33515815,33515817-33515818,33515821-33515822,33515832,33515835-33515836,33515839-33515844,33515846-33515847,33515852-33515853,33515856,33515858,33515862,33515866,33515871-33515872,33515876,33515882-33515883,33515886-33515887,33515891,33515893-33515895,33515897,33515899-33515900,33515904,33515906-33515907,33515910,33515918-33515920,33515930-33515931,33515933,33515939-33515941,33515949,33515956,33515959,33515964,33515978,33515984-33515985,33515991,33515994,33515997,33516008,33516011,33516014-33516015,33516018,33516032,33516046,33516049,33516052-33516053,33516072,33516092,33516098-33516099,33516101,33516104,33516124,33516126,33516130,33516134,33516139,33516143-33516144,33516157,33516168,33516174,33516177,33516180,33516184,33516190,33516200,33516212,33516226,33516229,33516231-33516232,33516245,33516252,33516264,33516268,33516273,33516277,33516281,33516286,33516291,33516302,33516314,33516326,33516331-33516332,33516372,33516374-33516375,33516386,33516398,33516420-33516421,33516426-33516427,33516435,33516455-33516456,33516458,33516478-33516479,33516483,33516485,33516494,33516502-33516503,33516505,33516508,33516516,33516518,33516520,33516528,33516538-33516539,33516548,33516588,33552673,33552685,33552689,33552697,33552706,33552708,33552712,33552714,33552722,33552725,33552727,33552735,33552742,33552745,33552749,33552751,33552755-33552756,33552761,33552772,33552776,33552778,33552792-33552793,33552797-33552799,33552803,33552806,33552810,33552812,33552822,33552825-33552826,33552838,33552845,33552850-33552852,33552864-33552867,33552869,33552871,33552874-33552875,33552885,33552890,33552895,33552899,33552902,33552906,33552910-33552911,33552928,33552930,33552934,33552941-33552942,33552944,33552946,33552948,33552957,33552971,33552984,33552993,33552996,33553003,33553008,33553013,33553015,33553020,33553024,33553044,33553048-33553049,33553064,33553073,33553094,33553096,33553105,33553110,33553122,33553124,33553128,33553135,33553137,33553142,33553147,33553177,33553188,33553200,33553220,33553222,33553224,33553228,33553231,33553239,33553248,33553257,33553260,33553266,33553269,33553277,33553282,33553285,33553310,33553319,33553322,33553334,33553352,33553357,33553361,33553374,33553376,33553381,33553393,33553403,33553420,33553431,33553450,33553453,33553462,33553475,33553479,33553486,33553497,33553500,33553502,33553506,33553509,33553515,33553519,33553531,33553534-33553535,33553549,33553552,33553561,33553568,33553572,33553574,33553583-33553584,33553603,33553605,33553610,33553613,33553619,33553625,33553635,33553638,33553640,33553652,33553663,33553670,33553673,33553682,33553686-33553688,33553696,33553705,33553732,33553737,33554194,33554199,33554223,33554228,33554250,33554265,33554283,33554294,33554300,33554318,33554327,33554350,33554363,33554380,33554411,33554413,33554433,33554454,33554465,33554494,33554518,33554547,33554560,33554578,33554601,33554626,33554649,33554682,33554705,33554712,33554733,33554750,33554793,33554819,33554849,33554876,33554904,33554907,33554958,33554960,33554985,33555015,33555043,33555067,33555097,33555133,33555160,33555175,33555199,33555229,33555256,33555284,33555310,33555337,33555371,33555397,33555440,33555479,33555490,33555527,33555559,33555596,33555625,33555839,33555880,33555895,33555914,33555926,33555950,33555959,33555978,33555991,33556017,33556035,33556051,33556066,33556112,33556135,33556166,33556209,33556239,33556271,33556329,33556339,33556381,33556418,33556448,33556489,33556552,33556574,33556642,33556692,33556739,33556798,33556821,33556870,33556926,33556978,33557060,33557076,33557108,33557142,33557190,33557226,33557309,33557314,33557344,33557377,33559178,33559187,33559190,33559254,33559271,33559278-33559279,33559292,33559295,33559330,33559332,33559341,33559366,33559371-33559372,33559378-33559379,33559388,33559426,33559429,33559431,33559435,33559445,33559449,33559451,33559462,33559465,33559470,33559481,33559486,33559509,33559516,33559524,33559545,33559552-33559553,33559572-33559573,33559576,33559588,33559591,33559593,33559599,33559627,33559634,33559637,33559647,33559653,33559668,33559674,33559690,33559708,33559710,33559732-33559733,33559741,33559750,33559752,33559762,33559765,33559785,33559792-33559793,33559801,33559831-33559832,33559840,33559860,33559879,33559888,33559898,33559909,33559929,33559943,33559951-33559952,33559960,33559963-33559964,33559970-33559971,33559986,33559993,33559998,33560000,33560006,33560013,33560018,33560031,33560034,33560053,33560070,33560074,33560081,33560085,33560092,33560101,33560108,33560113,33560156,33560160,33560177,33560189,33560193-33560194,33560197,33560203,33560210,33560226,33560236-33560237,33560239,33560250,33560264,33560275,33560280,33560285,33560290,33560295,33560299-33560300,33560315,33560334,33560341,33560343,33560346-33560347,33560354,33560357,33560367-33560368,33560380-33560381,33560391-33560392,33560394,33560406,33560426,33560428,33560431,33560438,33560459,33560461-33560463,33560469-33560470,33560474,33560488,33560490-33560491,33560505-33560506,33560514,33560517,33560527,33560530,33560540,33560543,33560545,33560547,33560549-33560550,33560552,33560555-33560556,33560562,33560570,33560572-33560573,33560578,33560583,33560587-33560588,33560591,33560594,33560608,33560610,33560614,33560622,33560624-33560625,33560632,33560637,33560650-33560651,33560664,33560682,33560695,33560711,33560716,33560770,33560772,33561474,33561493,33561511,33561568,33561582,33561591,33562670,33562688,33562743,33562777,33562803,33562825,33562847,33562858,33562882,33562903,33562932,33562949,33563269,33563288,33563314,33563339,33563370,33563397,33563424,33563455,33563465,33563472,33563485,33563493,33564192,33564208,33564239,33564245,33564280,33564350,33564422,33564451,33564457,33564512,33564516,33564685,33564688,33564705,33564707,33564718,33564720,33564733,33564737,33564758,33564795,33564822,33564855,33564910,33564949,33564974,33565533,33565609,33565676,33565693,33565707,33565865,33565876,33565886,33565897,33565913,33565935,33565962,33565989,33566014,33566019,33566037,33566067,33566091,33566108,33566128,33566137,33566149,33566164,33566171,33566181,33566184,33566193,33566203,33566211,33566216,33566219,33566225,33566233,33566241,33566255,33566270,33566276-33566277,33566288,33566299,33566308,33566324,33566344,33566353,33566366,33566380,33566395,33566409,33566432,33566445,33566460,33566481,33566498,33566512,33566528,33566533,33566543,33566557,33566576,33566591,33566607,33566627,33566647,33566664,33566684,33566708,33566730,33566734,33566737,33566741,33566746,33566761,33566787,33566823,33566865,33566906,33566939,33566950,33566960,33567058,33567078,33567091,33567104,33567117,33567139,33567158,33567175,33567204,33567216,33567222,33567227,33567242,33567248,33567253,33567259,33567264,33567275,33567285,33567292,33567296,33567299,33567305,33567312,33567315,33567320,33567323,33567337,33567350,33567360,33567382,33567389,33567398,33567412,33567450,33567468,33567500,33567532,33567548,33567564,33567569,33567584,33567594,33567604,33567609,33567619,33567634,33567651,33567663,33567676,33567690,33567700,33567714,33567730,33567743,33567753,33567759,33567772,33567789,33567795,33567812,33567829,33567859,33567879,33567908,33567914,33567978,33567990,33567996,33568015-33568016,33568018,33568030-33568031,33568204,33568214,33568224,33568238,33568247,33568254,33568258,33568261,33568278,33568284,33568294,33568304,33568308,33568322,33568327,33568346,33568361,33568371,33568383,33568396,33568403,33568420,33568435,33568446,33568459,33568485,33568496,33568513,33568532,33568571,33568585,33568616,33568640,33568656,33568722,33568725,33568734,33568744-33568745,33568777,33568780,33568782,33568787,33568790,33568796,33568805,33568817,33568826,33568832,33568840,33568843,33568851,33568857,33568869,33568873,33568891,33568903,33568912,33568917,33568924,33568929,33568939,33568949,33568958,33568968,33568974,33568990,33569002,33569013,33569026,33569057-33569058,33569065,33569075,33569092,33569109,33569121,33569130,33569133,33569135,33575743,33575748-33575749,33575753,33575757,33575759,33575763,33575769,33575771,33575776,33575778,33575782,33575789-33575790,33575795,33575799,33575801,33575804,33575815,33575818,33575821-33575822,33575825,33575829,33575835-33575836,33575839-33575840,33575846,33575848-33575849,33575851-33575852,33575854,33575863-33575865,33575873,33575879,33575886,33575889,33575891,33575895,33575899,33575901,33575909,33575911-33575912,33575919-33575920,33575923-33575924,33575928-33575929,33575933,33575940,33575945,33575947-33575949,33575952-33575953,33575957-33575959,33575963-33575964,33575966,33575969,33575974,33575976,33575980,33575984-33575985,33575987,33575990,33575992-33575993,33576000,33576009,33576012,33576014,33576017,33576019,33576021-33576022,33576024,33576027,33576030,33576032,33576038-33576039,33576041,33576043-33576044,33576051,33576054-33576056,33576059-33576060,33576069,33576074-33576076,33576079-33576080,33576082-33576083,33576095,33576102,33576108,33576110-33576111,33576113,33576116,33576119,33576126,33576135-33576138,33576141,33576144-33576145,33576148,33576152,33576154-33576155,33576161-33576162,33576171,33576174,33576178,33576180,33576188,33576190,33576193-33576194,33576198,33576200,33576202,33576206-33576207,33576210,33576216,33576219,33576226,33576230,33576233,33576235,33576243,33576245,33576254-33576255,33576259,33576263,33576267,33576277,33576287,33576297-33576298,33576300,33576304-33576305,33576309,33576312,33576318,33576320,33576327,33576333,33576336-33576337,33576339-33576340,33576343,33576351,33576356-33576359,33576361-33576362,33576364,33576368,33576371,33576373,33576378-33576379,33576385,33576387,33576391,33576394-33576395,33576402,33576407,33576410,33576412-33576414,33576418,33576428,33576431,33576438,33576441-33576442,33576446-33576448,33576452,33576454,33576458,33576461,33576466,33576469,33576474-33576475,33576478,33576480,33576486,33576489,33576491,33576494,33576496,33576500,33576504-33576505,33576509,33576512,33576523-33576524,33576528,33576536,33576538,33576542,33576556,33576559,33576571-33576572,33576578,33576589-33576590,33576594,33576596,33576598,33576607,33576609,33576617,33576619,33576622-33576623,33576626,33576628-33576629,33576640-33576641,33576647,33576649,33576659,33576663,33576675,33576683,33576687,33576691,33576695-33576696,33576698,33576702,33576705,33576715,33576720-33576721,33576725,33576729,33576736,33576741,33576744-33576745,33576747,33576757,33576770-33576771,33576778,33576780,33576784,33576789,33576792,33576795,33576807,33576817,33576824,33576829-33576830,33576834,33576836,33576839,33576848,33576850,33576854,33576864,33576866,33576870,33576873,33576877,33576883,33576886-33576887,33576891,33576898,33576903-33576904,33576907,33576910,33576912,33576914-33576915,33576918,33576920,33576926,33576948,33576951,33576962,33576965,33576970,33576976,33576978,33576980,33576982-33576983,33576996,33576998,33577001-33577003,33577013,33577015-33577017,33577019,33577022,33577025,33577027,33577031,33577035,33577040,33577042,33577045,33577048,33577051,33577056,33577061,33577069,33577073-33577074,33577079,33577081,33577085-33577086,33577089,33577092,33577096,33577102,33577104,33577109,33577116,33577119,33577122,33577127,33577133-33577134,33577136,33577153-33577154,33577162-33577163,33577169,33577175,33577180,33577182,33577184,33577189,33577192-33577193,33577202,33577205-33577206,33577215,33577218,33577220-33577221,33577227,33577235,33577237,33577244-33577245,33577252,33577255-33577257,33577260,33577268,33577287,33577289,33577291,33577293,33577298-33577299,33577301-33577302,33577306,33577314,33577317,33577323,33577334,33577338-33577343,33577348,33577350,33577357,33577362-33577363,33577367,33577370,33577372,33577375,33577379,33577382,33577384-33577385,33577389-33577392,33577400,33577405,33577411,33577421,33577424-33577427,33577430,33577432-33577433,33577436,33577442-33577444,33577447-33577448,33577454,33577468,33577470-33577471,33577474,33577476,33577478,33577484,33577490,33577492,33577495,33577499,33577503-33577504,33577509,33577516,33577519,33577524,33577526-33577529,33577532,33577538,33577543,33577550,33577553,33577557,33577563,33577571-33577573,33577576,33577582,33577585,33577588,33577592,33577594,33577599,33577606-33577607,33577610,33577613,33577621-33577623,33577638,33577642,33577647,33577649-33577650,33577654,33577658-33577659,33577662,33577664,33577667,33577683,33577685-33577689,33577693,33577699-33577700,33577704,33577716,33577718,33577722,33577727,33577729,33577733-33577734,33577736,33577739,33577741-33577742,33577746,33577749,33577751,33577754,33577760,33577770,33577777-33577778,33577780-33577781,33577784,33577790-33577791,33577805,33577807,33577811,33577819,33577823,33577832,33577834,33577836-33577837,33577845-33577846,33577848-33577849,33577852,33577857,33577859,33577867,33577873,33577875,33577877,33577884,33577887,33577889,33577891-33577892,33577895,33577898-33577899,33577902-33577904,33577911,33577917,33577919,33577921,33577923-33577924,33577926,33577929-33577930,33577932-33577933,33577937,33577941-33577943,33577949,33577952,33577954,33577956,33577958-33577959,33577962,33577964,33577973,33577979,33577984,33577986-33577987,33577990,33577992-33577993,33577995-33577996,33578000,33578002,33578004,33578009,33578011,33578013-33578015,33578019-33578021,33578027,33578030-33578032,33578034,33578037,33578043-33578044,33578065-33578066,33578074-33578076,33578078,33578080,33578084,33578088-33578089,33578093,33578098,33578100,33578103,33578105,33578108,33578111-33578112,33578114,33578116-33578117,33578119-33578120,33578122-33578123,33578129,33578132,33578139,33578141,33578144,33578146,33578150-33578151,33578157,33578160,33578163,33578166,33578169,33578171,33578174-33578175,33578179,33578182,33578185-33578186,33578191,33578193,33578195,33578197,33578202-33578203,33578209,33578211,33578213-33578214,33578218,33578222,33578225,33578229-33578232,33578235,33578238,33578240,33578244-33578245,33578247,33578249,33578251,33578255,33578259,33578265,33578268-33578271,33578273-33578275,33578280,33578282-33578283,33578285-33578287,33578290,33578295,33578298-33578299,33578302,33578306,33578309,33578311,33578314,33578317-33578318,33578321,33578323,33578325,33578327,33578330,33578333,33578336,33578340,33578345,33578347,33578349,33578351,33578353,33578356,33578358,33578360-33578363,33578366,33578369,33578372,33578375,33578377,33578380,33578382-33578385,33578387-33578388,33578391-33578395,33578397,33578400,33578403,33578405,33578407,33578410-33578411,33578416,33578418,33578423-33578424,33578426-33578428,33578430-33578431,33578433,33578436-33578440,33578442,33578446,33578449-33578450,33578453,33578455-33578456,33578458,33578460-33578461,33578465,33578467,33578471,33578473,33578479,33578485,33578488,33578491,33578495-33578496,33578499,33578502,33578514,33578522-33578523,33578526-33578528,33578538,33578543-33578544,33578554,33578556,33578569,33578579,33578582-33578583,33578586,33578590,33578594,33578597,33578600-33578601,33578615,33578630,33578634,33578639,33578644,33578647,33578657,33578662,33578669,33578672,33578676,33578678,33578680,33578687,33578690,33578694,33578698,33578700,33578706,33578711,33578716,33578724-33578725,33578728,33578730,33578737-33578739,33578743,33578752,33578761,33578766,33593190,33593205,33593220,33593228,33593238,33593251,33593254,33593926-33593927,33593961-33593962,33593971,33593983,33593996-33593997,33593999,33594007,33594038-33594039,33594053,33594065,33594070,33594075,33594091,33594093,33594103-33594104,33594119,33594122,33594180-33594181,33594185,33594188,33594202,33594216,33594218,33594220,33594224,33594226,33594237-33594238,33594243,33594250,33594254,33594258,33594262,33594265-33594266,33594274,33594276-33594277,33594281,33594283,33594287-33594288,33594291-33594293,33594296-33594297,33594314,33594323,33594330,33594332,33594339,33594345,33594348,33594350,33594353,33594355,33594357,33594371,33594375,33594383,33594389,33594460,33594464,33594467,33594473,33594480,33594488-33594491,33594494,33594497,33594499-33594500,33594502,33594505,33594507-33594508,33594510,33594515,33594518,33594521,33594524,33594527-33594529,33594531,33594534,33594537,33594540,33594542-33594543,33594545-33594546,33594549-33594552,33594555,33594557,33594560,33594562,33594564,33594572-33594573,33594576-33594579,33594581,33594586-33594587,33594591,33594593,33594597,33594601,33594605,33594608,33594611-33594612,33594615-33594617,33594622-33594623,33594626,33594629,33594634-33594636,33594642-33594643,33594646,33594648,33594650,33594653,33594655-33594657,33594669,33594671,33594673,33594678,33594680,33594682-33594683,33594686,33594689-33594690,33594693-33594694,33594696-33594697,33594700,33594702,33594704-33594705,33594707,33594709,33594712-33594713,33594716,33594719,33594723-33594725,33594728,33594734,33594736-33594737,33594739,33594747,33594750,33594757,33594763,33594766,33604836,33604855-33604856,33604863,33604868,33604880,33604886,33604888,33604899,33604905-33604907,33604909,33604913,33604919,33604923,33604932,33604941,33604943,33604953,33604965,33604970,33604973,33604977,33604979,33604981,33604985,33604993,33604999,33605002,33605010,33605012,33605014,33605025,33605029,33605034,33605040-33605041,33605046,33605058-33605059,33605074,33605091,33605095,33605109,33605120,33605123,33605129,33605133,33605144,33605148,33605152,33605155,33605166,33605171,33605181,33605186,33605198,33605210,33605215-33605216,33605219,33605237,33605254,33608760,33608825,33608838,33608842,33608888,33608911,33608916,33608932,33608937,33608940,33608962,33608965,33608969,33608971,33608976,33608992-33608993,33609010-33609011,33609016,33621645,33621657,33621667,33621672,33621684,33621686,33621694-33621695,33621703,33621707,33621737,33621740,33621855,33621867,33621872,33621889,33621903,33621918,33621935,33621947,33621964,33621972,33621987,33622002,33622014,33622026,33622044,33622061,33622074,33622094,33622109,33622122,33622133,33622157,33622160,33622178,33622197,33622207,33622229,33622241,33622259,33622274,33622294,33622315,33622327,33622353,33622364,33622389,33622406,33622422,33622438,33622457,33622474,33622492,33622518,33622520,33622546,33622557,33622583,33622601,33622622,33622643,33622666,33622687,33622701,33622726,33622740,33622763-33622764,33622781,33622794,33622808,33622825,33622842,33622848,33622868,33622879,33622895,33622906,33622920,33622935,33622956,33622973,33622991,33623013,33623027,33623051,33623061,33623085,33623102,33623116,33623129,33623156,33623175,33623184,33623200,33623209,33623214,33623216,33623220,33623223,33623241,33623243,33623256-33623257,33623279,33623294,33623296,33623299,33623307,33623313,33623330,33623351,33623354,33623367,33623385,33623396,33623409,33623425,33623439,33623450,33623464,33623476,33623490,33623501,33623512,33623526,33623540,33623555,33623565,33623574,33623586,33623601,33623616,33623634,33623645,33623661,33623677,33623687,33623697,33623714,33623726,33623736,33623749,33623759,33623774,33623784,33623797,33623811,33623822,33623842,33623855,33623870,33623882,33623896,33623911,33623920,33623936,33623951,33623965,33623973,33623989,33623996,33624005,33624014,33624026,33624038,33624046,33624064,33624071,33624081,33624090,33624339,33624343,33624352,33624358,33624369,33624379,33624388,33624397,33624408,33624412,33624425,33624443,33624455,33624474,33624486,33624503,33624514,33624533,33624548,33624557,33624574,33624599,33624601,33624624,33624642,33624651,33624673,33624687,33624699,33624710,33624725,33624738,33624747,33624760,33624774,33624785,33624794,33624817,33624826,33624839,33624857,33624875,33624888,33624904,33624918,33624929,33624939,33624948,33624963,33624972,33624987,33624998,33625010,33625019,33625026,33625045,33625061,33625073,33625087,33625100,33625111,33625122,33625136,33625155,33625169,33625182,33625197,33625207,33625223,33625236,33625251,33625272,33625281,33625295,33625297,33625306,33625325,33625338,33625352,33625368,33625386,33625395,33625403,33625421,33625434,33625448,33625460,33625479,33625489,33625503,33625520,33625535,33625556,33625564,33625582,33625590,33625597,33625610,33625625,33625639,33625661,33625670,33625685,33625699,33625719,33625731,33625749,33625763,33625772,33625784,33625801,33625811,33625821,33625833,33625847,33625862,33625877,33625893,33625898,33625907,33625923,33625931,33625944,33625957,33625972,33625983,33626000,33626016,33626031,33626050,33626073,33626084,33626103,33626122,33626139,33626152,33626165,33626178,33626187,33626204,33626219,33626235,33626251,33626265,33626284,33626311,33626327,33626340,33626355,33626378,33626381,33626398,33626412,33626441,33626467,33626486,33626504,33626522,33626538,33626550,33626567,33626589,33626602,33626627,33626638,33626654,33626672,33626689,33626703,33626720,33626734,33626753,33626767,33626779,33626798,33626811,33626832,33626854,33626857,33630188,33630194,33630199,33630218,33630220,33630224,33630228,33630230,33630233,33630239,33630246-33630247,33630249,33630264,33630513,33630545-33630546,33630554,33630568-33630569,33630581,33630597,33630603,33630605,33630607,33630609-33630610,33630616,33630693,33630932,33631129,33635813,33635819-33635820,33635822,33635830-33635831,33635834,33635842,33635844,33635850,33635854,33635863,33635866,33635871,33635873,33635881-33635882,33635885,33635895,33635897,33635902,33635904-33635905,33635908,33635913-33635914,33635917,33635920,33635925,33635928,33635930,33635935,33635939,33635945,33635947,33635950,33635956,33635963,33635968-33635970,33635976,33635983,33635987-33635988,33635994,33635997,33636012,33636014,33636026-33636027,33636032,33636043,33636046-33636047,33636050,33636056,33636058,33636061,33636065,33636067,33636071-33636072,33636077,33636090,33636092,33636099,33636101,33636108,33636117-33636118,33636128,33636130,33636151,33636161,33636163,33636171,33636175,33636181,33636184,33636191,33636194,33636204,33636208,33636211,33636213,33636221,33636229,33636233,33636237,33636244,33636246,33636251,33636261,33636266,33636268,33636274,33636283,33636291,33636302,33636310,33636321-33636322,33636330,33636336,33636342,33636351,33636353,33636362,33636378,33636389,33636400,33636414,33636432,33636438,33636448,33636468,33636474,33636476,33636480,33636489,33636509-33636510,33636522,33636532,33636538-33636539,33636566,33636568,33636586,33636598,33636605,33636622,33636630,33636643,33636663-33636664,33636688,33636698,33636709,33636713,33636725,33636736,33636740,33636754,33636769,33636772,33636777,33636789,33636808,33636815,33636834,33636841,33636851,33636856,33636859,33636869,33636884,33636902,33636924,33636943,33636954,33636959,33636963,33637025,33637032,33637049,33637081,33637086-33637087,33637096,33637106,33637150,33637156,33637165,33637183,33637197,33637205,33637232,33637244,33637258,33637298,33637319,33637324,33637335,33637339,33637345,33637358,33637363,33637365,33637400,33637422,33637445,33637449,33637458,33637471,33637486,33637499,33637502,33637505,33637532,33637563,33637581,33637602,33637606,33637615,33637636,33637653,33637663,33637688,33637706,33637722,33637728,33637736,33637752,33637757,33637777,33637800,33637821,33637830,33637834,33637838,33637860,33637874,33637876,33645587,33645594,33645605,33645623,33645647,33645649,33645662,33645664,33645666,33645673,33645679-33645680,33645689-33645691,33645699-33645701,33645707,33645709,33645711,33645713,33645718,33645721,33645729,33645732-33645735,33645739,33645742,33645744,33645754,33645758,33645760,33645765-33645766,33645768,33645770,33645772-33645773,33645775,33645777-33645779,33645784-33645786,33645788-33645789,33645792,33645794-33645795,33645801-33645803,33645807-33645808,33645811,33645813,33645822-33645824,33645826,33645832,33645834-33645835,33645837,33645843-33645845,33645847,33645851-33645856,33645858,33645861,33645863,33645865,33645867,33645869,33645873-33645874,33645880-33645882,33645887,33645889,33645891-33645892,33645896,33645902,33645905,33645907-33645908,33645915,33645917-33645918,33645921,33645923,33645925,33645927-33645928,33645930,33645934,33645936,33645938-33645940,33645943,33645945-33645947,33645949,33645956,33645960,33645962-33645964,33645966,33645971-33645972,33645978,33645982-33645984,33645986,33645988,33645990,33645992-33645996,33646001-33646002,33646004,33646006-33646009,33646014,33646016,33646019-33646020,33646024,33646032,33646035-33646036,33646038-33646039,33646044-33646045,33646047-33646048,33646050,33646055,33646061-33646062,33646064,33646066,33646068,33646070,33646072-33646074,33646078-33646079,33646081-33646085,33646088,33646092,33646094-33646095,33646098,33646100,33646105,33646111,33646113,33646116,33646119-33646122,33646124-33646125,33646127-33646128,33646131-33646135,33646137,33646139,33646141,33646149,33646152,33646156,33646159,33646162,33646165-33646167,33646170-33646172,33646175-33646176,33646179,33646182-33646183,33646187-33646188,33646192,33646199-33646200,33646203-33646204,33646206,33646208,33646210,33646214,33646217-33646218,33646220,33646223-33646224,33646230-33646231,33646238-33646239,33646243,33646247-33646249,33646255,33646257,33646259-33646260,33646265-33646266,33646270,33646272,33646274,33646278-33646279,33646284,33646286,33646291-33646293,33646295-33646296,33646299,33646301-33646302,33646305,33646315-33646317,33646322,33646325-33646326,33646330-33646331,33646334,33646338-33646340,33646342-33646343,33646352,33646358,33646362-33646363,33646366,33646373-33646374,33646379-33646380,33646382,33646385,33646389-33646390,33646392,33646396,33646399-33646401,33646403,33646411,33646413,33646416-33646417,33646422,33646426,33646429,33646431-33646432,33646436,33646438-33646439,33646443-33646445,33646447,33646452-33646453,33646459-33646460,33646463,33646466-33646467,33646476-33646477,33646479,33646481-33646482,33646489,33646498-33646499,33646503,33646507,33646509-33646510,33646515,33646520-33646521,33646523,33646526,33646529-33646530,33646533-33646535,33646540,33646544,33646548,33646553-33646554,33646563,33646570,33646572-33646574,33646577,33646584,33646586-33646587,33646589,33646591,33646593,33646596,33646598,33646605,33646607-33646609,33646611,33646613,33646615,33646617,33646619-33646620,33646622,33646624,33646626,33646628-33646629,33646632,33646638,33646641,33646644,33646646,33646649,33646652-33646654,33646656-33646658,33646668-33646670,33646672,33646674,33646677,33646679,33646681,33646683-33646685,33646688,33646692,33646695-33646696,33646698-33646699,33646703,33646706,33646708,33646711,33646714,33646717,33646720,33646723,33646725-33646727,33646729,33646732,33646734,33646738-33646739,33646742-33646743,33646745,33646748,33646753,33646755,33646757,33646759,33646761-33646763,33646766-33646768,33646773,33646775-33646777,33646783,33646788,33646796-33646798,33646800,33646805,33646807-33646809,33646813,33646815,33646817-33646818,33646820-33646821,33646823,33646825-33646826,33646830-33646831,33646835-33646836,33646842,33646846,33646848,33646850-33646855,33646866,33646869-33646870,33646873,33646875,33646879,33646881-33646883,33646886,33646889,33646892-33646893,33646895,33646901,33646903-33646907,33646909,33646912,33646914,33646918,33646921,33646923-33646925,33646928,33646932,33646936,33646940,33646943-33646944,33646946-33646947,33646951-33646953,33646956,33646958,33646960-33646961,33646964-33646966,33646968-33646971,33646973,33646978,33646981-33646983,33646985,33646989,33646996-33646999,33647001,33647004,33647008-33647009,33647011,33647014,33647017,33647020,33647026-33647027,33647029,33647032-33647035,33647037,33647039,33647041-33647044,33647046,33647050-33647051,33647053,33647055,33647062,33647064,33647066,33647070-33647071,33647073-33647075,33647078,33647081-33647083,33647086,33647089,33647092-33647093,33647095,33647097-33647099,33647101-33647103,33647105,33647107-33647108,33647110,33647113-33647115,33647118-33647119,33647121-33647122,33647125-33647126,33647131-33647132,33647135-33647138,33647142-33647143,33647149,33647153-33647154,33647157,33647159,33647161-33647162,33647166-33647168,33647176,33647179-33647180,33647186,33647190,33647192,33647200,33647204-33647205,33647208-33647209,33647214-33647215,33647217,33647220-33647221,33647226,33647228,33647236-33647237,33647241-33647244,33647246-33647247,33647251,33647255,33647257,33647259,33647261-33647262,33647265,33647270,33647273,33647277,33647280,33647284-33647287,33647295,33647298,33647302,33647308,33647310-33647311,33647314,33647319,33647323,33647325,33647330,33647333-33647334,33647336,33647338-33647340,33647350,33647352,33647354,33647360,33647365-33647366,33647368-33647369,33647372-33647374,33647376,33647378,33647385,33647387,33647391,33647395-33647398,33647402,33647404-33647405,33647407-33647408,33647410-33647413,33647416-33647417,33647420-33647421,33647426-33647427,33647429-33647430,33647432,33647436,33647443,33647450,33647458-33647459,33647464-33647472,33647474,33647480,33647484-33647486,33647488-33647489,33647491,33647495,33647502-33647504,33647506-33647507,33647520,33647523,33647527,33647530-33647531,33647534,33647538,33647543,33647545,33647549,33647552-33647553,33647564-33647566,33647569,33647572-33647573,33647583,33647585,33647589,33647591,33648599,33648604,33648647,33648658-33648659,33648665,33648679,33648692,33648695,33648701,33648708,33648717-33648719,33648721,33648730,33648732,33648746,33648749-33648751,33648753,33648757-33648758,33648760,33648765-33648767,33648769,33648771-33648772,33648774-33648781,33648784,33648788-33648789,33648792-33648794,33648796-33648797,33648799,33648802,33648804-33648806,33648809-33648810,33648812-33648813,33648815,33648817-33648819,33648822-33648826,33648828,33648832-33648834,33648839,33648841-33648842,33648846-33648851,33648855-33648856,33648859,33648862-33648864,33648866-33648867,33648872,33648875-33648876,33648878,33648880,33648883-33648885,33648888,33648890,33648895,33648897-33648898,33648904,33648906-33648907,33648909-33648910,33648912,33648914,33648916,33648919,33648925-33648926,33648928-33648929,33648931,33648936,33648938-33648942,33648948,33648955,33648959-33648961,33672452,33672462,33672469,33672477-33672478,33672485,33672487,33672494-33672496,33672500,33672503,33672506,33672509,33672516,33672521,33672524-33672528,33672532,33672535,33672539-33672541,33672559,33684689-33684691,33684693,33684703,33684707,33685273,33685280,33685298,33685352,33685359,33685383-33685384,33685399,33685442,33685448,33685457,33685461,33685464,33685499,33685510,33685516,33685518,33685526,33685540,33685552,33687945,33688065,33688072,33688076,33688097,33688103,33688105,33688115,33688121,33688124,33688129,33688146,33688149,33688157,33688160,33688199,33688203-33688204,33688228,33688232,33688241,33688246,33688248-33688249,33688255,33688268,33688278,33688288,33688298,33688301,33688303-33688304,33688317,33688319,33688321,33688323,33688330,33688333-33688334,33688356,33688367,33688377,33688390,33688394,33688407,33688414,33688447-33688448,33688464,33688466,33688469,33688472,33688487,33688491,33688493,33688498,33688503-33688504,33688519,33688521,33688523,33688535,33688538,33688542,33688550,33688552,33688562,33688574,33688578,33688584,33688595-33688596,33688600,33688602,33688607-33688608,33688640,33688651,33688659,33688678-33688679,33688683,33688695,33688699,33688703,33688721,33688725,33688728,33688733,33688739,33688741,33688744,33688752,33688756,33688758,33688773,33688777,33688803,33688812,33688823,33688827,33688839,33688845,33688854-33688855,33688857,33688875-33688876,33688878,33688888,33688901,33688908,33688912,33688924,33688933-33688934,33688938,33688956,33688961,33688983,33688990,33688996-33688997,33689003,33689005,33689017,33689030,33689040-33689041,33689044,33689049-33689050,33689065,33689067,33689071,33689077,33689082,33689092,33689101,33689104,33689119,33689134,33689155,33689176,33689189,33689192-33689194,33689199,33689212-33689213,33689217,33689225,33689229,33689276-33689277,33689282,33689285,33689288,33689290,33689322-33689323,33689345,33689353,33689361,33689380,33689411,33689424,33689437,33689479,33689496,33689500-33689501,33689509,33689537,33689551,33697839,33697850-33697851,33697855,33697864,33697869,33697872,33697874,33697880,33697891,33697897,33697900,33697903,33697907,33697911,33697916,33697928,33697932-33697933,33697937,33697941,33697949,33699522,33699652,33699686,33699694,33699710,33699785,33699912,33699995,33700006,33700075,33700114,33700129,33700148,33700201,33700208,33700221-33700222,33700252,33712870,33712948,33712953,33712960,33712972,33712985-33712987,33712992,33712996,33713008,33713018,33713031,33713033,33713037,33713046,33713055,33713062,33713067,33713070,33713090,33713092,33713094-33713095,33713105-33713106,33713108,33713113,33713116,33713118,33713129,33713135,33713146,33713154,33713156-33713157,33713166-33713167,33713169,33713172-33713173,33713175,33713181-33713182,33713184-33713185,33713193,33713195,33713199,33713201,33713204,33713216,33713219,33713223,33713229,33713231-33713232,33713234,33713248,33713251,33713254,33713260-33713261,33713267,33713271,33713273,33713283,33713285-33713288,33713290,33713294-33713295,33713303,33713305,33713313-33713314,33713321,33713324,33713338,33713344,33713347,33713349,33713353,33713355,33713358,33713363,33713368,33713374,33713384,33713390-33713391,33713397,33713414,33713416,33713426,33713433-33713434,33713442,33713445,33713450,33713457,33713460,33713464,33713466,33713475,33713478,33713480,33713486,33713490,33713492-33713493,33713510,33713523,33713525,33713527,33713534,33713536-33713538,33713541,33713549-33713550,33713562,33713571-33713572,33713579,33713582,33713587,33713593,33713598,33713601-33713602,33713614,33713617,33713629,33713633,33713636,33713652,33713659,33713675,33713678,33713680-33713681,33713683,33713686,33713697,33713727,33713730,33713733,33713744,33713754,33713758,33713761,33713775,33713778,33713780,33713787,33713790,33713792,33713794,33713811,33713815-33713816,33713826,33713830,33713839,33713850,33713857-33713858,33713868,33713875,33713877,33713895,33713905,33713935,33713941,33713966,33713972,33713992,33715004,33715018,33715338,33715352,33715372,33715389,33715403,33715425,33715427,33715649,33715652,33715705,33715890,33715906,33715912,33715927,33716259,33716495,33716506,33716510,33716531-33716532,33716558,33716564,33722103,33722167,33722169,33722199,33722249,33722311,33722350,33722363,33722402,33722424,33722435,33722455,33722459,33722462-33722463,33722469,33722471,33722491,33722498,33722502,33722519,33722521,33722555,33722559,33722566,33722579,33722604,33722632,33724311,33724437,33724439,33724442,33724445,33724447,33724483,33724486,33724488,33724494-33724495,33724497,33724502,33724562,33724566,33724588-33724589,33724600,33724602,33724605,33724614-33724615,33724621-33724622,33724626,33724629,33724632,33724634,33724636,33724640-33724641,33729569,33729577,33729723,33729749,33729761,33730502,33730545,33730578,33730616,33730685,33730688,33730695,33730925,33731049,33731066-33731067,33733131,33733142,33733187,33733203,33733224,33733311,33733328,33733335-33733336,33733342,33733362,33733369,33733423,33733695,33733856,33733878,33733880,33733885,33733889,33733896,33733901,33733916,33733924-33733925,33733928,33733935,33733943,33733949,33733964,33733974,33733980,33733983,33733985-33733986,33733998,33734021,33734038,33734040,33734044,33734047,33734061-33734062,33734090,33734092,33734095,33734108,33742467,33742471,33742475,33742483,33742488,33742492,33742496,33742505,33742509,33742514,33742521,33742526,33742533,33742538,33742544,33742571,33742581,33742587,33742590,33742593,33742604,33742615,33742620,33742631,33742635,33742643,33742652,33742660,33742667,33742673,33742678,33742684,33742692,33742699,33742711,33742718,33742723,33742731,33742739,33742743,33742752,33742759,33742773,33742802,33742814,33742821,33742832,33742834,33744089,33744105,33744113,33744129,33744141,33744157,33744164,33744205,33744217,33744233,33744245,33744252,33744269,33744283,33744298,33744310,33744317,33744328,33744339,33744353,33744366,33744385,33744395,33744405,33744416,33744423,33744444,33744456,33744467,33744485,33744492,33744497,33744512,33744519,33744537,33744567,33744572,33744584,33744591,33744606-33744607,33745553,33745571,33745581,33745602,33745616,33745634,33745653,33745662,33745690,33745697,33745708,33745727,33745745,33745762,33745783,33745804,33745824,33745855,33745874,33745910,33745934,33745945,33745960,33745989,33746019,33746058,33746077,33746099,33746121,33746144,33746180,33746189,33746234,33746248,33746272,33746280,33746305,33746327,33746356,33746383,33746452,33746482,33746509,33746531,33746558,33746582,33746611,33746649,33746670,33746685,33746712,33746738,33746765,33746790,33746821,33746835,33746863,33746887,33746911,33746939,33746964,33746987,33747008,33747044,33747048,33747516,33763050,33763134,33763274,33763299,33763340,33763456,33763528,33763716,33763764,33763821,33763875,33763924,33763949,33764010,33764068,33764073,33764132,33764175,33764222,33764263,33764285,33764368,33764400,33764461,33764499,33764527,33764579,33764599,33764634,33764685,33764714,33764746,33764779,33764822,33764830,33764851,33764881,33764895,33764925,33764934,33764972,33765014,33765048,33765079,33765106,33765129,33765140,33765162,33765169,33765204,33765219,33765242,33765279,33765301,33765318,33765333,33765353,33765372,33765392,33765408,33765426,33765457,33765487,33765508,33765528,33765546,33765565,33765580,33765604,33765619,33765642,33765668,33765695,33765719,33765725,33765749,33765764,33765786,33765802,33765822,33765836,33765853,33765860,33765870,33765880,33765890,33765901,33765908,33765919,33765928,33765937,33765945,33765954,33765965,33765974,33765985,33765995,33766009,33766024,33766037,33766053,33766060,33766068,33766082,33766094,33766105,33766117,33766130,33766144,33766156,33766173,33766193,33766208,33766221,33766235,33766251,33766269,33766280,33766296,33766315,33766336,33766366,33766386,33766407,33766438,33766466,33766495,33766523,33766555,33766586,33766603,33766628,33766654,33766694,33766724,33766763,33766806,33766857,33766902,33766955,33767012,33767052,33767105,33767160,33767202,33767252,33767303,33767342,33767376,33767414,33767446,33767482,33767521,33767560,33767599,33767613,33767655,33767702,33767741,33767776,33767810,33767844,33767885,33767921,33767957,33767992,33768027,33768064,33768101,33768144,33768178,33768212,33768243,33768274,33768278,33768319,33768350,33768390,33768433,33768466,33768497,33768535,33768580,33768613,33768656,33768691,33768731,33768775,33768808,33768852,33768890,33768929,33768969,33769004,33769040,33769076,33769095,33769135,33769174,33769222,33769249,33769276,33769298,33769322,33769347,33769372,33769395,33769421,33769443,33769468,33769489,33769492,33777242,33777304,33777320,33777330,33777337,33777339,33777342,33777349,33777373,33777376-33777379,33777381,33777390,33777396,33777399-33777400,33777402-33777403,33777414-33777415,33777418-33777419,33777422,33777426,33777437,33777442,33777447-33777448,33777464-33777465,33777469,33777471-33777472,33777477-33777478,33777484,33777492,33777498,33777512,33777520-33777521,33777526,33777530,33777533-33777534,33777538-33777539,33777541-33777542,33777551,33777553,33777557-33777560,33777565,33777569-33777570,33777573,33777592,33777597-33777599,33777620,33777623,33777626-33777627,33777629,33777635,33777639,33777641-33777642,33777644,33777647,33777649,33777659,33777670,33777673,33777678,33777681,33777684,33777687,33777689,33777693-33777694,33777696,33777700,33777708,33777718,33777722,33777725,33777728,33777733,33777741,33777744,33777760,33777766,33777769,33777774,33777776-33777777,33777783,33777785,33777789-33777790,33777792-33777794,33777797-33777798,33777801-33777803,33777805-33777806,33777812,33777814-33777815,33777817-33777820,33777824,33777828,33777830,33777837-33777838,33777841,33777843,33777845,33777848-33777849,33777851,33777853,33777855,33777858-33777859,33777862-33777863,33777868,33777870,33777873,33777875,33777879,33777883,33777886,33777889,33777891,33777893,33777896-33777897,33777899-33777904,33777907-33777909,33777911-33777913,33777918-33777920,33777924,33777927-33777928,33777930,33777932-33777933,33777935,33777937,33777939-33777942,33777944,33777946,33777953-33777954,33777957,33777961-33777963,33777970,33777972,33777974-33777977,33777980,33777983-33777984,33777986-33777987,33777989,33777992-33777993,33777995,33777999,33778002,33778004-33778006,33778008-33778009,33778014-33778016,33778021,33778023,33778026,33778028-33778029,33778031-33778033,33778039-33778040,33778043,33778045,33778048-33778050,33778052-33778053,33778055-33778057,33778059,33778061,33778063,33778066,33778068,33778073-33778076,33778078,33778083,33778085-33778091,33778094,33778096-33778097,33778100,33778102-33778103,33778106-33778108,33778111,33778113,33778116-33778117,33778122-33778124,33778126,33778130-33778131,33778134-33778137,33778139,33778142-33778143,33778147-33778148,33778150,33778153,33778155,33778157,33778163-33778165,33778167,33778169,33778173,33778175-33778176,33778178-33778179,33778182-33778184,33778189-33778192,33778196-33778198,33778201-33778204,33778206,33778209,33778213-33778215,33778217,33778220,33778224,33778230-33778231,33778234,33778236,33778248,33778370,33778372,33787404,33787416,33787433,33787446,33787460,33799963,33799980,33799993,33800015,33800029,33800042,33800059,33800071,33800090,33800103,33800118,33800124,33846852,33846871,33846887,33846902,33846914,33846926,33846940,33846954,33846964,33846977,33846986,33846998,33847003,33847014,33847028,33847039,33847051,33847061,33847070,33847083,33847092,33847105-33847106,33851591,33851598,33851632,33851636,33851638-33851639,33851644,33851646,33851652-33851653,33851658,33851661-33851662,33851672,33851688,33851697,33851700,33851707,33851713,33851716,33851722,33851724,33851727,33851741,33851744-33851745,33851773,33852595,33852622,33852661,33852668-33852669,33852681,33852684-33852686,33852693,33852695,33852711-33852713,33852724-33852725,33852735-33852736,33852743,33852746,33852752,33852780,33852783,33866662,33866702,33866704-33866705,33866722,33866725,33866737,33866743,33866746,33866766,33866771-33866772,33866774,33866778,33866786-33866787,33866792,33866813,33866844,33866851,33866854-33866855,33866859,33866869,33866878,33866897,33866899,33866901,33866906,33866924,33866941,33866973,33866975,33866978,33867004,33867023,33867028,33867032,33867034,33867039-33867040,33867060,33867072,33867078-33867079,33867082,33867089,33867092,33867096-33867097,33867141,33867153,33867172,33867176,33867208,33867214,33867234,33867240,33867251,33867260,33867273-33867274,33867304,33867313,33867439,33867483,33867515,33867531,33867533,33867536,33867552,33867574,33867588,33867601-33867602,33867619,33867638,33867647,33867666,33867677,33867705,33870873,33870881,33870883,33870900,33870908,33870916,33870930,33870934,33870939-33870940,33870944,33870949-33870951,33870959,33870965,33870973,33870979,33870981,33870989,33871010,33871012,33871022,33871041,33871068,33871080,33871082,33871096-33871097,33871100,33871109,33871111-33871112,33871118,33871123,33871128,33871136,33871142,33871146,33871150,33871157,33871159,33871163,33871167,33871173,33871179,33871189,33871197,33871200-33871201,33871214,33871222,33871225,33871229,33871233,33871244,33871255-33871256,33871261,33871264,33871269,33871278,33871282,33871285,33871293,33871299,33871306,33871317,33871324-33871325,33871333,33871336,33871339,33871751,33872804,33872806,33872846,33872853,33872858,33872866,33872873,33872879,33872889,33872915,33872924-33872925,33873166,33873168-33873170,33873172-33873175,33873177-33873179,33873181-33873188,33873190-33873191,33873194-33873195,33873197-33873203,33873206,33873208,33873210-33873214,33873216,33873218-33873219,33873221-33873222,33873226,33873232,33873234,33873236-33873237,33873352,33873354-33873356,33873358,33873361,33873364-33873365,33873371-33873372,33873375-33873376,33873382,33873387,33873390,33873392-33873393,33873396-33873397,33873400,33873402,33873404-33873405,33873409,33873415,33873419-33873420,33873423,33873426,33873429,33873435,33873476-33873477,33873480,33873482,33873487,33873489,33873493,33873495,33873499,33873505,33873507,33873511,33873516,33873522,33873524,33873527,33873530,33873533,33873536,33873539,33873543,33873547,33873550,33873555,33873561,33873563,33873566,33873570,33873574,33873579,33873581,33873585,33873591,33873595,33873598,33873602,33873609-33873610,33873614-33873618,33873620-33873623,33873625-33873626,33873628-33873629,33873631-33873638,33873641-33873642,33873644,33873647-33873655,33873657,33873659-33873665,33873667-33873670,33873672-33873674,33873676,33873678-33873680,33873688-33873690,33873694,33873719,33873722,33873724-33873725,33873727,33873729,33873732,33873735,33873737,33873741,33873743-33873745,33873747-33873751,33873753-33873754,33873757,33873761,33873767,33873770,33873772,33873777-33873778,33873782,33874775,33874836,33874868,33874909,33874920,33874943,33874950,33874952,33874959,33874966,33874972,33874974,33874981,33874984,33874990,33875000,33875008,33875011,33875013,33875015,33875020,33875032,33875041-33875042,33875045,33875047,33875050-33875051,33875053,33875056,33875058,33875062,33875067,33875072,33875082,33875087,33875090,33875097,33875100,33875109,33875119,33875121,33875131,33875143,33875149,33875153,33875160,33875164,33875171,33875174,33875179,33875185,33875191,33875196,33875204,33875214,33875219-33875220,33875227,33875236,33875238,33875244,33875257,33875263,33875265,33875267,33875275,33875278,33875283,33875285-33875286,33875292,33875295,33875307,33875315-33875316,33875321-33875322,33875326,33875332,33875344,33875358,33875362,33875371,33875377,33875385,33875395-33875396,33875403,33875410,33875416,33875418-33875419,33875421,33875426,33875428,33875439,33875441,33875448,33875453,33875461,33875467,33875472-33875474,33875489-33875490,33875495,33875502,33875510,33875514,33875519,33875529,33875531,33875540,33875542,33875547,33875549,33875555,33875573,33875579,33875586,33875593,33875601-33875602,33875606,33875618,33875637,33875640,33875643,33875652,33875665,33875680,33875687,33875721,33875725,33875744,33875750,33875757,33875760,33875773,33875798,33875850-33875851,33875860,33875862,33875879,33875899,33875910,33875913,33875920,33875947,33875978,33876075,33876082,33876887,33876894,33889010,33889026,33889041,33889055,33889087,33889098,33889113,33889119-33889120,33889124,33889129,33889132,33889134,33889141,33889143,33889146,33889150,33889165,33889173,33889183,33889196,33889207,33889210,33889215,33889219,33889228,33889236,33889240-33889241,33889246,33889269-33889270,33889273,33889278,33889282,33889292,33889300,33889302-33889303,33889305,33889310,33889324,33889327,33889329,33889349-33889350,33889352,33889356,33889358-33889359,33889391,33889393,33889398,33889401,33889403,33889407,33889416,33889420-33889422,33889427,33889436,33889445,33889454-33889455,33889459-33889461,33889485,33889487,33889497,33889500-33889501,33889506-33889507,33889510,33889513-33889515,33889517,33889520,33889522,33889529,33889532,33889534-33889535,33889540,33889545,33889558,33889561-33889562,33889575-33889576,33889580,33889583,33889588,33889595-33889596,33889601-33889602,33889605,33889610,33889618-33889619,33889628-33889631,33889634,33889637-33889638,33889640,33889646-33889647,33889653,33889655,33889661-33889662,33889664,33889668,33889673-33889674,33889677-33889678,33889682,33889701,33889706,33889711,33889714-33889716,33889724,33889726,33889731,33889733,33889738,33889741,33889743-33889744,33889746,33889751-33889752,33889755,33889759,33889765-33889766,33889772,33889776,33889778,33889786-33889787,33889789,33889795,33889801-33889803,33889806,33889812,33889814,33889816-33889817,33889822-33889823,33889827,33889829,33889833,33889843,33889846,33889849,33889863-33889864,33889868,33889871,33889874,33889877,33889880-33889881,33889889,33889892,33889895,33889897,33889900-33889901,33889904,33889909,33889917-33889918,33889933,33889935,33889939,33889944,33889953,33889963,33889965,33889976,33889981,33889984,33889986,33889998,33890006,33890015,33890019,33890022,33890033-33890034,33890036,33890048-33890051,33890055,33890061,33890063,33890072,33890076,33890079,33890083,33890092,33890094,33890098,33890104,33890110-33890111,33890113,33890122,33890132,33890137-33890138,33890142,33890145-33890146,33890156-33890157,33890167-33890168,33890172,33890177,33890184,33890186,33890195-33890196,33890200,33890205,33890212,33890215,33890217,33890224,33890227,33890229-33890230,33890235-33890236,33890247,33890255-33890256,33890266,33890273,33890277,33890284,33890287-33890288,33890290,33890293,33890295,33890304,33890306,33890315-33890316,33890318,33890321,33890323,33890337,33890339,33890341,33890350,33890357,33890360,33890364,33890370,33890374,33890380-33890381,33890386,33890388,33890390,33890392,33890398-33890399,33890404,33890407,33890419,33890424,33890431,33890433,33890435,33890443,33890447-33890450,33890453,33890457,33890459,33890461,33890469-33890470,33890473,33890479,33890485-33890486,33890490-33890491,33890493,33890498,33890505,33890508-33890509,33890511,33890520-33890521,33890529-33890530,33890540,33890544,33890548-33890549,33890551,33890559,33890573,33890579-33890580,33890583,33890585,33890589,33890591-33890592,33890594,33890597,33890600,33890606-33890607,33890616,33890618,33890631,33890634,33890636,33890638,33890642-33890643,33890652,33890654-33890657,33890663,33890667,33890670,33890681,33890688,33890690-33890691,33890693-33890694,33890698-33890699,33890709,33890718,33890720,33890726,33890729,33890731,33890733,33890738,33890741-33890743,33890745,33890749,33890758-33890759,33890768,33890770,33890775-33890776,33890779,33890786,33890790,33890794-33890795,33890809,33890812-33890814,33890816,33890818,33890827-33890828,33890830,33890833,33890838,33890842,33890844,33890847,33890850,33890857,33890859,33890866,33890870,33890877-33890879,33890891-33890892,33890896-33890897,33890901,33890903,33890905-33890906,33890912,33890916,33890918,33890921,33890931,33890934,33890938-33890939,33890946,33890948,33890954,33890961,33890965,33890970-33890971,33890974-33890975,33890978,33890990,33890992,33890998,33891007-33891009,33891017,33891020,33891023,33891028,33891030-33891031,33891034,33891036,33891040,33891051-33891052,33891054,33891058-33891059,33891070-33891071,33891074,33891076,33891080-33891081,33891092,33891097,33891104,33891112,33891121,33891123,33891126-33891127,33891131,33891139,33891142,33891146-33891147,33891150,33891158,33891160,33891163,33891168,33891170,33891173-33891175,33891180,33891185,33891187,33891199-33891201,33891212,33891216-33891217,33891220-33891223,33891228,33891230,33891238-33891239,33891243,33891245-33891246,33891249,33891254,33891260-33891262,33891268,33891272,33891274,33891276,33891278-33891279,33891286,33891290-33891291,33891294,33891302,33891304,33891308-33891309,33891314,33891316,33891325,33891328,33891333,33891343,33891346-33891348,33891354-33891355,33891359-33891360,33891363,33891369,33891373,33891379,33891384,33891388,33891390,33891392,33891396,33891401-33891403,33891409,33891411,33891417,33891421-33891422,33891427,33891434,33891436,33891440,33891443-33891444,33891448,33891450,33891457,33891460-33891461,33891464,33891470,33891475,33891478-33891479,33891484,33891488,33891495,33891501,33891503,33891505,33891508,33891515,33891518-33891520,33891523,33891528,33891530,33891535,33891539,33891543-33891544,33891547,33891549,33891552,33891557,33891559-33891560,33891566,33891568,33891577-33891578,33891581-33891582,33891586,33891592,33891596,33891600-33891601,33891603,33891613-33891614,33891619-33891620,33891626,33891629,33891631,33891633,33891641-33891642,33891647-33891648,33891652,33891657,33891659,33891661,33891665,33891675-33891676,33891679,33891681,33891684,33891686,33891692-33891693,33891696,33891699,33891706,33891710,33891712,33891716,33891720-33891722,33891724,33891727-33891728,33891738,33891744,33891747,33891749,33891753-33891754,33891757,33891759,33891764,33891768,33891773,33891775-33891776,33891779,33891784,33891787,33891789-33891790,33891797,33891800,33891806-33891807,33891819,33891823,33891825-33891826,33891828-33891829,33891832-33891833,33891841,33891847-33891848,33891855-33891857,33891861,33891863,33891869-33891870,33891872,33891882,33891885,33891888,33891890,33891893-33891894,33891898-33891899,33891906,33891910,33891914-33891915,33891918,33891921,33891924,33891926,33891928,33891932-33891933,33891937,33891947,33891954,33891956,33891958,33891960-33891962,33891966-33891967,33891978,33891982,33891994-33891995,33891998-33891999,33892001,33892006,33892016,33892020,33892027,33892036-33892037,33892045,33892051,33892054,33892063,33892065,33892069,33892085,33892091,33892095,33892097,33892100,33892108,33892110,33892113-33892114,33892123,33892131,33892134,33892140,33892151,33892155,33892159,33892165,33892177,33892180,33892185,33892190,33892192-33892193,33892195,33892203,33892213-33892214,33892219,33892225,33892239,33892242,33892254-33892255,33892259,33892264,33892271-33892272,33892281,33892283,33892294,33892302,33892305,33892311-33892312,33892317,33892322,33892327,33892339,33892343,33892346,33892348,33892355,33892373,33892377,33892379,33892385,33892390,33892401,33892405,33892408,33892411-33892412,33892420,33892427,33892429,33892434,33892446,33892453,33892457,33892467,33892469,33892472,33892475-33892476,33892478-33892479,33892484,33892487,33892495,33892498,33892501,33892514,33892517,33892528,33892531,33892533,33892535,33892537,33892541,33892544,33892549,33892555,33892557,33892563,33892579,33892583,33892587,33892589,33892591,33892595,33892598,33892608,33892610-33892611,33892614,33892616,33892618,33892623,33892638,33892648,33892659-33892661,33892669,33892671,33892676,33892683,33892686,33892696,33892699,33892701,33892710,33892733,33892744,33892755,33892758,33892761,33892769,33892776,33892778,33892798,33892802,33892804,33892810,33892814,33892820,33892829,33892832,33892839,33892841,33892855,33892860,33892864,33892882,33892889,33892903,33892907,33892914,33892921,33892931,33892933,33892943,33892953-33892954,33892973-33892974,33892981,33892987-33892988,33893004,33893007,33893009,33893014,33893030-33893031,33893042,33893057-33893058,33893065,33893073,33893081,33893093,33893099,33893114,33893118-33893119,33893129,33893150,33893163-33893164,33893167,33893174,33893186,33893188,33893192,33893194,33893213,33893231,33893235,33893238,33893240,33893247,33893254,33893257,33893259,33893270-33893271,33893286,33893295,33893307,33893312,33893318,33893323,33893331,33893348-33893349,33893356,33893370,33893382,33893387,33893390,33893395,33893403,33893421,33893425,33893427,33893430,33893440,33893452,33893460,33893480,33893548,33893568,33893576,33893585,33893600-33893601,33893608,33893610,33893617,33893625-33893626,33893633,33893639,33893652,33893677,33893683,33893737,33893745,33893750,33893753,33893755,33893757,33893760,33893762,33893780,33893793,33893796,33893801,33893809,33893812,33893814,33893816,33893818,33893838,33893844,33894187-33894188,33894194,33894198,33894207,33894211,33894213-33894214,33894216-33894217,33894221-33894222,33894225,33894229-33894230,33894233-33894234,33894239,33894242,33894244-33894245,33894248,33894253-33894254,33894260-33894263,33894271-33894272,33894278,33894308,33894321,33894325,33894327-33894328,33894330-33894331,33894333,33894335-33894338,33894340,33894343,33894345,33894348,33894350,33894352,33894356-33894357,33894360,33894363,33894367-33894369,33894371,33894375-33894376,33894379,33894383,33894386-33894387,33894389-33894391,33894395-33894397,33894401,33894755-33894756,33894776,33894778,33894792,33894795,33894799-33894800,33894806,33894818,33894822,33894826-33894827,33894837,33894843,33894850,33894856,33894861,33894871,33894877,33894889-33894890,33894902,33894904,33894910,33894912,33894917,33894920,33894927,33894935,33894942,33894952,33894958,33894962,33894966,33894969,33894984-33894985,33894993,33894999,33895002,33895007,33895014,33895025,33895032-33895033,33895040,33895044,33895051,33895053,33895056,33895060,33895068-33895069,33895078,33895082,33895086,33895089,33895094,33895099,33895103,33895115,33895122,33895125,33895131,33895135-33895136,33895139,33895146,33895157,33895161-33895162,33895166,33895169,33895176,33895182-33895183,33895189,33895194-33895195,33895202,33895204,33895208,33895215,33895217,33895219,33895225,33895228,33895230,33895287,33895296,33895300,33895302,33895304,33895314,33895319-33895320,33895327,33895330,33895332-33895333,33895348,33895351-33895352,33895356,33895362,33895365,33895370,33895372,33895375,33895384,33895386,33895388,33895396,33895399,33895404-33895405,33895418-33895419,33895422,33895427,33895432,33900853,33900920,33900939,33900941,33900950,33900978,33900982,33900988,33900990,33901002,33901010,33901013,33901016,33901018-33901019,33901021-33901022,33901025,33901027,33901032-33901033,33901039-33901040,33901045,33901052-33901055,33901057-33901058,33901064-33901065,33901078,33901080,33901085,33901087,33901090,33901093,33901097,33901099,33901115-33901118,33901120,33901129,33901132,33901136,33901143,33901146,33901148,33901152-33901153,33901160,33901165,33901168-33901169,33901173,33901178-33901179,33901181,33901186,33901189-33901190,33901199-33901200,33901203,33901205-33901206,33901210,33901213-33901214,33901217,33901223-33901224,33901229,33901233-33901234,33901236,33901240,33901242,33901255,33901258-33901259,33901262,33901279,33901298,33901303,33901313,33901318-33901319,33901322,33901338,33901346,33901351,33901355,33901361,33901365,33901370,33901374,33901376,33901383,33901392,33901397,33901399,33901407,33901425,33901428-33901429,33901443-33901444,33901446-33901447,33901451-33901452,33901455,33901457,33901463,33901465,33901470,33901477,33901483,33901487,33901492,33901503,33901507,33901510,33901514,33901521,33901523,33901525,33901529,33901535,33901558,33901563,33901577,33901579,33901581,33901592,33901601,33901606,33901608,33901616,33901624,33901629,33901633,33901648-33901650,33901659,33901666,33901669,33901677-33901678,33901688,33901693,33901701,33901705,33901713,33901715,33901722-33901724,33901726,33901732,33901739,33901757,33901762-33901764,33901766,33901768-33901769,33901774,33901803,33901807,33901809-33901810,33901812,33901817,33901843-33901844,33901846,33901851,33901868,33901887,33902019,33902778,33926434,33926454,33926540,33926560,33926597,33926626,33926630,33926640,33926648,33926748,33926759,33926791,33926794,33926806,33926817,33926823,33926841,33926843,33926847,33926861,33926871,33926881,33926886,33926907,33926911,33926915-33926916,33926919,33926927,33926952,33926957,33926961,33926963,33926977,33926979,33926998,33927001,33927009,33927016,33927018,33927039,33927049,33927055,33927057,33927066-33927067,33927082,33927086,33927090,33927104,33927109,33927112,33927116,33927130,33927137,33927140-33927141,33927147,33927160,33927167-33927168,33927170,33927220,33927258,33927262,33927270,33927279,33927282,33927291,33927306-33927307,33927313,33927322,33927338,33927348,33927352-33927353,33927360,33927364,33927373-33927374,33927386,33927389,33927391,33927393,33927402,33927422,33927424,33927433-33927434,33927459,33927463,33927466-33927468,33927471,33927473,33927481,33927492,33927497,33927503,33927507,33927510,33927519,33927525,33927527,33927533,33927543,33927545,33927548,33927551-33927552,33927557,33927564,33927567,33927570-33927571,33927584,33927593,33927597-33927598,33927601,33927606,33927621,33927624,33927626,33927647,33927666,33927678,33927684,33927688,33927690,33927700,33927711,33927724,33927729,33927740-33927741,33927746,33927762,33927764,33927766,33927769,33927776,33927790,33927794,33927800,33927808,33927820,33927859,33927863,33927866-33927867,33927873,33927876,33927885-33927886,33927896,33927898,33927901,33927911,33927917,33927925,33927928,33927933,33927935,33927937,33927940,33927950,33927956,33927961,33927966,33927976,33927994,33928000-33928001,33928013,33928016,33928032,33928035,33928037,33928040,33928052,33928054,33928059,33928068,33928075,33928088,33928091,33928096,33928100,33928109,33928111,33928116,33928118,33928125,33928133,33928136,33928141,33928146,33928167,33928171,33928193-33928194,33928196-33928198,33928204,33928207,33928221-33928222,33928230-33928231,33928250,33928260,33928273,33928299,33928301,33928306,33928320,33928326,33928328,33928335,33928341,33928344,33928350,33928358,33928365,33928367,33928369,33928377,33928380,33928390,33928394,33928410,33928421,33928425,33928432,33928445,33928453,33928457,33928469,33928482,33928498,33928512,33928515,33928533,33928536,33928544,33928548,33928576,33928585,33928588,33928598,33928606,33928620,33928626,33928634,33928644,33928647,33928652,33928667,33928686,33928689,33928701,33928712,33928773,33928831-33928832,33930913,33930922,33930967,33931000,33931007,33931053,33931087,33931089,33931092,33931112,33931123,33931130,33931138,33931151-33931153,33931167,33931178,33931185-33931186,33931204,33931207,33931211,33931215,33931236,33931239,33931245,33931267,33931274,33931278,33931281,33931284,33931286-33931287,33931293,33931295,33931335-33931336,33931344,33931349,33931355,33931363,33931375-33931376,33931411,33931417,33931429,33931468,33931475-33931476,33931490,33931501,33931510,33931513,33931519,33931531,33931538,33931540,33931553,33931605,34025506,34025511,34025524-34025525,34025527,34025530,34025533,34025535,34025538,34025541,34025546 +alt.binaries.sounds.mp3.1980s: 6585546,6585564,6585569,6585581,6585587,6585607,6585627,6585636,6585644,6585646,6585649,6585652-6585653,6585661,6585663,6585667,6585669,6585671,6585673,6585675,6585681,6585691,6585695-6585696,6585700,6585705,6585721,6585723,6586263,6586284,6586308,6586320-6586321,6586324,6586332,6586342,6586344,6586350,6586353,6586364-6586365,6586369,6586375,6586388-6586389,6586392,6586401,6586411,6586415,6586426,6586432-6586433,6586435,6586439,6586441,6586444,6586452-6586454,6586459-6586460,6586462,6586465,6586473,6586475,6586478,6586481,6586484,6586487-6586488,6586492,6586496,6586498-6586499,6586501,6586503,6586506,6586508,6586511-6586513,6586517,6586519,6586521,6586523,6586530-6586531,6586535,6586538,6586544,6586556,6586562-6586563,6586568,6586581,6586586,6586588,6586590,6586595,6586598,6586607,6586611,6586617,6586619,6586621,6586632,6586635,6586638-6586639,6586645,6586651,6586656,6586658-6586659,6586663-6586664,6586672,6586678,6586684,6586689,6586694,6586698,6586702,6586710,6586715,6586729,6586731,6586736,6586743,6586745,6586747,6586752,6586754-6586755,6586772,6586774,6586779,6586793,6586798-6586799,6586805,6586807,6586814,6586822,6586825,6586835,6586841,6586851,6586853,6586863,6586865,6586868,6586872,6586884,6586892,6586897,6586900,6586909,6586913,6586917,6586931-6586932,6586934,6586940,6586944,6586954,6586970,6586973,6586980,6586984,6586992,6586996,6587003,6587010,6587014,6587016-6587017,6587022,6587028-6587029,6587034,6587046,6587049,6587059,6587066,6587068,6587070,6587074,6587076-6587078,6587081,6587086,6587088,6587092,6587100-6587101,6587109,6587112,6587128-6587129,6587140,6587142,6587146,6587152-6587153,6587156,6587161,6587166,6587170,6587172-6587174,6587177,6587182,6587185,6587189,6587191,6587195,6587197-6587199,6587203,6587215,6587217,6587222,6587224,6587227,6587233-6587234,6587242,6587249,6587254,6587260,6587264,6587268-6587269,6587289,6587291,6587293,6587298,6587313-6587314,6587319,6587346,6587361,6587367-6587368,6587378,6587380,6587390,6587394,6587406,6587417-6587418,6587425,6587430,6587432,6587439,6587444-6587445,6587458-6587460,6587463,6587470,6587484,6587486-6587487,6587493,6587495,6587502,6587505-6587506,6587510,6587513,6587520-6587521,6587523,6587525,6587527-6587529,6587535-6587537,6587543,6587545,6587547,6587551,6587554,6587556,6587558,6587561-6587562,6587564-6587565,6587571,6587576,6587580-6587583,6587585-6587586,6587589,6587592-6587594,6587596,6587603,6587606,6587610-6587611,6587614,6587617,6587620,6587623-6587624,6587628,6587632-6587633,6587635,6587638,6587640-6587641,6587644-6587645,6587652-6587653,6587656,6587658,6587660,6587664,6587666,6587668,6587670-6587671,6587677-6587680,6587682-6587683,6587689,6587691,6587694,6587698,6587700,6587703,6587720-6587722,6587726,6587731-6587734,6587736-6587737,6587739-6587742,6587744,6587746-6587747,6587749-6587750,6587752-6587754,6587758-6587759,6587764-6587765,6587768-6587769,6587771-6587775,6587777,6587780-6587782,6587784,6587786-6587788,6587791,6587793,6587795,6587797,6587799-6587805,6587809-6587810,6587814-6587815,6587820,6587823,6587825,6587833,6587840,6587842,6587855-6587857,6587862,6587864-6587867,6587871,6587875,6587879-6587881,6587884,6587886-6587889,6587891,6587893,6587897-6587900,6587904-6587905,6587912,6587917,6587919,6587923,6587926,6587928-6587929,6587935-6587936,6587938,6587941,6587946,6587948,6587951,6587954-6587955,6587958-6587960,6587962-6587964,6587967-6587969,6587973-6587975,6587978,6587980,6587983,6587989,6587996-6587999,6588001,6588005,6588008,6588010-6588014,6588020-6588022,6588027,6588029-6588030,6588034-6588038,6588040,6588044,6588048,6588052-6588055,6588058,6588060,6588062-6588068,6588070,6588075,6588080,6588088,6588091-6588092,6588095,6588097,6588099-6588100,6588102,6588104-6588105,6588107-6588109,6588111,6588113,6588119,6588121-6588124,6588126-6588129,6588134-6588136,6588139,6588141-6588142,6588145,6588148,6588150-6588153,6588155,6588159,6588165-6588166,6588168,6588170-6588171,6588173-6588175,6588178-6588179,6588184,6588186,6588188-6588190,6588192-6588193,6588195-6588196,6588198,6588201,6588205,6588208,6588212-6588213,6588216,6588220,6588226-6588227,6588229,6588235-6588236,6588240-6588241,6588243-6588244,6588246,6588254-6588255,6588257-6588259,6588261-6588262,6588264-6588265,6588271,6588275-6588276,6588279-6588280,6588282,6588285,6588287,6588292,6588294-6588295,6588297,6588304-6588305,6588308,6588310,6588315-6588316,6588318,6588325,6588328-6588329,6588334-6588336,6588340-6588343,6588348,6588353,6588356,6588366,6588369,6588372,6588374,6588379,6588383,6588385,6588387,6588390,6588392-6588393,6588396,6588398,6588400,6588403,6588407,6588409-6588410,6588413,6588416-6588419,6588422,6588424,6588426,6588428-6588429,6588434,6588436-6588437,6588441-6588443,6588446-6588448,6588452-6588454,6588456-6588457,6588463,6588465,6588468-6588469,6588472,6588474,6588478-6588481,6588490-6588493,6588495-6588496,6588500,6588502,6588504,6588510-6588511,6588514,6588516,6588519,6588522,6588524,6588526,6588528-6588529,6588536,6588544,6588546,6588553,6588557,6588560,6588562-6588563,6588565,6588569-6588570,6588578,6588580-6588581,6588583,6588585,6588587,6588603-6588604,6588609-6588610,6588618,6588623-6588624,6588628,6588630,6588633,6588636,6588638,6588640,6588644-6588645,6588656-6588657,6588659,6588662,6588672,6588676,6588679,6588681-6588682,6588691,6588694,6588697,6588701,6588705,6588709,6588713,6588715,6588721,6590383,6590387-6590389,6590391,6590393,6590397-6590398,6590402,6590406-6590411,6601504-6601505,6601516-6601518,6601520-6601521,6601525-6601526,6601528-6601531,6601533,6601535,6601537-6601540,6601542-6601543,6601545,6601548-6601552,6601554-6601555,6601557-6601558,6601560-6601566,6601569-6601571,6601573-6601575,6601577-6601579,6601582,6601584-6601585,6601587,6601589-6601590,6601592-6601595,6601597,6601599-6601602,6601606-6601608,6601610-6601611,6601613,6601615,6601618,6601662,6601669,6601671,6601675,6601685,6601691,6601701,6603809,6603813-6603815,6603817,6603820,6603822-6603823,6603825,6603827,6603829-6603830,6603832,6603834,6603836-6603838,6603840-6603844,6603846-6603849,6603851-6603853,6603855-6603858,6603860-6603862,6603864-6603865,6603867-6603870,6603872-6603874,6603876-6603880,6603882-6603883,6603885-6603886,6603889-6603891,6603893-6603896,6603898,6603900-6603902,6603904-6603906,6603908,6603910-6603912,6603914-6603917,6603920,6603922-6603925,6603930,6603932-6603939,6603941-6603944,6603946-6603950,6603952-6603954,6603956-6603957,6603959-6603964,6603967,6603969,6603971-6603972,6603974-6603976,6603978-6603980,6603983,6603986-6603987,6603989-6603995,6603997,6603999-6604000,6604002-6604004,6604006-6604010,6604012-6604013,6604015,6604017-6604018,6604020-6604021,6604023-6604025,6604029,6604031-6604033,6604035-6604039,6604042-6604045,6604047-6604048,6604050-6604053,6604055-6604056,6604058-6604061,6604063,6604065,6604068-6604071,6604073-6604075,6604077-6604078,6604080,6604082,6604084-6604088,6604090,6604092,6604094-6604096,6604098-6604100,6604102-6604106,6604108-6604109,6604111-6604112,6604114,6604116-6604121,6604123,6604125-6604127,6604129-6604132,6604134-6604139,6604142-6604143,6604145-6604146,6604149-6604150,6604152-6604153,6604155-6604158,6604161-6604165,6604167-6604169,6604172-6604173,6604176-6604177,6604304-6604309,6604311-6604317,6604319-6604328,6604330,6604332-6604338,6604340-6604346,6604348-6604356,6604359-6604360,6608820,6608839,6608857,6608870-6608871,6608885,6608888,6608900,6608924,6608938,6608945,6608947,6608955,6608965,6608969,6608977,6608980-6608981,6608989,6608991,6609004,6609020,6609022,6609026-6609027,6609029-6609031,6609033,6609035,6609039-6609043,6609046,6609048,6609050,6609052-6609055,6609060,6609063,6609069-6609070,6609074-6609075,6609079-6609080,6609086,6609088,6609090,6609092,6609097,6609102-6609103,6609105,6609107,6609113-6609116,6609118,6609120,6609123,6609129,6609131-6609132,6609136-6609137,6609140-6609141,6609145,6609147,6609151,6609154,6609156,6609158,6609162,6609174,6609176-6609178,6609182,6609190,6609192,6609194-6609197,6609201-6609203,6609205,6609207,6609209-6609211,6609219,6609226-6609227,6609231-6609232,6609246,6609254-6609255,6609269,6609289,6609293,6609295-6609296,6609307,6609312,6609314,6609317,6609323,6609332,6609337,6609341,6609343-6609344,6609353-6609354,6609358,6609361,6609363,6609367-6609368,6609380-6609381,6609388,6609405,6609407,6609409,6609417,6609424,6609431,6609433,6609440,6609442,6609447,6609449,6609451,6609453-6609454,6609467,6609469,6609476,6609478,6609480,6609503,6609512,6609523,6609525,6609527,6609530,6609534,6609537,6609541,6609545,6609554-6609555,6609575,6609593,6609601,6609603,6609607,6609609,6609616,6609618,6609621,6609625-6609626,6609628,6609632,6609634,6609636,6609643,6609647-6609648,6609651,6609655-6609658,6609662,6609664,6609666-6609668,6609670-6609671,6609673-6609674,6609676-6609677,6609680,6609684,6609713,6609715,6609721,6609747,6609749,6609758,6609765,6609771,6609773,6609778,6609821,6609839,6609841,6609851,6609854,6609859,6609863,6609865,6609868,6609870-6609871,6609881-6609882,6609886,6609897,6609908,6609910,6609927,6609929-6609930,6609947,6609952,6609957,6609959,6609961,6609981,6609997,6610007,6610014,6610072,6610075,6610098,6610612,6610617,6610621,6610629-6610630,6610636,6610642,6610644,6610648,6610650,6610657,6610659,6610664,6610669,6610674,6625608,6625622,6625625,6625627-6625628,6625630-6625632,6625634-6625635,6625638,6625641,6625643,6625646,6625648,6625650,6625656-6625657,6625659,6625662-6625664,6625668,6625670-6625671,6625676,6625678,6625681,6625684,6625686,6625690,6625693,6625697-6625698,6634186,6634194,6634198-6634199,6634203-6634204,6634206-6634212,6634214-6634216,6634218-6634220,6634223-6634243,6634245-6634248,6634250-6634251,6666145,6666149,6666151-6666156,6666158-6666160,6666162,6666164,6666166-6666169,6666172-6666175,6666179-6666180,6666182,6666184,6666186,6666188,6666190-6666191,6666193,6666195-6666199,6666201,6666203-6666205,6666207,6666209-6666212,6666215,6666217-6666218,6666220-6666221,6666223-6666225,6666227,6666230-6666232,6666234-6666235,6666237,6666239-6666242,6666245-6666246,6666248-6666249,6666251,6666254-6666257,6666259,6666261,6666263,6666265,6666267-6666269,6666271,6666273-6666279,6666284-6666285,6666287-6666289,6666293-6666296,6666298-6666299,6666301,6666303-6666305,6666308-6666309,6666311-6666313,6666315-6666318,6666320,6666322,6666324-6666325,6666328-6666329,6666331-6666332,6666334,6666337-6666339,6666342,6666345-6666350,6666352,6666355-6666358,6666361-6666364,6666366,6666368-6666370,6666373-6666376,6666379,6666381,6666383,6666386-6666387,6666389-6666391,6666394,6666396-6666398,6666401-6666402,6666404-6666406,6666408,6666410-6666411,6666413,6666415-6666418,6666420-6666422,6666427-6666430,6666432-6666433,6666435-6666437,6666440-6666441,6666443,6666445,6666447,6666456,6666458-6666466,6666469-6666473,6666475-6666477,6666479,6666481-6666485,6666487,6666489-6666490,6666492-6666496,6666498,6666503-6666505,6666507,6666509-6666511,6666513-6666514,6666516-6666521,6666523,6666526-6666528,6666530,6666532-6666534,6666536-6666537,6666539-6666541,6666543-6666544,6666546-6666548,6666551-6666556,6666558-6666559,6666561-6666564,6666566-6666568,6666571-6666573,6666576-6666578,6666580-6666587,6666590-6666591,6666593-6666595,6666598-6666600,6666603-6666604,6666607-6666609,6666611-6666613,6666616-6666618,6666620-6666623,6666625,6666627,6666629-6666635,6666638-6666642,6666645-6666647,6666649-6666651,6666653,6666655,6666657,6666659-6666661,6666663,6666665-6666666,6666669-6666672,6666674-6666676,6666678-6666680,6666683-6666684,6666686-6666693,6669354,6669361,6669366,6669373-6669374,6669378,6669384,6669388,6669395,6669399,6669402-6669403,6669408,6669414,6669417,6669421,6669425,6669430-6669431,6669441,6669447,6669450,6669452,6669457,6669466,6669475,6669490,6669499,6669505,6669513,6669516,6669527,6669531,6669545,6669553,6669687,6669698,6669749,6669783,6669854,6669861,6669869,6669884,6669908,6669935,6669964,6669981,6669993,6670051,6670111,6670141,6670148,6670176,6670200,6670228,6670242,6670254,6670267,6670284,6670302,6670343,6670354,6670366,6670374-6670375,6670380,6670527,6670536,6674979,6675010-6675011,6675026,6675036,6675041,6675044,6675046,6675048,6675050,6675052,6675054-6675056,6675063-6675065,6675067-6675068,6675070-6675071,6675073,6675077-6675078,6675080-6675082,6675085,6679696,6679699,6679702,6679706-6679754,6681830,6681834,6681843,6681845,6681849,6681852,6681862,6681865,6681868,6681872-6681875,6681877-6681879,6681882,6681885,6693451,6693454,6693456,6693459,6693461,6693464,6693466-6693481,6693483-6693488,6693490,6693492,6693494-6693495,6792024,6792041,6792046,6792050,6792053-6792055,6792057,6792069-6792070,6792073-6792076,6792081-6792082,6792084-6792086,6792088,6792091-6792092,6792095-6792096,6792098,6792100,6792106,6792110,6792113-6792114,6792118-6792119,6792121,6792123-6792124,6792127,6792129,6792132,6792137,6792139,6792143,6792148-6792149,6792152,6792155-6792157,6792160-6792163,6792168,6792170,6792174-6792176,6792179,6792182,6792185-6792187,6792192,6792195-6792196,6792199,6792213-6792216,6792220,6792222,6792226-6792229,6792231-6792232,6792234,6792241,6792243,6792245-6792246,6792249-6792251,6792254-6792255,6792257,6792260,6792266,6792268,6792272,6792274,6792276,6792278,6792281,6792284,6792290,6792295-6792296,6792298,6792300,6792302,6792306,6792309,6792313,6792315-6792316,6792318,6792320,6792325,6792327,6792331-6792334,6792337,6792340,6792342-6792343,6792345-6792348,6792353,6792359,6792361,6792363-6792364,6792366-6792367,6792372,6792374,6792379,6792382,6792384,6792387-6792389,6792393,6792396-6792399,6792404,6792407,6792410-6792412,6792414-6792415,6792417,6792422,6792424,6792426,6792430,6792432-6792434,6792436-6792439,6792444-6792445,6792453-6792454,6792457,6792459,6792461-6792463,6792467,6792469,6792474-6792475,6792478,6792480,6792482,6792486,6792488-6792489,6792494,6792496,6792500,6792503-6792505,6792520,6792523,6792527-6792530,6792536,6792539,6792541,6792544-6792546,6792549-6792551,6792554,6792556,6792558-6792560,6792563-6792564,6792568-6792569,6792572,6792575,6792577,6792579-6792581,6792583-6792584,6792586,6792592,6792595-6792596,6792599,6792601-6792604,6792606,6792609,6792612-6792613,6792615,6792617,6792619,6792621,6792623,6792626,6792629,6792631-6792633,6792638,6792640-6792642,6792644-6792646,6792648,6792651,6792653-6792654,6792656,6792658,6792660-6792663,6792666,6792668,6792671,6792673,6792677-6792680,6792683-6792684,6792686-6792690,6792696-6792697,6792699-6792709,6792711-6792744,6822615,6822645,6822655-6822656,6822660,6822670,6822672,6822674-6822675,6822680,6822683,6822685,6822687-6822689,6822691-6822694,6822696-6822697,6822699-6822700,6822702,6822704-6822711,6822715,6822717,6822719-6822720,6822723,6822725,6822727-6822728,6822730-6822734,6822737-6822739,6822741-6822742,6822744,6822746-6822747,6822749,6822751,6822753-6822754,6822756-6822759,6822761-6822763,6822765-6822767,6822769-6822770,6822772-6822783,6822786-6822790,6822795,6822797-6822798,6822800-6822801,6822803-6822807,6822809,6822812-6822814,6822816-6822821,6822823,6822826-6822828,6822831-6822832,6822834-6822841,6822843,6822845,6822847-6822848,6822850,6822852-6822858,6822860-6822861,6822865-6822866,6822869-6822871,6822873,6822876-6822878,6822880-6822887,6822889-6822890,6822892-6822904,6822906,6822909-6822912,6822914-6822916,6822919,6822924-6822927,6822929,6822931,6822940-6822941,6822943-6822944,6822946-6822947,6822973,6823171,6833704,6833708,6833713,6833730,6833739,6833757,6833763,6834497,6834510,6834522,6834534,6834571,6834590,6834655,6834674,6834686,6834691,6834693,6834698-6834699,6834714,6834716,6834723,6834726,6834731,6834737,6834742,6834745,6834749,6834757,6834762,6834771,6834782,6834821,6834864,6834868,6834895,6834957,6834980,6835029,6835036,6835038,6835059,6835064,6835069,6835071,6835074,6835079,6835090,6835092,6835099,6835103,6835107,6835121,6835135,6835139,6835182,6835198,6835200,6835204,6835213,6835215,6835224-6835225,6835232-6835233,6835249,6835251,6835258,6835266,6835272-6835273,6835284,6835288,6835290,6835295,6835303,6835316,6835329-6835330,6835337,6835339,6835363,6835370,6835377,6835381,6835387,6835393,6835401,6835406,6835411,6835423,6835443,6835451,6835454,6835458,6835465,6835478,6835484,6835490-6835491,6835500,6835510,6835515-6835516,6835520,6835531,6835535,6835545-6835546,6835556,6835563,6835569,6835579,6835581,6835583,6835590,6835597,6835603-6835604,6835617,6835621,6835628,6835644,6835651,6835661,6835663,6835675,6835677,6835686,6835688,6835697,6835701,6835705,6835713,6835718,6835723,6835730,6835734,6835740,6835748-6835749,6835758,6835765,6835769,6835772-6835773,6835778,6851501,6851553,6851606,6851610,6851613,6851639,6851649,6851656,6851662,6851680-6851681,6851685,6851693-6851695,6851699,6851701,6851705-6851706,6851714,6851716,6851718,6851722,6851727,6851731-6851732,6851751,6851753-6851754,6851757-6851758,6851761,6851763,6851768,6851770,6851773,6851777,6851783,6851785-6851788,6851790-6851791,6851795,6851799,6851806,6851809,6851811-6851814,6851816,6851818-6851819,6851821,6851823,6851827-6851828,6851830-6851831,6851833-6851834,6851840-6851842,6851844-6851847,6851852,6851854,6851858,6851866,6851868-6851870,6851876,6851879,6851881,6851885-6851886,6851888,6851890,6851893-6851894,6851899,6851901-6851903,6851905-6851906,6851908,6851910,6851914,6851918,6851922,6851924,6851928,6851930-6851931,6851935,6851944-6851945,6851947-6851949,6851954,6851956,6851958,6851961,6851964-6851966,6851968-6851970,6851988,6851991,6852002,6852004-6852005,6852007-6852008,6852012,6852016-6852017,6852019,6852028,6852034,6852070,6852377,6861395,6861422,6861483,6861519,6861525,6861560,6861564,6861600-6861601,6861611,6861627,6861629-6861630,6861632,6861636,6861640,6861652,6861660,6861665,6861673-6861674,6861677,6861683,6861687-6861688,6861696,6861712,6861739,6861742,6861747-6861748,6861804-6861805,6861814,6861823,6861845,6861868,6861913,6861920,6861936,6861939,6861955,6861988,6862501,6862608,6862634,6862660,6862662,6862673,6862692,6862698-6862699,6862713,6862724,6862727,6862736,6862742,6862756-6862757,6862773,6862785,6862800,6862807 +alt.binaries.sounds.mp3.bootlegs: 7014109,7014148,7014167-7014168,7014217,7014232,7014244,7014252,7014262-7014263,7014267,7014272,7014279,7014284,7014293,7014297,7014319-7014320,7014331,7014342,7014348,7014357,7014379,7014381,7014386-7014387,7014397,7014403,7014413,7014424,7014428,7014448-7014449,7014453,7014456,7014461,7014497,7014500,7014510,7014526,7014548,7014554-7014555,7014567,7014580,7014589,7025857,7025861,7025865-7025866,7025868,7025870,7025872,7025874-7025875,7025878-7025881,7025883-7025886,7025892-7025901,7025903-7025916,7025923,7025925-7025960,7025962-7025978,7025980-7026017,7026021,7026024,7026031,7026036,7026044,7026052,7026059,7026067,7026073,7026080,7026086,7026091,7026098,7026105,7026113,7026119,7026126,7026134,7026141,7026148,7026156,7026162,7026169,7026175,7026183,7026191,7026195,7026202,7026204,7026206,7026209,7026211,7026217,7026226,7026231,7026237,7026245,7026251,7026256,7026262,7026270,7026278,7026282,7026289,7026296,7026300,7026307,7026316,7026318-7026319,7026323,7026325-7026326,7026329,7026331,7026333,7026335,7026338,7026340-7026341,7026344,7026346,7026348,7026350,7026353,7026355,7026357,7026360,7026362,7026364,7026367,7026369,7026371,7026373,7026375,7026377,7026379,7026382,7026384,7026386,7026389,7026391,7026393,7026395,7026398,7026400,7026402,7026405,7026407,7026409,7026411,7026413,7026415,7026418,7026420,7026422,7026424,7026427-7026428,7026431,7026433,7026435,7026437,7026440,7026442,7026444-7026445,7026448,7026450,7026452,7026456,7026458,7026461,7026464,7026466,7026468,7026471,7026473,7026475,7026478,7026480,7026482-7026483,7026486,7026488,7026490-7026491,7026494-7026495,7026498,7026500,7026504,7026506,7026511,7026513,7026515,7026520,7026523,7026525,7026528,7026531,7026534,7026538,7026541,7026545,7026550,7026554,7026559,7026562,7026566,7026571,7026573,7026577,7026581,7026583,7026585,7026589,7026592,7026597,7026601,7026606,7026609,7026612,7026615,7026619,7026621,7026626,7026630,7026634,7026639-7026640,7026644,7026647,7026650,7026654,7026658,7026663,7026666,7026669,7026673,7026677,7026680,7026684,7026686-7026687,7026693,7026695,7026700,7026703,7026708,7026710,7026713,7026717,7026720,7026722,7026726,7026729,7026733,7026735,7026737,7026742,7026746,7026749,7026752,7026755,7026758,7026761,7026765,7026768,7026770,7026774,7026776,7026779,7026781,7026783-7026784,7026787,7026789,7026792,7026797-7026798,7026802,7026804-7026805,7026807,7026809,7026812,7026815,7026818-7026819,7026822-7026823,7026825,7026827,7026829,7026831,7026834,7026836-7026837,7026841,7026843,7026845,7026849,7026852-7026853,7026856,7026860,7026864,7026867,7026869,7026872,7026875,7026880,7026885,7026891,7026895,7026900,7026903,7026906,7026910,7026916,7026918,7026922,7026928,7026932,7026937,7026941,7026944,7026948,7026952,7026956,7026959,7026961,7026965,7026968,7026971,7026974,7026978,7026981,7026984,7026988,7026991,7026994,7026996,7026999,7027007,7027011,7027015,7027020,7027024,7027028,7027033,7027037,7027041,7027046,7027050,7027054,7027058,7027061,7027068,7027071,7027075,7027079,7027084,7027090,7027094,7027096,7027099,7027103,7027107,7027111,7027115,7027118,7027121,7027123,7027126,7027129,7027133,7027136,7027140,7027143,7027146,7027149,7027153,7027156,7027160,7027163,7027167,7027171,7027174,7027178,7028234,7028241,7028243,7028248,7028255,7028262,7028265,7028273-7028274,7028286,7028297,7028300,7028306,7028308,7028313,7028322,7028331,7028333,7028341,7028349,7028358,7028364,7028369,7028376,7028383,7028394,7028397,7028404,7028409,7028417,7028425,7028436,7028443,7028453,7028482,7028484,7028521,7028527-7028528,7028530,7028539,7028542,7028547,7028556,7028563,7028577,7028581,7028585,7028601,7028608,7028621,7028633,7028635,7028650,7028654,7028665,7028674,7028688,7028698,7028713-7028714,7028726,7028741,7028750,7028765-7028766,7028769,7028780,7028862-7028863,7028865,7028873,7028877,7028882,7028888,7028896,7028899,7028906,7028915,7028926,7028939,7028943,7028962,7028968,7028975,7028988-7028989,7029003,7029017-7029018,7029028,7029037,7029042,7029052,7029066,7029072,7029082,7029096,7029099,7029111,7029123,7029131,7029140,7029151,7029160,7029162,7029173,7029182,7029192,7029197,7029204,7029208,7029218,7029228,7029236,7029249,7029252-7029256,7029260-7029263,7029265,7029267,7029275,7029280,7029286,7029292,7029296,7029298,7029307,7029314,7029322,7029329,7029339,7029347,7029356,7029366,7029374,7029381,7029388,7029393,7029398,7029404,7029412,7029418,7029428,7029439,7029445,7029451,7029460,7029466,7029473,7029477,7029484,7029492,7029498,7029503,7029507,7029509,7029511,7029513,7029515,7029517,7029519,7029521,7029524-7029525,7029527,7029529,7029531-7029532,7029534,7029536,7029538,7029540,7029542,7029544-7029545,7029547,7029549-7029550,7029552,7029554,7029556-7029557,7029559,7029561,7029563-7029564,7029566,7029568-7029569,7029571,7029574,7029576-7029577,7029579,7029581-7029582,7029584,7029586,7029589,7029591,7029594,7029596-7029597,7029600,7029604,7029608,7029623-7029625,7029630,7029635,7029637,7029640,7029644,7029650,7029657,7029664-7029665,7029674-7029676,7029682,7029687,7029695,7029698,7029704,7029708,7029712,7029714,7029718,7029723,7029730,7029734,7029743,7029746,7029755,7029761,7029766,7029775,7029780,7029786,7029791,7029798,7029805,7029814,7029825,7029834,7029843,7029849,7029859,7029865,7029969-7029971,7029979,7029988,7030003,7030016,7030027,7030039,7030044,7030057,7030069,7030071,7030083,7030091,7030106,7030109,7030117,7030127,7030134,7030141,7030148,7030159,7030176,7030188,7030201,7030210,7030223,7030236,7030249,7030258,7030273,7030286,7030293,7030303,7030317,7030326,7030348,7030352,7030363,7030369,7030381,7030398,7030411,7030418,7030421,7030432,7030435,7030471,7030474-7030476,7030479,7030481-7030483,7030495,7030510,7030530,7030550,7030557,7030572,7030590,7030598,7030617,7030634,7030660,7030673,7030708,7030731,7030748,7030769,7030794,7030815,7030838,7030860,7030889,7030907,7030918,7030936,7030967,7030993,7031010,7031027,7031043,7031053,7031070,7031087,7031099,7031109,7031122,7031173-7031175,7031188,7031195,7031202,7031213,7031218,7031223,7031230,7031239,7031254,7031263,7031277,7031296,7031303,7031315,7031321,7031333,7031337,7031349,7031359,7031365,7031372,7031382,7031391,7031400,7031404,7031412,7031420,7031431,7031443,7031454,7031458,7031463,7031476,7031488,7031500,7031508,7031518,7031531,7031543,7031553,7031563,7031574,7031581,7031596,7031608,7031616,7031709,7031711,7031713-7031714,7031720,7031734,7031753,7031764,7031774,7031789,7031810,7031821,7031846,7031871,7031919,7031936,7031946,7031969,7031985,7032005,7032035,7032046,7032059,7032074,7032084,7032114,7032124,7032136,7032147,7032164,7032168,7032172,7032174,7032188,7032197,7032206-7032207,7032209,7032219,7032234,7032238,7032254,7032275,7032277-7032280,7032323,7032346,7032359,7032378,7032392,7032410,7032431,7032446,7032466,7032482,7032488,7032502,7032509,7032519,7032530,7032542,7032552,7032559,7032571,7032581,7032586,7032597,7032606,7032616,7032623,7032633,7032641,7032656,7032659,7032666,7032674,7032681,7032688,7032697,7032705,7032714,7032721,7032728,7032757-7032758,7032768,7032770,7032777,7032790,7032800,7032813,7032817,7032826,7032837,7032845,7032850,7032856,7032861,7032869,7032873,7032881-7032882,7032891,7032899,7032905,7032910,7032918,7032925,7032938,7032942,7032944,7032948,7032954,7032960,7032964,7032969,7032973,7032975,7033299,7033302,7041027,7041054,7041066,7041068-7041070,7041073,7041080-7041082,7041084-7041085,7041087,7041090-7041092,7041094,7041099,7041101-7041105,7041108,7041110,7041113-7041115,7041119-7041120,7041122,7041125,7041127,7041129,7041655,7041663,7041665,7041675-7041676,7041683,7041686-7041687,7041693,7041709,7041711,7041713-7041714,7041716-7041717,7041719-7041721,7041723-7041724,7041727,7041729,7041731,7041739-7041741,7042301,7042309,7042313,7042315,7042320,7042324,7042326,7042330,7042334,7042337,7042339,7042342,7042344,7042348,7042350,7042353,7042357,7042360,7042362,7042364,7042369,7042372,7042374,7042377,7042382,7042386,7042388,7042390,7042392-7042394,7042397,7042412,7042418,7042420,7042425-7042426,7042430,7042435,7042438,7042442-7042443,7042448,7042451,7042454,7042458,7042464,7042466,7042470-7042471,7042478,7042481,7042483,7042486,7042492-7042493,7042496,7042498,7042505,7042509,7042511,7042516,7042521,7042523,7042525,7042532,7042534,7042540,7042545,7042549,7042551,7042556,7042560,7042563,7042569,7042574-7042575,7042580,7042585,7042590,7042593,7042599,7042602,7042606,7042612,7042616,7042619,7042623,7042629-7042630,7042632,7042636,7042641,7042645,7042647,7042652-7042653,7042657,7042662,7042667,7042670,7042673,7042678,7042680,7042683,7042687-7042688,7042695,7042704,7042709,7042717,7042725,7042744,7042747,7042750,7042754-7042755,7042758,7042762-7042763,7042766,7042770-7042771,7042774,7042778-7042779,7042782-7042783,7042786,7042790,7042792,7042794,7042798-7042799,7042802,7042805,7042809-7042811,7042817-7042818,7042821,7042825,7042829-7042830,7042834,7042837-7042839,7042843,7042846,7042850-7042851,7042854,7042857,7042861-7042862,7042865,7042870-7042871,7042874,7042878-7042879,7042882,7042884,7042888,7042890,7042893-7042894,7042898,7042901,7042903,7042909,7042912,7042918-7042919,7042923,7042925,7042930,7042935,7042939-7042940,7042946,7042948,7042951,7042956,7042960,7042962,7042967,7042971,7042973,7042978,7042982,7042984-7042985,7042988,7042996,7043000,7043006,7043010,7043012,7043018,7043025,7043028,7043035,7043037,7043042,7043049,7043052,7043059,7043063-7043064,7043076,7043081,7043088,7043092,7043098,7043103,7043107,7043113,7043121,7043128,7043133,7043143,7043147,7043152,7043155,7043162,7043174,7043186,7043196,7043200,7043210,7043213,7043220,7043228,7043241,7043248,7043254,7043264,7043273,7043279,7043284,7043290,7043297,7043302,7043310,7043318,7043321,7043328,7043334,7043340,7043349,7043358,7043363,7043369,7043377,7043381,7043389,7043394,7043401,7043404,7043409,7043416,7043421,7043427,7043430,7045431,7045433-7045434,7045446,7045453,7045457,7045462,7045464,7045468,7045471,7045475,7045485,7045489,7045491,7045494-7045499,7045503,7045506,7045508-7045509,7045512-7045514,7045517-7045518,7045520-7045521,7045523,7045526-7045528,7045531,7045538,7045541,7045543,7045547-7045549,7045552-7045553,7045556-7045557,7045559,7045562-7045563,7045565-7045567,7045569,7045572-7045574,7045578-7045581,7045583-7045586,7045588-7045589,7045592,7045596-7045597,7045599,7045602-7045606,7045608-7045610,7045612,7045616-7045617,7045619-7045624,7045627-7045629,7045631,7045633-7045635,7045637-7045638,7045640-7045641,7045643,7045646,7045652,7045654-7045655,7045658,7045661-7045662,7045668-7045669,7045674-7045675,7045677,7045679,7045681-7045685,7045687,7045690,7045692-7045693,7045695,7045697-7045698,7045700,7045702,7045704,7045708-7045709,7045711-7045712,7045715,7045717-7045725,7045728-7045730,7045733-7045734,7045738-7045741,7045743-7045745,7045748-7045751,7045754-7045755,7045759,7045764-7045770,7045772,7045777-7045778,7045781,7045783,7045785-7045788,7045794-7045795,7045798,7045801,7045803-7045811,7045813,7045815-7045818,7045823,7045828-7045830,7045833,7045837-7045839,7045841-7045845,7045848-7045850,7045852-7045853,7045855,7045858-7045862,7045865-7045870,7045872-7045873,7045876,7045879,7045881-7045887,7045889-7045892,7045894,7045896-7045897,7045899,7045901-7045903,7045906-7045909,7045911,7045913-7045919,7045921,7045923,7045927,7045930-7045932,7045935-7045939,7045944-7045945,7045948,7045954,7045959-7045961,7045966,7045968-7045974,7045977,7045980,7045982,7045986,7045991-7045992,7045995,7045997,7046001,7046003,7046015,7046018,7046031,7046036,7046043,7049360-7049378,7049380-7049384,7049387-7049430,7049433,7049435-7049441,7049443-7049447,7049454,7050154,7050176,7050189,7050195,7050204,7050211,7050223,7050236,7050246,7050259,7050271,7050291,7050304,7050317,7050348,7050369,7050390,7050415,7050425,7050458,7050466,7050475,7050481,7084772,7084775,7084783,7084790-7084797,7084802,7084804,7084806-7084810,7084814,7084816-7084820,7084827,7084829-7084830,7084833-7084836,7084841,7084843,7084845,7084848,7084850,7084853-7084854,7084856,7084859,7084865-7084866,7084870,7084876,7084879,7084881,7084884,7084890,7084893,7084895,7084908-7084909,7100038,7100042-7100043,7100046,7100049,7100052,7100055,7100058,7100060,7100062,7100066,7100069,7100072,7100074,7100078,7100080,7100083,7100086,7100088,7100090,7100093,7100096,7100098,7100101,7100103,7100106,7100109,7100113,7100118,7100124,7100130,7100134,7100140,7100147,7100151,7100155,7100161,7100166,7100173,7100179,7100184,7100189,7100195,7100200,7100205,7100211,7100214,7100218,7100220,7100225-7100226,7100232,7100237,7100243,7100247,7100253,7100259,7100265,7100270,7100275,7100279,7100286,7100291,7100296,7100302,7100307,7100312,7100317,7100322,7100327,7100333,7100340,7100346,7100348,7100352,7100359,7100365,7100371,7100376,7100383,7100387,7100392,7100397,7100403,7100408,7100413,7100418,7100424,7100429,7100434,7100440,7100446,7100452,7100459,7100464,7100469,7100474,7100481,7100487,7100491,7100497,7100503,7100508,7100515,7100518,7100524,7100529,7100535,7100542,7100548,7100551,7100559,7100564,7100568,7100576,7100581,7100586,7100592,7100596,7100602,7100607,7100613,7100618,7100621,7100623,7100626,7100629,7100631,7100636,7100642,7100644,7100650,7100656,7100660,7100666,7100672,7100677,7100682,7100688,7100694,7100698,7100701,7100705,7100709,7100712,7100716,7100719,7100723,7100726,7100729,7100732,7100734,7100737,7100739,7100743,7100746,7100750,7100753,7100757,7100759,7100763,7100767,7100770,7100775,7100778,7100781,7100785,7100788,7100792,7100795,7100800,7100803,7100806,7100808,7100813,7100817,7100821,7100825,7100829,7100832,7100836,7100838,7100843,7100847,7100851,7100854,7100858-7100859,7100864,7100867,7100873,7100877,7100882,7100887,7100891,7100896,7100900,7100905,7100910,7100914,7100918,7100920,7100922-7100923,7100925,7100927,7100929,7100931,7100933,7100935,7100937,7100939,7100941,7100943,7100945,7100948,7100950,7100952,7100955,7100957,7100959,7100961,7100963,7100968,7100972,7100976,7100979,7100983,7100987,7100989,7100993,7100997,7101000,7101003,7101008,7101011,7101015,7101019,7101023,7101027,7101029,7101034,7101037,7101040,7101045,7101048,7101052,7101056,7101059-7101060,7101065,7101068,7101072,7101075,7101078,7101083,7101086,7101090,7101094,7101098,7101101,7101105,7101108,7101111,7101115,7101118,7101120,7101123-7101124,7101127,7101130,7101133,7101135,7101138,7101141,7101143,7101146,7101149,7101152,7101154,7101159,7101162,7101165,7101167,7101170,7101173,7101176-7101177,7101180,7101184,7101187,7101189,7101192,7101195,7101197,7101200,7101202,7101205,7101207,7103721,7103727,7103729-7103730,7103733-7103738,7103741-7103742,7103744,7103746-7103747,7103750,7103752,7103755,7103757-7103758,7103761-7103763,7103766-7103767,7103770,7103772-7103773,7103775-7103776,7103780-7103782,7103784-7103785,7103787-7103788,7103790,7103793-7103794,7103796-7103800,7103804,7103806,7103808,7103811-7103812,7103814,7103816-7103819,7103824,7103826,7103828,7103831-7103832,7103834-7103837,7103839,7103841-7103844,7103846,7103848-7103849,7103853,7103855-7103858,7103860,7103863,7103867,7103871-7103872,7103876-7103877,7103879-7103880,7103883-7103884,7103887-7103888,7103890,7103897,7103904-7103905,7103907,7103909-7103910,7103912,7103916-7103917,7103922-7103923,7103927,7103929-7103932,7103934-7103935,7103939-7103941,7103947,7103949-7103954,7103958-7103959,7103966,7103969,7103971,7103984,7103987,7103989,7103994-7103997,7104002,7104007,7104009,7104013-7104015,7104018-7104020,7104023,7104031,7104033,7104038,7104044,7104046,7104049,7104051-7104054,7104058,7104060,7104063,7104068,7104071,7104073-7104075,7104079-7104082,7104085-7104086,7104091,7104094,7104103-7104105,7104108,7104111-7104112,7104115,7104119-7104121,7104126,7104130,7104132,7104134,7104138,7104141,7104143-7104144,7104147,7104153,7104161-7104163,7104165-7104166,7104171,7104173,7104178,7104186,7104188-7104190,7104193,7104199,7104201,7104203-7104205,7104210-7104214,7104216-7104217,7104219,7104222-7104224,7104228,7104231,7104233,7104236,7104240,7104243-7104244,7104248,7104251-7104252,7104259,7104261,7104264,7104268,7104271-7104273,7104277-7104278,7104281,7104284,7104286,7104288,7104296,7104298,7104301,7104306-7104307,7104311,7104313-7104314,7104318,7104324-7104327,7104330-7104331,7104334,7104336,7104340-7104344,7104346-7104347,7104359-7104360,7104363,7104366-7104367,7104372-7104376,7104378,7104384-7104386,7104389-7104390,7104392,7104395,7104397,7104400-7104402,7104406,7104409,7104414,7104418,7104420,7104423-7104429,7104431,7104433,7104437,7104442-7104443,7104447,7104450,7104452,7104458-7104462,7104464-7104465,7104471,7104473,7104477-7104478,7104481,7104486-7104488,7104490-7104492,7104494,7104497-7104498,7104500,7104502,7104504,7104506,7104511,7104515,7104517-7104519,7104522-7104523,7104526-7104527,7104531,7104533-7104534,7104536,7104540,7104544,7104548-7104549,7104553,7104559-7104560,7104563,7104565,7117596,7117602,7117615,7117617,7117620,7117626,7117630,7117635,7117638,7117642,7117652,7117657,7117663,7117667,7117673,7117677,7117683,7117686,7117689,7117692,7117696,7118083,7118086,7118089,7118108,7118113,7118117,7118120,7118123,7118130,7118134,7118138,7118146,7118149,7118158,7118165,7118168,7118174,7118179,7118190,7118235,7118253,7118261,7118273,7118288,7118294,7118304,7118316,7118321,7118328,7118339,7118345,7118354,7118360,7118369,7118371,7118378,7118388,7118391,7118396,7118406,7118410,7118416,7118424,7118431,7118435,7118441,7118451,7118459,7118465,7118472,7118478,7118485,7118488,7118498,7118506,7118537,7118545,7118552,7118555,7118562,7118568,7118574,7118579,7118584,7118590,7118594,7118601,7118606,7118614,7118621,7118628,7118632,7118639,7118644,7118652,7118656,7118659,7118661,7118666,7118672,7118680,7118684,7142114,7142134,7142152,7142173,7142180,7142183,7142187,7142193-7142194,7142198,7142203,7142205,7142215,7142242,7142248,7142316,7142341,7142346,7142368,7142460,7142498,7142503,7142511,7142519,7142533,7142553,7142566,7142576,7142595,7142598,7142607,7143977,7143979,7143984,7143990,7143993,7144018,7144038,7144056,7144067-7144068,7144077,7144080,7144083,7144098,7144103,7144112,7144116,7144118,7144132,7144154,7144166,7144171,7144186,7144204,7144217,7144227,7144232,7144250,7144263,7144269,7144281,7144290,7144295,7144321,7144344,7144348,7144352,7144359,7144371,7144382,7144436,7144446,7144472,7144475,7144479,7144492,7144497-7144498,7144509,7150402,7150404,7150420,7150428,7150448,7150456-7150457,7150471,7150507,7150510,7150522,7150533,7150562,7150565,7150576,7150585,7150598,7150602,7150612,7150623,7150631,7150643,7150657,7150671,7150676,7150691,7150700,7150714,7150724,7150734-7150735,7150745,7150754,7150760,7150764,7150767,7150773,7150781,7150812,7150834,7150844,7150848,7150857,7150862,7150864,7150867,7150869,7150874,7150881,7150884,7150897,7150902,7150905,7150924,7150928,7150932,7150936,7150941,7150947,7150950,7150955,7150960,7150966,7150970,7150974,7150982,7150990,7150992,7150994,7151552,7151597,7151603,7151609,7151613,7151620,7151625,7151633,7151645,7151658,7151664,7151673,7151707,7151732,7151745,7151763,7151770,7151795,7151813,7151820,7151829,7151840,7151842,7151857,7151859,7151870,7151880,7151894,7151919,7151928,7151969,7151996,7152034,7152070,7152105,7152136,7152240,7152270,7152277,7152279,7152294,7152303,7152311,7152319,7152324,7152328,7152339,7152346,7152348,7152358,7152370,7152382,7152393,7152407,7152417,7152431,7152438,7152448,7152455,7152465,7152477,7152492,7152495,7152502,7152518,7152527,7152541,7152546-7152547,7181204,7181417,7181655,7182503,7182517,7182519,7182521-7182522,7182525,7182531,7182534,7182536,7182540-7182542,7182546,7182550-7182551,7182555,7182557,7184373,7184375-7184380,7184382,7184384-7184386,7184389,7184394-7184395,7184397-7184398,7184400,7184404,7184406,7184409-7184413,7184417-7184418,7184421-7184422,7184425-7184426,7184428-7184429,7184431,7184433,7189721,7201441,7201443,7201446-7201447,7201449-7201452,7201454,7203793,7207366 +alt.binaries.sounds.mp3.spoken-word: 3880291,3880294-3880296,3880304,3880306,3880308,3880310-3880316,3880320-3880321,3880326,3880332,3880334-3880335,3880337-3880338,3880340-3880342,3880344,3880346,3880349,3880351,3880638,3880649-3880650,3880654-3880656,3880658-3880660,3880662,3880664,3880667-3880675,3880677,3880679-3880683,3880685,3880687-3880689,3880691-3880819,3880822-3880835,3880837-3880838,3880841-3880842,3880845-3880849,3880852-3880856,3880860-3880862,3880865-3880870,3880872-3880884,3880888,3880891-3880897,3880899-3880902,3880904-3880905,3880907-3880911,3880913,3880915,3880917-3880919,3880921,3880924-3880930,3880934,3880937-3880938,3880940-3880941,3880944-3880945,3880947-3880951,3880953,3880955-3880961,3880963-3880971,3880973-3880974,3880977-3880980,3880985,3880989-3880991,3880994,3880996-3881000,3881002-3881003,3881005-3881007,3881009,3881011,3881013-3881015,3881017-3881024,3881026-3881027,3881029-3881030,3881034-3881035,3881037-3881040,3881043-3881044,3881046-3881052,3881054-3881055,3881058-3881063,3881065,3881068-3881069,3881071-3881074,3881077-3881085,3881087-3881094,3881096-3881100,3881104-3881106,3881110,3881112-3881117,3881120-3881123,3881126,3881129,3881131-3881132,3881138,3881151-3881152,3881154-3881156,3881161,3881281-3881282,3881284,3881286,3881294,3881298,3881303,3881307,3881310,3881313-3881316,3881318,3881320,3881322,3881326-3881334,3881337-3881344,3881346,3881349-3881352,3881354-3881355,3881360-3881361,3881363-3881364,3881366-3881369,3881371-3881378,3881381,3881385-3881386,3881389-3881398,3881401,3881403,3881653,3881655,3881661,3881668-3881670,3881672,3881680,3881682-3881684,3881686-3881688,3881692-3881693,3881695-3881696,3881699,3881701-3881703,3881705-3881707,3881709-3881710,3881712,3881715-3881716,3881720-3881723,3881725-3881726,3881728-3881730,3881733-3881737,3881739-3881743,3881747,3881749-3881753,3881755-3881756,3881758-3881761,3881763,3881765-3881766,3881769-3881779,3881782-3881785,3881787-3881788,3881790-3881792,3881794,3881797-3881798,3881800-3881801,3881803-3881804,3881806-3881810,3881812,3881816-3881819,3881821-3881822,3881824-3881832,3881834,3881836-3881837,3881839-3881844,3881846-3881847,3881849-3881850,3881852-3881856,3881858,3881860,3881862-3881865,3881867-3881869,3881872-3881874,3881876,3881878-3881883,3881889-3881892,3881894-3881898,3881900,3881903-3881915,3881918,3881920-3881923,3881925,3881927,3881930-3881941,3881943-3881946,3881948-3881954,3881956-3881957,3881959-3881969,3881971-3881978,3881980-3881982,3881984-3881992,3881994-3881999,3882001-3882009,3882011-3882017,3882019-3882020,3882023-3882031,3882033,3882036-3882043,3882046-3882049,3882051-3882057,3882059-3882062,3882064-3882073,3882075,3882077-3882082,3882084-3882088,3882090-3882101,3882103-3882109,3882111,3882113-3882119,3882122-3882131,3882133,3882135-3882136,3882138,3882140-3882143,3882145,3882147-3882148,3882150-3882154,3882156,3882158-3882162,3882164,3882168,3882171-3882172,3882175,3882178,3882186,3888407,3888414-3888415,3888417-3888420,3888423,3888425,3888428,3888431-3888434,3888436-3888437,3888440-3888441,3888443,3888446-3888447,3888450,3888452-3888453,3888456,3888459,3888461-3888463,3888466,3888468-3888470,3888474-3888475,3888477-3888480,3888482-3888484,3888488-3888489,3888492,3888494-3888495,3888497-3888498,3888501,3888503-3888505,3888508-3888509,3888511,3888513,3888516-3888517,3888519-3888521,3888523,3888525,3888528-3888530,3888532,3888534,3888538-3888543,3888546,3888548-3888550,3888553-3888554,3888557-3888558,3888560,3888562,3888567-3888570,3888572,3888574,3888576,3888579,3888581-3888583,3888585,3888587,3888589,3888591-3888592,3888594,3888596-3888606,3888609,3888612,3888614-3888615,3888618-3888619,3888622,3888625,3888628,3888633,3888635-3888637,3888640,3888643-3888646,3888648-3888652,3888655,3888657,3888659,3888661,3888664-3888666,3888672-3888673,3888675,3888677-3888679,3888681,3888683-3888685,3888687,3888689,3888691,3888693-3888695,3888698,3888700,3888703,3888705,3888707,3888709,3888712-3888713,3888715-3888720,3888722-3888723,3888725-3888727,3888730,3888732,3888735,3888737,3888745 +alt.binaries.sounds.mp3.gothic-industrial: 2394533-2394534,2394538-2394539,2394541-2394544,2394547-2394552,2394554,2394561-2394562 +alt.binaries.sounds.mp3.heavy-metal: 7170179,7170185,7170227,7170235-7170236,7170239,7172845,7172849,7172863,7172870,7172872,7172877,7172885-7172886,7172891,7172895,7172901,7172907-7172908,7172917,7172919,7172924,7172927,7172932,7172945,7172955,7172961-7172962,7172968,7172974,7172986,7172992,7173289,7173299,7173307,7173311,7173319,7173327,7173330,7173332,7173337,7173343,7173346,7173355,7173361,7173363-7173364,7173372-7173373,7173386,7173389,7173393,7173396,7173400,7173418,7173420,7173501,7173507,7173520,7173525,7173533,7173535-7173536,7173543,7173553,7173557,7173559,7173562,7173565,7173576,7173585,7173603,7173606,7173611,7173614,7173620,7173631-7173632,7173640-7173641,7173644,7173647-7173650,7173659,7173667,7173678-7173679,7173693-7173694,7173697,7173721,7173733,7173753,7173776,7173795,7173797,7173819,7173825-7173826,7174996,7175008,7175011,7175027-7175028,7175030,7175033,7175047,7175050-7175051,7175054,7175057-7175058,7175062-7175063,7175067,7175078,7175092,7175094,7175222,7175248,7175254,7175262,7175269,7175273,7175281,7175293,7175303,7175307,7175312-7175313,7175328-7175329,7175333,7175346,7175352-7175354,7175367,7175373,7175377,7175385,7175389,7175392,7175398,7175401,7175409,7175444,7175457,7175465,7175474,7175481,7175487-7175488,7175491,7175497,7175510,7175514-7175515,7175518,7175532,7175544,7175548,7175558,7175561-7175562,7175565,7175571,7175576,7175588,7175591-7175592,7175594,7175596,7175598,7175600,7175607,7175609,7175617,7175619,7175623,7175631,7175646,7175675,7175677-7175679,7175683,7175687,7175691-7175692,7175696,7175703,7175705,7175715,7175718,7175726,7175736,7175746,7175752,7175754,7175760-7175762,7175773,7175949,7175962,7175965,7175967,7175978,7175980-7175981,7175987,7175990,7175995,7175998,7176001,7176003-7176004,7176008,7176010,7176015,7176017,7176024,7176030,7176033-7176035,7176040,7176042,7176044,7176050-7176051,7176055,7176057,7176063,7176065,7176067,7176069,7176071-7176073,7176079,7176081,7176086,7176088,7176090,7176095,7176097,7176105-7176106,7176112-7176113,7176115,7176124,7176513-7176514,7176523,7176532,7176539,7176552,7176557,7176566,7176569,7176580,7176595,7176597-7176598,7176602,7176610-7176611,7176617,7176621,7176624,7176627,7176640,7176643,7176645,7176658,7176660,7176979,7176985,7176995,7176999,7177007,7177012,7177016,7177023,7177027-7177028,7177036,7177040,7177047,7177064-7177065,7177079-7177080,7177086,7177088,7177102,7177105,7177110,7177117,7177119,7177128,7177130,7177133,7177145,7177156,7177158,7177162,7177169,7177171,7177181,7177199,7177201,7177203,7177205,7177210,7177212,7177221,7177227-7177229,7177239,7177243,7177245,7177250,7177256,7177260,7177274,7177276,7177279,7177286,7177290,7177300-7177301,7177307,7177313,7177320,7177322,7177326-7177327,7177331,7177336,7177338,7177349,7177357-7177358,7177362,7177364,7177366,7177380,7177386,7177388-7177391,7177395,7177398,7177400,7177402,7177405,7177409,7177412-7177414,7177416,7177418,7177421-7177422,7177425,7177427-7177428,7177430,7177432-7177433,7177440-7177441,7177444,7177447,7177449,7177454-7177455,7177459-7177460,7177462,7177469-7177470,7177475-7177476,7177480-7177481,7177483,7177490,7177492,7177500,7177504,7177506,7177509,7177512,7177514-7177516,7177521,7177523,7177526,7177529,7177531,7177533-7177534,7177539,7177541,7177544-7177545,7177548,7177550-7177551,7177553,7177555,7177559,7177561,7177563-7177564,7177566,7177568,7177571,7177573,7177575-7177576,7177578,7177580,7177585,7177587,7177589,7177592-7177593,7177596,7177598-7177604,7177606-7177614,7177617,7177623,7177626,7177631,7177644,7177650,7177656-7177657,7177669,7177674,7177688,7177694,7177703,7177711,7177720,7177725,7177732,7177743,7177752 diff --git a/tags/ripnews-release_0_5_3/ripnews/news/tests/newsrc_test.rb b/tags/ripnews-release_0_5_3/ripnews/news/tests/newsrc_test.rb new file mode 100755 index 0000000..1405be7 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/news/tests/newsrc_test.rb @@ -0,0 +1,16 @@ +#!/usr/local/bin/ruby + +require '../newsrc.rb' + +def test1 + print "Test 1\n" + @newsrc = News::Newsrc.new("newsrc.news.wizeazz.nl") + + print @newsrc.get_articles("alt.binaries.sounds.mp3.gothic-industrial") + print "\n" + @newsrc.unmark_range("alt.binaries.sounds.mp3.gothic-industrial", 0, 2394540) + print @newsrc.get_articles("alt.binaries.sounds.mp3.gothic-industrial") + print "\n" +end + +test1 diff --git a/tags/ripnews-release_0_5_3/ripnews/notes/release-tar b/tags/ripnews-release_0_5_3/ripnews/notes/release-tar new file mode 100644 index 0000000..21e6618 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/notes/release-tar @@ -0,0 +1,18 @@ +./CHANGELOG +./INSTALL +./README +./TODO +./encode/tests/testdata +./encode/tests/testdata.uu +./encode/tests/testdata.ync +./encode/tests/uu_test.rb +./encode/tests/yenc_test.rb +./encode/uuencode.rb +./encode/yenc.rb +./net/nntp.rb +./news/tests/newsrc.news.wizeazz.nl +./news/tests/newsrc_test.rb +./news/article.rb +./news/newsrc.rb +./ripnews.rb +./set/intspan.rb diff --git a/tags/ripnews-release_0_5_3/ripnews/notes/releasing b/tags/ripnews-release_0_5_3/ripnews/notes/releasing new file mode 100644 index 0000000..5154e74 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/notes/releasing @@ -0,0 +1,10 @@ +Zorg dat alles opgeruimd is. Ga in de ripnews worktree staan en tag de +release. + +cvs -q tag ripnews-release_0_2_2 + +Hierna kunnen de release files getarred worden. In de file "release-tar" +staan de filenames die meegenomen moeten worden en de handige manier om +dit te gebruiken is: + +tar -czvf /tmp/ripnews-0.2.2.tgz -s /./ripnews-0.2.2/ -I notes/release-tar diff --git a/tags/ripnews-release_0_5_3/ripnews/ripnews.rb b/tags/ripnews-release_0_5_3/ripnews/ripnews.rb new file mode 100755 index 0000000..8a1cdab --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/ripnews.rb @@ -0,0 +1,830 @@ +#!/usr/bin/ruby -w + +# $Dwarf: ripnews.rb,v 1.107 2005/06/06 12:53:10 ward Exp $ +# $Source$ + +# +# Copyright (c) 2002, 2003, 2004, 2005 Ward Wouts +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# + +require 'date' +require 'ftools' +require 'time' +require 'getoptlong' +require 'news/article' +require 'news/newsrc' +require 'tempfile' +require 'thread' +require 'thwait' +require 'encode/uuencode' +require 'encode/yenc' + +########################################################################### + +########################################################################### + +# memory profiling stuff +MEntry = Struct.new( "MEntry", :c, :mem ) +class MEntry; def to_s() "#{c} : #{mem}"; end; end + +GroupEntry = Struct.new( "GroupEntry", :c, :mem, :total ) +class GroupEntry; def to_s() "#{mem}\t\t#{c} x#{total}"; end; end + +def profile_mem(group) +end +def aprofile_mem(group) + t = Thread.new { + groups = {} + ObjectSpace.each_object { |x| + if not [Array,Hash].include? x.class + e = nil + begin + e = MEntry.new( x.class, Marshal::dump(x).size ) + rescue TypeError # undumpable + e = MEntry.new( x.class, 0 ) + end + if groups.has_key? e.c + groups[e.c].mem += e.mem + groups[e.c].total += 1 + else + groups[e.c] = GroupEntry.new( e.c, e.mem, 1 ) + end + end + } + File.open( "mem_log", "a+" ) { |file| + file << "Group #{group}\n" + total = 0 + file << "bytes/class/count\n" + groups.to_a.sort_by { |e| e[1].mem }.each { |e| + file << "#{e[1]}\n"; total += e[1].mem } + file << "TOTAL == #{total}\n\n" + } + } + sleep 10 + t.join +end +########################################################################### + +Debuglevel = 0 +@tstart = Time.now + +def save_file(dir, name, data) + print "savename: #{name}\n" if Debuglevel > 1 + + nname = name.gsub(/\//, "-") + nname.gsub!(/>/, "") + nname.gsub!(/ 1 + newname = nname[0...@maxfilelength] # all the recodings could have made + # the filename too long + count = 1 + d = Date.today + date = "#{d.year}#{d.month}#{d.mday}" + while FileTest.exists?("#{dir}/#{newname}") + newname = "#{nname}-<#{date}.#{count}>" + count += 1 + end + print "name: #{newname}\n" if Debuglevel > 1 + + begin + case data.class.to_s + when "String" + if File.move(data, "#{dir}/#{newname}") + print " Saving as: '#{newname}'\n" + else + print "couldn't rename tempfile\n" + return false + end + when "Array" + if file = File.new("#{dir}/#{newname}", "w", 0644) + print " Saving as: '#{newname}'\n" + data.collect{|i| file.print "#{i}"} + else + print "couldn't open file for writeing\n" + return false + end + when "Tempfile" + if File.move(data.path, "#{dir}/#{newname}") + print " Saving as: '#{newname}'\n" + else + print "couldn't rename tempfile\n" + return false + end + else + print "EEEEPS Can't save data of class: #{data.class.to_s}\n" + return false + end + rescue Errno::ENOENT, Errno::EINVAL + print "Caught #{$!.class} (save_file)\n" + print "Error: #{$!}\n" + print "What the *beep* happened?\n" + print "(if Errno::EINVAL probably evil chars in filename)\n" + return false + end + return true +end + +def parse_options(options) + begin + opts = GetoptLong.new( + [ "-I", "--include", GetoptLong::REQUIRED_ARGUMENT ], + [ "-c", "--configfile", GetoptLong::REQUIRED_ARGUMENT ], + [ "-L", "--longname", GetoptLong::NO_ARGUMENT ], + [ "-C", "--combinedname", GetoptLong::NO_ARGUMENT ], + [ "-M", "--multipart", GetoptLong::NO_ARGUMENT ], + [ "-s", GetoptLong::NO_ARGUMENT ], + [ "-S", "--singlepart", GetoptLong::NO_ARGUMENT ], + [ "-T", "--test", GetoptLong::NO_ARGUMENT ], + [ "-X", "--exclude", GetoptLong::REQUIRED_ARGUMENT ] + ) + opts.quiet=true + + opts.each do |opt, arg| + options[opt] = arg + end + rescue GetoptLong::InvalidOption + print "#{$!}\n" + usage + end + return options +end + +def usage + print "\nUsage:\n\n" + print "ripnews.rb [-I ] [-c ] [-L] [-C] [-M] [-S] [-T] [-X ]\n\n" + print "-I specify an include pattern\n" + print "-c specify an alternate configfile\n" + print "-L use subject as filename\n" + print "-C use combined filenames\n" + print "-M get multipart articles\n" + print "-s exit silently if already running\n" + print "-S get singlepart articles\n" + print "-T test mode, don't update newsrc file\n" + print "-X specify an exclude pattern\n" + exit +end + +def parse_config(default = {}) + if ! default.has_key?('-s') + print "Parsing config\n" + print "#{default['-c']}\n" + end + if FileTest.readable?("#{default['-c']}") + file = File.new("#{default['-c']}") + lines = file.readlines + else + lines = [] + end + + i = 0 + group = "" + grouparr = [] + config = {} + + lines.collect!{|x| + x.gsub!(/\$\{HOME\}/, "#{ENV['HOME']}") + if x =~ /^\s*INCLUDEFILE=(.*?)\s*$/i + x = File.new($1).readlines + end + x + } + + lines.flatten! + + lines.collect!{|x| + x.sub!(/^\s*/, "") + x.sub!(/\#.*$/, "") + x.sub!(/\s*$/, "") + x.gsub!(/\$\{HOME\}/, "#{ENV['HOME']}") + x.chomp + } + while i < lines.length + line = lines[i] + while line.sub!(/\s*\\$/, "") != nil + line << lines[i+1] + i += 1 + end + line.sub!(/\s*$/, "") + i += 1 + if line =~ /^OPT_(.*?)=(.*)/ + line = "-#{$1}=#{$2}" + end + print "#{i}: #{line}\n" if Debuglevel > 1 + if line =~ /(.*?)\s*\+=\s*(.*)/ + if group == "" + if default.has_key?($1) + default[$1] << $2 + else + default[$1] = $2 + end + else + grouparr.collect{|g| + if config[g].has_key?($1) + config[g][$1] << $2 + elsif default.has_key?($1) + config[g][$1] = default[$1] + $2 + else + config[g][$1] = $2 + end + } + end + elsif line =~ /(.*?)\s*=\s*(.*)/ + if group == "" + default[$1] = $2 + else + grouparr.collect{|g| + config[g][$1] = $2 + } + end + elsif line =~ /(.*?)\s*\{/ + group = $1 + grouparr = group.split('|') + grouparr.collect{|g| + config[g] = {} unless config.has_key?(g) + } + elsif line =~ /^\}$/ + default.each_key{|x| + grouparr.collect{|g| + config[g][x] = default[x].dup unless config[g].has_key?(x) + } + } + group = "" + grouparr = [] + elsif line =~ /^$/ + next + else + print "Error parsing config on line: #{i}\n" + return false + end + end + + if group != "" + print "Error parsing config: group not terminated on line #{i}\n" + return false + end + + if Debuglevel > 2 + config.each_key{|x| + print "Group: #{x}\n" + config[x].each_key{|y| + print "Key: '#{y}' => Value: '#{config[x][y]}'\n" + } + } + end + return config +end + +def check_config + if @config.length == 0 + print "No configuration, nothing to do\n" + exit + end + @config.each_key {|i| + unless @config[i].has_key?("-I") + print "No inclusions given for group #{i}. Won't match anything.\n" + end + @config[i]["DATADIR"] ="." unless @config[i].has_key?("DATADIR") + @config[i]["PERMISSION"] = "0755" unless @config[i].has_key?("PERMISSION") + if @config[i].has_key?("EXTENSIONS") + @config[i]["-S"] = @config[i]["EXTENSIONS"] + @config[i]["-M"] = @config[i]["EXTENSIONS"] + end + if @config[i].has_key?("DELEXT") + @config[i]["-SD"] = @config[i]["DELEXT"] + @config[i]["-MD"] = @config[i]["DELEXT"] + end + @config[i]["-M"] = "(?!.*)" if @config[i].has_key?("-S") and ! @config[i].has_key?("-M") + @config[i]["-S"] = "(?!.*)" if @config[i].has_key?("-M") and ! @config[i].has_key?("-S") + } +end + +def lock + group = @config.keys[0] + if @config[group].has_key?("LOCKFILE") + if FileTest.exists?(@config[group]["LOCKFILE"]) + lock = File.open(@config[group]["LOCKFILE"], "r") + pid = lock.gets + lock.close + if pid + pid.chomp! + begin + Process.kill(0, pid.to_i) + if ! @config[group].has_key?('-s') + print "Already running, exiting...\n" + end + exit + rescue Errno::ESRCH + print "Stale lock found... removing...\n" + File.unlink(@config[group]["LOCKFILE"]) + end + else + print "Empty lockfile found... removing...\n" + File.unlink(@config[group]["LOCKFILE"]) + end + end + lock = File.new(@config[group]["LOCKFILE"], "w") + lock.print "#{Process.pid}\n" + lock.close + end +end + +def unlock + group = @config.keys[0] + File.unlink(@config[group]["LOCKFILE"]) +end + +def renice + group = @config.keys[0] + if @config[group].has_key?("NICE") + Process.setpriority(Process::PRIO_PROCESS, 0, @config[group]["NICE"].to_i) + end +end + +def get_single(subj, group) + print "Fetching singlepart article: #{subj}\n" + body = @articles.get_group_body(subj) + if UUEncode.is_uuencoded(body) + filename = UUEncode.get_filename(body) + print " filename #{filename}\n" + unless check_ext(group, filename, "s", subj) + print " Skipping article...\n" + return false + end + print " UUDecoding...\n" + mode, filename, body = UUEncode.uudecode(body) + elsif YEnc.is_yencoded(body) + filename = YEnc.get_filename(body) + unless check_ext(group, filename, "s", subj) + print " Skipping article...\n" + return false + end + print " YDecoding...\n" + mode, filename, body = YEnc.ydecode(body) + else + print " Unknown encoding (not UU, not yEnc), skipping...\n" + return false + end + if mode == false + print " Decoding failed skipping article...\n" + return false + end + output_data(subj, mode, filename, body) + return true +end + +def get_multi(subj, group) + print "Fetching multipart article: #{subj}\n" + body = @articles.get_group_body_first(subj) + if UUEncode.is_uuencoded(body) or YEnc.is_yencoded(body) + if UUEncode.is_uuencoded(body) + filename = UUEncode.get_filename(body) + print " filename #{filename}\n" + unless check_ext(group, filename, "m", subj) + print " Skipping article...\n" + return false + end + elsif YEnc.is_yencoded(body) + print "yencc\n" + filename = YEnc.get_filename(body) + print "filename #{filename}\n" + unless check_ext(group, filename, "m", subj) + print " Skipping article...\n" + return false + end + end + + if @config[group]["TEMPDIR"] == nil or @config[group]["TEMPDIR"] == "" + bodyrest = @articles.get_group_body_rest(subj) + unless bodyrest + print " Skipping article...\n" + return false + end + body.concat(bodyrest) + else + file = Tempfile.new("riptmp", @config[group]["TEMPDIR"]) + body.collect{|x| file.print "#{x}\n"} + + unless @articles.get_group_body_rest(subj, file) + print " Skipping article...\n" + return false + end + fileout = Tempfile.new("riptmp", @config[group]["TEMPDIR"]) + end + + @decode_threads << Thread.new(body, file, fileout, subj) do |tbody, tfile, tfileout, tsubj| +# puts "inside thread pre pass\n" + Thread.pass +# puts "inside thread post pass\n" + if UUEncode.is_uuencoded(tbody) + print " UUDecoding...\n" + if tfile + tmode, tfilename, tbody = UUEncode.uudecode(tfile, tfileout) + else + tmode, tfilename, tbody = UUEncode.uudecode(tbody) + end + elsif YEnc.is_yencoded(tbody) + print " YDecoding...\n" + begin + if tfile + tmode, tfilename, tbody = YEnc.ydecode(tfile, tfileout) + else + tmode, tfilename, tbody = YEnc.ydecode(tbody) + end + rescue YencError + # XXX if there is a yenc problem I want the data so I can research it + output_data(tsubj, 0600, "YencProblem", tbody) + # XXX return succes even though it's not true + Thread.current.exit + rescue PermError + print "#{$!}\n" + print " Skipping article...\n" + Thread.current.exit + end + end + if tmode == false + print " Decoding failed skipping article...\n" + Thread.current.exit + end + + if tfile + # horrible cheat to not lose the outputted file + tbody = tfileout.path + tbodybase = tbody.sub(/\/[^\/]*$/, "/ripnewsdecode") + i = 1 + while FileTest.exists?("#{tbodybase}-#{i}") + i += 1 + end + File.move(tbody, "#{tbodybase}-#{i}") + tbody = "#{tbodybase}-#{i}" + tfile.close + tfileout.close(false) + end + output_data(tsubj, tmode, tfilename, tbody) + end # thread end + +# puts "ouside thread\n" + + return true + else + print " Unknown encoding (not UU, not yEnc), skipping...\n" + return false + end +end + +def fill_preselector(group) + if @config[group].has_key?("-I") and !(@config[group].has_key?("-MRR") and @config[group]["-MRR"]) + @articles.set_preselect_pattern(Regexp.new(@config[group]["-I"])) + end +end + +def output_data(subject, mode, filename="", body="") + group = @articles.get_groupname + print " mode: #{mode}\n" if Debuglevel > 0 + print " Filename: '#{filename}'\n" if Debuglevel > 0 + + # de-crap subject... + sub = subject.sub(/\s*$/, "") # strip trailing spaces + sub.sub!(/^[\s\.!-#]*/, "") # strip leading spaces, dots, exclamation points, dashes and hashes + + # decide on a filename + if @config[group].has_key?("-L") and @config[group]["-L"] + print "longname\n" if Debuglevel > 1 + outfile = sub[0...@maxfilelength] + elsif @config[group].has_key?("-C") and @config[group]["-C"] + print "combinedname\n" if Debuglevel > 1 + outfile = sub[0...@maxfilelength-filename.length-3] + outfile = "#{outfile} [#{filename}]" + if outfile.length > @maxfilelength + outfile = filename[0...@maxfilelength] + end + else + print "shortname\n" if Debuglevel > 1 + outfile = filename[0...@maxfilelength] + end + + # do the actual saving + if save_file("#{@config[group]["DATADIR"]}/#{group}", outfile, body) + @newsrc_lock.synchronize { + @articles.group_update_newsrc(subject) + _save_newsrc(group) + } + end +end + +def check_ext(group, filename, mode, subject) + case mode + when "s" + if @config[group].has_key?("-SD") && ( filename =~ /\.(#{@config[group]["-SD"]})$/ ) + print "Marking '#{subject}' as read\n" + @articles.group_update_newsrc(subject) + return false + end + return @config[group].has_key?("-S") ? ( filename =~ /\.(#{@config[group]["-S"]})$/ ) : true + when "m" + if @config[group].has_key?("-MD") && ( filename =~ /\.(#{@config[group]["-MD"]})$/ ) + print "Marking '#{subject}' as read\n" + @articles.group_update_newsrc(subject) + return false + end + return @config[group].has_key?("-M") ? ( filename =~ /\.(#{@config[group]["-M"]})$/ ) : true + else + print "Illegal mode \"#{mode}\" in check_ext\n" + exit + end +end + +def get_max_file_length(tempdir=".") + if ! FileTest.directory?("#{tempdir}") || ! FileTest.writable?("#{tempdir}") + print "Tempdir '#{tempdir}' is not a writable directory\n" + exit + end + # this is quite stupid, there is no guarantee at all the generated file names + # don't already exist + name = "a"*500 + name = "#$$#{name}" + begin + file = File.new("#{tempdir}/#{name}", "w", 0644).close + File.delete("#{tempdir}/#{name}") + rescue Errno::ENAMETOOLONG + name = name[0...-1] + retry + rescue Errno::ENOENT + print "#{$!}\n" + print "strange...\n" + retry + end + # this is how many characters are still likely to be appended + # is the filename already exists '-<#{date}.#{count}>' in save_file + # this could be brought back to 5 '-<#{count}>' ... + return name.length - 14 +end + +def ward_sort(a, b) + c = a.to_s.split(/([0-9]+)/) + d = b.to_s.split(/([0-9]+)/) + + c.collect{|x| + y = d.shift + r = ((x.to_s =~ /^[0-9]+$/) && (y.to_s =~ /^[0-9]+$/)) ? + (x.to_i <=> y.to_i) : + (x.to_s <=> y.to_s) + if r != 0 + return r + end + } + return -1 if (d != []) + return 0 +end + +def startup + $stdout.sync=true # line buffered output + @defaults = {'-c' => "#{ENV['HOME']}/.ripnewsrc"} + @defaults = parse_options(@defaults) + @config = parse_config(@defaults) + exit if @config == false + check_config + lock + renice + + trap("HUP") { + print "Rereading config...\n" + config = parse_config(@defaults) + if config != false + @config = config + check_config + print "Done reading config\n" + else + print "Keeping old config due to errors\n" + end + } + + @maxfilelength = get_max_file_length(@config[@config.keys[0]]["TEMPDIR"]) + + print "\n$Id$\n" + print "Starting: #{@tstart}\n" + + if Debuglevel > 2 + @config.each_key{|i| + print "Group: #{i}\n" + @config[i].each_key{|j| + print "Opt: #{j} val: #{@config[i][j]}\n" + } + } + end +end + +def main + profile_mem("out side of loop still") + for group in @config.keys.sort + @decode_threads = [] + @newsrc_lock = Mutex.new + profile_mem("#{group} start") + print "\nGetting articles for #{group}\n" + @articles = Article.new(@config[group]["NNTPSERVER"], group, @config[group]["NEWSRCNAME"]) + fill_preselector(group) + print "initialized\n" + @articles.get_articles(@config[group]["CACHEDIR"]) + + profile_mem("#{group} articles read") + + _create_group_dir(group) + + for subj in @articles.get_group_subjects.sort{|a, b| ward_sort(a, b)} + print "#{subj}\n" if Debuglevel > 2 + # explicitly mark as read + if @config[group].has_key?("-MR") and subj =~ /#{@config[group]["-MR"]}/ + print "Marking '#{subj}' as read\n" + _mark_read(subj) + # get the juicy bits + elsif !(@config[group].has_key?("-X") and subj =~ /#{@config[group]["-X"]}/) and + subj =~ /#{@config[group]["-I"]}/ + print "Match: #{subj}\n" if Debuglevel > 0 + _get_article(subj, group) + else + _mark_remaining(subj, group) + end + end + + _wait_for_threads + _save_newsrc(group) + + @articles.quit + @articles = nil + profile_mem("#{group} pre-GC") + GC.start + profile_mem("#{group} end") + end +end + +def ending + tend = Time.now + print "\nFinished: #{tend}\n" + runtime = (tend - @tstart).to_i + h=runtime/3600 + m=runtime%3600 + s=m%60 + m=m/60 + printf("Running time: %02d:%02d:%02d\n", h, m, s) + unlock +end + +def _create_group_dir(group) + unless FileTest.directory?("#{@config[group]["DATADIR"]}/#{group}") or + Dir.mkdir("#{@config[group]["DATADIR"]}/#{group}", @config[group]["PERMISSION"].oct) + print "eeeps, couldn't create dir\n" + exit + end +end + +def _primary_thres_skip(subj, group) + if @config[group].has_key?("PRIMARYTHRES") + if ( @articles.group_percentage_primary(subj) < @config[group]["PRIMARYTHRES"].to_i ) + print "Only #{@articles.group_percentage_primary(subj)}% on primary, skipping: #{subj}\n" + return true + end + end + return false +end + +def _fallback_thres_skip(subj, group) + if @config[group].has_key?("FALLBACKTHRES") + if ( @articles.group_percentage_fallback(subj) > @config[group]["FALLBACKTHRES"].to_i ) + print "#{@articles.group_percentage_fallback(subj)}% only on fallback, skipping: #{subj}\n" + return true + end + end + return false +end + +def _mark_read(subj) + @articles.group_update_newsrc(subj) +end + +def _get_article(subj, group) + if @articles.group_is_complete(subj) + skip = false + skip = _primary_thres_skip(subj, group) ? true : skip + skip = _fallback_thres_skip(subj, group) ? true : skip + if ! skip + begin + if @articles.group_is_singlepart(subj) + get_single(subj, group) + elsif @articles.group_is_multipart(subj) + get_multi(subj, group) + end + rescue TempError, PermError, YencError + print "#{$!}\n" + print " Skipping article...\n" + #print "Caught #{$!.class}\n" + #print "Error: #{$!}\n" + end + end + else + print "Not complete: #{subj}\n" + end +end + +def _mark_remaining(subj, group) + # if Mark Remaining Read is set do so + if @config[group].has_key?("-MRR") and @config[group]["-MRR"] and + !(@config[group].has_key?("-X") and subj =~ /#{@config[group]["-X"]}/) and + !(subj =~ /#{@config[group]["-I"]}/) + if subj =~ /#{@config[group]["-I"]}/ + puts "fucking up here" + end + print "Marking remaining '#{subj}' as read\n" + @articles.group_update_newsrc(subj) + end +end + +def _wait_for_threads + # wait for threads if there are any + if ! @decode_threads.empty? + @articles.disconnect + puts "Waiting for decode threads..." + ThreadsWait.all_waits(@decode_threads){ |t| + puts "Thread #{t} has terminated" + } + puts "Decode threads all done" + end +end + +def _save_newsrc(group) + @articles.save_newsrc unless @config[group].has_key?("-T") and @config[group]["-T"] +end + +startup +main +ending diff --git a/tags/ripnews-release_0_5_3/ripnews/set/intspan.rb b/tags/ripnews-release_0_5_3/ripnews/set/intspan.rb new file mode 100644 index 0000000..d4a2603 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/set/intspan.rb @@ -0,0 +1,919 @@ +# $Dwarf: intspan.rb,v 1.20 2005/03/11 12:17:35 ward Exp $ +# $Source$ + +# +# Copyright (c) 2002, 2003 Ward Wouts +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# + +class Integer + def even? + return self%2 == 0 + end + + def odd? + return self%2 == 1 + end +end + +module Set + +class IntSpan + +Empty_String = '' +Debuglevel = 0 + +def initialize(setspec=nil) + print "initialize: Calling copy\n" if Debuglevel > 0 + copy(setspec) +end + +def IntSpan.valid(run_list) + testset = new + begin + testset._copy_run_list(run_list) + rescue SystemExit + return false + end + return true +end + +def copy(set_spec) + print "Copy #{set_spec.class.to_s}\n" if Debuglevel > 0 + case set_spec.class.to_s + when "NilClass" + print "copy: Calling _copy_empty\n" if Debuglevel > 0 + _copy_empty + when "String" + print "copy: Calling _copy_run_list\n" if Debuglevel > 0 + _copy_run_list(set_spec) + when "Array" + print "copy: Calling _copy_array\n" if Debuglevel > 0 + _copy_array(set_spec) + when "Set::IntSpan" + print "copy: Calling _copy_set\n" if Debuglevel > 0 + _copy_set(set_spec) + else + print "eeps\n" + end +end + +def _copy_empty # makes @set the empty set + @set = {} + set_neg_inf(false) + set_pos_inf(false) + @set["edges"] = [] + @set["run"] = [] +end + +def _copy_array(array) # copies an array into @set + _copy_empty + set_neg_inf(false) + set_pos_inf(false) + + edges = [] + for element in array.sort + next if (edges.length > 0) and (edges[-1] == element) # skip duplicates + + if (edges.length > 0) and (edges[-1] == element-1) + edges[-1] = element + else + edges.push(element-1, element) + end + end + + @set["edges"] = edges + @set["run"] = [] +end + +def _copy_set(src) # copies one set to another + _copy_empty + set_neg_inf(src.neg_inf?) + set_pos_inf(src.pos_inf?) + @set["edges"] = src.edges + @set["run"] = [] +end + +def _copy_run_list(runlist) + _copy_empty + + runlist.gsub!(/\s|_/, '') + return true if runlist == "" + + print "copy run list...\n" if Debuglevel > 0 + + first = true + last = false + + edges = [] + + for i in runlist.split(/,/) + print "#{i}\n" if Debuglevel > 0 + begin + if i =~ /^(-?\d+)$/x + edges.push(($1.to_i-1), $1.to_i) + next + end + + if i =~ /^ (-?\d+) - (-?\d+) $/x + if $1.to_i > $2.to_i + print "match rule 1 #{$1} > #{$2}\n" + print "Set::IntSpan::_copy_run_list: Bad order: #{runlist}\n" + exit + else + edges.push(($1.to_i-1), $2.to_i) + next + end + end + + if i =~ /^\(-(-?\d+)$/x + unless first + print "match rule 2\n" + print "Set::IntSpan::_copy_run_list: Bad order: #{runlist}\n" + exit + end + set_neg_inf(true) + edges.push($1.to_i) + next + end + + if i =~ /^(-?\d+)-\)$/x +# print "match rule 3\n" + edges.push(($1.to_i-1)) + set_pos_inf(true) + last = true + next + end + + if i =~ /^\(-\)$/x + unless first + print "match rule 4\n" + print "Set::IntSpan::_copy_run_list: Bad order: #{runlist}\n" + exit + end + set_neg_inf(true) + set_pos_inf(true) + last = true + next + end + + print "no match! \"#{i}\"\n" + print "Set::IntSpan::_copy_run_list: Bad syntax: #{runlist}\n" + end + first = false + end + + @set["edges"] = edges + @set["run"] = [] + + return true +end + +#def splice(array, offset, length=nil, list=[]) +# if offset >= 0 +# length = array.length-offset unless length +# leftarray = array.slice(0, offset) +# rightarray = array.slice(offset+length, (array.length - offset)) +# else +# length = array.length+offset unless length +# leftarray = array.slice(0, (array.length+offset)) +# rightarray = array.slice(array.length+length+offset, array.length+offset) +# end +# +# array = leftarray +# array += list +# array += rightarray if rightarray +# +# return array +#end + +def to_s + return run_list +end + +def run_list + if empty? + return Empty_String + end + + print "edges leng: ", @set["edges"].length, "\n" if Debuglevel > 0 + edges = [] + edges.concat(@set["edges"]) + runs = [] + + if edges.length > 0 + edges.unshift('(') if neg_inf? + edges.push(')') if pos_inf? + + print edges.join("/"),"\n" if Debuglevel > 0 + + while(edges.length>0) + print "edges leng: ", @set["edges"].length, "\n" if Debuglevel > 0 + lower = edges.delete_at(0) + upper = edges.delete_at(0) + print "Lower: \"#{lower}\" Upper: \"#{upper}\"\n" if Debuglevel > 0 + if !(lower.to_s == '(') and !(upper.to_s == ')') and ((lower+1) == upper) + print "#{upper}\n" if Debuglevel > 0 + runs.push("#{upper}") + else + lower += 1 if (lower.to_s <=> "(")!=0 + print "#{lower}-#{upper}\n" if Debuglevel > 0 + runs.push("#{lower}-#{upper}") + end + end + end + + print "edges leng: ", @set["edges"].length, "\n" if Debuglevel > 0 + + return runs.join(',') +end + +def elements + if infinite? + print "Set::IntSpan::elements: infinite set\n" + exit + end + + elements = [] + edges = @set["edges"].dup + while (edges.length>0) + lower, upper = edges.slice!(0..1) + elements += (lower+1 .. upper).to_a + end + + return elements +end + +def _real_set(set_spec=nil) # converts a set specification into a set + (set_spec != nil and set_spec.class.to_s == "Set::IntSpan") ? + set_spec : + IntSpan.new(set_spec) +end + +def union(set_spec) + b = _real_set(set_spec) + s = IntSpan.new + + s.set_neg_inf(neg_inf? || b.neg_inf?) + + eA = @set["edges"] + eB = b.edges + eS = s.edges + + inA = neg_inf? + inB = b.neg_inf? + + iA = 0 + iB = 0 + + while (iA < eA.length and iB < eB.length) + xA = eA[iA] + xB = eB[iB] + + if (xA < xB) + iA += 1 + inA = ! inA + not inB and eS.push(xA) + elsif (xB < xA) + iB += 1 + inB = ! inB + not inA and eS.push(xB) + else + iA += 1 + iB += 1 + inA = ! inA + inB = ! inB + inA == inB and eS.push(xA) + end + end + + iA < eA.length and (! inB) and eS.concat(eA[iA..eA.length]) + iB < eB.length and (! inA) and eS.concat(eB[iB..eB.length]) + + s.set_pos_inf(pos_inf? || b.pos_inf?) + s.set_edges(eS) + + return s +end + +def intersect(set_spec) + b = _real_set(set_spec) + s = IntSpan.new + + s.set_neg_inf(neg_inf? && b.neg_inf?) + + eA = @set["edges"] + eB = b.edges + eS = s.edges + + inA = neg_inf? + inB = b.neg_inf? + + iA = 0 + iB = 0 + + while (iA < eA.length and iB < eB.length) + xA = eA[iA] + xB = eB[iB] + + if (xA < xB) + iA += 1 + inA = ! inA + inB and eS.push(xA) + elsif (xB < xA) + iB += 1 + inB = ! inB + inA and eS.push(xB) + else + iA += 1 + iB += 1 + inA = ! inA + inB = ! inB + inA == inB and eS.push(xA) + end + end + + iA < eA.length and inB and eS.concat(eA[iA..eA.length]) + iB < eB.length and inA and eS.concat(eB[iB..eB.length]) + + s.set_neg_inf(pos_inf? && b.pos_inf?) + s.set_edges(eS) + return s +end + +def diff (set_spec) + b = _real_set(set_spec) + s = IntSpan.new + + s.set_neg_inf(neg_inf? && ! b.neg_inf?) + + eA = @set["edges"] + eB = b.edges + eS = s.edges + + inA = neg_inf? + inB = b.neg_inf? + + iA = 0 + iB = 0 + + while (iA < eA.length and iB < eB.length) + xA = eA[iA] + xB = eB[iB] + + if (xA < xB) + iA += 1 + inA = ! inA + not inB and eS.push(xA) + elsif (xB < xA) + iB += 1 + inB = ! inB + inA and eS.push(xB) + else + iA += 1 + iB += 1 + inA = ! inA + inB = ! inB + inA != inB and eS.push(xA) + end + end + + iA < eA.length and not inB and eS.concat(eA[iA..eA.length]) + iB < eB.length and inA and eS.concat(eB[iB..eB.length]) + + s.set_edges(eS) + + s.set_pos_inf(pos_inf? && ! b.pos_inf?) + return s +end + +def xor(set_spec) + b = _real_set(set_spec) + s = IntSpan.new + + s.set_neg_inf(neg_inf? ^ b.neg_inf?) + + eA = @set["edges"] + eB = b.edges + eS = s.edges + + iA = 0 + iB = 0 + + while (iA < eA.length and iB < eB.length) + xA = eA[iA] + xB = eB[iB] + + if (xA < xB) + iA += 1 + eS.push(xA) + elsif (xB < xA) + iB += 1 + eS.push(xB) + else + iA += 1 + iB += 1 + end + end + + iA < eA.length and eS.concat(eA[iA..eA.length]) + iB < eB.length and eS.concat(eB[iB..eB.length]) + + s.set_pos_inf(pos_inf? ^ b.pos_inf?) + s.set_edges(eS) + return s +end + +def complement +# complement is inverse set; dit klopt hier dus niet + a = first + b = last + + print "first #{a} last #{b}\n" if Debuglevel > 0 + if a!=b + s = IntSpan.new("#{a}-#{b}") + comp = xor(s) + else + comp = IntSpan.new("#{a}") + end + + if Debuglevel > 0 + while i = comp.next + print "#{i}\n" + end + end + + comp.set_neg_inf(! comp.neg_inf?) + comp.set_pos_inf(! comp.pos_inf?) + return comp +end + +def superset(set_spec) + b = _real_set(set_spec) + + s = b.diff(self) + return s.empty? +end + +def subset(set_spec) + b = _real_set(set_spec) + + s = diff(b) + return s.empty? +end + +def equal(set_spec) + b = _real_set(set_spec) + +print "a\n" + neg_inf? == b.neg_inf? or return false +print "b\n" + pos_inf? == b.pos_inf? or return false + + aEdge = @set["edges"] + bEdge = b.edges + print "aEdge #{aEdge.length} bEdge #{bEdge.length}\n" + aEdge.length == bEdge.length or return false +print "c\n" + + for i in (0...aEdge.length) + aEdge[i] == bEdge[i] or return false + end + + return true +end + +def equivalent(set_spec) + b = _real_set(set_spec) + + cardinality == b.cardinality +end + +def cardinality + (neg_inf? or pos_inf?) and return -1 + + car = 0 + edges = @set["edges"] + i=0 + while (i < edges.length) + lower = edges[i] + upper = edges[i+1] + car += upper - lower + i += 2 + end + + return car +end + +def empty? + if neg_inf? || pos_inf? || @set["edges"].length > 0 + return false + end + return true +end + +def edges + return @set["edges"] +end + +def set_edges(edges) + @set["edges"] = edges +end + +def neg_inf? + return @set["negInf"] +end + +def set_neg_inf(negInf) + @set["negInf"] = negInf +end + +def pos_inf? + return @set["posInf"] +end + +def set_pos_inf(posInf) + @set["posInf"] = posInf +end + +def finite? + return (! neg_inf? and ! pos_inf?) +end + +def infinite? + return ! finite? +end + +def universal + neg_inf? and not @set["edges"].length > 0 and pos_inf? +end + +# XXX this should probably have some recursion to make it faster +def member?(n) + inSet = neg_inf? + edge = @set["edges"] + + for i in (0...edge.length) + if inSet + return true if n <= edge[i] + inSet = false + else + return false if n <= edge[i] + inSet = true + end + end + + inSet +end + +# XXX name should end with a '!' +def insert(n) + inSet = neg_inf? + edge = @set["edges"] + + if (edge.length == 0) + @set["edges"] = [n-1, n] + return + end + + if n > edge[-1]+1 + @set["edges"].push(n-1, n) + return + elsif n > edge[-1] + @set["edges"][-1] += 1 + return + end + +# XXX dit kan vast netter... toch de Dijkstra neuronen nog eens aansteken +# XXX this should probably have some recursion to make it faster + l = 0 + r = edge.length-1 + i = r/2 + while true + if n < edge[i] && n > edge[i-1] + inSet = i.odd? + break + elsif n < edge[i] && i == 0 + inSet = false + break + elsif n < edge[i] + r = i + i = l + ((r-l)/2) + elsif n == edge[i] + inSet = i.odd? + break + else + l = i + i = l + ((r-l)/2) + end + end + + inSet and return + + lGap = i == 0 || n-1 - edge[i-1] + lGap = false if lGap == 0 + + rGap = i == edge.length-1 ? i : edge[i] - n + rGap = false if rGap == 0 + + if ( lGap and rGap) + lower = edge[0...i] + upper = edge[i...edge.length] + edge = lower + edge.push(n-1, n) + edge.concat(upper) + elsif (not lGap and rGap) + edge[i-1] += 1 + elsif ( lGap and not rGap) + edge[i] -= 1 + else + edge.delete_at(i-1) + edge.delete_at(i-1) + end + + @set["edges"] = edge +end + +def remove!(n) + n or return + + inSet = neg_inf? + edge = @set["edges"] + + for i in (0...edge.length) + if (inSet) + break if n <= edge[i] + inSet = false + else + return if n <= edge[i] + inSet = true + end + end + + return unless inSet + + for i in (0...edge.length) + if edge[i] == n-1 and edge[i+1] == n + lower = edge[0...i] + upper = edge[i+2..edge.length] + edge = lower + upper + break + elsif edge[i] == n-1 + edge[i] += 1 + break + elsif edge[i] == n + edge[i] += 1 + break + elsif edge[i+1] == n + edge[i+1] -= 1 + break + elsif edge[i]n + lower = edge[0..i] + upper = edge[i+1..edge.length] + edge = lower + [n-1, n] +upper + break + end + i += 1 + end + + @set["edges"] = edge + return self +end + +def min + empty? and return nil + neg_inf? and return nil + @set["edges"][0]+1 +end + +def max + empty? and return nil + pos_inf? and return nil + @set["edges"][-1] +end + +def grep_set(block) + return nil if neg_inf? or pos_inf? + + edges = @set["edges"] + sub_edges = [] + + while (edges.length > 0) + lower = edges[0] + upper = edges[1] + edges = edges.slice(2..edges.length) + + for i in (lower+1..upper) +# local $_ = i +# &$block() or next # definately wrong, must eval block + + if (sub_edges.length > 0 and sub_edges[-1] == i-1) + sub_edges[-1] = i + else + sub_edges += [ i-1, i ] + end + end + end + + sub_set = new + sub_set["edges"] = sub_edges + sub_set +end + +def map_set(block) + return nil if neg_inf? or pos_inf? + + map_set = new + + edges = @set["edges"] + while (edges.length > 0) + lower = edges[0] + upper = edges[1] + edges = edges.slice(2..edges.length) + + for domain in (lower+1..upper) + local $_ = domain; + +# for range (&$block()) # definately wrong, must eval block +# map_set.insert(range) +# end + end + end + + map_set +end + +def first + @set["iterator"] = min + @set["run"] = [] + @set["run"][0] = 0 + @set["run"][1] = @set["edges"].length > 0 ? 1 : nil + + @set["iterator"] +end + +def last + lastEdge = @set["edges"].length - 1 + @set["iterator"] = max + @set["run"][0] = lastEdge > 0 ? lastEdge-1 : nil + @set["run"][1] = lastEdge + + @set["iterator"] +end + +def start(startval) + set["iterator"] = nil + startval or return nil + + inSet = neg_inf? + edges = @set["edges"] + + for i in (0...edges.length) + if (inSet) + if (startval <= edges[i]) + @set["iterator"] = startval + @set["run"][0] = i ? i-1 : nil + @set["run"][1] = i + return $startval + end + inSet = false + else + if (startval <= edges[i]) + return nil + end + inSet = true + end + end + + if (inSet) + @set["iterator"] = startval + @set["run"][0] = edges.length > 0 ? edges.length: nil + @set["run"][1] = nil + end + + @set["iterator"] +end + +def current + @set["iterator"] +end + +def next + @set["iterator"] or return first + + run1 = @set["run"][1] + run1 or return ++@set["iterator"] + + edges = @set["edges"] + if (@set["iterator"] < edges[run1]) + @set["iterator"] += 1 + return @set["iterator"] + end + + if (run1 < edges.length-2) + run0 = run1 + 1 + @set["run"] = [run0, run0+1] + @set["iterator"] = edges[run0]+1 + elsif (run1 < edges.length-1) + run0 = run1 + 1 + @set["run"] = [run0, nil] + @set["iterator"] = edges[run0]+1 + else + @set["iterator"] = nil + end + + @set["iterator"] +end + +def prev + @set["iterator"] or return last + + run0 = @set["run"][0] + run0 or return --@set["iterator"] + + edges = @set["edges"] + + if (@set["iterator"] > edges[run0]+1) + @set["iterator"] -= 1 + return @set["iterator"] + end + + if (run0 > 1) + run1 = run0 - 1 + @set["run"] = [run1-1, run1] + @set["iterator"] = edges[run1] + elsif (run0 > 0) + run1 = run0 - 1 + @set["run"] = [nil, run1] + @set["iterator"] = edges[run1] + else + @set["iterator"] = nil + end + + @set["iterator"] +end + +end # class + +end # module + + +# TODO +# Do not kill an item until it's tested! + +# [x] new +# [x] valid +# [ ] copy +# [ ] _copy_empty # makes $set the empty set +# [x] _copy_array # copies an array into a set +# [ ] _copy_set # copies one set to another +# [ ] _copy_run_list # parses a run list +# [x] run_list +# [x] elements +# [x] _real_set # converts a set specification into a set +# [x] union +# [x] intersect +# [x] diff +# [x] xor +# [ ] complement +# [x] superset +# [x] subset +# [x] equal +# [x] equivalent +# [x] cardinality +# [x] empty? +# [x] finite +# [x] neg_inf? { shift->{negInf} } +# [x] pos_inf? { shift->{posInf} } +# [x] infinite +# [ ] universal +# [x] member +# [x] insert # way to much code i think +# [x] remove +# [x] min +# [x] max +# [ ] grep_set(&$) +# [ ] map_set(&$) +# [x] first($) +# [x] last($) +# [ ] start($$) +# [x] current($) { shift->{iterator} } +# [x] next($) +# [x] prev($) + +# New methods +# [x] set_neg_inf +# [x] set_pos_inf +# [x] set_edges +# [x] edges diff --git a/tags/ripnews-release_0_5_3/ripnews/set/tests/set_test.rb b/tags/ripnews-release_0_5_3/ripnews/set/tests/set_test.rb new file mode 100755 index 0000000..25787d9 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/set/tests/set_test.rb @@ -0,0 +1,13 @@ +#!/usr/local/bin/ruby + +require 'set/intspan' + +@set = Set::IntSpan.new("895738,895742,895747,895760-895761,895763-895765,895775-895776,895783,895786") +@set.finite +@set.insert(895739) +@set.insert(895740) +@set.insert(895741) +@set2 = Set::IntSpan.new("895759-900000") +@set3 = @set2.diff(@set) +print @set3.run_list +print "\n" diff --git a/tags/ripnews-release_0_5_3/ripnews/set/tests/test_intspan.rb b/tags/ripnews-release_0_5_3/ripnews/set/tests/test_intspan.rb new file mode 100755 index 0000000..91954f1 --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/set/tests/test_intspan.rb @@ -0,0 +1,128 @@ +#!/usr/local/bin/ruby + +# $Id$ +# $Source$ + +require 'test/unit' +require '../intspan' + +class TestSetIntspan < Test::Unit::TestCase + # def setup + # end + + # def teardown + # end + + def test_empty_set + set = Set::IntSpan.new() + assert(set.empty?) + assert_equal("", set.to_s) + set.set_neg_inf(true) + assert_equal(false, set.empty?) + set = Set::IntSpan.new() + set.set_pos_inf(true) + assert_equal(false, set.empty?) + set = Set::IntSpan.new("1") + assert_equal(false, set.empty?) + end + + def test_neg_inf + set = Set::IntSpan.new() + set.set_neg_inf(true) + assert(set.neg_inf?) + set = Set::IntSpan.new("(-1,3,5") + assert_equal(true, set.neg_inf?) + set = Set::IntSpan.new("1-3,5-)") + assert_equal(false, set.neg_inf?) + set = Set::IntSpan.new("(-1,3,5-)") + assert_equal(true, set.neg_inf?) + end + + def test_pos_inf + set = Set::IntSpan.new() + set.set_pos_inf(true) + assert(set.pos_inf?) + end + + def test_to_s + assert_equal("", Set::IntSpan.new().to_s) + assert_equal("1", Set::IntSpan.new("1").to_s) + assert_equal("1-3", Set::IntSpan.new("1-3").to_s) + assert_equal("1-3,5", Set::IntSpan.new("1-3,5").to_s) + assert_equal("(-1,3,5", Set::IntSpan.new("(-1,3,5").to_s) + assert_equal("1-3,5-)", Set::IntSpan.new("1-3,5-)").to_s) + assert_equal("(-1,3,5-)", Set::IntSpan.new("(-1,3,5-)").to_s) + end + + def test_array_init + assert_equal("", Set::IntSpan.new([]).to_s) + assert_equal("1", Set::IntSpan.new([1]).to_s) + assert_equal("1-3", Set::IntSpan.new([1,2,3]).to_s) + assert_equal("1-3,5", Set::IntSpan.new([1,2,3,5]).to_s) + end + + def test_set_init + set = Set::IntSpan.new("1-3,5") + set2 = Set::IntSpan.new(set) + assert_equal("1-3,5", set2.to_s) + set = Set::IntSpan.new("(-1,3,5-)") + set2 = Set::IntSpan.new(set) + assert_equal("(-1,3,5-)", set2.to_s) + end + + def test_insert + set = Set::IntSpan.new() + assert_equal("", set.to_s) + set.insert(4) + assert_equal("4", set.to_s) + set.insert(5) + assert_equal("4-5", set.to_s) + set.insert(7) + assert_equal("4-5,7", set.to_s) + set.insert(6) + assert_equal("4-7", set.to_s) + set.insert(16) + assert_equal("4-7,16", set.to_s) + set.insert(10) + assert_equal("4-7,10,16", set.to_s) + set.insert(3) + assert_equal("3-7,10,16", set.to_s) + set.insert(1) + assert_equal("1,3-7,10,16", set.to_s) + set.insert(17) + assert_equal("1,3-7,10,16-17", set.to_s) + set.insert(14974324) + assert_equal("1,3-7,10,16-17,14974324", set.to_s) + end + + def test_finite + assert_equal(true, Set::IntSpan.new("1-3,5").finite?) + assert_equal(false, Set::IntSpan.new("(-1,3,5").finite?) + assert_equal(false, Set::IntSpan.new("1-3,5-)").finite?) + assert_equal(false, Set::IntSpan.new("(-1,3,5-)").finite?) + assert_equal(false, Set::IntSpan.new("1-3,5").infinite?) + assert_equal(true, Set::IntSpan.new("(-1,3,5").infinite?) + assert_equal(true, Set::IntSpan.new("1-3,5-)").infinite?) + assert_equal(true, Set::IntSpan.new("(-1,3,5-)").infinite?) + end + + def test_remove + set = Set::IntSpan.new("1-3,5") + set.remove!(3) + assert_equal("1-2,5", set.to_s) + assert_equal("1-2,5", Set::IntSpan.new("1-3,5").remove!(3).to_s) + assert_equal("(-1,5", Set::IntSpan.new("(-1,3,5").remove!(3).to_s) + assert_equal("1-2,5-)", Set::IntSpan.new("1-3,5-)").remove!(3).to_s) + assert_equal("(-1,5-)", Set::IntSpan.new("(-1,3,5-)").remove!(3).to_s) + end + + def test_member + assert_equal(true, Set::IntSpan.new("1-3,5").member?(1)) + assert_equal(true, Set::IntSpan.new("1-3,5").member?(3)) + assert_equal(false, Set::IntSpan.new("1-3,5").member?(4)) + assert_equal(false, Set::IntSpan.new("1-3,5").member?(6)) + assert_equal(false, Set::IntSpan.new("1-3,5").member?(7)) + assert_equal(true, Set::IntSpan.new("1-3,5-)").member?(7)) + assert_equal(true, Set::IntSpan.new("(-3,5").member?(-10)) + end +end diff --git a/tags/ripnews-release_0_5_3/ripnews/tools/cacheconverter b/tags/ripnews-release_0_5_3/ripnews/tools/cacheconverter new file mode 100755 index 0000000..1c8246a --- /dev/null +++ b/tags/ripnews-release_0_5_3/ripnews/tools/cacheconverter @@ -0,0 +1,30 @@ +#!/usr/bin/perl + +my %servers; + +$cachefile = $ARGV[0]; +if ($ARGV[1]) { + print "Usage: $ARGV[0] \n"; + exit; +} + +print "Group: $groupname\n"; + +while (<>) { + /^([^|]*)\|([^|]*)\|([^|]*)\|(.*)/; + if (exists $servers{$3}) { + push @{$servers{$3}}, "$1|$2|$4\n"; + } else { + $servers{$3} = []; + push @{$servers{$3}}, "$1|$2|$4\n"; + } +} + +foreach (keys %servers) { + print ":KEY: $_\n"; + open FH, ">$cachefile.$_" or die "Couldn't write new cachefile\n"; + foreach (@{$servers{$_}}) { + print FH; + } + close FH; +}