Package: release.debian.org
Severity: normal
Tags: bullseye
User: release.debian....@packages.debian.org
Usertags: pu
X-Debbugs-Cc: rlaa...@debian.org

[ Reason ]
gbonds is a program to track U.S. Savings Bonds and show their current
redemption value.  To do so, it needs updated valuation data from the
U.S. Treasury twice a year.  For nearly 30 years, Treasury has
released this data in flat file format.  These were recently
discontinued in favor of an HTTP JSON API.  The old files were removed
from Treasury's FTP site and I have it on good authority that they are
not coming back.

This is Debian bug #1001610.

[ Impact ]
gbonds cannot provide current redemption values.  The version in
bullseye shipped with redemption data through May 2021 and, if its
update code ran before Treasury deleted the files from the FTP site,
could have downloaded one more file with redemption data through
December 2021.

[ Tests ]
The new updater code writes out files in the traditional flat file
format.  I downloaded data for the previous period and compared it
to the last official flat file.  The results are the same, except:
  - The order of the lines in the file differs, which does not
    affect the data.
  - The API returns "null" (which maps to "      ") instead of
    "NO PAY".  This seems to be a bug, as the API is documented to
    return "NO PAY".  I reported this to Treasury via their contact
    form, but who know if/when this might be fixed.  This does not
    affect the values calculated, though it does mean bonds will
    not properly show as "Not yet eligible for payment".

[ Risks ]
The core of the update code has been completely rewritten (by me, as
gbonds is long dead upstream).  It uses libsoup to download data and
json-glib to parse it.

If the new update code is non-functional, it's no worse than the old
code now.  Since Treasury has removed the files from its FTP site and
is not publishing new ones in that format, the old update code no
longer does anything useful.

If the new update code produces bad output, users would see incorrect
valuations.  The transformation is straightforward, and I did compare
to the old data, as noted above.

[ Checklist ]
  [X] *all* changes are documented in the d/changelog
  [X] I reviewed all changes and I approve them
  [X] attach debdiff against the package in (old)stable
  [X] the issue is verified as fixed in unstable

[ Changes ]
1. I added the last official Treasury data file (sb202106.asc).  I
   wouldn't normally include one of these in a stable update because
   the update code would download them anyway.  But in this case, the
   file is no longer available from Treasury.  It seems correct to ship
   the last official file since it's possible to do so.
2. I added a patch (which I wrote) that rewrites the core of the update
   code.  Instead of downloading flat files from Treasury's FTP site,
   it accesses Treasury's HTTP JSON API.  It writes out files in the
   traditional format, so none of the rest of the application changed.
3. I modified debian/gbp.conf to reference the debian/bullseye branch
   I created as part of this update.
4. I updated debian/changelog, of course.
diff -Nru gbonds-2.0.3/debian/changelog gbonds-2.0.3/debian/changelog
--- gbonds-2.0.3/debian/changelog       2021-02-04 02:23:39.000000000 -0600
+++ gbonds-2.0.3/debian/changelog       2021-12-23 21:24:14.000000000 -0600
@@ -1,3 +1,10 @@
+gbonds (2.0.3-16+deb11u1) bullseye; urgency=high
+
+  * Add redemption data through 11/2021 (sb202106.asc)
+  * Use Treasury API for redemption data (Closes: 1001610)
+
+ -- Richard Laager <rlaa...@debian.org>  Thu, 23 Dec 2021 21:24:14 -0600
+
 gbonds (2.0.3-16) unstable; urgency=medium
 
   * Add redemption data through 05/2021 (sb202012.asc)
diff -Nru gbonds-2.0.3/debian/control gbonds-2.0.3/debian/control
--- gbonds-2.0.3/debian/control 2021-02-04 02:22:30.000000000 -0600
+++ gbonds-2.0.3/debian/control 2021-12-23 21:23:46.000000000 -0600
@@ -6,6 +6,8 @@
                dpkg-dev (>= 1.16.1),
                intltool,
                libgtk-3-dev,
+               libjson-glib-dev,
+               libsoup2.4-dev,
                libtool,
                libxml2-dev (>= 2.4.23),
 Standards-Version: 4.5.1
diff -Nru gbonds-2.0.3/debian/gbp.conf gbonds-2.0.3/debian/gbp.conf
--- gbonds-2.0.3/debian/gbp.conf        2020-02-19 18:18:42.000000000 -0600
+++ gbonds-2.0.3/debian/gbp.conf        2021-12-23 21:24:11.000000000 -0600
@@ -1,5 +1,5 @@
 [DEFAULT]
-debian-branch = debian/unstable
+debian-branch = debian/bullseye
 pristine-tar = True
 upstream-branch = upstream/latest
 
diff -Nru gbonds-2.0.3/debian/patches/download-sites 
gbonds-2.0.3/debian/patches/download-sites
--- gbonds-2.0.3/debian/patches/download-sites  2020-08-15 17:41:52.000000000 
-0500
+++ gbonds-2.0.3/debian/patches/download-sites  1969-12-31 18:00:00.000000000 
-0600
@@ -1,15 +0,0 @@
-Description: Remove snaught.com from the download list
- It didn't have the latest redemption data.  This leaves only the
- official U.S. Treasury FTP site.
-Author: Richard Laager <rlaa...@debian.org>
-Forwarded: no
-Last-Update: 2012-03-18
-
---- gbonds-2.0.3.orig/data/download-sites.xml
-+++ gbonds-2.0.3/data/download-sites.xml
-@@ -1,5 +1,4 @@
- <?xml version="1.0"?>
- <Redemption-Data-Sites>
-   <Site uri="ftp://ftp.publicdebt.treas.gov/";>U.S. Treasury FTP site 
(Default)</Site>
--  <Site uri="ftp://ftp.snaught.com/gbonds/data/";>Snaught.com</Site>
- </Redemption-Data-Sites>
diff -Nru gbonds-2.0.3/debian/patches/series gbonds-2.0.3/debian/patches/series
--- gbonds-2.0.3/debian/patches/series  2020-08-15 18:08:39.000000000 -0500
+++ gbonds-2.0.3/debian/patches/series  2021-12-23 21:23:46.000000000 -0600
@@ -1,7 +1,6 @@
 desktop-file
 POTFILES
 POTFILES.missing
-download-sites
 commands-compile
 egg-recent-model-compile
 gbonds-name-case
@@ -17,3 +16,4 @@
 gsettings-port
 no-rarian-compat
 extern-gb_prefs
