diff --git a/NEWS.md b/NEWS.md index 0f9eb902..a3edcebd 100644 --- a/NEWS.md +++ b/NEWS.md @@ -19,6 +19,7 @@ Announcements: * Middlewarify client abort query checker. * Middlewarify query controller. * Set a hard limit on the size of the X-SQLAPI-Log header. +* Update cartodb-psql to 0.14.0 and use the timeout parameter for pg.query. ## 3.0.0 Released 2019-02-22 diff --git a/batch/query_runner.js b/batch/query_runner.js index 9b8e457c..1f876a2a 100644 --- a/batch/query_runner.js +++ b/batch/query_runner.js @@ -24,32 +24,7 @@ QueryRunner.prototype.run = function (job_id, sql, user, timeout, dbparams, call }; QueryRunner.prototype._run = function (dbparams, job_id, sql, timeout, callback) { - var self = this; var pg = new PSQL(dbparams); - - pg.query('SET statement_timeout=' + timeout, function (err) { - if(err) { - return callback(err); - } - - // mark query to allow to users cancel their queries - sql = '/* ' + job_id + ' */ ' + sql; - - self.logger.debug('Running query [timeout=%d] %s', timeout, sql); - pg.eventedQuery(sql, function (err, query) { - if (err) { - return callback(err); - } - - query.on('error', callback); - - query.on('end', function (result) { - // only if result is present then query is done sucessfully otherwise an error has happened - // and it was handled by error listener - if (result) { - callback(null, result); - } - }); - }); - }); + this.logger.debug('Running query [timeout=%d] %s', timeout, sql); + pg.query(`/* ${job_id} */ ${sql}`, callback, false, timeout); }; diff --git a/package-lock.json b/package-lock.json index 048082dd..a2311c29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -171,7 +171,7 @@ "bindings": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", - "integrity": "sha1-s0b27PapX1qBXFg5/HzbIlAvHtc=" + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" }, "bintrees": { "version": "1.0.1", @@ -231,7 +231,7 @@ "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -250,7 +250,7 @@ }, "buffer-writer": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz", "integrity": "sha1-Iqk2kB4wKa/NdUfrRIfOtpejvwg=" }, "builtin-modules": { @@ -302,9 +302,9 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "cartodb-psql": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.13.1.tgz", - "integrity": "sha512-1z3Dk9G8KQlNGurbcmGBvNj8DVCh1Keue9uzyyvB6hKOYzBHMxixAMG0D+8nSsA7oQmWUsx/xkZZ5ZxT9toEHA==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.14.0.tgz", + "integrity": "sha512-myLV2xo3q9oTT8m8M+c+UTD/ziDN7hrYtZ9yY00KvMnu2NsVeRQsTe8Yxq1GVS8vF9iYfcelwjVEGObPUdLtHw==", "requires": { "debug": "^3.1.0", "pg": "github:cartodb/node-postgres#6.4.2-cdb2", @@ -410,7 +410,7 @@ "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -1685,7 +1685,7 @@ "dependencies": { "async": { "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, @@ -1912,7 +1912,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } @@ -2183,7 +2183,7 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { "hosted-git-info": "^2.1.4", "is-builtin-module": "^1.0.0", @@ -2491,7 +2491,7 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "proxy-addr": { "version": "2.0.4", @@ -2847,7 +2847,7 @@ "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -3016,7 +3016,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "topojson": { @@ -3068,7 +3068,7 @@ "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.18" diff --git a/package.json b/package.json index 39345c3f..fdff2df5 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "basic-auth": "^2.0.0", "bintrees": "1.0.1", "bunyan": "1.8.1", - "cartodb-psql": "0.13.1", + "cartodb-psql": "0.14.0", "cartodb-query-tables": "^0.5.0", "cartodb-redis": "2.1.0", "debug": "^4.1.1", diff --git a/test/acceptance/batch/batch.test.js b/test/acceptance/batch/batch.test.js index 6b3d4bba..7f3dec72 100644 --- a/test/acceptance/batch/batch.test.js +++ b/test/acceptance/batch/batch.test.js @@ -40,7 +40,9 @@ describe('batch happy cases', function() { }); it('should perform job with select into', function (done) { - var payload = jobPayload('select * into batch_test_table from (select * from private_table) as job'); + var payload = jobPayload(` + DROP TABLE IF EXISTS batch_test_table; + SELECT * INTO batch_test_table FROM (SELECT * from private_table) AS job`); this.batchTestClient.createJob(payload, function(err, jobResult) { if (err) { return done(err); diff --git a/test/acceptance/batch/job.callback-template.test.js b/test/acceptance/batch/job.callback-template.test.js index 6baeeaf1..3369c964 100644 --- a/test/acceptance/batch/job.callback-template.test.js +++ b/test/acceptance/batch/job.callback-template.test.js @@ -43,7 +43,8 @@ describe('Batch API callback templates', function () { }; self.testClient.getResult( - 'BEGIN;CREATE TABLE test_batch_errors (job_id text, error_message text);COMMIT', function (err) { + 'BEGIN; DROP TABLE IF EXISTS test_batch_errors; ' + + 'CREATE TABLE test_batch_errors (job_id text, error_message text); COMMIT', function (err) { if (err) { return done(err); } @@ -78,7 +79,7 @@ describe('Batch API callback templates', function () { "query": { "query": [ { - query: "create table batch_jobs (job_id text)" + query: "drop table if exists batch_jobs; create table batch_jobs (job_id text)" }, { "query": "SELECT 1", @@ -90,7 +91,7 @@ describe('Batch API callback templates', function () { var expectedQuery = { query: [ { - query: "create table batch_jobs (job_id text)", + query: "drop table if exists batch_jobs; create table batch_jobs (job_id text)", status: 'done' }, { diff --git a/test/acceptance/copy-endpoints.js b/test/acceptance/copy-endpoints.js index 96e9677a..5e4ae92d 100644 --- a/test/acceptance/copy-endpoints.js +++ b/test/acceptance/copy-endpoints.js @@ -75,7 +75,7 @@ describe('copy-endpoints', function() { assert.ifError(err); const response = JSON.parse(res.body); assert.equal(!!response.time, true); - assert.strictEqual(response.total_rows, 6); + assert.strictEqual(response.total_rows, 2016); done(); }); }); @@ -157,10 +157,8 @@ describe('copy-endpoints', function() { method: 'GET' },{}, function(err, res) { assert.ifError(err); - assert.strictEqual( - res.body, - '11\tPaul\t10\n12\tPeter\t10\n13\tMatthew\t10\n14\t\\N\t10\n15\tJames\t10\n16\tJohn\t10\n' - ); + const regex = /11\tPaul\t10\n12\tPeter\t10\n13\tMatthew\t10\n14\t\\N\t10\n15\tJames\t10\n16\t*/g; + assert.ok(res.body.match(regex)); assert.equal(res.headers['content-disposition'], 'attachment; filename=%2Ftmp%2Foutput.dmp'); assert.equal(res.headers['content-type'], 'application/octet-stream'); @@ -196,11 +194,8 @@ describe('copy-endpoints', function() { method: 'POST' }, {}, function(err, res) { assert.ifError(err); - - assert.strictEqual( - res.body, - '11\tPaul\t10\n12\tPeter\t10\n13\tMatthew\t10\n14\t\\N\t10\n15\tJames\t10\n16\tJohn\t10\n' - ); + const regex = /11\tPaul\t10\n12\tPeter\t10\n13\tMatthew\t10\n14\t\\N\t10\n15\tJames\t10\n16\t*/g; + assert.ok(res.body.match(regex)); assert.equal(res.headers['content-disposition'], 'attachment; filename=%2Ftmp%2Foutput.dmp'); assert.equal(res.headers['content-type'], 'application/octet-stream'); @@ -275,9 +270,9 @@ describe('copy-endpoints', function() { describe('timeout', function() { - before('set a 10 ms timeout', function() { + before('set a 1 ms timeout', function() { this.previous_timeout = global.settings.copy_timeout; - global.settings.copy_timeout = 10; + global.settings.copy_timeout = 1; }); after('restore previous timeout', function() { @@ -519,7 +514,7 @@ describe('copy-endpoints', function() { }, function(err, res) { assert.ifError(err); const response = JSON.parse(res.body); - assert.strictEqual(response.total_rows, 6); + assert.strictEqual(response.total_rows, 2016); done(); }); }); diff --git a/test/acceptance/query-float-values.js b/test/acceptance/query-float-values.js index 5e0a632b..1b711eed 100644 --- a/test/acceptance/query-float-values.js +++ b/test/acceptance/query-float-values.js @@ -23,7 +23,7 @@ describe('special numeric (float) values', function() { var next = this; var opts = { url: URL + querystring.stringify({ - q: 'create table numbers_test(val float)' + q: 'drop table if exists numbers_test; create table numbers_test(val float)' }), headers: HEADERS, method: METHOD diff --git a/test/support/csv/copy_test_table.csv b/test/support/csv/copy_test_table.csv index 79d2f3e7..188be028 100644 --- a/test/support/csv/copy_test_table.csv +++ b/test/support/csv/copy_test_table.csv @@ -5,3 +5,2013 @@ id,name 14, 15,James 16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John +11,Paul +12,Peter +13,Matthew +14, +15,James +16,John \ No newline at end of file