master
md 351 lines 19.9 KB
Rendered Raw
1 # Kubo changelog v0.21
2
3 - [v0.21.1](#v0211)
4 - [v0.21.0](#v0210)
5
6 ## v0.21.1
7
8 - Update go-libp2p:
9 - [v0.27.8](https://github.com/libp2p/go-libp2p/releases/tag/v0.27.8)
10 - [v0.27.9](https://github.com/libp2p/go-libp2p/releases/tag/v0.27.9)
11 - Update Boxo to v0.10.3 ([ipfs/boxo#412](https://github.com/ipfs/boxo/pull/412)).
12
13 ## v0.21.0
14
15 - [Overview](#overview)
16 - [🔦 Highlights](#-highlights)
17 - [Saving previously seen nodes for later bootstrapping](#saving-previously-seen-nodes-for-later-bootstrapping)
18 - [Gateway: `DeserializedResponses` config flag](#gateway-deserializedresponses-config-flag)
19 - [`client/rpc` migration of `go-ipfs-http-client`](#clientrpc-migration-of-go-ipfs-http-client)
20 - [Gateway: DAG-CBOR/-JSON previews and improved error pages](#gateway-dag-cbor-json-previews-and-improved-error-pages)
21 - [Gateway: subdomain redirects are now `text/html`](#gateway-subdomain-redirects-are-now-texthtml)
22 - [Gateway: support for partial CAR export parameters (IPIP-402)](#gateway-support-for-partial-car-export-parameters-ipip-402)
23 - [`ipfs dag stat` deduping statistics](#ipfs-dag-stat-deduping-statistics)
24 - [Accelerated DHT Client is no longer experimental](#accelerated-dht-client-is-no-longer-experimental)
25 - [📝 Changelog](#-changelog)
26 - [👨‍👩‍👧‍👦 Contributors](#-contributors)
27
28 ### Overview
29
30 ### 🔦 Highlights
31
32 #### Saving previously seen nodes for later bootstrapping
33
34 Kubo now stores a subset of connected peers as backup bootstrap nodes ([kubo#8856](https://github.com/ipfs/kubo/pull/8856)).
35 These nodes are used in addition to the explicitly defined bootstrappers in the
36 [`Bootstrap`](https://github.com/ipfs/kubo/blob/master/docs/config.md#bootstrap) configuration.
37
38 This enhancement improves the resiliency of the system, as it eliminates the
39 necessity of relying solely on the default bootstrappers operated by Protocol
40 Labs for joining the public IPFS swarm. Previously, this level of robustness
41 was only available in LAN contexts with [mDNS peer discovery](https://github.com/ipfs/kubo/blob/master/docs/config.md#discoverymdns)
42 enabled.
43
44 With this update, the same level of robustness is applied to peers that lack
45 mDNS peers and solely rely on the public DHT.
46
47 #### Gateway: `DeserializedResponses` config flag
48
49 This release introduces the
50 [`Gateway.DeserializedResponses`](https://github.com/ipfs/kubo/blob/master/docs/config.md#gatewaydeserializedresponses)
51 configuration flag.
52
53 With this flag, one can explicitly configure whether the gateway responds to
54 deserialized requests or not. By default, this flag is enabled.
55
56 Disabling deserialized responses allows the
57 gateway to operate
58 as a [Trustless Gateway](https://specs.ipfs.tech/http-gateways/trustless-gateway/)
59 limited to three [verifiable](https://docs.ipfs.tech/reference/http/gateway/#trustless-verifiable-retrieval)
60 response types:
61 [application/vnd.ipld.raw](https://www.iana.org/assignments/media-types/application/vnd.ipld.raw),
62 [application/vnd.ipld.car](https://www.iana.org/assignments/media-types/application/vnd.ipld.car),
63 and [application/vnd.ipfs.ipns-record](https://www.iana.org/assignments/media-types/application/vnd.ipfs.ipns-record).
64
65 With deserialized responses disabled, the Kubo gateway can serve as a block
66 backend for other software (like
67 [bifrost-gateway](https://github.com/ipfs/bifrost-gateway#readme),
68 [IPFS in Chromium](https://github.com/little-bear-labs/ipfs-chromium/blob/main/README.md)
69 etc) without the usual risks associated with hosting deserialized data behind
70 third-party CIDs.
71
72 #### `client/rpc` migration of `go-ipfs-http-client`
73
74 The [`go-ipfs-http-client`](https://github.com/ipfs/go-ipfs-http-client) RPC has
75 been migrated into [`kubo/client/rpc`](../../client/rpc).
76
77 With this change the two will be kept in sync, in some previous releases we
78 updated the CoreAPI with new Kubo features but forgot to port those to the
79 http-client, making it impossible to use them together with the same coreapi
80 version.
81
82 For smooth transition `v0.7.0` of `go-ipfs-http-client` provides updated stubs
83 for Kubo `v0.21`.
84
85 #### Gateway: DAG-CBOR/-JSON previews and improved error pages
86
87 In this release, we improved the HTML templates of our HTTP gateway:
88
89 1. You can now preview the contents of a DAG-CBOR and DAG-JSON document from your browser, as well as follow any IPLD Links ([CBOR Tag 42](https://github.com/ipld/cid-cbor/)) contained within them.
90 2. The HTML directory listings now contain [updated, higher-definition icons](https://user-images.githubusercontent.com/5447088/241224419-5385793a-d3bb-40aa-8cb0-0382b5bc56a0.png).
91 3. On gateway error, instead of a plain text error message, web browsers will now get a friendly HTML response with more details regarding the problem.
92
93 HTML responses are returned when request's `Accept` header includes `text/html`.
94
95 | DAG-CBOR Preview | Error Page |
96 | ---- | ---- |
97 | ![DAG-CBOR Preview](https://github.com/ipfs/boxo/assets/5447088/973f05d1-5731-4469-9da5-d1d776891899) | ![Error Page](https://github.com/ipfs/boxo/assets/5447088/14c453df-adbc-4634-b038-133121914550) |
98
99 #### Gateway: subdomain redirects are now `text/html`
100
101 HTTP 301 redirects [from path to subdomain](https://specs.ipfs.tech/http-gateways/subdomain-gateway/#migrating-from-path-to-subdomain-gateway)
102 no longer include the target data in the body.
103 The data is returned only once, with the final HTTP 200 returned from the
104 target subdomain.
105
106 The HTTP 301 body now includes human-readable `text/html` message
107 for clients that do not follow redirects by default:
108
109 ```console
110 $ curl "https://subdomain-gw.example.net/ipfs/${cid}/"
111 <a href="https://${cid}.ipfs.subdomain-gw.example.net/">Moved Permanently</a>.
112 ```
113
114 Rationale can be found in [kubo#9913](https://github.com/ipfs/kubo/pull/9913).
115
116 #### Gateway: support for partial CAR export parameters (IPIP-402)
117
118 The gateway now supports optional CAR export parameters
119 `dag-scope=block|entity|all` and `entity-bytes=from:to` as specified in
120 [IPIP-402](https://specs.ipfs.tech/ipips/ipip-0402/).
121
122 Batch block retrieval minimizes round trips, catering to the requirements of
123 light HTTP clients for directory enumeration, range requests, and content path
124 resolution.
125
126 #### `ipfs dag stat` deduping statistics
127
128 `ipfs dat stat` now accept multiple CIDs and will dump advanced statistics
129 on the number of shared blocks and size of each CID.
130
131 ```console
132 $ ipfs dag stat --progress=false QmfXuRxzyVy5H2LssLgtXrKCrNvDY8UBvMp2aoW8LS8AYA QmfZDyu2UFfUhL4VdHaw7Hofivmn5D4DdQj38Lwo86RsnB
133
134 CID Blocks Size
135 QmfXuRxzyVy5H2LssLgtXrKCrNvDY8UBvMp2aoW8LS8AYA 3 2151
136 QmfZDyu2UFfUhL4VdHaw7Hofivmn5D4DdQj38Lwo86RsnB 4 3223
137
138 Summary
139 Total Size: 3326
140 Unique Blocks: 5
141 Shared Size: 2048
142 Ratio: 1.615755
143 ```
144
145 `ipfs --enc=json dag stat`'s keys are a non breaking change, new keys have been added but old keys with previous semantics are still here.
146
147 #### Accelerated DHT Client is no longer experimental
148
149 The [accelerated DHT client](docs/config.md#routingaccelerateddhtclient) is now
150 the main recommended solution for users who are hosting lots of data.
151 By trading some upfront DHT caching and increased memory usage,
152 one gets provider throughput improvements up to 6 millions times bigger dataset.
153 See [the docs](docs/config.md#routingaccelerateddhtclient) for more info.
154
155 The `Experimental.AcceleratedDHTClient` flag moved to [`Routing.AcceleratedDHTClient`](/docs/config.md#routingaccelerateddhtclient).
156 A config migration has been added to handle this automatically.
157
158 A new tracker estimates the providing speed and warns users if they
159 should be using AcceleratedDHTClient because they are falling behind.
160
161 ### 📝 Changelog
162
163 <details><summary>Full Changelog</summary>
164
165 - github.com/ipfs/kubo:
166 - fix: correctly handle migration of configs
167 - fix(gateway): include CORS on subdomain redirects (#9994) ([ipfs/kubo#9994](https://github.com/ipfs/kubo/pull/9994))
168 - fix: docker repository initialization race condition
169 - chore: update version
170 - ([ipfs/kubo#9981](https://github.com/ipfs/kubo/pull/9981))
171 - ([ipfs/kubo#9960](https://github.com/ipfs/kubo/pull/9960))
172 - ([ipfs/kubo#9936](https://github.com/ipfs/kubo/pull/9936))
173 - github.com/ipfs/boxo (v0.8.1 -> v0.10.2-0.20230629143123-2d3edc552442):
174 - chore: version 0.10.2
175 - fix(gateway): include CORS on subdomain redirects (#395) ([ipfs/boxo#395](https://github.com/ipfs/boxo/pull/395))
176 - fix(gateway): ensure 'X-Ipfs-Root' header is valid (#337) ([ipfs/boxo#337](https://github.com/ipfs/boxo/pull/337))
177 - docs: prepare changelog for next release [ci skip]
178 - chore: version 0.10.1 (#359) ([ipfs/boxo#359](https://github.com/ipfs/boxo/pull/359))
179 - fix(gateway): allow CAR trustless requests with path
180 - blockstore: replace go.uber.org/atomic with sync/atomic
181 - fix(gateway): remove handleUnsupportedHeaders after go-ipfs 0.13 (#350) ([ipfs/boxo#350](https://github.com/ipfs/boxo/pull/350))
182 - docs: update RELEASE.md based on 0.9 release (#343) ([ipfs/boxo#343](https://github.com/ipfs/boxo/pull/343))
183 - chore: v0.10.0 (#345) ([ipfs/boxo#345](https://github.com/ipfs/boxo/pull/345))
184 - docs(changelog): car params from ipip-402
185 - docs(changelog): add gateway deserialized responses (#341) ([ipfs/boxo#341](https://github.com/ipfs/boxo/pull/341))
186 - feat(gateway): implement IPIP-402 extensions for gateway CAR requests (#303) ([ipfs/boxo#303](https://github.com/ipfs/boxo/pull/303))
187 - chore: release v0.9.0
188 - changelog: update for 0.8.1 and 0.9.0
189 - provider: second round of reprovider refactor
190 - feat(unixfs): change protobuf package name to unixfs.v1.pb to prevent collisions with go-unixfs. Also regenerate protobufs with latest gogo
191 - feat(ipld/merkledag): remove use of go-ipld-format global registry
192 - feat(ipld/merkledag): updated to use its own global go-ipld-legacy registry instead of a shared global registry
193 - chore: do not rely on deprecated logger
194 - changelog: add changelog for async pin listing (#336) ([ipfs/boxo#336](https://github.com/ipfs/boxo/pull/336))
195 - pinner: change the interface to have async pin listing
196 - provider: revert throughput callback and related refactor
197 - fix(gateway): question marks in url.Path when redirecting (#313) ([ipfs/boxo#313](https://github.com/ipfs/boxo/pull/313))
198 - fix(gateway)!: no duplicate payload during subdomain redirects (#326) ([ipfs/boxo#326](https://github.com/ipfs/boxo/pull/326))
199 - provider: add breaking changes to the changelog (#330) ([ipfs/boxo#330](https://github.com/ipfs/boxo/pull/330))
200 - relocated magic numbers, updated Reprovide Interval from 24h to 22h
201 - provider: refactor to only maintain one batched implementation and add throughput callback
202 - feat(gateway): HTML preview for dag-cbor and dag-json (#315) ([ipfs/boxo#315](https://github.com/ipfs/boxo/pull/315))
203 - coreiface: add a testing.T argument to the provider
204 - feat(gateway): improved templates, user friendly errors (#298) ([ipfs/boxo#298](https://github.com/ipfs/boxo/pull/298))
205 - feat(gateway)!: deserialised responses turned off by default (#252) ([ipfs/boxo#252](https://github.com/ipfs/boxo/pull/252))
206 - fix(gw): missing return in error case ([ipfs/boxo#319](https://github.com/ipfs/boxo/pull/319))
207 - feat(routing/http): pass records limit on routing.FindProviders (#299) ([ipfs/boxo#299](https://github.com/ipfs/boxo/pull/299))
208 - bitswap/client: fix PeerResponseTrackerProbabilityOneKnownOneUnknownPeer
209 - feat(gw): add ipfs_http_gw_car_stream_fail_duration_seconds (#312) ([ipfs/boxo#312](https://github.com/ipfs/boxo/pull/312))
210 - feat(gw): add ipfs_http_gw_request_types metric (#311) ([ipfs/boxo#311](https://github.com/ipfs/boxo/pull/311))
211 - refactor: simplify ipns validation in example
212 - feat: add deprecator
213 - fix(routing/v1): add newline in NDJSON responses (#300) ([ipfs/boxo#300](https://github.com/ipfs/boxo/pull/300))
214 - feat(gateway): redirect ipns b58mh to cid (#236) ([ipfs/boxo#236](https://github.com/ipfs/boxo/pull/236))
215 - refactor: replace assert.Nil for assert.NoError
216 - tar: add test cases for validatePlatformPath
217 - feat(ipns): helper ValidateWithPeerID and UnmarshalIpnsEntry (#294) ([ipfs/boxo#294](https://github.com/ipfs/boxo/pull/294))
218 - Revert "feat: reusable ipns verify (#292)"
219 - feat: reusable ipns verify (#292) ([ipfs/boxo#292](https://github.com/ipfs/boxo/pull/292))
220 - refactor: remove badger, leveldb dependencies (#286) ([ipfs/boxo#286](https://github.com/ipfs/boxo/pull/286))
221 - feat(routing/http): add streaming support (#18) ([ipfs/boxo#18](https://github.com/ipfs/boxo/pull/18))
222 - feat(routing): allow-offline with routing put (#278) ([ipfs/boxo#278](https://github.com/ipfs/boxo/pull/278))
223 - refactor(gateway): switch to xxhash/v2 (#285) ([ipfs/boxo#285](https://github.com/ipfs/boxo/pull/285))
224 - github.com/ipfs/go-ipfs-util (v0.0.2 -> v0.0.3):
225 - docs: remove contribution section
226 - chore: bump version
227 - chore: deprecate types and readme
228 - sync: update CI config files (#12) ([ipfs/go-ipfs-util#12](https://github.com/ipfs/go-ipfs-util/pull/12))
229 - fix staticcheck ([ipfs/go-ipfs-util#9](https://github.com/ipfs/go-ipfs-util/pull/9))
230 - github.com/ipfs/go-ipld-format (v0.4.0 -> v0.5.0):
231 - chore: release version v0.5.0
232 - feat: remove block decoding global registry
233 - sync: update CI config files (#75) ([ipfs/go-ipld-format#75](https://github.com/ipfs/go-ipld-format/pull/75))
234 - sync: update CI config files (#74) ([ipfs/go-ipld-format#74](https://github.com/ipfs/go-ipld-format/pull/74))
235 - github.com/ipfs/go-ipld-legacy (v0.1.1 -> v0.2.1):
236 - v0.2.1 ([ipfs/go-ipld-legacy#15](https://github.com/ipfs/go-ipld-legacy/pull/15))
237 - Expose a constructor for making a decoder with an existing link system ([ipfs/go-ipld-legacy#14](https://github.com/ipfs/go-ipld-legacy/pull/14))
238 - Update to v0.2.0 ([ipfs/go-ipld-legacy#13](https://github.com/ipfs/go-ipld-legacy/pull/13))
239 - Remove global variable ([ipfs/go-ipld-legacy#12](https://github.com/ipfs/go-ipld-legacy/pull/12))
240 - sync: update CI config files (#8) ([ipfs/go-ipld-legacy#8](https://github.com/ipfs/go-ipld-legacy/pull/8))
241 - github.com/ipfs/go-unixfsnode (v1.6.0 -> v1.7.1):
242 - chore: bump to v1.7.1
243 - test: remove unnecessary t.Log
244 - test: check if reader reads only necessary blocks
245 - fix: do not read extra block if offset = at+childSize
246 - doc: added simple doc for testutil package
247 - bump v1.7.0
248 - feat(testutil): add test data generation utils (extracted from Lassie)
249 - github.com/libp2p/go-libp2p (v0.27.3 -> v0.27.7):
250 - Release v0.27.7 (#2374) ([libp2p/go-libp2p#2374](https://github.com/libp2p/go-libp2p/pull/2374))
251 - Release v0.27.6 (#2359) ([libp2p/go-libp2p#2359](https://github.com/libp2p/go-libp2p/pull/2359))
252 - Release v0.27.5 (#2324) ([libp2p/go-libp2p#2324](https://github.com/libp2p/go-libp2p/pull/2324))
253 - Bump version to v0.27.4
254 - identify: reject signed peer records on peer ID mismatch
255 - swarm: change maps with multiaddress keys to use strings (#2284) ([libp2p/go-libp2p#2284](https://github.com/libp2p/go-libp2p/pull/2284))
256 - identify: avoid spuriously triggering pushes (#2299) ([libp2p/go-libp2p#2299](https://github.com/libp2p/go-libp2p/pull/2299))
257 - github.com/libp2p/go-libp2p-kad-dht (v0.23.0 -> v0.24.2):
258 - chore: release v0.24.2
259 - chore: release v0.24.1
260 - fix: decrease tests noise, update kbucket and fix fixRTIUfNeeded
261 - refactor: remove goprocess
262 - fix: leaking go routines
263 - chore: release v0.24.0
264 - fix: don't add unresponsive DHT servers to the Routing Table (#820) ([libp2p/go-libp2p-kad-dht#820](https://github.com/libp2p/go-libp2p-kad-dht/pull/820))
265 - github.com/libp2p/go-libp2p-kbucket (v0.5.0 -> v0.6.3):
266 - fix: fix abba bug in UsefulNewPeer ([libp2p/go-libp2p-kbucket#122](https://github.com/libp2p/go-libp2p-kbucket/pull/122))
267 - chore: release v0.6.2 ([libp2p/go-libp2p-kbucket#121](https://github.com/libp2p/go-libp2p-kbucket/pull/121))
268 - Replacing UsefulPeer() with UsefulNewPeer() ([libp2p/go-libp2p-kbucket#120](https://github.com/libp2p/go-libp2p-kbucket/pull/120))
269 - chore: release 0.6.1 ([libp2p/go-libp2p-kbucket#119](https://github.com/libp2p/go-libp2p-kbucket/pull/119))
270 - UsefulPeer function ([libp2p/go-libp2p-kbucket#113](https://github.com/libp2p/go-libp2p-kbucket/pull/113))
271 - Fixed peer replacement with bucket size of 1. ([libp2p/go-libp2p-kbucket#117](https://github.com/libp2p/go-libp2p-kbucket/pull/117))
272 - GenRandomKey function ([libp2p/go-libp2p-kbucket#116](https://github.com/libp2p/go-libp2p-kbucket/pull/116))
273 - Removed maintainers from readme ([libp2p/go-libp2p-kbucket#115](https://github.com/libp2p/go-libp2p-kbucket/pull/115))
274 - Add maintainers ([libp2p/go-libp2p-kbucket#114](https://github.com/libp2p/go-libp2p-kbucket/pull/114))
275 - sync: update CI config files (#112) ([libp2p/go-libp2p-kbucket#112](https://github.com/libp2p/go-libp2p-kbucket/pull/112))
276 - github.com/libp2p/go-libp2p-routing-helpers (v0.6.2 -> v0.7.0):
277 - chore: release v0.7.0
278 - fix: iterate over keys manually in ProvideMany
279 - github.com/libp2p/go-reuseport (v0.2.0 -> v0.3.0):
280 - release v0.3.0 (#103) ([libp2p/go-reuseport#103](https://github.com/libp2p/go-reuseport/pull/103))
281 - fix error handling when setting socket options (#102) ([libp2p/go-reuseport#102](https://github.com/libp2p/go-reuseport/pull/102))
282 - minor README updates (#96) ([libp2p/go-reuseport#96](https://github.com/libp2p/go-reuseport/pull/96))
283 - sync: update CI config files (#94) ([libp2p/go-reuseport#94](https://github.com/libp2p/go-reuseport/pull/94))
284 - feat: add a DialTimeout function ([libp2p/go-reuseport#92](https://github.com/libp2p/go-reuseport/pull/92))
285 - github.com/multiformats/go-multicodec (v0.8.1 -> v0.9.0):
286 - Bump v0.9.0
287 - Bump v0.8.2
288 - chore: update submodules and go generate
289 - chore: update submodules and go generate
290 - chore: update submodules and go generate
291 - chore: update submodules and go generate
292 - chore: update submodules and go generate
293 - chore: update submodules and go generate
294 - github.com/multiformats/go-multihash (v0.2.1 -> v0.2.3):
295 - chore: release v0.2.3
296 - perf: outline logic in Decode to allow for stack allocations
297 - chore: release v0.2.2
298 - sha256: drop minio in favor of crypto/sha256 for go1.21 and above
299 - sync: update CI config files (#169) ([multiformats/go-multihash#169](https://github.com/multiformats/go-multihash/pull/169))
300 - add handler for hasher.Write returned error ([multiformats/go-multihash#167](https://github.com/multiformats/go-multihash/pull/167))
301 - sync: update CI config files (#165) ([multiformats/go-multihash#165](https://github.com/multiformats/go-multihash/pull/165))
302 - test: add benchmark for all hash functions Sum
303
304 </details>
305
306 ### 👨‍👩‍👧‍👦 Contributors
307
308 | Contributor | Commits | Lines ± | Files Changed |
309 |-------------|---------|---------|---------------|
310 | Jorropo | 47 | +4394/-4458 | 202 |
311 | Henrique Dias | 48 | +4344/-3962 | 205 |
312 | Łukasz Magiera | 68 | +3604/-886 | 172 |
313 | Adin Schmahmann | 8 | +1754/-1057 | 37 |
314 | galargh | 7 | +1355/-1302 | 15 |
315 | Gus Eggert | 7 | +1566/-655 | 33 |
316 | rvagg | 1 | +396/-389 | 3 |
317 | Michael Muré | 3 | +547/-202 | 14 |
318 | Guillaume Michel - guissou | 5 | +153/-494 | 17 |
319 | guillaumemichel | 15 | +446/-189 | 28 |
320 | Laurent Senta | 4 | +472/-152 | 29 |
321 | Rod Vagg | 6 | +554/-37 | 23 |
322 | Marcin Rataj | 11 | +330/-82 | 21 |
323 | Arthur Gavazza | 1 | +296/-87 | 7 |
324 | Lucas Molas | 1 | +323/-56 | 6 |
325 | Marco Munizaga | 5 | +227/-97 | 17 |
326 | Alex | 8 | +163/-116 | 10 |
327 | Steven Allen | 11 | +154/-114 | 14 |
328 | Marten Seemann | 6 | +214/-41 | 12 |
329 | web3-bot | 9 | +76/-75 | 28 |
330 | Hector Sanjuan | 2 | +5/-96 | 4 |
331 | Sukun | 1 | +83/-17 | 3 |
332 | Steve Loeppky | 2 | +100/-0 | 2 |
333 | Edgar Lee | 1 | +46/-46 | 12 |
334 | Ivan Schasny | 1 | +67/-5 | 4 |
335 | imthe1 | 1 | +65/-3 | 5 |
336 | godcong | 2 | +30/-31 | 5 |
337 | Will Scott | 4 | +36/-23 | 6 |
338 | Petar Maymounkov | 1 | +45/-9 | 1 |
339 | Ross Jones | 1 | +43/-1 | 2 |
340 | William Entriken | 1 | +38/-0 | 1 |
341 | João Pedro | 1 | +35/-0 | 1 |
342 | jhertz | 1 | +21/-0 | 2 |
343 | Nikhilesh Susarla | 1 | +21/-0 | 3 |
344 | Matt Joiner | 1 | +11/-9 | 2 |
345 | Vlad | 2 | +4/-2 | 2 |
346 | Russell Dempsey | 2 | +4/-2 | 2 |
347 | Will | 2 | +2/-2 | 2 |
348 | Piotr Galar | 1 | +1/-1 | 1 |
349 | Joel Gustafson | 1 | +1/-1 | 1 |
350 | Dennis Trautwein | 1 | +1/-1 | 1 |
351 | Bryan Stenson | 1 | +1/-1 | 1 |