+use-treasury-api.patch
diff -Nru gbonds-2.0.3/debian/patches/use-treasury-api.patch 
gbonds-2.0.3/debian/patches/use-treasury-api.patch
--- gbonds-2.0.3/debian/patches/use-treasury-api.patch  1969-12-31 
18:00:00.000000000 -0600
+++ gbonds-2.0.3/debian/patches/use-treasury-api.patch  2021-12-23 
21:23:46.000000000 -0600
@@ -0,0 +1,1629 @@
+Description: Use Treasury API
+ The U.S. Treasury has discontinued publishing the sbYYYYMM.asc files
+ on its FTP site.  Savings Bond value data is now available at the
+ FiscalData site as a JSON-based RESTful API.
+ .
+ This code produces identical results as the last file available
+ (sb202106.asc), with two exceptions:
+   - The order of the lines in the file differs, which does not
+     affect the data.
+   - The API returns "null" (which maps to "      ") instead of
+     "NO PAY".  This seems to be a bug, as the API is documented to
+     return "NO PAY".  I reported this to Treasury via their contact
+     form, but who know if/when this might be fixed.  This does not
+     affect the values calculated, though it does mean bonds will
+     not properly show as "Not yet eligible for payment".
+Bug-Debian: https://bugs.debian.org/1001610
+Author: Richard Laager <rlaa...@debian.org>
+Forwarded: no
+Last-Update: 2021-12-12
+
+--- a/src/update.c
++++ b/src/update.c
+@@ -19,11 +19,15 @@
+  *  along with this program; if not, write to the Free Software
+  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+  */
+-
+ #include <config.h>
+ 
++#include <errno.h>
+ #include <glib/gi18n.h>
++#include <glib/gstdio.h>
+ #include <gtk/gtk.h>
++#include <json-glib/json-glib.h>
++#include <json-glib/json-gobject.h>
++#include <libsoup/soup.h>
+ #include <libxml/tree.h>
+ #include <libxml/parser.h>
+ #include <math.h>
+@@ -39,32 +43,32 @@
+ #define  DRUID_BG_COLOR "rgb (70, 85, 80)"
+ #define  DRUID_TITLE_COLOR "white"
+ 
++/* The documentation for this API is at:
++ * 
https://fiscaldata.treasury.gov/datasets/savings-bond-value-files/savings-bonds-value-files
++ */
++#define TREASURY_HOST "api.fiscaldata.treasury.gov"
++#define TREASURY_URL "https://"; TREASURY_HOST 
"/services/api/fiscal_service/v2/accounting/od/sb_value"
++/* The default is 100.  The maximum is undocumented, but currently 10,000. */
++#define TREASURY_PAGE_SIZE 100
++
+ 
+ /*===========================================*/
+ /* Private types                             */
+ /*===========================================*/
+ 
+ typedef struct {
+-  gchar *name;
+-  gchar *uri;
+-} Site;
+-
+-typedef struct {
+-  gint            n;
+-  GList           *list;
+-  GFile           *uri;
+-} DirCallbackData;
+-
+-typedef struct {
+-  gint            i, n;
+-  goffset         total_bytes_read, total_bytes, file_bytes_read, file_bytes;
+-  GList           *list, *p;
+-  GFile           *uri, *file;
+-  GFileOutputStream *local_handle;
+-  gpointer        buffer;
+-  gint            buffer_length;
+-  gpointer        line_buffer;
+-  gint            line_offset;
++  SoupSession *session;
++  gint year;
++  gint month;
++  JsonParser *parser;
++  gint page;
++  gint total_pages;
++  gint last_redemption_month;
++  gchar *dir;
++  gchar *filename;
++  gchar *tmp_filename;
++  FILE *file;
++  gint n;
+ } DownloadCallbackData;
+ 
+ 
+@@ -72,21 +76,18 @@
+ /* Private globals                           */
+ /*===========================================*/
+ 
+-GList *site_list = NULL;
+-gchar *site_uri;
++gbDate download_date;
+ 
+ GtkWidget *update_druid;
+ GtkWidget *custom_widget;
+ GtkWidget *site_entry;
+ GtkWidget *status_label;
+-GtkWidget *file_label;
+-GtkWidget *file_progress;
+-GtkWidget *total_progress;
++GtkWidget *page_label;
++GtkWidget *page_progress;
+ GtkWidget *finish_page;
+ 
+ GCancellable *update_cancel_flag = NULL;
+ static gboolean css_installed = FALSE;
+-gboolean mounted = FALSE;
+ 
+ 
+ 
+@@ -96,36 +97,18 @@
+ 
+ static void add_start_page( GtkAssistant *wdruid,
+                           GdkPixbuf *logo );
+-static void add_select_download_page( GtkAssistant *wdruid,
+-                                    GdkPixbuf *logo );
+ static void add_downloading_page( GtkAssistant *wdruid, GdkPixbuf *logo );
+ static void prepare_downloading_page( GtkAssistant *druid, GtkWidget *page,
+                                     gpointer data );
+ 
+-static void got_remote_list( GFile *uri, GList *list, gint n );
+-static GList *prune_list_from_dir( GList *list, gint *n,
+-                                 const gchar *dirname );
+-static void get_remote_file_list( GFile *uri );
+-static void get_remote_file_list_cb( GObject *src,
+-                                   GAsyncResult *result,
+-                                   gpointer callback_data );
+-
+-static void download_files( GFile *uri, GList *list, gint n );
+-static void open_remote_file_callback( GObject *handle,
+-                                     GAsyncResult *result,
+-                                     gpointer callback_data );
+-static gchar *hash_filename( const gchar *filename );
+-static void read_remote_file_callback( GObject *handle,
+-                                     GAsyncResult *result,
+-                                     gpointer callback_data );
+-static void close_remote_file_callback( GObject *handle,
+-                                      GAsyncResult *result,
+-                                      gpointer callback_data );
+-static void mount_volume (GFile *file);
+-static void unmount_volume (GFile *file);
++static void download_page ( DownloadCallbackData *data);
++static void download_cb ( SoupSession *session, SoupMessage *msg,
++                        gpointer user_data);
++static void start_download ();
+ 
+ static void download_done( DownloadCallbackData *data );
+-static void no_download( void );
++static void no_download( DownloadCallbackData *data );
++static void free_download_data( DownloadCallbackData *data );
+ 
+ static void add_finish_page( GtkAssistant *wdruid, GdkPixbuf *logo );
+ 
+@@ -134,13 +117,10 @@
+ static void
+ destroy_cb( GtkAssistant *window, gpointer data );
+ 
+-static
+-GList *read_site_list( void );
+-
+ static void
+ update_progress_bar (GtkProgressBar *bar,
+-                   gint            bytes,
+-                   gint            total);
++                   gint            page,
++                   gint            pages);
+ 
+ 
+ 
+@@ -165,7 +145,6 @@
+                                    DRUID_WIDTH, DRUID_HEIGHT);
+ 
+       add_start_page (GTK_ASSISTANT (update_druid), logo);
+-      add_select_download_page (GTK_ASSISTANT (update_druid), logo);
+       add_downloading_page (GTK_ASSISTANT (update_druid), logo);
+       add_finish_page (GTK_ASSISTANT (update_druid), logo);
+       g_object_unref (logo);
+@@ -266,6 +245,8 @@
+       date_max_string   = gb_date_fmt( date_max );
+       date_today_string = gb_date_fmt( date_today );
+ 
++      download_date = date_max + 1;
++
+       if ( date_today == date_max ) {
+               msg1 = g_strdup_printf(
+                        _( "Current redemption data will expire at the end\n"
+@@ -311,64 +292,6 @@
+       gb_debug (DEBUG_UPDATE, "END");
+ }
+ 
+-/*---------------------------------------------------------------------------*/
+-/* PRIVATE.  Fill the combobox with the available sites.                     
*/
+-/*---------------------------------------------------------------------------*/
+-static void
+-fill_combo (gchar *site, GtkComboBoxText *combo)
+-{
+-      gtk_combo_box_text_append_text (combo, site);
+-}
+-
+-
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Create and add "select download site" page to druid.           */
+-/*--------------------------------------------------------------------------*/
+-static void
+-add_select_download_page( GtkAssistant *wdruid, GdkPixbuf *logo )
+-{
+-      GtkWidget *wvbox;
+-      GtkWidget *whbox, *wcombo;
+-      GList      *name_list = NULL;
+-      GList      *p;
+-      Site       *site;
+-
+-      gb_debug (DEBUG_UPDATE, "START");
+-
+-      wvbox = create_header (_("Select download site"), logo);
+-
+-      whbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
+-      gtk_container_set_border_width( GTK_CONTAINER(whbox), 20 );
+-      gtk_box_pack_start (GTK_BOX (wvbox), whbox, TRUE, FALSE, 0);
+-
+-      gtk_box_pack_start( GTK_BOX(whbox),
+-                          gtk_label_new( _("Download site:") ),
+-                          FALSE, TRUE, 0 );
+-
+-      if ( site_list == NULL ) {
+-              site_list = read_site_list();
+-      }
+-      for ( p=site_list; p!= NULL; p=p->next ) {
+-              site = (Site *)p->data;
+-              name_list = g_list_append( name_list, site->name );
+-      }
+-      wcombo = gtk_combo_box_text_new_with_entry ();
+-      g_list_foreach (name_list, (GFunc) fill_combo, wcombo);
+-      g_list_free( name_list );
+-      name_list = NULL;
+-      gtk_combo_box_set_active (GTK_COMBO_BOX (wcombo), 0);
+-      site_entry = gtk_bin_get_child (GTK_BIN (wcombo));
+-      gtk_editable_set_editable (GTK_EDITABLE (site_entry), FALSE);
+-      gtk_box_pack_start( GTK_BOX(whbox), wcombo, TRUE, TRUE, 0 );
+-
+-      gtk_assistant_append_page (wdruid, wvbox);
+-      gtk_assistant_set_page_title (wdruid, wvbox, _("Select download site"));
+-      gtk_assistant_set_page_type (wdruid, wvbox, GTK_ASSISTANT_PAGE_CONTENT);
+-      gtk_assistant_set_page_complete (wdruid, wvbox, TRUE);
+-
+-      gb_debug (DEBUG_UPDATE, "END");
+-}
+-
+ 
+ 
+ /*--------------------------------------------------------------------------*/
+@@ -406,26 +329,13 @@
+ 
+       whbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+       gtk_box_pack_start( GTK_BOX(wvbox3), whbox3, FALSE, TRUE, 0 );
+-      file_label = gtk_label_new( _("File") );
+-      gtk_label_set_justify( GTK_LABEL(file_label), GTK_JUSTIFY_LEFT );
+-      gtk_box_pack_start( GTK_BOX(whbox3), file_label, FALSE, TRUE, 0 );
+-
+-      file_progress = gtk_progress_bar_new();
+-      gtk_progress_bar_set_text( GTK_PROGRESS_BAR(file_progress), "" );
+-      gtk_box_pack_start( GTK_BOX(wvbox3), file_progress, FALSE, TRUE, 0 );
+-
+-      wvbox4 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
+-      gtk_box_pack_start( GTK_BOX(wvbox2), wvbox4, TRUE, FALSE, 0 );
+-
+-      whbox4 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+-      gtk_box_pack_start( GTK_BOX(wvbox4), whbox4, FALSE, TRUE, 0 );
+-      wlabel2 = gtk_label_new( _("Total") );
+-      gtk_label_set_justify( GTK_LABEL(wlabel2), GTK_JUSTIFY_LEFT );
+-      gtk_box_pack_start( GTK_BOX(whbox4), wlabel2, FALSE, TRUE, 0 );
+-
+-      total_progress = gtk_progress_bar_new();
+-      gtk_progress_bar_set_text( GTK_PROGRESS_BAR(total_progress), "" );
+-      gtk_box_pack_start( GTK_BOX(wvbox4), total_progress, FALSE, TRUE, 0 );
++      page_label = gtk_label_new( _("Page") );
++      gtk_label_set_justify( GTK_LABEL(page_label), GTK_JUSTIFY_LEFT );
++      gtk_box_pack_start( GTK_BOX(whbox3), page_label, FALSE, TRUE, 0 );
++
++      page_progress = gtk_progress_bar_new();
++      gtk_progress_bar_set_text( GTK_PROGRESS_BAR(page_progress), "" );
++      gtk_box_pack_start( GTK_BOX(wvbox3), page_progress, FALSE, TRUE, 0 );
+ 
+       gtk_assistant_append_page (wdruid, wvbox);
+       gtk_assistant_set_page_title (wdruid, wvbox, _("Download"));
+@@ -449,29 +359,19 @@
+ {
+       const gchar *site_name;
+       GList *p;
+-      Site *site;
+ 
+       gb_debug (DEBUG_UPDATE, "START");
+ 
+-      if (gtk_assistant_get_current_page (druid) != 2)
++      if (gtk_assistant_get_current_page (druid) != 1)
+               return;
+ 
+-      site_name = gtk_entry_get_text( GTK_ENTRY(site_entry) );
+-      for ( p = site_list; p != NULL; p=p->next ) {
+-              site = (Site *)p->data;
+-              if ( strcmp( site_name, site->name ) == 0 ) {
+-                      site_uri = site->uri;
+-                      break;
+-              }
+-      }
+-
+       custom_widget = gtk_button_new_with_mnemonic (_("_Cancel"));
+       g_signal_connect (custom_widget, "clicked",
+                         G_CALLBACK (cancel_cb), NULL);
+       gtk_widget_show (custom_widget);
+       gtk_assistant_add_action_widget (druid, custom_widget);
+ 
+-      mount_volume (g_file_new_for_uri (site_uri));
++      start_download ();
+ 
+       gb_debug (DEBUG_UPDATE, "END");
+ }
+@@ -511,719 +411,463 @@
+       va_end (ap);
+ }
+ 
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Asynchronous callback for the unmount operation.  This is the  */
+-/* last I/O operation; upon success all callback structs are freed.         */
+-/*--------------------------------------------------------------------------*/
+-static void
+-unmount_complete_cb (GObject *src, GAsyncResult *res, gpointer user_data)
+-{
+-      GFile                *file = user_data;
+-      GError               *err = NULL;
+-      DirCallbackData      *dirdata;
+-      DownloadCallbackData *data;
+-
+-      dirdata = g_object_get_data (G_OBJECT (file), "dirdata");
+-      data = g_object_get_data (G_OBJECT (file), "data");
+-      g_mount_unmount_with_operation_finish (G_MOUNT (src), res, &err);
+-
+-      /* Unmounting is likely to fail if some of the previous async
+-         operations is not yet complete.  Just retry to unmount if
+-         that is the case.  */
+-      if (err && g_error_matches (err, G_IO_ERROR, G_IO_ERROR_BUSY)) {
+-              g_object_unref (src);
+-              unmount_volume (file);
+-              g_error_free (err);
+-              return;
+-      }
+-
+-      if (err) {
+-              g_warning ("Unmounting failed: %s\n", err->message);
+-              g_error_free (err);
+-      } else {
+-              mounted = FALSE;
+-              g_object_unref (file);
+-              if (dirdata)
+-                      g_free (dirdata);
+-              if (data) {
+-                      g_list_free_full (data->list, g_object_unref);
+-                      g_free (data->buffer);
+-                      g_free (data->line_buffer);
+-                      g_free (data);
+-              }
+-              g_object_unref (update_cancel_flag);
+-              update_cancel_flag = NULL;
+-      }
+-
+-      g_object_unref (src);
+-}
+-
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Begin the asynchronous process of unmounting the remote site.  */
+-/*--------------------------------------------------------------------------*/
+-static void
+-unmount_volume (GFile *file)
+-{
+-      GMountOperation *op;
+-      GMount          *mount;
+-      GError          *err = NULL;
+-
+-      g_return_if_fail (file != NULL);
+-
+-      mount = g_file_find_enclosing_mount (file, NULL, &err);
+-      if (err) {
+-              /* Don't emit a warning here as this may happen if the
+-                 user cancelled the update early, before the mount
+-                 is completed.  */
+-              if (!g_error_matches (err, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED))
+-                      g_warning ("Could not find enclosing mount: %s",
+-                                 err->message);
+-              g_object_unref (file);
+-              g_error_free (err);
+-              return;
+-      }
+-
+-      op = g_mount_operation_new ();
+-      g_mount_unmount_with_operation (mount, G_MOUNT_UNMOUNT_NONE, op,
+-                                      NULL, unmount_complete_cb, file);
+-      g_object_unref (op);
+-}
+ 
+ /*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Callback for the mount operation; ensures anonymous access     */
+-/* without explicit user confirmation (which would be annoying).            */
++/* PRIVATE.  Begin the asynchronous process of downloading data.            */
+ /*--------------------------------------------------------------------------*/
+ static void
+-ask_password_cb (GMountOperation *op, gchar *message, gchar *user,
+-                 gchar *domain, GAskPasswordFlags flags, gpointer data)
++start_download ()
+ {
+-      g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED);
+-}
+-
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Asynchronous callback for the mount operation.                 */
+-/*--------------------------------------------------------------------------*/
+-static void
+-mount_complete_cb (GObject *src, GAsyncResult *res, gpointer data)
+-{
+-      GMountOperation *op = data;
+-      GError          *err = NULL;
+-
+-      g_file_mount_enclosing_volume_finish (G_FILE (src), res, &err);
+-      g_object_unref (op);
+-      if (err) {
+-              /* If the mount operation was cancelled, GIO will
+-                 attempt to complete it anyway, which may succeed or
+-                 not.  Try unmounting just in case.  */
+-              if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+-                      unmount_volume (G_FILE (src));
+-                      g_error_free (err);
+-                      return;
+-              }
+-              io_error ("Could not mount remote filesystem: %s",
+-                        err->message);
+-              /* Break the loop in get_remote_file_list.  */
+-              g_cancellable_cancel (update_cancel_flag);
+-              g_object_unref (src);
+-              g_error_free (err);
+-      } else {
+-              mounted = TRUE;
+-              get_remote_file_list (G_FILE (src));
+-      }
+-}
++      gchar                *status_string;
++      DownloadCallbackData *data;
+ 
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Begin the asynchronous process of mounting the remote site.    */
+-/*--------------------------------------------------------------------------*/
+-static void
+-mount_volume (GFile *uri)
+-{
+-      GMountOperation *op;
+-      gchar           *status_string;
++      gb_debug (DEBUG_UPDATE, "START");
+ 
+       status_string = g_strdup_printf (_("Connecting to \"%s\" ..."),
+-                                       site_uri);
++                                       TREASURY_HOST);
+       gtk_label_set_text (GTK_LABEL (status_label), status_string);
+       g_free (status_string);
+ 
+       if (!update_cancel_flag)
+               update_cancel_flag = g_cancellable_new ();
+ 
+-      op = g_mount_operation_new ();
+-      g_mount_operation_set_anonymous (op, TRUE);
+-      g_signal_connect (op, "ask-password",
+-                        G_CALLBACK (ask_password_cb), NULL);
+-
+-      g_file_mount_enclosing_volume (uri,
+-                                     G_MOUNT_MOUNT_NONE,
+-                                     op,
+-                                     update_cancel_flag,
+-                                     mount_complete_cb,
+-                                     op);
+-}
+-
+-
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Begin the asynchronous process of contacting the given site    */
+-/* and getting a list of apropriate files from the site.                    */
+-/*--------------------------------------------------------------------------*/
+-static void get_remote_file_list( GFile *uri )
+-{
+-      DirCallbackData *data;
+-
+-      gb_debug (DEBUG_UPDATE, "START");
+-
+-      data = g_new0( DirCallbackData, 1 );
+-      data->n = 0;
+-      data->list = NULL;
+-      data->uri = uri;
+-
+-      g_object_set_data (G_OBJECT (uri), "dirdata", data);
+-
+-      while (!mounted && !g_cancellable_is_cancelled (update_cancel_flag))
+-              gtk_main_iteration ();
+-
+-      if (g_cancellable_is_cancelled (update_cancel_flag)) {
+-              g_free (data);
+-              return;
+-      }
+-
+-      g_file_enumerate_children_async (uri,
+-                                       "standard::*",
+-                                       G_FILE_QUERY_INFO_NONE,
+-                                       G_PRIORITY_DEFAULT,
+-                                       update_cancel_flag,
+-                                       get_remote_file_list_cb,
+-                                       data);
+-
+-
+-      gb_debug (DEBUG_UPDATE, "END");
+-}
+-
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Asynchronous callback for each directory entry from remote     */
+-/* site.                                                                    */
+-/*--------------------------------------------------------------------------*/
+-static void get_remote_list_cb( GObject *src,
+-                                GAsyncResult *result,
+-                                gpointer callback_data )
+-{
+-      DirCallbackData *data = (DirCallbackData *)callback_data;
+-      GFileInfo       *safe_info;
+-      GList           *list, *walk;
+-      GError          *error = NULL;
+-      gchar           *ext;
+-      const gchar     *name;
+-
+-      if (g_cancellable_is_cancelled (update_cancel_flag)) {
+-              g_object_unref (src);
+-              unmount_volume (data->uri);
+-              return;
+-      }
+-
+-      list = g_file_enumerator_next_files_finish (G_FILE_ENUMERATOR (src),
+-                                                  result, &error);
+-      if (error) {
+-              gchar *uri;
+-
+-              uri = g_file_get_uri (data->uri);
+-              io_error ("Could not obtain the list of files at site %s: %s",
+-                        uri, error->message);
+-              g_free (uri);
+-              g_object_unref (src);
+-              unmount_volume (data->uri);
+-              g_error_free (error);
+-              return;
+-      }
+-
+-      for (walk = list; walk; walk = walk->next) {
+-              name = g_file_info_get_name (walk->data);
+-              ext = strrchr (name, '.');
+-              if (ext
+-                  && (g_ascii_strcasecmp (ext, ".asc") == 0)
+-                  && (g_ascii_strncasecmp (name, "sb", 2) == 0)) {
+-                      safe_info = g_file_info_dup (walk->data);
+-                      data->list = g_list_prepend (data->list, safe_info);
+-                      data->n++;
+-              }
+-      }
+-
+-      g_object_unref (src);
+-      g_list_free_full (list, g_object_unref);
+-      got_remote_list (data->uri, data->list, data->n);
+-}
++      update_progress_bar (GTK_PROGRESS_BAR (page_progress), 0, 0);
+ 
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Asynchronous callback for obtaining a remote enumerator.       */
+-/*--------------------------------------------------------------------------*/
+-static void get_remote_file_list_cb( GObject *src,
+-                                   GAsyncResult *result,
+-                                   gpointer callback_data )
+-{
+-      DirCallbackData  *data = (DirCallbackData *)callback_data;
+-      GFileEnumerator  *fenum;
+-      GError           *err = NULL;
++      data = g_new0 ( DownloadCallbackData, 1 );
++      data->session = g_object_new (
++              SOUP_TYPE_SESSION,
++              SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_CONTENT_DECODER,
++              SOUP_SESSION_USER_AGENT, PACKAGE_STRING,
++              SOUP_SESSION_ACCEPT_LANGUAGE_AUTO, TRUE,
++              NULL);
++      data->year = GB_YEAR(download_date);
++      data->month = GB_MONTH(download_date);
++      data->page = 1;
+ 
+-      gb_debug (DEBUG_UPDATE, "START");
+-
+-      if (g_cancellable_is_cancelled (update_cancel_flag)) {
+-              unmount_volume (G_FILE (src));
+-              gb_debug (DEBUG_UPDATE, "END -- CANCEL");
+-              return;
+-      }
+-
+-      fenum = g_file_enumerate_children_finish (G_FILE (src), result, &err);
+-      if (err) {
+-              gchar *uri;
+-
+-              uri = g_file_get_uri (G_FILE (src));
+-              io_error (_("Could not obtain files from remote site %s: %s"),
+-                        uri, err->message);
+-              g_free (uri);
+-              unmount_volume (G_FILE (src));
+-              g_error_free (err);
+-              return;
+-      }
+-
+-      g_file_enumerator_next_files_async (fenum,
+-                                          G_MAXINT32,
+-                                          G_PRIORITY_DEFAULT,
+-                                          update_cancel_flag,
+-                                          get_remote_list_cb,
+-                                          data);
++      download_page(data);
+ 
+       gb_debug (DEBUG_UPDATE, "END");
+ }
+ 
+-
+-
+ /*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Called once the remote file list is completed.  Kicks off the  */
+-/* asynchronous process of downloading any new files in that list.          */
++/* PRIVATE.  Initiate a download of one page of data from the API.          */
+ /*--------------------------------------------------------------------------*/
+-static void got_remote_list( GFile *uri, GList *list, gint n )
++static void
++download_page (DownloadCallbackData *data)
+ {
+-      gchar *rdata_dir;
+-      gchar *home_data_dir = gb_util_get_home_data_dir();
++      gchar       *uri;
++      SoupMessage *msg;
+ 
+       gb_debug (DEBUG_UPDATE, "START");
+ 
+-      /*
+-       * Now we have a list of remote redemption files, now lets remove any
+-       * files from that list that we already have locally.
+-       */
+-      rdata_dir = g_build_path (G_DIR_SEPARATOR_S, DATADIR, "gbonds", NULL);
+-      list = prune_list_from_dir( list, &n, rdata_dir );
+-      list = prune_list_from_dir( list, &n, home_data_dir );
+-
+-      /*
+-       * Now begin download of what's left.
+-       */
+-      download_files( uri, list, n );
++      uri = g_strdup_printf (
++              "%s"
++              "?filter=redemp_period:gte:%i-%02i"
++              "&page[number]=%i"
++              "&page[size]=%i"
++              "&sort=redemp_period",
++              TREASURY_URL, data->year, data->month,
++              data->page, TREASURY_PAGE_SIZE);
++      gb_debug (DEBUG_UPDATE, "URI: %s", uri);
+ 
+-      g_free( home_data_dir );
+-      g_free (rdata_dir);
++      msg = soup_message_new (SOUP_METHOD_GET, uri);
++      soup_session_queue_message (data->session, msg, download_cb, data);
+ 
+       gb_debug (DEBUG_UPDATE, "END");
+ }
+ 
+ 
+-
++
+ /*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Prune list of files by removing any duplicates in the given    */
+-/* local directory.                                                         */
++/* PRIVATE.  Format a redemption amount as a fixed-width, zero-padded ASCII */
++/* number (i.e. the format used in the .asc files).                         */
+ /*--------------------------------------------------------------------------*/
+-static GList *
+-prune_list_from_dir( GList *remote_list, gint *n, const gchar *dirname )
++static void
++format_amt(gchar *buffer, gsize buffer_size, const gchar *amt)
+ {
+-      GFileInfo        *local_info, *remote_info;
+-      GList            *p_remote;
+-      GFile            *local_text_uri;
+-      GFileEnumerator  *direnum;
+-
+-      gb_debug (DEBUG_UPDATE, "START");
+-
+-      if ( dirname == NULL ) return remote_list;
++      if (g_strcmp0 (amt, "NO PAY") == 0) {
++              g_strlcpy (buffer, amt, buffer_size);
++              return;
++      }
+ 
+-      local_text_uri = g_file_new_for_path (dirname);
+-      if (!(direnum
+-            = g_file_enumerate_children (local_text_uri,
+-                                         "standard::*",
+-                                         G_FILE_QUERY_INFO_NONE,
+-                                         update_cancel_flag,
+-                                         NULL))) {
+-              g_object_unref (local_text_uri);
+-              return remote_list;
+-      }
+-
+-      while (1) {
+-              if (!g_file_enumerator_iterate (direnum, &local_info, NULL,
+-                                              update_cancel_flag, NULL)) {
+-                      g_object_unref (direnum);
+-                      g_object_unref (local_text_uri);
+-                      return remote_list;
+-              }
+-              if (!local_info)
+-                      break;
+-
+-              for ( p_remote=remote_list; p_remote != NULL; 
p_remote=p_remote->next ) {
+-                      remote_info = (GFileInfo *)p_remote->data;
+-                      /* Filenames have no guaranteed encoding, but given 
that we are only
+-                       * interested in redemption files, it's safe to assume 
they are ASCII.
+-                       * Even if they are not, a false positive or false 
negative here is
+-                       * unlikely to be a real problem. */
+-                      if (g_ascii_strcasecmp (g_file_info_get_name
+-                                              (local_info),
+-                                              g_file_info_get_name
+-                                              (remote_info)) == 0) {
+-                              remote_list = g_list_remove_link( remote_list, 
p_remote );
+-                              g_object_unref (remote_info);
+-                              p_remote->data = remote_info = NULL;
+-                              g_list_free_1( p_remote ); p_remote = NULL;
+-                              *n -= 1;
+-                              break;
++      if (strstr (amt, "."))
++      {
++              gint pad, i;
++
++              pad = buffer_size - 1 - strlen (amt) + 1;
++              for (i = 0; i < pad; i++)
++              {
++                      *(buffer + i) = '0';
++              }
++              while (i < (buffer_size - 1) && *amt)
++              {
++                      if (*amt != '.') {
++                              *(buffer + i) = *amt;
++                              i++;
+                       }
++                      amt++;
+               }
+-
++              buffer[buffer_size - 1] = '\0';
++              return;
+       }
+-  
+-      g_object_unref (local_text_uri);
+-      g_object_unref (direnum);
+-
+-      gb_debug (DEBUG_UPDATE, "END");
+-
+-      return remote_list;
+-}
+-
+-
+-
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Start downloading files in the list from remote site.          */
+-/*--------------------------------------------------------------------------*/
+-static void download_files( GFile *uri, GList *list, gint n )
+-{
+-      GFileInfo            *info;
+-      DownloadCallbackData *data;
+-      goffset               total_bytes;
+-      GList                *p;
+-      gchar                *status_string, *tmp;
+ 
+-      gb_debug (DEBUG_UPDATE, "START");
++      if (g_strcmp0(amt, "null") != 0)
++      {
++              gb_debug (DEBUG_UPDATE, "Unrecognized amount: %s", amt);
++      }
++      g_strlcpy (buffer, "      ", buffer_size);
++}
++
++/*--------------------------------------------------------------------------*/
++/* PRIVATE.  Liberally parse a JsonNode that is expected to contain an      */
++/* integer, allowing it to contain an integer as a string.                  */
++/*--------------------------------------------------------------------------*/
++static gint64
++gb_json_node_get_int (JsonNode *node)
++{
++      const gchar *str;
++
++      str = json_node_get_string (node);
++      if (str == NULL) {
++              return json_node_get_int (node);
++      }
++      return g_ascii_strtoull (str, NULL, 10);
++}
++
++/*--------------------------------------------------------------------------*/
++/* PRIVATE.  Handle temp file for atomic file writes.                       */
++/*--------------------------------------------------------------------------*/
++static gboolean
++close_temp_file(DownloadCallbackData *data)
++{
++      char *path;
++
++      if (!data->tmp_filename)
++      {
++              return TRUE;
++      }
++
++      /* TODO: REMOVE */
++      g_print("close_temp_file: %s %s\n", data->tmp_filename, data->filename);
++
++      if (fflush (data->file) < 0) {
++              io_error (_("Failed to flush temp file: %s"),
++                      g_strerror (errno));
++              fclose (data->file);
++              data->file = NULL;
++              unlink (data->tmp_filename);
++              g_free (data->tmp_filename);
++              data->tmp_filename = NULL;
++              g_free (data->filename);
++              data->filename = NULL;
++              return FALSE;
++      }
++      if (fsync (fileno (data->file)) < 0) {
++              io_error (_("Failed to sync temp file: %s"),
++                      g_strerror (errno));
++              fclose (data->file);
++              data->file = NULL;
++              unlink (data->tmp_filename);
++              g_free (data->tmp_filename);
++              data->tmp_filename = NULL;
++              g_free (data->filename);
++              data->filename = NULL;
++              return FALSE;
++      }
++      if (fclose (data->file) < 0) {
++              io_error (_("Failed to close temp file: %s"),
++                      g_strerror (errno));
++              data->file = NULL;
++              unlink (data->tmp_filename);
++              g_free (data->tmp_filename);
++              data->tmp_filename = NULL;
++              g_free (data->filename);
++              data->filename = NULL;
++              return FALSE;
++      }
++      data->file = NULL;
++
++      path = g_build_filename(data->dir, data->filename, NULL);
++      if (g_rename (data->tmp_filename, path) == -1) {
++              io_error (_("Failed to rename %s to %s: %s"),
++                      data->tmp_filename, data->filename,
++                      g_strerror (errno));
++              unlink (data->tmp_filename);
++              g_free (data->tmp_filename);
++              data->tmp_filename = NULL;
++              g_free (data->filename);
++              data->filename = NULL;
++              g_free(path);
++              return FALSE;
++      }
++      /* TODO: REMOVE */
++      g_print("RENAMED %s to %s", data->tmp_filename, path);
++      g_free(path);
++
++      data->n++;
++      g_free (data->tmp_filename);
++      data->tmp_filename = NULL;
++      g_free (data->filename);
++      data->filename = NULL;
++      return TRUE;
++}
++
++static gboolean
++open_temp_file(DownloadCallbackData *data, gint redemption_year,
++               gint redemption_month)
++{
++      gchar *filename;
++      gchar *tmp;
++      gint fd;
++
++      if (redemption_month == 12) {
++              filename = g_strdup_printf (
++                      "sb%i12.asc", redemption_year);
++      } else if (redemption_month <= 5) {
++              filename = g_strdup_printf (
++                      "sb%i12.asc", redemption_year - 1);
++      } else {
++              filename = g_strdup_printf (
++                      "sb%i06.asc", redemption_year);
++      }
+ 
+-      if ( list ) {
++      /* See if the file needs to change. */
++      if (g_strcmp0 (filename, data->filename) == 0) {
++              g_free (filename);
++              return TRUE;
++      }
+ 
+-              status_string = g_strdup_printf( _("Downloading redemption 
tables...") );
+-              gtk_label_set_text( GTK_LABEL(status_label), status_string );
+-              g_free( status_string );
+-
+-              total_bytes = 0;
+-              for ( p=list; p!=NULL; p=p->next ) {
+-                      info = (GFileInfo *)p->data;
+-                      total_bytes += g_file_info_get_size (info);
+-              }
++      if (!close_temp_file (data)) {
++              g_free (filename);
++              return FALSE;
++      }
+ 
+-              data = g_new0( DownloadCallbackData, 1 );
+-              data->i = 0;
+-              data->n = n;
+-              data->total_bytes_read = 0;
+-              data->total_bytes = total_bytes;
+-              data->list = list;
+-              data->p = list;
+-              data->uri = uri;
+-              data->buffer = g_malloc0( 4096 );
+-              data->buffer_length = 4096;
+-              data->line_buffer = g_malloc0( 4096 );
+-              data->local_handle = NULL;
+-
+-              info = (GFileInfo *)data->p->data;
+-              gb_debug (DEBUG_UPDATE, "Opening %s",
+-                        g_file_info_get_name (info));
+-              data->file = g_file_get_child (data->uri,
+-                                             g_file_info_get_name (info));
+-              g_object_set_data (G_OBJECT (uri), "data", data);
+-              tmp = g_file_get_uri (data->file);
+-              gb_debug (DEBUG_UPDATE, " URI = %s", tmp);
+-              g_free (tmp);
+-
+-              g_file_read_async (data->file,
+-                                 G_PRIORITY_DEFAULT,
+-                                 update_cancel_flag,
+-                                 open_remote_file_callback,
+-                                 data);
++      /* Open a temp file. */
++      if (!data->dir) {
++              data->dir = gb_util_get_home_data_dir ();
+       }
+-      else {
+-              unmount_volume (uri);
+-              no_download();
++      tmp = g_strdup_printf ("%s.tmp", filename);
++      data->tmp_filename = g_build_filename (
++              data->dir, tmp, NULL);
++      g_free (tmp);
++      g_print ("TEMP: %s\n", data->tmp_filename);
++      if ((data->file = g_fopen (data->tmp_filename, "wb")) == NULL) {
++              io_error (_("Failed to open temp file: %s"),
++                      g_strerror (errno));
++              g_free (filename);
++              g_free (data->tmp_filename);
++              data->tmp_filename = NULL;
++              return FALSE;
+       }
+ 
+-      gb_debug (DEBUG_UPDATE, "END");
++      data->filename = filename;
++      return TRUE;
+ }
+ 
+ 
+-
+-
+ /*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Remote file open callback.  Once open, open the local file     */
+-/* and begin the process of copying data from the remote file to the local  */
+-/* file.                                                                    */
+-/*--------------------------------------------------------------------------*/
+-static void open_remote_file_callback( GObject *handle,
+-                                     GAsyncResult *result,
+-                                     gpointer callback_data )
+-{
+-      DownloadCallbackData *data = (DownloadCallbackData *)callback_data;
+-      GFileInfo            *info = (GFileInfo *)data->p->data;
+-      GFile                *local_text_uri;
+-      gchar                *local_path, *local_name, *data_dir;
+-      GFileInputStream     *remote_handle;
+-      GFileOutputStream    *local_handle;
+-      gchar                *status_string;
+-      GError               *error = NULL;
++/* PRIVATE.  Process one page of data from the API.                         */
++/*--------------------------------------------------------------------------*/
++static void
++download_cb (SoupSession *session, SoupMessage *msg, gpointer user_data)
++{
++      DownloadCallbackData *data = (DownloadCallbackData *)user_data;
++      gboolean             result;
++      JsonNode             *root;
++      JsonObject           *root_object;
++      JsonArray            *redemption_data;
++      gint                 array_length, i;
+ 
+       gb_debug (DEBUG_UPDATE, "START");
+ 
+       if (g_cancellable_is_cancelled (update_cancel_flag)) {
+-              unmount_volume (data->uri);
++              free_download_data (data);
+               gb_debug (DEBUG_UPDATE, "END -- CANCEL");
+               return;
+       }
+ 
+-      remote_handle = g_file_read_finish (G_FILE (handle), result, &error);
+-      if (error) {
+-              gchar *uri;
+-
+-              uri = g_file_get_uri (G_FILE (handle));
+-              io_error ("Opening remote file %s failed: %s", uri,
+-                        error->message);
+-              g_free (uri);
+-              unmount_volume (data->uri);
+-              g_error_free (error);
+-              return;
+-      }
+-
+-      data->file_bytes_read = 0;
+-      data->file_bytes = g_file_info_get_size (info);
+-
+-      status_string = g_strdup_printf (_("File: \"%s\" (%d of %d)"),
+-                                       g_file_info_get_name (info),
+-                                       (data->i + 1), data->n);
+-      gtk_label_set_text (GTK_LABEL (file_label), status_string);
+-      g_free (status_string);
+-
+-      update_progress_bar (GTK_PROGRESS_BAR (file_progress),
+-                           0,
+-                           data->file_bytes);
+-      update_progress_bar (GTK_PROGRESS_BAR (total_progress),
+-                           data->total_bytes_read,
+-                           data->total_bytes);
+-
+-      local_name = hash_filename (g_file_info_get_name (info));
+-      data_dir = gb_util_get_home_data_dir ();
+-      local_path = g_build_filename (data_dir, local_name, NULL);
+-      g_free (data_dir);
+-      local_text_uri = g_file_new_for_path (local_path);
+-      local_handle = g_file_create (local_text_uri, G_FILE_CREATE_NONE,
+-                                    NULL, &error);
+-
+-      /* File may exist if the user cancelled the operation during
+-         downloading and decided to retry the update later.  */
+-      if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) {
+-              g_error_free (error);
+-              error = NULL;
+-              g_file_delete (local_text_uri, NULL, NULL);
+-              local_handle = g_file_create (local_text_uri,
+-                                            G_FILE_CREATE_NONE,
+-                                            NULL, &error);
+-      }
+-      if (error) {
+-              io_error ("Error opening local file %s: %s\n", local_path,
+-                        error->message);
+-              g_object_unref (remote_handle);
+-              unmount_volume (data->uri);
+-              g_error_free (error);
+-      } else {
+-              data->local_handle = local_handle;
+-              g_input_stream_read_async (G_INPUT_STREAM (remote_handle),
+-                                         data->buffer,
+-                                         data->buffer_length,
+-                                         G_PRIORITY_DEFAULT,
+-                                         update_cancel_flag,
+-                                         read_remote_file_callback,
+-                                         data);
+-      }
+-      g_free (local_name);
+-      g_free (local_path);
+-      g_object_unref (local_text_uri);
+-
+-      gb_debug (DEBUG_UPDATE, "END");
+-}
+-
+-
+-
+-
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Hash filename.  Create a temporary filename for downloaded     */
+-/* file, so that we can cancel gracefully.                                  */
+-/*--------------------------------------------------------------------------*/
+-static gchar *hash_filename( const gchar *filename )
+-{
+-      return g_strdup_printf( "#%s#", filename );
+-}
+-
+-
+-
+-
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Remote read callback.  Take a data block read from the remote  */
+-/* file, and copy it to the local file.                                     */
+-/*--------------------------------------------------------------------------*/
+-static void
+-read_remote_file_callback( GObject *handle,
+-                         GAsyncResult *result,
+-                         gpointer callback_data )
+-{
+-      DownloadCallbackData *data = (DownloadCallbackData *)callback_data;
+-      GError               *error = NULL;
+-      gssize                bytes_read, bytes_written;
++      if (msg->status_code == SOUP_STATUS_SSL_FAILED) {
++              GTlsCertificateFlags flags;
+ 
+-      gb_debug (DEBUG_UPDATE, "START");
+-      if (g_cancellable_is_cancelled (update_cancel_flag)) {
+-              g_object_unref (handle);
+-              g_object_unref (data->local_handle);
+-              unmount_volume (data->uri);
+-              gb_debug (DEBUG_UPDATE, "END -- CANCEL");
++              if (soup_message_get_https_status (msg, NULL, &flags))
++                      io_error ("%d %s (0x%x)\n", msg->status_code,
++                              msg->reason_phrase, flags);
++              else
++                      io_error ("%d %s (no handshake status)\n",
++                              msg->status_code, msg->reason_phrase);
++              gb_debug (DEBUG_UPDATE, "END -- ERROR");
++              return;
++      } else if (SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code)) {
++              io_error ("%d %s\n", msg->status_code, msg->reason_phrase);
++              gb_debug (DEBUG_UPDATE, "END -- ERROR");
+               return;
+       }
+ 
+-      bytes_read = g_input_stream_read_finish (G_INPUT_STREAM (handle),
+-                                               result, &error);
+-      if (error) {
+-              gchar *uri;
+-
+-              uri = g_file_get_uri (data->file);
+-              io_error ("Could not read remote file %s: %s", uri,
+-                        error->message);
+-              g_free (uri);
+-              g_object_unref (handle);
+-              g_object_unref (data->local_handle);
+-              unmount_volume (data->uri);
+-              g_error_free (error);
+-              return;
++      if (!data->parser)
++              data->parser = json_parser_new ();
++      result = json_parser_load_from_data (
++              data->parser, msg->response_body->data, -1, NULL);
++      if (!result) {
++              io_error (_("Failed to parse JSON response."));
++              gb_debug (DEBUG_UPDATE, "END -- FAILED TO PARSE");
++              return;
+       }
+ 
+-      if (bytes_read > 0) {
+-              data->total_bytes_read += bytes_read;
+-              data->file_bytes_read += bytes_read;
+-
+-              update_progress_bar (GTK_PROGRESS_BAR (file_progress),
+-                                   data->file_bytes_read,
+-                                   data->file_bytes);
+-              update_progress_bar (GTK_PROGRESS_BAR (total_progress),
+-                                   data->total_bytes_read,
+-                                   data->total_bytes);
+-
+-              bytes_written = g_output_stream_write (G_OUTPUT_STREAM
+-                                                     (data->local_handle),
+-                                                     data->buffer,
+-                                                     bytes_read,
+-                                                     NULL,
+-                                                     NULL);
+-              if (bytes_written != bytes_read) {
+-                      g_warning ("Write failed: %d bytes written != "
+-                                 "%d bytes read",
+-                                 (gint)bytes_written, (gint)bytes_read);
+-              }
+-              g_input_stream_read_async (G_INPUT_STREAM (handle),
+-                                         data->buffer,
+-                                         data->buffer_length,
+-                                         G_PRIORITY_DEFAULT,
+-                                         update_cancel_flag,
+-                                         read_remote_file_callback,
+-                                         data);
+-      } else {
+-              gb_debug (DEBUG_UPDATE, "EOF -- %" G_GSSIZE_FORMAT,
+-                        bytes_read);
+-              g_input_stream_close_async (G_INPUT_STREAM (handle),
+-                                          G_PRIORITY_DEFAULT,
+-                                          update_cancel_flag,
+-                                          close_remote_file_callback,
+-                                          data);
++      root = json_parser_get_root (data->parser);
++      if (!JSON_NODE_HOLDS_OBJECT (root)) {
++              io_error (_("Failed to parse JSON response."));
++              gb_debug (DEBUG_UPDATE, "END -- JSON ROOT MALFORMED");
++              return;
+       }
++      root_object = json_node_get_object (root);
+ 
+-      gb_debug (DEBUG_UPDATE, "END");
+-}
+-
++      if (data->page == 1) {
++              JsonObject *meta;
+ 
++              meta = json_object_get_object_member (root_object, "meta");
++              if (!meta) {
++                      io_error (_("Failed to parse JSON response."));
++                      gb_debug (DEBUG_UPDATE, "END -- JSON meta MALFORMED");
++                      return;
++              }
+ 
+-
+-/*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Remote file closed callback.  Close local file and open the    */
+-/* next remote file in the list, if any.                                    */
+-/*--------------------------------------------------------------------------*/
+-static void close_remote_file_callback( GObject *handle,
+-                                      GAsyncResult *result,
+-                                      gpointer callback_data )
+-{
+-      DownloadCallbackData *data = (DownloadCallbackData *)callback_data;
+-      GFileInfo            *info;
+-      GError               *error = NULL;
+-      gchar                *tmp;
++              if (!json_object_get_int_member (meta, "count")) {
++                      no_download (data);
++                      gb_debug (DEBUG_UPDATE, "END -- NO DATA (count)");
++                      return;
++              }
+ 
+-      gb_debug (DEBUG_UPDATE, "START");
++              data->total_pages = json_object_get_int_member (
++                      meta, "total-pages");
++              if (!data->total_pages) {
++                      io_error (_("Failed to parse JSON response."));
++                      gb_debug (DEBUG_UPDATE,
++                              "END -- JSON total-pages MALFORMED");
++                      return;
++              }
++      }
+ 
+-      if ( data->local_handle ) {
+-              g_output_stream_close (G_OUTPUT_STREAM (data->local_handle),
+-                                     NULL, NULL);
+-              g_object_unref (data->local_handle);
+-              data->local_handle = NULL;
+-      }
+-
+-      g_input_stream_close_finish (G_INPUT_STREAM (handle), result, &error);
+-      if (error) {
+-              gchar *uri;
+-
+-              uri = g_file_get_uri (data->file);
+-              g_warning ("Could not close remote file %s: %s", uri,
+-                         error->message);
+-              g_free (uri);
+-              g_object_unref (handle);
+-              g_error_free (error);
++      redemption_data = json_object_get_array_member (
++              root_object, "data");
++      if (!redemption_data ||
++          !(array_length = json_array_get_length (redemption_data))) {
++              no_download (data);
++              gb_debug (DEBUG_UPDATE, "END -- NO DATA (data)");
++              return;
+       }
++      for (i = 0; i < array_length; i++)
++      {
++              JsonObject  *object;
++              gint        redemption_year, redemption_month, issue_year;
++              const gchar *series_cd;
++              gchar       issue_amts[12][7]; /* 12 month of 6 chars + NUL */
++              int         ret;
++
++              object = json_array_get_object_element (redemption_data, i);
++
++              redemption_year = gb_json_node_get_int (
++                      json_object_get_member (object, "redemption_year"));
++              redemption_month = gb_json_node_get_int (
++                      json_object_get_member (object, "redemption_month"));
++              series_cd = json_object_get_string_member (
++                      object, "series_cd");
++              issue_year = gb_json_node_get_int (
++                      json_object_get_member (object, "issue_year"));
++
++              if (!redemption_year || !redemption_month || !series_cd ||
++                  !*series_cd || !issue_year) {
++                      io_error (_("Failed to parse JSON response."));
++                      gb_debug (DEBUG_UPDATE,
++                              "END -- JSON redemption data MALFORMED");
++                      return;
++              }
+ 
+-      if (g_cancellable_is_cancelled (update_cancel_flag)) {
+-              unmount_volume (data->uri);
+-              return;
++              format_amt (issue_amts[0], sizeof (issue_amts[0]),
++                      json_object_get_string_member (
++                              object, "issue_jan_amt"));
++              format_amt (issue_amts[1], sizeof (issue_amts[1]),
++                      json_object_get_string_member (
++                              object, "issue_feb_amt"));
++              format_amt (issue_amts[2], sizeof (issue_amts[2]),
++                      json_object_get_string_member (
++                              object, "issue_mar_amt"));
++              format_amt (issue_amts[3], sizeof (issue_amts[3]),
++                      json_object_get_string_member (
++                              object, "issue_apr_amt"));
++              format_amt (issue_amts[4], sizeof (issue_amts[4]),
++                      json_object_get_string_member (
++                              object, "issue_may_amt"));
++              format_amt (issue_amts[5], sizeof (issue_amts[5]),
++                      json_object_get_string_member (
++                              object, "issue_jun_amt"));
++              format_amt (issue_amts[6], sizeof (issue_amts[6]),
++                      json_object_get_string_member (
++                              object, "issue_jul_amt"));
++              format_amt (issue_amts[7], sizeof (issue_amts[7]),
++                      json_object_get_string_member (
++                              object, "issue_aug_amt"));
++              format_amt (issue_amts[8], sizeof (issue_amts[8]),
++                      json_object_get_string_member (
++                              object, "issue_sep_amt"));
++              format_amt (issue_amts[9], sizeof (issue_amts[9]),
++                      json_object_get_string_member (
++                              object, "issue_oct_amt"));
++              format_amt (issue_amts[10], sizeof (issue_amts[10]),
++                      json_object_get_string_member (
++                              object, "issue_nov_amt"));
++              format_amt (issue_amts[11], sizeof (issue_amts[11]),
++                      json_object_get_string_member (
++                              object, "issue_dec_amt"));
++
++              if (redemption_month != data->last_redemption_month) {
++                      if (!open_temp_file (
++                                      data, redemption_year,
++                                      redemption_month)) {
++                              gb_debug (DEBUG_UPDATE,
++                                      "END -- TEMP FILE OPEN FAILED");
++                              return;
++                      }
++              }
++
++              ret = fprintf(
++                      data->file,
++                      "%s%04i%02i%04i%s%s%s%s%s%s%s%s%s%s%s%s\r\n",
++                      series_cd, redemption_year, redemption_month,
++                      issue_year,
++                      issue_amts[0], issue_amts[1], issue_amts[2],
++                      issue_amts[3], issue_amts[4], issue_amts[5],
++                      issue_amts[6], issue_amts[7], issue_amts[8],
++                      issue_amts[9], issue_amts[10], issue_amts[11]);
++              if (ret < 0) {
++                      io_error (_("Failed to write to temp file: %s"),
++                              g_strerror(errno));
++                      gb_debug (DEBUG_UPDATE,
++                              "END -- TEMP WRITE FAILED");
++                      return;
++              }
+       }
+ 
+-      g_object_unref (data->file);
++      update_progress_bar (GTK_PROGRESS_BAR (page_progress),
++              data->page, data->total_pages);
+ 
+-      data->i++;
+-      data->p = data->p->next;
+-      if ( data->p ) {
+-              info = (GFileInfo *)data->p->data;
+-              gb_debug (DEBUG_UPDATE, "Opening %s",
+-                        g_file_info_get_name (info));
+-              data->file = g_file_get_child (data->uri,
+-                                             g_file_info_get_name (info));
+-              tmp = g_file_get_uri (data->file);
+-              gb_debug (DEBUG_UPDATE, " URI = %s", tmp);
+-              g_free (tmp);
+-              g_file_read_async (data->file,
+-                                 G_PRIORITY_DEFAULT,
+-                                 update_cancel_flag,
+-                                 open_remote_file_callback,
+-                                 data);
++      if (data->page != data->total_pages) {
++              data->page++;
++              download_page (data);
++              gb_debug (DEBUG_UPDATE, "END -- ANOTHER PAGE");
++              return;
+       }
+-      else {
+-              download_done( data );
+-              unmount_volume (data->uri);
++
++      if (!close_temp_file (data)) {
++              gb_debug (DEBUG_UPDATE, "END -- TEMP FILE CLOSE FAILED");
++              return;
+       }
+ 
++      download_done (data);
++
+       gb_debug (DEBUG_UPDATE, "END");
+ }
+ 
+ 
+-
+ 
+ /*--------------------------------------------------------------------------*/
+ /* PRIVATE.  Download successful.  Finish up and present an apropriate      */
+@@ -1246,47 +890,6 @@
+ 
+       gb_debug (DEBUG_UPDATE, "START");
+ 
+-      /* Rename downloaded files (undo name hash) */
+-      data_dir = gb_util_get_home_data_dir();
+-      for ( p=data->list; p != NULL; p=p->next ) {
+-              info = (GFileInfo *)p->data;
+-              hash_name = hash_filename (g_file_info_get_name (info));
+-              hash_path = g_build_filename (data_dir, hash_name, NULL);
+-              hash_text_uri = g_file_new_for_path (hash_path);
+-              file_path = g_build_filename (data_dir,
+-                                            g_file_info_get_name (info),
+-                                            NULL);
+-              file_text_uri = g_file_new_for_path (file_path);
+-              tmp_info = g_file_query_info (hash_text_uri,
+-                                            G_FILE_ATTRIBUTE_STANDARD_SIZE,
+-                                            G_FILE_QUERY_INFO_NONE,
+-                                            update_cancel_flag,
+-                                            NULL);
+-              if (g_file_info_get_size (info)
+-                  == g_file_info_get_size (tmp_info)) {
+-                      g_file_move (hash_text_uri, file_text_uri,
+-                                   G_FILE_COPY_NONE, update_cancel_flag,
+-                                   NULL, NULL, NULL);
+-              } else {
+-                      g_warning ("%s: Temporary file size (%"
+-                                 G_GOFFSET_FORMAT
+-                                 ") does not match remote size (%"
+-                                 G_GOFFSET_FORMAT
+-                                 ").",
+-                                 g_file_info_get_name (info),
+-                                 g_file_info_get_size (tmp_info),
+-                                 g_file_info_get_size (info));
+-                      g_file_delete (hash_text_uri, NULL, NULL);
+-              }
+-              g_free( hash_name );
+-              g_free( hash_path );
+-              g_object_unref (hash_text_uri);
+-              g_free( file_path );
+-              g_object_unref (file_text_uri);
+-              g_object_unref (tmp_info);
+-      }
+-      g_free( data_dir );
+-
+       /* Now reread redemption tables */
+       table_model = gb_table_get_model ();
+       gb_table_model_update (table_model);
+@@ -1315,6 +918,8 @@
+                                           custom_widget);
+       gtk_assistant_next_page (GTK_ASSISTANT (update_druid));
+ 
++      free_download_data (data);
++
+       gb_debug (DEBUG_UPDATE, "END");
+ }
+ 
+@@ -1325,7 +930,7 @@
+ /* finish page.                                                             */
+ /*--------------------------------------------------------------------------*/
+ static void
+-no_download( void )
++no_download( DownloadCallbackData *data )
+ {
+       gchar *date_min, *date_max, *finish_msg;
+       gbTableModel     *table_model;
+@@ -1359,9 +964,24 @@
+                                           custom_widget);
+       gtk_assistant_next_page (GTK_ASSISTANT (update_druid));
+ 
++      free_download_data (data);
++
+       gb_debug (DEBUG_UPDATE, "END");
+ }
+ 
++static void free_download_data( DownloadCallbackData *data )
++{
++      g_object_unref (data->session);
++      g_object_unref (data->parser);
++      if (data->file) {
++              fclose (data->file);
++              unlink (data->tmp_filename);
++              g_free (data->tmp_filename);
++              g_free (data->filename);
++      }
++      g_free (data->dir);
++      g_free (data);
++}
+ 
+ 
+ 
+@@ -1423,83 +1043,24 @@
+ 
+ 
+ /*--------------------------------------------------------------------------*/
+-/* PRIVATE.  Read download site-list file.                                  */
+-/*--------------------------------------------------------------------------*/
+-static
+-GList *read_site_list( void )
+-{
+-      gchar     *xml_filename;
+-      xmlDocPtr  doc;
+-      xmlNodePtr root, node;
+-      Site      *site;
+-      GList     *site_list = NULL;
+-
+-      gb_debug (DEBUG_UPDATE, "START");
+-
+-      xml_filename = g_build_filename (DATADIR, G_DIR_SEPARATOR_S,
+-                                       "gbonds", G_DIR_SEPARATOR_S,
+-                                       "download-sites.xml",
+-                                       NULL);
+-      doc = xmlParseFile( xml_filename );
+-      if ( !doc ) {
+-              g_warning( "xmlParseFile error \"%s\"", xml_filename );
+-              g_free (xml_filename);
+-              return NULL;
+-      }
+-      g_free( xml_filename );
+-
+-      root = xmlDocGetRootElement( doc );
+-      if ( !root || !root->name ) {
+-              g_warning( "no document root \"%s\"", xml_filename );
+-              xmlFreeDoc( doc );
+-              return NULL;
+-      }
+-      if ( g_ascii_strcasecmp( (gchar *)root->name, "Redemption-Data-Sites" ) 
!= 0 ) {
+-              g_warning( "bad root node = \"%s\"", root->name );
+-              xmlFreeDoc( doc );
+-              return NULL;
+-      }
+-
+-      for ( node = root->xmlChildrenNode; node != NULL; node=node->next ) {
+-              if ( g_ascii_strcasecmp( (gchar *)node->name, "Site" ) == 0 ) {
+-                      site = g_new0( Site, 1 );
+-                      site->uri  = (gchar *)xmlGetProp( node, (xmlChar 
*)"uri" );
+-                      site->name = (gchar *)xmlNodeGetContent( node );
+-                      site_list = g_list_append( site_list, site );
+-              }
+-              else {
+-                      if ( g_ascii_strcasecmp( (gchar *)node->name, "text" ) 
!= 0 ) {
+-                              g_warning( "bad node =  \"%s\"", node->name );
+-                      }
+-              }
+-      }
+-
+-      xmlFreeDoc( doc );
+-
+-      gb_debug (DEBUG_UPDATE, "END");
+-
+-      return site_list;
+-}
+-
+-/*--------------------------------------------------------------------------*/
+ /* PRIVATE.  Update progress bar.                                           */
+ /*--------------------------------------------------------------------------*/
+ static void
+ update_progress_bar (GtkProgressBar *bar,
+-                   gint            bytes,
+-                   gint            total)
++                   gint            page,
++                   gint            pages)
+ {
+       gchar *string;
+ 
+-      if ( total > 0 ) {
++      if ( pages > 0 ) {
+ 
+-              string = g_strdup_printf ("%.0f%% (%d Bytes of %d Bytes)",
+-                                        100.0*((gdouble)bytes/(gdouble)total),
+-                                        bytes,
+-                                        total);
++              string = g_strdup_printf ("%.0f%% (%i of %i pages)",
++                                        100.0*((gdouble)page/(gdouble)pages),
++                                        page,
++                                        pages);
+ 
+               gtk_progress_bar_set_text (bar, string);
+-              gtk_progress_bar_set_fraction (bar, 
(gdouble)bytes/(gdouble)total);
++              gtk_progress_bar_set_fraction (bar, 
(gdouble)page/(gdouble)pages);
+ 
+               g_free (string);
+ 
+--- a/data/Makefile.am
++++ b/data/Makefile.am
+@@ -35,7 +35,6 @@
+ 
+ redemptiondir = $(datadir)/gbonds
+ redemption_DATA = \
+-      download-sites.xml \
+       sb199205.asc \
+       sb199211.asc \
+       sb199305.asc \
+--- a/configure.in
++++ b/configure.in
+@@ -30,9 +30,14 @@
+ LIBGNOMEPRINTUI_REQUIRED=2.2.0
+                
+ PKG_CHECK_MODULES(GBONDS, gtk+-3.0 >= $GTK_REQUIRED \
++json-glib-1.0
++libsoup-2.4 >= 2.56
+ libxml-2.0 >= $LIBXML_REQUIRED \
+ )
+ 
++GBONDS_CFLAGS="$GBONDS_CFLAGS -DSOUP_VERSION_MIN_REQUIRED=SOUP_VERSION_2_56"
++GBONDS_CFLAGS="$GBONDS_CFLAGS -DSOUP_VERSION_MAX_ALLOWED=SOUP_VERSION_2_56"
++
+ AC_SUBST(GBONDS_CFLAGS)
+ AC_SUBST(GBONDS_LIBS)
+ 
diff -Nru gbonds-2.0.3/debian/sb202106.asc gbonds-2.0.3/debian/sb202106.asc
--- gbonds-2.0.3/debian/sb202106.asc    1969-12-31 18:00:00.000000000 -0600
+++ gbonds-2.0.3/debian/sb202106.asc    2021-12-23 21:23:46.000000000 -0600
@@ -0,0 +1,660 @@
+E2021061980011062011062011062011062011175011175                                
    
+E2021061979010828010828010828010828010933010959010959010959010959010959011062011062
+E2021061978012845012845010854010854010667010694010697010697010697010697010798010827
+E2021061977013804013804013804013804013940013970013967013967013967013967012809012845
+E2021061976013476013476013476013476013604013634013632013632013632013632013765013804
+E2021061975013157013157013157013157013283013315013315013315013315013315013446013475
+E2021061974012848012848012848012848012971013002013002013002013002013002013126013159
+E2021061973012956012989012989012989012989013020013146013174013176013176013176012848
+E2021061972012588012617012619012619012619012654012777012805012805012805012805012833
+E2021061971012630012660012660012660012660012695012606012636012636012636012636012666
+E2021061970013700013734013736013736013736013800013936013969013969013969013969014001
+E2021061969013727013727013727013727013860013342013471013501013502013502013502013572
+E2021061968013128013128013128013128013257013416013414013414013414013414013544013728
+E2021061967012586012586012586012586012706012846012845012845012845012845012970013128
+E2021061966012813012813012194012194012202012328012327012327012327012327012446012585
+E2021061965023411021474021579021577021577018597018597018308018403018403018403012812
+E2021061964022455022671022779022777022777022929022929023152023261023261023261023411
+E2021061963021522021731021832021829021829021995021995022211022317022317022317022455
+E2021061962020675020875021027021024021024021079021079021281021432021433021433021522
+E2021061961019718019907020137020136020136020195020195020388020617020615020615020675
+E2021061960018850019017019236019236019236019269019269019452019678019679019679019718
+E2021061959019153019153019153019153019153018788018788018601018810018810018810018850
+E2021061958018312018312018312018312018312018453018672018671018671018671018671018934
+E2021061957019956019990019990019990019990020272020508020507020507020507020507018097
+E2021061956018679018679018859019383019383019429019429019429019619019848019847019956
+E2021061955017753017753017926018157018157018205018205018205018382018629018629018679
+E2021061954016886016886017051017269017269017312017312017312017481017716017717017753
+E2021061953017814017814016338016541016541016581016581016581016633016843016844016886
+E2021061952017066017066017066017066017338017378017378017378017546017769017766017814
+E2021061951016260016260016260016260016416016661016660016660016660016660016823017065
+E2021061950014706014706014706014706014848015053015053015053015053015053015199015426
+E2021061949013669013669013669013669013802014383014383014383014383014383014523014706
+E2021061948013141013141013141013141013109013323013323013323013323013323013451013669
+E2021061947012338012338012338012338012457012657012657012657012657012657012934013141
+E2021061946011728011728011728011728011841012025012025012025012025012025012142012338
+E2021061945011047011047011047011047011154011333011333011333011333011333011443011728
+E2021061944010509010509010509010509010611010770010770010770010770010770010875011047
+E2021061943009995009995009995009995010091010248010248010248010248010248010348010509
+E2021061942009435009435009435009435009600009745009745009745009745009745009840009995
+E2021061941                        
009059009196009196009196009196009196009286009435
+S2021061970013671013671013671013671013804013870013870013870013870013870        
    
+S2021061969013570013570013570013570013437013500013500013500013500013500013607013670
+S2021061968015629015629015629015629014337014568014568014568013618013618013497013570
+S2021061967                        
015333015404015405015405015405015405015552015628
+E2021071980011062011062011062011062011175011175                                
    
+E2021071979010828010828010828010828010933010959010959010959010959010959011062011062
+E2021071978012845012845010854010854010667010694010697010697010697010697010798010827
+E2021071977013804013804013804013804013940013970013967013967013967013967012809012845
+E2021071976013476013476013476013476013604013634013632013632013632013632013765013804
+E2021071975013157013157013157013157013283013315013315013315013315013315013446013475
+E2021071974012848012848012848012848012971013002013002013002013002013002013126013159
+E2021071973012956012989012989012989012989013020013146013174013176013176013176012848
+E2021071972012588012617012619012619012619012654012777012805012805012805012805012833
+E2021071971012630012660012660012660012660012695012606012636012636012636012636012666
+E2021071970013700013734013736013736013736013800013936013969013969013969013969014001
+E2021071969013727013727013727013727013860013342013471013501013502013502013502013572
+E2021071968013128013128013128013128013257013416013414013414013414013414013544013728
+E2021071967012586012586012586012586012706012846012845012845012845012845012970013128
+E2021071966012813012813012194012194012202012328012327012327012327012327012446012585
+E2021071965023411021474021579021577021577018597018597018308018403018403018403012812
+E2021071964022455022671022779022777022777022929022929023152023261023261023261023411
+E2021071963021522021731021832021829021829021995021995022211022317022317022317022455
+E2021071962020675020875021027021024021024021079021079021281021432021433021433021522
+E2021071961019718019907020137020136020136020195020195020388020617020615020615020675
+E2021071960018850019017019236019236019236019269019269019452019678019679019679019718
+E2021071959019153019153019153019153019153018788018788018601018810018810018810018850
+E2021071958018312018312018312018312018312018453018672018671018671018671018671018934
+E2021071957019956019990019990019990019990020272020508020507020507020507020507018097
+E2021071956018679018679018859019383019383019429019429019429019619019848019847019956
+E2021071955017753017753017926018157018157018205018205018205018382018629018629018679
+E2021071954016886016886017051017269017269017312017312017312017481017716017717017753
+E2021071953017814017814016338016541016541016581016581016581016633016843016844016886
+E2021071952017066017066017066017066017338017378017378017378017546017769017766017814
+E2021071951016260016260016260016260016416016661016660016660016660016660016823017065
+E2021071950014706014706014706014706014848015053015053015053015053015053015199015426
+E2021071949013669013669013669013669013802014383014383014383014383014383014523014706
+E2021071948013141013141013141013141013109013323013323013323013323013323013451013669
+E2021071947012338012338012338012338012457012657012657012657012657012657012934013141
+E2021071946011728011728011728011728011841012025012025012025012025012025012142012338
+E2021071945011047011047011047011047011154011333011333011333011333011333011443011728
+E2021071944010509010509010509010509010611010770010770010770010770010770010875011047
+E2021071943009995009995009995009995010091010248010248010248010248010248010348010509
+E2021071942009435009435009435009435009600009745009745009745009745009745009840009995
+E2021071941                        
009059009196009196009196009196009196009286009435
+S2021071970013671013671013671013671013804013870013870013870013870013870        
    
+S2021071969013570013570013570013570013437013500013500013500013500013500013607013670
+S2021071968015629015629015629015629014337014568014568014568013618013618013497013570
+S2021071967                        
015333015404015405015405015405015405015552015628
+E2021081980011062011062011062011062011175011175                                
    
+E2021081979010828010828010828010828010933010959010959010959010959010959011062011062
+E2021081978012845012845010854010854010667010694010697010697010697010697010798010827
+E2021081977013804013804013804013804013940013970013967013967013967013967012809012845
+E2021081976013476013476013476013476013604013634013632013632013632013632013765013804
+E2021081975013157013157013157013157013283013315013315013315013315013315013446013475
+E2021081974012848012848012848012848012971013002013002013002013002013002013126013159
+E2021081973012956012989012989012989012989013020013146013174013176013176013176012848
+E2021081972012588012617012619012619012619012654012777012805012805012805012805012833
+E2021081971012630012660012660012660012660012695012606012636012636012636012636012666
+E2021081970013700013734013736013736013736013800013936013969013969013969013969014001
+E2021081969013727013727013727013727013860013342013471013501013502013502013502013572
+E2021081968013128013128013128013128013257013416013414013414013414013414013544013728
+E2021081967012586012586012586012586012706012846012845012845012845012845012970013128
+E2021081966012813012813012194012194012202012328012327012327012327012327012446012585
+E2021081965023411021474021579021577021577018597018597018308018403018403018403012812
+E2021081964022455022671022779022777022777022929022929023152023261023261023261023411
+E2021081963021522021731021832021829021829021995021995022211022317022317022317022455
+E2021081962020675020875021027021024021024021079021079021281021432021433021433021522
+E2021081961019718019907020137020136020136020195020195020388020617020615020615020675
+E2021081960018850019017019236019236019236019269019269019452019678019679019679019718
+E2021081959019153019153019153019153019153018788018788018601018810018810018810018850
+E2021081958018312018312018312018312018312018453018672018671018671018671018671018934
+E2021081957019956019990019990019990019990020272020508020507020507020507020507018097
+E2021081956018679018679018859019383019383019429019429019429019619019848019847019956
+E2021081955017753017753017926018157018157018205018205018205018382018629018629018679
+E2021081954016886016886017051017269017269017312017312017312017481017716017717017753
+E2021081953017814017814016338016541016541016581016581016581016633016843016844016886
+E2021081952017066017066017066017066017338017378017378017378017546017769017766017814
+E2021081951016260016260016260016260016416016661016660016660016660016660016823017065
+E2021081950014706014706014706014706014848015053015053015053015053015053015199015426
+E2021081949013669013669013669013669013802014383014383014383014383014383014523014706
+E2021081948013141013141013141013141013109013323013323013323013323013323013451013669
+E2021081947012338012338012338012338012457012657012657012657012657012657012934013141
+E2021081946011728011728011728011728011841012025012025012025012025012025012142012338
+E2021081945011047011047011047011047011154011333011333011333011333011333011443011728
+E2021081944010509010509010509010509010611010770010770010770010770010770010875011047
+E2021081943009995009995009995009995010091010248010248010248010248010248010348010509
+E2021081942009435009435009435009435009600009745009745009745009745009745009840009995
+E2021081941                        
009059009196009196009196009196009196009286009435
+S2021081970013671013671013671013671013804013870013870013870013870013870        
    
+S2021081969013570013570013570013570013437013500013500013500013500013500013607013670
+S2021081968015629015629015629015629014337014568014568014568013618013618013497013570
+S2021081967                        
015333015404015405015405015405015405015552015628
+E2021091980011062011062011062011062011175011175                                
    
+E2021091979010828010828010828010828010933010959010959010959010959010959011062011062
+E2021091978012845012845010854010854010667010694010697010697010697010697010798010827
+E2021091977013804013804013804013804013940013970013967013967013967013967012809012845
+E2021091976013476013476013476013476013604013634013632013632013632013632013765013804
+E2021091975013157013157013157013157013283013315013315013315013315013315013446013475
+E2021091974012848012848012848012848012971013002013002013002013002013002013126013159
+E2021091973012956012989012989012989012989013020013146013174013176013176013176012848
+E2021091972012588012617012619012619012619012654012777012805012805012805012805012833
+E2021091971012630012660012660012660012660012695012606012636012636012636012636012666
+E2021091970013700013734013736013736013736013800013936013969013969013969013969014001
+E2021091969013727013727013727013727013860013342013471013501013502013502013502013572
+E2021091968013128013128013128013128013257013416013414013414013414013414013544013728
+E2021091967012586012586012586012586012706012846012845012845012845012845012970013128
+E2021091966012813012813012194012194012202012328012327012327012327012327012446012585
+E2021091965023411021474021579021577021577018597018597018308018403018403018403012812
+E2021091964022455022671022779022777022777022929022929023152023261023261023261023411
+E2021091963021522021731021832021829021829021995021995022211022317022317022317022455
+E2021091962020675020875021027021024021024021079021079021281021432021433021433021522
+E2021091961019718019907020137020136020136020195020195020388020617020615020615020675
+E2021091960018850019017019236019236019236019269019269019452019678019679019679019718
+E2021091959019153019153019153019153019153018788018788018601018810018810018810018850
+E2021091958018312018312018312018312018312018453018672018671018671018671018671018934
+E2021091957019956019990019990019990019990020272020508020507020507020507020507018097
+E2021091956018679018679018859019383019383019429019429019429019619019848019847019956
+E2021091955017753017753017926018157018157018205018205018205018382018629018629018679
+E2021091954016886016886017051017269017269017312017312017312017481017716017717017753
+E2021091953017814017814016338016541016541016581016581016581016633016843016844016886
+E2021091952017066017066017066017066017338017378017378017378017546017769017766017814
+E2021091951016260016260016260016260016416016661016660016660016660016660016823017065
+E2021091950014706014706014706014706014848015053015053015053015053015053015199015426
+E2021091949013669013669013669013669013802014383014383014383014383014383014523014706
+E2021091948013141013141013141013141013109013323013323013323013323013323013451013669
+E2021091947012338012338012338012338012457012657012657012657012657012657012934013141
+E2021091946011728011728011728011728011841012025012025012025012025012025012142012338
+E2021091945011047011047011047011047011154011333011333011333011333011333011443011728
+E2021091944010509010509010509010509010611010770010770010770010770010770010875011047
+E2021091943009995009995009995009995010091010248010248010248010248010248010348010509
+E2021091942009435009435009435009435009600009745009745009745009745009745009840009995
+E2021091941                        
009059009196009196009196009196009196009286009435
+S2021091970013671013671013671013671013804013870013870013870013870013870        
    
+S2021091969013570013570013570013570013437013500013500013500013500013500013607013670
+S2021091968015629015629015629015629014337014568014568014568013618013618013497013570
+S2021091967                        
015333015404015405015405015405015405015552015628
+E2021101980011062011062011062011062011175011175                                
    
+E2021101979010828010828010828010828010933010959010959010959010959010959011062011062
+E2021101978012845012845010854010854010667010694010697010697010697010697010798010827
+E2021101977013804013804013804013804013940013970013967013967013967013967012809012845
+E2021101976013476013476013476013476013604013634013632013632013632013632013765013804
+E2021101975013157013157013157013157013283013315013315013315013315013315013446013475
+E2021101974012848012848012848012848012971013002013002013002013002013002013126013159
+E2021101973012956012989012989012989012989013020013146013174013176013176013176012848
+E2021101972012588012617012619012619012619012654012777012805012805012805012805012833
+E2021101971012630012660012660012660012660012695012606012636012636012636012636012666
+E2021101970013700013734013736013736013736013800013936013969013969013969013969014001
+E2021101969013727013727013727013727013860013342013471013501013502013502013502013572
+E2021101968013128013128013128013128013257013416013414013414013414013414013544013728
+E2021101967012586012586012586012586012706012846012845012845012845012845012970013128
+E2021101966012813012813012194012194012202012328012327012327012327012327012446012585
+E2021101965023411021474021579021577021577018597018597018308018403018403018403012812
+E2021101964022455022671022779022777022777022929022929023152023261023261023261023411
+E2021101963021522021731021832021829021829021995021995022211022317022317022317022455
+E2021101962020675020875021027021024021024021079021079021281021432021433021433021522
+E2021101961019718019907020137020136020136020195020195020388020617020615020615020675
+E2021101960018850019017019236019236019236019269019269019452019678019679019679019718
+E2021101959019153019153019153019153019153018788018788018601018810018810018810018850
+E2021101958018312018312018312018312018312018453018672018671018671018671018671018934
+E2021101957019956019990019990019990019990020272020508020507020507020507020507018097
+E2021101956018679018679018859019383019383019429019429019429019619019848019847019956
+E2021101955017753017753017926018157018157018205018205018205018382018629018629018679
+E2021101954016886016886017051017269017269017312017312017312017481017716017717017753
+E2021101953017814017814016338016541016541016581016581016581016633016843016844016886
+E2021101952017066017066017066017066017338017378017378017378017546017769017766017814
+E2021101951016260016260016260016260016416016661016660016660016660016660016823017065
+E2021101950014706014706014706014706014848015053015053015053015053015053015199015426
+E2021101949013669013669013669013669013802014383014383014383014383014383014523014706
+E2021101948013141013141013141013141013109013323013323013323013323013323013451013669
+E2021101947012338012338012338012338012457012657012657012657012657012657012934013141
+E2021101946011728011728011728011728011841012025012025012025012025012025012142012338
+E2021101945011047011047011047011047011154011333011333011333011333011333011443011728
+E2021101944010509010509010509010509010611010770010770010770010770010770010875011047
+E2021101943009995009995009995009995010091010248010248010248010248010248010348010509
+E2021101942009435009435009435009435009600009745009745009745009745009745009840009995
+E2021101941                        
009059009196009196009196009196009196009286009435
+S2021101970013671013671013671013671013804013870013870013870013870013870        
    
+S2021101969013570013570013570013570013437013500013500013500013500013500013607013670
+S2021101968015629015629015629015629014337014568014568014568013618013618013497013570
+S2021101967                        
015333015404015405015405015405015405015552015628
+E2021111980011062011062011062011062011175011175                                
    
+E2021111979010828010828010828010828010933010959010959010959010959010959011062011062
+E2021111978012845012845010854010854010667010694010697010697010697010697010798010827
+E2021111977013804013804013804013804013940013970013967013967013967013967012809012845
+E2021111976013476013476013476013476013604013634013632013632013632013632013765013804
+E2021111975013157013157013157013157013283013315013315013315013315013315013446013475
+E2021111974012848012848012848012848012971013002013002013002013002013002013126013159
+E2021111973012956012989012989012989012989013020013146013174013176013176013176012848
+E2021111972012588012617012619012619012619012654012777012805012805012805012805012833
+E2021111971012630012660012660012660012660012695012606012636012636012636012636012666
+E2021111970013700013734013736013736013736013800013936013969013969013969013969014001
+E2021111969013727013727013727013727013860013342013471013501013502013502013502013572
+E2021111968013128013128013128013128013257013416013414013414013414013414013544013728
+E2021111967012586012586012586012586012706012846012845012845012845012845012970013128
+E2021111966012813012813012194012194012202012328012327012327012327012327012446012585
+E2021111965023411021474021579021577021577018597018597018308018403018403018403012812
+E2021111964022455022671022779022777022777022929022929023152023261023261023261023411
+E2021111963021522021731021832021829021829021995021995022211022317022317022317022455
+E2021111962020675020875021027021024021024021079021079021281021432021433021433021522
+E2021111961019718019907020137020136020136020195020195020388020617020615020615020675
+E2021111960018850019017019236019236019236019269019269019452019678019679019679019718
+E2021111959019153019153019153019153019153018788018788018601018810018810018810018850
+E2021111958018312018312018312018312018312018453018672018671018671018671018671018934
+E2021111957019956019990019990019990019990020272020508020507020507020507020507018097
+E2021111956018679018679018859019383019383019429019429019429019619019848019847019956
+E2021111955017753017753017926018157018157018205018205018205018382018629018629018679
+E2021111954016886016886017051017269017269017312017312017312017481017716017717017753
+E2021111953017814017814016338016541016541016581016581016581016633016843016844016886
+E2021111952017066017066017066017066017338017378017378017378017546017769017766017814
+E2021111951016260016260016260016260016416016661016660016660016660016660016823017065
+E2021111950014706014706014706014706014848015053015053015053015053015053015199015426
+E2021111949013669013669013669013669013802014383014383014383014383014383014523014706
+E2021111948013141013141013141013141013109013323013323013323013323013323013451013669
+E2021111947012338012338012338012338012457012657012657012657012657012657012934013141
+E2021111946011728011728011728011728011841012025012025012025012025012025012142012338
+E2021111945011047011047011047011047011154011333011333011333011333011333011443011728
+E2021111944010509010509010509010509010611010770010770010770010770010770010875011047
+E2021111943009995009995009995009995010091010248010248010248010248010248010348010509
+E2021111942009435009435009435009435009600009745009745009745009745009745009840009995
+E2021111941                        
009059009196009196009196009196009196009286009435
+S2021111970013671013671013671013671013804013870013870013870013870013870        
    
+S2021111969013570013570013570013570013437013500013500013500013500013500013607013670
+S2021111968015629015629015629015629014337014568014568014568013618013618013497013570
+S2021111967                        
015333015404015405015405015405015405015552015628
+N2021062021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAY                                
    
+N2021062020001252001252001252001252001251001251NO PAYNO PAYNO PAYNO PAYNO 
PAYNO PAY
+N2021062019001254001254001254001254001253001253001253001253001253001253001252001252
+N2021062018001256001256001256001256001255001255001255001255001255001255001254001254
+N2021062017001258001258001258001258001257001257001257001257001257001257001256001256
+N2021062016001261001260001260001260001260001260001259001259001259001259001258001258
+N2021062015001263001262001262001262001274001274001274001273001273001273001261001261
+N2021062014001265001264001264001264001293001292001292001291001291001290001263001263
+N2021062013001267001267001267001266001266001266001266001266001266001265001265001265
+N2021062012001325001325001324001323001323001322001321001321001320001319001267001267
+N2021062011001333001333001332001331001394001393001391001390001389001388001327001326
+N2021062010001434001433001431001430001460001458001456001455001453001451001335001334
+N2021062009001466001464001463001461001362001361001360001359001358001358001437001436
+N2021062008001864001859001855001850001500001498001497001495001493001491001469001467
+N2021062007002091002085002078002072002009002003001998001992001987001981001874001869
+N2021062006002039002033002028002023002173002166002160002153002147002140002103002097
+N2021062005001748001748001747001747002182002176002170002164002158002151002049002044
+N2021062004001796001796001795001795001775001774001774001774001773001773001749001748
+N2021062003002537002536002536002535002519001824001823001823001822001822001798001797
+N2021062002002598002597002597002596002568002567002566002565002565002564002539002538
+N2021062001002648002647002647002646002627002626002625002624002624002623002600002599
+N2021062000002684002684002683002682002673002672002671002670002670002669002650002649
+N2021061999002719002719002718002717002702002701002700002700002699002698002686002685
+N2021061998002762002762002761002760002742002741002740002740002739002738002721002720
+N2021061997002776002776002776002776002783002782002781002781002780002779002764002763
+N2021061996002791002791002791002791002788002788002784002784002784002784002780002780
+N2021061995003559003548003536003524002807002807002803002803002803002803002795002795
+N2021061994003703003691003679003667003655003643003631003619003607003595003583003571
+N2021061993004789004789003828003816003803003790003777003765003752003740003728003715
+N2021061992004983004983004983004983004983004983004885004885004885004885004885004885
+N2021061991005184005184005184005184005184005184005082005082005082005082005082005082
+N2021061990005184005184005184005184005184005184005184005184005184005184005184005184
+N2021061989005184005184005184005184005184005184005184005184005184005184005184005184
+N2021061988005184005184005184005184005184005184005184005184005184005184005184005184
+N2021061987005184005184005184005184005184005184005184005184005184005184005184005184
+N2021061986005766005766005766005766005766005766005766005766005766005766005184005184
+N2021061985005766005766005766005766005766005766005766005766005766005766005766005766
+N2021061984005766005766005766005766005766005766005766005766005766005766005766005766
+N2021061983007008007008005766005766005766005766005766005766005766005766005766005766
+N2021061982007345007345007345007345007345007345007345007345007345007345007008007008
+N2021061981007672007672007672007672007345007345007345007345007345007345007345007345
+N2021061980008287008287008287008287008370008370008370008370008370008370007672007672
+N2021072021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAY                          
    
+N2021072020001252001252001252001252001252001251001251NO PAYNO PAYNO PAYNO 
PAYNO PAY
+N2021072019001254001254001254001254001254001253001253001253001253001253001253001252
+N2021072018001256001256001256001256001256001255001255001255001255001255001255001254
+N2021072017001258001258001258001258001258001257001257001257001257001257001257001256
+N2021072016001261001261001260001260001260001260001260001259001259001259001259001258
+N2021072015001263001263001262001262001275001274001274001274001273001273001261001261
+N2021072014001265001265001264001264001293001293001292001292001291001291001263001263
+N2021072013001267001267001267001267001266001266001266001266001266001266001265001265
+N2021072012001326001325001325001324001323001323001322001321001321001320001267001267
+N2021072011001334001333001333001332001396001394001393001391001390001389001327001327
+N2021072010001436001434001433001431001461001460001458001456001455001453001335001335
+N2021072009001467001466001464001463001363001362001361001360001359001358001439001437
+N2021072008001869001864001859001855001501001500001498001497001495001493001470001469
+N2021072007002097002091002085002078002014002009002003001998001992001987001878001874
+N2021072006002044002039002033002028002179002173002166002160002153002147002110002103
+N2021072005001748001748001748001747002189002182002176002170002164002158002055002049
+N2021072004001797001796001796001795001776001775001774001774001774001773001750001749
+N2021072003002538002537002536002536002520001825001824001823001823001822001799001798
+N2021072002002599002598002597002597002569002568002567002566002565002565002540002539
+N2021072001002649002648002647002647002628002627002626002625002624002624002601002600
+N2021072000002685002684002684002683002674002673002672002671002670002670002651002650
+N2021071999002720002719002719002718002703002702002701002700002700002699002687002686
+N2021071998002763002762002762002761002743002742002741002740002740002739002722002721
+N2021071997002780002776002776002776002784002783002782002781002781002780002765002764
+N2021071996002795002791002791002791002788002788002788002784002784002784002780002780
+N2021071995003571003559003548003536002807002807002807002803002803002803002795002795
+N2021071994003715003703003691003679003667003655003643003631003619003607003595003583
+N2021071993004885004789003841003828003816003803003790003777003765003752003740003728
+N2021071992005082004983004983004983004983004983004983004885004885004885004885004885
+N2021071991005184005184005184005184005184005184005184005082005082005082005082005082
+N2021071990005184005184005184005184005184005184005184005184005184005184005184005184
+N2021071989005184005184005184005184005184005184005184005184005184005184005184005184
+N2021071988005184005184005184005184005184005184005184005184005184005184005184005184
+N2021071987005184005184005184005184005184005184005184005184005184005184005184005184
+N2021071986005766005766005766005766005766005766005766005766005766005766005184005184
+N2021071985005766005766005766005766005766005766005766005766005766005766005766005766
+N2021071984005766005766005766005766005766005766005766005766005766005766005766005766
+N2021071983007008007008005766005766005766005766005766005766005766005766005766005766
+N2021071982007345007345007345007345007345007345007345007345007345007345007008007008
+N2021071981007672007672007672007672007345007345007345007345007345007345007345007345
+N2021071980008287008287008287008287008370008370008370008370008370008370007672007672
+N2021082021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAY                    
    
+N2021082020001252001252001252001252001252001252001251001251NO PAYNO PAYNO 
PAYNO PAY
+N2021082019001254001254001254001254001254001254001253001253001253001253001253001253
+N2021082018001256001256001256001256001256001256001255001255001255001255001255001255
+N2021082017001258001258001258001258001258001258001257001257001257001257001257001257
+N2021082016001261001261001261001260001260001260001260001260001259001259001259001259
+N2021082015001263001263001263001262001275001275001274001274001274001273001261001261
+N2021082014001265001265001265001264001294001293001293001292001292001291001263001263
+N2021082013001267001267001267001267001267001266001266001266001266001266001265001265
+N2021082012001327001326001325001325001324001323001323001322001321001321001268001267
+N2021082011001335001334001333001333001397001396001394001393001391001390001328001327
+N2021082010001437001436001434001433001463001461001460001458001456001455001336001335
+N2021082009001469001467001466001464001363001363001362001361001360001359001440001439
+N2021082008001874001869001864001859001503001501001500001498001497001495001472001470
+N2021082007002103002097002091002085002020002014002009002003001998001992001883001878
+N2021082006002049002044002039002033002186002179002173002166002160002153002116002110
+N2021082005001749001748001748001748002195002189002182002176002170002164002060002055
+N2021082004001798001797001796001796001776001776001775001774001774001774001750001750
+N2021082003002539002538002537002536002521001826001825001824001823001823001799001799
+N2021082002002600002599002598002597002570002569002568002567002566002565002541002540
+N2021082001002650002649002648002647002629002628002627002626002625002624002602002601
+N2021082000002686002685002684002684002675002674002673002672002671002670002652002651
+N2021081999002721002720002719002719002705002703002702002701002700002700002688002687
+N2021081998002764002763002762002762002745002743002742002741002740002740002724002722
+N2021081997002780002780002776002776002786002784002783002782002781002781002767002765
+N2021081996002795002795002791002791002788002788002788002788002784002784002780002780
+N2021081995003583003571003559003548002807002807002807002807002803002803002795002795
+N2021081994003728003715003703003691003679003667003655003643003631003619003607003595
+N2021081993004885004885003854003841003828003816003803003790003777003765003752003740
+N2021081992005082005082004983004983004983004983004983004983004885004885004885004885
+N2021081991005184005184005184005184005184005184005184005184005082005082005082005082
+N2021081990005184005184005184005184005184005184005184005184005184005184005184005184
+N2021081989005184005184005184005184005184005184005184005184005184005184005184005184
+N2021081988005184005184005184005184005184005184005184005184005184005184005184005184
+N2021081987005184005184005184005184005184005184005184005184005184005184005184005184
+N2021081986005766005766005766005766005766005766005766005766005766005766005184005184
+N2021081985005766005766005766005766005766005766005766005766005766005766005766005766
+N2021081984005766005766005766005766005766005766005766005766005766005766005766005766
+N2021081983007008007008005766005766005766005766005766005766005766005766005766005766
+N2021081982007345007345007345007345007345007345007345007345007345007345007008007008
+N2021081981007672007672007672007672007345007345007345007345007345007345007345007345
+N2021081980008287008287008287008287008370008370008370008370008370008370007672007672
+N2021092021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAY              
    
+N2021092020001253001252001252001252001252001252001252001251001251NO PAYNO 
PAYNO PAY
+N2021092019001255001254001254001254001254001254001254001253001253001253001253001253
+N2021092018001257001256001256001256001256001256001256001255001255001255001255001255
+N2021092017001259001258001258001258001258001258001258001257001257001257001257001257
+N2021092016001261001261001261001261001260001260001260001260001260001259001259001259
+N2021092015001263001263001263001263001275001275001275001274001274001274001261001261
+N2021092014001265001265001265001265001294001294001293001293001292001292001263001263
+N2021092013001267001267001267001267001267001267001266001266001266001266001265001265
+N2021092012001327001327001326001325001325001324001323001323001322001321001268001268
+N2021092011001335001335001334001333001398001397001396001394001393001391001329001328
+N2021092010001439001437001436001434001465001463001461001460001458001456001337001336
+N2021092009001470001469001467001466001364001363001363001362001361001360001442001440
+N2021092008001878001874001869001864001505001503001501001500001498001497001473001472
+N2021092007002110002103002097002091002026002020002014002009002003001998001888001883
+N2021092006002055002049002044002039002193002186002179002173002166002160002122002116
+N2021092005001750001749001748001748002201002195002189002182002176002170002066002060
+N2021092004001799001798001797001796001777001776001776001775001774001774001751001750
+N2021092003002540002539002538002537002522001826001826001825001824001823001800001799
+N2021092002002601002600002599002598002571002570002569002568002567002566002542002541
+N2021092001002651002650002649002648002631002629002628002627002626002625002604002602
+N2021092000002687002686002685002684002677002675002674002673002672002671002654002652
+N2021091999002722002721002720002719002706002705002703002702002701002700002690002688
+N2021091998002765002764002763002762002746002745002743002742002741002740002725002724
+N2021091997002780002780002780002776002787002786002784002783002782002781002768002767
+N2021091996002795002795002795002791002788002788002788002788002788002784002780002780
+N2021091995003595003583003571003559002807002807002807002807002807002803002795002795
+N2021091994003740003728003715003703003691003679003667003655003643003631003619003607
+N2021091993004885004885003866003854003841003828003816003803003790003777003765003752
+N2021091992005082005082005082004983004983004983004983004983004983004885004885004885
+N2021091991005184005184005184005184005184005184005184005184005184005082005082005082
+N2021091990005184005184005184005184005184005184005184005184005184005184005184005184
+N2021091989005184005184005184005184005184005184005184005184005184005184005184005184
+N2021091988005184005184005184005184005184005184005184005184005184005184005184005184
+N2021091987005184005184005184005184005184005184005184005184005184005184005184005184
+N2021091986005766005766005766005766005766005766005766005766005766005766005184005184
+N2021091985005766005766005766005766005766005766005766005766005766005766005766005766
+N2021091984005766005766005766005766005766005766005766005766005766005766005766005766
+N2021091983007008007008005766005766005766005766005766005766005766005766005766005766
+N2021091982007345007345007345007345007345007345007345007345007345007345007008007008
+N2021091981007672007672007672007672007345007345007345007345007345007345007345007345
+N2021091980008287008287008287008287008370008370008370008370008370008370007672007672
+N2021102021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAY        
    
+N2021102020001253001253001252001252001252001252001252001252001251001251NO 
PAYNO PAY
+N2021102019001255001255001254001254001254001254001254001254001253001253001253001253
+N2021102018001257001257001256001256001256001256001256001256001255001255001255001255
+N2021102017001259001259001258001258001258001258001258001258001257001257001257001257
+N2021102016001261001261001261001261001261001260001260001260001260001260001259001259
+N2021102015001263001263001263001263001276001275001275001275001274001274001262001261
+N2021102014001265001265001265001265001295001294001294001293001293001292001264001263
+N2021102013001268001267001267001267001267001267001267001266001266001266001266001265
+N2021102012001328001327001327001326001325001325001324001323001323001322001268001268
+N2021102011001336001335001335001334001399001398001397001396001394001393001329001329
+N2021102010001440001439001437001436001467001465001463001461001460001458001337001337
+N2021102009001472001470001469001467001365001364001363001363001362001361001443001442
+N2021102008001883001878001874001869001507001505001503001501001500001498001475001473
+N2021102007002116002110002103002097002031002026002020002014002009002003001892001888
+N2021102006002060002055002049002044002199002193002186002179002173002166002128002122
+N2021102005001750001750001749001748002208002201002195002189002182002176002071002066
+N2021102004001799001799001798001797001778001777001776001776001775001774001752001751
+N2021102003002541002540002539002538002523001827001826001826001825001824001801001800
+N2021102002002602002601002600002599002573002571002570002569002568002567002543002542
+N2021102001002652002651002650002649002632002631002629002628002627002626002605002604
+N2021102000002688002687002686002685002678002677002675002674002673002672002655002654
+N2021101999002724002722002721002720002707002706002705002703002702002701002691002690
+N2021101998002767002765002764002763002747002746002745002743002742002741002726002725
+N2021101997002780002780002780002780002788002787002786002784002783002782002769002768
+N2021101996002795002795002795002795002788002788002788002788002788002788002780002780
+N2021101995003607003595003583003571002807002807002807002807002807002807002795002795
+N2021101994003752003740003728003715003703003691003679003667003655003643003631003619
+N2021101993004885004885003879003866003854003841003828003816003803003790003777003765
+N2021101992005082005082005082005082004983004983004983004983004983004983004885004885
+N2021101991005184005184005184005184005184005184005184005184005184005184005082005082
+N2021101990005184005184005184005184005184005184005184005184005184005184005184005184
+N2021101989005184005184005184005184005184005184005184005184005184005184005184005184
+N2021101988005184005184005184005184005184005184005184005184005184005184005184005184
+N2021101987005184005184005184005184005184005184005184005184005184005184005184005184
+N2021101986005766005766005766005766005766005766005766005766005766005766005184005184
+N2021101985005766005766005766005766005766005766005766005766005766005766005766005766
+N2021101984005766005766005766005766005766005766005766005766005766005766005766005766
+N2021101983007008007008005766005766005766005766005766005766005766005766005766005766
+N2021101982007345007345007345007345007345007345007345007345007345007345007008007008
+N2021101981007672007672007672007672007345007345007345007345007345007345007345007345
+N2021101980008287008287008287008287008370008370008370008370008370008370007672007672
+N2021112021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAY  
    
+N2021112020001253001253001253001252001252001252001252001252001252001251001251NO
 PAY
+N2021112019001255001255001255001254001254001254001254001254001254001253001253001253
+N2021112018001257001257001257001256001256001256001256001256001256001255001255001255
+N2021112017001259001259001259001258001258001258001258001258001258001257001257001257
+N2021112016001261001261001261001261001261001261001260001260001260001260001260001259
+N2021112015001263001263001263001263001276001276001275001275001275001274001262001262
+N2021112014001265001265001265001265001295001295001294001294001293001293001264001264
+N2021112013001268001268001267001267001267001267001267001267001266001266001266001266
+N2021112012001329001328001327001327001326001325001325001324001323001323001268001268
+N2021112011001337001336001335001335001401001399001398001397001396001394001330001329
+N2021112010001442001440001439001437001468001467001465001463001461001460001338001337
+N2021112009001473001472001470001469001366001365001364001363001363001362001445001443
+N2021112008001888001883001878001874001508001507001505001503001501001500001477001475
+N2021112007002122002116002110002103002037002031002026002020002014002009001897001892
+N2021112006002066002060002055002049002206002199002193002186002179002173002135002128
+N2021112005001751001750001750001749002214002208002201002195002189002182002077002071
+N2021112004001800001799001799001798001779001778001777001776001776001775001753001752
+N2021112003002542002541002540002539002525001828001827001826001826001825001802001801
+N2021112002002604002602002601002600002574002573002571002570002569002568002545002543
+N2021112001002654002652002651002650002633002632002631002629002628002627002606002605
+N2021112000002690002688002687002686002679002678002677002675002674002673002656002655
+N2021111999002725002724002722002721002708002707002706002705002703002702002692002691
+N2021111998002768002767002765002764002748002747002746002745002743002742002727002726
+N2021111997002780002780002780002780002789002788002787002786002784002783002770002769
+N2021111996002795002795002795002795002795002788002788002788002788002788002787002780
+N2021111995003619003607003595003583002814002807002807002807002807002807002802002795
+N2021111994003765003752003740003728003715003703003691003679003667003655003643003631
+N2021111993004885004885003892003879003866003854003841003828003816003803003790003777
+N2021111992005082005082005082005082005082004983004983004983004983004983004983004885
+N2021111991005184005184005184005184005184005184005184005184005184005184005184005082
+N2021111990005184005184005184005184005184005184005184005184005184005184005184005184
+N2021111989005184005184005184005184005184005184005184005184005184005184005184005184
+N2021111988005184005184005184005184005184005184005184005184005184005184005184005184
+N2021111987005184005184005184005184005184005184005184005184005184005184005184005184
+N2021111986005766005766005766005766005766005766005766005766005766005766005184005184
+N2021111985005766005766005766005766005766005766005766005766005766005766005766005766
+N2021111984005766005766005766005766005766005766005766005766005766005766005766005766
+N2021111983007008007008005766005766005766005766005766005766005766005766005766005766
+N2021111982007345007345007345007345007345007345007345007345007345007345007008007008
+N2021111981007672007672007672007672007345007345007345007345007345007345007345007345
+N2021111980008287008287008287008287008370008370008370008370008370008370007672007672
+I2021062021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAY                                
    
+I2021062020002552002548002544002541002527002524NO PAYNO PAYNO PAYNO PAYNO 
PAYNO PAY
+I2021062019002620002616002611002608002595002590002585002581002576002573002560002556
+I2021062018002662002658002654002652002652002648002644002639002635002632002630002625
+I2021062017002719002715002711002709002688002684002680002677002673002671002670002666
+I2021062016002766002762002758002754002756002748002732002728002724002721002726002722
+I2021062015002772002768002765002761002764002756002752002748002744002741002778002770
+I2021062014002853002849002844002840002828002820002816002812002807002803002784002776
+I2021062013002855002851002847002843002845002837002833002829002825002821002867002858
+I2021062012002932002928002924002920002900002892002888002884002880002876002867002859
+I2021062011003011003007003003002998003014003005003001002997002992002988002945002936
+I2021062010003180003175003170003164003113003103003098003093003088003084003024003015
+I2021062009003419003412003405003398003130003121003116003111003107003102003195003185
+I2021062008003807003798003789003780003248003239003234003230003225003221003437003425
+I2021062007004072004061004051004041003951003935003925003916003906003896003831003816
+I2021062006004027004018004009004000004142004125004114004104004093004083004099004082
+I2021062005004192004183004174004165004271004254004243004233004223004213004051004036
+I2021062004004379004369004359004349004295004279004269004260004250004241004218004202
+I2021062003004975004962004948004935004515004498004488004477004467004457004406004389
+I2021062002005528005511005494005477005451005426005409005392005376005360005010004989
+I2021062001007647007615007583007551006924006887006861006834006808006781005570005545
+I2021062000008200008165008131008097008336008287008251008215008179008144007723007679
+I2021061999008454008419008384008350008323008276008242008208008175008141008281008234
+I2021061998                                                
008750008713008536008488
+I2021072021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAY                          
    
+I2021072020002556002552002548002544002531002527002524NO PAYNO PAYNO PAYNO 
PAYNO PAY
+I2021072019002625002620002616002611002599002595002590002585002581002576002564002560
+I2021072018002666002662002658002654002657002652002648002644002639002635002635002630
+I2021072017002722002719002715002711002692002688002684002680002677002673002674002670
+I2021072016002770002766002762002758002765002756002748002732002728002724002730002726
+I2021072015002776002772002768002765002772002764002756002752002748002744002787002778
+I2021072014002858002853002849002844002837002828002820002816002812002807002792002784
+I2021072013002859002855002851002847002854002845002837002833002829002825002876002867
+I2021072012002936002932002928002924002909002900002892002888002884002880002876002867
+I2021072011003015003011003007003003003023003014003005003001002997002992002953002945
+I2021072010003185003180003175003170003122003113003103003098003093003088003033003024
+I2021072009003425003419003412003405003140003130003121003116003111003107003205003195
+I2021072008003816003807003798003789003258003248003239003234003230003225003449003437
+I2021072007004082004072004061004051003967003951003935003925003916003906003846003831
+I2021072006004036004027004018004009004159004142004125004114004104004093004115004099
+I2021072005004202004192004183004174004287004271004254004243004233004223004066004051
+I2021072004004389004379004369004359004311004295004279004269004260004250004234004218
+I2021072003004989004975004962004948004533004515004498004488004477004467004423004406
+I2021072002005545005528005511005494005476005451005426005409005392005376005032005010
+I2021072001007679007647007615007583006962006924006887006861006834006808005596005570
+I2021072000008234008200008165008131008385008336008287008251008215008179007768007723
+I2021071999008488008454008419008384008370008323008276008242008208008175008329008281
+I2021071998                                                
008787008750008585008536
+I2021082021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAY                    
    
+I2021082020002560002556002552002548002534002531002527002524NO PAYNO PAYNO 
PAYNO PAY
+I2021082019002630002625002620002616002604002599002595002590002585002581002568002564
+I2021082018002670002666002662002658002661002657002652002648002644002639002639002635
+I2021082017002726002722002719002715002695002692002688002684002680002677002678002674
+I2021082016002778002770002766002762002773002765002756002748002732002728002734002730
+I2021082015002784002776002772002768002780002772002764002756002752002748002795002787
+I2021082014002867002858002853002849002846002837002828002820002816002812002800002792
+I2021082013002867002859002855002851002862002854002845002837002833002829002885002876
+I2021082012002945002936002932002928002917002909002900002892002888002884002884002876
+I2021082011003024003015003011003007003031003023003014003005003001002997002962002953
+I2021082010003195003185003180003175003132003122003113003103003098003093003042003033
+I2021082009003437003425003419003412003149003140003130003121003116003111003216003205
+I2021082008003831003816003807003798003268003258003248003239003234003230003461003449
+I2021082007004099004082004072004061003983003967003951003935003925003916003861003846
+I2021082006004051004036004027004018004176004159004142004125004114004104004132004115
+I2021082005004218004202004192004183004304004287004271004254004243004233004082004066
+I2021082004004406004389004379004369004328004311004295004279004269004260004250004234
+I2021082003005010004989004975004962004550004533004515004498004488004477004440004423
+I2021082002005570005545005528005511005501005476005451005426005409005392005053005032
+I2021082001007723007679007647007615007000006962006924006887006861006834005622005596
+I2021082000008281008234008200008165008435008385008336008287008251008215007812007768
+I2021081999008536008488008454008419008418008370008323008276008242008208008377008329
+I2021081998                                                
008824008787008633008585
+I2021092021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAY              
    
+I2021092020002564002560002556002552002541002534002531002527002524NO PAYNO 
PAYNO PAY
+I2021092019002635002630002625002620002613002604002599002595002590002585002576002568
+I2021092018002674002670002666002662002669002661002657002652002648002644002648002639
+I2021092017002730002726002722002719002703002695002692002688002684002680002686002678
+I2021092016002787002778002770002766002781002773002765002756002748002732002742002734
+I2021092015002792002784002776002772002788002780002772002764002756002752002804002795
+I2021092014002876002867002858002853002854002846002837002828002820002816002809002800
+I2021092013002876002867002859002855002870002862002854002845002837002833002894002885
+I2021092012002953002945002936002932002926002917002909002900002892002888002893002884
+I2021092011003033003024003015003011003040003031003023003014003005003001002971002962
+I2021092010003205003195003185003180003142003132003122003113003103003098003050003042
+I2021092009003449003437003425003419003159003149003140003130003121003116003226003216
+I2021092008003846003831003816003807003277003268003258003248003239003234003473003461
+I2021092007004115004099004082004072003998003983003967003951003935003925003876003861
+I2021092006004066004051004036004027004193004176004159004142004125004114004149004132
+I2021092005004234004218004202004192004321004304004287004271004254004243004097004082
+I2021092004004423004406004389004379004344004328004311004295004279004269004266004250
+I2021092003005032005010004989004975004568004550004533004515004498004488004457004440
+I2021092002005596005570005545005528005526005501005476005451005426005409005075005053
+I2021092001007768007723007679007647007037007000006962006924006887006861005648005622
+I2021092000008329008281008234008200008485008435008385008336008287008251007857007812
+I2021091999008585008536008488008454008465008418008370008323008276008242008425008377
+I2021091998                                                
008861008824008682008633
+I2021102021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAY        
    
+I2021102020002568002564002560002556002549002541002534002531002527002524NO 
PAYNO PAY
+I2021102019002639002635002630002625002621002613002604002599002595002590002584002576
+I2021102018002678002674002670002666002678002669002661002657002652002648002657002648
+I2021102017002734002730002726002722002711002703002695002692002688002684002694002686
+I2021102016002795002787002778002770002790002781002773002765002756002748002750002742
+I2021102015002800002792002784002776002797002788002780002772002764002756002812002804
+I2021102014002885002876002867002858002863002854002846002837002828002820002817002809
+I2021102013002884002876002867002859002879002870002862002854002845002837002902002894
+I2021102012002962002953002945002936002935002926002917002909002900002892002901002893
+I2021102011003042003033003024003015003049003040003031003023003014003005002979002971
+I2021102010003216003205003195003185003151003142003132003122003113003103003059003050
+I2021102009003461003449003437003425003168003159003149003140003130003121003236003226
+I2021102008003861003846003831003816003287003277003268003258003248003239003486003473
+I2021102007004132004115004099004082004015003998003983003967003951003935003892003876
+I2021102006004082004066004051004036004210004193004176004159004142004125004166004149
+I2021102005004250004234004218004202004338004321004304004287004271004254004113004097
+I2021102004004440004423004406004389004360004344004328004311004295004279004282004266
+I2021102003005053005032005010004989004585004568004550004533004515004498004474004457
+I2021102002005622005596005570005545005552005526005501005476005451005426005096005075
+I2021102001007812007768007723007679007076007037007000006962006924006887005674005648
+I2021102000008377008329008281008234008535008485008435008385008336008287007902007857
+I2021101999008633008585008536008488008513008465008418008370008323008276008473008425
+I2021101998                                                
008912008861008731008682
+I2021112021NO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAYNO PAY  
    
+I2021112020002576002568002564002560002556002549002541002534002531002527002543NO
 PAY
+I2021112019002648002639002635002630002630002621002613002604002599002595002592002584
+I2021112018002686002678002674002670002686002678002669002661002657002652002666002657
+I2021112017002742002734002730002726002719002711002703002695002692002688002702002694
+I2021112016002804002795002787002778002798002790002781002773002765002756002782002750
+I2021112015002809002800002792002784002805002797002788002780002772002764002820002812
+I2021112014002894002885002876002867002871002863002854002846002837002828002825002817
+I2021112013002893002884002876002867002887002879002870002862002854002845002911002902
+I2021112012002971002962002953002945002943002935002926002917002909002900002910002901
+I2021112011003050003042003033003024003058003049003040003031003023003014002988002979
+I2021112010003226003216003205003195003161003151003142003132003122003113003068003059
+I2021112009003473003461003449003437003178003168003159003149003140003130003246003236
+I2021112008003876003861003846003831003296003287003277003268003258003248003498003486
+I2021112007004149004132004115004099004031004015003998003983003967003951003907003892
+I2021112006004097004082004066004051004227004210004193004176004159004142004183004166
+I2021112005004266004250004234004218004355004338004321004304004287004271004128004113
+I2021112004004457004440004423004406004377004360004344004328004311004295004298004282
+I2021112003005075005053005032005010004603004585004568004550004533004515004491004474
+I2021112002005648005622005596005570005577005552005526005501005476005451005118005096
+I2021112001007857007812007768007723007114007076007037007000006962006924005700005674
+I2021112000008425008377008329008281008585008535008485008435008385008336007948007902
+I2021111999008682008633008585008536008562008513008465008418008370008323008522008473
+I2021111998                                                
008963008912008781008731

Reply via email to