Merge tag 'go1.19' into HEAD

Change-Id: I526b2588d7e42eea5e245f4ed5177d4eb0c81135
diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644
index 1a4a57b..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,1494 +0,0 @@
-# This is the official list of Go authors for copyright purposes.
-# This file is distinct from the CONTRIBUTORS files.
-# See the latter for an explanation.
-
-# Since Go 1.11, this file is not actively maintained.
-# To be included, send a change adding the individual or
-# company who owns a contribution's copyright.
-
-# Names should be added to this file as one of
-#     Organization's name
-#     Individual's name <submission email address>
-#     Individual's name <submission email address> <email2> <emailN>
-# See CONTRIBUTORS for the meaning of multiple email addresses.
-
-# Please keep the list sorted.
-
-10x Genomics, Inc.
-A Medium Corporation
-Aamir Khan <syst3m.w0rm@gmail.com>
-Aaron France <aaron.l.france@gmail.com>
-Aaron Stein <aaronstein12@gmail.com>
-Aaron Torres <tcboox@gmail.com>
-Aarti Parikh <aarti.parikh@gmail.com>
-Abe Haskins <abeisgreat@abeisgreat.com>
-Abhinav Gupta <abhinav.g90@gmail.com>
-Adam Eijdenberg <adam@continusec.com>
-Adam Harvey <aharvey@php.net>
-Adam Kisala <adam.kisala@gmail.com>
-Adam Medzinski <adam.medzinski@gmail.com>
-Adam Shannon <adamkshannon@gmail.com>
-Adam Thomason <athomason@gmail.com>
-Adam Woodbeck <adam@woodbeck.net>
-Aditya Mukerjee <dev@chimeracoder.net>
-Adrian Hesketh <adrianhesketh@hushmail.com>
-Adrian Nos <nos.adrian@gmail.com>
-Adrian O'Grady <elpollouk@gmail.com>
-Adrien Bustany <adrien-xx-google@bustany.org>
-Adrien Petel <peteladrien@gmail.com>
-Aécio Júnior <aeciodantasjunior@gmail.com>
-Aeneas Rekkas (arekkas) <aeneas@ory.am>
-Afanasev Stanislav <phpprogger@gmail.com>
-Agis Anastasopoulos <agis.anast@gmail.com>
-Agniva De Sarker <agnivade@yahoo.co.in>
-Ahmed W. Mones <oneofone@gmail.com>
-Ahmet Soormally <ahmet@mangomm.co.uk>
-Ahmy Yulrizka <yulrizka@gmail.com>
-Aiden Scandella <ai@uber.com>
-Ainar Garipov <gugl.zadolbal@gmail.com>
-Aishraj Dahal <aishraj@users.noreply.github.com>
-Akhil Indurti <aindurti@gmail.com>
-Akihiro Suda <suda.kyoto@gmail.com>
-Akshat Kumar <seed@mail.nanosouffle.net>
-Alan Shreve <alan@inconshreveable.com>
-Albert Nigmatzianov <albertnigma@gmail.com>
-Albert Strasheim <fullung@gmail.com>
-Albert Yu <yukinying@gmail.com>
-Alberto Bertogli <albertito@blitiri.com.ar>
-Alberto Donizetti <alb.donizetti@gmail.com>
-Alberto García Hierro <alberto@garciahierro.com> <alberto.garcia.hierro@gmail.com>
-Aleksandar Dezelin <dezelin@gmail.com>
-Aleksandr Lukinykh <a.lukinykh@xsolla.com>
-Alekseev Artem <a.artem060@gmail.com>
-Alessandro Arzilli <alessandro.arzilli@gmail.com>
-Alessandro Baffa <alessandro.baffa@gmail.com>
-Alex A Skinner <alex@lx.lc>
-Alex Brainman <alex.brainman@gmail.com>
-Alex Browne <stephenalexbrowne@gmail.com>
-Alex Carol <alex.carol.c@gmail.com>
-Alex Jin <toalexjin@gmail.com>
-Alex Myasoedov <msoedov@gmail.com>
-Alex Plugaru <alex@plugaru.org> <alexandru.plugaru@gmail.com>
-Alex Schroeder <alex@gnu.org>
-Alex Sergeyev <abc@alexsergeyev.com>
-Alexander Demakin <alexander.demakin@gmail.com>
-Alexander Döring <email@alexd.ch>
-Alexander F Rødseth <alexander.rodseth@appeartv.com>
-Alexander Guz <kalimatas@gmail.com>
-Alexander Kauer <alexander@affine.space>
-Alexander Kucherenko <alxkchr@gmail.com>
-Alexander Larsson <alexander.larsson@gmail.com>
-Alexander Menzhinsky <amenzhinsky@gmail.com>
-Alexander Morozov <lk4d4math@gmail.com>
-Alexander Neumann <alexander@bumpern.de>
-Alexander Orlov <alexander.orlov@loxal.net>
-Alexander Pantyukhin <apantykhin@gmail.com>
-Alexander Reece <awreece@gmail.com>
-Alexander Surma <surma@surmair.de>
-Alexander Zhavnerchik <alex.vizor@gmail.com>
-Alexander Zolotov <goldifit@gmail.com>
-Alexandre Cesaro <alexandre.cesaro@gmail.com>
-Alexandre Fiori <fiorix@gmail.com>
-Alexandre Normand <alexandre.normand@gmail.com>
-Alexandre Parentea <aubonbeurre@gmail.com>
-Alexandre Viau <alexandre@alexandreviau.net>
-Alexei Sholik <alcosholik@gmail.com>
-Alexey Borzenkov <snaury@gmail.com>
-Alexey Neganov <neganovalexey@gmail.com>
-Alexey Palazhchenko <alexey.palazhchenko@gmail.com>
-Alexey Semenyuk <alexsemenyuk88@gmail.com>
-Alexis Hildebrandt <surryhill@gmail.com>
-Ali Rizvi-Santiago <arizvisa@gmail.com>
-Aliaksandr Valialkin <valyala@gmail.com>
-Alif Rachmawadi <subosito@gmail.com>
-Allan Simon <allan.simon@supinfo.com>
-Alok Menghrajani <alok.menghrajani@gmail.com>
-Aman Gupta <aman@tmm1.net>
-Amazon.com, Inc
-Amir Mohammad Saied <amir@gluegadget.com>
-Amr Mohammed <merodiro@gmail.com>
-Amrut Joshi <amrut.joshi@gmail.com>
-Anand K. Mistry <anand@mistry.ninja>
-Anders Pearson <anders@columbia.edu>
-André Carvalho <asantostc@gmail.com>
-Andre Nathan <andrenth@gmail.com>
-Andreas Auernhammer <aead@mail.de>
-Andreas Litt <andreas.litt@gmail.com>
-Andrei Korzhevskii <a.korzhevskiy@gmail.com>
-Andrei Tudor Călin <mail@acln.ro>
-Andrei Vieru <euvieru@gmail.com>
-Andrew Austin <andrewaclt@gmail.com>
-Andrew Balholm <andybalholm@gmail.com>
-Andrew Benton <andrewmbenton@gmail.com>
-Andrew Bonventre <andybons@chromium.org>
-Andrew Braunstein <awbraunstein@gmail.com>
-Andrew Bursavich <abursavich@gmail.com>
-Andrew Ekstedt <andrew.ekstedt@gmail.com>
-Andrew Etter <andrew.etter@gmail.com>
-Andrew Harding <andrew@spacemonkey.com>
-Andrew Lutomirski <andy@luto.us>
-Andrew Pogrebnoy <absourd.noise@gmail.com>
-Andrew Pritchard <awpritchard@gmail.com>
-Andrew Radev <andrey.radev@gmail.com>
-Andrew Skiba <skibaa@gmail.com>
-Andrew Szeto <andrew@jabagawee.com>
-Andrew Wilkins <axwalk@gmail.com>
-Andrew Williams <williams.andrew@gmail.com>
-Andrey Mirtchovski <mirtchovski@gmail.com>
-Andrey Petrov <andrey.petrov@shazow.net>
-Andrii Soldatenko <andrii.soldatenko@gmail.com>
-Andrii Soluk <isoluchok@gmail.com>
-Andriy Lytvynov <lytvynov.a.v@gmail.com>
-Andrzej Żeżel <andrii.zhezhel@gmail.com>
-Andy Balholm <andy@balholm.com>
-Andy Davis <andy@bigandian.com>
-Andy Finkenstadt <afinkenstadt@zynga.com>
-Andy Lindeman <andy@lindeman.io>
-Andy Maloney <asmaloney@gmail.com>
-Andy Pan <panjf2000@gmail.com> <panjf2000@golangcn.org> <i@andypan.me>
-Andy Walker <walkeraj@gmail.com>
-Anfernee Yongkun Gui <anfernee.gui@gmail.com>
-Angelo Bulfone <mbulfone@gmail.com>
-Anh Hai Trinh <anh.hai.trinh@gmail.com>
-Anit Gandhi <anitgandhi@gmail.com>
-Anmol Sethi <anmol@aubble.com>
-Anschel Schaffer-Cohen <anschelsc@gmail.com>
-Anthony Alves <cvballa3g0@gmail.com>
-Anthony Canino <anthony.canino1@gmail.com>
-Anthony Eufemio <anthony.eufemio@gmail.com>
-Anthony Martin <ality@pbrane.org>
-Anthony Sottile <asottile@umich.edu>
-Anthony Starks <ajstarks@gmail.com>
-Anthony Voutas <voutasaurus@gmail.com>
-Anthony Woods <awoods@raintank.io>
-Antoine Martin <antoine97.martin@gmail.com>
-Antonin Amand <antonin.amand@gmail.com>
-Antonio Antelo <aantelov87@gmail.com>
-Antonio Bibiano <antbbn@gmail.com>
-Antonio Troina <thoeni@gmail.com>
-Apisak Darakananda <pongad@gmail.com>
-Apsalar
-Aram Hăvărneanu <aram@mgk.ro>
-Areski Belaid <areski@gmail.com>
-Ariel Mashraki <ariel@mashraki.co.il>
-Arlo Breault <arlolra@gmail.com>
-ARM Ltd.
-Arnaud Ysmal <arnaud.ysmal@gmail.com>
-Arne Hormann <arnehormann@gmail.com>
-Arnout Engelen <arnout@bzzt.net>
-Aron Nopanen <aron.nopanen@gmail.com>
-Arthur Khashaev <arthur@khashaev.ru>
-Artyom Pervukhin <artyom.pervukhin@gmail.com>
-Arvindh Rajesh Tamilmani <art@a-30.net>
-Ashish Gandhi <ag@ashishgandhi.org>
-Atin Malaviya <amalaviy@akamai.com>
-Ato Araki <ato.araki@gmail.com>
-Audrey Lim <audreylh@gmail.com>
-Audrius Butkevicius <audrius.butkevicius@gmail.com>
-Augusto Roman <aroman@gmail.com>
-Aulus Egnatius Varialus <varialus@gmail.com>
-Aurélien Rainone <aurelien.rainone@gmail.com>
-awaw fumin <awawfumin@gmail.com>
-Awn Umar <awn@cryptolosophy.io>
-Axel Wagner <axel.wagner.hh@googlemail.com>
-Ayanamist Yang <ayanamist@gmail.com>
-Aymerick Jéhanne <aymerick@jehanne.org>
-Azat Kaumov <kaumov.a.r@gmail.com>
-Baiju Muthukadan <baiju.m.mail@gmail.com>
-Baokun Lee <nototon@gmail.com> <bk@golangcn.org>
-Bartosz Grzybowski <melkorm@gmail.com>
-Bastian Ike <bastian.ike@gmail.com>
-Ben Burkert <ben@benburkert.com>
-Ben Haines <bhainesva@gmail.com>
-Ben Lubar <ben.lubar@gmail.com>
-Ben Olive <sionide21@gmail.com>
-Ben Shi <powerman1st@163.com>
-Benjamin Black <b@b3k.us>
-Benjamin Cable <cable.benjamin@gmail.com>
-Benjamin Hsieh <tanookiben@users.noreply.github.com>
-Benny Siegert <bsiegert@gmail.com>
-Benoit Sigoure <tsunanet@gmail.com>
-Berengar Lehr <berengar.lehr@gmx.de>
-Bharath Kumar Uppala <uppala.bharath@gmail.com>
-Bill Zissimopoulos <billziss@navimatics.com>
-Billie Harold Cleek <bhcleek@gmail.com>
-Bjorn Tillenius <bjorn@tillenius.me>
-Bjorn Tipling <bjorn.tipling@gmail.com>
-Blain Smith <rebelgeek@blainsmith.com>
-Blake Gentry <blakesgentry@gmail.com>
-Blake Mesdag <blakemesdag@gmail.com>
-Blake Mizerany <blake.mizerany@gmail.com>
-Blixt <me@blixt.nyc>
-Bob Briski <rbriski@gmail.com>
-Bob Potter <bobby.potter@gmail.com>
-Bobby Powers <bobbypowers@gmail.com>
-Bolt
-Borja Clemente <borja.clemente@gmail.com>
-Brad Burch <brad.burch@gmail.com>
-Brad Morgan <brad@morgabra.com>
-Bradley Falzon <brad@teambrad.net>
-Brady Catherman <brady@gmail.com>
-Brady Sullivan <brady@bsull.com>
-Brendan Daniel Tracey <tracey.brendan@gmail.com>
-Brett Cannon <bcannon@gmail.com>
-Brett Merrill <brett.j.merrill94@gmail.com>
-Brian Dellisanti <briandellisanti@gmail.com>
-Brian Downs <brian.downs@gmail.com>
-Brian G. Merrell <bgmerrell@gmail.com>
-Brian Gitonga Marete <marete@toshnix.com> <bgmarete@gmail.com>
-Brian Kennedy <btkennedy@gmail.com>
-Brian Kessler <brian.m.kessler@gmail.com>
-Brian Ketelsen <bketelsen@gmail.com>
-Brian Smith <ohohvi@gmail.com>
-Brian Starke <brian.starke@gmail.com>
-Bryan Alexander <Kozical@msn.com>
-Bryan Chan <bryanpkc@gmail.com>
-Bryan Ford <brynosaurus@gmail.com>
-Bulat Gaifullin <gaifullinbf@gmail.com>
-Burak Guven <bguven@gmail.com>
-Caine Tighe <arctanofyourface@gmail.com>
-Caleb Martinez <accounts@calebmartinez.com>
-Caleb Spare <cespare@gmail.com>
-Canonical Limited
-Carl Chatfield <carlchatfield@gmail.com>
-Carl Henrik Lunde <chlunde@ifi.uio.no>
-Carl Johnson <me@carlmjohnson.net>
-Carlisia Campos <carlisia@grokkingtech.io>
-Carlo Alberto Ferraris <cafxx@strayorange.com>
-Carlos Castillo <cookieo9@gmail.com>
-Carlos Cirello <uldericofilho@gmail.com>
-Carolyn Van Slyck <me@carolynvanslyck.com>
-Case Nelson <case.nelson@gmail.com>
-Casey Callendrello <squeed@gmail.com>
-Casey Marshall <casey.marshall@gmail.com>
-Cezar Sá Espinola <cezarsa@gmail.com>
-ChaiShushan <chaishushan@gmail.com>
-Chaoqun Han <hanssccv@gmail.com>
-Charles Fenwick Elliott <Charles@FenwickElliott.io>
-Charles L. Dorian <cldorian@gmail.com>
-Charles Lee <zombie.fml@gmail.com>
-Chef Software, Inc.
-Chew Choon Keat <choonkeat@gmail.com>
-Cholerae Hu <choleraehyq@gmail.com>
-Chotepud Teo <AlexRouSg@users.noreply.github.com>
-Chris Ball <chris@printf.net>
-Chris Biscardi <chris@christopherbiscardi.com>
-Chris Dollin <ehog.hedge@gmail.com>
-Chris Farmiloe <chrisfarms@gmail.com>
-Chris Hines <chris.cs.guy@gmail.com>
-Chris Howey <howeyc@gmail.com>
-Chris Jones <chris@cjones.org>
-Chris Kastorff <encryptio@gmail.com>
-Chris Lennert <calennert@gmail.com>
-Chris Liles <caveryliles@gmail.com>
-Chris McGee <sirnewton_01@yahoo.ca> <newton688@gmail.com>
-Chris Roche <rodaine@gmail.com>
-Chris Smith <chrsmith@users.noreply.github.com>
-Chris Stockton <chrisstocktonaz@gmail.com>
-Christian Alexander <christian@linux.com>
-Christian Couder <chriscool@tuxfamily.org>
-Christian Himpel <chressie@googlemail.com>
-Christian Pellegrin <chri@evolware.org>
-Christine Hansmann <chhansmann@gmail.com>
-Christoffer Buchholz <christoffer.buchholz@gmail.com>
-Christoph Blecker <admin@toph.ca>
-Christoph Hack <christoph@tux21b.org>
-Christopher Cahoon <chris.cahoon@gmail.com>
-Christopher Guiney <chris@guiney.net>
-Christopher Henderson <chris@chenderson.org>
-Christopher Nelson <nadiasvertex@gmail.com>
-Christopher Nielsen <m4dh4tt3r@gmail.com>
-Christopher Redden <christopher.redden@gmail.com>
-Christopher Wedgwood <cw@f00f.org>
-Christos Zoulas <christos@zoulas.com> <zoulasc@gmail.com>
-CL Sung <clsung@gmail.com> <cl_sung@htc.com>
-Clement Skau <clementskau@gmail.com>
-CloudFlare Inc.
-Cody Oss <the.cody.oss@gmail.com>
-Colin Edwards <colin@recursivepenguin.com>
-Colin Kennedy <moshen.colin@gmail.com>
-Conrad Irwin <conrad.irwin@gmail.com>
-Conrad Meyer <cemeyer@cs.washington.edu>
-Conrado Gouvea <conradoplg@gmail.com>
-Constantin Konstantinidis <constantinkonstantinidis@gmail.com>
-CoreOS, Inc.
-Corey Thomasson <cthom.lists@gmail.com>
-Cristian Staretu <unclejacksons@gmail.com>
-Currant
-Cyrill Schumacher <cyrill@schumacher.fm>
-Daisuke Fujita <dtanshi45@gmail.com>
-Damian Gryski <dgryski@gmail.com>
-Damien Lespiau <damien.lespiau@gmail.com>
-Damien Mathieu <42@dmathieu.com>
-Dan Ballard <dan@mindstab.net>
-Dan Caddigan <goldcaddy77@gmail.com>
-Dan Callahan <dan.callahan@gmail.com>
-Dan Peterson <dpiddy@gmail.com>
-Dan Sinclair <dan.sinclair@gmail.com>
-Daniel Fleischman <danielfleischman@gmail.com>
-Daniel Johansson <dajo2002@gmail.com>
-Daniel Kerwin <d.kerwin@gini.net>
-Daniel Krech <eikeon@eikeon.com>
-Daniel Lidén <daniel.liden.87@gmail.com>
-Daniel Martí <mvdan@mvdan.cc>
-Daniel Morsing <daniel.morsing@gmail.com>
-Daniel Nephin <dnephin@gmail.com>
-Daniel Ortiz Pereira da Silva <daniel.particular@gmail.com>
-Daniel Skinner <daniel@dasa.cc>
-Daniel Speichert <daniel@speichert.pl>
-Daniel Theophanes <kardianos@gmail.com>
-Daniel Upton <daniel@floppy.co>
-Daniela Petruzalek <daniela.petruzalek@gmail.com>
-Danny Rosseau <daniel.rosseau@gmail.com>
-Darren Elwood <darren@textnode.com>
-Darshan Parajuli <parajulidarshan@gmail.com>
-Datong Sun <dndx@idndx.com>
-Dave Cheney <dave@cheney.net>
-Dave MacFarlane <driusan@gmail.com>
-Dave Russell <forfuncsake@gmail.com>
-David Brophy <dave@brophy.uk>
-David Bürgin <676c7473@gmail.com>
-David Calavera <david.calavera@gmail.com>
-David Carlier <devnexen@gmail.com>
-David du Colombier <0intro@gmail.com>
-David Forsythe <dforsythe@gmail.com>
-David G. Andersen <dave.andersen@gmail.com>
-David Howden <dhowden@gmail.com>
-David Jakob Fritz <david.jakob.fritz@gmail.com>
-David Leon Gil <coruus@gmail.com>
-David NewHamlet <david@newhamlet.com>
-David R. Jenni <david.r.jenni@gmail.com>
-David Sansome <me@davidsansome.com>
-David Stainton <dstainton415@gmail.com>
-David Thomas <davidthomas426@gmail.com>
-David Titarenco <david.titarenco@gmail.com>
-David Url <david@urld.io>
-David Volquartz Lebech <david@lebech.info>
-David Wimmer <davidlwimmer@gmail.com>
-Davies Liu <davies.liu@gmail.com>
-Davor Kapsa <davor.kapsa@gmail.com>
-Dean Prichard <dean.prichard@gmail.com>
-Deepak Jois <deepak.jois@gmail.com>
-Denis Bernard <db047h@gmail.com>
-Denis Brandolini <denis.brandolini@gmail.com>
-Dennis Kuhnert <mail.kuhnert@gmail.com>
-Denys Honsiorovskyi <honsiorovskyi@gmail.com>
-Derek Buitenhuis <derek.buitenhuis@gmail.com>
-Derek McGowan <derek@mcgstyle.net>
-Derek Parker <parkerderek86@gmail.com>
-Derek Shockey <derek.shockey@gmail.com>
-Dev Ojha <dojha12@gmail.com>
-Dev Zhoujun <dev.zhoujun@gmail.com>
-Develer SRL
-Devon H. O'Dell <devon.odell@gmail.com>
-Dhaivat Pandit <dhaivatpandit@gmail.com>
-Dhiru Kholia <dhiru.kholia@gmail.com>
-Dhruvdutt Jadhav <dhruvdutt.jadhav@gmail.com>
-Didier Spezia <didier.06@gmail.com>
-Dimitri Sokolyuk <sokolyuk@gmail.com>
-Dimitri Tcaciuc <dtcaciuc@gmail.com>
-Diogo Pinela <diogoid7400@gmail.com>
-Dirk Gadsden <dirk@esherido.com>
-Diwaker Gupta <diwakergupta@gmail.com>
-Dmitri Popov <operator@cv.dp-net.com>
-Dmitri Shuralyov <dmitri@shuralyov.com> <shurcooL@gmail.com>
-Dmitriy Cherchenko <dcherchenko@gmail.com>
-Dmitriy Dudkin <dudkin.dmitriy@gmail.com>
-Dmitriy Shelenin <deemok@googlemail.com> <deemok@gmail.com>
-Dmitry Chestnykh <dchest@gmail.com>
-Dmitry Doroginin <doroginin@gmail.com>
-Dmitry Savintsev <dsavints@gmail.com>
-Dmitry Yakunin <nonamezeil@gmail.com>
-Dominic Green <dominicgreen1@gmail.com>
-Dominik Honnef <dominik.honnef@gmail.com>
-Donald Huang <don.hcd@gmail.com>
-Dong-hee Na <donghee.na92@gmail.com>
-Donovan Hide <donovanhide@gmail.com>
-Dropbox, Inc.
-Duncan Holm <mail@frou.org>
-Dustin Herbison <djherbis@gmail.com>
-Dustin Sallings <dsallings@gmail.com>
-Dustin Shields-Cloues <dcloues@gmail.com>
-Dvir Volk <dvir@everything.me> <dvirsky@gmail.com>
-Dylan Waits <dylan@waits.io>
-Edan Bedrik <3d4nb3@gmail.com>
-Eden Li <eden.li@gmail.com>
-Eduardo Ramalho <eduardo.ramalho@gmail.com>
-Edward Muller <edwardam@interlix.com>
-Egon Elbre <egonelbre@gmail.com>
-Ehren Kret <ehren.kret@gmail.com>
-Eitan Adler <lists@eitanadler.com>
-Eivind Uggedal <eivind@uggedal.com>
-Elbert Fliek <efliek@gmail.com>
-Eldar Rakhimberdin <ibeono@gmail.com>
-Elena Grahovac <elena@grahovac.me>
-Elias Naur <mail@eliasnaur.com> <elias.naur@gmail.com>
-Elliot Morrison-Reed <elliotmr@gmail.com>
-Emerson Lin <linyintor@gmail.com>
-Emil Hessman <emil@hessman.se>
-Emil Mursalimov <mursalimovemeel@gmail.com>
-Emilien Kenler <hello@emilienkenler.com>
-Emmanuel Odeke <emm.odeke@gmail.com> <odeke@ualberta.ca>
-Empirical Interfaces Inc.
-Eoghan Sherry <ejsherry@gmail.com>
-Eric Chiang <eric.chiang.m@gmail.com>
-Eric Clark <zerohp@gmail.com>
-Eric Daniels <eric@erdaniels.com>
-Eric Engestrom <eric@engestrom.ch>
-Eric Lagergren <ericscottlagergren@gmail.com>
-Eric Milliken <emilliken@gmail.com>
-Eric Pauley <eric@pauley.me>
-Eric Rescorla <ekr@rtfm.com>
-Eric Roshan-Eisner <eric.d.eisner@gmail.com>
-Eric Rykwalder <e.rykwalder@gmail.com>
-Erik Aigner <aigner.erik@gmail.com>
-Erik Dubbelboer <erik@dubbelboer.com>
-Erik St. Martin <alakriti@gmail.com>
-Erik Westrup <erik.westrup@gmail.com>
-Ernest Chiang <ernest_chiang@htc.com>
-Erwin Oegema <blablaechthema@hotmail.com>
-Esko Luontola <esko.luontola@gmail.com>
-Euan Kemp <euank@euank.com>
-Eugene Kalinin <e.v.kalinin@gmail.com>
-Evan Hicks <evan.hicks2@gmail.com>
-Evan Jones <ej@evanjones.ca>
-Evan Phoenix <evan@phx.io>
-Evan Shaw <chickencha@gmail.com>
-Evgeniy Polyakov <zbr@ioremap.net>
-Ewan Chou <coocood@gmail.com>
-Ewan Valentine <ewan.valentine89@gmail.com>
-Eyal Posener <posener@gmail.com>
-Fabian Wickborn <fabian@wickborn.net>
-Fabian Zaremba <fabian@youremail.eu>
-Fabrizio Milo <mistobaan@gmail.com>
-Facebook, Inc.
-Faiyaz Ahmed <ahmedf@vmware.com>
-Fan Hongjian <fan.howard@gmail.com>
-Fastly, Inc.
-Fatih Arslan <fatih@arslan.io>
-Fazlul Shahriar <fshahriar@gmail.com>
-Fedor Indutny <fedor@indutny.com>
-Felipe Oliveira <felipeweb.programador@gmail.com>
-Felix Geisendörfer <haimuiba@gmail.com>
-Felix Kollmann <fk@konsorten.de>
-Filip Gruszczyński <gruszczy@gmail.com>
-Filip Haglund <drathier@users.noreply.github.com>
-Filippo Valsorda <hi@filippo.io>
-Firmansyah Adiputra <frm.adiputra@gmail.com>
-Florian Uekermann <florian@uekermann-online.de>
-Florian Weimer <fw@deneb.enyo.de>
-Florin Patan <florinpatan@gmail.com>
-Ford Hurley <ford.hurley@gmail.com>
-Francesc Campoy <francesc@campoy.cat>
-Francisco Claude <fclaude@recoded.cl>
-Francisco Rojas <francisco.rojas.gallegos@gmail.com>
-Francisco Souza <franciscossouza@gmail.com>
-Frank Schroeder <frank.schroeder@gmail.com>
-Frank Somers <fsomers@arista.com>
-Frederic Guillot <frederic.guillot@gmail.com>
-Frederick Kelly Mayle III <frederickmayle@gmail.com>
-Frederik Ring <frederik.ring@gmail.com>
-Fredrik Enestad <fredrik.enestad@soundtrackyourbrand.com>
-Fredrik Forsmo <fredrik.forsmo@gmail.com>
-Fredrik Wallgren <fredrik.wallgren@gmail.com>
-Frithjof Schulze <schulze@math.uni-hannover.de> <sfrithjof@gmail.com>
-Frits van Bommel <fvbommel@gmail.com>
-Gabríel Arthúr Pétursson <gabriel@system.is>
-Gabriel Aszalos <gabriel.aszalos@gmail.com>
-Gabriel Nicolas Avellaneda <avellaneda.gabriel@gmail.com>
-Gabriel Russell <gabriel.russell@gmail.com>
-Gareth Paul Jones <gpj@foursquare.com>
-Gary Burd <gary@beagledreams.com>
-Gaurish Sharma <contact@gaurishsharma.com>
-Gautham Thambidorai <gautham.dorai@gmail.com>
-Gauthier Jolly <gauthier.jolly@gmail.com>
-Geert-Johan Riemer <gjr19912@gmail.com>
-Gengliang Wang <ltnwgl@gmail.com>
-Geoffroy Lorieux <lorieux.g@gmail.com>
-Geon Kim <geon0250@gmail.com>
-Georg Reinke <guelfey@gmail.com>
-George Gkirtsou <ggirtsou@gmail.com>
-George Shammas <george@shamm.as> <georgyo@gmail.com>
-Gerasimos Dimitriadis <gedimitr@gmail.com>
-Getulio Sánchez <valentin2507@gmail.com>
-Gideon Jan-Wessel Redelinghuys <gjredelinghuys@gmail.com>
-Giles Lean <giles.lean@pobox.com>
-Giulio Iotti <dullgiulio@gmail.com>
-Gleb Stepanov <glebstepanov1992@gmail.com>
-Google Inc.
-Gordon Klaus <gordon.klaus@gmail.com>
-Graham King <graham4king@gmail.com>
-Graham Miller <graham.miller@gmail.com>
-Grant Griffiths <ggp493@gmail.com>
-Greg Poirier <greg.istehbest@gmail.com>
-Greg Ward <greg@gerg.ca>
-Grégoire Delattre <gregoire.delattre@gmail.com>
-Gregory Man <man.gregory@gmail.com>
-Guilherme Garnier <guilherme.garnier@gmail.com>
-Guilherme Goncalves <guilhermeaugustosg@gmail.com>
-Guilherme Rezende <guilhermebr@gmail.com>
-Guillaume J. Charmes <guillaume@charmes.net>
-Guobiao Mei <meiguobiao@gmail.com>
-Gustav Paul <gustav.paul@gmail.com>
-Gustav Westling <gustav@westling.xyz>
-Gustavo Niemeyer <gustavo@niemeyer.net>
-Gwenael Treguier <gwenn.kahz@gmail.com>
-Gyu-Ho Lee <gyuhox@gmail.com>
-H. İbrahim Güngör <igungor@gmail.com>
-Hajime Hoshi <hajimehoshi@gmail.com>
-HAMANO Tsukasa <hamano@osstech.co.jp>
-Hang Qian <hangqian90@gmail.com>
-Hanjun Kim <hallazzang@gmail.com>
-Harald Nordgren <haraldnordgren@gmail.com>
-Hari haran <hariharan.uno@gmail.com>
-Hariharan Srinath <srinathh@gmail.com>
-Harley Laue <losinggeneration@gmail.com>
-Harry Moreno <morenoh149@gmail.com>
-Harshavardhana <hrshvardhana@gmail.com>
-Hauke Löffler <hloeffler@users.noreply.github.com>
-Håvard Haugen <havard.haugen@gmail.com>
-Hector Chu <hectorchu@gmail.com>
-Hector Martin Cantero <hector@marcansoft.com>
-Henning Schmiedehausen <henning@schmiedehausen.org>
-Henrik Edwards <henrik.edwards@gmail.com>
-Henrik Hodne <henrik@hodne.io>
-Henry Adi Sumarto <henry.adisumarto@gmail.com>
-Henry Bubert <google@mindeco.de>
-Henry Chang <mr.changyuheng@gmail.com>
-Henry Clifford <h.a.clifford@gmail.com>
-Herbert Georg Fischer <herbert.fischer@gmail.com>
-Hilko Bengen <bengen@hilluzination.de>
-Hiroaki Nakamura <hnakamur@gmail.com>
-Hironao OTSUBO <motemen@gmail.com>
-Hiroshi Ioka <hirochachacha@gmail.com>
-Hitoshi Mitake <mitake.hitoshi@gmail.com>
-Holden Huang <ttyh061@gmail.com>
-Hong Ruiqi <hongruiqi@gmail.com>
-Hongfei Tan <feilengcui008@gmail.com>
-Hootsuite Inc.
-Hsin-Ho Yeh <yhh92u@gmail.com>
-Hu Keping <hukeping@huawei.com>
-Hugues Bruant <hugues.bruant@gmail.com>
-Ian Gudger <ian@loosescre.ws>
-Ian Kent <iankent85@gmail.com>
-IBM
-Ibrahim AshShohail <ibra.sho@gmail.com>
-Icarus Sparry <golang@icarus.freeuk.com>
-Iccha Sethi <icchasethi@gmail.com>
-Idora Shinatose <idora.shinatose@gmail.com>
-Igneous Systems, Inc.
-Igor Dolzhikov <bluesriverz@gmail.com>
-Igor Vashyst <ivashyst@gmail.com>
-INADA Naoki <songofacandy@gmail.com>
-Inanc Gumus <m@inanc.io>
-Infobaleen AB
-Ingo Gottwald <in.gottwald@gmail.com>
-Ingo Krabbe <ikrabbe.ask@gmail.com>
-Ingo Oeser <nightlyone@googlemail.com>
-Intel Corporation
-Ioannis Georgoulas <geototti21@hotmail.com>
-Irfan Sharif <irfanmahmoudsharif@gmail.com>
-Irieda Noboru <irieda@gmail.com>
-Isaac Ardis <isaac.ardis@gmail.com>
-Isaac Wagner <ibw@isaacwagner.me>
-Ivan Babrou <ivan@cloudflare.com>
-Ivan Bertona <ivan.bertona@gmail.com>
-Ivan Markin <sw@nogoegst.net>
-Ivan Moscoso <moscoso@gmail.com>
-Ivan Ukhov <ivan.ukhov@gmail.com>
-Jack Britton <jackxbritton@gmail.com>
-Jacob H. Haven <jacob@jhaven.me>
-Jacob Hoffman-Andrews <github@hoffman-andrews.com>
-Jae Kwon <jae@tendermint.com>
-Jakob Borg <jakob@nym.se>
-Jakob Weisblat <jakobw@mit.edu>
-Jakub Ryszard Czarnowicz <j.czarnowicz@gmail.com>
-James Bardin <j.bardin@gmail.com>
-James Clarke <jrtc27@jrtc27.com>
-James Cowgill <James.Cowgill@imgtec.com>
-James David Chalfant <james.chalfant@gmail.com>
-James Fysh <james.fysh@gmail.com>
-James Gray <james@james4k.com>
-James Hartig <fastest963@gmail.com>
-James Lawrence <jljatone@gmail.com>
-James Meneghello <rawrz0r@gmail.com>
-James Myers <jfmyers9@gmail.com>
-James Neve <jamesoneve@gmail.com>
-James P. Cooper <jamespcooper@gmail.com>
-James Schofield <james@shoeboxapp.com>
-James Smith <jrs1995@icloud.com>
-James Sweet <james.sweet88@googlemail.com>
-James Toy <nil@opensesame.st>
-James Treanor <jtreanor3@gmail.com>
-James Whitehead <jnwhiteh@gmail.com>
-Jamie Beverly <jamie.r.beverly@gmail.com>
-Jamie Kerr <jkerr113@googlemail.com>
-Jamie Stackhouse <contin673@gmail.com>
-Jamil Djadala <djadala@gmail.com>
-Jan Berktold <jan@berktold.co>
-Jan H. Hosang <jan.hosang@gmail.com>
-Jan Lehnardt <jan@apache.org>
-Jan Mercl <0xjnml@gmail.com> <befelemepeseveze@gmail.com>
-Jan Newmarch <jan.newmarch@gmail.com>
-Jan Pilzer <jan.pilzer@gmx.de>
-Jan Ziak <0xe2.0x9a.0x9b@gmail.com>
-Jani Monoses <jani.monoses@ubuntu.com>
-Jared Culp <jculp14@gmail.com>
-Jaroslavas Počepko <jp@webmaster.ms>
-Jason A. Donenfeld <Jason@zx2c4.com>
-Jason Barnett <jason.w.barnett@gmail.com>
-Jason Chu <jasonchujc@gmail.com>
-Jason Del Ponte <delpontej@gmail.com>
-Jason Smale <jsmale@zendesk.com>
-Jason Travis <infomaniac7@gmail.com>
-Jason Wangsadinata <jwangsadinata@gmail.com>
-Javier Segura <javism@gmail.com>
-Jay Weisskopf <jay@jayschwa.net>
-Jean-André Santoni <jean.andre.santoni@gmail.com>
-Jean-Francois Cantin <jfcantin@gmail.com>
-Jean-Nicolas Moal <jn.moal@gmail.com>
-Jeet Parekh <jeetparekh96@gmail.com>
-Jeevanandam M <jeeva@myjeeva.com>
-Jeff Dupont <jeff.dupont@gmail.com>
-Jeff Hodges <jeff@somethingsimilar.com>
-Jeff R. Allen <jra@nella.org>
-Jeff Sickel <jas@corpus-callosum.com>
-Jeff Wendling <jeff@spacemonkey.com>
-Jeffrey H <jeffreyh192@gmail.com>
-Jelte Fennema <github-tech@jeltef.nl>
-Jens Frederich <jfrederich@gmail.com>
-Jeremy Jackins <jeremyjackins@gmail.com>
-Jeroen Bobbeldijk <jerbob92@gmail.com>
-Jerrin Shaji George <jerrinsg@gmail.com>
-Jess Frazelle <me@jessfraz.com>
-Jesse Szwedko <jesse.szwedko@gmail.com>
-Jesús Espino <jespinog@gmail.com>
-Jihyun Yu <yjh0502@gmail.com>
-Jim McGrath <jimmc2@gmail.com>
-Jimmy Frasche <soapboxcicero@gmail.com>
-Jimmy Zelinskie <jimmyzelinskie@gmail.com>
-Jin-wook Jeong <jeweljar@hanmail.net>
-Jingcheng Zhang <diogin@gmail.com>
-Jingguo Yao <yaojingguo@gmail.com>
-Jiong Du <londevil@gmail.com>
-Jirka Daněk <dnk@mail.muni.cz>
-Jiulong Wang <jiulongw@gmail.com>
-Joakim Sernbrant <serbaut@gmail.com>
-Joe Cortopassi <joe@joecortopassi.com>
-Joe Farrell <joe2farrell@gmail.com>
-Joe Harrison <joehazzers@gmail.com>
-Joe Henke <joed.henke@gmail.com>
-Joe Kyo <xunianzu@gmail.com>
-Joe Poirier <jdpoirier@gmail.com>
-Joe Shaw <joe@joeshaw.org>
-Joe Sylve <joe.sylve@gmail.com>
-Joe Tsai <joetsai@digital-static.net>
-Joel Sing <joel@sing.id.au>
-Joel Stemmer <stemmertech@gmail.com>
-Joey Geiger <jgeiger@users.noreply.github.com>
-Johan Brandhorst <johan.brandhorst@gmail.com>
-Johan Sageryd <j@1616.se>
-John Asmuth <jasmuth@gmail.com>
-John C Barstow <jbowtie@amathaine.com>
-John Gibb <johngibb@gmail.com>
-John Graham-Cumming <jgc@jgc.org> <jgrahamc@gmail.com>
-John Howard Palevich <jack.palevich@gmail.com>
-John Jeffery <jjeffery@sp.com.au>
-John Jenkins <twodopeshaggy@gmail.com>
-John Leidegren <john.leidegren@gmail.com>
-John Potocny <johnp@vividcortex.com>
-John R. Lenton <jlenton@gmail.com>
-John Schnake <schnake.john@gmail.com>
-John Shahid <jvshahid@gmail.com>
-John Tuley <john@tuley.org>
-Johnny Luo <johnnyluo1980@gmail.com>
-Jonas Bernoulli <jonas@bernoul.li>
-Jonathan Boulle <jonathanboulle@gmail.com>
-Jonathan Chen <dijonkitchen@users.noreply.github.com>
-Jonathan Gold <jgold.bg@gmail.com>
-Jonathan Mark <jhmark@xenops.com>
-Jonathan Pentecost <pentecostjonathan@gmail.com>
-Jonathan Rudenberg <jonathan@titanous.com>
-Jonathan Stacks <jonstacks13@gmail.com>
-Jonathan Wills <runningwild@gmail.com>
-Jongmin Kim <atomaths@gmail.com>
-Joonas Kuorilehto <joneskoo@derbian.fi>
-Joop Kiefte <ikojba@gmail.com> <joop@kiefte.net>
-Jordan Krage <jmank88@gmail.com>
-Jordan Lewis <jordanthelewis@gmail.com>
-Jose Luis Vázquez González <josvazg@gmail.com>
-Joseph Holsten <joseph@josephholsten.com>
-Josh Bleecher Snyder <josharian@gmail.com>
-Josh Chorlton <jchorlton@gmail.com>
-Josh Deprez <josh.deprez@gmail.com>
-Josh Goebel <dreamer3@gmail.com>
-Josh Holland <jrh@joshh.co.uk>
-Josh Roppo <joshroppo@gmail.com>
-Josh Varga <josh.varga@gmail.com>
-Joshua Chase <jcjoshuachase@gmail.com>
-Joshua Rubin <joshua@rubixconsulting.com>
-Josselin Costanzi <josselin@costanzi.fr>
-Jostein Stuhaug <js@solidsystem.no>
-Joyent, Inc.
-JT Olds <jtolds@xnet5.com>
-Juan Carlos <juanjcsr@gmail.com>
-Jude Pereira <judebpereira@gmail.com>
-Jukka-Pekka Kekkonen <karatepekka@gmail.com>
-Julian Kornberger <jk+github@digineo.de>
-Julian Phillips <julian@quantumfyre.co.uk>
-Julien Salleyron <julien.salleyron@gmail.com>
-Julien Schmidt <google@julienschmidt.com>
-Junda Liu <junda@celer.network>
-Junya Hayashi <ledmonster@gmail.com>
-Justin Gracenin <jgracenin@gmail.com>
-Justin Nuß <nuss.justin@gmail.com>
-Justyn Temme <justyntemme@gmail.com>
-Kai Backman <kaib@golang.org>
-Kai Trukenmüller <ktye78@gmail.com>
-Kale Blankenship <kale@lemnisys.com>
-Kaleb Elwert <kelwert@atlassian.com>
-Kamil Chmielewski <kamil.chm@gmail.com>
-Kamil Kisiel <kamil@kamilkisiel.net> <kamil.kisiel@gmail.com>
-Kamil Rytarowski <krytarowski@users.noreply.github.com>
-Kang Hu <hukangustc@gmail.com>
-Karel Pazdera <pazderak@gmail.com>
-Karoly Negyesi <chx1975@gmail.com>
-Karsten Köhler <karsten.koehler95@gmail.com>
-Kashav Madan <kshvmdn@gmail.com>
-Kate Manson <kate.manson@izettle.com>
-Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
-Katrina Owen <katrina.owen@gmail.com>
-Kaviraj Kanagaraj <kavirajkanagaraj@gmail.com>
-Keegan Carruthers-Smith <keegan.csmith@gmail.com>
-Kei Son <hey.calmdown@gmail.com>
-Keiji Yoshida <keijiyoshida.mail@gmail.com>
-Keith Ball <inflatablewoman@gmail.com>
-Keith Rarick <kr@xph.us>
-Kelsey Hightower <kelsey.hightower@gmail.com>
-Kelvin Foo Chuan Lyi <vmirage@gmail.com>
-Ken Friedenbach <kenliz@cruzio.com>
-Ken Rockot <ken@oz.gs>
-Ken Sedgwick <ken@bonsai.com>
-Kenji Kaneda <kenji.kaneda@gmail.com>
-Kenji Yano <kenji.yano@gmail.com>
-Kenneth Shaw <kenshaw@gmail.com>
-Kenny Grant <kennygrant@gmail.com>
-Kevin Ballard <kevin@sb.org>
-Kevin Burke <kev@inburke.com>
-Kevin Kirsche <kev.kirsche@gmail.com>
-Kevin Ruffin <kruffin@gmail.com>
-Kevin Vu <kevin.m.vu@gmail.com>
-Kieran Colford <kieran@kcolford.com>
-Kim Yongbin <kybinz@gmail.com>
-Kir Kolyshkin <kolyshkin@gmail.com>
-Kirk Han <kirk91.han@gmail.com>
-Klaus Post <klauspost@gmail.com>
-Kodie Goodwin <kodiegoodwin@gmail.com>
-Koichi Shiraishi <zchee.io@gmail.com>
-Koki Ide <niconegoto@yahoo.co.jp>
-Konstantin <konstantin8105@gmail.com>
-Konstantin Shaposhnikov <k.shaposhnikov@gmail.com>
-KPCompass, Inc.
-Kris Nova <kris@nivenly.com>
-Kristopher Watts <traetox@gmail.com>
-Kun Li <likunarmstrong@gmail.com>
-Kunpei Sakai <namusyaka@gmail.com>
-Kuntal Majumder <hellozee@disroot.org>
-Kyle Consalus <consalus@gmail.com>
-Kyle Isom <kyle@gokyle.net>
-Kyle Jones <kyle@kyledj.com>
-Kyle Lemons <kyle@kylelemons.net>
-Kyle Shannon <kyle@pobox.com>
-Kyohei Kadota <lufia@lufia.org>
-Kyrylo Silin <silin@kyrylo.org>
-L Campbell <unpantsu@gmail.com>
-Lai Jiangshan <eag0628@gmail.com>
-Lakshay Garg <lakshay.garg.1996@gmail.com>
-Lanre Adelowo <yo@lanre.wtf>
-Larry Hosken <lahosken@gmail.com>
-Lars Jeppesen <jeppesen.lars@gmail.com>
-Lars Lehtonen <lars.lehtonen@gmail.com>
-Lars Wiegman <lars@namsral.com>
-Larz Conwell <larzconwell@gmail.com>
-Laurent Voisin <lpvoisin@gmail.com>
-Laurie Clark-Michalek <laurie@qubit.com>
-LE Manh Cuong <cuong.manhle.vn@gmail.com>
-Lee Hinman <hinman@gmail.com>
-Lee Packham <lpackham@gmail.com>
-Lehner Florian <dev@der-flo.net>
-Leigh McCulloch <leighmcc@gmail.com>
-Leo Antunes <leo@costela.net>
-Leon Klingele <git@leonklingele.de>
-Leonard Wang <wangdeyu0907@gmail.com> <wangdeyu@golangcn.org>
-Leonel Quinteros <leonel.quinteros@gmail.com>
-Lev Shamardin <shamardin@gmail.com>
-Lewin Bormann <lewin.bormann@gmail.com>
-Liberty Fund Inc
-Linaro Limited
-Lion Yang <lion@aosc.xyz>
-Lloyd Dewolf <foolswisdom@gmail.com>
-Lorenzo Masini <rugginoso@develer.com>
-Lorenzo Stoakes <lstoakes@gmail.com>
-Luan Santos <cfcluan@gmail.com>
-Lubomir I. Ivanov <neolit123@gmail.com>
-Luca Greco <luca.greco@alcacoop.it>
-Lucas Bremgartner <lucas.bremgartner@gmail.com>
-Lucien Stuker <lucien.stuker@gmail.com>
-Lucio De Re <lucio.dere@gmail.com>
-Ludi Rehak <ludi317@gmail.com>
-Luigi Riefolo <luigi.riefolo@gmail.com>
-Luit van Drongelen <luitvd@gmail.com>
-Luka Zakrajšek <tr00.g33k@gmail.com>
-Luke Curley <qpingu@gmail.com>
-Luke Granger-Brown <git@lukegb.com>
-Lyle Franklin <lylejfranklin@gmail.com>
-Ma Peiqi <mapeiqi2017@gmail.com>
-Maicon Costa <maiconscosta@gmail.com>
-Maksym Trykur <maksym.trykur@gmail.com>
-Mal Curtis <mal@mal.co.nz>
-Manfred Touron <m@42.am>
-Manigandan Dharmalingam <manigandan.jeff@gmail.com>
-Manish Goregaokar <manishsmail@gmail.com>
-Mansour Rahimi <rahimi.mnr@gmail.com>
-Manu S Ajith <neo@codingarena.in>
-Manuel Mendez <mmendez534@gmail.com>
-Marc Weistroff <marc@weistroff.net>
-Marcel Edmund Franke <marcel.edmund.franke@gmail.com>
-Marcelo Cantos <marcelo.cantos@gmail.com>
-Marcelo E. Magallon <marcelo.magallon@gmail.com>
-Marco Hennings <marco.hennings@freiheit.com>
-Marin Bašić <marin.basic02@gmail.com>
-Mario Arranz <marioarranzr@gmail.com>
-Mark Adams <mark@markadams.me>
-Mark Bucciarelli <mkbucc@gmail.com>
-Mark Percival <m@mdp.im>
-Mark Pulford <mark@kyne.com.au>
-Mark Rushakoff <mark.rushakoff@gmail.com>
-Mark Severson <miquella@gmail.com>
-Mark Theunissen <mark.theunissen@gmail.com>
-Mark Wolfe <mark@wolfe.id.au>
-Marko Juhani Silokunnas <marko.silokunnas@gmail.com>
-Marko Mudrinic <mudrinic.mare@gmail.com>
-Marko Tiikkaja <marko@joh.to>
-Markover Inc. DBA Poptip
-Markus Duft <markus.duft@salomon.at>
-Markus Sonderegger <marraison@gmail.com>
-Markus Zimmermann <zimmski@gmail.com>
-Martin Bertschler <mbertschler@gmail.com>
-Martin Garton <garton@gmail.com>
-Martin Hamrle <martin.hamrle@gmail.com>
-Martin Hoefling <martin.hoefling@gmx.de>
-Martin Kunc <martinkunc@users.noreply.github.com>
-Martin Lindhe <martin.j.lindhe@gmail.com>
-Martin Möhrmann <martisch@uos.de>
-Martin Neubauer <m.ne@gmx.net>
-Martin Olsen <github.com@martinolsen.net>
-Martin Olsson <martin@minimum.se>
-Martin Probst <martin@probst.io>
-Martin Sucha <anty.sk+git@gmail.com>
-Martins Sipenko <martins.sipenko@gmail.com>
-Marvin Stenger <marvin.stenger94@gmail.com>
-Marwan Sulaiman <marwan.sulaiman@work.co>
-Maryan Hratson <gmarik@gmail.com>
-Masahiro Furudate <masahiro.furudate@gmail.com>
-Masahiro Wakame <vvakame@gmail.com>
-Masaki Yoshida <yoshida.masaki@gmail.com>
-Mat Byczkowski <mbyczkowski@gmail.com>
-Mat Ryer <thatmatryer@gmail.com>
-Máté Gulyás <mgulyas86@gmail.com>
-Matej Baćo <matejbaco@gmail.com>
-Mateus Amin <mateus.amin@gmail.com>
-Mateusz Czapliński <czapkofan@gmail.com>
-Mathias Beke <git@denbeke.be>
-Mathias Hall-Andersen <mathias@hall-andersen.dk>
-Mathias Leppich <mleppich@muhqu.de>
-Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
-Mats Lidell <mats.lidell@cag.se>
-Matt Aimonetti <mattaimonetti@gmail.com>
-Matt Blair <me@matthewblair.net>
-Matt Bostock <matt@mattbostock.com>
-Matt Dee <mdee@hioscar.com>
-Matt Drollette <matt@drollette.com>
-Matt Harden <matt.harden@gmail.com>
-Matt Jibson <matt.jibson@gmail.com>
-Matt Joiner <anacrolix@gmail.com>
-Matt Juran <thepciet@gmail.com>
-Matt Layher <mdlayher@gmail.com>
-Matt Reiferson <mreiferson@gmail.com>
-Matt Robenolt <matt@ydekproductions.com>
-Matt Strong <mstrong1341@gmail.com>
-Matt T. Proud <matt.proud@gmail.com>
-Matt Williams <gh@mattyw.net>
-Matthew Brennan <matty.brennan@gmail.com>
-Matthew Broberg <matthewbbroberg@gmail.com>
-Matthew Cottingham <mattcottingham@gmail.com>
-Matthew Denton <mdenton@skyportsystems.com>
-Matthew Holt <Matthew.Holt+git@gmail.com>
-Matthew Horsnell <matthew.horsnell@gmail.com>
-Matthieu Hauglustaine <matt.hauglustaine@gmail.com>
-Matthieu Olivier <olivier.matthieu@gmail.com>
-Matthijs Kooijman <matthijs@stdin.nl>
-Max Riveiro <kavu13@gmail.com>
-Max Schmitt <max@schmitt.mx>
-Maxim Khitrov <max@mxcrypt.com>
-Maxime de Roucy <maxime.deroucy@gmail.com>
-Máximo Cuadros Ortiz <mcuadros@gmail.com>
-Maxwell Krohn <themax@gmail.com>
-Maya Rashish <maya@netbsd.org>
-Mayank Kumar <krmayankk@gmail.com>
-MediaMath, Inc
-Meir Fischer <meirfischer@gmail.com>
-Meng Zhuo <mengzhuo1203@gmail.com> <mzh@golangcn.org>
-Meteor Development Group
-Mhd Sulhan <m.shulhan@gmail.com>
-Micah Stetson <micah.stetson@gmail.com>
-Michael Brandenburg <mbrandenburg@bolste.com>
-Michael Chaten <mchaten@gmail.com>
-Michael Dorner <mail@michaeldorner.de>
-Michael Edwards <medwards@walledcity.ca>
-Michael Elkins <michael.elkins@gmail.com>
-Michael Fraenkel <michael.fraenkel@gmail.com>
-Michael Gehring <mg@ebfe.org> <gnirheg.leahcim@gmail.com>
-Michael Hendricks <michael@ndrix.org>
-Michael Hoisie <hoisie@gmail.com>
-Michael Kasch <michael.kasch@gmail.com>
-Michael Käufl <golang@c.michael-kaeufl.de>
-Michael Lewis <mikelikespie@gmail.com>
-Michael MacInnis <Michael.P.MacInnis@gmail.com>
-Michael Marineau <mike@marineau.org>
-Michael McConville <momcconville@gmail.com>
-Michael McLoughlin <mmcloughlin@gmail.com>
-Michael Pearson <mipearson@gmail.com>
-Michael Schaller <michael@5challer.de>
-Michael Schurter <michael.schurter@gmail.com>
-Michael Stapelberg <michael@stapelberg.de>
-Michael Steinert <mike.steinert@gmail.com>
-Michael Teichgräber <mteichgraeber@gmx.de>
-Michael Vetter <g.bluehut@gmail.com>
-Michal Bohuslávek <mbohuslavek@gmail.com>
-Michał Derkacz <ziutek@lnet.pl>
-Michal Franc <lam.michal.franc@gmail.com>
-Michal Pristas <michal.pristas@gmail.com>
-Miek Gieben <miek@miek.nl>
-Miguel Mendez <stxmendez@gmail.com>
-Miguel Molina <hi@mvader.me>
-Mihai Borobocea <MihaiBorobocea@gmail.com>
-Mihail Minaev <minaev.mike@gmail.com>
-Mikael Tillenius <mikti42@gmail.com>
-Mike Andrews <mra@xoba.com>
-Mike Appleby <mike@app.leby.org>
-Mike Houston <mike@kothar.net>
-Mike Kabischev <kabischev@gmail.com>
-Mike Rosset <mike.rosset@gmail.com>
-Mike Tsao <mike@sowbug.com>
-Mikhail Gusarov <dottedmag@dottedmag.net>
-Mikhail Panchenko <m@mihasya.com>
-Miki Tebeka <miki.tebeka@gmail.com>
-Mikio Hara <mikioh.mikioh@gmail.com>
-Mikkel Krautz <mikkel@krautz.dk>
-Milan Knezevic <milan.knezevic@mips.com>
-Milutin Jovanović <jovanovic.milutin@gmail.com>
-MinJae Kwon <mingrammer@gmail.com>
-Miquel Sabaté Solà <mikisabate@gmail.com>
-Miroslav Genov <mgenov@gmail.com>
-Misty De Meo <mistydemeo@gmail.com>
-Mohit Agarwal <mohit@sdf.org>
-Mohit kumar Bajoria <mohitbajo36@gmail.com>
-Momchil Velikov <momchil.velikov@gmail.com>
-Monty Taylor <mordred@inaugust.com>
-Moov Corporation
-Moriyoshi Koizumi <mozo@mozo.jp>
-Morten Siebuhr <sbhr@sbhr.dk>
-Môshe van der Sterre <moshevds@gmail.com>
-Mostyn Bramley-Moore <mostyn@antipode.se>
-Muhammad Falak R Wani <falakreyaz@gmail.com>
-Muhammed Uluyol <uluyol0@gmail.com>
-Mura Li <mura_li@castech.com.tw>
-Nan Deng <monnand@gmail.com>
-Naoki Kanatani <k12naoki@gmail.com>
-Nate Wilkinson <nathanwilk7@gmail.com>
-Nathan Cantelmo <n.cantelmo@gmail.com>
-Nathan Caza <mastercactapus@gmail.com>
-Nathan Humphreys <nkhumphreys@gmail.com>
-Nathan John Youngman <nj@nathany.com>
-Nathan Otterness <otternes@cs.unc.edu>
-Nathan P Finch <nate.finch@gmail.com>
-Nathan VanBenschoten <nvanbenschoten@gmail.com>
-Nathan Youngman <git@nathany.com>
-Nathaniel Cook <nvcook42@gmail.com>
-Naveen Kumar Sangi <naveenkumarsangi@protonmail.com>
-Neelesh Chandola <neelesh.c98@gmail.com>
-Neil Alexander <neilalexander@neilalexander.dev>
-Neil Lyons <nwjlyons@googlemail.com>
-Netflix, Inc.
-Neuman Vong <neuman.vong@gmail.com>
-Neven Sajko <nsajko@gmail.com>
-Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
-Nexedi
-ngmoco, LLC
-Niall Sheridan <nsheridan@gmail.com>
-Nic Day <nic.day@me.com>
-Nicholas Katsaros <nick@nickkatsaros.com>
-Nicholas Maniscalco <nicholas@maniscalco.com>
-Nicholas Presta <nick@nickpresta.ca> <nick1presta@gmail.com>
-Nicholas Sullivan <nicholas.sullivan@gmail.com>
-Nicholas Waples <nwaples@gmail.com>
-Nick Craig-Wood <nick@craig-wood.com> <nickcw@gmail.com>
-Nick Leli <nicholasleli@gmail.com>
-Nick Miyake <nmiyake@users.noreply.github.com>
-Nick Patavalis <nick.patavalis@gmail.com>
-Nick Petroni <npetroni@cs.umd.edu>
-Nick Robinson <nrobinson13@gmail.com>
-Nick Smolin <nick27surgut@gmail.com>
-Nicolas BRULEZ <n.brulez@gmail.com>
-Nicolas Kaiser <nikai@nikai.net>
-Nicolas Owens <mischief@offblast.org>
-Nicolas S. Dade <nic.dade@gmail.com>
-Niek Sanders <niek.sanders@gmail.com>
-Niels Widger <niels.widger@gmail.com>
-Nigel Kerr <nigel.kerr@gmail.com>
-Nik Nyby <nnyby@columbia.edu>
-Nikhil Benesch <nikhil.benesch@gmail.com>
-Nikita Gillmann <nikita@n0.is> <ng0@n0.is>
-Niklas Schnelle <niklas.schnelle@gmail.com>
-Niko Dziemba <niko@dziemba.com>
-Nikolay Turpitko <nikolay@turpitko.com>
-Nils Larsgård <nilsmagnus@gmail.com>
-Niranjan Godbole <niranjan8192@gmail.com>
-Nishanth Shanmugham <nishanth.gerrard@gmail.com>
-Noah Campbell <noahcampbell@gmail.com>
-Noble Johnson <noblepoly@gmail.com>
-Noel Georgi <git@frezbo.com>
-Norberto Lopes <nlopes.ml@gmail.com>
-Odin Ugedal <odin@ugedal.com>
-Oleg Bulatov <dmage@yandex-team.ru>
-Oleg Vakheta <helginet@gmail.com>
-Oleku Konko <oleku.konko@gmail.com>
-Oling Cat <olingcat@gmail.com>
-Oliver Hookins <ohookins@gmail.com>
-Oliver Tonnhofer <olt@bogosoft.com>
-Olivier Antoine <olivier.antoine@gmail.com>
-Olivier Duperray <duperray.olivier@gmail.com>
-Olivier Poitrey <rs@dailymotion.com>
-Olivier Saingre <osaingre@gmail.com>
-Oracle
-Orange
-Orijtech, Inc.
-Özgür Kesim <oec-go@kesim.org>
-Pablo Lalloni <plalloni@gmail.com>
-Pablo Rozas Larraondo <pablo.larraondo@anu.edu.au>
-Pablo Santiago Blum de Aguiar <scorphus@gmail.com>
-Padraig Kitterick <padraigkitterick@gmail.com>
-Pallat Anchaleechamaikorn <yod.pallat@gmail.com>
-Palm Stone Games
-Paolo Giarrusso <p.giarrusso@gmail.com>
-Paolo Martini <mrtnpaolo@gmail.com>
-Parker Moore <parkrmoore@gmail.com>
-Pascal S. de Kloe <pascal@quies.net>
-Pat Moroney <pat@pat.email>
-Patrick Crosby <patrick@stathat.com>
-Patrick Gavlin <pgavlin@gmail.com>
-Patrick Higgins <patrick.allen.higgins@gmail.com>
-Patrick Lee <pattyshack101@gmail.com>
-Patrick Mézard <patrick@mezard.eu>
-Patrick Mylund Nielsen <patrick@patrickmn.com>
-Patrick Pelletier <pp.pelletier@gmail.com>
-Patrick Smith <pat42smith@gmail.com>
-Paul A Querna <paul.querna@gmail.com>
-Paul Boyd <boyd.paul2@gmail.com>
-Paul Hammond <paul@paulhammond.org>
-Paul Jolly <paul@myitcv.org.uk>
-Paul Lalonde <paul.a.lalonde@gmail.com>
-Paul Meyer <paul.meyer@microsoft.com>
-Paul PISCUC <paul.piscuc@gmail.com>
-Paul Querna <pquerna@apache.org>
-Paul Rosania <paul.rosania@gmail.com>
-Paul Ruest <pruest@gmail.com>
-Paul Sbarra <Sbarra.Paul@gmail.com>
-Paul Smith <paulsmith@pobox.com> <paulsmith@gmail.com>
-Paul Tyng <paul@paultyng.net>
-Paul van Brouwershaven <paul@vanbrouwershaven.com>
-Paulo Casaretto <pcasaretto@gmail.com>
-Pavel Paulau <pavel.paulau@gmail.com>
-Pavel Zinovkin <pavel.zinovkin@gmail.com>
-Pavlo Sumkin <ymkins@gmail.com>
-Pawel Knap <pawelknap88@gmail.com>
-Percy Wegmann <ox.to.a.cart@gmail.com>
-Perry Abbott <perry.j.abbott@gmail.com>
-Petar Maymounkov <petarm@gmail.com>
-Peter Armitage <peter.armitage@gmail.com>
-Peter Bourgon <peter@bourgon.org>
-Peter Conerly <pconerly@gmail.com>
-Peter Froehlich <peter.hans.froehlich@gmail.com>
-Peter Kleiweg <pkleiweg@xs4all.nl>
-Peter Moody <pmoody@uber.com>
-Peter Morjan <pmorjan@gmail.com>
-Peter Mundy <go.peter.90@gmail.com>
-Peter Nguyen <peter@mictis.com>
-Péter Surányi <speter.go1@gmail.com>
-Péter Szilágyi <peterke@gmail.com>
-Peter Teichman <pteichman@fastly.com>
-Peter Waldschmidt <peter@waldschmidt.com>
-Peter Waller <peter.waller@gmail.com>
-Peter Williams <pwil3058@gmail.com>
-Peter Zhang <i@ddatsh.com>
-Petrica Voicu <pvoicu@paypal.com>
-Phil Pearl <philip.j.r.pearl@gmail.com>
-Philip Børgesen <philip.borgesen@gmail.com>
-Philip Brown <phil@bolthole.com>
-Philip Hofer <phofer@umich.edu>
-Philip K. Warren <pkwarren@gmail.com>
-Philip Nelson <me@pnelson.ca>
-Pierre Durand <pierredurand@gmail.com>
-Pierre Prinetti <pierreprinetti@gmail.com>
-Pierre Roullon <pierre.roullon@gmail.com>
-Piers <google@hellopiers.pro>
-Pieter Droogendijk <pieter@binky.org.uk>
-Pietro Gagliardi <pietro10@mac.com>
-Piyush Mishra <piyush@codeitout.com>
-Platform.sh
-Pontus Leitzler <leitzler@gmail.com>
-Prasanga Siripala <pj@pjebs.com.au>
-Prashant Varanasi <prashant@prashantv.com>
-Pravendra Singh <hackpravj@gmail.com>
-Preetam Jinka <pj@preet.am>
-Qais Patankar <qaisjp@gmail.com>
-Qiuxuan Zhu <ilsh1022@gmail.com>
-Qualcomm Data Center, Inc.
-Quan Tran <qeed.quan@gmail.com>
-Quan Yong Zhai <qyzhai@gmail.com>
-Quentin Perez <qperez@ocs.online.net>
-Quentin Renard <contact@asticode.com>
-Quoc-Viet Nguyen <afelion@gmail.com>
-RackTop Systems Inc.
-Radek Sohlich <sohlich@gmail.com>
-Radu Berinde <radu@cockroachlabs.com>
-Rafal Jeczalik <rjeczalik@gmail.com>
-Raif S. Naffah <go@naffah-raif.name>
-RainTank
-Rajat Goel <rajat.goel2010@gmail.com>
-Rajath Agasthya <rajathagasthya@gmail.com>
-Rajender Reddy Kompally <rajenderreddykompally@gmail.com>
-Ralph Corderoy <ralph@inputplus.co.uk>
-Ramazan AYYILDIZ <rayyildiz@gmail.com>
-Raphael Geronimi <raphael.geronimi@gmail.com>
-Ravil Bikbulatov <weeellz12@gmail.com>
-RaviTeja Pothana <ravi.tezu@gmail.com>
-Ray Tung <rtung@thoughtworks.com>
-Raymond Kazlauskas <raima220@gmail.com>
-Red Hat, Inc.
-Reilly Watson <reillywatson@gmail.com>
-Reinaldo de Souza Jr <juniorz@gmail.com>
-Remi Gillig <remigillig@gmail.com>
-Rémy Oudompheng <oudomphe@phare.normalesup.org>
-Rens Rikkerink <Ikkerens@users.noreply.github.com>
-Ricardo Padilha <ricardospadilha@gmail.com>
-Richard Barnes <rlb@ipv.sx>
-Richard Crowley <r@rcrowley.org>
-Richard Dingwall <rdingwall@gmail.com>
-Richard Eric Gavaletz <gavaletz@gmail.com>
-Richard Gibson <richard.gibson@gmail.com>
-Richard Miller <miller.research@gmail.com>
-Richard Musiol <mail@richard-musiol.de>
-Rick Arnold <rickarnoldjr@gmail.com>
-Rick Sayre <whorfin@gmail.com>
-Risto Jaakko Saarelma <rsaarelm@gmail.com>
-Rob Norman <rob.norman@infinitycloud.com>
-Rob Phoenix <rob@robphoenix.com>
-Robert Daniel Kortschak <dan.kortschak@adelaide.edu.au> <dan@kortschak.io>
-Robert Dinu <r@varp.se>
-Robert Figueiredo <robfig@gmail.com>
-Robert Hencke <robert.hencke@gmail.com>
-Robert Obryk <robryk@gmail.com>
-Robert Stepanek <robert.stepanek@gmail.com>
-Robert-André Mauchin <zebob.m@gmail.com>
-Roberto Clapis <robclap8@gmail.com>
-Robin Eklind <r.eklind.87@gmail.com>
-Rodolfo Carvalho <rhcarvalho@gmail.com>
-Rodrigo Moraes de Oliveira <rodrigo.moraes@gmail.com>
-Rodrigo Rafael Monti Kochenburger <divoxx@gmail.com>
-Roger Pau Monné <royger@gmail.com>
-Roger Peppe <rogpeppe@gmail.com>
-Roland Shoemaker <rolandshoemaker@gmail.com>
-Roman Budnikov <romanyx90@yandex.ru>
-Ron Hashimoto <mail@h2so5.net>
-Ron Minnich <rminnich@gmail.com>
-Ross Chater <rdchater@gmail.com>
-Ross Light <rlight2@gmail.com>
-Rowan Marshall <rowanajmarshall@gmail.com>
-Rowan Worth <sqweek@gmail.com>
-Rudi Kramer <rudi.kramer@gmail.com>
-Russell Haering <russellhaering@gmail.com>
-Ryan Bagwell <ryanbagwell@outlook.com>
-Ryan Boehning <ryan.boehning@apcera.com>
-Ryan Canty <jrcanty@gmail.com>
-Ryan Hitchman <hitchmanr@gmail.com>
-Ryan Lower <rpjlower@gmail.com>
-Ryan Roden-Corrent <ryan@rcorre.net>
-Ryan Seys <ryan@ryanseys.com>
-Ryan Slade <ryanslade@gmail.com>
-Ryan Zhang <ryan.zhang@docker.com>
-Ryoichi KATO <ryo1kato@gmail.com>
-Ryuji Iwata <qt.luigi@gmail.com>
-Ryuma Yoshida <ryuma.y1117@gmail.com>
-Ryuzo Yamamoto <ryuzo.yamamoto@gmail.com>
-S.Çağlar Onur <caglar@10ur.org>
-Sabin Mihai Rapan <sabin.rapan@gmail.com>
-Sakeven Jiang <jc5930@sina.cn>
-Salmān Aljammāz <s@0x65.net>
-Sam Boyer <tech@samboyer.org>
-Sam Hug <samuel.b.hug@gmail.com>
-Sam Whited <sam@samwhited.com>
-Sami Pönkänen <sami.ponkanen@gmail.com>
-Samuele Pedroni <pedronis@lucediurna.net>
-Sanjay Menakuru <balasanjay@gmail.com>
-Sascha Brawer <sascha@brawer.ch>
-Sasha Sobol <sasha@scaledinference.com>
-Scott Barron <scott.barron@github.com>
-Scott Bell <scott@sctsm.com>
-Scott Crunkleton <crunk1@gmail.com>
-Scott Ferguson <scottwferg@gmail.com>
-Scott Lawrence <bytbox@gmail.com>
-Sean Rees <sean@erifax.org>
-Sebastien Binet <seb.binet@gmail.com>
-Sébastien Paolacci <sebastien.paolacci@gmail.com>
-Seiji Takahashi <timaki.st@gmail.com>
-Sergei Skorobogatov <skorobo@rambler.ru>
-Sergey 'SnakE'  Gromov <snake.scaly@gmail.com>
-Sergey Lukjanov <me@slukjanov.name>
-Sergey Mishin <sergeymishine@gmail.com>
-Sergey Mudrik <sergey.mudrik@gmail.com>
-Sergey Semin <gray12511@gmail.com>
-Sergio Luis O. B. Correia <sergio@correia.cc>
-Sergiusz Bazanski <bazanski@gmail.com>
-Seth Hoenig <seth.a.hoenig@gmail.com>
-Seth Vargo <sethvargo@gmail.com>
-Shahar Kohanim <skohanim@gmail.com>
-Shamil Garatuev <garatuev@gmail.com>
-Shane Hansen <shanemhansen@gmail.com>
-Shaozhen Ding <dsz0111@gmail.com>
-Shaun Dunning <shaun.dunning@uservoice.com>
-Shawn Smith <shawn.p.smith@gmail.com>
-Shenghou Ma <minux.ma@gmail.com>
-Shengyu Zhang <shengyu.zhang@chaitin.com>
-Shi Han Ng <shihanng@gmail.com>
-Shinji Tanaka <shinji.tanaka@gmail.com>
-Shintaro Kaneko <kaneshin0120@gmail.com>
-Shivakumar GN <shivakumar.gn@gmail.com>
-Silvan Jegen <s.jegen@gmail.com>
-Simon Jefford <simon.jefford@gmail.com>
-Simon Rawet <simon@rawet.se>
-Simon Thulbourn <simon+github@thulbourn.com>
-Simon Whitehead <chemnova@gmail.com>
-Sina Siadat <siadat@gmail.com>
-Sokolov Yura <funny.falcon@gmail.com>
-Song Gao <song@gao.io>
-Sourcegraph Inc
-Spencer Nelson <s@spenczar.com>
-Spring Mc <heresy.mc@gmail.com>
-Square, Inc.
-Sridhar Venkatakrishnan <sridhar@laddoo.net>
-StalkR <stalkr@stalkr.net>
-Stan Schwertly <stan@schwertly.com>
-Stanislav Afanasev <php.progger@gmail.com>
-Steeve Morin <steeve.morin@gmail.com>
-Stefan Nilsson <snilsson@nada.kth.se> <trolleriprofessorn@gmail.com>
-Stéphane Travostino <stephane.travostino@gmail.com>
-Stephen Lewis <stephen@sock.org.uk>
-Stephen McQuay <stephen@mcquay.me>
-Stephen Searles <stephens2424@gmail.com>
-Stephen Weinberg <stephen@q5comm.com>
-Steve Gilbert <stevegilbert23@gmail.com>
-Steve McCoy <mccoyst@gmail.com>
-Steve Phillips <elimisteve@gmail.com>
-Steve Streeting <steve@stevestreeting.com>
-Steven Elliot Harris <seharris@gmail.com>
-Steven Erenst <stevenerenst@gmail.com>
-Steven Hartland <steven.hartland@multiplay.co.uk>
-Steven Wilkin <stevenwilkin@gmail.com>
-Stripe, Inc.
-Sukrit Handa <sukrit.handa@utoronto.ca>
-Sunny <me@darkowlzz.space>
-Suriyaa Sundararuban <suriyaasundararuban@gmail.com>
-Suyash <dextrous93@gmail.com>
-Sven Almgren <sven@tras.se>
-Sylvain Zimmer <sylvain@sylvainzimmer.com>
-Syohei YOSHIDA <syohex@gmail.com>
-Szabolcs Nagy <nsz@port70.net>
-Taavi Kivisik <taavi.kivisik@gmail.com>
-Tad Fisher <tadfisher@gmail.com>
-Tad Glines <tad.glines@gmail.com>
-Tailscale Inc.
-Taj Khattra <taj.khattra@gmail.com>
-Takayoshi Nishida <takayoshi.nishida@gmail.com>
-Takeshi YAMANASHI <9.nashi@gmail.com>
-Takuya Ueda <uedatakuya@gmail.com>
-Tal Shprecher <tshprecher@gmail.com>
-Tamir Duberstein <tamird@gmail.com>
-Tao Wang <twang2218@gmail.com>
-Tarmigan Casebolt <tarmigan@gmail.com>
-Taro Aoki <aizu.s1230022@gmail.com>
-Taru Karttunen <taruti@taruti.net>
-Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
-Teague Cole <tnc1443@gmail.com>
-Ted Kornish <golang@tedkornish.com>
-Tejasvi Nareddy <tejunareddy@gmail.com>
-Teleport Inc.
-Terin Stock <terinjokes@gmail.com>
-Terrel Shumway <gopher@shumway.us>
-Tetsuo Kiso <tetsuokiso9@gmail.com>
-Thanabodee Charoenpiriyakij <wingyminus@gmail.com>
-Thanatat Tamtan <acoshift@gmail.com>
-Thiago Avelino <t@avelino.xxx>
-Thiago Fransosi Farina <thiago.farina@gmail.com>
-Thomas Alan Copeland <talan.copeland@gmail.com>
-Thomas Bonfort <thomas.bonfort@gmail.com>
-Thomas Bruyelle <thomas.bruyelle@gmail.com>
-Thomas de Zeeuw <thomasdezeeuw@gmail.com>
-Thomas Desrosiers <thomasdesr@gmail.com>
-Thomas Kappler <tkappler@gmail.com>
-Thomas Meson <zllak@hycik.org>
-Thomas Wanielista <tomwans@gmail.com>
-Thorben Krueger <thorben.krueger@gmail.com>
-Thordur Bjornsson <thorduri@secnorth.net>
-Tiago Queiroz <contato@tiago.eti.br>
-Tilman Dilo <tilman.dilo@gmail.com>
-Tim Cooijmans <timcooijmans@gmail.com>
-Tim Cooper <tim.cooper@layeh.com>
-Tim Ebringer <tim.ebringer@gmail.com>
-Tim Heckman <t@heckman.io>
-Tim Henderson <tim.tadh@gmail.com>
-Tim Wright <tenortim@gmail.com>
-Timo Savola <timo.savola@gmail.com>
-Timo Truyts <alkaloid.btx@gmail.com>
-Timothy Studd <tim@timstudd.com>
-Tobias Assarsson <tobias.assarsson@gmail.com>
-Tobias Columbus <tobias.columbus@gmail.com>
-Tobias Klauser <tklauser@distanz.ch>
-Todd Neal <todd@tneal.org>
-Tom Heng <zhm20070928@gmail.com>
-Tom Levy <tomlevy93@gmail.com>
-Tom Limoncelli <tal@whatexit.org>
-Tom Linford <tomlinford@gmail.com>
-Tom Payne <twpayne@gmail.com>
-Tom Thorogood <me+google@tomthorogood.co.uk>
-Tommy Schaefer <tommy.schaefer@teecom.com>
-Tomoya Ishizaki <zaq1tomo@gmail.com>
-Tonis Tiigi <tonistiigi@gmail.com>
-Tony Walker <walkert.uk@gmail.com>
-Tor Andersson <tor.andersson@gmail.com>
-Tormod Erevik Lea <tormodlea@gmail.com>
-Toshiki Shima <hayabusa1419@gmail.com>
-Totoro W <tw19881113@gmail.com>
-Travis Bischel <travis.bischel@gmail.com>
-Travis Cline <travis.cline@gmail.com>
-Trey Lawrence <lawrence.trey@gmail.com>
-Trey Roessig <trey.roessig@gmail.com>
-Trey Tacon <ttacon@gmail.com>
-Tristan Colgate <tcolgate@gmail.com>
-Tristan Ooohry <ooohry@gmail.com>
-Tristan Rice <rice@fn.lc>
-Troels Thomsen <troels@thomsen.io>
-Trung Nguyen <trung.n.k@gmail.com>
-Tudor Golubenco <tudor.g@gmail.com>
-Tugdual Saunier <tugdual.saunier@gmail.com>
-Tuo Shan <sturbo89@gmail.com>
-Tyler Bunnell <tylerbunnell@gmail.com>
-Tyler Treat <ttreat31@gmail.com>
-Uber Technologies
-Ugorji Nwoke <ugorji@gmail.com>
-Ulf Holm Nielsen <doktor@dyregod.dk>
-Ulrich Kunitz <uli.kunitz@gmail.com>
-Upthere, Inc.
-Uriel Mangado <uriel@berlinblue.org>
-Vadim Grek <vadimprog@gmail.com>
-Vadim Vygonets <unixdj@gmail.com>
-Vee Zhang <veezhang@126.com> <vveezhang@gmail.com>
-Vendasta
-Veselkov Konstantin <kostozyb@gmail.com>
-Victor Vrantchan <vrancean+github@gmail.com>
-Vignesh Ramachandra <vickyramachandra@gmail.com>
-Vincent Ambo <tazjin@googlemail.com>
-Vincent Batts <vbatts@hashbangbash.com> <vbatts@gmail.com>
-Vincent Vanackere <vincent.vanackere@gmail.com>
-Vinu Rajashekhar <vinutheraj@gmail.com>
-Vishvananda Ishaya <vishvananda@gmail.com>
-Vitor De Mario <vitordemario@gmail.com>
-Vladimir Mihailenco <vladimir.webdev@gmail.com>
-Vladimir Nikishenko <vova616@gmail.com>
-Vladimir Stefanovic <vladimir.stefanovic@imgtec.com>
-Vladimir Varankin <nek.narqo@gmail.com>
-VMware, Inc.
-Volker Dobler <dr.volker.dobler@gmail.com>
-W. Trevor King <wking@tremily.us>
-Wade Simmons <wade@wades.im>
-Wander Lairson Costa <wcosta@mozilla.com>
-Wayne Ashley Berry <wayneashleyberry@gmail.com>
-Weaveworks
-Wèi Cōngruì <crvv.mail@gmail.com>
-Wei Fu <fhfuwei@163.com>
-Wei Guangjing <vcc.163@gmail.com>
-Weichao Tang <tevic.tt@gmail.com>
-Weixie Cui <cuiweixie@gmail.com> <523516579@qq.com>
-Wembley G. Leach, Jr <wembley.gl@gmail.com>
-Will Faught <will.faught@gmail.com>
-Will Storey <will@summercat.com>
-Willem van der Schyff <willemvds@gmail.com>
-William Chang <mr.williamchang@gmail.com>
-William Josephson <wjosephson@gmail.com>
-William Orr <will@worrbase.com> <ay1244@gmail.com>
-Wisdom Omuya <deafgoat@gmail.com>
-Wu Yunzhou <yunzhouwu@gmail.com>
-Xi Ruoyao <xry23333@gmail.com>
-Xia Bin <snyh@snyh.org>
-Xing Xing <mikespook@gmail.com>
-Xu Fei <badgangkiller@gmail.com>
-Xudong Zhang <felixmelon@gmail.com>
-Xudong Zheng <7pkvm5aw@slicealias.com>
-Xuyang Kang <xuyangkang@gmail.com>
-Yahoo Inc.
-Yamagishi Kazutoshi <ykzts@desire.sh>
-Yann Kerhervé <yann.kerherve@gmail.com>
-Yann Salaün <yannsalaun1@gmail.com>
-Yao Zhang <lunaria21@gmail.com>
-Yasha Bubnov <girokompass@gmail.com>
-Yasuharu Goto <matope.ono@gmail.com>
-Yasuhiro Matsumoto <mattn.jp@gmail.com>
-Yasuyuki Oka <yasuyk@gmail.com>
-Yazen Shunnar <yazen.shunnar@gmail.com>
-Yestin Sun <ylh@pdx.edu>
-Yissakhar Z. Beck <yissakhar.beck@gmail.com>
-Yo-An Lin <yoanlin93@gmail.com>
-Yongjian Xu <i3dmaster@gmail.com>
-Yorman Arias <cixtords@gmail.com>
-Yoshiyuki Kanno <nekotaroh@gmail.com> <yoshiyuki.kanno@stoic.co.jp>
-Yoshiyuki Mineo <yoshiyuki.mineo@gmail.com>
-Yosuke Akatsuka <yosuke.akatsuka@gmail.com>
-Yuji Yaginuma <yuuji.yaginuma@gmail.com>
-Yukihiro Nishinaka <6elpinal@gmail.com>
-Yury Smolsky <yury@smolsky.by>
-Yusuke Kagiwada <block.rxckin.beats@gmail.com>
-Yuusei Kuwana <kuwana@kumama.org>
-Yuval Pavel Zholkover <paulzhol@gmail.com>
-Zac Bergquist <zbergquist99@gmail.com>
-Zach Bintliff <zbintliff@gmail.com>
-Zach Gershman <zachgersh@gmail.com>
-Zachary Gershman <zgershman@pivotal.io>
-Zak <zrjknill@gmail.com>
-Zakatell Kanda <hi@zkanda.io>
-Zellyn Hunter <zellyn@gmail.com>
-Zemanta d.o.o.
-Zev Goldstein <zev.goldstein@gmail.com>
-Zheng Dayu <davidzheng23@gmail.com>
-Zhongtao Chen <chenzhongtao@126.com>
-Zhou Guangyuan <zhouguangyuan.xian@gmail.com>
-Zhou Peng <p@ctriple.cn>
-Ziad Hatahet <hatahet@gmail.com>
-Zizhao Zhang <btw515wolf2@gmail.com>
-Zorion Arrizabalaga <zorionk@gmail.com>
-Максим Федосеев <max.faceless.frei@gmail.com>
-Роман Хавроненко <hagen1778@gmail.com>
-Тарас Буник <tbunyk@gmail.com>
-Фахриддин Балтаев <faxriddinjon@gmail.com>
-张嵩 <zs349596@gmail.com>
-申习之 <bronze1man@gmail.com>
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
deleted file mode 100644
index 48567ee..0000000
--- a/CONTRIBUTORS
+++ /dev/null
@@ -1,2860 +0,0 @@
-# This is the official list of people who can contribute
-# (and typically have contributed) code to the Go repository.
-# The AUTHORS file lists the copyright holders; this file
-# lists people.  For example, Google employees are listed here
-# but not in AUTHORS, because Google holds the copyright.
-#
-# Names should be added to this file only after verifying that
-# the individual or the individual's organization has agreed to
-# the appropriate Contributor License Agreement, found here:
-#
-#     http://code.google.com/legal/individual-cla-v1.0.html
-#     http://code.google.com/legal/corporate-cla-v1.0.html
-#
-# The agreement for individuals can be filled out on the web.
-
-# Names should be added to this file like so:
-#     Individual's name <submission email address>
-#     Individual's name <submission email address> <email2> <emailN>
-#
-# An entry with multiple email addresses specifies that the
-# first address should be used in the submit logs and
-# that the other addresses should be recognized as the
-# same person when interacting with Gerrit.
-
-# Please keep the list sorted.
-
-Aamir Khan <syst3m.w0rm@gmail.com>
-Aaron Beitch <aaronb@arista.com>
-Aaron Bieber <deftly@gmail.com>
-Aaron Cannon <cannona@fireantproductions.com>
-Aaron France <aaron.l.france@gmail.com>
-Aaron Jacobs <jacobsa@google.com>
-Aaron Jensen <jensen.aaro@gmail.com>
-Aaron Kemp <kemp.aaron@gmail.com>
-Aaron Patterson <tenderlove@ruby-lang.org>
-Aaron Sheah <aaronsheah@gmail.com>
-Aaron Stein <aaronstein12@gmail.com>
-Aaron Torres <tcboox@gmail.com>
-Aaron Zinman <aaron@azinman.com>
-Aarti Parikh <aarti.parikh@gmail.com>
-Abdullah Al Maruf <mymail.maruf@gmail.com>
-Abe Haskins <abeisgreat@abeisgreat.com>
-Abhinav Gupta <abhinav.g90@gmail.com>
-Adam Azarchs <adam.azarchs@10xgenomics.com>
-Adam Bender <abender@google.com>
-Adam Eijdenberg <adam@continusec.com>
-Adam Harvey <aharvey@php.net>
-Adam Kisala <adam.kisala@gmail.com>
-Adam Langley <agl@golang.org>
-Adam Medzinski <adam.medzinski@gmail.com>
-Adam Mitha <adam.mitha@gmail.com>
-Adam Shannon <adamkshannon@gmail.com>
-Adam Shelton <aashelt90@gmail.com>
-Adam Sindelar <adamsh@google.com>
-Adam Thomason <athomason@gmail.com>
-Adam Williams <pwnfactory@gmail.com>
-Adam Woodbeck <adam@woodbeck.net>
-Adarsh Ravichandran <adarshravichandran91@gmail.com>
-Adel Rodríguez <adel.rodriguez@leftfieldlabs.com>
-Adin Scannell <ascannell@google.com>
-Aditya Harindar <aditya.harindar@gmail.com>
-Aditya Mukerjee <dev@chimeracoder.net>
-Adrian Hesketh <adrianhesketh@hushmail.com>
-Adrian Nos <nos.adrian@gmail.com>
-Adrian O'Grady <elpollouk@gmail.com>
-Adrien Bustany <adrien-xx-google@bustany.org>
-Adrien Delorme <adrien.delorme@icloud.com>
-Adrien Petel <peteladrien@gmail.com>
-Aécio Júnior <aeciodantasjunior@gmail.com>
-Aeneas Rekkas (arekkas) <aeneas@ory.am>
-Afanasev Stanislav <phpprogger@gmail.com>
-Agis Anastasopoulos <agis.anast@gmail.com>
-Agniva De Sarker <agnivade@yahoo.co.in>
-Ahmed W. Mones <oneofone@gmail.com>
-Ahmet Aktürk <aakturk000@gmail.com>
-Ahmet Alp Balkan <ahmetb@google.com>
-Ahmet Soormally <ahmet@mangomm.co.uk>
-Ahmy Yulrizka <yulrizka@gmail.com>
-Ahsun Ahmed <ahmed.ahsun@gmail.com>
-Aidan Coyle <packrat386@gmail.com>
-Aiden Scandella <ai@uber.com>
-Ainar Garipov <gugl.zadolbal@gmail.com>
-Aishraj Dahal <aishraj@users.noreply.github.com>
-Ajanthan Balachandran <balaajanthan@gmail.com>
-Akhil Indurti <aindurti@gmail.com>
-Akihiro Suda <suda.kyoto@gmail.com>
-Akshat Kumar <seed@mail.nanosouffle.net>
-Al Cutter <al@google.com>
-Alan Braithwaite <alan@ipaddr.org>
-Alan Donovan <adonovan@google.com>
-Alan Shreve <alan@inconshreveable.com>
-Albert Nigmatzianov <albertnigma@gmail.com>
-Albert Strasheim <fullung@gmail.com>
-Albert Teoh <albert.teoh@gmail.com>
-Albert Yu <yukinying@gmail.com>
-Alberto Bertogli <albertito@blitiri.com.ar>
-Alberto Donizetti <alb.donizetti@gmail.com>
-Alberto García Hierro <alberto@garciahierro.com> <alberto.garcia.hierro@gmail.com>
-Alec Benzer <alec.benzer@gmail.com>
-Alejandro García Montoro <alejandro.garciamontoro@gmail.com>
-Aleksa Sarai <cyphar@cyphar.com>
-Aleksandar Dezelin <dezelin@gmail.com>
-Aleksandr Lukinykh <a.lukinykh@xsolla.com>
-Aleksandr Razumov <ar@cydev.ru>
-Alekseev Artem <a.artem060@gmail.com>
-Aleksei Tirman <aleksei.tirman@jetbrains.com>
-Alessandro Arzilli <alessandro.arzilli@gmail.com>
-Alessandro Baffa <alessandro.baffa@gmail.com>
-Alex A Skinner <alex@lx.lc>
-Alex Brainman <alex.brainman@gmail.com>
-Alex Bramley <abramley@google.com>
-Alex Browne <stephenalexbrowne@gmail.com>
-Alex Buchanan <buchanae@gmail.com>
-Alex Carol <alex.carol.c@gmail.com>
-Alex Gaynor <alex@alloy.us>
-Alex Harford <alex.harford@saucelabs.com>
-Alex Hays <alex.hays@leftfieldlabs.com>
-Alex Jin <toalexjin@gmail.com>
-Alex Kohler <alexjohnkohler@gmail.com>
-Alex Myasoedov <msoedov@gmail.com>
-Alex Opie <amtopie@gmail.com>
-Alex Plugaru <alex@plugaru.org> <alexandru.plugaru@gmail.com>
-Alex Schade <39062967+aschade92@users.noreply.github.com>
-Alex Schroeder <alex@gnu.org>
-Alex Sergeyev <abc@alexsergeyev.com>
-Alex Tokarev <aleksator@gmail.com>
-Alex Vaghin <crhyme@google.com>
-Alex Zhirov <azhirov@google.com>
-Alexander Demakin <alexander.demakin@gmail.com>
-Alexander Döring <email@alexd.ch>
-Alexander F Rødseth <alexander.rodseth@appeartv.com>
-Alexander Greim <alexxx@iltempo.de>
-Alexander Guz <kalimatas@gmail.com>
-Alexander Kauer <alexander@affine.space>
-Alexander Klauer <Alexander.Klauer@googlemail.com>
-Alexander Kucherenko <alxkchr@gmail.com>
-Alexander Larsson <alexander.larsson@gmail.com>
-Alexander Lourier <aml@rulezz.ru>
-Alexander Melentyev <alexander@melentyev.org>
-Alexander Menzhinsky <amenzhinsky@gmail.com>
-Alexander Morozov <lk4d4math@gmail.com>
-Alexander Neumann <alexander@bumpern.de>
-Alexander Nohe <alex.nohe427@gmail.com>
-Alexander Orlov <alexander.orlov@loxal.net>
-Alexander Pantyukhin <apantykhin@gmail.com>
-Alexander Polcyn <apolcyn@google.com>
-Alexander Rakoczy <alex@golang.org>
-Alexander Reece <awreece@gmail.com>
-Alexander Surma <surma@surmair.de>
-Alexander Yastrebov <yastrebov.alex@gmail.com>
-Alexander Zhavnerchik <alex.vizor@gmail.com>
-Alexander Zillion <alex@alexzillion.com>
-Alexander Zolotov <goldifit@gmail.com>
-Alexandr Mayorskiy <a.mayorskiy@corp.mail.ru>
-Alexandre Cesaro <alexandre.cesaro@gmail.com>
-Alexandre Fiori <fiorix@gmail.com>
-Alexandre Maari <draeron@gmail.com>
-Alexandre Normand <alexandre.normand@gmail.com>
-Alexandre Parentea <aubonbeurre@gmail.com>
-Alexandre Viau <alexandre@alexandreviau.net>
-Alexandru Moșoi <brtzsnr@gmail.com>
-Alexei Sholik <alcosholik@gmail.com>
-Alexey Alexandrov <aalexand@google.com>
-Alexey Borzenkov <snaury@gmail.com>
-Alexey Naidonov <alexey.naidyonov@gmail.com>
-Alexey Neganov <neganovalexey@gmail.com>
-Alexey Palazhchenko <alexey.palazhchenko@gmail.com>
-Alexey Semenyuk <alexsemenyuk88@gmail.com>
-Alexey Vilenskiy <bynovhack@gmail.com>
-Alexis Hildebrandt <surryhill@gmail.com>
-Alexis Hunt <lexer@google.com>
-Alexis Imperial-Legrand <ail@google.com>
-Ali Farooq <ali.farooq0@pm.me>
-Ali Rizvi-Santiago <arizvisa@gmail.com>
-Aliaksandr Valialkin <valyala@gmail.com>
-Alice Merrick <amerrick@google.com>
-Alif Rachmawadi <subosito@gmail.com>
-Allan Guwatudde <guwats10@gmail.com>
-Allan Simon <allan.simon@supinfo.com>
-Allen Li <ayatane@google.com>
-Alok Menghrajani <alok.menghrajani@gmail.com>
-Alwin Doss <alwindoss84@gmail.com>
-Aman Gupta <aman@tmm1.net>
-Amarjeet Anand <amarjeetanandsingh@gmail.com>
-Amelia Downs <adowns@vmware.com>
-Amir Mohammad Saied <amir@gluegadget.com>
-Amit Kumar <mittalmailbox@gmail.com>
-Amr Mohammed <merodiro@gmail.com>
-Amrut Joshi <amrut.joshi@gmail.com>
-An Long <aisk1988@gmail.com>
-An Xiao <hac@zju.edu.cn>
-Anand K. Mistry <anand@mistry.ninja>
-Ananya Saxena <ananyasaxena1@gmail.com>
-Anatol Pomozov <anatol.pomozov@gmail.com>
-Anders Pearson <anders@columbia.edu>
-Anderson Queiroz <contato@andersonq.eti.br>
-André Carvalho <asantostc@gmail.com>
-Andre Marianiello <andremarianiello@users.noreply.github.com>
-André Martins <aanm90@gmail.com>
-Andre Nathan <andrenth@gmail.com>
-Andrea Nodari <andrea.nodari91@gmail.com>
-Andrea Simonini <andrea.simonini@gmail.com>
-Andrea Spadaccini <spadaccio@google.com>
-Andreas Auernhammer <aead@mail.de>
-Andreas Jellinghaus <andreas@ionisiert.de> <anj@google.com>
-Andreas Litt <andreas.litt@gmail.com>
-Andrei Enshin <b1os@bk.ru>
-Andrei Gherzan <andrei@resin.io>
-Andrei Korzhevskii <a.korzhevskiy@gmail.com>
-Andrei Matei <andrei@cockroachlabs.com>
-Andrei Tudor Călin <mail@acln.ro>
-Andrei Vagin <avagin@google.com>
-Andrei Vieru <euvieru@gmail.com>
-Andres Erbsen <andreser@google.com>
-Andres Lowrie <andres.lowrie@gmail.com>
-Andrew Austin <andrewaclt@gmail.com>
-Andrew Balholm <andybalholm@gmail.com>
-Andrew Benton <andrewmbenton@gmail.com>
-Andrew Bonventre <andybons@chromium.org>
-Andrew Braunstein <awbraunstein@gmail.com>
-Andrew Bursavich <abursavich@gmail.com>
-Andrew Ekstedt <andrew.ekstedt@gmail.com>
-Andrew Etter <andrew.etter@gmail.com>
-Andrew G. Morgan <agm@google.com>
-Andrew Gerrand <adg@golang.org>
-Andrew Harding <andrew@spacemonkey.com>
-Andrew Jackura <ajackura@google.com>
-Andrew Kemm <andrewkemm@gmail.com>
-Andrew LeFevre <capnspacehook@gmail.com>
-Andrew Louis <alouis@digitalocean.com>
-Andrew Lutomirski <andy@luto.us>
-Andrew Medvedev <andrew.y.medvedev@gmail.com>
-Andrew Pilloud <andrewpilloud@igneoussystems.com>
-Andrew Pogrebnoy <absourd.noise@gmail.com>
-Andrew Poydence <apoydence@pivotal.io>
-Andrew Pritchard <awpritchard@gmail.com>
-Andrew Radev <andrey.radev@gmail.com>
-Andrew Skiba <skibaa@gmail.com>
-Andrew Stormont <astormont@racktopsystems.com>
-Andrew Stribblehill <ads@wompom.org>
-Andrew Szeto <andrew@jabagawee.com>
-Andrew Todd <andrew.todd@wework.com>
-Andrew Wansink <wansink@uber.com>
-Andrew Werner <andrew@upthere.com> <awerner32@gmail.com>
-Andrew Wilkins <axwalk@gmail.com>
-Andrew Williams <williams.andrew@gmail.com>
-Andrew Z Allen <me@andrewzallen.com>
-Andrey Bokhanko <andreybokhanko@gmail.com>
-Andrey Mirtchovski <mirtchovski@gmail.com>
-Andrey Petrov <andrey.petrov@shazow.net>
-Andrii Soldatenko <andrii.soldatenko@gmail.com>
-Andrii Soluk <isoluchok@gmail.com>
-Andriy Lytvynov <lytvynov.a.v@gmail.com>
-Andrzej Żeżel <andrii.zhezhel@gmail.com>
-Andy Balholm <andy@balholm.com>
-Andy Davis <andy@bigandian.com>
-Andy Finkenstadt <afinkenstadt@zynga.com>
-Andy Lindeman <andy@lindeman.io>
-Andy Maloney <asmaloney@gmail.com>
-Andy Pan <panjf2000@gmail.com> <panjf2000@golangcn.org> <i@andypan.me>
-Andy Walker <walkeraj@gmail.com>
-Andy Wang <cbeuw.andy@gmail.com>
-Andy Williams <andy@andy.xyz>
-Andy Zhao <andyzhao@google.com>
-Andzej Maciusovic <andzej.maciusovic@gmail.com>
-Anfernee Yongkun Gui <anfernee.gui@gmail.com>
-Angelo Bulfone <mbulfone@gmail.com>
-Anh Hai Trinh <anh.hai.trinh@gmail.com>
-Anit Gandhi <anitgandhi@gmail.com>
-Ankit Goyal <ankit3goyal@gmail.com>
-Anmol Sethi <anmol@aubble.com>
-Annirudh Prasad <annirudh@wandb.com>
-Anschel Schaffer-Cohen <anschelsc@gmail.com>
-Anthony Alves <cvballa3g0@gmail.com>
-Anthony Canino <anthony.canino1@gmail.com>
-Anthony Eufemio <anthony.eufemio@gmail.com>
-Anthony Fok <foka@debian.org>
-Anthony Martin <ality@pbrane.org>
-Anthony Sottile <asottile@umich.edu>
-Anthony Starks <ajstarks@gmail.com>
-Anthony Voutas <voutasaurus@gmail.com>
-Anthony Woods <awoods@raintank.io>
-Antoine GIRARD <sapk@sapk.fr>
-Antoine Martin <antoine97.martin@gmail.com>
-Anton Gyllenberg <anton@iki.fi>
-Anton Kuklin <anton.a.kuklin@gmail.com>
-Antonin Amand <antonin.amand@gmail.com>
-Antonio Antelo <aantelov87@gmail.com>
-Antonio Bibiano <antbbn@gmail.com>
-Antonio Garcia <garcia.olais@gmail.com>
-Antonio Huete Jimenez <tuxillo@quantumachine.net>
-Antonio Murdaca <runcom@redhat.com>
-Antonio Ojea <antonio.ojea.garcia@gmail.com>
-Antonio Troina <thoeni@gmail.com>
-Anze Kolar <me@akolar.com>
-Aofei Sheng <aofei@aofeisheng.com>
-Apisak Darakananda <pongad@gmail.com>
-Aram Hăvărneanu <aram@mgk.ro>
-Araragi Hokuto <kanseihonbucho@protonmail.com>
-Arash Bina <arash@arash.io>
-Archana Ravindar <aravind5@in.ibm.com>
-Arda Güçlü <ardaguclu@gmail.com>
-Areski Belaid <areski@gmail.com>
-Ariel Mashraki <ariel@mashraki.co.il>
-Arkadi Pyuro <arkadi@google.com>
-Arlo Breault <arlolra@gmail.com>
-Arnaud Ysmal <arnaud.ysmal@gmail.com>
-Arne Hormann <arnehormann@gmail.com>
-Arnout Engelen <arnout@bzzt.net>
-Aron Nopanen <aron.nopanen@gmail.com>
-Arran Walker <arran.walker@fiveturns.org>
-Artem Alekseev <artem.alekseev@intel.com>
-Artem Khvastunov <artem.khvastunov@jetbrains.com>
-Artem Kolin <artemkaxboy@gmail.com>
-Arthur Fabre <arthur@arthurfabre.com>
-Arthur Khashaev <arthur@khashaev.ru>
-Artur M. Wolff <artur.m.wolff@gmail.com>
-Artyom Pervukhin <artyom.pervukhin@gmail.com>
-Arvindh Rajesh Tamilmani <art@a-30.net>
-Ashish Bhate <ab.listsubs@gmail.com>
-Ashish Gandhi <ag@ashishgandhi.org>
-Asim Shankar <asimshankar@gmail.com>
-Assel Meher <asselmeher@gmail.com>
-Atin Malaviya <amalaviy@akamai.com>
-Ato Araki <ato.araki@gmail.com>
-Atsushi Toyama <atsushi.tohyama.160.333@gmail.com>
-Audrey Lim <audreylh@gmail.com>
-Audrius Butkevicius <audrius.butkevicius@gmail.com>
-Augusto Roman <aroman@gmail.com>
-Aulus Egnatius Varialus <varialus@gmail.com>
-Aurélien Rainone <aurelien.rainone@gmail.com>
-Aurélio A. Heckert <aurium@gmail.com>
-Austin Clements <austin@google.com> <aclements@csail.mit.edu>
-Avi Flax <avi@timehop.com>
-Aviv Klasquin Komissar <avivklas@gmail.com>
-awaw fumin <awawfumin@gmail.com>
-Awn Umar <awn@cryptolosophy.io>
-Axel Wagner <axel.wagner.hh@googlemail.com>
-Ayan George <ayan@ayan.net>
-Ayanamist Yang <ayanamist@gmail.com>
-Ayke van Laethem <aykevanlaethem@gmail.com>
-Aymerick Jéhanne <aymerick@jehanne.org>
-Ayzat Sadykov <ayzat.ziko.93@gmail.com>
-Azat Kaumov <kaumov.a.r@gmail.com>
-Baiju Muthukadan <baiju.m.mail@gmail.com>
-Balaram Makam <bmakam.qdt@qualcommdatacenter.com>
-Balazs Lecz <leczb@google.com>
-Baokun Lee <nototon@gmail.com> <bk@golangcn.org>
-Barnaby Keene <accounts@southcla.ws>
-Bartłomiej Klimczak <bartlomiej.klimczak88@gmail.com>
-Bartosz Grzybowski <melkorm@gmail.com>
-Bartosz Oler <brtsz@google.com>
-Bassam Ojeil <bojeil@google.com>
-Bastian Ike <bastian.ike@gmail.com>
-Ben Burkert <ben@benburkert.com>
-Ben Cartwright-Cox <Ben@Benjojo.co.uk>
-Ben Eitzen <eitzenb@golang.org>
-Ben Fried <ben.fried@gmail.com>
-Ben Haines <bhainesva@gmail.com>
-Ben Hoyt <benhoyt@gmail.com>
-Ben Hutchings <ben.hutchings@essensium.com>
-Ben Kraft <benkraft@khanacademy.org>
-Ben Laurie <ben@links.org> <benl@google.com>
-Ben Lubar <ben.lubar@gmail.com>
-Ben Lynn <benlynn@gmail.com>
-Ben Olive <sionide21@gmail.com>
-Ben Schwartz <bemasc@google.com>
-Ben Shi <powerman1st@163.com>
-Ben Toews <mastahyeti@gmail.com>
-Benjamin Barenblat <bbaren@google.com>
-Benjamin Black <b@b3k.us>
-Benjamin Cable <cable.benjamin@gmail.com>
-Benjamin Hsieh <tanookiben@users.noreply.github.com>
-Benjamin Peterson <benjamin@python.org>
-Benjamin Prosnitz <bprosnitz@google.com>
-Benjamin Wester <bwester@squareup.com>
-Benjamin Wuethrich <benjamin.wuethrich@gmail.com>
-Benny Siegert <bsiegert@gmail.com>
-Benoit Sigoure <tsunanet@gmail.com>
-Berengar Lehr <Berengar.Lehr@gmx.de>
-Berkant Ipek <41230766+0xbkt@users.noreply.github.com>
-Beth Brown <ecbrown@google.com>
-Bharath Kumar Uppala <uppala.bharath@gmail.com>
-Bharath Thiruveedula <tbharath91@gmail.com>
-Bhavin Gandhi <bhavin7392@gmail.com>
-Bill Neubauer <wcn@golang.org> <wcn@google.com> <bill.neubauer@gmail.com>
-Bill O'Farrell <billo@ca.ibm.com>
-Bill Prin <waprin@google.com>
-Bill Thiede <couchmoney@gmail.com>
-Bill Zissimopoulos <billziss@navimatics.com>
-Billie Harold Cleek <bhcleek@gmail.com>
-Billy Lynch <wlynch@google.com>
-Billy Zaelani Malik <m.billyzaelani@gmail.com>
-Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
-Bjorn Tillenius <bjorn@tillenius.me>
-Bjorn Tipling <bjorn.tipling@gmail.com>
-Blain Smith <rebelgeek@blainsmith.com>
-Blake Gentry <blakesgentry@gmail.com>
-Blake Mesdag <blakemesdag@gmail.com>
-Blake Mizerany <blake.mizerany@gmail.com>
-Blixt <me@blixt.nyc>
-Bob Briski <rbriski@gmail.com>
-Bob McNaughton <bobmcn@gmail.com>
-Bob Potter <bobby.potter@gmail.com>
-Bobby DeSimone <bobbydesimone@gmail.com>
-Bobby Powers <bobbypowers@gmail.com>
-Boqin Qin <bobbqqin@gmail.com>
-Boris Nagaev <nagaev@google.com>
-Borja Clemente <borja.clemente@gmail.com>
-Boshi Lian <bolian@microsoft.com>
-Brad Burch <brad.burch@gmail.com>
-Brad Erickson <bderickson@gmail.com>
-Brad Fitzpatrick <bradfitz@golang.org> <bradfitz@gmail.com>
-Brad Garcia <bgarcia@golang.org>
-Brad Jones <rbjones@google.com>
-Brad Morgan <brad@morgabra.com>
-Brad Whitaker <bwhitaker@fastly.com>
-Braden Bassingthwaite <bbassingthwaite@vendasta.com>
-Bradford Lamson-Scribner <brad.lamson@gmail.com>
-Bradley Falzon <brad@teambrad.net>
-Brady Catherman <brady@gmail.com>
-Brady Sullivan <brady@bsull.com>
-Branden J. Brown <zephyrtronium@gmail.com>
-Brandon Bennett <bbennett@fb.com>
-Brandon Gilmore <varz@google.com>
-Brandon Philips <brandon@ifup.org>
-Brandon Ryan <bjryan19@gmail.com>
-Brave Cow <rsr715@gmail.com>
-Brayden Cloud <bcloud@google.com>
-Brendan Daniel Tracey <tracey.brendan@gmail.com>
-Brendan O'Dea <bod@golang.org>
-Brett Cannon <bcannon@gmail.com>
-Brett Merrill <brett.j.merrill94@gmail.com>
-Brian Dellisanti <briandellisanti@gmail.com>
-Brian Downs <brian.downs@gmail.com>
-Brian Falk <falk@logicparty.org>
-Brian G. Merrell <bgmerrell@gmail.com>
-Brian Gitonga Marete <marete@toshnix.com> <bgmarete@gmail.com> <bgm@google.com>
-Brian Kennedy <btkennedy@gmail.com>
-Brian Kessler <brian.m.kessler@gmail.com>
-Brian Ketelsen <bketelsen@gmail.com>
-Brian Slesinsky <skybrian@google.com>
-Brian Smith <ohohvi@gmail.com>
-Brian Starke <brian.starke@gmail.com>
-Bruce Huang <helbingxxx@gmail.com>
-Bryan Alexander <Kozical@msn.com>
-Bryan Boreham <bjboreham@gmail.com>
-Bryan C. Mills <bcmills@google.com>
-Bryan Chan <bryan.chan@ca.ibm.com>
-Bryan Ford <brynosaurus@gmail.com>
-Bryan Heden <b.heden@gmail.com>
-Bulat Gaifullin <gaifullinbf@gmail.com>
-Burak Guven <bguven@gmail.com>
-Caine Tighe <arctanofyourface@gmail.com>
-Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
-Caleb Martinez <accounts@calebmartinez.com>
-Caleb Spare <cespare@gmail.com>
-Carl Chatfield <carlchatfield@gmail.com>
-Carl Henrik Lunde <chlunde@ifi.uio.no>
-Carl Jackson <carl@stripe.com>
-Carl Johnson <me@carlmjohnson.net>
-Carl Mastrangelo <notcarl@google.com>
-Carl Menezes <carleeto@gmail.com>
-Carl Shapiro <cshapiro@google.com> <cshapiro@golang.org>
-Carlisia Campos <carlisia@grokkingtech.io>
-Carlo Alberto Ferraris <cafxx@strayorange.com>
-Carlos Alexandro Becker <caarlos0@gmail.com>
-Carlos Amedee <carlos@golang.org>
-Carlos Castillo <cookieo9@gmail.com>
-Carlos Cirello <uldericofilho@gmail.com>
-Carlos Eduardo <me@carlosedp.com>
-Carlos Eduardo Seo <cseo@linux.vnet.ibm.com>
-Carlos Iriarte <ciriarte@gmail.com>
-Carlos Souza <carloshrsouza@gmail.com>
-Carolyn Van Slyck <me@carolynvanslyck.com>
-Carrie Bynon <cbynon@gmail.com>
-Carson Hoffman <c@rsonhoffman.com>
-Cary Hull <chull@google.com>
-Case Nelson <case.nelson@gmail.com>
-Casey Callendrello <squeed@gmail.com>
-Casey Marshall <casey.marshall@gmail.com>
-Catalin Nicutar <cnicutar@google.com>
-Catalin Patulea <catalinp@google.com>
-Cathal O'Callaghan <cathalsocallaghan@gmail.com>
-Cedric Staub <cs@squareup.com>
-Cezar Sá Espinola <cezarsa@gmail.com>
-Chad Rosier <mrosier.qdt@qualcommdatacenter.com>
-ChaiShushan <chaishushan@gmail.com>
-Changkun Ou <hi@changkun.us>
-Channing Kimble-Brown <channing@golang.org>
-Chao Xu <xuchao@google.com>
-Chaoqun Han <hanssccv@gmail.com>
-Charles Fenwick Elliott <Charles@FenwickElliott.io>
-Charles Kenney <charlesc.kenney@gmail.com>
-Charles L. Dorian <cldorian@gmail.com>
-Charles Lee <zombie.fml@gmail.com>
-Charles Weill <weill@google.com>
-Charlie Getzen <charlie@bolt.com>
-Charlie Moog <moogcharlie@gmail.com>
-Charlotte Brandhorst-Satzkorn <catzkorn@gmail.com>
-Chauncy Cullitan <chauncyc@google.com>
-Chen Zhidong <njutczd@gmail.com>
-Chen Zhihan <energiehund@gmail.com>
-Cheng Wang <wangchengiscool@gmail.com>
-Cherry Mui <cherryyz@google.com>
-Chew Choon Keat <choonkeat@gmail.com>
-Chia-Chi Hsu <wuchi5457@gmail.com>
-Chiawen Chen <golopot@gmail.com>
-Chirag Sukhala <cchirag77@gmail.com>
-Cholerae Hu <choleraehyq@gmail.com>
-Chotepud Teo <AlexRouSg@users.noreply.github.com>
-Chressie Himpel <chressie@google.com>
-Chris Ball <chris@printf.net>
-Chris Biscardi <chris@christopherbiscardi.com>
-Chris Broadfoot <cbro@golang.org>
-Chris Dollin <ehog.hedge@gmail.com>
-Chris Farmiloe <chrisfarms@gmail.com>
-Chris Hines <chris.cs.guy@gmail.com>
-Chris Howey <howeyc@gmail.com>
-Chris Hundt <hundt@google.com>
-Chris Jones <chris@cjones.org> <chris.jones.yar@gmail.com>
-Chris Kastorff <encryptio@gmail.com>
-Chris Le Roy <brompwnie@users.noreply.github.com>
-Chris Lennert <calennert@gmail.com>
-Chris Liles <caveryliles@gmail.com>
-Chris Manghane <cmang@golang.org>
-Chris Marchesi <chrism@vancluevertech.com>
-Chris McGee <sirnewton_01@yahoo.ca> <newton688@gmail.com>
-Chris Raynor <raynor@google.com>
-Chris Roche <rodaine@gmail.com>
-Chris Smith <chrsmith@users.noreply.github.com>
-Chris Stockton <chrisstocktonaz@gmail.com>
-Chris Taylor <taylorza@gmail.com>
-Chris Waldon <christopher.waldon.dev@gmail.com>
-Chris Zou <chriszou@ca.ibm.com>
-Christian Alexander <christian@linux.com>
-Christian Couder <chriscool@tuxfamily.org>
-Christian Himpel <chressie@googlemail.com> <chressie@gmail.com>
-Christian Muehlhaeuser <muesli@gmail.com>
-Christian Pellegrin <chri@evolware.org>
-Christian R. Petrin <christianpetrin@gmail.com>
-Christian Svensson <blue@cmd.nu>
-Christine Hansmann <chhansmann@gmail.com>
-Christoffer Buchholz <christoffer.buchholz@gmail.com>
-Christoph Blecker <admin@toph.ca>
-Christoph Hack <christoph@tux21b.org>
-Christopher Cahoon <chris.cahoon@gmail.com>
-Christopher Guiney <chris@guiney.net>
-Christopher Henderson <chris@chenderson.org>
-Christopher Hlubek <christopher.hlubek@networkteam.com>
-Christopher Koch <chrisko@google.com>
-Christopher Loessl <cloessl+github@gmail.com>
-Christopher Nelson <nadiasvertex@gmail.com>
-Christopher Nielsen <m4dh4tt3r@gmail.com>
-Christopher Redden <christopher.redden@gmail.com>
-Christopher Swenson <cswenson@google.com>
-Christopher Thomas <53317512+chrisssthomas@users.noreply.github.com>
-Christopher Wedgwood <cw@f00f.org>
-Christos Zoulas <christos@zoulas.com> <zoulasc@gmail.com>
-Christy Perez <christy@linux.vnet.ibm.com>
-CL Sung <clsung@gmail.com> <cl_sung@htc.com>
-Clément Chigot <clement.chigot@atos.net>
-Clement Skau <clementskau@gmail.com>
-Clint J. Edwards <clint.j.edwards@gmail.com>
-Cody Oss <the.cody.oss@gmail.com>
-Colby Ranger <cranger@google.com>
-Colin Arnott <colin@urandom.co.uk>
-Colin Cross <ccross@android.com>
-Colin Edwards <colin@recursivepenguin.com>
-Colin Kennedy <moshen.colin@gmail.com>
-Colin Nelson <colnnelson@google.com>
-Colin Rice <clr@google.com>
-Conrad Irwin <conrad.irwin@gmail.com>
-Conrad Meyer <cemeyer@cs.washington.edu>
-Conrado Gouvea <conradoplg@gmail.com>
-Constantin Konstantinidis <constantinkonstantinidis@gmail.com>
-Corey Thomasson <cthom.lists@gmail.com>
-Corne van der Plas <vdplas@gmail.com>
-Cosmos Nicolaou <cnicolaou@google.com>
-Costin Chirvasuta <ctin@google.com>
-Craig Citro <craigcitro@google.com>
-Cristian Staretu <unclejacksons@gmail.com>
-Cristo García <cgg.code@gmail.com>
-cui fliter <imcusg@gmail.com>
-Cuihtlauac ALVARADO <cuihtlauac.alvarado@orange.com>
-Cuong Manh Le <cuong@orijtech.com>
-Curtis La Graff <curtis@lagraff.me>
-Cyrill Schumacher <cyrill@schumacher.fm>
-Dai Jie <gzdaijie@gmail.com>
-Dai Wentao <dwt136@gmail.com>
-Daisuke Fujita <dtanshi45@gmail.com>
-Daisuke Suzuki <daisuzu@gmail.com>
-Daker Fernandes Pinheiro <daker.fernandes.pinheiro@intel.com>
-Damian Gryski <dgryski@gmail.com>
-Damien Lespiau <damien.lespiau@gmail.com> <damien.lespiau@intel.com>
-Damien Mathieu <42@dmathieu.com>
-Damien Neil <dneil@google.com>
-Damien Tournoud <damien@platform.sh>
-Dan Ballard <dan@mindstab.net>
-Dan Caddigan <goldcaddy77@gmail.com>
-Dan Callahan <dan.callahan@gmail.com>
-Dan Harrington <harringtond@google.com>
-Dan Jacques <dnj@google.com>
-Dan Johnson <computerdruid@google.com>
-Dan McArdle <dmcardle@google.com>
-Dan Peterson <dpiddy@gmail.com>
-Dan Pupius <dan@medium.com>
-Dan Scales <danscales@google.com>
-Dan Sinclair <dan.sinclair@gmail.com>
-Daniel Cohen <dcohen@gatech.edu>
-Daniel Cormier <danielc@knowbe4.com>
-Daniël de Kok <me@danieldk.eu>
-Daniel Fleischman <danielfleischman@gmail.com>
-Daniel Ingram <ingramds@appstate.edu>
-Daniel Johansson <dajo2002@gmail.com>
-Daniel Kerwin <d.kerwin@gini.net>
-Daniel Kessler <dkess@google.com>
-Daniel Krech <eikeon@eikeon.com>
-Daniel Kumor <rdkumor@gmail.com>
-Daniel Langner <s8572327@gmail.com>
-Daniel Lidén <daniel.liden.87@gmail.com>
-Daniel Lublin <daniel@lublin.se>
-Daniel Mangum <georgedanielmangum@gmail.com>
-Daniel Marshall <daniel.marshall2@ibm.com>
-Daniel Martí <mvdan@mvdan.cc>
-Daniel McCarney <cpu@letsencrypt.org>
-Daniel Morsing <daniel.morsing@gmail.com>
-Daniel Nadasi <dnadasi@google.com>
-Daniel Nephin <dnephin@gmail.com>
-Daniel Ortiz Pereira da Silva <daniel.particular@gmail.com>
-Daniel S. Fava <danielsfava@gmail.com>
-Daniel Skinner <daniel@dasa.cc>
-Daniel Speichert <daniel@speichert.pl>
-Daniel Theophanes <kardianos@gmail.com>
-Daniel Upton <daniel@floppy.co>
-Daniela Petruzalek <daniela.petruzalek@gmail.com>
-Danish Dua <danishdua@google.com>
-Danish Prakash <grafitykoncept@gmail.com>
-Danny Rosseau <daniel.rosseau@gmail.com>
-Daria Kolistratova <daria.kolistratova@intel.com>
-Darien Raymond <admin@v2ray.com>
-Darren Elwood <darren@textnode.com>
-Darren Grant <darren.e.grant@gmail.com>
-Darren McCleary <darren.rmc@gmail.com>
-Darshan Parajuli <parajulidarshan@gmail.com>
-Datong Sun <dndx@idndx.com>
-Dave Borowitz <dborowitz@google.com>
-Dave Bort <dbort@golang.org>
-Dave Cheney <dave@cheney.net>
-Dave Day <djd@golang.org>
-Dave Grijalva <dgrijalva@ngmoco.com>
-Dave MacFarlane <driusan@gmail.com>
-Dave Pifke <dave@pifke.org>
-Dave Russell <forfuncsake@gmail.com>
-David Anderson <danderson@google.com>
-David Barnett <dbarnett@google.com>
-David Benjamin <davidben@google.com>
-David Black <dblack@atlassian.com>
-David Bond <davidsbond93@gmail.com>
-David Brophy <dave@brophy.uk>
-David Bürgin <676c7473@gmail.com>
-David Calavera <david.calavera@gmail.com>
-David Carlier <devnexen@gmail.com>
-David Carter <fresco.raja@gmail.com>
-David Chase <drchase@google.com>
-David Covert <davidhcovert@gmail.com>
-David Crawshaw <david.crawshaw@zentus.com> <crawshaw@google.com> <crawshaw@golang.org>
-David du Colombier <0intro@gmail.com>
-David Finkel <david.finkel@gmail.com>
-David Forsythe <dforsythe@gmail.com>
-David G. Andersen <dave.andersen@gmail.com>
-David Glasser <glasser@meteor.com>
-David Golden <david@autopragmatic.com>
-David Heuschmann <heuschmann.d@gmail.com>
-David Howden <dhowden@gmail.com>
-David Hubbard <dsp@google.com>
-David Jakob Fritz <david.jakob.fritz@gmail.com>
-David Jones <dxjones@gmail.com>
-David Lazar <lazard@golang.org>
-David Leon Gil <coruus@gmail.com>
-David McLeish <davemc@google.com>
-David Ndungu <dnjuguna@gmail.com>
-David NewHamlet <david@newhamlet.com>
-David Presotto <presotto@gmail.com>
-David Qu <davidqu12345@gmail.com>
-David R. Jenni <david.r.jenni@gmail.com>
-David Sansome <me@davidsansome.com>
-David Stainton <dstainton415@gmail.com>
-David Symonds <dsymonds@golang.org>
-David Thomas <davidthomas426@gmail.com>
-David Timm <dtimm@pivotal.io>
-David Titarenco <david.titarenco@gmail.com>
-David Tolpin <david.tolpin@gmail.com>
-David Url <david@urld.io>
-David Volquartz Lebech <david@lebech.info>
-David Wimmer <davidlwimmer@gmail.com>
-Davies Liu <davies.liu@gmail.com>
-Davor Kapsa <davor.kapsa@gmail.com>
-Dean Eigenmann <7621705+decanus@users.noreply.github.com>
-Dean Prichard <dean.prichard@gmail.com>
-Deepak Jois <deepak.jois@gmail.com>
-Deepak S <deepakspavoodath@gmail.com>
-Denis Bernard <db047h@gmail.com>
-Denis Brandolini <denis.brandolini@gmail.com>
-Denis Isaev <idenx@yandex.com>
-Denis Nagorny <denis.nagorny@intel.com>
-Dennis Kuhnert <mail.kuhnert@gmail.com>
-Denys Honsiorovskyi <honsiorovskyi@gmail.com>
-Denys Smirnov <denis.smirnov.91@gmail.com>
-Derek Buitenhuis <derek.buitenhuis@gmail.com>
-Derek Che <drc@yahoo-inc.com>
-Derek McGowan <derek@mcgstyle.net>
-Derek Parker <parkerderek86@gmail.com>
-Derek Phan <derekphan94@gmail.com>
-Derek Shockey <derek.shockey@gmail.com>
-Dev Ojha <dojha12@gmail.com>
-Dev Zhoujun <dev.zhoujun@gmail.com>
-Devon H. O'Dell <devon.odell@gmail.com>
-Dhaivat Pandit <dhaivatpandit@gmail.com>
-Dhananjay Nakrani <dhananjayn@google.com>
-Dhiru Kholia <dhiru.kholia@gmail.com>
-Dhruvdutt Jadhav <dhruvdutt.jadhav@gmail.com>
-Di Xiao <dixiao@google.com>
-Didier Spezia <didier.06@gmail.com>
-Diego Medina <fmpwizard@gmail.com>
-Diego Siqueira <diego9889@gmail.com>
-Dieter Plaetinck <dieter@raintank.io>
-Dilyn Corner <dilyn.corner@gmail.com>
-Dimitri Sokolyuk <sokolyuk@gmail.com>
-Dimitri Tcaciuc <dtcaciuc@gmail.com>
-Dina Garmash <dgrmsh@gmail.com>
-Diogo Pinela <diogoid7400@gmail.com>
-Dirk Gadsden <dirk@esherido.com>
-Diwaker Gupta <diwakergupta@gmail.com>
-Dmitri Goutnik <dgoutnik@gmail.com>
-Dmitri Popov <operator@cv.dp-net.com>
-Dmitri Shuralyov <dmitshur@golang.org> <dmitri@shuralyov.com>
-Dmitrii Okunev <xaionaro@gmail.com>
-Dmitriy Cherchenko <dcherchenko@gmail.com>
-Dmitriy Dudkin <dudkin.dmitriy@gmail.com>
-Dmitriy Shelenin <deemok@googlemail.com> <deemok@gmail.com>
-Dmitriy Vyukov <dvyukov@google.com>
-Dmitry Chestnykh <dchest@gmail.com>
-Dmitry Doroginin <doroginin@gmail.com>
-Dmitry Mottl <dmitry.mottl@gmail.com>
-Dmitry Neverov <dmitry.neverov@gmail.com>
-Dmitry Savintsev <dsavints@gmail.com>
-Dmitry Yakunin <nonamezeil@gmail.com>
-Dmytro Shynkevych <dm.shynk@gmail.com>
-Doga Fincan <doga@icloud.com>
-Domas Tamašauskas <puerdomus@gmail.com>
-Domen Ipavec <domen@ipavec.net>
-Dominic Della Valle <ddvpublic@Gmail.com>
-Dominic Green <dominicgreen1@gmail.com>
-Dominik Honnef <dominik.honnef@gmail.com>
-Dominik Vogt <vogt@linux.vnet.ibm.com>
-Don Byington <don@dbyington.com>
-Donald Huang <don.hcd@gmail.com>
-Dong-hee Na <donghee.na92@gmail.com>
-Donovan Hide <donovanhide@gmail.com>
-Doug Anderson <douga@google.com>
-Doug Fawley <dfawley@google.com>
-Douglas Danger Manley <doug.manley@gmail.com>
-Drew Flower <drewvanstone@gmail.com>
-Drew Hintz <adhintz@google.com>
-Drew Richardson <drewrichardson@gmail.com>
-Duco van Amstel <duco.vanamstel@gmail.com>
-Duncan Holm <mail@frou.org>
-Dustin Carlino <dcarlino@google.com>
-Dustin Herbison <djherbis@gmail.com>
-Dustin Long <dustmop@gmail.com>
-Dustin Sallings <dsallings@gmail.com>
-Dustin Shields-Cloues <dcloues@gmail.com>
-Dustin Spicuzza <dustin.spicuzza@gmail.com>
-Dvir Volk <dvir@everything.me> <dvirsky@gmail.com>
-Dylan Waits <dylan@waits.io>
-Ed Schouten <ed@nuxi.nl>
-Edan Bedrik <3d4nb3@gmail.com>
-Eddie Scholtz <escholtz@google.com>
-Eden Li <eden.li@gmail.com>
-Eduard Urbach <e.urbach@gmail.com>
-Eduardo Ramalho <eduardo.ramalho@gmail.com>
-Eduardo Villaseñor <evillasrmx@gmail.com>
-Edward Muller <edwardam@interlix.com>
-Egon Elbre <egonelbre@gmail.com>
-Ehren Kret <ehren.kret@gmail.com>
-Eitan Adler <lists@eitanadler.com>
-Eivind Uggedal <eivind@uggedal.com>
-El Mostafa Idrassi <el.mostafa.idrassi@gmail.com>
-Elbert Fliek <efliek@gmail.com>
-Eldar Rakhimberdin <ibeono@gmail.com>
-Elena Grahovac <elena@grahovac.me>
-Eli Bendersky <eliben@google.com>
-Elias Naur <mail@eliasnaur.com> <elias.naur@gmail.com>
-Elliot Morrison-Reed <elliotmr@gmail.com>
-Ellison Leão <ellisonleao@gmail.com>
-Elvina Yakubova <elvinayakubova@gmail.com>
-Emerson Lin <linyintor@gmail.com>
-Emil Bektimirov <lefelys@gmail.com>
-Emil Hessman <emil@hessman.se>
-Emil Mursalimov <mursalimovemeel@gmail.com>
-Emilien Kenler <hello@emilienkenler.com>
-Emmanuel Odeke <emm.odeke@gmail.com> <odeke@ualberta.ca>
-Emrecan Bati <emrecanbati@gmail.com>
-Eno Compton <enocom@google.com>
-Eoghan Sherry <ejsherry@gmail.com>
-Eric Biggers <ebiggers@google.com>
-Eric Brown <browne@vmware.com>
-Eric Chiang <eric.chiang.m@gmail.com>
-Eric Clark <zerohp@gmail.com>
-Eric Daniels <eric@erdaniels.com>
-Eric Engestrom <eric@engestrom.ch>
-Eric Garrido <ekg@google.com>
-Eric Koleda <ekoleda+devrel@google.com>
-Eric Lagergren <ericscottlagergren@gmail.com>
-Eric Milliken <emilliken@gmail.com>
-Eric Pauley <eric@pauley.me>
-Eric Ponce <tricokun@gmail.com>
-Eric Rescorla <ekr@rtfm.com>
-Eric Roshan-Eisner <eric.d.eisner@gmail.com>
-Eric Rutherford <erutherford@gmail.com>
-Eric Rykwalder <e.rykwalder@gmail.com>
-Eric Wang <wangchaogo1990@gmail.com>
-Erick Tryzelaar <etryzelaar@google.com>
-Erik Aigner <aigner.erik@gmail.com>
-Erik Dubbelboer <erik@dubbelboer.com>
-Erik St. Martin <alakriti@gmail.com>
-Erik Staab <estaab@google.com>
-Erik Westrup <erik.westrup@gmail.com>
-Erin Masatsugu <erin.masatsugu@gmail.com>
-Ernest Chiang <ernest_chiang@htc.com>
-Erwin Oegema <blablaechthema@hotmail.com>
-Esko Luontola <esko.luontola@gmail.com>
-Ethan Anderson <eanderson@atlassian.com>
-Ethan Burns <eaburns@google.com>
-Ethan Hur <ethan0311@gmail.com>
-Ethan Miller <eamiller@us.ibm.com>
-Ethan Reesor <ethan.reesor@gmail.com>
-Euan Kemp <euank@euank.com>
-Eugene Formanenko <mo4islona@gmail.com>
-Eugene Kalinin <e.v.kalinin@gmail.com>
-Evan Broder <evan@stripe.com>
-Evan Brown <evanbrown@google.com>
-Evan Digby <evandigby@gmail.com>
-Evan Hicks <evan.hicks2@gmail.com>
-Evan Jones <ej@evanjones.ca>
-Evan Klitzke <evan@eklitzke.org>
-Evan Kroske <evankroske@google.com>
-Evan Martin <evan.martin@gmail.com>
-Evan Phoenix <evan@phx.io>
-Evan Shaw <chickencha@gmail.com>
-Evgeniy Kulikov <tuxuls@gmail.com>
-Evgeniy Polyakov <zbr@ioremap.net>
-Ewan Chou <coocood@gmail.com>
-Ewan Valentine <ewan.valentine89@gmail.com>
-Eyal Posener <posener@gmail.com>
-F. Talha Altınel <talhaaltinel@hotmail.com>
-Fabian Wickborn <fabian@wickborn.net>
-Fabian Zaremba <fabian@youremail.eu>
-Fabio Falzoi <fabio.falzoi84@gmail.com>
-Fabrizio Milo <mistobaan@gmail.com>
-Faiyaz Ahmed <ahmedf@vmware.com>
-Fan Hongjian <fan.howard@gmail.com>
-Fangming Fang <fangming.fang@arm.com>
-Fannie Zhang <fannie.zhang@arm.com>
-Fatih Arslan <fatih@arslan.io>
-Fazal Majid <majid@apsalar.com>
-Fazlul Shahriar <fshahriar@gmail.com>
-Federico Bond <federicobond@gmail.com>
-Federico Guerinoni <guerinoni.federico@gmail.com>
-Federico Simoncelli <fsimonce@redhat.com>
-Fedor Indutny <fedor@indutny.com>
-Fedor Korotkiy <dartslon@gmail.com>
-Felipe Oliveira <felipeweb.programador@gmail.com>
-Felix Bünemann <Felix.Buenemann@gmail.com>
-Felix Cornelius <9767036+fcornelius@users.noreply.github.com>
-Felix Geisendörfer <haimuiba@gmail.com>
-Felix Kollmann <fk@konsorten.de>
-Ferenc Szabo <frncmx@gmail.com>
-Fernandez Ludovic <lfernandez.dev@gmail.com>
-Filip Gruszczyński <gruszczy@gmail.com>
-Filip Haglund <drathier@users.noreply.github.com>
-Filip Stanis <fstanis@google.com>
-Filippo Valsorda <filippo@golang.org> <filippo@cloudflare.com> <hi@filippo.io>
-Firmansyah Adiputra <frm.adiputra@gmail.com>
-Florian Forster <octo@google.com>
-Florian Uekermann <florian@uekermann-online.de> <f1@uekermann-online.de>
-Florian Weimer <fw@deneb.enyo.de>
-Florin Papa <fpapa@google.com>
-Florin Patan <florinpatan@gmail.com>
-Folke Behrens <folke@google.com>
-Ford Hurley <ford.hurley@gmail.com>
-Forest Johnson <forest.n.johnson@gmail.com>
-Francesc Campoy <campoy@golang.org>
-Francesco Guardiani <francescoguard@gmail.com>
-Francesco Renzi <rentziass@gmail.com>
-Francisco Claude <fclaude@recoded.cl>
-Francisco Rojas <francisco.rojas.gallegos@gmail.com>
-Francisco Souza <franciscossouza@gmail.com>
-Frank Chiarulli Jr <frank@frankchiarulli.com>
-Frank Schroeder <frank.schroeder@gmail.com>
-Frank Somers <fsomers@arista.com>
-Frederic Guillot <frederic.guillot@gmail.com>
-Frederick Kelly Mayle III <frederickmayle@gmail.com>
-Frederik Ring <frederik.ring@gmail.com>
-Frederik Zipp <fzipp@gmx.de>
-Frediano Ziglio <freddy77@gmail.com>
-Fredrik Enestad <fredrik.enestad@soundtrackyourbrand.com>
-Fredrik Forsmo <fredrik.forsmo@gmail.com>
-Fredrik Wallgren <fredrik.wallgren@gmail.com>
-Frew Schmidt <github@frew.co>
-Frithjof Schulze <schulze@math.uni-hannover.de> <sfrithjof@gmail.com>
-Frits van Bommel <fvbommel@gmail.com>
-Fujimoto Kyosuke <kyoro.f@gmail.com>
-Fumitoshi Ukai <ukai@google.com>
-G. Hussain Chinoy <ghchinoy@gmail.com>
-Gaal Yahas <gaal@google.com>
-Gabríel Arthúr Pétursson <gabriel@system.is>
-Gabriel Aszalos <gabriel.aszalos@gmail.com>
-Gabriel Guzman <gabe.guzman@gmail.com>
-Gabriel Nelle <tehsphinx@web.de>
-Gabriel Nicolas Avellaneda <avellaneda.gabriel@gmail.com>
-Gabriel Rosenhouse <rosenhouse@gmail.com>
-Gabriel Russell <gabriel.russell@gmail.com>
-Gabriel Vasile <gabriel.vasile0793@gmail.com>
-Gareth Paul Jones <gpj@foursquare.com>
-Garret Kelly <gdk@google.com>
-Garrick Evans <garrick@google.com>
-Garry McNulty <garrmcnu@gmail.com>
-Gary Burd <gary@beagledreams.com> <gary.burd@gmail.com>
-Gary Elliott <garyelliott@google.com>
-Gaurav Singh <gaurav1086@gmail.com>
-Gaurish Sharma <contact@gaurishsharma.com>
-Gautham Thambidorai <gautham.dorai@gmail.com>
-Gauthier Jolly <gauthier.jolly@gmail.com>
-Gawen Arab <gawen.arab@c.zen.ly>
-Geert-Johan Riemer <gjr19912@gmail.com>
-Genevieve Luyt <genevieve.luyt@gmail.com>
-Gengliang Wang <ltnwgl@gmail.com>
-Geoff Berry <gberry.qdt@qualcommdatacenter.com>
-Geoffroy Lorieux <lorieux.g@gmail.com>
-Geon Kim <geon0250@gmail.com>
-Georg Reinke <guelfey@gmail.com>
-George Gkirtsou <ggirtsou@gmail.com>
-George Hartzell <hartzell@alerce.com>
-George Looshch <looshch@loosh.ch>
-George Shammas <george@shamm.as> <georgyo@gmail.com>
-George Tsilias <tsiliasg@gmail.com>
-Gerasimos (Makis) Maropoulos <kataras2006@hotmail.com>
-Gerasimos Dimitriadis <gedimitr@gmail.com>
-Gergely Brautigam <skarlso777@gmail.com>
-Gernot Vormayr <gvormayr@gmail.com>
-Gert Cuykens <gert.cuykens@gmail.com>
-Getulio Sánchez <valentin2507@gmail.com>
-Ghazni Nattarshah <ghazni.nattarshah@gmail.com>
-Gianguido Sora` <g.sora4@gmail.com>
-Gideon Jan-Wessel Redelinghuys <gjredelinghuys@gmail.com>
-Giles Lean <giles.lean@pobox.com>
-Giovanni Bajo <rasky@develer.com>
-GitHub User @180909 (70465953) <734461790@qq.com>
-GitHub User @6543 (24977596) <6543@obermui.de>
-GitHub User @aca (50316549) <acadx0@gmail.com>
-GitHub User @ajnirp (1688456) <ajnirp@users.noreply.github.com>
-GitHub User @ajz01 (4744634) <ajzdenek@gmail.com>
-GitHub User @alkesh26 (1019076) <alkesh26@gmail.com>
-GitHub User @andig (184815) <cpuidle@gmx.de>
-GitHub User @andrius4669 (4699695) <andrius4669@gmail.com>
-GitHub User @as (8127015) <as.utf8@gmail.com>
-GitHub User @bakape (7851952) <bakape@gmail.com>
-GitHub User @bgadrian (830001) <aditza8@gmail.com>
-GitHub User @bontequero (2674999) <bontequero@gmail.com>
-GitHub User @cch123 (384546) <buaa.cch@gmail.com>
-GitHub User @chainhelen (7046329) <chainhelen@gmail.com>
-GitHub User @chanxuehong (3416908) <chanxuehong@gmail.com>
-GitHub User @Cluas (10056928) <Cluas@live.cn>
-GitHub User @cncal (23520240) <flycalvin@qq.com>
-GitHub User @DQNEO (188741) <dqneoo@gmail.com>
-GitHub User @Dreamacro (8615343) <chuainian@gmail.com>
-GitHub User @dupoxy (1143957) <dupoxy@users.noreply.github.com>
-GitHub User @EndlessCheng (7086966) <loli.con@qq.com>
-GitHub User @erifan (31343225) <eric.fang@arm.com>
-GitHub User @esell (9735165) <eujon.sellers@gmail.com>
-GitHub User @fatedier (7346661) <fatedier@gmail.com>
-GitHub User @frennkie (6499251) <mail@rhab.de>
-GitHub User @geedchin (11672310) <geedchin@gmail.com>
-GitHub User @GrigoriyMikhalkin (3637857) <grigoriymikhalkin@gmail.com>
-GitHub User @Gusted (25481501) <williamzijl7@hotmail.com>
-GitHub User @hengwu0 (41297446) <41297446+hengwu0@users.noreply.github.com>
-GitHub User @hitzhangjie (3725760) <hit.zhangjie@gmail.com>
-GitHub User @hkhere (33268704) <33268704+hkhere@users.noreply.github.com>
-GitHub User @hopehook (7326168) <hopehook.com@gmail.com>
-GitHub User @hqpko (13887251) <whaibin01@hotmail.com>
-GitHub User @Illirgway (5428603) <illirgway@gmail.com>
-GitHub User @itchyny (375258) <itchyny@hatena.ne.jp>
-GitHub User @jinmiaoluo (39730824) <jinmiaoluo@icloud.com>
-GitHub User @jopbrown (6345470) <msshane2008@gmail.com>
-GitHub User @kazyshr (30496953) <kazyshr0301@gmail.com>
-GitHub User @kc1212 (1093806) <kc1212@users.noreply.github.com>
-GitHub User @komisan19 (18901496) <komiyama6219@gmail.com>
-GitHub User @korzhao (64203902) <korzhao95@gmail.com>
-GitHub User @Kropekk (13366453) <kamilkropiewnicki@gmail.com>
-GitHub User @lgbgbl (65756378) <lgbgbl@qq.com>
-GitHub User @lhl2617 (33488131) <l.h.lee2617@gmail.com>
-GitHub User @linguohua (3434367) <lghchinaidea@gmail.com>
-GitHub User @lloydchang (1329685) <lloydchang@gmail.com>
-GitHub User @LotusFenn (13775899) <fenn.lotus@gmail.com>
-GitHub User @luochuanhang (96416201) <chuanhangluo@gmail.com>
-GitHub User @ly303550688 (11519839) <yang.liu636@gmail.com>
-GitHub User @madiganz (18340029) <zacharywmadigan@gmail.com>
-GitHub User @maltalex (10195391) <code@bit48.net>
-GitHub User @markruler (38225900) <csu0414@gmail.com>
-GitHub User @Matts966 (28551465) <Matts966@users.noreply.github.com>
-GitHub User @micnncim (21333876) <micnncim@gmail.com>
-GitHub User @mkishere (224617) <224617+mkishere@users.noreply.github.com>
-GitHub User @nu50218 (40682920) <nu_ll@icloud.com>
-GitHub User @OlgaVlPetrova (44112727) <OVPpetrova@gmail.com>
-GitHub User @pierwill (19642016) <pierwill@users.noreply.github.com>
-GitHub User @pityonline (438222) <pityonline@gmail.com>
-GitHub User @po3rin (29445112) <abctail30@gmail.com>
-GitHub User @pokutuna (57545) <popopopopokutuna@gmail.com>
-GitHub User @povsister (11040951) <pov@mahou-shoujo.moe>
-GitHub User @pytimer (17105586) <lixin20101023@gmail.com>
-GitHub User @qcrao (7698088) <qcrao91@gmail.com>
-GitHub User @ramenjuniti (32011829) <ramenjuniti@gmail.com>
-GitHub User @renthraysk (30576707) <renthraysk@gmail.com>
-GitHub User @roudkerk (52280478) <roudkerk@google.com>
-GitHub User @saitarunreddy (21041941) <saitarunreddypalla@gmail.com>
-GitHub User @SataQiu (9354727) <shidaqiu2018@gmail.com>
-GitHub User @seifchen (23326132) <chenxuefeng1207@gmail.com>
-GitHub User @shogo-ma (9860598) <Choroma194@gmail.com>
-GitHub User @sivchari (55221074) <shibuuuu5@gmail.com>
-GitHub User @skanehira (7888591) <sho19921005@gmail.com>
-GitHub User @soolaugust (10558124) <soolaugust@gmail.com>
-GitHub User @surechen (7249331) <surechen17@gmail.com>
-GitHub User @syumai (6882878) <syumai@gmail.com>
-GitHub User @tangxi666 (48145175) <tx1275044634@gmail.com>
-GitHub User @tatsumack (4510569) <tatsu.mack@gmail.com>
-GitHub User @tell-k (26263) <ffk2005@gmail.com>
-GitHub User @tennashi (10219626) <tennashio@gmail.com>
-GitHub User @uhei (2116845) <uhei@users.noreply.github.com>
-GitHub User @uji (49834542) <ujiprog@gmail.com>
-GitHub User @unbyte (5772358) <i@shangyes.net>
-GitHub User @uropek (39370426) <uropek@gmail.com>
-GitHub User @utkarsh-extc (53217283) <utkarsh.extc@gmail.com>
-GitHub User @witchard (4994659) <witchard@hotmail.co.uk>
-GitHub User @wmdngngng (22067700) <wangmingdong@gmail.com>
-GitHub User @wolf1996 (5901874) <ksgiv37@gmail.com>
-GitHub User @yah01 (12216890) <kagaminehuan@gmail.com>
-GitHub User @yuanhh (1298735) <yuan415030@gmail.com>
-GitHub User @zikaeroh (48577114) <zikaeroh@gmail.com>
-GitHub User @ZZMarquis (7624583) <zhonglingjian3821@163.com>
-Giulio Iotti <dullgiulio@gmail.com>
-Giulio Micheloni <giulio.micheloni@gmail.com>
-Giuseppe Valente <gvalente@arista.com>
-Gleb Stepanov <glebstepanov1992@gmail.com>
-Glenn Brown <glennb@google.com>
-Glenn Lewis <gmlewis@google.com>
-Gordon Klaus <gordon.klaus@gmail.com>
-Gordon Tyler <gordon@doxxx.net>
-Grace Han <hgrace503@gmail.com>
-Graham King <graham4king@gmail.com>
-Graham Miller <graham.miller@gmail.com>
-Grant Griffiths <ggp493@gmail.com>
-Green Lightning <GreenLightning.git@googlemail.com>
-Greg Poirier <greg.istehbest@gmail.com>
-Greg Steuck <gnezdo+github@google.com>
-Greg Thelen <gthelen@google.com>
-Greg Ward <greg@gerg.ca>
-Grégoire Delattre <gregoire.delattre@gmail.com>
-Gregory Man <man.gregory@gmail.com>
-Gregory Petrosyan <gregory.petrosyan@gmail.com>
-Guilherme Caruso <gui.martinscaruso@gmail.com>
-Guilherme Garnier <guilherme.garnier@gmail.com>
-Guilherme Goncalves <guilhermeaugustosg@gmail.com>
-Guilherme Rezende <guilhermebr@gmail.com>
-Guilherme Souza <32180229+gqgs@users.noreply.github.com>
-Guillaume Blaquiere <guillaume.blaquiere@gmail.com>
-Guillaume J. Charmes <guillaume@charmes.net>
-Guillaume Sottas <guillaumesottas@gmail.com>
-Günther Noack <gnoack@google.com>
-Guobiao Mei <meiguobiao@gmail.com>
-Guodong Li <guodongli@google.com>
-Guoliang Wang <iamwgliang@gmail.com>
-Guoqi Chen <chenguoqi@loongson.cn>
-Gustav Paul <gustav.paul@gmail.com>
-Gustav Westling <gustav@westling.xyz>
-Gustavo Franco <gustavorfranco@gmail.com>
-Gustavo Niemeyer <gustavo@niemeyer.net> <n13m3y3r@gmail.com>
-Gwenael Treguier <gwenn.kahz@gmail.com>
-Gyu-Ho Lee <gyuhox@gmail.com>
-H. İbrahim Güngör <igungor@gmail.com>
-Hajime Hoshi <hajimehoshi@gmail.com>
-Hallgrimur Gunnarsson <halg@google.com>
-HAMANO Tsukasa <hamano@osstech.co.jp>
-Han-Wen Nienhuys <hanwen@google.com>
-Hang Qian <hangqian90@gmail.com>
-Hanjun Kim <hallazzang@gmail.com>
-Hanlin He <hanling.he@gmail.com>
-Hanlin Shi <shihanlin9@gmail.com>
-Hans Nielsen <hans@stackallocated.com>
-Hao Mou <mouhao.mu@gmail.com>
-Haoran Luo <haoran.luo@chaitin.com>
-Haosdent Huang <haosdent@gmail.com>
-Harald Nordgren <haraldnordgren@gmail.com>
-Hari haran <hariharan.uno@gmail.com>
-Hariharan Srinath <srinathh@gmail.com>
-Harley Laue <losinggeneration@gmail.com>
-Harry Moreno <morenoh149@gmail.com>
-Harshavardhana <hrshvardhana@gmail.com>
-Hasan Ozgan <hasan@ozgan.net>
-Hasit Bhatt <hasit.p.bhatt@gmail.com>
-Hauke Löffler <hloeffler@users.noreply.github.com>
-Håvard Haugen <havard.haugen@gmail.com>
-He Liu <liulonnie@gmail.com>
-Hector Chu <hectorchu@gmail.com>
-Hector Martin Cantero <hector@marcansoft.com>
-Hein Khant Zaw <heinkhantzaw1@gmail.com>
-Henning Schmiedehausen <henning@schmiedehausen.org>
-Henrik Edwards <henrik.edwards@gmail.com>
-Henrik Hodne <henrik@hodne.io>
-Henrique Vicente <henriquevicente@gmail.com>
-Henry Adi Sumarto <henry.adisumarto@gmail.com>
-Henry Bubert <google@mindeco.de>
-Henry Chang <mr.changyuheng@gmail.com>
-Henry Clifford <h.a.clifford@gmail.com>
-Henry Wong <liushuai.wang@elastic.co>
-Herbert Georg Fischer <herbert.fischer@gmail.com>
-Herbie Ong <herbie@google.com>
-Heschi Kreinick <heschi@google.com>
-Hidetatsu Yaginuma <ygnmhdtt@gmail.com>
-Hilko Bengen <bengen@hilluzination.de>
-Himanshu Kishna Srivastava <28himanshu@gmail.com>
-Hiroaki Nakamura <hnakamur@gmail.com>
-Hiromichi Ema <ema.hiro@gmail.com>
-Hironao OTSUBO <motemen@gmail.com>
-Hiroshi Ioka <hirochachacha@gmail.com>
-Hitoshi Mitake <mitake.hitoshi@gmail.com>
-Holden Huang <ttyh061@gmail.com>
-Hong Ruiqi <hongruiqi@gmail.com>
-Hongfei Tan <feilengcui008@gmail.com>
-Horacio Duran <horacio.duran@gmail.com>
-Horst Rutter <hhrutter@gmail.com>
-Hossein Sheikh Attar <hattar@google.com>
-Hossein Zolfi <hossein.zolfi@gmail.com>
-Howard Zhang <howard.zhang@arm.com>
-Hsin Tsao <tsao@google.com>
-Hsin-Ho Yeh <yhh92u@gmail.com>
-Hu Keping <hukeping@huawei.com>
-Huan Du <i@huandu.me>
-Hugues Bruant <hugues.bruant@gmail.com>
-Huy Le <huy.dinh.le.89@gmail.com>
-Hyang-Ah Hana Kim <hakim@google.com> <hyangah@gmail.com>
-Hyoyoung Chang <hyoyoung@gmail.com>
-Ian Cottrell <iancottrell@google.com>
-Ian Davis <nospam@iandavis.com>
-Ian Gudger <ian@loosescre.ws>
-Ian Haken <ihaken@netflix.com>
-Ian Kent <iankent85@gmail.com>
-Ian Lance Taylor <iant@golang.org>
-Ian Leue <ian@appboy.com>
-Ian Mckay <iann0036@gmail.com>
-Ian Tay <iantay@google.com>
-Ian Zapolsky <ianzapolsky@gmail.com>
-Ibrahim AshShohail <ibra.sho@gmail.com>
-Icarus Sparry <golang@icarus.freeuk.com>
-Iccha Sethi <icchasethi@gmail.com>
-Ichinose Shogo <shogo82148@gmail.com>
-Idora Shinatose <idora.shinatose@gmail.com>
-Ignacio Hagopian <jsign.uy@gmail.com>
-Igor Bernstein <igorbernstein@google.com>
-Igor Bolotnikov <igor.v.bolotnikov@gmail.com>
-Igor Dolzhikov <bluesriverz@gmail.com>
-Igor Vashyst <ivashyst@gmail.com>
-Igor Zhilianin <igor.zhilianin@gmail.com>
-Ikko Ashimine <eltociear@gmail.com>
-Illya Yalovyy <yalovoy@gmail.com>
-Ilya Chukov <56119080+Elias506@users.noreply.github.com>
-Ilya Mateyko <me@astrophena.name>
-Ilya Sinelnikov <sidhmangh@gmail.com>
-Ilya Tocar <ilya.tocar@intel.com>
-INADA Naoki <songofacandy@gmail.com>
-Inanc Gumus <m@inanc.io>
-Ingo Gottwald <in.gottwald@gmail.com>
-Ingo Krabbe <ikrabbe.ask@gmail.com>
-Ingo Oeser <nightlyone@googlemail.com> <nightlyone@gmail.com>
-Ioannis Georgoulas <geototti21@hotmail.com>
-Irbe Krumina <irbekrm@gmail.com>
-Irfan Sharif <irfanmahmoudsharif@gmail.com>
-Irieda Noboru <irieda@gmail.com>
-Isaac Ardis <isaac.ardis@gmail.com>
-Isaac Wagner <ibw@isaacwagner.me>
-Isfan Azhabil <isfanazhabil@gmail.com>
-Iskander Sharipov <iskander.sharipov@intel.com> <quasilyte@gmail.com>
-Issac Trotts <issactrotts@google.com>
-Ivan Babrou <ivan@cloudflare.com>
-Ivan Bertona <ivan.bertona@gmail.com>
-Ivan Krasin <krasin@golang.org>
-Ivan Kutuzov <arbrix@gmail.com>
-Ivan Markin <sw@nogoegst.net>
-Ivan Moscoso <moscoso@gmail.com>
-Ivan Osadchiy <ivan.osadchii@gmail.com>
-Ivan Sharavuev <shpiwan@gmail.com>
-Ivan Trubach <mr.trubach@icloud.com>
-Ivan Ukhov <ivan.ukhov@gmail.com>
-Ivy Evans <ivy@ivyevans.net>
-Jaana Burcu Dogan <jbd@google.com> <jbd@golang.org> <burcujdogan@gmail.com>
-Jaap Aarts <jaap.aarts1@gmail.com>
-Jack Britton <jackxbritton@gmail.com>
-Jack Lindamood <jlindamo@justin.tv>
-Jack You <jamesyou@google.com>
-Jacob Baskin <jbaskin@google.com>
-Jacob Blain Christen <dweomer5@gmail.com>
-Jacob H. Haven <jacob@cloudflare.com>
-Jacob Hoffman-Andrews <github@hoffman-andrews.com>
-Jacob Walker <jacobwalker0814@gmail.com>
-Jaden Teng <long.asyn@gmail.com>
-Jae Kwon <jae@tendermint.com>
-Jake B <doogie1012@gmail.com>
-Jake Ciolek <jakub@ciolek.dev>
-Jakob Borg <jakob@nym.se>
-Jakob Weisblat <jakobw@mit.edu>
-Jakub Čajka <jcajka@redhat.com>
-Jakub Kaczmarzyk <jakubk@mit.edu>
-Jakub Ryszard Czarnowicz <j.czarnowicz@gmail.com>
-Jakub Warczarek <jakub.warczarek@gmail.com>
-Jamal Carvalho <jamal.a.carvalho@gmail.com>
-James Aguilar <jaguilar@google.com>
-James Bardin <j.bardin@gmail.com>
-James Chacon <jchacon@google.com>
-James Clarke <jrtc27@jrtc27.com>
-James Cowgill <James.Cowgill@imgtec.com>
-James Craig Burley <james-github@burleyarch.com>
-James David Chalfant <james.chalfant@gmail.com>
-James Eady <jmeady@google.com>
-James Fennell <jpfennell@google.com>
-James Fysh <james.fysh@gmail.com>
-James Gray <james@james4k.com>
-James Harris <mailjamesharris@gmail.com>
-James Hartig <fastest963@gmail.com>
-James Kasten <jdkasten@google.com>
-James Lawrence <jljatone@gmail.com>
-James Meneghello <rawrz0r@gmail.com>
-James Myers <jfmyers9@gmail.com>
-James Naftel <james.naftel@gmail.com>
-James Neve <jamesoneve@gmail.com>
-James Nugent <james@jen20.com>
-James P. Cooper <jamespcooper@gmail.com>
-James Robinson <jamesr@google.com> <jamesr.gatech@gmail.com>
-James Schofield <james@shoeboxapp.com>
-James Smith <jrs1995@icloud.com>
-James Sweet <james.sweet88@googlemail.com>
-James Toy <nil@opensesame.st>
-James Treanor <jtreanor3@gmail.com>
-James Tucker <raggi@google.com>
-James Whitehead <jnwhiteh@gmail.com>
-Jamie Beverly <jamie.r.beverly@gmail.com>
-Jamie Gennis <jgennis@google.com> <jgennis@gmail.com>
-Jamie Kerr <jkerr113@googlemail.com>
-Jamie Liu <jamieliu@google.com>
-Jamie Stackhouse <contin673@gmail.com>
-Jamie Turner <jamwt@dropbox.com>
-Jamie Wilkinson <jaq@spacepants.org>
-Jamil Djadala <djadala@gmail.com>
-Jan Berktold <jan@berktold.co>
-Jan H. Hosang <jan.hosang@gmail.com>
-Jan Kratochvil <jan.kratochvil@redhat.com>
-Jan Lehnardt <jan@apache.org>
-Jan Mercl <0xjnml@gmail.com> <befelemepeseveze@gmail.com>
-Jan Newmarch <jan.newmarch@gmail.com>
-Jan Pilzer <jan.pilzer@gmx.de>
-Jan Steinke <jan.steinke@gmail.com>
-Jan Ziak <0xe2.0x9a.0x9b@gmail.com>
-Jani Monoses <jani.monoses@ubuntu.com> <jani.monoses@gmail.com>
-Jannis Andrija Schnitzer <jannis@schnitzer.im>
-Jared Allard <jaredallard@users.noreply.github.com>
-Jared Culp <jculp14@gmail.com>
-Jaroslavas Počepko <jp@webmaster.ms>
-Jason A. Donenfeld <Jason@zx2c4.com>
-Jason Baker <jason-baker@users.noreply.github.com>
-Jason Barnett <jason.w.barnett@gmail.com>
-Jason Buberel <jbuberel@google.com>
-Jason Chu <jasonchujc@gmail.com>
-Jason Del Ponte <delpontej@gmail.com>
-Jason Hall <jasonhall@google.com>
-Jason Keene <jasonkeene@gmail.com>
-Jason LeBrun <jblebrun@gmail.com>
-Jason Smale <jsmale@zendesk.com>
-Jason Travis <infomaniac7@gmail.com>
-Jason Wangsadinata <jwangsadinata@gmail.com>
-Javier Kohen <jkohen@google.com>
-Javier Revillas <jrevillas@massivedynamic.io>
-Javier Segura <javism@gmail.com>
-Jay Chen <chenjie@chenjie.info>
-Jay Conrod <jayconrod@google.com>
-Jay Lee <BusyJayLee@gmail.com>
-Jay Taylor <outtatime@gmail.com>
-Jay Weisskopf <jay@jayschwa.net>
-Jean de Klerk <deklerk@google.com>
-Jean-André Santoni <jean.andre.santoni@gmail.com>
-Jean-François Bustarret <jf@bustarret.com>
-Jean-Francois Cantin <jfcantin@gmail.com>
-Jean-Hadrien Chabran <jh@chabran.fr>
-Jean-Marc Eurin <jmeurin@google.com>
-Jean-Nicolas Moal <jn.moal@gmail.com>
-Jed Denlea <jed@fastly.com>
-Jędrzej Szczepaniak <jbszczepaniak@gmail.com>
-Jeet Parekh <jeetparekh96@gmail.com>
-Jeevanandam M <jeeva@myjeeva.com>
-Jeff (Zhefu) Jiang <jeffjiang@google.com>
-Jeff Craig <jeffcraig@google.com>
-Jeff Dupont <jeff.dupont@gmail.com>
-Jeff Hodges <jeff@somethingsimilar.com>
-Jeff Johnson <jrjohnson@google.com>
-Jeff R. Allen <jra@nella.org> <jeff.allen@gmail.com>
-Jeff Sickel <jas@corpus-callosum.com>
-Jeff Wendling <jeff@spacemonkey.com>
-Jeff Wentworth <j.wentworth@gmail.com>
-Jeff Widman <jeff@jeffwidman.com>
-Jeffrey H <jeffreyh192@gmail.com>
-Jelte Fennema <github-tech@jeltef.nl>
-Jens Frederich <jfrederich@gmail.com>
-Jeremiah Harmsen <jeremiah@google.com>
-Jeremy Banks <_@jeremy.ca>
-Jeremy Canady <jcanady@gmail.com>
-Jeremy Faller <jeremy@golang.org>
-Jeremy Jackins <jeremyjackins@gmail.com>
-Jeremy Jay <jeremy@pbnjay.com>
-Jeremy Schlatter <jeremy.schlatter@gmail.com>
-Jero Bado <tokidokitalkyou@gmail.com>
-Jeroen Bobbeldijk <jerbob92@gmail.com>
-Jeroen Simonetti <jeroen@simonetti.nl>
-Jérôme Doucet <jerdct@gmail.com>
-Jerrin Shaji George <jerrinsg@gmail.com>
-Jess Frazelle <me@jessfraz.com>
-Jesse Szwedko <jesse.szwedko@gmail.com>
-Jesús Espino <jespinog@gmail.com>
-Jia Zhan <jzhan@uber.com>
-Jiacai Liu <jiacai2050@gmail.com>
-Jiahao Lu <lujjjh@gmail.com>
-Jiahua Wang <wjh180909@gmail.com>
-Jianing Yu <jnyu@google.com>
-Jianqiao Li <jianqiaoli@google.com>
-Jiayu Yi <yijiayu@gmail.com>
-Jie Ma <jienius@outlook.com>
-Jihyun Yu <yjh0502@gmail.com>
-Jim Cote <jfcote87@gmail.com>
-Jim Kingdon <jim@bolt.me>
-Jim McGrath <jimmc2@gmail.com>
-Jim Minter <jminter@redhat.com>
-Jimmy Frasche <soapboxcicero@gmail.com>
-Jimmy Zelinskie <jimmyzelinskie@gmail.com>
-Jin-wook Jeong <jeweljar@hanmail.net>
-Jingcheng Zhang <diogin@gmail.com>
-Jingguo Yao <yaojingguo@gmail.com>
-Jingnan Si <jingnan.si@gmail.com>
-Jinkun Zhang <franksnolf@gmail.com>
-Jinwen Wo <wojinwen@huawei.com>
-Jiong Du <londevil@gmail.com>
-Jirka Daněk <dnk@mail.muni.cz>
-Jiulong Wang <jiulongw@gmail.com>
-Joakim Sernbrant <serbaut@gmail.com>
-Jochen Weber <jochen.weber80@gmail.com>
-Joe Bowbeer <joe.bowbeer@gmail.com>
-Joe Cortopassi <joe@joecortopassi.com>
-Joe Farrell <joe2farrell@gmail.com>
-Joe Harrison <joehazzers@gmail.com>
-Joe Henke <joed.henke@gmail.com>
-Joe Kyo <xunianzu@gmail.com>
-Joe Poirier <jdpoirier@gmail.com>
-Joe Richey <joerichey@google.com>
-Joe Shaw <joe@joeshaw.org>
-Joe Sylve <joe.sylve@gmail.com>
-Joe Tsai <joetsai@digital-static.net>
-Joel Courtney <euphemize@gmail.com>
-Joel Ferrier <joelferrier@google.com>
-Joel Sing <joel@sing.id.au> <jsing@google.com>
-Joël Stemmer <jstemmer@google.com>
-Joel Stemmer <stemmertech@gmail.com>
-Joey Geiger <jgeiger@users.noreply.github.com>
-Johan Brandhorst <johan.brandhorst@gmail.com>
-Johan Euphrosine <proppy@google.com>
-Johan Jansson <johan.jansson@iki.fi>
-Johan Knutzen <johan@senri.se>
-Johan Sageryd <j@1616.se>
-Johannes Altmanninger <aclopte@gmail.com>
-Johannes Huning <johannes.huning@gmail.com>
-John Asmuth <jasmuth@gmail.com>
-John Bampton <jbampton@gmail.com>
-John Beisley <huin@google.com>
-John C Barstow <jbowtie@amathaine.com>
-John DeNero <denero@google.com>
-John Dethridge <jcd@golang.org>
-John Gibb <johngibb@gmail.com>
-John Gilik <john@jgilik.com>
-John Graham-Cumming <jgc@jgc.org> <jgrahamc@gmail.com>
-John Howard Palevich <jack.palevich@gmail.com>
-John Jago <johnjago@protonmail.com>
-John Jeffery <jjeffery@sp.com.au>
-John Jenkins <twodopeshaggy@gmail.com>
-John Kelly <jkelly@squarespace.com>
-John Leidegren <john.leidegren@gmail.com>
-John McCabe <john@johnmccabe.net>
-John Moore <johnkenneth.moore@gmail.com>
-John Newlin <jnewlin@google.com>
-John Olheiser <john.olheiser@gmail.com>
-John Papandriopoulos <jpap.code@gmail.com>
-John Potocny <johnp@vividcortex.com>
-John R. Lenton <jlenton@gmail.com>
-John Schnake <schnake.john@gmail.com>
-John Shahid <jvshahid@gmail.com>
-John Tuley <john@tuley.org>
-John Weldon <johnweldon4@gmail.com>
-Johnny Luo <johnnyluo1980@gmail.com>
-Jon Chen <jchen@justin.tv>
-Jon Johnson <jonjohnson@google.com>
-Jonas Bernoulli <jonas@bernoul.li>
-Jonathan Albrecht <jonathan.albrecht@ibm.com>
-Jonathan Allie <jonallie@google.com>
-Jonathan Amsterdam <jba@google.com>
-Jonathan Boulle <jonathanboulle@gmail.com>
-Jonathan Chen <dijonkitchen@users.noreply.github.com>
-Jonathan Feinberg <feinberg@google.com>
-Jonathan Gold <jgold.bg@gmail.com>
-Jonathan Hseu <jhseu@google.com>
-Jonathan Mark <jhmark@xenops.com> <jhmark000@gmail.com>
-Jonathan Nieder <jrn@google.com>
-Jonathan Pentecost <pentecostjonathan@gmail.com>
-Jonathan Pittman <jmpittman@google.com> <jonathan.mark.pittman@gmail.com>
-Jonathan Rudenberg <jonathan@titanous.com>
-Jonathan Stacks <jonstacks13@gmail.com>
-Jonathan Swinney <jswinney@amazon.com>
-Jonathan Wills <runningwild@gmail.com>
-Jonathon Lacher <jonathon.lacher@gmail.com>
-Jongmin Kim <atomaths@gmail.com>
-Joonas Kuorilehto <joneskoo@derbian.fi>
-Joop Kiefte <ikojba@gmail.com> <joop@kiefte.net>
-Jordan Christiansen <xordspar0@gmail.com>
-Jordan Krage <jmank88@gmail.com>
-Jordan Lewis <jordanthelewis@gmail.com>
-Jordan Liggitt <liggitt@google.com>
-Jordan Rhee <jordanrh@microsoft.com>
-Jordan Rupprecht <rupprecht@google.com>
-Jordi Martin <jordimartin@gmail.com>
-Jorge Araya <jorgejavieran@yahoo.com.mx>
-Jorge L. Fatta <jorge.fatta@auth0.com>
-Jorge Troncoso <jatron@google.com>
-Jos Visser <josv@google.com>
-Josa Gesell <josa@gesell.me>
-Jose Luis Vázquez González <josvazg@gmail.com>
-Joseph Bonneau <jcb@google.com>
-Joseph Holsten <joseph@josephholsten.com>
-Joseph Morag <sefim96@gmail.com>
-Josh Baum <joshbaum@google.com>
-Josh Bleecher Snyder <josharian@gmail.com>
-Josh Chorlton <jchorlton@gmail.com>
-Josh Deprez <josh.deprez@gmail.com>
-Josh Goebel <dreamer3@gmail.com>
-Josh Hoak <jhoak@google.com>
-Josh Holland <jrh@joshh.co.uk>
-Josh Rickmar <jrick@companyzero.com>
-Josh Roppo <joshroppo@gmail.com>
-Josh Varga <josh.varga@gmail.com>
-Joshua Bezaleel Abednego <joshua.bezaleel@gmail.com>
-Joshua Boelter <joshua.boelter@intel.com>
-Joshua Chase <jcjoshuachase@gmail.com>
-Joshua Crowgey <jcrowgey@uw.edu>
-Joshua Harshman <joshgreyhat@gmail.com>
-Joshua M. Clulow <josh.clulow@joyent.com>
-Joshua Rubin <joshua@rubixconsulting.com>
-Josselin Costanzi <josselin@costanzi.fr>
-Jostein Stuhaug <js@solidsystem.no>
-JP Sugarbroad <jpsugar@google.com>
-JT Olds <jtolds@xnet5.com>
-JT Olio <hello@jtolio.com>
-Juan Carlos <juanjcsr@gmail.com>
-Juan Pablo Civile <elementohb@gmail.com>
-Jude Pereira <judebpereira@gmail.com>
-Jukka-Pekka Kekkonen <karatepekka@gmail.com>
-Julia Hansbrough <flowerhack@google.com>
-Julian Kornberger <jk+github@digineo.de>
-Julian Pastarmov <pastarmovj@google.com>
-Julian Phillips <julian@quantumfyre.co.uk>
-Julian Tibble <julian.tibble@gmail.com>
-Julie Qiu <julie@golang.org>
-Julien Kauffmann <julien.kauffmann@freelan.org>
-Julien Salleyron <julien.salleyron@gmail.com>
-Julien Schmidt <google@julienschmidt.com>
-Julien Tant <julien@craftyx.fr>
-Julio Montes <julio.montes@intel.com>
-Jun Zhang <jim.zoumo@gmail.com>
-Junchen Li <junchen.li@arm.com>
-Junda Liu <junda@celer.network>
-Jungho Ahn <jhahn@google.com>
-Junya Hayashi <ledmonster@gmail.com>
-Juraj Sukop <sukop@users.noreply.github.com>
-Jure Ham <jure.ham@zemanta.com>
-Justin Gracenin <jgracenin@gmail.com>
-Justin Li <git@justinli.net>
-Justin Nuß <nuss.justin@gmail.com>
-Justyn Temme <justyntemme@gmail.com>
-Kai Backman <kaib@golang.org>
-Kai Dong <dokia2357@gmail.com>
-Kai Lüke <kai@kinvolk.io>
-Kai Trukenmüller <ktye78@gmail.com>
-Kale Blankenship <kale@lemnisys.com>
-Kaleb Elwert <kelwert@atlassian.com>
-Kalman Bekesi <kalmanb@google.com>
-Kamal Aboul-Hosn <aboulhosn@google.com>
-Kamil Chmielewski <kamil.chm@gmail.com>
-Kamil Kisiel <kamil@kamilkisiel.net> <kamil.kisiel@gmail.com>
-Kamil Rytarowski <krytarowski@users.noreply.github.com>
-Kang Hu <hukangustc@gmail.com>
-Kanta Ebihara <kantaebihara@gmail.com>
-Karan Dhiman <karandhi@ca.ibm.com>
-Karel Pazdera <pazderak@gmail.com>
-Karoly Negyesi <chx1975@gmail.com>
-Karsten Köhler <karsten.koehler95@gmail.com>
-Karthik Nayak <karthik.188@gmail.com>
-Kashav Madan <kshvmdn@gmail.com>
-Kate Manson <kate.manson@izettle.com>
-Katharine Berry <ktbry@google.com>
-Katie Hockman <katie@golang.org>
-Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
-Katrina Owen <katrina.owen@gmail.com>
-Kaviraj Kanagaraj <kavirajkanagaraj@gmail.com>
-Kay Zhu <kayzhu@google.com>
-Kazuhiro Sera <seratch@gmail.com>
-KB Sriram <kbsriram@google.com>
-Keegan Carruthers-Smith <keegan.csmith@gmail.com>
-Kei Son <hey.calmdown@gmail.com>
-Keiichi Hirobe <chalenge.akane@gmail.com>
-Keiji Yoshida <keijiyoshida.mail@gmail.com>
-Keisuke Kishimoto <keisuke.kishimoto@gmail.com>
-Keith Ball <inflatablewoman@gmail.com>
-Keith Randall <khr@golang.org>
-Keith Rarick <kr@xph.us>
-Kelly Heller <pestophagous@gmail.com>
-Kelsey Hightower <kelsey.hightower@gmail.com>
-Kelvin Foo Chuan Lyi <vmirage@gmail.com>
-Kemal Elmizan <kemalelmizan@gmail.com>
-Ken Friedenbach <kenliz@cruzio.com>
-Ken Rockot <ken@oz.gs> <ken.rockot@gmail.com>
-Ken Sedgwick <ken@bonsai.com>
-Ken Thompson <ken@golang.org>
-Kenichi Tsunokawa <kenichi.tsunokawa@gmail.com>
-Kenji Kaneda <kenji.kaneda@gmail.com>
-Kenji Yano <kenji.yano@gmail.com>
-Kenneth Shaw <kenshaw@gmail.com>
-Kenny Grant <kennygrant@gmail.com>
-Kensei Nakada <handbomusic@gmail.com>
-Kenta Mori <zoncoen@gmail.com>
-Kerollos Magdy <kerolloz@yahoo.com>
-Ketan Parmar <ketanbparmar@gmail.com>
-Kevan Swanberg <kevswanberg@gmail.com>
-Kevin Albertson <kevin.albertson@mongodb.com>
-Kevin Ballard <kevin@sb.org>
-Kevin Burke <kev@inburke.com>
-Kévin Dunglas <dunglas@gmail.com>
-Kevin Gillette <extemporalgenome@gmail.com>
-Kevin Herro <kevin109104@gmail.com>
-Kevin Kirsche <kev.kirsche@gmail.com>
-Kevin Klues <klueska@gmail.com> <klueska@google.com>
-Kevin Malachowski <chowski@google.com>
-Kevin Parsons <kevpar@microsoft.com>
-Kevin Ruffin <kruffin@gmail.com>
-Kevin Vu <kevin.m.vu@gmail.com>
-Kevin Zita <bleedgreenandgold@gmail.com>
-Keyan Pishdadian <kpishdadian@gmail.com>
-Keyuan Li <keyuanli123@gmail.com>
-Kezhu Wang <kezhuw@gmail.com>
-Khosrow Moossavi <khos2ow@gmail.com>
-Kieran Colford <kieran@kcolford.com>
-Kieran Gorman <kieran.j.gorman@gmail.com>
-Kim Shrier <kshrier@racktopsystems.com>
-Kim Yongbin <kybinz@gmail.com>
-Kir Kolyshkin <kolyshkin@gmail.com>
-Kirill Korotaev <kirillx@gmail.com>
-Kirill Motkov <Motkov.Kirill@gmail.com>
-Kirill Smelkov <kirr@nexedi.com>
-Kirill Tatchihin <kirabsuir@gmail.com>
-Kirk Han <kirk91.han@gmail.com>
-Kirklin McDonald <kirklin.mcdonald@gmail.com>
-KJ Tsanaktsidis <ktsanaktsidis@zendesk.com>
-Klaus Post <klauspost@gmail.com>
-Kodie Goodwin <kodiegoodwin@gmail.com>
-Koichi Shiraishi <zchee.io@gmail.com>
-Koki Ide <niconegoto@yahoo.co.jp>
-Koki Tomoshige <tomocy.dev@gmail.com>
-Komu Wairagu <komuw05@gmail.com>
-Konstantin <konstantin8105@gmail.com>
-Konstantin Shaposhnikov <k.shaposhnikov@gmail.com>
-Koya IWAMURA <kiwamura0314@gmail.com>
-Kris Kwiatkowski <kris@cloudflare.com>
-Kris Nova <kris@nivenly.com>
-Kris Rousey <krousey@google.com>
-Krishna Birla <krishnabirla16@gmail.com>
-Kristopher Watts <traetox@gmail.com>
-Krzysztof Dąbrowski <krzysdabro@live.com>
-Kshitij Saraogi <kshitijsaraogi@gmail.com>
-Kun Li <likunarmstrong@gmail.com>
-Kunpei Sakai <namusyaka@gmail.com>
-Kuntal Majumder <hellozee@disroot.org>
-Kush Patel <kush.patel@hootsuite.com>
-Kyle Consalus <consalus@gmail.com>
-Kyle Isom <kyle@gokyle.net>
-Kyle Jones <kyle@kyledj.com>
-Kyle Lemons <kyle@kylelemons.net> <kevlar@google.com>
-Kyle Nusbaum <kyle@datadog.com>
-Kyle Shannon <kyle@pobox.com>
-Kyle Spiers <eiais@google.com>
-Kyle Wood <kyle@kylewood.cc>
-Kyohei Kadota <lufia@lufia.org>
-Kyrylo Silin <silin@kyrylo.org>
-L Campbell <unpantsu@gmail.com>
-Lai Jiangshan <eag0628@gmail.com>
-Lajos Papp <lalyos@yahoo.com>
-Lakshay Garg <lakshay.garg.1996@gmail.com>
-Lann Martin <lannm@google.com>
-Lanre Adelowo <yo@lanre.wtf>
-Lapo Luchini <lapo@lapo.it>
-Larry Clapp <larry@theclapp.org>
-Larry Hosken <lahosken@golang.org>
-Lars Jeppesen <jeppesen.lars@gmail.com>
-Lars Lehtonen <lars.lehtonen@gmail.com>
-Lars Wiegman <lars@namsral.com>
-Larz Conwell <larzconwell@gmail.com>
-Laurent Voisin <lpvoisin@gmail.com>
-Laurie Clark-Michalek <laurie@qubit.com>
-LE Manh Cuong <cuong.manhle.vn@gmail.com>
-Lee Hinman <hinman@gmail.com>
-Lee Packham <lpackham@gmail.com>
-Lehner Florian <dev@der-flo.net>
-Leigh McCulloch <leighmcc@gmail.com>
-Leo Antunes <leo@costela.net>
-Leo Rudberg <ljr@google.com>
-Leon Klingele <git@leonklingele.de>
-Leonard Wang <wangdeyu0907@gmail.com> <wangdeyu@golangcn.org>
-Leonardo Comelli <leonardo.comelli@gmail.com>
-Leonel Quinteros <leonel.quinteros@gmail.com>
-Lev Shamardin <shamardin@gmail.com>
-Lewin Bormann <lewin.bormann@gmail.com>
-Lewis Waddicor <nemesismk2@gmail.com>
-Li-Yu Yu <aaronyu@google.com>
-Liam Haworth <liam@haworth.id.au>
-Lily Chung <lilithkchung@gmail.com>
-Lingchao Xin <douglarek@gmail.com>
-Lion Yang <lion@aosc.xyz>
-Liz Rice <liz@lizrice.com>
-Lize Cai <lizzzcai1@gmail.com>
-Lloyd Dewolf <foolswisdom@gmail.com>
-Lluís Batlle i Rossell <viric@viric.name>
-Lorenz Bauer <lmb@cloudflare.com>
-Lorenz Brun <lorenz@brun.one>
-Lorenz Nickel <mail@lorenznickel.de>
-Lorenzo Masini <rugginoso@develer.com>
-Lorenzo Stoakes <lstoakes@gmail.com>
-Louis Kruger <louisk@google.com>
-Luan Santos <cfcluan@gmail.com>
-Lubomir I. Ivanov <neolit123@gmail.com>
-Luca Bruno <luca.bruno@coreos.com>
-Luca Greco <luca.greco@alcacoop.it>
-Luca Spiller <luca@stackednotion.com>
-Lucas Bremgartner <lucas.bremgartner@gmail.com>
-Lucas Clemente <lclemente@google.com>
-Lucien Stuker <lucien.stuker@gmail.com>
-Lucio De Re <lucio.dere@gmail.com>
-Ludi Rehak <ludi317@gmail.com>
-Luigi Riefolo <luigi.riefolo@gmail.com>
-Luit van Drongelen <luitvd@gmail.com>
-Luka Zakrajšek <tr00.g33k@gmail.com>
-Luka Zitnik <luka.zitnik@gmail.com>
-Lukasz Milewski <lmmilewski@gmail.com>
-Luke Champine <luke.champine@gmail.com>
-Luke Curley <qpingu@gmail.com>
-Luke Granger-Brown <git@lukegb.com>
-Luke Shumaker <lukeshu@datawire.io>
-Luke Young <bored-engineer@users.noreply.github.com>
-Luna Duclos <luna.duclos@palmstonegames.com>
-Luuk van Dijk <lvd@golang.org> <lvd@google.com>
-Lyle Franklin <lylejfranklin@gmail.com>
-Lynn Boger <laboger@linux.vnet.ibm.com>
-Ma Peiqi <mapeiqi2017@gmail.com>
-Maarten Bezemer <maarten.bezemer@gmail.com>
-Maciej Dębski <maciejd@google.com>
-Madhu Rajanna <madhupr007@gmail.com>
-Magnus Hiie <magnus.hiie@gmail.com>
-Mahdi Hosseini Moghaddam <seyed.mahdi.hosseini.moghaddam@ibm.com>
-Maia Lee <maia.lee@leftfieldlabs.com>
-Maicon Costa <maiconscosta@gmail.com>
-Mak Kolybabi <mak@kolybabi.com>
-Maksym Trykur <maksym.trykur@gmail.com>
-Mal Curtis <mal@mal.co.nz>
-Manfred Touron <m@42.am>
-Manigandan Dharmalingam <manigandan.jeff@gmail.com>
-Manish Goregaokar <manishsmail@gmail.com>
-Manlio Perillo <manlio.perillo@gmail.com>
-Manoj Dayaram <platform-dev@moovweb.com> <manoj.dayaram@moovweb.com>
-Mansour Rahimi <rahimi.mnr@gmail.com>
-Manu Garg <manugarg@google.com>
-Manu S Ajith <neo@codingarena.in>
-Manuel Mendez <mmendez534@gmail.com>
-Marat Khabibullin <marat.khabibullin@jetbrains.com>
-Marc Sanmiquel <marcsanmiquel@gmail.com>
-Marc Weistroff <marc@weistroff.net>
-Marc-Antoine Ruel <maruel@chromium.org>
-Marcel Edmund Franke <marcel.edmund.franke@gmail.com>
-Marcel van Lohuizen <mpvl@golang.org>
-Marcelo Cantos <marcelo.cantos@gmail.com>
-Marcelo E. Magallon <marcelo.magallon@gmail.com>
-Marco Gazerro <gazerro@open2b.com>
-Marco Hennings <marco.hennings@freiheit.com>
-Marcus Weiner <marcus.weiner@gmail.com>
-Marcus Willock <crazcalm@gmail.com>
-Marga Manterola <marga@google.com>
-Mariano Cano <mariano@smallstep.com>
-Marin Bašić <marin.basic02@gmail.com>
-Mario Arranz <marioarranzr@gmail.com>
-Marius A. Eriksen <marius@grailbio.com>
-Marius Nuennerich <mnu@google.com>
-Mark Adams <mark@markadams.me>
-Mark Bucciarelli <mkbucc@gmail.com>
-Mark Dain <mark@markdain.net>
-Mark Glines <mark@glines.org>
-Mark Hansen <markhansen@google.com>
-Mark Harrison <marhar@google.com>
-Mark Jeffery <dandare100@gmail.com>
-Mark Percival <m@mdp.im>
-Mark Pulford <mark@kyne.com.au>
-Mark Rushakoff <mark.rushakoff@gmail.com>
-Mark Ryan <mark.d.ryan@intel.com>
-Mark Severson <miquella@gmail.com>
-Mark Theunissen <mark.theunissen@gmail.com>
-Mark Villacampa <m@markvillacampa.com>
-Mark Wolfe <mark@wolfe.id.au>
-Mark Zavislak <zavislak@google.com>
-Marko Juhani Silokunnas <marko.silokunnas@gmail.com>
-Marko Kevac <marko@kevac.org>
-Marko Kungla <marko.kungla@gmail.com>
-Marko Mikulicic <mkm@google.com>
-Marko Mudrinic <mudrinic.mare@gmail.com>
-Marko Tiikkaja <marko@joh.to>
-Markus Duft <markus.duft@salomon.at>
-Markus Sonderegger <marraison@gmail.com>
-Markus Zimmermann <zimmski@gmail.com>
-Marten Seemann <martenseemann@gmail.com>
-Martin Asquino <martin.asquino@gmail.com>
-Martin Bertschler <mbertschler@gmail.com>
-Martin Garton <garton@gmail.com>
-Martin Habbecke <marhab@google.com>
-Martin Hamrle <martin.hamrle@gmail.com>
-Martin Hoefling <martin.hoefling@gmx.de>
-Martin Kreichgauer <martinkr@google.com>
-Martin Kunc <martinkunc@users.noreply.github.com>
-Martin Lindhe <martin.j.lindhe@gmail.com>
-Martin Möhrmann <martin@golang.org> <moehrmann@google.com> <martisch@uos.de>
-Martin Neubauer <m.ne@gmx.net>
-Martin Olsen <github.com@martinolsen.net>
-Martin Olsson <martin@minimum.se>
-Martin Probst <martin@probst.io>
-Martin Sucha <anty.sk+git@gmail.com>
-Martin Tournoij <martin@arp242.net>
-Martins Sipenko <martins.sipenko@gmail.com>
-Martynas Budriūnas <mabu@google.com>
-Marvin Stenger <marvin.stenger94@gmail.com>
-Marwan Sulaiman <marwan.sulaiman@work.co>
-Maryan Hratson <gmarik@gmail.com>
-Masahiro Furudate <masahiro.furudate@gmail.com>
-Masahiro Wakame <vvakame@gmail.com>
-Masaki Yoshida <yoshida.masaki@gmail.com>
-Masaya Watanabe <sfbgwm30@gmail.com>
-Mat Byczkowski <mbyczkowski@gmail.com>
-Mat Ryer <thatmatryer@gmail.com>
-Máté Gulyás <mgulyas86@gmail.com>
-Matej Baćo <matejbaco@gmail.com>
-Mateus Amin <mateus.amin@gmail.com>
-Mateusz Czapliński <czapkofan@gmail.com>
-Matheus Alcantara <matheusssilv97@gmail.com>
-Mathias Beke <git@denbeke.be>
-Mathias Hall-Andersen <mathias@hall-andersen.dk>
-Mathias Leppich <mleppich@muhqu.de>
-Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
-Mats Lidell <mats.lidell@cag.se> <mats.lidell@gmail.com>
-Matt Aimonetti <mattaimonetti@gmail.com>
-Matt Blair <me@matthewblair.net>
-Matt Bostock <matt@mattbostock.com>
-Matt Brown <mdbrown@google.com>
-Matt Dee <mdee@hioscar.com>
-Matt Drollette <matt@drollette.com>
-Matt Harden <matt.harden@gmail.com>
-Matt Jibson <matt.jibson@gmail.com>
-Matt Joiner <anacrolix@gmail.com>
-Matt Jones <mrjones@google.com>
-Matt Juran <thepciet@gmail.com>
-Matt Layher <mdlayher@gmail.com>
-Matt Masurka <masurka@google.com>
-Matt Pearring <broskies@google.com>
-Matt Reiferson <mreiferson@gmail.com>
-Matt Robenolt <matt@ydekproductions.com>
-Matt Strong <mstrong1341@gmail.com>
-Matt T. Proud <matt.proud@gmail.com>
-Matt Williams <gh@mattyw.net> <mattyjwilliams@gmail.com>
-Matthew Brennan <matty.brennan@gmail.com>
-Matthew Broberg <matthewbbroberg@gmail.com>
-Matthew Cottingham <mattcottingham@gmail.com>
-Matthew Dempsky <mdempsky@google.com>
-Matthew Denton <mdenton@skyportsystems.com>
-Matthew Holt <Matthew.Holt+git@gmail.com>
-Matthew Horsnell <matthew.horsnell@gmail.com>
-Matthew Waters <mwwaters@gmail.com>
-Matthias Dötsch <matze@mdoetsch.de>
-Matthias Frei <matthias.frei@inf.ethz.ch>
-Matthieu Hauglustaine <matt.hauglustaine@gmail.com>
-Matthieu Olivier <olivier.matthieu@gmail.com>
-Matthijs Kooijman <matthijs@stdin.nl>
-Mattias Appelgren <mattias@ppelgren.se>
-Mauricio Alvarado <mauricio.alvarado@leftfieldlabs.com>
-Max Drosdo.www <g1ran1q@gmail.com>
-Max Riveiro <kavu13@gmail.com>
-Max Schmitt <max@schmitt.mx>
-Max Semenik <maxsem.wiki@gmail.com>
-Max Ushakov <ushmax@gmail.com>
-Maxim Eryomenko <moeryomenko@gmail.com>
-Maxim Khitrov <max@mxcrypt.com>
-Maxim Pimenov <mpimenov@google.com>
-Maxim Pugachev <pugachev.mm@gmail.com>
-Maxim Ushakov <ushakov@google.com>
-Maxime de Roucy <maxime.deroucy@gmail.com>
-Máximo Cuadros Ortiz <mcuadros@gmail.com>
-Maxwell Krohn <themax@gmail.com>
-Maya Rashish <maya@NetBSD.org>
-Mayank Kumar <krmayankk@gmail.com>
-Mehrad Sadeghi <2012.linkinpark@gmail.com>
-Meir Fischer <meirfischer@gmail.com>
-Meng Zhuo <mengzhuo1203@gmail.com> <mzh@golangcn.org>
-Mhd Sulhan <m.shulhan@gmail.com>
-Mia Zhu <CrystalZhu1025getu@gmail.com>
-Micah Stetson <micah.stetson@gmail.com>
-Michael Anthony Knyszek <mknyszek@google.com>
-Michael Brandenburg <mbrandenburg@bolste.com>
-Michael Chaten <mchaten@gmail.com>
-Michael Cook <code@mdcook.net>
-Michael Darakananda <pongad@google.com>
-Michael Dorner <mail@michaeldorner.de>
-Michael Edwards <medwards@walledcity.ca>
-Michael Elkins <michael.elkins@gmail.com>
-Michael Ellis <micellis@justin.tv>
-Michael Fraenkel <michael.fraenkel@gmail.com>
-Michael Fromberger <michael.j.fromberger@gmail.com>
-Michael Gehring <mg@ebfe.org> <gnirheg.leahcim@gmail.com>
-Michael Henderson <mdhender@users.noreply.github.com>
-Michael Hendricks <michael@ndrix.org>
-Michael Hoisie <hoisie@gmail.com>
-Michael Hudson-Doyle <michael.hudson@linaro.org>
-Michael Kasch <michael.kasch@gmail.com>
-Michael Käufl <golang@c.michael-kaeufl.de>
-Michael Kelly <mjk@google.com>
-Michaël Lévesque-Dion <mlevesquedion@google.com>
-Michael Lewis <mikelikespie@gmail.com>
-Michael MacInnis <Michael.P.MacInnis@gmail.com>
-Michael Marineau <michael.marineau@coreos.com>
-Michael Matloob <matloob@google.com>
-Michael McConville <momcconville@gmail.com>
-Michael McGreevy <mcgreevy@golang.org>
-Michael McLoughlin <mmcloughlin@gmail.com>
-Michael Munday <mike.munday@ibm.com>
-Michael Pearson <mipearson@gmail.com>
-Michael Piatek <piatek@google.com>
-Michael Pratt <mpratt@google.com>
-Michael Schaller <michael@5challer.de>
-Michael Schurter <michael.schurter@gmail.com>
-Michael Shields <mshields@google.com>
-Michael Stapelberg <michael@stapelberg.de> <mstplbrg@googlemail.com>
-Michael Steinert <mike.steinert@gmail.com>
-Michael T. Jones <mtj@google.com> <michael.jones@gmail.com>
-Michael Teichgräber <mteichgraeber@gmx.de> <mt4swm@googlemail.com>
-Michael Traver <mtraver@google.com>
-Michael Vetter <g.bluehut@gmail.com>
-Michael Vogt <mvo@ubuntu.com>
-Michail Kargakis <mkargaki@redhat.com>
-Michal Bohuslávek <mbohuslavek@gmail.com>
-Michal Cierniak <cierniak@google.com>
-Michał Derkacz <ziutek@lnet.pl>
-Michal Franc <lam.michal.franc@gmail.com>
-Michal Hruby <michal@axiom.co>
-Michał Łowicki <mlowicki@gmail.com>
-Michal Pristas <michal.pristas@gmail.com>
-Michal Rostecki <mrostecki@suse.de>
-Michal Stokluska <mstoklus@redhat.com>
-Michalis Kargakis <michaliskargakis@gmail.com>
-Michel Lespinasse <walken@google.com>
-Michel Levieux <mlevieux42@gmail.com>
-Michele Di Pede <michele.di.pede@gmail.com>
-Mickael Kerjean <mickael.kerjean@gmail.com>
-Mickey Reiss <mickeyreiss@gmail.com>
-Miek Gieben <miek@miek.nl> <remigius.gieben@gmail.com>
-Miguel Acero <acero@google.com>
-Miguel Mendez <stxmendez@gmail.com>
-Miguel Molina <hi@mvader.me>
-Mihai Borobocea <MihaiBorobocea@gmail.com>
-Mihai Moldovan <ionic@ionic.de>
-Mihai Todor <todormihai@gmail.com>
-Mihail Minaev <minaev.mike@gmail.com>
-Mikael Tillenius <mikti42@gmail.com>
-Mike Andrews <mra@xoba.com>
-Mike Appleby <mike@app.leby.org>
-Mike Danese <mikedanese@google.com>
-Mike Houston <mike@kothar.net>
-Mike Kabischev <kabischev@gmail.com>
-Mike Rosset <mike.rosset@gmail.com>
-Mike Samuel <mikesamuel@gmail.com>
-Mike Solomon <msolo@gmail.com>
-Mike Strosaker <strosake@us.ibm.com>
-Mike Tsao <mike@sowbug.com>
-Mike Wiacek <mjwiacek@google.com>
-Mikhail Faraponov <11322032+moredure@users.noreply.github.com>
-Mikhail Fesenko <proggga@gmail.com>
-Mikhail Gusarov <dottedmag@dottedmag.net>
-Mikhail Panchenko <m@mihasya.com>
-Miki Tebeka <miki.tebeka@gmail.com>
-Mikio Hara <mikioh.mikioh@gmail.com>
-Mikkel Krautz <mikkel@krautz.dk> <krautz@gmail.com>
-Mikołaj Baranowski <mikolajb@gmail.com>
-Milan Knezevic <milan.knezevic@mips.com>
-Milan Patel <bicelot3@gmail.com>
-Milutin Jovanović <jovanovic.milutin@gmail.com>
-MinJae Kwon <mingrammer@gmail.com>
-Miquel Sabaté Solà <mikisabate@gmail.com>
-Mirko Hansen <baaazen@gmail.com>
-Miroslav Genov <mgenov@gmail.com>
-Misty De Meo <mistydemeo@gmail.com>
-Mohamed Attahri <mohamed@attahri.com>
-Mohit Agarwal <mohit@sdf.org>
-Mohit kumar Bajoria <mohitbajo36@gmail.com>
-Mohit Verma <vmohit.93@gmail.com>
-Momchil Velikov <momchil.velikov@gmail.com>
-Monis Khan <mkhan@redhat.com>
-Monty Taylor <mordred@inaugust.com>
-Moritz Fain <moritz@fain.io>
-Moriyoshi Koizumi <mozo@mozo.jp>
-Morten Siebuhr <sbhr@sbhr.dk>
-Môshe van der Sterre <moshevds@gmail.com>
-Mostafa Solati <mostafa.solati@gmail.com>
-Mostyn Bramley-Moore <mostyn@antipode.se>
-Mrunal Patel <mrunalp@gmail.com>
-Muhammad Falak R Wani <falakreyaz@gmail.com>
-Muhammad Hamza Farrukh <hamzafarrukh141@gmail.com>
-Muhammed Uluyol <uluyol0@gmail.com>
-Muir Manders <muir@mnd.rs>
-Mukesh Sharma <sharma.mukesh439@gmail.com>
-Mura Li <mura_li@castech.com.tw>
-Mykhailo Lesyk <mikhail@lesyk.org>
-Nahum Shalman <nahamu@gmail.com>
-Naman Aggarwal <aggarwal.nam@gmail.com>
-Naman Gera <namangera15@gmail.com>
-Nan Deng <monnand@gmail.com>
-Nao Yonashiro <owan.orisano@gmail.com>
-Naoki Kanatani <k12naoki@gmail.com>
-Natanael Copa <ncopa@mirantis.com>
-Nate Wilkinson <nathanwilk7@gmail.com>
-Nathan Cantelmo <n.cantelmo@gmail.com>
-Nathan Caza <mastercactapus@gmail.com>
-Nathan Dias <nathan.dias@orijtech.com>
-Nathan Fiscaletti <nathan.fiscaletti@vrazo.com>
-Nathan Humphreys <nkhumphreys@gmail.com>
-Nathan John Youngman <nj@nathany.com>
-Nathan Otterness <otternes@cs.unc.edu>
-Nathan P Finch <nate.finch@gmail.com>
-Nathan VanBenschoten <nvanbenschoten@gmail.com>
-Nathan Youngman <git@nathany.com>
-Nathan(yinian) Hu <nathanhu@google.com>
-Nathaniel Cook <nvcook42@gmail.com>
-Naveen Kumar Sangi <naveenkumarsangi@protonmail.com>
-Neeilan Selvalingam <neeilan96@gmail.com>
-Neelesh Chandola <neelesh.c98@gmail.com>
-Nehal J Wani <nehaljw.kkd1@gmail.com>
-Neil Alexander <neilalexander@neilalexander.dev>
-Neil Lyons <nwjlyons@googlemail.com>
-Neuman Vong <neuman.vong@gmail.com>
-Neven Sajko <nsajko@gmail.com>
-Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
-Niall Sheridan <nsheridan@gmail.com>
-Nic Day <nic.day@me.com>
-Nicholas Asimov <nicholas@asimov.me>
-Nicholas Katsaros <nick@nickkatsaros.com>
-Nicholas Maniscalco <nicholas@maniscalco.com>
-Nicholas Ng <nickng@nickng.io>
-Nicholas Presta <nick@nickpresta.ca> <nick1presta@gmail.com>
-Nicholas Sullivan <nicholas.sullivan@gmail.com>
-Nicholas Waples <nwaples@gmail.com>
-Nick Anthony <Liberatys@outlook.com>
-Nick Cooper <nmvc@google.com>
-Nick Craig-Wood <nick@craig-wood.com> <nickcw@gmail.com>
-Nick Harper <nharper@google.com>
-Nick Kubala <nkubala@google.com>
-Nick Leli <nicholasleli@gmail.com>
-Nick Miyake <nmiyake@users.noreply.github.com>
-Nick Patavalis <nick.patavalis@gmail.com>
-Nick Petroni <npetroni@cs.umd.edu>
-Nick Robinson <nrobinson13@gmail.com>
-Nick Sherron <nsherron90@gmail.com>
-Nick Smolin <nick27surgut@gmail.com>
-Nicolas BRULEZ <n.brulez@gmail.com>
-Nicolas Kaiser <nikai@nikai.net>
-Nicolas Owens <mischief@offblast.org>
-Nicolas S. Dade <nic.dade@gmail.com>
-Niek Sanders <niek.sanders@gmail.com>
-Niels Widger <niels.widger@gmail.com>
-Nigel Kerr <nigel.kerr@gmail.com>
-Nigel Tao <nigeltao@golang.org>
-Nik Nyby <nnyby@columbia.edu>
-Nikhil Benesch <nikhil.benesch@gmail.com>
-Nikita Gillmann <nikita@n0.is> <ng0@n0.is>
-Nikita Kryuchkov <nkryuchkov10@gmail.com>
-Nikita Melekhin <nimelehin@gmail.com>
-Nikita Vanyasin <nikita.vanyasin@gmail.com>
-Niklas Schnelle <niklas.schnelle@gmail.com>
-Niko Dziemba <niko@dziemba.com>
-Nikolay Turpitko <nikolay@turpitko.com>
-Nikson Kanti Paul <nikson.sust@gmail.com>
-Nils Larsgård <nilsmagnus@gmail.com>
-Nir Soffer <nirsof@gmail.com>
-Niranjan Godbole <niranjan8192@gmail.com>
-Nishanth Shanmugham <nishanth.gerrard@gmail.com>
-Noah Campbell <noahcampbell@gmail.com>
-Noah Goldman <noahg34@gmail.com>
-Noah Santschi-Cooney <noah@santschi-cooney.ch>
-Noble Johnson <noblepoly@gmail.com>
-Nodir Turakulov <nodir@google.com>
-Noel Georgi <git@frezbo.com>
-Nooras Saba <saba@golang.org>
-Norberto Lopes <nlopes.ml@gmail.com>
-Norman B. Lancaster <qbradq@gmail.com>
-Nuno Cruces <ncruces@users.noreply.github.com>
-Obei Sideg <obei.sideg@gmail.com>
-Obeyda Djeffal <djefobey@gmail.com>
-Odin Ugedal <odin@ugedal.com>
-Oleg Bulatov <dmage@yandex-team.ru>
-Oleg Vakheta <helginet@gmail.com>
-Oleku Konko <oleku.konko@gmail.com>
-Oling Cat <olingcat@gmail.com>
-Oliver Hookins <ohookins@gmail.com>
-Oliver Powell <oliverpowell84@gmail.com>
-Oliver Stenbom <ostenbom@pivotal.io>
-Oliver Tan <otan@cockroachlabs.com>
-Oliver Tonnhofer <olt@bogosoft.com>
-Olivier Antoine <olivier.antoine@gmail.com>
-Olivier Duperray <duperray.olivier@gmail.com>
-Olivier Mengué <olivier.mengue@gmail.com>
-Olivier Poitrey <rs@dailymotion.com>
-Olivier Saingre <osaingre@gmail.com>
-Olivier Wulveryck <olivier.wulveryck@gmail.com>
-Omar Jarjur <ojarjur@google.com>
-Onkar Jadhav <omjadhav2610@gmail.com>
-Ori Bernstein <ori@eigenstate.org>
-Ori Rawlings <orirawlings@gmail.com>
-Oryan Moshe <iamoryanmoshe@gmail.com>
-Osamu TONOMORI <osamingo@gmail.com>
-Oscar Söderlund <oscar.soderlund@einride.tech>
-Özgür Kesim <oec-go@kesim.org>
-Pablo Caderno <kaderno@gmail.com>
-Pablo Lalloni <plalloni@gmail.com>
-Pablo Rozas Larraondo <pablo.larraondo@anu.edu.au>
-Pablo Santiago Blum de Aguiar <scorphus@gmail.com>
-Padraig Kitterick <padraigkitterick@gmail.com>
-Pallat Anchaleechamaikorn <yod.pallat@gmail.com>
-Pan Chenglong <1004907659@qq.com>
-Panos Georgiadis <pgeorgiadis@suse.de>
-Pantelis Sampaziotis <psampaz@gmail.com>
-Paolo Giarrusso <p.giarrusso@gmail.com>
-Paolo Martini <mrtnpaolo@gmail.com>
-Parker Moore <parkrmoore@gmail.com>
-Parminder Singh <parmsingh101@gmail.com>
-Pascal Dierich <pascal@pascaldierich.com>
-Pascal S. de Kloe <pascal@quies.net>
-Paschalis Tsilias <paschalis.tsilias@gmail.com>
-Pasi Tähkäpää <pasi.tahkapaa@gmail.com>
-Pat Moroney <pat@pat.email>
-Patrick Barker <barkerp@vmware.com>
-Patrick Crosby <patrick@stathat.com>
-Patrick Gavlin <pgavlin@gmail.com>
-Patrick Gundlach <gundlach@speedata.de>
-Patrick Higgins <patrick.allen.higgins@gmail.com>
-Patrick Jones <ithuriel@google.com>
-Patrick Lee <pattyshack101@gmail.com>
-Patrick Mézard <patrick@mezard.eu>
-Patrick Mylund Nielsen <patrick@patrickmn.com>
-Patrick Pelletier <pp.pelletier@gmail.com>
-Patrick Riley <pfr@google.com>
-Patrick Smith <pat42smith@gmail.com>
-Patrik Lundin <patrik@sigterm.se>
-Patrik Nyblom <pnyb@google.com>
-Paul A Querna <paul.querna@gmail.com>
-Paul Borman <borman@google.com>
-Paul Boyd <boyd.paul2@gmail.com>
-Paul Chang <paulchang@google.com>
-Paul D. Weber <x0bdev@gmail.com>
-Paul Davis <43160081+Pawls@users.noreply.github.com>
-Paul E. Murphy <murp@ibm.com>
-Paul Forgey <paulf@tessier-ashpool.net>
-Paul Hammond <paul@paulhammond.org>
-Paul Hankin <paulhankin@google.com>
-Paul Jolly <paul@myitcv.org.uk>
-Paul Lalonde <paul.a.lalonde@gmail.com>
-Paul M Furley <paul@paulfurley.com>
-Paul Marks <pmarks@google.com>
-Paul Meyer <paul.meyer@microsoft.com>
-Paul Nasrat <pnasrat@google.com>
-Paul PISCUC <paul.piscuc@gmail.com>
-Paul Querna <pquerna@apache.org>
-Paul Rosania <paul.rosania@gmail.com>
-Paul Ruest <pruest@gmail.com>
-Paul Sbarra <Sbarra.Paul@gmail.com>
-Paul Smith <paulsmith@pobox.com> <paulsmith@gmail.com>
-Paul Tyng <paul@paultyng.net>
-Paul van Brouwershaven <paul@vanbrouwershaven.com>
-Paul Wankadia <junyer@google.com>
-Paulo Casaretto <pcasaretto@gmail.com>
-Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
-Paulo Gomes <paulo.gomes.uk@gmail.com>
-Pavel Kositsyn <kositsyn.pa@phystech.edu>
-Pavel Paulau <pavel.paulau@gmail.com>
-Pavel Watson <watsonpavel@gmail.com>
-Pavel Zinovkin <pavel.zinovkin@gmail.com>
-Pavlo Sumkin <ymkins@gmail.com>
-Pawel Knap <pawelknap88@gmail.com>
-Pawel Szczur <filemon@google.com>
-Paweł Szulik <pawel.szulik@intel.com>
-Pedro Lopez Mareque <pedro.lopez.mareque@gmail.com>
-Pei Xian Chee <luciolas1991@gmail.com>
-Pei-Ming Wu <p408865@gmail.com>
-Pen Tree <appletree2479@outlook.com>
-Peng Gao <peng.gao.dut@gmail.com>
-Percy Wegmann <ox.to.a.cart@gmail.com>
-Perry Abbott <perry.j.abbott@gmail.com>
-Petar Dambovaliev <petar.atanasov.1987@gmail.com>
-Petar Maymounkov <petarm@gmail.com>
-Peter Armitage <peter.armitage@gmail.com>
-Peter Bourgon <peter@bourgon.org>
-Peter Collingbourne <pcc@google.com>
-Peter Conerly <pconerly@gmail.com>
-Peter Dotchev <dotchev@gmail.com>
-Peter Froehlich <peter.hans.froehlich@gmail.com>
-Peter Gonda <pgonda@google.com>
-Peter Hoyes <pahoyes@gmail.com>
-Peter Kleiweg <pkleiweg@xs4all.nl>
-Peter McKenzie <petermck@google.com>
-Peter Moody <pmoody@uber.com>
-Peter Morjan <pmorjan@gmail.com>
-Peter Mundy <go.peter.90@gmail.com>
-Peter Nguyen <peter@mictis.com>
-Péter Surányi <speter.go1@gmail.com>
-Péter Szabó <pts@google.com>
-Péter Szilágyi <peterke@gmail.com>
-Peter Teichman <pteichman@fastly.com>
-Peter Tseng <ptseng@squareup.com>
-Peter Waldschmidt <peter@waldschmidt.com>
-Peter Waller <peter.waller@gmail.com>
-Peter Weinberger <pjw@golang.org>
-Peter Williams <pwil3058@gmail.com>
-Peter Wu <pwu@cloudflare.com>
-Peter Zhang <i@ddatsh.com>
-Petr Jediný <petr.jediny@gmail.com>
-Petrica Voicu <pvoicu@paypal.com>
-Phil Pearl <philip.j.r.pearl@gmail.com>
-Phil Pennock <pdp@golang.org>
-Philip Børgesen <philip.borgesen@gmail.com>
-Philip Brown <phil@bolthole.com>
-Philip Hofer <phofer@umich.edu>
-Philip K. Warren <pkwarren@gmail.com>
-Philip Nelson <me@pnelson.ca>
-Philipp Sauter <sauterp@protonmail.com>
-Philipp Stephani <phst@google.com>
-Phillip Campbell <15082+phillc@users.noreply.github.com>
-Pierre Carru <pierre.carru@eshard.com>
-Pierre Durand <pierredurand@gmail.com>
-Pierre Prinetti <pierreprinetti@gmail.com>
-Pierre Roullon <pierre.roullon@gmail.com>
-Piers <google@hellopiers.pro>
-Pieter Droogendijk <pieter@binky.org.uk>
-Pietro Gagliardi <pietro10@mac.com>
-Piyush Mishra <piyush@codeitout.com>
-Plekhanov Maxim <kishtatix@gmail.com>
-Poh Zi How <poh.zihow@gmail.com>
-Polina Osadcha <polliosa@google.com>
-Pontus Leitzler <leitzler@gmail.com>
-Povilas Versockas <p.versockas@gmail.com>
-Prajwal Koirala <16564273+Prajwal-Koirala@users.noreply.github.com>
-Prasanga Siripala <pj@pjebs.com.au>
-Prasanna Swaminathan <prasanna@mediamath.com>
-Prashant Agrawal <prashant.a.vjti@gmail.com>
-Prashant Varanasi <prashant@prashantv.com>
-Praveen Kumar <praveen+git@kumar.in>
-Pravendra Singh <hackpravj@gmail.com>
-Preetam Jinka <pj@preet.am>
-Pure White <wu.purewhite@gmail.com>
-Qais Patankar <qaisjp@gmail.com>
-Qiuxuan Zhu <ilsh1022@gmail.com>
-Quan Tran <qeed.quan@gmail.com>
-Quan Yong Zhai <qyzhai@gmail.com>
-Quentin Perez <qperez@ocs.online.net>
-Quentin Renard <contact@asticode.com>
-Quentin Smith <quentin@golang.org>
-Quey-Liang Kao <s101062801@m101.nthu.edu.tw>
-Quim Muntal <quimmuntal@gmail.com>
-Quinn Slack <sqs@sourcegraph.com>
-Quinten Yearsley <qyearsley@chromium.org>
-Quoc-Viet Nguyen <afelion@gmail.com>
-Rabin Gaire <rabingaire20@gmail.com>
-Radek Simko <radek.simko@gmail.com>
-Radek Sohlich <sohlich@gmail.com>
-Radu Berinde <radu@cockroachlabs.com>
-Rafal Jeczalik <rjeczalik@gmail.com>
-Raghavendra Nagaraj <jamdagni86@gmail.com>
-Rahul Bajaj <rahulrb0509@gmail.com>
-Rahul Chaudhry <rahulchaudhry@chromium.org>
-Rahul Wadhwani <rahulwadhwani21@gmail.com>
-Raif S. Naffah <go@naffah-raif.name>
-Rajat Goel <rajat.goel2010@gmail.com>
-Rajath Agasthya <rajathagasthya@gmail.com>
-Rajender Reddy Kompally <rajenderreddykompally@gmail.com>
-Ralph Corderoy <ralph@inputplus.co.uk>
-Ramazan AYYILDIZ <rayyildiz@gmail.com>
-Ramesh Dharan <dharan@google.com>
-Randy Reddig <randy@alta.software>
-Raph Levien <raph@google.com>
-Raphael Geronimi <raphael.geronimi@gmail.com>
-Raul Silvera <rsilvera@google.com>
-Ravil Bikbulatov <weeellz12@gmail.com>
-RaviTeja Pothana <ravi.tezu@gmail.com>
-Ray Tung <rtung@thoughtworks.com>
-Ray Wu <ray@liftoff.io>
-Raymond Kazlauskas <raima220@gmail.com>
-Rebecca Stambler <rstambler@golang.org>
-Reilly Watson <reillywatson@gmail.com>
-Reinaldo de Souza Jr <juniorz@gmail.com>
-Remi Gillig <remigillig@gmail.com>
-Rémy Oudompheng <oudomphe@phare.normalesup.org> <remyoudompheng@gmail.com>
-Ren Ogaki <re.yuz77777@gmail.com>
-Rens Rikkerink <Ikkerens@users.noreply.github.com>
-Rhys Hiltner <rhys@justin.tv>
-Ricardo Padilha <ricardospadilha@gmail.com>
-Ricardo Pchevuzinske Katz <ricardo.katz@serpro.gov.br>
-Ricardo Seriani <ricardo.seriani@gmail.com>
-Rich Hong <hong.rich@gmail.com>
-Richard Barnes <rlb@ipv.sx>
-Richard Crowley <r@rcrowley.org>
-Richard Dingwall <rdingwall@gmail.com>
-Richard Eric Gavaletz <gavaletz@gmail.com>
-Richard Gibson <richard.gibson@gmail.com>
-Richard Miller <miller.research@gmail.com>
-Richard Musiol <mail@richard-musiol.de> <neelance@gmail.com>
-Richard Pickering <richard.pickering@hotmail.co.uk>
-Richard Ulmer <codesoap@mailbox.org>
-Richard Wilkes <wilkes@me.com>
-Rick Arnold <rickarnoldjr@gmail.com>
-Rick Hudson <rlh@golang.org>
-Rick Sayre <whorfin@gmail.com>
-Rijnard van Tonder <rvantonder@gmail.com>
-Riku Voipio <riku.voipio@linaro.org>
-Riley Avron <ra.git@posteo.net>
-Risto Jaakko Saarelma <rsaarelm@gmail.com>
-Rob Earhart <earhart@google.com>
-Rob Findley <rfindley@google.com>
-Rob Norman <rob.norman@infinitycloud.com>
-Rob Phoenix <rob@robphoenix.com>
-Rob Pike <r@golang.org>
-Robert Ayrapetyan <robert.ayrapetyan@gmail.com>
-Robert Burke <rebo@google.com>
-Robert Daniel Kortschak <dan.kortschak@adelaide.edu.au> <dan@kortschak.io>
-Robert Dinu <r@varp.se>
-Robert Engels <rengels@ix.netcom.com>
-Robert Figueiredo <robfig@gmail.com>
-Robert Griesemer <gri@golang.org>
-Robert Hencke <robert.hencke@gmail.com>
-Robert Iannucci <iannucci@google.com>
-Robert Kuska <rkuska@gmail.com>
-Robert Obryk <robryk@gmail.com>
-Robert Sesek <rsesek@google.com>
-Robert Snedegar <roberts@google.com>
-Robert Stepanek <robert.stepanek@gmail.com>
-Robert van Gent <rvangent@google.com>
-Robert-André Mauchin <zebob.m@gmail.com>
-Roberto Clapis <robclap8@gmail.com>
-Roberto Selbach <roberto@selbach.ca>
-Robin Eklind <r.eklind.87@gmail.com>
-Robin Zhong <robin@robinzhong.co>
-Rodolfo Carvalho <rhcarvalho@gmail.com>
-Rodolfo Rodriguez <rodolfobgibson@gmail.com>
-Rodrigo Moraes de Oliveira <rodrigo.moraes@gmail.com>
-Rodrigo Rafael Monti Kochenburger <divoxx@gmail.com>
-Roger Pau Monné <royger@gmail.com>
-Roger Peppe <rogpeppe@gmail.com>
-Rohan Challa <rohan@golang.org>
-Rohan Verma <rohanverma2004@gmail.com>
-Rohith Ravi <entombedvirus@gmail.com>
-Roi Martin <jroi.martin@gmail.com>
-Roland Illig <roland.illig@gmx.de>
-Roland Shoemaker <rolandshoemaker@gmail.com>
-Romain Baugue <romain.baugue@elwinar.com>
-Roman Budnikov <romanyx90@yandex.ru>
-Roman Kollár <roman.kollar.0@gmail.com>
-Roman Shchekin <mrqtros@gmail.com>
-Ron Hashimoto <mail@h2so5.net>
-Ron Minnich <rminnich@gmail.com>
-Ronnie Ebrin <ebrin.ronnie@protonmail.com>
-Ross Chater <rdchater@gmail.com>
-Ross Kinsey <rossikinsey@gmail.com>
-Ross Light <light@google.com> <rlight2@gmail.com>
-Ross Smith II <ross@smithii.com>
-Rowan Marshall <rowanajmarshall@gmail.com>
-Rowan Worth <sqweek@gmail.com>
-Rudi Kramer <rudi.kramer@gmail.com>
-Rui Ueyama <ruiu@google.com>
-Ruixin Bao <ruixin.bao@ibm.com>
-Ruslan Andreev <ruslan.andreev@huawei.com>
-Ruslan Nigmatullin <elessar@dropbox.com>
-Russ Cox <rsc@golang.org>
-Russell Haering <russellhaering@gmail.com>
-Ryan Bagwell <ryanbagwell@outlook.com>
-Ryan Barrett <ryanb@google.com>
-Ryan Boehning <ryan.boehning@apcera.com>
-Ryan Brown <ribrdb@google.com>
-Ryan Canty <jrcanty@gmail.com>
-Ryan Dahl <ry@tinyclouds.org>
-Ryan Hitchman <hitchmanr@gmail.com>
-Ryan Kohler <ryankohler@google.com>
-Ryan Leung <rleungx@gmail.com>
-Ryan Lower <rpjlower@gmail.com>
-Ryan Roden-Corrent <ryan@rcorre.net>
-Ryan Seys <ryan@ryanseys.com>
-Ryan Slade <ryanslade@gmail.com>
-Ryan Zhang <ryan.zhang@docker.com>
-Ryoichi KATO <ryo1kato@gmail.com>
-Ryoya Sekino <ryoyasekino1993@gmail.com>
-Ryuji Iwata <qt.luigi@gmail.com>
-Ryuma Yoshida <ryuma.y1117@gmail.com>
-Ryuzo Yamamoto <ryuzo.yamamoto@gmail.com>
-S.Çağlar Onur <caglar@10ur.org>
-Sabin Mihai Rapan <sabin.rapan@gmail.com>
-Sad Pencil <qh06@qq.com>
-Sai Cheemalapati <saicheems@google.com>
-Sai Kiran Dasika <kirandasika30@gmail.com>
-Sakeven Jiang <jc5930@sina.cn>
-Salaheddin M. Mahmud <salah.mahmud@gmail.com>
-Salmān Aljammāz <s@0x65.net>
-Sam Arnold <sarnold64@bloomberg.net>
-Sam Boyer <tech@samboyer.org>
-Sam Chen <chenxsan@gmail.com>
-Sam Cross <samgcdev@gmail.com>
-Sam Ding <samding@ca.ibm.com>
-Sam Hug <samuel.b.hug@gmail.com>
-Sam Thorogood <thorogood@google.com> <sam.thorogood@gmail.com>
-Sam Whited <sam@samwhited.com>
-Sam Xie <xsambundy@gmail.com>
-Sameer Ajmani <sameer@golang.org> <ajmani@gmail.com>
-Sami Commerot <samic@google.com>
-Sami Pönkänen <sami.ponkanen@gmail.com>
-Samuel Kelemen <SCKelemen@users.noreply.github.com>
-Samuel Tan <samueltan@google.com>
-Samuele Pedroni <pedronis@lucediurna.net>
-San Ye <xyesan@gmail.com>
-Sander van Harmelen <sander@vanharmelen.nl>
-Sanjay Menakuru <balasanjay@gmail.com>
-Santhosh Kumar Tekuri <santhosh.tekuri@gmail.com>
-Santiago De la Cruz <51337247+xhit@users.noreply.github.com>
-Sarah Adams <shadams@google.com>
-Sardorbek Pulatov <sardorbek.pulatov@outlook.com>
-Sascha Brawer <sascha@brawer.ch>
-Sasha Lionheart <lionhearts@google.com>
-Sasha Sobol <sasha@scaledinference.com>
-Satoru Kitaguchi <rule.the.fate.myfirststory@gmail.com>
-Scott Barron <scott.barron@github.com>
-Scott Bell <scott@sctsm.com>
-Scott Cotton <scott@mindowl.com>
-Scott Crunkleton <crunk1@gmail.com>
-Scott Ferguson <scottwferg@gmail.com>
-Scott Lawrence <bytbox@gmail.com>
-Scott Mansfield <smansfield@netflix.com>
-Scott Ragan <ragansa@fb.com>
-Scott Schwartz <scotts@golang.org>
-Scott Van Woudenberg <scottvw@google.com>
-Sean Burford <sburford@google.com>
-Sean Chen <oohcode@gmail.com>
-Sean Chittenden <seanc@joyent.com>
-Sean Christopherson <sean.j.christopherson@intel.com>
-Sean Dolphin <Sean.Dolphin@kpcompass.com>
-Sean Harger <sharger@google.com>
-Sean Harrington <sean.harrington@leftfieldlabs.com>
-Sean Hildebrand <seanwhildebrand@gmail.com>
-Sean Liao <seankhliao@gmail.com>
-Sean Rees <sean@erifax.org>
-Sebastiaan van Stijn <github@gone.nl>
-Sebastian Chlopecki <sebsebmc@gmail.com>
-Sebastian Kinne <skinne@google.com>
-Sebastian Schmidt <yath@google.com>
-Sebastien Binet <seb.binet@gmail.com>
-Sébastien Paolacci <sebastien.paolacci@gmail.com>
-Sebastien Williams-Wynn <sebastien@cytora.com>
-Segev Finer <segev208@gmail.com>
-Seiji Takahashi <timaki.st@gmail.com>
-Sergei Lemeshkin <sergeilem@gmail.com>
-Sergei Skorobogatov <skorobo@rambler.ru>
-Sergei Zagurskii <gvozdoder@gmail.com>
-Sergey 'SnakE' Gromov <snake.scaly@gmail.com>
-Sergey Arseev <sergey.arseev@intel.com>
-Sergey Dobrodey <sergey.dobrodey@synesis.ru>
-Sergey Frolov <sfrolov@google.com>
-Sergey Glushchenko <gsserge@gmail.com>
-Sergey Ivanov <ser1325@gmail.com>
-Sergey Kacheev <S.Kacheev@gmail.com>
-Sergey Lukjanov <me@slukjanov.name>
-Sergey Mishin <sergeymishine@gmail.com>
-Sergey Mudrik <sergey.mudrik@gmail.com>
-Sergey Semin <gray12511@gmail.com>
-Sergey Yanykin <syanykin@ozon.ru>
-Sergio Luis O. B. Correia <sergio@correia.cc>
-Sergiusz Bazanski <bazanski@gmail.com>
-Serhat Giydiren <serhatgiydiren@gmail.com>
-Serhii Aheienko <serhii.aheienko@gmail.com>
-Seth Hoenig <seth.a.hoenig@gmail.com>
-Seth Vargo <sethvargo@gmail.com>
-Shaba Abhiram <shabarivas.abhiram@gmail.com>
-Shahar Kohanim <skohanim@gmail.com>
-Shailesh Suryawanshi <ss.shailesh28@gmail.com>
-Shamil Garatuev <garatuev@gmail.com>
-Shamim Akhtar <shamim.rhce@gmail.com>
-Shane Hansen <shanemhansen@gmail.com>
-Shang Jian Ding <sding3@ncsu.edu>
-Shaozhen Ding <dsz0111@gmail.com>
-Shaquille Que <shaquille@golang.org>
-Shaquille Wyan Que <shaqqywyan@gmail.com>
-Shaun Dunning <shaun.dunning@uservoice.com>
-Shawn Elliott <selliott@microsoft.com>
-Shawn Ledbetter <sledbetter@google.com>
-Shawn Smith <shawn.p.smith@gmail.com>
-Shawn Walker-Salas <shawn.walker@oracle.com>
-Shenghou Ma <minux@golang.org> <minux.ma@gmail.com>
-Shengjing Zhu <zsj950618@gmail.com>
-Shengyu Zhang <shengyu.zhang@chaitin.com>
-Shi Han Ng <shihanng@gmail.com>
-ShihCheng Tu <mrtoastcheng@gmail.com>
-Shijie Hao <haormj@gmail.com>
-Shin Fan <shinfan@google.com>
-Shinji Tanaka <shinji.tanaka@gmail.com>
-Shinnosuke Sawada <6warashi9@gmail.com>
-Shintaro Kaneko <kaneshin0120@gmail.com>
-Shivakumar GN <shivakumar.gn@gmail.com>
-Shivani Singhal <shivani.singhal2804@gmail.com>
-Shivansh Rai <shivansh@freebsd.org>
-Shivashis Padhi <shivashispadhi@gmail.com>
-Shoshin Nikita <shoshin_nikita@fastmail.com>
-Shota Sugiura <s.shota.710.3506@gmail.com>
-Shubham Sharma <shubham.sha12@gmail.com>
-Shuhei Takahashi <nya@chromium.org>
-Shun Fan <sfan@google.com>
-Silvan Jegen <s.jegen@gmail.com>
-Simão Gomes Viana <simaogmv@gmail.com>
-Simarpreet Singh <simar@linux.com>
-Simon Drake <simondrake1990@gmail.com>
-Simon Ferquel <simon.ferquel@docker.com>
-Simon Frei <freisim93@gmail.com>
-Simon Jefford <simon.jefford@gmail.com>
-Simon Law <sfllaw@sfllaw.ca>
-Simon Rawet <simon@rawet.se>
-Simon Rozman <simon@rozman.si>
-Simon Ser <contact@emersion.fr>
-Simon Thulbourn <simon+github@thulbourn.com>
-Simon Whitehead <chemnova@gmail.com>
-Sina Siadat <siadat@gmail.com>
-Sjoerd Siebinga <sjoerd.siebinga@gmail.com>
-Sokolov Yura <funny.falcon@gmail.com>
-Song Gao <song@gao.io>
-Song Lim <songlim327@gmail.com>
-Songjiayang <songjiayang1@gmail.com>
-Songlin Jiang <hollowman@hollowman.ml>
-Soojin Nam <jsunam@gmail.com>
-Søren L. Hansen <soren@linux2go.dk>
-Sparrow Li <liyuancylx@gmail.com>
-Spencer Kocot <spencerkocot@gmail.com>
-Spencer Nelson <s@spenczar.com>
-Spencer Tung <spencertung@google.com>
-Spenser Black <spenserblack01@gmail.com>
-Spring Mc <heresy.mc@gmail.com>
-Srdjan Petrovic <spetrovic@google.com>
-Sridhar Venkatakrishnan <sridhar@laddoo.net>
-Srinidhi Kaushik <shrinidhi.kaushik@gmail.com>
-StalkR <stalkr@stalkr.net>
-Stan Hu <stanhu@gmail.com>
-Stan Schwertly <stan@schwertly.com>
-Stanislav Afanasev <php.progger@gmail.com>
-Steeve Morin <steeve.morin@gmail.com>
-Stefan Baebler <sbaebler@outbrain.com>
-Stefan Nilsson <snilsson@nada.kth.se> <trolleriprofessorn@gmail.com>
-Stepan Shabalin <neverliberty@gmail.com>
-Stephan Klatt <stephan.klatt@gmail.com>
-Stephan Renatus <srenatus@chef.io>
-Stephan Zuercher <zuercher@gmail.com>
-Stéphane Travostino <stephane.travostino@gmail.com>
-Stephen Lewis <stephen@sock.org.uk>
-Stephen Lu <steuhs@users.noreply.github.com>
-Stephen Ma <stephenm@golang.org>
-Stephen McQuay <stephen@mcquay.me>
-Stephen Searles <stephens2424@gmail.com>
-Stephen Weinberg <stephen@q5comm.com>
-Steve Francia <spf@golang.org>
-Steve Gilbert <stevegilbert23@gmail.com>
-Steve LoFurno <slofurno@gmail.com>
-Steve McCoy <mccoyst@gmail.com>
-Steve Mynott <steve.mynott@gmail.com>
-Steve Newman <snewman@google.com>
-Steve Phillips <elimisteve@gmail.com>
-Steve Streeting <steve@stevestreeting.com>
-Steve Traut <straut@google.com>
-Steven Buss <sbuss@google.com>
-Steven Elliot Harris <seharris@gmail.com>
-Steven Erenst <stevenerenst@gmail.com>
-Steven Hartland <steven.hartland@multiplay.co.uk>
-Steven Littiebrant <imgroxx@gmail.com>
-Steven Maude <git@stevenmaude.co.uk>
-Steven Wilkin <stevenwilkin@gmail.com>
-Stuart Jansen <sjansen@buscaluz.org>
-Subham Sarkar <sarkar.subhams2@gmail.com>
-Sue Spence <virtuallysue@gmail.com>
-Sugu Sougoumarane <ssougou@gmail.com>
-Suharsh Sivakumar <suharshs@google.com>
-Sukrit Handa <sukrit.handa@utoronto.ca>
-Sunny <me@darkowlzz.space>
-Suriyaa Sundararuban <suriyaasundararuban@gmail.com>
-Suvaditya Sur <suvaditya.sur@gmail.com>
-Suyash <dextrous93@gmail.com>
-Suzy Mueller <suzmue@golang.org>
-Sven Almgren <sven@tras.se>
-Sven Blumenstein <svbl@google.com>
-Sven Lee <lee1300394324@gmail.com>
-Sven Taute <sven.taute@gmail.com>
-Sylvain Zimmer <sylvain@sylvainzimmer.com>
-Syohei YOSHIDA <syohex@gmail.com>
-Szabolcs Nagy <nsz@port70.net>
-Taavi Kivisik <taavi.kivisik@gmail.com>
-Tad Fisher <tadfisher@gmail.com>
-Tad Glines <tad.glines@gmail.com>
-Tadas Valiukas <tadovas@gmail.com>
-Tadeo Kondrak <me@tadeo.ca>
-Taesu Pyo <pyotaesu@gmail.com>
-Tai Le <letientai299@gmail.com>
-Taj Khattra <taj.khattra@gmail.com>
-Takashi Matsuo <tmatsuo@google.com>
-Takashi Mima <tks.m1205@gmail.com>
-Takayoshi Nishida <takayoshi.nishida@gmail.com>
-Takeshi YAMANASHI <9.nashi@gmail.com>
-Takuto Ikuta <tikuta@google.com>
-Takuya Ueda <uedatakuya@gmail.com>
-Tal Shprecher <tshprecher@gmail.com>
-Tamás Gulácsi <tgulacsi78@gmail.com>
-Tamir Duberstein <tamird@gmail.com>
-Tao Qingyun <qingyunha@gmail.com>
-Tao Shen <shentaoskyking@gmail.com>
-Tao Wang <twang2218@gmail.com>
-Tarmigan Casebolt <tarmigan@gmail.com>
-Taro Aoki <aizu.s1230022@gmail.com>
-Taru Karttunen <taruti@taruti.net>
-Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
-Tatsuya Kaneko <m.ddotx.f@gmail.com>
-Taufiq Rahman <taufiqrx8@gmail.com>
-Teague Cole <tnc1443@gmail.com>
-Ted Kornish <golang@tedkornish.com>
-Tejasvi Nareddy <tejunareddy@gmail.com>
-Terin Stock <terinjokes@gmail.com>
-Terrel Shumway <gopher@shumway.us>
-Tetsuo Kiso <tetsuokiso9@gmail.com>
-Than McIntosh <thanm@google.com>
-Thanabodee Charoenpiriyakij <wingyminus@gmail.com>
-Thanatat Tamtan <acoshift@gmail.com>
-The Hatsune Daishi <nao20010128@gmail.com>
-Thiago Avelino <t@avelino.xxx>
-Thiago Fransosi Farina <thiago.farina@gmail.com> <tfarina@chromium.org>
-Thom Wiggers <thom@thomwiggers.nl>
-Thomas Alan Copeland <talan.copeland@gmail.com>
-Thomas Bonfort <thomas.bonfort@gmail.com>
-Thomas Bouldin <inlined@google.com>
-Thomas Bruyelle <thomas.bruyelle@gmail.com>
-Thomas Bushnell, BSG <tbushnell@google.com>
-Thomas de Zeeuw <thomasdezeeuw@gmail.com>
-Thomas Desrosiers <thomasdesr@gmail.com>
-Thomas Habets <habets@google.com>
-Thomas Kappler <tkappler@gmail.com>
-Thomas Meson <zllak@hycik.org>
-Thomas Symborski <thomas.symborski@gmail.com>
-Thomas Wanielista <tomwans@gmail.com>
-Thorben Krueger <thorben.krueger@gmail.com>
-Thordur Bjornsson <thorduri@secnorth.net>
-Tiago Peczenyj <tpeczenyj@weborama.com>
-Tiago Queiroz <contato@tiago.eti.br>
-Tianji Wu <the729@gmail.com>
-Tianon Gravi <admwiggin@gmail.com>
-Tilman Dilo <tilman.dilo@gmail.com>
-Tim Cooijmans <timcooijmans@gmail.com>
-Tim Cooper <tim.cooper@layeh.com>
-Tim Ebringer <tim.ebringer@gmail.com>
-Tim Heckman <t@heckman.io>
-Tim Henderson <tim.tadh@gmail.com>
-Tim Hockin <thockin@google.com>
-Tim King <taking@google.com>
-Tim Möhlmann <muhlemmer@gmail.com>
-Tim Swast <swast@google.com>
-Tim Wright <tenortim@gmail.com>
-Tim Xu <xiaoxubeii@gmail.com>
-Timmy Douglas <timmyd983@gmail.com>
-Timo Savola <timo.savola@gmail.com>
-Timo Truyts <alkaloid.btx@gmail.com>
-Timothy Gu <timothygu99@gmail.com>
-Timothy Studd <tim@timstudd.com>
-Tipp Moseley <tipp@google.com>
-Tiwei Bie <tiwei.btw@antgroup.com>
-Tobias Assarsson <tobias.assarsson@gmail.com>
-Tobias Columbus <tobias.columbus@gmail.com> <tobias.columbus@googlemail.com>
-Tobias Klauser <tklauser@distanz.ch>
-Tobias Kohlbau <tobias@kohlbau.de>
-Toby Burress <kurin@google.com>
-Todd Kulesza <tkulesza@google.com>
-Todd Neal <todd@tneal.org>
-Todd Wang <toddwang@gmail.com>
-Tom Anthony <git@tomanthony.co.uk>
-Tom Bergan <tombergan@google.com>
-Tom Freudenberg <tom.freudenberg@4commerce.de>
-Tom Heng <zhm20070928@gmail.com>
-Tom Lanyon <tomlanyon@google.com>
-Tom Levy <tomlevy93@gmail.com>
-Tom Limoncelli <tal@whatexit.org>
-Tom Linford <tomlinford@gmail.com>
-Tom Panton <tom@tomandtally.co.uk>
-Tom Parkin <tom.parkin@gmail.com>
-Tom Payne <twpayne@gmail.com>
-Tom Szymanski <tgs@google.com>
-Tom Thorogood <me+google@tomthorogood.co.uk>
-Tom Wilkie <tom@weave.works>
-Tom Zierbock <tomzierbock@gmail.com>
-Tomas Dabasinskas <tomas@dabasinskas.net>
-Tommy Schaefer <tommy.schaefer@teecom.com>
-Tomohiro Kusumoto <zabio1192@gmail.com>
-Tomoya Ishizaki <zaq1tomo@gmail.com>
-Tonis Tiigi <tonistiigi@gmail.com>
-Tony Reix <tony.reix@bull.net>
-Tony Walker <walkert.uk@gmail.com>
-Tooru Takahashi <tooru.takahashi134@gmail.com>
-Tor Andersson <tor.andersson@gmail.com>
-Torben Schinke <torben.schinke@neotos.de>
-Tormod Erevik Lea <tormodlea@gmail.com>
-Toshihiro Shiino <shiino.toshihiro@gmail.com>
-Toshiki Shima <hayabusa1419@gmail.com>
-Totoro W <tw19881113@gmail.com>
-Travis Bischel <travis.bischel@gmail.com>
-Travis Cline <travis.cline@gmail.com>
-Trevor Dixon <trevordixon@gmail.com>
-Trevor Strohman <trevor.strohman@gmail.com>
-Trey Lawrence <lawrence.trey@gmail.com>
-Trey Roessig <trey.roessig@gmail.com>
-Trey Tacon <ttacon@gmail.com>
-Tristan Amini <tamini01@ca.ibm.com>
-Tristan Colgate <tcolgate@gmail.com>
-Tristan Ooohry <ooohry@gmail.com>
-Tristan Rice <rice@fn.lc>
-Troels Thomsen <troels@thomsen.io>
-Trong Bui <trong.buiquoc@gmail.com>
-Trung Nguyen <trung.n.k@gmail.com>
-Tsuji Daishiro <dram.dt.shonan@gmail.com>
-Tudor Golubenco <tudor.g@gmail.com>
-Tugdual Saunier <tugdual.saunier@gmail.com>
-Tuo Shan <sturbo89@gmail.com> <shantuo@google.com>
-Tyler Bui-Palsulich <tpalsulich@google.com>
-Tyler Bunnell <tylerbunnell@gmail.com>
-Tyler Treat <ttreat31@gmail.com>
-Tyson Andre <tysonandre775@gmail.com>
-Tzach Shabtay <tzachshabtay@gmail.com>
-Tzu-Chiao Yeh <su3g4284zo6y7@gmail.com>
-Tzu-Jung Lee <roylee17@currant.com>
-Udalov Max <re.udalov@gmail.com>
-Uddeshya Singh <singhuddeshyaofficial@gmail.com>
-Ugorji Nwoke <ugorji@gmail.com>
-Ulf Holm Nielsen <doktor@dyregod.dk>
-Ulrich Kunitz <uli.kunitz@gmail.com>
-Umang Parmar <umangjparmar@gmail.com>
-Uriel Mangado <uriel@berlinblue.org>
-Urvil Patel <patelurvil38@gmail.com>
-Utkarsh Dixit <53217283+utkarsh-extc@users.noreply.github.com>
-Uttam C Pawar <uttam.c.pawar@intel.com>
-Vadim Grek <vadimprog@gmail.com>
-Vadim Vygonets <unixdj@gmail.com>
-Val Polouchkine <vpolouch@justin.tv>
-Valentin Vidic <vvidic@valentin-vidic.from.hr>
-Vaughn Iverson <vsivsi@yahoo.com>
-Vee Zhang <veezhang@126.com> <vveezhang@gmail.com>
-Vega Garcia Luis Alfonso <vegacom@gmail.com>
-Venil Noronha <veniln@vmware.com>
-Veselkov Konstantin <kostozyb@gmail.com>
-Viacheslav Poturaev <vearutop@gmail.com>
-Victor Chudnovsky <vchudnov@google.com>
-Victor Michel <victor@optimyze.cloud>
-Victor Vrantchan <vrancean+github@gmail.com>
-Vignesh Ramachandra <vickyramachandra@gmail.com>
-Vikas Kedia <vikask@google.com>
-Ville Skyttä <ville.skytta@iki.fi>
-Vincent Ambo <tazjin@googlemail.com>
-Vincent Batts <vbatts@hashbangbash.com> <vbatts@gmail.com>
-Vincent Vanackere <vincent.vanackere@gmail.com>
-Vinu Rajashekhar <vinutheraj@gmail.com>
-Vish Subramanian <vish@google.com>
-Vishal Dalwadi <dalwadivishal26@gmail.com>
-Vishvananda Ishaya <vishvananda@gmail.com>
-Visweswara R <r.visweswara@gmail.com>
-Vitaly Zdanevich <zdanevich.vitaly@ya.ru>
-Vitor De Mario <vitordemario@gmail.com>
-Vivek Sekhar <vsekhar@google.com>
-Vivek V <iamvivekv96@gmail.com>
-Vivian Liang <vliang88@gmail.com>
-Vlad Krasnov <vlad@cloudflare.com>
-Vladimir Evgrafov <evgrafov.vladimir@gmail.com>
-Vladimir Kovpak <cn007b@gmail.com>
-Vladimir Kuzmin <vkuzmin@uber.com>
-Vladimir Mihailenco <vladimir.webdev@gmail.com>
-Vladimir Nikishenko <vova616@gmail.com>
-Vladimir Stefanovic <vladimir.stefanovic@imgtec.com>
-Vladimir Varankin <nek.narqo@gmail.com>
-Vojtech Bocek <vbocek@gmail.com>
-Volker Dobler <dr.volker.dobler@gmail.com>
-Volodymyr Paprotski <vpaprots@ca.ibm.com>
-Vyacheslav Pachkov <slava.pach@gmail.com>
-W. Trevor King <wking@tremily.us>
-Wade Simmons <wade@wades.im>
-Wagner Riffel <wgrriffel@gmail.com>
-Walt Della <walt@javins.net>
-Walter Poupore <wpoupore@google.com>
-Wander Lairson Costa <wcosta@mozilla.com>
-Wang Xuerui <git@xen0n.name>
-Warren Fernandes <warren.f.fernandes@gmail.com>
-Wayne Ashley Berry <wayneashleyberry@gmail.com>
-Wedson Almeida Filho <wedsonaf@google.com>
-Weerasak Chongnguluam <singpor@gmail.com>
-Wèi Cōngruì <crvv.mail@gmail.com>
-Wei Fu <fhfuwei@163.com>
-Wei Guangjing <vcc.163@gmail.com>
-Wei Xiao <wei.xiao@arm.com>
-Wei Xikai <xykwei@gmail.com>
-Weichao Tang <tevic.tt@gmail.com>
-Weilu Jia <optix2000@gmail.com>
-Weixie Cui <cuiweixie@gmail.com> <523516579@qq.com>
-Wembley G. Leach, Jr <wembley.gl@gmail.com>
-Wenlei (Frank) He <wlhe@google.com>
-Wenzel Lowe <lowewenzel@gmail.com>
-Wil Selwood <wselwood@gmail.com>
-Wilfried Teiken <wteiken@google.com>
-Will Beason <willbeason@gmail.com>
-Will Chan <willchan@google.com>
-Will Faught <will.faught@gmail.com>
-Will Morrow <wmorrow.qdt@qualcommdatacenter.com>
-Will Norris <willnorris@google.com>
-Will Storey <will@summercat.com>
-Willem van der Schyff <willemvds@gmail.com>
-William Chan <willchan@chromium.org>
-William Chang <mr.williamchang@gmail.com>
-William Josephson <wjosephson@gmail.com>
-William Langford <wlangfor@gmail.com>
-William Orr <will@worrbase.com> <ay1244@gmail.com>
-William Poussier <william.poussier@gmail.com>
-Wisdom Omuya <deafgoat@gmail.com>
-Wu Yunzhou <yunzhouwu@gmail.com>
-Xi Ruoyao <xry23333@gmail.com>
-Xia Bin <snyh@snyh.org>
-Xiangdong Ji <xiangdong.ji@arm.com>
-Xiaodong Liu <teaofmoli@gmail.com>
-Xing Gao <18340825824@163.com>
-Xing Xing <mikespook@gmail.com>
-Xingqang Bai <bxq2011hust@qq.com>
-Xu Fei <badgangkiller@gmail.com>
-Xudong Zhang <felixmelon@gmail.com>
-Xudong Zheng <7pkvm5aw@slicealias.com>
-Xuyang Kang <xuyangkang@gmail.com>
-Yamagishi Kazutoshi <ykzts@desire.sh>
-Yan Zou <yzou@google.com>
-Yang Hau <vulxj0j8j8@gmail.com>
-Yang Tian <linuxty@gmail.com>
-Yann Hodique <yhodique@google.com>
-Yann Kerhervé <yann.kerherve@gmail.com>
-Yann Salaün <yannsalaun1@gmail.com>
-Yannic Bonenberger <contact@yannic-bonenberger.com>
-Yao Zhang <lunaria21@gmail.com>
-Yaron de Leeuw <jarondl@google.com>
-Yaroslav Vorobiov <yar.vorobiov@gmail.com>
-Yasha Bubnov <girokompass@gmail.com>
-Yasser Abdolmaleki <yasser@yasser.ca>
-Yasuharu Goto <matope.ono@gmail.com>
-Yasuhiro Matsumoto <mattn.jp@gmail.com>
-Yasutaka Shinzaki <shinzaki@yasu26.tech>
-Yasuyuki Oka <yasuyk@gmail.com>
-Yazen Shunnar <yazen.shunnar@gmail.com>
-Yestin Sun <ylh@pdx.edu>
-Yesudeep Mangalapilly <yesudeep@google.com>
-Yissakhar Z. Beck <yissakhar.beck@gmail.com>
-Yo-An Lin <yoanlin93@gmail.com>
-Yohei Takeda <yo.tak0812@gmail.com>
-Yongjian Xu <i3dmaster@gmail.com>
-Yorman Arias <cixtords@gmail.com>
-Yoshiyuki Kanno <nekotaroh@gmail.com> <yoshiyuki.kanno@stoic.co.jp>
-Yoshiyuki Mineo <yoshiyuki.mineo@gmail.com>
-Yosuke Akatsuka <yosuke.akatsuka@gmail.com>
-Youfu Zhang <zhangyoufu@gmail.com>
-Yu Heng Zhang <annita.zhang@cn.ibm.com>
-Yu Xuan Zhang <zyxsh@cn.ibm.com>
-Yu, Li-Yu <afg984@gmail.com>
-Yuichi Kishimoto <yk2220s@gmail.com>
-Yuichi Nishiwaki <yuichi.nishiwaki@gmail.com>
-Yuji Yaginuma <yuuji.yaginuma@gmail.com>
-Yuki Ito <mrno110y@gmail.com>
-Yuki OKUSHI <huyuumi.dev@gmail.com>
-Yuki Osaki <yuki.osaki7@gmail.com>
-Yuki Yugui Sonoda <yugui@google.com>
-Yukihiro Nishinaka <6elpinal@gmail.com>
-YunQiang Su <syq@debian.org>
-Yuntao Wang <ytcoode@gmail.com>
-Yury Smolsky <yury@smolsky.by>
-Yusuke Kagiwada <block.rxckin.beats@gmail.com>
-Yuusei Kuwana <kuwana@kumama.org>
-Yuval Pavel Zholkover <paulzhol@gmail.com>
-Yves Junqueira <yvesj@google.com> <yves.junqueira@gmail.com>
-Zac Bergquist <zbergquist99@gmail.com>
-Zach Bintliff <zbintliff@gmail.com>
-Zach Gershman <zachgersh@gmail.com>
-Zach Hoffman <zrhoffman@apache.org>
-Zach Jones <zachj1@gmail.com>
-Zachary Amsden <zach@thundertoken.com>
-Zachary Burkett <zburkett@splitcubestudios.com>
-Zachary Gershman <zgershman@pivotal.io>
-Zaiyang Li <zaiyangli777@gmail.com>
-Zak <zrjknill@gmail.com>
-Zakatell Kanda <hi@zkanda.io>
-Zellyn Hunter <zellyn@squareup.com> <zellyn@gmail.com>
-Zev Goldstein <zev.goldstein@gmail.com>
-Zhang Boyang <zhangboyang.id@gmail.com>
-Zheng Dayu <davidzheng23@gmail.com>
-Zheng Xu <zheng.xu@arm.com>
-Zhengyu He <hzy@google.com>
-Zhi Zheng <zhi.zheng052@gmail.com>
-Zhongpeng Lin <zplin@uber.com>
-Zhongtao Chen <chenzhongtao@126.com>
-Zhongwei Yao <zhongwei.yao@arm.com>
-Zhou Guangyuan <zhouguangyuan.xian@gmail.com>
-Zhou Peng <p@ctriple.cn>
-Ziad Hatahet <hatahet@gmail.com>
-Ziheng Liu <lzhfromustc@gmail.com>
-Zizhao Zhang <btw515wolf2@gmail.com>
-Zorion Arrizabalaga <zorionk@gmail.com>
-Zvonimir Pavlinovic <zpavlinovic@google.com>
-Zyad A. Ali <zyad.ali.me@gmail.com>
-Максадбек Ахмедов <a.maksadbek@gmail.com>
-Максим Федосеев <max.faceless.frei@gmail.com>
-Роман Хавроненко <hagen1778@gmail.com>
-Тарас Буник <tbunyk@gmail.com>
-Фахриддин Балтаев <faxriddinjon@gmail.com>
-张嵩 <zs349596@gmail.com>
-申习之 <bronze1man@gmail.com>
diff --git a/README.md b/README.md
index 5aca958..e40f3aa 100644
--- a/README.md
+++ b/README.md
@@ -16,26 +16,26 @@
 
 #### Binary Distributions
 
-Official binary distributions are available at https://golang.org/dl/.
+Official binary distributions are available at https://go.dev/dl/.
 
-After downloading a binary release, visit https://golang.org/doc/install
+After downloading a binary release, visit https://go.dev/doc/install
 for installation instructions.
 
 #### Install From Source
 
 If a binary distribution is not available for your combination of
 operating system and architecture, visit
-https://golang.org/doc/install/source
+https://go.dev/doc/install/source
 for source installation instructions.
 
 ### Contributing
 
 Go is the work of thousands of contributors. We appreciate your help!
 
-To contribute, please read the contribution guidelines at https://golang.org/doc/contribute.
+To contribute, please read the contribution guidelines at https://go.dev/doc/contribute.
 
 Note that the Go project uses the issue tracker for bug reports and
-proposals only. See https://golang.org/wiki/Questions for a list of
+proposals only. See https://go.dev/wiki/Questions for a list of
 places to ask questions about the Go language.
 
 [rf]: https://reneefrench.blogspot.com/
diff --git a/SECURITY.md b/SECURITY.md
index 9e92e8b..ab608f3 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,12 +2,12 @@
 
 ## Supported Versions
 
-We support the past two Go releases (for example, Go 1.12.x and Go 1.13.x).
+We support the past two Go releases (for example, Go 1.17.x and Go 1.18.x when Go 1.18.x is the latest stable release).
 
-See https://golang.org/wiki/Go-Release-Cycle and in particular the
-[Release Maintenance](https://github.com/golang/go/wiki/Go-Release-Cycle#release-maintenance)
+See https://go.dev/wiki/Go-Release-Cycle and in particular the
+[Release Maintenance](https://go.dev/wiki/Go-Release-Cycle#release-maintenance)
 part of that page.
 
 ## Reporting a Vulnerability
 
-See https://golang.org/security for how to report a vulnerability.
+See https://go.dev/security for how to report a vulnerability.
diff --git a/VERSION b/VERSION
index 497dca0..afd8ff7 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-go1.18.5
\ No newline at end of file
+go1.19
\ No newline at end of file
diff --git a/api/README b/api/README
index 76d0971..a5bc623 100644
--- a/api/README
+++ b/api/README
@@ -8,10 +8,20 @@
 except.txt lists features that may disappear without breaking true
 compatibility.
 
-next.txt is the only file intended to be mutated. It's a list of
-features that may be added to the next version. It only affects
-warning output from the go api tool.
-
 fuchsia.txt lists Fuchsia specific features. This list can be regenerated with:
 
 fx exec ${FUCHSIA_DIR}/third_party/go/regen-api
+
+Starting with go1.19.txt, each API feature line must end in "#nnnnn"
+giving the GitHub issue number of the proposal issue that accepted
+the new API. This helps with our end-of-cycle audit of new APIs.
+The same requirement applies to next/* (described below), which will
+become a go1.XX.txt for XX >= 19.
+
+The next/ directory contains the only files intended to be mutated.
+Each file in that directory contains a list of features that may be added
+to the next release of Go. The files in this directory only affect the
+warning output from the go api tool. Each file should be named
+nnnnn.txt, after the issue number for the accepted proposal.
+(The #nnnnn suffix must also appear at the end of each line in the file;
+that will be preserved when next/*.txt is concatenated into go1.XX.txt.)
diff --git a/api/except.txt b/api/except.txt
index b9972c1..2acd444 100644
--- a/api/except.txt
+++ b/api/except.txt
@@ -505,3 +505,5 @@
 pkg unicode, const Version = "7.0.0"
 pkg unicode, const Version = "8.0.0"
 pkg unicode, const Version = "9.0.0"
+pkg html/template, method (*Template) Funcs(FuncMap) *Template
+pkg html/template, type FuncMap map[string]interface{}
diff --git a/api/go1.1.txt b/api/go1.1.txt
index bb00b3b..06291fa 100644
--- a/api/go1.1.txt
+++ b/api/go1.1.txt
@@ -371,7 +371,7 @@
 pkg debug/elf, const ELFDATA2LSB = 1
 pkg debug/elf, const ELFDATA2MSB = 2
 pkg debug/elf, const ELFDATANONE = 0
-pkg debug/elf, const ELFMAG = "\u007fELF"
+pkg debug/elf, const ELFMAG = "\x7fELF"
 pkg debug/elf, const ELFOSABI_86OPEN = 5
 pkg debug/elf, const ELFOSABI_AIX = 7
 pkg debug/elf, const ELFOSABI_ARM = 97
diff --git a/api/go1.19.txt b/api/go1.19.txt
new file mode 100644
index 0000000..523f752
--- /dev/null
+++ b/api/go1.19.txt
@@ -0,0 +1,292 @@
+pkg crypto/x509, func ParseRevocationList([]uint8) (*RevocationList, error) #50674
+pkg crypto/x509, method (*CertPool) Clone() *CertPool #35044
+pkg crypto/x509, method (*CertPool) Equal(*CertPool) bool #46057
+pkg crypto/x509, method (*RevocationList) CheckSignatureFrom(*Certificate) error #50674
+pkg crypto/x509, type RevocationList struct, AuthorityKeyId []uint8 #50674
+pkg crypto/x509, type RevocationList struct, Extensions []pkix.Extension #50674
+pkg crypto/x509, type RevocationList struct, Issuer pkix.Name #50674
+pkg crypto/x509, type RevocationList struct, Raw []uint8 #50674
+pkg crypto/x509, type RevocationList struct, RawIssuer []uint8 #50674
+pkg crypto/x509, type RevocationList struct, RawTBSRevocationList []uint8 #50674
+pkg crypto/x509, type RevocationList struct, Signature []uint8 #50674
+pkg debug/elf, const EM_LOONGARCH = 258 #46229
+pkg debug/elf, const EM_LOONGARCH Machine #46229
+pkg debug/elf, const R_LARCH_32 = 1 #46229
+pkg debug/elf, const R_LARCH_32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_64 = 2 #46229
+pkg debug/elf, const R_LARCH_64 R_LARCH #46229
+pkg debug/elf, const R_LARCH_ADD16 = 48 #46229
+pkg debug/elf, const R_LARCH_ADD16 R_LARCH #46229
+pkg debug/elf, const R_LARCH_ADD24 = 49 #46229
+pkg debug/elf, const R_LARCH_ADD24 R_LARCH #46229
+pkg debug/elf, const R_LARCH_ADD32 = 50 #46229
+pkg debug/elf, const R_LARCH_ADD32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_ADD64 = 51 #46229
+pkg debug/elf, const R_LARCH_ADD64 R_LARCH #46229
+pkg debug/elf, const R_LARCH_ADD8 = 47 #46229
+pkg debug/elf, const R_LARCH_ADD8 R_LARCH #46229
+pkg debug/elf, const R_LARCH_COPY = 4 #46229
+pkg debug/elf, const R_LARCH_COPY R_LARCH #46229
+pkg debug/elf, const R_LARCH_IRELATIVE = 12 #46229
+pkg debug/elf, const R_LARCH_IRELATIVE R_LARCH #46229
+pkg debug/elf, const R_LARCH_JUMP_SLOT = 5 #46229
+pkg debug/elf, const R_LARCH_JUMP_SLOT R_LARCH #46229
+pkg debug/elf, const R_LARCH_MARK_LA = 20 #46229
+pkg debug/elf, const R_LARCH_MARK_LA R_LARCH #46229
+pkg debug/elf, const R_LARCH_MARK_PCREL = 21 #46229
+pkg debug/elf, const R_LARCH_MARK_PCREL R_LARCH #46229
+pkg debug/elf, const R_LARCH_NONE = 0 #46229
+pkg debug/elf, const R_LARCH_NONE R_LARCH #46229
+pkg debug/elf, const R_LARCH_RELATIVE = 3 #46229
+pkg debug/elf, const R_LARCH_RELATIVE R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_ADD = 35 #46229
+pkg debug/elf, const R_LARCH_SOP_ADD R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_AND = 36 #46229
+pkg debug/elf, const R_LARCH_SOP_AND R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_ASSERT = 30 #46229
+pkg debug/elf, const R_LARCH_SOP_ASSERT R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_IF_ELSE = 37 #46229
+pkg debug/elf, const R_LARCH_SOP_IF_ELSE R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_NOT = 31 #46229
+pkg debug/elf, const R_LARCH_SOP_NOT R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_10_10_16_S2 = 45 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_10_10_16_S2 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_5_10_16_S2 = 44 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_5_10_16_S2 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_12 = 40 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_12 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16 = 41 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16_S2 = 42 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16_S2 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_5 = 38 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_5 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_5_20 = 43 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_5_20 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_U = 46 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_U R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_U_10_12 = 39 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_U_10_12 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_ABSOLUTE = 23 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_ABSOLUTE R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_DUP = 24 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_DUP R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_GPREL = 25 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_GPREL R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_PCREL = 22 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_PCREL R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_PLT_PCREL = 29 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_PLT_PCREL R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GD = 28 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GD R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GOT = 27 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GOT R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_TPREL = 26 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_TPREL R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_SL = 33 #46229
+pkg debug/elf, const R_LARCH_SOP_SL R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_SR = 34 #46229
+pkg debug/elf, const R_LARCH_SOP_SR R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_SUB = 32 #46229
+pkg debug/elf, const R_LARCH_SOP_SUB R_LARCH #46229
+pkg debug/elf, const R_LARCH_SUB16 = 53 #46229
+pkg debug/elf, const R_LARCH_SUB16 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SUB24 = 54 #46229
+pkg debug/elf, const R_LARCH_SUB24 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SUB32 = 55 #46229
+pkg debug/elf, const R_LARCH_SUB32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SUB64 = 56 #46229
+pkg debug/elf, const R_LARCH_SUB64 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SUB8 = 52 #46229
+pkg debug/elf, const R_LARCH_SUB8 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_DTPMOD32 = 6 #46229
+pkg debug/elf, const R_LARCH_TLS_DTPMOD32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_DTPMOD64 = 7 #46229
+pkg debug/elf, const R_LARCH_TLS_DTPMOD64 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_DTPREL32 = 8 #46229
+pkg debug/elf, const R_LARCH_TLS_DTPREL32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_DTPREL64 = 9 #46229
+pkg debug/elf, const R_LARCH_TLS_DTPREL64 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_TPREL32 = 10 #46229
+pkg debug/elf, const R_LARCH_TLS_TPREL32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_TPREL64 = 11 #46229
+pkg debug/elf, const R_LARCH_TLS_TPREL64 R_LARCH #46229
+pkg debug/elf, method (R_LARCH) GoString() string #46229
+pkg debug/elf, method (R_LARCH) String() string #46229
+pkg debug/elf, type R_LARCH int #46229
+pkg debug/pe, const IMAGE_COMDAT_SELECT_ANY = 2 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_ANY ideal-int #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_ASSOCIATIVE = 5 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_ASSOCIATIVE ideal-int #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_EXACT_MATCH = 4 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_EXACT_MATCH ideal-int #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_LARGEST = 6 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_LARGEST ideal-int #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_NODUPLICATES = 1 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_NODUPLICATES ideal-int #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_SAME_SIZE = 3 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_SAME_SIZE ideal-int #51868
+pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH32 = 25138 #46229
+pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH32 ideal-int #46229
+pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH64 = 25188 #46229
+pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH64 ideal-int #46229
+pkg debug/pe, const IMAGE_SCN_CNT_CODE = 32 #51868
+pkg debug/pe, const IMAGE_SCN_CNT_CODE ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_CNT_INITIALIZED_DATA = 64 #51868
+pkg debug/pe, const IMAGE_SCN_CNT_INITIALIZED_DATA ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_CNT_UNINITIALIZED_DATA = 128 #51868
+pkg debug/pe, const IMAGE_SCN_CNT_UNINITIALIZED_DATA ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_LNK_COMDAT = 4096 #51868
+pkg debug/pe, const IMAGE_SCN_LNK_COMDAT ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_MEM_DISCARDABLE = 33554432 #51868
+pkg debug/pe, const IMAGE_SCN_MEM_DISCARDABLE ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_MEM_EXECUTE = 536870912 #51868
+pkg debug/pe, const IMAGE_SCN_MEM_EXECUTE ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_MEM_READ = 1073741824 #51868
+pkg debug/pe, const IMAGE_SCN_MEM_READ ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_MEM_WRITE = 2147483648 #51868
+pkg debug/pe, const IMAGE_SCN_MEM_WRITE ideal-int #51868
+pkg debug/pe, method (*File) COFFSymbolReadSectionDefAux(int) (*COFFSymbolAuxFormat5, error) #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, Checksum uint32 #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, NumLineNumbers uint16 #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, NumRelocs uint16 #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, SecNum uint16 #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, Selection uint8 #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, Size uint32 #51868
+pkg encoding/binary, func AppendUvarint([]uint8, uint64) []uint8 #51644
+pkg encoding/binary, func AppendVarint([]uint8, int64) []uint8 #51644
+pkg encoding/binary, type AppendByteOrder interface { AppendUint16, AppendUint32, AppendUint64, String } #50601
+pkg encoding/binary, type AppendByteOrder interface, AppendUint16([]uint8, uint16) []uint8 #50601
+pkg encoding/binary, type AppendByteOrder interface, AppendUint32([]uint8, uint32) []uint8 #50601
+pkg encoding/binary, type AppendByteOrder interface, AppendUint64([]uint8, uint64) []uint8 #50601
+pkg encoding/binary, type AppendByteOrder interface, String() string #50601
+pkg encoding/csv, method (*Reader) InputOffset() int64 #43401
+pkg encoding/xml, method (*Decoder) InputPos() (int, int) #45628
+pkg flag, func TextVar(encoding.TextUnmarshaler, string, encoding.TextMarshaler, string) #45754
+pkg flag, method (*FlagSet) TextVar(encoding.TextUnmarshaler, string, encoding.TextMarshaler, string) #45754
+pkg fmt, func Append([]uint8, ...interface{}) []uint8 #47579
+pkg fmt, func Appendf([]uint8, string, ...interface{}) []uint8 #47579
+pkg fmt, func Appendln([]uint8, ...interface{}) []uint8 #47579
+pkg go/doc, method (*Package) HTML(string) []uint8 #51082
+pkg go/doc, method (*Package) Markdown(string) []uint8 #51082
+pkg go/doc, method (*Package) Parser() *comment.Parser #51082
+pkg go/doc, method (*Package) Printer() *comment.Printer #51082
+pkg go/doc, method (*Package) Synopsis(string) string #51082
+pkg go/doc, method (*Package) Text(string) []uint8 #51082
+pkg go/doc/comment, func DefaultLookupPackage(string) (string, bool) #51082
+pkg go/doc/comment, method (*DocLink) DefaultURL(string) string #51082
+pkg go/doc/comment, method (*Heading) DefaultID() string #51082
+pkg go/doc/comment, method (*List) BlankBefore() bool #51082
+pkg go/doc/comment, method (*List) BlankBetween() bool #51082
+pkg go/doc/comment, method (*Parser) Parse(string) *Doc #51082
+pkg go/doc/comment, method (*Printer) Comment(*Doc) []uint8 #51082
+pkg go/doc/comment, method (*Printer) HTML(*Doc) []uint8 #51082
+pkg go/doc/comment, method (*Printer) Markdown(*Doc) []uint8 #51082
+pkg go/doc/comment, method (*Printer) Text(*Doc) []uint8 #51082
+pkg go/doc/comment, type Block interface, unexported methods #51082
+pkg go/doc/comment, type Code struct #51082
+pkg go/doc/comment, type Code struct, Text string #51082
+pkg go/doc/comment, type Doc struct #51082
+pkg go/doc/comment, type Doc struct, Content []Block #51082
+pkg go/doc/comment, type Doc struct, Links []*LinkDef #51082
+pkg go/doc/comment, type DocLink struct #51082
+pkg go/doc/comment, type DocLink struct, ImportPath string #51082
+pkg go/doc/comment, type DocLink struct, Name string #51082
+pkg go/doc/comment, type DocLink struct, Recv string #51082
+pkg go/doc/comment, type DocLink struct, Text []Text #51082
+pkg go/doc/comment, type Heading struct #51082
+pkg go/doc/comment, type Heading struct, Text []Text #51082
+pkg go/doc/comment, type Italic string #51082
+pkg go/doc/comment, type Link struct #51082
+pkg go/doc/comment, type Link struct, Auto bool #51082
+pkg go/doc/comment, type Link struct, Text []Text #51082
+pkg go/doc/comment, type Link struct, URL string #51082
+pkg go/doc/comment, type LinkDef struct #51082
+pkg go/doc/comment, type LinkDef struct, Text string #51082
+pkg go/doc/comment, type LinkDef struct, URL string #51082
+pkg go/doc/comment, type LinkDef struct, Used bool #51082
+pkg go/doc/comment, type List struct #51082
+pkg go/doc/comment, type List struct, ForceBlankBefore bool #51082
+pkg go/doc/comment, type List struct, ForceBlankBetween bool #51082
+pkg go/doc/comment, type List struct, Items []*ListItem #51082
+pkg go/doc/comment, type ListItem struct #51082
+pkg go/doc/comment, type ListItem struct, Content []Block #51082
+pkg go/doc/comment, type ListItem struct, Number string #51082
+pkg go/doc/comment, type Paragraph struct #51082
+pkg go/doc/comment, type Paragraph struct, Text []Text #51082
+pkg go/doc/comment, type Parser struct #51082
+pkg go/doc/comment, type Parser struct, LookupPackage func(string) (string, bool) #51082
+pkg go/doc/comment, type Parser struct, LookupSym func(string, string) bool #51082
+pkg go/doc/comment, type Parser struct, Words map[string]string #51082
+pkg go/doc/comment, type Plain string #51082
+pkg go/doc/comment, type Printer struct #51082
+pkg go/doc/comment, type Printer struct, DocLinkBaseURL string #51082
+pkg go/doc/comment, type Printer struct, DocLinkURL func(*DocLink) string #51082
+pkg go/doc/comment, type Printer struct, HeadingID func(*Heading) string #51082
+pkg go/doc/comment, type Printer struct, HeadingLevel int #51082
+pkg go/doc/comment, type Printer struct, TextCodePrefix string #51082
+pkg go/doc/comment, type Printer struct, TextPrefix string #51082
+pkg go/doc/comment, type Printer struct, TextWidth int #51082
+pkg go/doc/comment, type Text interface, unexported methods #51082
+pkg go/types, method (*Func) Origin() *Func #51682
+pkg go/types, method (*Var) Origin() *Var #51682
+pkg hash/maphash, func Bytes(Seed, []uint8) uint64 #42710
+pkg hash/maphash, func String(Seed, string) uint64 #42710
+pkg html/template, method (*Template) Funcs(template.FuncMap) *Template #46121
+pkg html/template, type FuncMap = template.FuncMap #46121
+pkg net/http, method (*MaxBytesError) Error() string #30715
+pkg net/http, type MaxBytesError struct #30715
+pkg net/http, type MaxBytesError struct, Limit int64 #30715
+pkg net/url, func JoinPath(string, ...string) (string, error) #47005
+pkg net/url, method (*URL) JoinPath(...string) *URL #47005
+pkg net/url, type URL struct, OmitHost bool #46059
+pkg os/exec, method (*Cmd) Environ() []string #50599
+pkg os/exec, type Cmd struct, Err error #43724
+pkg os/exec, var ErrDot error #43724
+pkg regexp/syntax, const ErrNestingDepth = "expression nests too deeply" #51684
+pkg regexp/syntax, const ErrNestingDepth ErrorCode #51684
+pkg runtime/debug, func SetMemoryLimit(int64) int64 #48409
+pkg sort, func Find(int, func(int) int) (int, bool) #50340
+pkg sync/atomic, method (*Bool) CompareAndSwap(bool, bool) bool #50860
+pkg sync/atomic, method (*Bool) Load() bool #50860
+pkg sync/atomic, method (*Bool) Store(bool) #50860
+pkg sync/atomic, method (*Bool) Swap(bool) bool #50860
+pkg sync/atomic, method (*Int32) Add(int32) int32 #50860
+pkg sync/atomic, method (*Int32) CompareAndSwap(int32, int32) bool #50860
+pkg sync/atomic, method (*Int32) Load() int32 #50860
+pkg sync/atomic, method (*Int32) Store(int32) #50860
+pkg sync/atomic, method (*Int32) Swap(int32) int32 #50860
+pkg sync/atomic, method (*Int64) Add(int64) int64 #50860
+pkg sync/atomic, method (*Int64) CompareAndSwap(int64, int64) bool #50860
+pkg sync/atomic, method (*Int64) Load() int64 #50860
+pkg sync/atomic, method (*Int64) Store(int64) #50860
+pkg sync/atomic, method (*Int64) Swap(int64) int64 #50860
+pkg sync/atomic, method (*Pointer[$0]) CompareAndSwap(*$0, *$0) bool #50860
+pkg sync/atomic, method (*Pointer[$0]) Load() *$0 #50860
+pkg sync/atomic, method (*Pointer[$0]) Store(*$0) #50860
+pkg sync/atomic, method (*Pointer[$0]) Swap(*$0) *$0 #50860
+pkg sync/atomic, method (*Uint32) Add(uint32) uint32 #50860
+pkg sync/atomic, method (*Uint32) CompareAndSwap(uint32, uint32) bool #50860
+pkg sync/atomic, method (*Uint32) Load() uint32 #50860
+pkg sync/atomic, method (*Uint32) Store(uint32) #50860
+pkg sync/atomic, method (*Uint32) Swap(uint32) uint32 #50860
+pkg sync/atomic, method (*Uint64) Add(uint64) uint64 #50860
+pkg sync/atomic, method (*Uint64) CompareAndSwap(uint64, uint64) bool #50860
+pkg sync/atomic, method (*Uint64) Load() uint64 #50860
+pkg sync/atomic, method (*Uint64) Store(uint64) #50860
+pkg sync/atomic, method (*Uint64) Swap(uint64) uint64 #50860
+pkg sync/atomic, method (*Uintptr) Add(uintptr) uintptr #50860
+pkg sync/atomic, method (*Uintptr) CompareAndSwap(uintptr, uintptr) bool #50860
+pkg sync/atomic, method (*Uintptr) Load() uintptr #50860
+pkg sync/atomic, method (*Uintptr) Store(uintptr) #50860
+pkg sync/atomic, method (*Uintptr) Swap(uintptr) uintptr #50860
+pkg sync/atomic, type Bool struct #50860
+pkg sync/atomic, type Int32 struct #50860
+pkg sync/atomic, type Int64 struct #50860
+pkg sync/atomic, type Pointer[$0 interface{}] struct #50860
+pkg sync/atomic, type Uint32 struct #50860
+pkg sync/atomic, type Uint64 struct #50860
+pkg sync/atomic, type Uintptr struct #50860
+pkg time, method (Duration) Abs() Duration #51414
+pkg time, method (Time) ZoneBounds() (Time, Time) #50062
diff --git a/api/next.txt b/api/next.txt
deleted file mode 100644
index e69de29..0000000
--- a/api/next.txt
+++ /dev/null
diff --git a/codereview.cfg b/codereview.cfg
index ff39018..5541320 100644
--- a/codereview.cfg
+++ b/codereview.cfg
@@ -1,2 +1,2 @@
-branch: release-branch.go1.18
+branch: release-branch.go1.19
 parent-branch: master
diff --git a/doc/go1.18.html b/doc/go1.18.html
deleted file mode 100644
index b320579..0000000
--- a/doc/go1.18.html
+++ /dev/null
@@ -1,1338 +0,0 @@
-<!--{
-	"Title": "Go 1.18 Release Notes",
-	"Path":  "/doc/go1.18"
-}-->
-
-<!--
-NOTE: In this document and others in this directory, the convention is to
-set fixed-width phrases with non-fixed-width spaces, as in
-<code>hello</code> <code>world</code>.
-Do not send CLs removing the interior tags from such phrases.
--->
-
-<style>
-  main ul li { margin: 0.5em 0; }
-</style>
-
-<h2 id="introduction">DRAFT RELEASE NOTES — Introduction to Go 1.18</h2>
-
-<p>
-  <strong>
-    Go 1.18 is not yet released. These are work-in-progress
-    release notes. Go 1.18 is expected to be released in February 2022.
-  </strong>
-</p>
-
-<h2 id="language">Changes to the language</h2>
-
-<h3 id="generics">Generics</h3>
-
-<p><!-- https://golang.org/issue/43651, https://golang.org/issue/45346 -->
-  Go 1.18 includes an implementation of generic features as described by the
-  <a href="https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md">Type
-    Parameters Proposal</a>.
-  This includes major - but fully backward-compatible - changes to the language.
-</p>
-
-<p>
-  These new language changes required a large amount of new code that
-  has not had significant testing in production settings. That will
-  only happen as more people write and use generic code. We believe
-  that this feature is well implemented and high quality. However,
-  unlike most aspects of Go, we can't back up that belief with real
-  world experience. Therefore, while we encourage the use of generics
-  where it makes sense, please use appropriate caution when deploying
-  generic code in production.
-</p>
-
-<p>
-  The following is a list of the most visible changes. For a more comprehensive overview, see the
-  <a href="https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md">proposal</a>.
-  For details see the <a href="/ref/spec">language spec</a>.
-</p>
-
-<ul>
-  <li>
-    The syntax for
-    <a href="/ref/spec#Function_declarations">function</a> and
-    <a href="/ref/spec#Type_declarations">type declarations</a>
-    now accepts
-    <a href="/ref/spec#Type_parameters">type parameters</a>.
-  </li>
-  <li>
-    Parameterized functions and types can be instantiated by following them with a list of
-    type arguments in square brackets.
-  </li>
-  <li>
-    The new token <code>~</code> has been added to the set of
-    <a href="/ref/spec#Operators_and_punctuation">operators and punctuation</a>.
-  </li>
-  <li>
-    The syntax for
-    <a href="/ref/spec#Interface_types">Interface types</a>
-    now permits the embedding of arbitrary types (not just type names of interfaces)
-    as well as union and <code>~T</code> type elements. Such interfaces may only be used
-    as type constraints.
-    An interface now defines a set of types as well as a set of methods.
-  </li>
-  <li>
-    The new
-    <a href="/ref/spec#Predeclared_identifiers">predeclared identifier</a>
-    <code>any</code> is an alias for the empty interface. It may be used instead of
-    <code>interface{}</code>.
-  </li>
-  <li>
-    The new
-    <a href="/ref/spec#Predeclared_identifiers">predeclared identifier</a>
-    <code>comparable</code> is an interface that denotes the set of all types which can be
-    compared using <code>==</code> or <code>!=</code>. It may only be used as (or embedded in)
-    a type constraint.
-  </li>
-</ul>
-
-<p>
-  There are three experimental packages using generics that may be
-  useful.
-  These packages are in x/exp repository; their API is not covered by
-  the Go 1 guarantee and may change as we gain more experience with
-  generics.
-  <dl>
-    <dt><a href="https://pkg.go.dev/golang.org/x/exp/constraints"><code>golang.org/x/exp/constraints</code></a></dt>
-    <dd>
-      <p>
-	Constraints that are useful for generic code, such as
-	<a href="https://pkg.go.dev/golang.org/x/exp/constraints#Ordered"><code>constraints.Ordered</code></a>.
-      </p>
-    </dd>
-
-    <dt><a href="https://pkg.go.dev/golang.org/x/exp/slices"><code>golang.org/x/exp/slices</code></a></dt>
-    <dd>
-      <p>
-	A collection of generic functions that operate on slices of
-	any element type.
-      </p>
-    </dd>
-
-    <dt><a href="https://pkg.go.dev/golang.org/x/exp/maps"><code>golang.org/x/exp/maps</code></a></dt>
-    <dd>
-      <p>
-	A collection of generic functions that operate on maps of
-	any key or element type.
-      </p>
-    </dd>
-  </dl>
-</p>
-
-<p>
-  The current generics implementation has the following limitations:
-  <ul>
-    <li><!-- https://golang.org/issue/47631 -->
-      The Go compiler cannot currently handle type declarations inside generic functions
-      or methods. We hope to provide support for this feature in Go 1.19.
-    </li>
-    <li><!-- https://golang.org/issue/50937 -->
-      The Go compiler currently does not accept arguments of type parameter type with
-      the predeclared functions <code>real</code>, <code>imag</code>, and <code>complex</code>.
-      We hope to remove this restriction in Go 1.19.
-    </li>
-    <li><!-- https://golang.org/issue/51183 -->
-      The Go compiler currently only supports calling a method <code>m</code> on a value
-      <code>x</code> of type parameter type <code>P</code> if <code>m</code> is explicitly
-      declared by <code>P</code>'s constraint interface.
-      Similarly, method values <code>x.m</code> and method expressions
-      <code>P.m</code> also are only supported if <code>m</code> is explicitly
-      declared by <code>P</code>, even though <code>m</code> might be in the method set
-      of <code>P</code> by virtue of the fact that all types in <code>P</code> implement
-      <code>m</code>. We hope to remove this restriction in Go 1.19.
-    </li>
-    <li><!-- https://golang.org/issue/49030 -->
-      Embedding a type parameter, or a pointer to a type parameter, as
-      an unnamed field in a struct type is not permitted. Similarly,
-      embedding a type parameter in an interface type is not permitted.
-      Whether these will ever be permitted is unclear at present.
-    </li>
-    <li>
-      A union element with more than one term may not contain an
-      interface type with a non-empty method set. Whether this will
-      ever be permitted is unclear at present.
-    </li>
-  </ul>
-</p>
-
-<h3 id="bug_fixes">Bug fixes</h3>
-
-<p>
-  The Go 1.18 compiler now correctly reports <code>declared but not used</code> errors
-  for variables that are set inside a function literal but are never used. Before Go 1.18,
-  the compiler did not report an error in such cases. This fixes long-outstanding compiler
-  issue <a href="https://golang.org/issue/8560">#8560</a>. As a result of this change,
-  (possibly incorrect) programs may not compile anymore. The necessary fix is
-  straightforward: fix the program if it was in fact incorrect, or use the offending
-  variable, for instance by assigning it to the blank identifier <code>_</code>.
-  Since <code>go vet</code> always pointed out this error, the number of affected
-  programs is likely very small.
-</p>
-
-<p>
-  The Go 1.18 compiler now reports an overflow when passing a rune constant expression
-  such as <code>'1' &lt;&lt; 32</code> as an argument to the predeclared functions
-  <code>print</code> and <code>println</code>, consistent with the behavior of
-  user-defined functions. Before Go 1.18, the compiler did not report an error
-  in such cases but silently accepted such constant arguments if they fit into an
-  <code>int64</code>. As a result of this change, (possibly incorrect) programs
-  may not compile anymore. The necessary fix is straightforward: fix the program if it
-  was in fact incorrect, or explicitly convert the offending argument to the correct type.
-  Since <code>go vet</code> always pointed out this error, the number of affected
-  programs is likely very small.
-</p>
-
-<h2 id="ports">Ports</h2>
-
-<h3 id="amd64">AMD64</h3>
-
-<p><!-- CL 349595 -->
-  Go 1.18 introduces the new <code>GOAMD64</code> environment variable, which selects at compile time
-  a minimum target version of the AMD64 architecture. Allowed values are <code>v1</code>,
-  <code>v2</code>, <code>v3</code>, or <code>v4</code>. Each higher level requires,
-  and takes advantage of, additional processor features. A detailed
-  description can be found
-  <a href="https://golang.org/wiki/MinimumRequirements#amd64">here</a>.
-</p>
-<p>
-  The <code>GOAMD64</code> environment variable defaults to <code>v1</code>.
-</p>
-
-<h3 id="riscv">RISC-V</h3>
-
-<p><!-- golang.org/issue/47100, CL 334872 -->
-  The 64-bit RISC-V architecture on Linux (the <code>linux/riscv64</code> port)
-  now supports the <code>c-archive</code> and <code>c-shared</code> build modes.
-</p>
-
-<h3 id="linux">Linux</h3>
-
-<p><!-- golang.org/issue/45964 -->
-  Go 1.18 requires Linux kernel version 2.6.32 or later.
-</p>
-
-<h3 id="windows">Windows</h3>
-
-<p><!-- https://golang.org/issue/49759 -->
-  The <code>windows/arm</code> and <code>windows/arm64</code> ports now support
-  non-cooperative preemption, bringing that capability to all four Windows
-  ports, which should hopefully address subtle bugs encountered when calling
-  into Win32 functions that block for extended periods of time.
-</p>
-
-<h3 id="ios">iOS</h3>
-
-<p><!-- golang.org/issue/48076, golang.org/issue/49616 -->
-  On iOS (the <code>ios/arm64</code> port)
-  and iOS simulator running on AMD64-based macOS (the <code>ios/amd64</code> port),
-  Go 1.18 now requires iOS 12 or later; support for previous versions has been discontinued.
-</p>
-
-<h3 id="freebsd">FreeBSD</h3>
-
-<p>
-  Go 1.18 is the last release that is supported on FreeBSD 11.x, which has
-  already reached end-of-life. Go 1.19 will require FreeBSD 12.2+ or FreeBSD
-  13.0+.
-  FreeBSD 13.0+ will require a kernel with the COMPAT_FREEBSD12 option set (this is the default).
-</p>
-
-<h2 id="tools">Tools</h2>
-
-<h3 id="fuzzing">Fuzzing</h3>
-
-<p>
-  Go 1.18 includes an implementation of fuzzing as described by
-  <a href="https://golang.org/issue/44551">the fuzzing proposal</a>.
-</p>
-
-<p>
-  See the <a href="https://go.dev/doc/fuzz">fuzzing landing page</a> to get
-  started.
-</p>
-
-<p>
-  Please be aware that fuzzing can consume a lot of memory and may impact your
-  machine’s performance while it runs. Also be aware that the fuzzing engine
-  writes values that expand test coverage to a fuzz cache directory within
-  <code>$GOCACHE/fuzz</code> while it runs. There is currently no limit to the
-  number of files or total bytes that may be written to the fuzz cache, so it
-  may occupy a large amount of storage (possibly several GBs).
-</p>
-
-<h3 id="go-command">Go command</h3>
-
-<h4 id="go-get"><code>go</code> <code>get</code></h4>
-
-<p><!-- golang.org/issue/43684 -->
-  <code>go</code> <code>get</code> no longer builds or installs packages in
-  module-aware mode. <code>go</code> <code>get</code> is now dedicated to
-  adjusting dependencies in <code>go.mod</code>. Effectively, the
-  <code>-d</code> flag is always enabled. To install the latest version
-  of an executable outside the context of the current module, use
-  <a href="https://golang.org/ref/mod#go-install"><code>go</code>
-  <code>install</code> <code>example.com/cmd@latest</code></a>. Any
-  <a href="https://golang.org/ref/mod#version-queries">version query</a>
-  may be used instead of <code>latest</code>. This form of <code>go</code>
-  <code>install</code> was added in Go 1.16, so projects supporting older
-  versions may need to provide install instructions for both <code>go</code>
-  <code>install</code> and <code>go</code> <code>get</code>. <code>go</code>
-  <code>get</code> now reports an error when used outside a module, since there
-  is no <code>go.mod</code> file to update. In GOPATH mode (with
-  <code>GO111MODULE=off</code>), <code>go</code> <code>get</code> still builds
-  and installs packages, as before.
-</p>
-
-<h4 id="go-mod-updates">Automatic <code>go.mod</code> and <code>go.sum</code> updates</h4>
-
-<p><!-- https://go.dev/issue/45551 -->
-  The <code>go</code> <code>mod</code> <code>graph</code>,
-  <code>go</code> <code>mod</code> <code>vendor</code>,
-  <code>go</code> <code>mod</code> <code>verify</code>, and
-  <code>go</code> <code>mod</code> <code>why</code> subcommands
-  no longer automatically update the <code>go.mod</code> and
-  <code>go.sum</code> files.
-  (Those files can be updated explicitly using <code>go</code> <code>get</code>,
-  <code>go</code> <code>mod</code> <code>tidy</code>, or
-  <code>go</code> <code>mod</code> <code>download</code>.)
-</p>
-
-<h4 id="go-version"><code>go</code> <code>version</code></h4>
-
-<p><!-- golang.org/issue/37475 -->
-  The <code>go</code> command now embeds version control information in
-  binaries. It includes the currently checked-out revision, commit time, and a
-  flag indicating whether edited or untracked files are present. Version
-  control information is embedded if the <code>go</code> command is invoked in
-  a directory within a Git, Mercurial, Fossil, or Bazaar repository, and the
-  <code>main</code> package and its containing main module are in the same
-  repository. This information may be omitted using the flag
-  <code>-buildvcs=false</code>.
-</p>
-
-<p><!-- golang.org/issue/37475 -->
-  Additionally, the <code>go</code> command embeds information about the build,
-  including build and tool tags (set with <code>-tags</code>), compiler,
-  assembler, and linker flags (like <code>-gcflags</code>), whether cgo was
-  enabled, and if it was, the values of the cgo environment variables
-  (like <code>CGO_CFLAGS</code>).
-  Both VCS and build information may be read together with module
-  information using
-  <code>go</code> <code>version</code> <code>-m</code> <code>file</code> or
-  <code>runtime/debug.ReadBuildInfo</code> (for the currently running binary)
-  or the new <a href="#debug/buildinfo"><code>debug/buildinfo</code></a>
-  package.
-</p>
-
-<p><!-- CL 369977 -->
-  The underlying data format of the embedded build information can change with
-  new go releases, so an older version of <code>go</code> may not handle the
-  build information produced with a newer version of <code>go</code>.
-  To read the version information from a binary built with <code>go</code> 1.18,
-  use the <code>go</code> <code>version</code> command and the
-  <code>debug/buildinfo</code> package from <code>go</code> 1.18+.
-</p>
-
-<h4 id="go-mod-download"><code>go</code> <code>mod</code> <code>download</code></h4>
-
-<p><!-- https://golang.org/issue/44435 -->
-  If the main module's <code>go.mod</code> file
-  specifies <a href="/ref/mod#go-mod-file-go"><code>go</code> <code>1.17</code></a>
-  or higher, <code>go</code> <code>mod</code> <code>download</code> without
-  arguments now downloads source code for only the modules
-  explicitly <a href="/ref/mod#go-mod-file-require">required</a> in the main
-  module's <code>go.mod</code> file. (In a <code>go</code> <code>1.17</code> or
-  higher module, that set already includes all dependencies needed to build the
-  packages and tests in the main module.)
-  To also download source code for transitive dependencies, use
-  <code>go</code> <code>mod</code> <code>download</code> <code>all</code>.
-</p>
-
-<h4 id="go-mod-vendor"><code>go</code> <code>mod</code> <code>vendor</code></h4>
-
-<p><!-- https://golang.org/issue/47327 -->
-  The <code>go</code> <code>mod</code> <code>vendor</code> subcommand now
-  supports a <code>-o</code> flag to set the output directory.
-  (Other <code>go</code> commands still read from the <code>vendor</code>
-  directory at the module root when loading packages
-  with <code>-mod=vendor</code>, so the main use for this flag is for
-  third-party tools that need to collect package source code.)
-</p>
-
-<h4 id="go-mod-tidy"><code>go</code> <code>mod</code> <code>tidy</code></h4>
-
-<p><!-- https://golang.org/issue/47738, CL 344572 -->
-  The <code>go</code> <code>mod</code> <code>tidy</code> command now retains
-  additional checksums in the <code>go.sum</code> file for modules whose source
-  code is needed to verify that each imported package is provided by only one
-  module in the <a href="/ref/mod#glos-build-list">build list</a>. Because this
-  condition is rare and failure to apply it results in a build error, this
-  change is <em>not</em> conditioned on the <code>go</code> version in the main
-  module's <code>go.mod</code> file.
-</p>
-
-<h4 id="go-work"><code>go</code> <code>work</code></h4>
-
-<p><!-- https://golang.org/issue/45713 -->
-  The <code>go</code> command now supports a "Workspace" mode. If a
-  <code>go.work</code> file is found in the working directory or a
-  parent directory, or one is specified using the <code>GOWORK</code>
-  environment variable, it will put the <code>go</code> command into workspace mode.
-  In workspace mode, the <code>go.work</code> file will be used to
-  determine the set of main modules used as the roots for module
-  resolution, instead of using the normally-found <code>go.mod</code>
-  file to specify the single main module. For more information see the
-  <a href="/pkg/cmd/go#hdr-Workspace_maintenance"><code>go work</code></a>
-  documentation.
-</p>
-
-<h4 id="go-build-asan"><code>go</code> <code>build</code> <code>-asan</code></h4>
-
-<p><!-- CL 298612 -->
-  The <code>go</code> <code>build</code> command and related commands
-  now support an <code>-asan</code> flag that enables interoperation
-  with C (or C++) code compiled with the address sanitizer (C compiler
-  option <code>-fsanitize=address</code>).
-</p>
-
-<h4 id="go-test"><code>go</code> <code>test</code></h4>
-
-<p><!-- CL 251441 -->
-  The <code>go</code> command now supports additional command line
-  options for the new <a href="#fuzzing">fuzzing support described
-  above</a>:
-  <ul>
-    <li>
-      <code>go test</code> supports
-      <code>-fuzz</code>, <code>-fuzztime</code>, and
-      <code>-fuzzminimizetime</code> options.
-      For documentation on these see
-      <a href="/pkg/cmd/go#hdr-Testing_flags"><code>go help testflag</code></a>.
-    </li>
-    <li>
-      <code>go clean</code> supports a <code>-fuzzcache</code>
-      option.
-      For documentation see
-      <a href="/pkg/cmd/go#hdr-Remove_object_files_and_cached_files"><code>go help clean</code></a>.
-    </li>
-  </ul>
-</p>
-
-<h4 id="go-build-lines"><code>//go:build</code> lines</h4>
-
-<p><!-- CL 240611 -->
-Go 1.17 introduced <code>//go:build</code> lines as a more readable way to write build constraints,
-instead of <code>//</code> <code>+build</code> lines.
-As of Go 1.17, <code>gofmt</code> adds <code>//go:build</code> lines
-to match existing <code>+build</code> lines and keeps them in sync,
-while <code>go</code> <code>vet</code> diagnoses when they are out of sync.
-</p>
-
-<p>Since the release of Go 1.18 marks the end of support for Go 1.16,
-all supported versions of Go now understand <code>//go:build</code> lines.
-In Go 1.18, <code>go</code> <code>fix</code> now removes the now-obsolete
-<code>//</code> <code>+build</code> lines in modules declaring
-<code>go</code> <code>1.17</code> or later in their <code>go.mod</code> files.
-</p>
-
-<p>
-For more information, see <a href="https://go.dev/design/draft-gobuild">https://go.dev/design/draft-gobuild</a>.
-</p>
-
-<h3 id="gofmt">Gofmt</h3>
-
-<p><!-- https://golang.org/issue/43566 -->
-  <code>gofmt</code> now reads and formats input files concurrently, with a
-  memory limit proportional to <code>GOMAXPROCS</code>. On a machine with
-  multiple CPUs, <code>gofmt</code> should now be significantly faster.
-</p>
-
-<h3 id="vet">Vet</h3>
-
-<h4 id="vet-generics">Updates for Generics</h4>
-
-<p><!-- https://golang.org/issue/48704 -->
-	The <code>vet</code> tool is updated to support generic code. In most cases,
-	it reports an error in generic code whenever it would report an error in the
-	equivalent non-generic code after substituting for type parameters with a
-	type from their
-	<a href="https://golang.org/ref/spec#Interface_types">type set</a>.
-
-	For example, <code>vet</code> reports a format error in
-	<pre>func Print[T ~int|~string](t T) {
-	fmt.Printf("%d", t)
-}</pre>
-	because it would report a format error in the non-generic equivalent of
-	<code>Print[string]</code>:
-	<pre>func PrintString(x string) {
-	fmt.Printf("%d", x)
-}</pre>
-</p>
-
-<h4 id="vet-precision">Precision improvements for existing checkers</h4>
-
-<p><!-- CL 323589 356830 319689 355730 351553 338529 -->
-  The <code>cmd/vet</code> checkers <code>copylock</code>, <code>printf</code>,
-  <code>sortslice</code>, <code>testinggoroutine</code>, and <code>tests</code>
-  have all had moderate precision improvements to handle additional code patterns.
-  This may lead to newly reported errors in existing packages. For example, the
-  <code>printf</code> checker now tracks formatting strings created by
-  concatenating string constants. So <code>vet</code> will report an error in:
-<pre>
-  // fmt.Printf formatting directive %d is being passed to Println.
-  fmt.Println("%d"+` ≡ x (mod 2)`+"\n", x%2)
-</pre>
-</p>
-
-<h2 id="runtime">Runtime</h2>
-
-<p><!-- https://golang.org/issue/44167 -->
-  The garbage collector now includes non-heap sources of garbage collector work
-  (e.g., stack scanning) when determining how frequently to run. As a result,
-  garbage collector overhead is more predictable when these sources are
-  significant. For most applications these changes will be negligible; however,
-  some Go applications may now use less memory and spend more time on garbage
-  collection, or vice versa, than before. The intended workaround is to tweak
-  <code>GOGC</code> where necessary.
-</p>
-
-<p><!-- CL 358675, CL 353975, CL 353974 -->
-  The runtime now returns memory to the operating system more efficiently and has
-  been tuned to work more aggressively as a result.
-</p>
-
-<p><!-- CL 352057, https://golang.org/issue/45728 -->
-  Go 1.17 generally improved the formatting of arguments in stack traces,
-  but could print inaccurate values for arguments passed in registers.
-  This is improved in Go 1.18 by printing a question mark (<code>?</code>)
-  after each value that may be inaccurate.
-</p>
-
-<h2 id="compiler">Compiler</h2>
-
-<p><!-- https://golang.org/issue/40724 -->
-  Go 1.17 <a href="go1.17#compiler">implemented</a> a new way of passing
-  function arguments and results using registers instead of the stack
-  on 64-bit x86 architecture on selected operating systems.
-  Go 1.18 expands the supported platforms to include 64-bit ARM (<code>GOARCH=arm64</code>),
-  big- and little-endian 64-bit PowerPC (<code>GOARCH=ppc64</code>, <code>ppc64le</code>),
-  as well as 64-bit x86 architecture (<code>GOARCH=amd64</code>)
-  on all operating systems.
-  On 64-bit ARM and 64-bit PowerPC systems, benchmarking shows
-  typical performance improvements of 10% or more.
-</p>
-
-<p>
-  As <a href="go1.17#compiler">mentioned</a> in the Go 1.17 release notes,
-  this change does not affect the functionality of any safe Go code and
-  is designed to have no impact on most assembly code. See the
-  <a href="go1.17#compiler">Go 1.17 release notes</a> for more details.
-</p>
-
-<p><!-- CL 355497, CL 356869 -->
-  The compiler now can inline functions that contain range loops or
-  labeled for loops.
-</p>
-
-<p><!-- CL 298611 -->
-  The new <code>-asan</code> compiler option supports the
-  new <code>go</code> command <code>-asan</code> option.
-</p>
-
-<p><!-- https://golang.org/issue/50954 -->
-  Because the compiler's type checker was replaced in its entirety to
-  support generics, some error messages now may use different wording
-  than before. In some cases, pre-Go 1.18 error messages provided more
-  detail or were phrased in a more helpful way.
-  We intend to address these cases in Go 1.19.
-</p>
-
-<p> <!-- https://github.com/golang/go/issues/49569 -->
-  Because of changes in the compiler related to supporting generics, the
-  Go 1.18 compile speed can be roughly 15% slower than the Go 1.17 compile speed.
-  The execution time of the compiled code is not affected.  We
-  intend to improve the speed of the compiler in Go 1.19.
-</p>
-
-<h2 id="linker">Linker</h2>
-
-<p>
-  The linker emits <a href="https://tailscale.com/blog/go-linker/">far fewer relocations</a>.
-  As a result, most codebases will link faster, require less memory to link,
-  and generate smaller binaries.
-  Tools that process Go binaries should use Go 1.18's <code>debug/gosym</code> package
-  to transparently handle both old and new binaries.
-</p>
-
-<p><!-- CL 298610 -->
-  The new <code>-asan</code> linker option supports the
-  new <code>go</code> command <code>-asan</code> option.
-</p>
-
-<h2 id="bootstrap">Bootstrap</h2>
-
-<p><!-- CL 369914, CL 370274 -->
-When building a Go release from source and <code>GOROOT_BOOTSTRAP</code>
-is not set, previous versions of Go looked for a Go 1.4 or later bootstrap toolchain
-in the directory <code>$HOME/go1.4</code> (<code>%HOMEDRIVE%%HOMEPATH%\go1.4</code> on Windows).
-Go now looks first for <code>$HOME/go1.17</code> or <code>$HOME/sdk/go1.17</code>
-before falling back to <code>$HOME/go1.4</code>.
-We intend for Go 1.19 to require Go 1.17 or later for bootstrap,
-and this change should make the transition smoother.
-For more details, see <a href="https://go.dev/issue/44505">go.dev/issue/44505</a>.
-</p>
-
-<h2 id="library">Core library</h2>
-
-<h3 id="debug/buildinfo">New <code>debug/buildinfo</code> package</h3>
-
-<p><!-- golang.org/issue/39301 -->
-  The new <a href="/pkg/debug/buildinfo"><code>debug/buildinfo</code></a> package
-  provides access to module versions, version control information, and build
-  flags embedded in executable files built by the <code>go</code> command.
-  The same information is also available via
-  <a href="/pkg/runtime/debug#ReadBuildInfo"><code>runtime/debug.ReadBuildInfo</code></a>
-  for the currently running binary and via <code>go</code>
-  <code>version</code> <code>-m</code> on the command line.
-</p>
-
-<h3 id="netip">New <code>net/netip</code> package</h3>
-
-<p>
-  The new <a href="/pkg/net/netip/"><code>net/netip</code></a>
-  package defines a new IP address type, <a href="/pkg/net/netip/#Addr"><code>Addr</code></a>.
-  Compared to the existing
-  <a href="/pkg/net/#IP"><code>net.IP</code></a> type, the <code>netip.Addr</code> type takes less
-  memory, is immutable, and is comparable so it supports <code>==</code>
-  and can be used as a map key.
-</p>
-<p>
-  In addition to <code>Addr</code>, the package defines
-  <a href="/pkg/net/netip/#AddrPort"><code>AddrPort</code></a>, representing
-  an IP and port, and
-  <a href="/pkg/net/netip/#Prefix"><code>Prefix</code></a>, representing
-  a network CIDR prefix.
-</p>
-<p>
-  The package also defines several functions to create and examine
-  these new types:
-  <a href="/pkg/net/netip#AddrFrom4"><code>AddrFrom4</code></a>,
-  <a href="/pkg/net/netip#AddrFrom16"><code>AddrFrom16</code></a>,
-  <a href="/pkg/net/netip#AddrFromSlice"><code>AddrFromSlice</code></a>,
-  <a href="/pkg/net/netip#AddrPortFrom"><code>AddrPortFrom</code></a>,
-  <a href="/pkg/net/netip#IPv4Unspecified"><code>IPv4Unspecified</code></a>,
-  <a href="/pkg/net/netip#IPv6LinkLocalAllNodes"><code>IPv6LinkLocalAllNodes</code></a>,
-  <a href="/pkg/net/netip#IPv6Unspecified"><code>IPv6Unspecified</code></a>,
-  <a href="/pkg/net/netip#MustParseAddr"><code>MustParseAddr</code></a>,
-  <a href="/pkg/net/netip#MustParseAddrPort"><code>MustParseAddrPort</code></a>,
-  <a href="/pkg/net/netip#MustParsePrefix"><code>MustParsePrefix</code></a>,
-  <a href="/pkg/net/netip#ParseAddr"><code>ParseAddr</code></a>,
-  <a href="/pkg/net/netip#ParseAddrPort"><code>ParseAddrPort</code></a>,
-  <a href="/pkg/net/netip#ParsePrefix"><code>ParsePrefix</code></a>,
-  <a href="/pkg/net/netip#PrefixFrom"><code>PrefixFrom</code></a>.
-</p>
-<p>
-  The <a href="/pkg/net/"><code>net</code></a> package includes new
-  methods that parallel existing methods, but
-  return <code>netip.AddrPort</code> instead of the
-  heavier-weight <a href="/pkg/net/#IP"><code>net.IP</code></a> or
-  <a href="/pkg/net/#UDPAddr"><code>*net.UDPAddr</code></a> types:
-  <a href="/pkg/net/#Resolver.LookupNetIP"><code>Resolver.LookupNetIP</code></a>,
-  <a href="/pkg/net/#UDPConn.ReadFromUDPAddrPort"><code>UDPConn.ReadFromUDPAddrPort</code></a>,
-  <a href="/pkg/net/#UDPConn.ReadMsgUDPAddrPort"><code>UDPConn.ReadMsgUDPAddrPort</code></a>,
-  <a href="/pkg/net/#UDPConn.WriteToUDPAddrPort"><code>UDPConn.WriteToUDPAddrPort</code></a>,
-  <a href="/pkg/net/#UDPConn.WriteMsgUDPAddrPort"><code>UDPConn.WriteMsgUDPAddrPort</code></a>.
-  The new <code>UDPConn</code> methods support allocation-free I/O.
-</p>
-<p>
-  The <code>net</code> package also now includes functions and methods
-  to convert between the existing
-  <a href="/pkg/net/#TCPAddr"><code>TCPAddr</code></a>/<a href="/pkg/net/#UDPAddr"><code>UDPAddr</code></a>
-  types and <code>netip.AddrPort</code>:
-  <a href="/pkg/net/#TCPAddrFromAddrPort"><code>TCPAddrFromAddrPort</code></a>,
-  <a href="/pkg/net/#UDPAddrFromAddrPort"><code>UDPAddrFromAddrPort</code></a>,
-  <a href="/pkg/net/#TCPAddr.AddrPort"><code>TCPAddr.AddrPort</code></a>,
-  <a href="/pkg/net/#UDPAddr.AddrPort"><code>UDPAddr.AddrPort</code></a>.
-</p>
-
-<h3 id="tls10">TLS 1.0 and 1.1 disabled by default client-side</h3>
-
-<p><!-- CL 359779, golang.org/issue/45428 -->
-  If <a href="/pkg/crypto/tls/#Config.MinVersion"><code>Config.MinVersion</code></a>
-  is not set, it now defaults to TLS 1.2 for client connections. Any safely
-  up-to-date server is expected to support TLS 1.2, and browsers have required
-  it since 2020. TLS 1.0 and 1.1 are still supported by setting
-  <code>Config.MinVersion</code> to <code>VersionTLS10</code>.
-  The server-side default is unchanged at TLS 1.0.
-</p>
-
-<p>
-  The default can be temporarily reverted to TLS 1.0 by setting the
-  <code>GODEBUG=tls10default=1</code> environment variable.
-  This option will be removed in Go 1.19.
-</p>
-
-<h3 id="sha1">Rejecting SHA-1 certificates</h3>
-
-<p><!-- CL 359777, golang.org/issue/41682 -->
-  <code>crypto/x509</code> will now
-  reject certificates signed with the SHA-1 hash function. This doesn't
-  apply to self-signed root certificates. Practical attacks against SHA-1
-  <a href="https://shattered.io/">have been demonstrated since 2017</a> and publicly
-  trusted Certificate Authorities have not issued SHA-1 certificates since 2015.
-</p>
-
-<p>
-  This can be temporarily reverted by setting the
-  <code>GODEBUG=x509sha1=1</code> environment variable.
-  This option will be removed in Go 1.19.
-</p>
-
-<h3 id="minor_library_changes">Minor changes to the library</h3>
-
-<p>
-  As always, there are various minor changes and updates to the library,
-  made with the Go 1 <a href="/doc/go1compat">promise of compatibility</a>
-  in mind.
-</p>
-
-<dl id="bufio"><dt><a href="/pkg/bufio/">bufio</a></dt>
-  <dd>
-    <p><!-- CL 345569 -->
-      The new <a href="/pkg/bufio#Writer.AvailableBuffer"><code>Writer.AvailableBuffer</code></a>
-      method returns an empty buffer with a possibly non-empty capacity for use
-      with append-like APIs. After appending, the buffer can be provided to a
-      succeeding <code>Write</code> call and possibly avoid any copying.
-    </p>
-
-    <p><!-- CL 345570 -->
-      The <a href="/pkg/bufio#Reader.Reset"><code>Reader.Reset</code></a> and
-      <a href="/pkg/bufio#Writer.Reset"><code>Writer.Reset</code></a> methods
-      now use the default buffer size when called on objects with a
-      <code>nil</code> buffer.
-    </p>
-  </dd>
-</dl><!-- bufio -->
-
-<dl id="bytes"><dt><a href="/pkg/bytes/">bytes</a></dt>
-  <dd>
-    <p><!-- CL 351710 -->
-      The new <a href="/pkg/bytes/#Cut"><code>Cut</code></a> function
-      slices a <code>[]byte</code> around a separator. It can replace
-      and simplify many common uses of
-      <a href="/pkg/bytes/#Index"><code>Index</code></a>,
-      <a href="/pkg/bytes/#IndexByte"><code>IndexByte</code></a>,
-      <a href="/pkg/bytes/#IndexRune"><code>IndexRune</code></a>,
-      and <a href="/pkg/bytes/#SplitN"><code>SplitN</code></a>.
-    </p>
-
-    <p><!-- CL 323318, CL 332771 -->
-      <a href="/pkg/bytes/#Trim"><code>Trim</code></a>, <a href="/pkg/bytes/#TrimLeft"><code>TrimLeft</code></a>,
-      and <a href="/pkg/bytes/#TrimRight"><code>TrimRight</code></a> are now allocation free and, especially for
-      small ASCII cutsets, up to 10 times faster.
-    </p>
-
-    <p><!-- CL 359485 -->
-      The <a href="/pkg/bytes/#Title"><code>Title</code></a> function is now deprecated. It doesn't
-      handle Unicode punctuation and language-specific capitalization rules, and is superseded by the
-      <a href="https://golang.org/x/text/cases">golang.org/x/text/cases</a> package.
-    </p>
-  </dd>
-</dl><!-- bytes -->
-
-<dl id="crypto/elliptic"><dt><a href="/pkg/crypto/elliptic/">crypto/elliptic</a></dt>
-  <dd>
-    <p><!-- CL 320071, CL 320072, CL 320074, CL 361402, CL 360014 -->
-      The <a href="/pkg/crypto/elliptic#P224"><code>P224</code></a>,
-      <a href="/pkg/crypto/elliptic#P384"><code>P384</code></a>, and
-      <a href="/pkg/crypto/elliptic#P521"><code>P521</code></a> curve
-      implementations are now all backed by code generated by the
-      <a href="https://github.com/mmcloughlin/addchain">addchain</a> and
-      <a href="https://github.com/mit-plv/fiat-crypto">fiat-crypto</a>
-      projects, the latter of which is based on a formally-verified model
-      of the arithmetic operations. They now use safer complete formulas
-      and internal APIs. P-224 and P-384 are now approximately four times
-      faster. All specific curve implementations are now constant-time.
-    </p>
-
-    <p>
-      Operating on invalid curve points (those for which the
-      <code>IsOnCurve</code> method returns false, and which are never returned
-      by <a href="/pkg/crypto/elliptic#Unmarshal"><code>Unmarshal</code></a> or
-      a <code>Curve</code> method operating on a valid point) has always been
-      undefined behavior, can lead to key recovery attacks, and is now
-      unsupported by the new backend. If an invalid point is supplied to a
-      <code>P224</code>, <code>P384</code>, or <code>P521</code> method, that
-      method will now return a random point. The behavior might change to an
-      explicit panic in a future release.
-    </p>
-  </dd>
-</dl><!-- crypto/elliptic -->
-
-<dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt>
-  <dd>
-    <p><!-- CL 325250 -->
-      The new <a href="/pkg/crypto/tls/#Conn.NetConn"><code>Conn.NetConn</code></a>
-      method allows access to the underlying
-      <a href="/pkg/net#Conn"><code>net.Conn</code></a>.
-    </p>
-  </dd>
-</dl><!-- crypto/tls -->
-
-<dl id="crypto/x509"><dt><a href="/pkg/crypto/x509">crypto/x509</a></dt>
-  <dd>
-    <p><!-- CL 353132, CL 353403 -->
-      <a href="/pkg/crypto/x509/#Certificate.Verify"><code>Certificate.Verify</code></a>
-      now uses platform APIs to verify certificate validity on macOS and iOS when it
-      is called with a nil
-      <a href="/pkg/crypto/x509/#VerifyOpts.Roots"><code>VerifyOpts.Roots</code></a>
-      or when using the root pool returned from
-      <a href="/pkg/crypto/x509/#SystemCertPool"><code>SystemCertPool</code></a>.
-    </p>
-
-    <p><!-- CL 353589 -->
-      <a href="/pkg/crypto/x509/#SystemCertPool"><code>SystemCertPool</code></a>
-      is now available on Windows.
-    </p>
-
-    <p>
-      On Windows, macOS, and iOS, when a
-      <a href="/pkg/crypto/x509/#CertPool"><code>CertPool</code></a> returned by
-      <a href="/pkg/crypto/x509/#SystemCertPool"><code>SystemCertPool</code></a>
-      has additional certificates added to it,
-      <a href="/pkg/crypto/x509/#Certificate.Verify"><code>Certificate.Verify</code></a>
-      will do two verifications: one using the platform verifier APIs and the
-      system roots, and one using the Go verifier and the additional roots.
-      Chains returned by the platform verifier APIs will be prioritized.
-    </p>
-
-    <p>
-      <a href="/pkg/crypto/x509/#CertPool.Subjects"><code>CertPool.Subjects</code></a>
-      is deprecated. On Windows, macOS, and iOS the
-      <a href="/pkg/crypto/x509/#CertPool"><code>CertPool</code></a> returned by
-      <a href="/pkg/crypto/x509/#SystemCertPool"><code>SystemCertPool</code></a>
-      will return a pool which does not include system roots in the slice
-      returned by <code>Subjects</code>, as a static list can't appropriately
-      represent the platform policies and might not be available at all from the
-      platform APIs.
-    </p>
-  </dd>
-</dl>
-
-<dl id="debug/dwarf"><dt><a href="/pkg/debug/dwarf/">debug/dwarf</a></dt>
-  <dd>
-    <p><!-- CL 380714 -->
-      The <a href="/pkg/debug/dwarf#StructField"><code>StructField</code></a>
-      and <a href="/pkg/debug/dwarf#BasicType"><code>BasicType</code></a>
-      structs both now have a <code>DataBitOffset</code> field, which
-      holds the value of the <code>DW_AT_data_bit_offset</code>
-      attribute if present.
-  </dd>
-</dl>
-
-<dl id="debug/elf"><dt><a href="/pkg/debug/elf/">debug/elf</a></dt>
-  <dd>
-    <p><!-- CL 352829 -->
-      The <a href="/pkg/debug/elf/#R_PPC64_RELATIVE"><code>R_PPC64_RELATIVE</code></a>
-      constant has been added.
-    </p>
-  </dd>
-</dl><!-- debug/elf -->
-
-<dl id="debug/plan9obj"><dt><a href="/pkg/debug/plan9obj/">debug/plan9obj</a></dt>
-  <dd>
-    <p><!-- CL 350229 -->
-      The <a href="/pkg/debug/plan9obj#File.Symbols">File.Symbols</a>
-      method now returns the new exported error
-      value <a href="/pkg/debug/plan9obj#ErrNoSymbols">ErrNoSymbols</a>
-      if the file has no symbol section.
-    </p>
-  </dd>
-</dl><!-- debug/plan9obj -->
-
-<dl id="go/ast"><dt><a href="/pkg/go/ast/">go/ast</a></dt>
-  <dd>
-    <p><!-- https://golang.org/issue/47781, CL 325689, CL 327149, CL 348375, CL 348609 -->
-      Per the proposal
-      <a href="https://go.googlesource.com/proposal/+/master/design/47781-parameterized-go-ast.md">
-        Additions to go/ast and go/token to support parameterized functions and types
-      </a>
-      the following additions are made to the <a href="/pkg/go/ast"><code>go/ast</code></a> package:
-      <ul>
-        <li>
-          the <a href="/pkg/go/ast/#FuncType"><code>FuncType</code></a>
-          and <a href="/pkg/go/ast/#TypeSpec"><code>TypeSpec</code></a>
-          nodes have a new field <code>TypeParams</code> to hold type parameters, if any.
-        </li>
-        <li>
-          The new expression node <a href="/pkg/go/ast/#IndexListExpr"><code>IndexListExpr</code></a>
-          represents index expressions with multiple indices, used for function and type instantiations
-          with more than one explicit type argument.
-        </li>
-      </ul>
-    </p>
-  </dd>
-</dl>
-
-<dl id="go/constant"><dt><a href="/pkg/go/constant/">go/constant</a></dt>
-  <dd>
-    <p><!-- https://golang.org/issue/46211, CL 320491 -->
-      The new <a href="/pkg/go/constant/#Kind.String"><code>Kind.String</code></a>
-      method returns a human-readable name for the receiver kind.
-    </p>
-  </dd>
-</dl>
-
-<dl id="go/token"><dt><a href="/pkg/go/token/">go/token</a></dt>
-  <dd>
-    <p><!-- https://golang.org/issue/47781, CL 324992 -->
-      The new constant <a href="/pkg/go/token/#TILDE"><code>TILDE</code></a>
-      represents the <code>~</code> token per the proposal
-      <a href="https://go.googlesource.com/proposal/+/master/design/47781-parameterized-go-ast.md">
-        Additions to go/ast and go/token to support parameterized functions and types
-      </a>.
-    </p>
-  </dd>
-</dl>
-
-<dl id="go/types"><dt><a href="/pkg/go/types/">go/types</a></dt>
-  <dd>
-    <p><!-- https://golang.org/issue/46648 -->
-      The new <a href="/pkg/go/types/#Config.GoVersion"><code>Config.GoVersion</code></a>
-      field sets the accepted Go language version.
-    </p>
-
-    <p><!-- https://golang.org/issue/47916 -->
-      Per the proposal
-      <a href="https://go.googlesource.com/proposal/+/master/design/47916-parameterized-go-types.md">
-        Additions to go/types to support type parameters
-      </a>
-      the following additions are made to the <a href="/pkg/go/types"><code>go/types</code></a> package:
-    </p>
-    <ul>
-      <li>
-        The new type
-        <a href="/pkg/go/types/#TypeParam"><code>TypeParam</code></a>, factory function
-        <a href="/pkg/go/types/#NewTypeParam"><code>NewTypeParam</code></a>,
-        and associated methods are added to represent a type parameter.
-      </li>
-      <li>
-        The new type
-        <a href="/pkg/go/types/#TypeParamList"><code>TypeParamList</code></a> holds a list of
-        type parameters.
-      </li>
-      <li>
-        The new type
-        <a href="/pkg/go/types/#TypeList"><code>TypeList</code></a> holds a list of types.
-      </li>
-      <li>
-        The new factory function
-        <a href="/pkg/go/types/#NewSignatureType"><code>NewSignatureType</code></a> allocates a
-        <a href="/pkg/go/types/#Signature"><code>Signature</code></a> with
-        (receiver or function) type parameters.
-        To access those type parameters, the <code>Signature</code> type has two new methods
-        <a href="/pkg/go/types/#Signature.RecvTypeParams"><code>Signature.RecvTypeParams</code></a> and
-        <a href="/pkg/go/types/#Signature.TypeParams"><code>Signature.TypeParams</code></a>.
-      </li>
-      <li>
-        <a href="/pkg/go/types/#Named"><code>Named</code></a> types have four new methods:
-        <a href="/pkg/go/types/#Named.Origin"><code>Named.Origin</code></a> to get the original
-        parameterized types of instantiated types,
-        <a href="/pkg/go/types/#Named.TypeArgs"><code>Named.TypeArgs</code></a> and
-        <a href="/pkg/go/types/#Named.TypeParams"><code>Named.TypeParams</code></a> to get the
-        type arguments or type parameters of an instantiated or parameterized type, and
-        <a href="/pkg/go/types/#Named.TypeParams"><code>Named.SetTypeParams</code></a> to set the
-        type parameters (for instance, when importing a named type where allocation of the named
-        type and setting of type parameters cannot be done simultaneously due to possible cycles).
-      </li>
-      <li>
-        The <a href="/pkg/go/types/#Interface"><code>Interface</code></a> type has four new methods:
-        <a href="/pkg/go/types/#Interface.IsComparable"><code>Interface.IsComparable</code></a> and
-        <a href="/pkg/go/types/#Interface.IsMethodSet"><code>Interface.IsMethodSet</code></a> to
-        query properties of the type set defined by the interface, and
-        <a href="/pkg/go/types/#Interface.MarkImplicit"><code>Interface.MarkImplicit</code></a> and
-        <a href="/pkg/go/types/#Interface.IsImplicit"><code>Interface.IsImplicit</code></a> to set
-        and test whether the interface is an implicit interface around a type constraint literal.
-      </li>
-      <li>
-        The new types
-        <a href="/pkg/go/types/#Union"><code>Union</code></a> and
-        <a href="/pkg/go/types/#Term"><code>Term</code></a>, factory functions
-        <a href="/pkg/go/types/#NewUnion"><code>NewUnion</code></a> and
-        <a href="/pkg/go/types/#NewTerm"><code>NewTerm</code></a>, and associated
-        methods are added to represent type sets in interfaces.
-      </li>
-      <li>
-        The new function
-        <a href="/pkg/go/types/#Instantiate"><code>Instantiate</code></a>
-        instantiates a parameterized type.
-      </li>
-      <li>
-        The new <a href="/pkg/go/types/#Info.Instances"><code>Info.Instances</code></a>
-        map records function and type instantiations through the new
-        <a href="/pkg/go/types/#Instance"><code>Instance</code></a> type.
-      </li>
-      <li><!-- CL 342671 -->
-        The new type <a href="/pkg/go/types/#ArgumentError"><code>ArgumentError</code></a>
-        and associated methods are added to represent an error related to a type argument.
-      </li>
-      <li><!-- CL 353089 -->
-        The new type <a href="/pkg/go/types/#Context"><code>Context</code></a> and factory function
-        <a href="/pkg/go/types/#NewContext"><code>NewContext</code></a>
-        are added to facilitate sharing of identical type instances
-        across type-checked packages, via the new
-        <a href="/pkg/go/types/#Config.Context"><code>Config.Context</code></a>
-        field.
-      </li>
-    </ul>
-    <p>
-      The predicates
-      <a href="/pkg/go/types/#AssignableTo"><code>AssignableTo</code></a>,
-      <a href="/pkg/go/types/#ConvertibleTo"><code>ConvertibleTo</code></a>,
-      <a href="/pkg/go/types/#Implements"><code>Implements</code></a>,
-      <a href="/pkg/go/types/#Identical"><code>Identical</code></a>,
-      <a href="/pkg/go/types/#IdenticalIgnoreTags"><code>IdenticalIgnoreTags</code></a>, and
-      <a href="/pkg/go/types/#AssertableTo"><code>AssertableTo</code></a>
-      now also work with arguments that are or contain generalized interfaces, i.e. interfaces
-      that may only be used as type constraints in Go code.
-      Note that the behavior of <code>AssertableTo</code> is undefined if the first argument
-      is a generalized interface.
-    </p>
-  </dd>
-</dl>
-
-<dl id="html/template"><dt><a href="/pkg/html/template/">html/template</a></dt>
-  <dd>
-    <p><!-- CL 321491 -->
-      Within a <code>range</code> pipeline the new
-      <code>{{break}}</code> command will end the loop early and the
-      new <code>{{continue}}</code> command will immediately start the
-      next loop iteration.
-    </p>
-
-    <p><!-- CL 321490 -->
-      The <code>and</code> function no longer always evaluates all arguments; it
-      stops evaluating arguments after the first argument that evaluates to
-      false.  Similarly, the <code>or</code> function now stops evaluating
-      arguments after the first argument that evaluates to true. This makes a
-      difference if any of the arguments is a function call.
-    </p>
-  </dd>
-</dl><!-- html/template -->
-
-<dl id="image/draw"><dt><a href="/pkg/image/draw/">image/draw</a></dt>
-  <dd>
-    <p><!-- CL 340049 -->
-      The <code>Draw</code> and <code>DrawMask</code> fallback implementations
-      (used when the arguments are not the most common image types) are now
-      faster when those arguments implement the optional
-      <a href="/pkg/image/draw/#RGBA64Image"><code>draw.RGBA64Image</code></a>
-      and <a href="/pkg/image/#RGBA64Image"><code>image.RGBA64Image</code></a>
-      interfaces that were added in Go 1.17.
-    </p>
-  </dd>
-</dl><!-- image/draw -->
-
-<dl id="net"><dt><a href="/pkg/net/">net</a></dt>
-  <dd>
-    <p><!-- CL 340261 -->
-      <a href="/pkg/net#Error"><code>net.Error.Temporary</code></a> has been deprecated.
-    </p>
-  </dd>
-</dl><!-- net -->
-
-<dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt>
-  <dd>
-    <p><!-- CL 330852 -->
-      On WebAssembly targets, the <code>Dial</code>, <code>DialContext</code>,
-      <code>DialTLS</code> and <code>DialTLSContext</code> method fields in
-      <a href="/pkg/net/http/#Transport"><code>Transport</code></a>
-      will now be correctly used, if specified, for making HTTP requests.
-    </p>
-
-    <p><!-- CL 338590 -->
-      The new
-      <a href="/pkg/net/http#Cookie.Valid"><code>Cookie.Valid</code></a>
-      method reports whether the cookie is valid.
-    </p>
-
-    <p><!-- CL 346569 -->
-      The new
-      <a href="/pkg/net/http#MaxBytesHandler"><code>MaxBytesHandler</code></a>
-      function creates a <code>Handler</code> that wraps its
-      <code>ResponseWriter</code> and <code>Request.Body</code> with a
-      <a href="/pkg/net/http#MaxBytesReader"><code>MaxBytesReader</code></a>.
-    </p>
-  </dd>
-</dl><!-- net/http -->
-
-<dl id="os/user"><dt><a href="/pkg/os/user/">os/user</a></dt>
-  <dd>
-    <p><!-- CL 330753 -->
-      <a href="/pkg/os/user#User.GroupIds"><code>User.GroupIds</code></a>
-      now uses a Go native implementation when cgo is not available.
-    </p>
-  </dd>
-</dl><!-- os/user -->
-
-<dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt>
-  <dd>
-    <p><!-- CL 356049, CL 320929 -->
-      The new
-      <a href="/pkg/reflect/#Value.SetIterKey"><code>Value.SetIterKey</code></a>
-      and <a href="/pkg/reflect/#Value.SetIterValue"><code>Value.SetIterValue</code></a>
-      methods set a Value using a map iterator as the source. They are equivalent to
-      <code>Value.Set(iter.Key())</code> and <code>Value.Set(iter.Value())</code>, but
-      do fewer allocations.
-    </p>
-
-    <p><!-- CL 350691 -->
-      The new
-      <a href="/pkg/reflect/#Value.UnsafePointer"><code>Value.UnsafePointer</code></a>
-      method returns the Value's value as an <a href="/pkg/unsafe/#Pointer"><code>unsafe.Pointer</code></a>.
-      This allows callers to migrate from <a href="/pkg/reflect/#Value.UnsafeAddr"><code>Value.UnsafeAddr</code></a>
-      and <a href="/pkg/reflect/#Value.Pointer"><code>Value.Pointer</code></a>
-      to eliminate the need to perform uintptr to unsafe.Pointer conversions at the callsite (as unsafe.Pointer rules require).
-    </p>
-
-    <p><!-- CL 321891 -->
-      The new
-      <a href="/pkg/reflect/#MapIter.Reset"><code>MapIter.Reset</code></a>
-      method changes its receiver to iterate over a
-      different map. The use of
-      <a href="/pkg/reflect/#MapIter.Reset"><code>MapIter.Reset</code></a>
-      allows allocation-free iteration
-      over many maps.
-    </p>
-
-    <p><!-- CL 352131 -->
-      A number of methods (
-      <a href="/pkg/reflect#Value.CanInt"><code>Value.CanInt</code></a>,
-      <a href="/pkg/reflect#Value.CanUint"><code>Value.CanUint</code></a>,
-      <a href="/pkg/reflect#Value.CanFloat"><code>Value.CanFloat</code></a>,
-      <a href="/pkg/reflect#Value.CanComplex"><code>Value.CanComplex</code></a>
-      )
-      have been added to
-      <a href="/pkg/reflect#Value"><code>Value</code></a>
-      to test if a conversion is safe.
-    </p>
-
-    <p><!-- CL 357962 -->
-      <a href="/pkg/reflect#Value.FieldByIndexErr"><code>Value.FieldByIndexErr</code></a>
-      has been added to avoid the panic that occurs in
-      <a href="/pkg/reflect#Value.FieldByIndex"><code>Value.FieldByIndex</code></a>
-      when stepping through a nil pointer to an embedded struct.
-    </p>
-
-    <p><!-- CL 341333 -->
-      <a href="/pkg/reflect#Ptr"><code>reflect.Ptr</code></a> and
-      <a href="/pkg/reflect#PtrTo"><code>reflect.PtrTo</code></a>
-      have been renamed to
-      <a href="/pkg/reflect#Pointer"><code>reflect.Pointer</code></a> and
-      <a href="/pkg/reflect#PointerTo"><code>reflect.PointerTo</code></a>,
-      respectively, for consistency with the rest of the reflect package.
-      The old names will continue to work, but will be deprecated in a
-      future Go release.
-    </p>
-  </dd><!-- CL 321889 and CL 345486 are optimizations, no need to mention. -->
-</dl><!-- reflect -->
-
-<dl id="regexp"><dt><a href="/pkg/regexp/">regexp</a></dt>
-  <dd>
-    <p><!-- CL 354569 -->
-      <a href="/pkg/regexp/"><code>regexp</code></a>
-      now treats each invalid byte of a UTF-8 string as <code>U+FFFD</code>.
-    </p>
-  </dd>
-</dl><!-- regexp -->
-
-<dl id="runtime/debug"><dt><a href="/pkg/runtime/debug/">runtime/debug</a></dt>
-  <dd>
-    <p><!-- CL 354569 -->
-      The <a href="/pkg/runtime/debug#BuildInfo"><code>BuildInfo</code></a>
-      struct has two new fields, containing additional information
-      about how the binary was built:
-      <ul>
-	<li><a href="/pkg/runtime/debug#BuildInfo.GoVersion"><code>GoVersion</code></a>
-	  holds the version of Go used to build the binary.
-	</li>
-	<li>
-	  <a href="/pkg/runtime/debug#BuildInfo.Settings"><code>Settings</code></a>
-	  is a slice of
-	  <a href="/pkg/runtime/debug#BuildSettings"><code>BuildSettings</code></a>
-	  structs holding key/value pairs describing the build.
-	</li>
-      </ul>
-    </p>
-  </dd>
-</dl><!-- runtime/debug -->
-
-<dl id="runtime/pprof"><dt><a href="/pkg/runtime/pprof/">runtime/pprof</a></dt>
-  <dd>
-    <p><!-- CL 324129 -->
-      The CPU profiler now uses per-thread timers on Linux. This increases the
-      maximum CPU usage that a profile can observe, and reduces some forms of
-      bias.
-    </p>
-  </dd>
-</dl><!-- runtime/pprof -->
-
-<dl id="strconv"><dt><a href="/pkg/strconv/">strconv</a></dt>
-  <dd>
-    <p><!-- CL 343877 -->
-      <a href="/pkg/strconv/#strconv.Unquote"><code>strconv.Unquote</code></a>
-      now rejects Unicode surrogate halves.
-    </p>
-  </dd>
-</dl><!-- strconv -->
-
-<dl id="strings"><dt><a href="/pkg/strings/">strings</a></dt>
-  <dd>
-    <p><!-- CL 351710 -->
-      The new <a href="/pkg/strings/#Cut"><code>Cut</code></a> function
-      slices a <code>string</code> around a separator. It can replace
-      and simplify many common uses of
-      <a href="/pkg/strings/#Index"><code>Index</code></a>,
-      <a href="/pkg/strings/#IndexByte"><code>IndexByte</code></a>,
-      <a href="/pkg/strings/#IndexRune"><code>IndexRune</code></a>,
-      and <a href="/pkg/strings/#SplitN"><code>SplitN</code></a>.
-    </p>
-
-    <p><!-- CL 345849 -->
-      The new <a href="/pkg/strings/#Clone"><code>Clone</code></a> function copies the input
-      <code>string</code> without the returned cloned <code>string</code> referencing
-      the input string's memory.
-    </p>
-
-    <p><!-- CL 323318, CL 332771 -->
-      <a href="/pkg/strings/#Trim"><code>Trim</code></a>, <a href="/pkg/strings/#TrimLeft"><code>TrimLeft</code></a>,
-      and <a href="/pkg/strings/#TrimRight"><code>TrimRight</code></a> are now allocation free and, especially for
-      small ASCII cutsets, up to 10 times faster.
-    </p>
-
-    <p><!-- CL 359485 -->
-      The <a href="/pkg/strings/#Title"><code>Title</code></a> function is now deprecated. It doesn't
-      handle Unicode punctuation and language-specific capitalization rules, and is superseded by the
-      <a href="https://golang.org/x/text/cases">golang.org/x/text/cases</a> package.
-    </p>
-  </dd>
-</dl><!-- strings -->
-
-<dl id="sync"><dt><a href="/pkg/sync/">sync</a></dt>
-  <dd>
-    <p><!-- CL 319769 -->
-      The new methods
-      <a href="/pkg/sync#Mutex.TryLock"><code>Mutex.TryLock</code></a>,
-      <a href="/pkg/sync#RWMutex.TryLock"><code>RWMutex.TryLock</code></a>, and
-      <a href="/pkg/sync#RWMutex.TryRLock"><code>RWMutex.TryRLock</code></a>,
-      will acquire the lock if it is not currently held.
-    </p>
-  </dd>
-</dl><!-- sync -->
-
-<dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt>
-  <dd>
-    <p><!-- CL 336550 -->
-      The new function <a href="/pkg/syscall/?GOOS=windows#SyscallN"><code>SyscallN</code></a>
-      has been introduced for Windows, allowing for calls with arbitrary number
-      of arguments. As a result,
-      <a href="/pkg/syscall/?GOOS=windows#Syscall"><code>Syscall</code></a>,
-      <a href="/pkg/syscall/?GOOS=windows#Syscall6"><code>Syscall6</code></a>,
-      <a href="/pkg/syscall/?GOOS=windows#Syscall9"><code>Syscall9</code></a>,
-      <a href="/pkg/syscall/?GOOS=windows#Syscall12"><code>Syscall12</code></a>,
-      <a href="/pkg/syscall/?GOOS=windows#Syscall15"><code>Syscall15</code></a>, and
-      <a href="/pkg/syscall/?GOOS=windows#Syscall18"><code>Syscall18</code></a> are
-      deprecated in favor of <a href="/pkg/syscall/?GOOS=windows#SyscallN"><code>SyscallN</code></a>.
-    </p>
-
-    <p><!-- CL 355570 -->
-      <a href="/pkg/syscall/?GOOS=freebsd#SysProcAttr.Pdeathsig"><code>SysProcAttr.Pdeathsig</code></a>
-      is now supported in FreeBSD.
-    </p>
-  </dd>
-</dl><!-- syscall -->
-
-<dl id="syscall/js"><dt><a href="/pkg/syscall/js/">syscall/js</a></dt>
-  <dd>
-    <p><!-- CL 356430 -->
-      The <code>Wrapper</code> interface has been removed.
-    </p>
-  </dd>
-</dl><!-- syscall/js -->
-
-<dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt>
-  <dd>
-    <p><!-- CL 343883 -->
-      The precedence of <code>/</code> in the argument for <code>-run</code> and
-      <code>-bench</code> has been increased. <code>A/B|C/D</code> used to be
-      treated as <code>A/(B|C)/D</code> and is now treated as
-      <code>(A/B)|(C/D)</code>.
-    </p>
-
-    <p><!-- CL 356669 -->
-      If the <code>-run</code> option does not select any tests, the
-      <code>-count</code> option is ignored. This could change the behavior of
-      existing tests in the unlikely case that a test changes the set of subtests
-      that are run each time the test function itself is run.
-    </p>
-
-    <p><!-- CL 251441 -->
-      The new <a href="/pkg/testing#F"><code>testing.F</code></a> type
-      is used by the new <a href="#fuzzing">fuzzing support described
-      above</a>. Tests also now support the command line
-      options <code>-test.fuzz</code>, <code>-test.fuzztime</code>, and
-      <code>-test.fuzzminimizetime</code>.
-    </p>
-  </dd>
-</dl><!-- testing -->
-
-<dl id="text/template"><dt><a href="/pkg/text/template/">text/template</a></dt>
-  <dd>
-    <p><!-- CL 321491 -->
-      Within a <code>range</code> pipeline the new
-      <code>{{break}}</code> command will end the loop early and the
-      new <code>{{continue}}</code> command will immediately start the
-      next loop iteration.
-    </p>
-
-    <p><!-- CL 321490 -->
-      The <code>and</code> function no longer always evaluates all arguments; it
-      stops evaluating arguments after the first argument that evaluates to
-      false.  Similarly, the <code>or</code> function now stops evaluating
-      arguments after the first argument that evaluates to true. This makes a
-      difference if any of the arguments is a function call.
-    </p>
-  </dd>
-</dl><!-- text/template -->
-
-<dl id="text/template/parse"><dt><a href="/pkg/text/template/parse/">text/template/parse</a></dt>
-  <dd>
-    <p><!-- CL 321491 -->
-      The package supports the new
-      <a href="/pkg/text/template/">text/template</a> and
-      <a href="/pkg/html/template/">html/template</a>
-      <code>{{break}}</code> command via the new constant
-      <a href="/pkg/text/template/parse#NodeBreak"><code>NodeBreak</code></a>
-      and the new type
-      <a href="/pkg/text/template/parse#BreakNode"><code>BreakNode</code></a>,
-      and similarly supports the new <code>{{continue}}</code> command
-      via the new constant
-      <a href="/pkg/text/template/parse#NodeContinue"><code>NodeContinue</code></a>
-      and the new type
-      <a href="/pkg/text/template/parse#ContinueNode"><code>ContinueNode</code></a>.
-    </p>
-  </dd>
-</dl><!-- text/template -->
-
-<dl id="unicode/utf8"><dt><a href="/pkg/unicode/utf8/">unicode/utf8</a></dt>
-  <dd>
-    <p><!-- CL 345571 -->
-      The new <a href="/pkg/unicode/utf8/#AppendRune"><code>AppendRune</code></a> function appends the UTF-8
-      encoding of a <code>rune</code> to a <code>[]byte</code>.
-    </p>
-  </dd>
-</dl><!-- unicode/utf8 -->
diff --git a/doc/go_mem.html b/doc/go_mem.html
index 5f1eb68..661e1e7 100644
--- a/doc/go_mem.html
+++ b/doc/go_mem.html
@@ -1,6 +1,6 @@
 <!--{
 	"Title": "The Go Memory Model",
-	"Subtitle": "Version of May 31, 2014",
+	"Subtitle": "Version of June 6, 2022",
 	"Path": "/ref/mem"
 }-->
 
@@ -8,12 +8,9 @@
 p.rule {
   font-style: italic;
 }
-span.event {
-  font-style: italic;
-}
 </style>
 
-<h2>Introduction</h2>
+<h2 id="introduction">Introduction</h2>
 
 <p>
 The Go memory model specifies the conditions under which
@@ -22,7 +19,7 @@
 </p>
 
 
-<h2>Advice</h2>
+<h3 id="advice">Advice</h3>
 
 <p>
 Programs that modify data being simultaneously accessed by multiple goroutines
@@ -44,90 +41,237 @@
 Don't be clever.
 </p>
 
-<h2>Happens Before</h2>
+<h3 id="overview">Informal Overview</h3>
 
 <p>
-Within a single goroutine, reads and writes must behave
-as if they executed in the order specified by the program.
-That is, compilers and processors may reorder the reads and writes
-executed within a single goroutine only when the reordering
-does not change the behavior within that goroutine
-as defined by the language specification.
-Because of this reordering, the execution order observed
-by one goroutine may differ from the order perceived
-by another.  For example, if one goroutine
-executes <code>a = 1; b = 2;</code>, another might observe
-the updated value of <code>b</code> before the updated value of <code>a</code>.
+Go approaches its memory model in much the same way as the rest of the language,
+aiming to keep the semantics simple, understandable, and useful.
+This section gives a general overview of the approach and should suffice for most programmers.
+The memory model is specified more formally in the next section.
 </p>
 
 <p>
-To specify the requirements of reads and writes, we define
-<i>happens before</i>, a partial order on the execution
-of memory operations in a Go program.  If event <span class="event">e<sub>1</sub></span> happens
-before event <span class="event">e<sub>2</sub></span>, then we say that <span class="event">e<sub>2</sub></span> happens after <span class="event">e<sub>1</sub></span>.
-Also, if <span class="event">e<sub>1</sub></span> does not happen before <span class="event">e<sub>2</sub></span> and does not happen
-after <span class="event">e<sub>2</sub></span>, then we say that <span class="event">e<sub>1</sub></span> and <span class="event">e<sub>2</sub></span> happen concurrently.
-</p>
-
-<p class="rule">
-Within a single goroutine, the happens-before order is the
-order expressed by the program.
+A <em>data race</em> is defined as
+a write to a memory location happening concurrently with another read or write to that same location,
+unless all the accesses involved are atomic data accesses as provided by the <code>sync/atomic</code> package.
+As noted already, programmers are strongly encouraged to use appropriate synchronization
+to avoid data races.
+In the absence of data races, Go programs behave as if all the goroutines
+were multiplexed onto a single processor.
+This property is sometimes referred to as DRF-SC: data-race-free programs
+execute in a sequentially consistent manner.
 </p>
 
 <p>
-A read <span class="event">r</span> of a variable <code>v</code> is <i>allowed</i> to observe a write <span class="event">w</span> to <code>v</code>
-if both of the following hold:
+While programmers should write Go programs without data races,
+there are limitations to what a Go implementation can do in response to a data race.
+An implementation may always react to a data race by reporting the race and terminating the program.
+Otherwise, each read of a single-word-sized or sub-word-sized memory location
+must observe a value actually written to that location (perhaps by a concurrent executing goroutine)
+and not yet overwritten.
+These implementation constraints make Go more like Java or JavaScript,
+in that most races have a limited number of outcomes,
+and less like C and C++, where the meaning of any program with a race
+is entirely undefined, and the compiler may do anything at all.
+Go's approach aims to make errant programs more reliable and easier to debug,
+while still insisting that races are errors and that tools can diagnose and report them.
 </p>
 
+<h2 id="model">Memory Model</h2>
+
+<p>
+The following formal definition of Go's memory model closely follows
+the approach presented by Hans-J. Boehm and Sarita V. Adve in
+“<a href="https://www.hpl.hp.com/techreports/2008/HPL-2008-56.pdf">Foundations of the C++ Concurrency Memory Model</a>”,
+published in PLDI 2008.
+The definition of data-race-free programs and the guarantee of sequential consistency
+for race-free programs are equivalent to the ones in that work.
+</p>
+
+<p>
+The memory model describes the requirements on program executions,
+which are made up of goroutine executions,
+which in turn are made up of memory operations.
+</p>
+
+<p>
+A <i>memory operation</i> is modeled by four details:
+</p>
+<ul>
+<li>its kind, indicating whether it is an ordinary data read, an ordinary data write,
+or a <i>synchronizing operation</i> such as an atomic data access,
+a mutex operation, or a channel operation,
+<li>its location in the program,
+<li>the memory location or variable being accessed, and
+<li>the values read or written by the operation.
+</ul>
+<p>
+Some memory operations are <i>read-like</i>, including read, atomic read, mutex lock, and channel receive.
+Other memory operations are <i>write-like</i>, including write, atomic write, mutex unlock, channel send, and channel close.
+Some, such as atomic compare-and-swap, are both read-like and write-like.
+</p>
+
+<p>
+A <i>goroutine execution</i> is modeled as a set of memory operations executed by a single goroutine.
+</p>
+
+<p>
+<b>Requirement 1</b>:
+The memory operations in each goroutine must correspond to a correct sequential execution of that goroutine,
+given the values read from and written to memory.
+That execution must be consistent with the <i>sequenced before</i> relation,
+defined as the partial order requirements set out by the <a href="/ref/spec">Go language specification</a>
+for Go's control flow constructs as well as the <a href="/ref/spec#Order_of_evaluation">order of evaluation for expressions</a>.
+</p>
+
+<p>
+A Go <i>program execution</i> is modeled as a set of goroutine executions,
+together with a mapping <i>W</i> that specifies the write-like operation that each read-like operation reads from.
+(Multiple executions of the same program can have different program executions.)
+</p>
+
+<p>
+<b>Requirement 2</b>:
+For a given program execution, the mapping <i>W</i>, when limited to synchronizing operations,
+must be explainable by some implicit total order of the synchronizing operations
+that is consistent with sequencing and the values read and written by those operations.
+</p>
+
+<p>
+The <i>synchronized before</i> relation is a partial order on synchronizing memory operations,
+derived from <i>W</i>.
+If a synchronizing read-like memory operation <i>r</i>
+observes a synchronizing write-like memory operation <i>w</i>
+(that is, if <i>W</i>(<i>r</i>) = <i>w</i>),
+then <i>w</i> is synchronized before <i>r</i>.
+Informally, the synchronized before relation is a subset of the implied total order
+mentioned in the previous paragraph,
+limited to the information that <i>W</i> directly observes.
+</p>
+
+<p>
+The <i>happens before</i> relation is defined as the transitive closure of the
+union of the sequenced before and synchronized before relations.
+</p>
+
+<p>
+<b>Requirement 3</b>:
+For an ordinary (non-synchronizing) data read <i>r</i> on a memory location <i>x</i>,
+<i>W</i>(<i>r</i>) must be a write <i>w</i> that is <i>visible</i> to <i>r</i>,
+where visible means that both of the following hold:
+
 <ol>
-<li><span class="event">r</span> does not happen before <span class="event">w</span>.</li>
-<li>There is no other write <span class="event">w'</span> to <code>v</code> that happens
-    after <span class="event">w</span> but before <span class="event">r</span>.</li>
+<li><i>w</i> happens before <i>r</i>.
+<li><i>w</i> does not happen before any other write <i>w'</i> (to <i>x</i>) that happens before <i>r</i>.
 </ol>
 
 <p>
-To guarantee that a read <span class="event">r</span> of a variable <code>v</code> observes a
-particular write <span class="event">w</span> to <code>v</code>, ensure that <span class="event">w</span> is the only
-write <span class="event">r</span> is allowed to observe.
-That is, <span class="event">r</span> is <i>guaranteed</i> to observe <span class="event">w</span> if both of the following hold:
-</p>
-
-<ol>
-<li><span class="event">w</span> happens before <span class="event">r</span>.</li>
-<li>Any other write to the shared variable <code>v</code>
-either happens before <span class="event">w</span> or after <span class="event">r</span>.</li>
-</ol>
-
-<p>
-This pair of conditions is stronger than the first pair;
-it requires that there are no other writes happening
-concurrently with <span class="event">w</span> or <span class="event">r</span>.
+A <i>read-write data race</i> on memory location <i>x</i>
+consists of a read-like memory operation <i>r</i> on <i>x</i>
+and a write-like memory operation <i>w</i> on <i>x</i>,
+at least one of which is non-synchronizing,
+which are unordered by happens before
+(that is, neither <i>r</i> happens before <i>w</i>
+nor <i>w</i> happens before <i>r</i>).
 </p>
 
 <p>
-Within a single goroutine,
-there is no concurrency, so the two definitions are equivalent:
-a read <span class="event">r</span> observes the value written by the most recent write <span class="event">w</span> to <code>v</code>.
-When multiple goroutines access a shared variable <code>v</code>,
-they must use synchronization events to establish
-happens-before conditions that ensure reads observe the
-desired writes.
+A <i>write-write data race</i> on memory location <i>x</i>
+consists of two write-like memory operations <i>w</i> and <i>w'</i> on <i>x</i>,
+at least one of which is non-synchronizing,
+which are unordered by happens before.
 </p>
 
 <p>
-The initialization of variable <code>v</code> with the zero value
-for <code>v</code>'s type behaves as a write in the memory model.
+Note that if there are no read-write or write-write data races on memory location <i>x</i>,
+then any read <i>r</i> on <i>x</i> has only one possible <i>W</i>(<i>r</i>):
+the single <i>w</i> that immediately precedes it in the happens before order.
 </p>
 
 <p>
-Reads and writes of values larger than a single machine word
-behave as multiple machine-word-sized operations in an
-unspecified order.
+More generally, it can be shown that any Go program that is data-race-free,
+meaning it has no program executions with read-write or write-write data races,
+can only have outcomes explained by some sequentially consistent interleaving
+of the goroutine executions.
+(The proof is the same as Section 7 of Boehm and Adve's paper cited above.)
+This property is called DRF-SC.
 </p>
 
-<h2>Synchronization</h2>
+<p>
+The intent of the formal definition is to match
+the DRF-SC guarantee provided to race-free programs
+by other languages, including C, C++, Java, JavaScript, Rust, and Swift.
+</p>
 
-<h3>Initialization</h3>
+<p>
+Certain Go language operations such as goroutine creation and memory allocation
+act as synchronization operations.
+The effect of these operations on the synchronized-before partial order
+is documented in the “Synchronization” section below.
+Individual packages are responsible for providing similar documentation
+for their own operations.
+</p>
+
+<h2 id="restrictions">Implementation Restrictions for Programs Containing Data Races</h2>
+
+<p>
+The preceding section gave a formal definition of data-race-free program execution.
+This section informally describes the semantics that implementations must provide
+for programs that do contain races.
+</p>
+
+<p>
+First, any implementation can, upon detecting a data race,
+report the race and halt execution of the program.
+Implementations using ThreadSanitizer
+(accessed with “<code>go</code> <code>build</code> <code>-race</code>”)
+do exactly this.
+</p>
+
+<p>
+Otherwise, a read <i>r</i> of a memory location <i>x</i>
+that is not larger than a machine word must observe
+some write <i>w</i> such that <i>r</i> does not happen before <i>w</i>
+and there is no write <i>w'</i> such that <i>w</i> happens before <i>w'</i>
+and <i>w'</i> happens before <i>r</i>.
+That is, each read must observe a value written by a preceding or concurrent write.
+</p>
+
+<p>
+Additionally, observation of acausal and “out of thin air” writes is disallowed.
+</p>
+
+<p>
+Reads of memory locations larger than a single machine word
+are encouraged but not required to meet the same semantics
+as word-sized memory locations,
+observing a single allowed write <i>w</i>.
+For performance reasons,
+implementations may instead treat larger operations
+as a set of individual machine-word-sized operations
+in an unspecified order.
+This means that races on multiword data structures
+can lead to inconsistent values not corresponding to a single write.
+When the values depend on the consistency
+of internal (pointer, length) or (pointer, type) pairs,
+as can be the case for interface values, maps,
+slices, and strings in most Go implementations,
+such races can in turn lead to arbitrary memory corruption.
+</p>
+
+<p>
+Examples of incorrect synchronization are given in the
+“Incorrect synchronization” section below.
+</p>
+
+<p>
+Examples of the limitations on implementations are given in the
+“Incorrect compilation” section below.
+</p>
+
+<h2 id="synchronization">Synchronization</h2>
+
+<h3 id="init">Initialization</h3>
 
 <p>
 Program initialization runs in a single goroutine,
@@ -141,15 +285,15 @@
 </p>
 
 <p class="rule">
-The start of the function <code>main.main</code> happens after
-all <code>init</code> functions have finished.
+The completion of all <code>init</code> functions is synchronized before
+the start of the function <code>main.main</code>.
 </p>
 
-<h3>Goroutine creation</h3>
+<h3 id="go">Goroutine creation</h3>
 
 <p class="rule">
 The <code>go</code> statement that starts a new goroutine
-happens before the goroutine's execution begins.
+is synchronized before the start of the goroutine's execution.
 </p>
 
 <p>
@@ -174,11 +318,12 @@
 at some point in the future (perhaps after <code>hello</code> has returned).
 </p>
 
-<h3>Goroutine destruction</h3>
+<h3 id="goexit">Goroutine destruction</h3>
 
 <p>
-The exit of a goroutine is not guaranteed to happen before
-any event in the program.  For example, in this program:
+The exit of a goroutine is not guaranteed to be synchronized before
+any event in the program.
+For example, in this program:
 </p>
 
 <pre>
@@ -203,7 +348,7 @@
 communication to establish a relative ordering.
 </p>
 
-<h3>Channel communication</h3>
+<h3 id="chan">Channel communication</h3>
 
 <p>
 Channel communication is the main method of synchronization
@@ -213,8 +358,8 @@
 </p>
 
 <p class="rule">
-A send on a channel happens before the corresponding
-receive from that channel completes.
+A send on a channel is synchronized before the completion of the
+corresponding receive from that channel.
 </p>
 
 <p>
@@ -239,13 +384,13 @@
 
 <p>
 is guaranteed to print <code>"hello, world"</code>.  The write to <code>a</code>
-happens before the send on <code>c</code>, which happens before
-the corresponding receive on <code>c</code> completes, which happens before
+is sequenced before the send on <code>c</code>, which is synchronized before
+the corresponding receive on <code>c</code> completes, which is sequenced before
 the <code>print</code>.
 </p>
 
 <p class="rule">
-The closing of a channel happens before a receive that returns a zero value
+The closing of a channel is synchronized before a receive that returns a zero value
 because the channel is closed.
 </p>
 
@@ -256,8 +401,8 @@
 </p>
 
 <p class="rule">
-A receive from an unbuffered channel happens before
-the send on that channel completes.
+A receive from an unbuffered channel is synchronized before the completion of
+the corresponding send on that channel.
 </p>
 
 <p>
@@ -283,8 +428,8 @@
 
 <p>
 is also guaranteed to print <code>"hello, world"</code>.  The write to <code>a</code>
-happens before the receive on <code>c</code>, which happens before
-the corresponding send on <code>c</code> completes, which happens
+is sequenced before the receive on <code>c</code>, which is synchronized before
+the corresponding send on <code>c</code> completes, which is sequenced
 before the <code>print</code>.
 </p>
 
@@ -296,7 +441,7 @@
 </p>
 
 <p class="rule">
-The <i>k</i>th receive on a channel with capacity <i>C</i> happens before the <i>k</i>+<i>C</i>th send from that channel completes.
+The <i>k</i>th receive on a channel with capacity <i>C</i> is synchronized before the completion of the <i>k</i>+<i>C</i>th send from that channel completes.
 </p>
 
 <p>
@@ -330,7 +475,7 @@
 }
 </pre>
 
-<h3>Locks</h3>
+<h3 id="locks">Locks</h3>
 
 <p>
 The <code>sync</code> package implements two lock data types,
@@ -339,7 +484,7 @@
 
 <p class="rule">
 For any <code>sync.Mutex</code> or <code>sync.RWMutex</code> variable <code>l</code> and <i>n</i> &lt; <i>m</i>,
-call <i>n</i> of <code>l.Unlock()</code> happens before call <i>m</i> of <code>l.Lock()</code> returns.
+call <i>n</i> of <code>l.Unlock()</code> is synchronized before call <i>m</i> of <code>l.Lock()</code> returns.
 </p>
 
 <p>
@@ -365,19 +510,29 @@
 
 <p>
 is guaranteed to print <code>"hello, world"</code>.
-The first call to <code>l.Unlock()</code> (in <code>f</code>) happens
+The first call to <code>l.Unlock()</code> (in <code>f</code>) is synchronized
 before the second call to <code>l.Lock()</code> (in <code>main</code>) returns,
-which happens before the <code>print</code>.
+which is sequenced before the <code>print</code>.
 </p>
 
 <p class="rule">
 For any call to <code>l.RLock</code> on a <code>sync.RWMutex</code> variable <code>l</code>,
-there is an <i>n</i> such that the <code>l.RLock</code> happens (returns) after call <i>n</i> to
-<code>l.Unlock</code> and the matching <code>l.RUnlock</code> happens
-before call <i>n</i>+1 to <code>l.Lock</code>.
+there is an <i>n</i> such that the <i>n</i>th call to <code>l.Unlock</code>
+is synchronized before the return from <code>l.RLock</code>,
+and the matching call to <code>l.RUnlock</code> is synchronized before the return from call <i>n</i>+1 to <code>l.Lock</code>.
 </p>
 
-<h3>Once</h3>
+<p class="rule">
+A successful call to <code>l.TryLock</code> (or <code>l.TryRLock</code>)
+is equivalent to a call to <code>l.Lock</code> (or <code>l.RLock</code>).
+An unsuccessful call has no synchronizing effect at all.
+As far as the memory model is concerned,
+<code>l.TryLock</code> (or <code>l.TryRLock</code>)
+may be considered to be able to return false
+even when the mutex <i>l</i> is unlocked.
+</p>
+
+<h3 id="once">Once</h3>
 
 <p>
 The <code>sync</code> package provides a safe mechanism for
@@ -389,7 +544,8 @@
 </p>
 
 <p class="rule">
-A single call of <code>f()</code> from <code>once.Do(f)</code> happens (returns) before any call of <code>once.Do(f)</code> returns.
+The completion of a single call of <code>f()</code> from <code>once.Do(f)</code>
+is synchronized before the return of any call of <code>once.Do(f)</code>.
 </p>
 
 <p>
@@ -424,13 +580,60 @@
 twice.
 </p>
 
-<h2>Incorrect synchronization</h2>
+<h3 id="atomic">Atomic Values</h3>
 
 <p>
-Note that a read <span class="event">r</span> may observe the value written by a write <span class="event">w</span>
-that happens concurrently with <span class="event">r</span>.
-Even if this occurs, it does not imply that reads happening after <span class="event">r</span>
-will observe writes that happened before <span class="event">w</span>.
+The APIs in the <a href="/pkg/sync/atomic/"><code>sync/atomic</code></a>
+package are collectively “atomic operations”
+that can be used to synchronize the execution of different goroutines.
+If the effect of an atomic operation <i>A</i> is observed by atomic operation <i>B</i>,
+then <i>A</i> is synchronized before <i>B</i>.
+All the atomic operations executed in a program behave as though executed
+in some sequentially consistent order.
+</p>
+
+<p>
+The preceding definition has the same semantics as C++’s sequentially consistent atomics
+and Java’s <code>volatile</code> variables.
+</p>
+
+<h3 id="finalizer">Finalizers</h3>
+
+<p>
+The <a href="/pkg/runtime/"><code>runtime</code></a> package provides
+a <code>SetFinalizer</code> function that adds a finalizer to be called when
+a particular object is no longer reachable by the program.
+A call to <code>SetFinalizer(x, f)</code> is synchronized before the finalization call <code>f(x)</code>.
+</p>
+
+<h3 id="more">Additional Mechanisms</h3>
+
+<p>
+The <code>sync</code> package provides additional synchronization abstractions,
+including <a href="/pkg/sync/#Cond">condition variables</a>,
+<a href="/pkg/sync/#Map">lock-free maps</a>,
+<a href="/pkg/sync/#Pool">allocation pools</a>,
+and
+<a href="/pkg/sync/#WaitGroup">wait groups</a>.
+The documentation for each of these specifies the guarantees it
+makes concerning synchronization.
+</p>
+
+<p>
+Other packages that provide synchronization abstractions
+should document the guarantees they make too.
+</p>
+
+
+<h2 id="badsync">Incorrect synchronization</h2>
+
+<p>
+Programs with races are incorrect and
+can exhibit non-sequentially consistent executions.
+In particular, note that a read <i>r</i> may observe the value written by any write <i>w</i>
+that executes concurrently with <i>r</i>.
+Even if this occurs, it does not imply that reads happening after <i>r</i>
+will observe writes that happened before <i>w</i>.
 </p>
 
 <p>
@@ -566,3 +769,197 @@
 In all these examples, the solution is the same:
 use explicit synchronization.
 </p>
+
+<h2 id="badcompiler">Incorrect compilation</h2>
+
+<p>
+The Go memory model restricts compiler optimizations as much as it does Go programs.
+Some compiler optimizations that would be valid in single-threaded programs are not valid in all Go programs.
+In particular, a compiler must not introduce writes that do not exist in the original program,
+it must not allow a single read to observe multiple values,
+and it must not allow a single write to write multiple values.
+</p>
+
+<p>
+All the following examples assume that `*p` and `*q` refer to
+memory locations accessible to multiple goroutines.
+</p>
+
+<p>
+Not introducing data races into race-free programs means not moving
+writes out of conditional statements in which they appear.
+For example, a compiler must not invert the conditional in this program:
+</p>
+
+<pre>
+*p = 1
+if cond {
+	*p = 2
+}
+</pre>
+
+<p>
+That is, the compiler must not rewrite the program into this one:
+</p>
+
+<pre>
+*p = 2
+if !cond {
+	*p = 1
+}
+</pre>
+
+<p>
+If <code>cond</code> is false and another goroutine is reading <code>*p</code>,
+then in the original program, the other goroutine can only observe any prior value of <code>*p</code> and <code>1</code>.
+In the rewritten program, the other goroutine can observe <code>2</code>, which was previously impossible.
+</p>
+
+<p>
+Not introducing data races also means not assuming that loops terminate.
+For example, a compiler must in general not move the accesses to <code>*p</code> or <code>*q</code>
+ahead of the loop in this program:
+</p>
+
+<pre>
+n := 0
+for e := list; e != nil; e = e.next {
+	n++
+}
+i := *p
+*q = 1
+</pre>
+
+<p>
+If <code>list</code> pointed to a cyclic list,
+then the original program would never access <code>*p</code> or <code>*q</code>,
+but the rewritten program would.
+(Moving `*p` ahead would be safe if the compiler can prove `*p` will not panic;
+moving `*q` ahead would also require the compiler proving that no other
+goroutine can access `*q`.)
+</p>
+
+<p>
+Not introducing data races also means not assuming that called functions
+always return or are free of synchronization operations.
+For example, a compiler must not move the accesses to <code>*p</code> or <code>*q</code>
+ahead of the function call in this program
+(at least not without direct knowledge of the precise behavior of <code>f</code>):
+</p>
+
+<pre>
+f()
+i := *p
+*q = 1
+</pre>
+
+<p>
+If the call never returned, then once again the original program
+would never access <code>*p</code> or <code>*q</code>, but the rewritten program would.
+And if the call contained synchronizing operations, then the original program
+could establish happens before edges preceding the accesses
+to <code>*p</code> and <code>*q</code>, but the rewritten program would not.
+</p>
+
+<p>
+Not allowing a single read to observe multiple values means
+not reloading local variables from shared memory.
+For example, a compiler must not discard <code>i</code> and reload it
+a second time from <code>*p</code> in this program:
+</p>
+
+<pre>
+i := *p
+if i &lt; 0 || i &gt;= len(funcs) {
+	panic("invalid function index")
+}
+... complex code ...
+// compiler must NOT reload i = *p here
+funcs[i]()
+</pre>
+
+<p>
+If the complex code needs many registers, a compiler for single-threaded programs
+could discard <code>i</code> without saving a copy and then reload
+<code>i = *p</code> just before
+<code>funcs[i]()</code>.
+A Go compiler must not, because the value of <code>*p</code> may have changed.
+(Instead, the compiler could spill <code>i</code> to the stack.)
+</p>
+
+<p>
+Not allowing a single write to write multiple values also means not using
+the memory where a local variable will be written as temporary storage before the write.
+For example, a compiler must not use <code>*p</code> as temporary storage in this program:
+</p>
+
+<pre>
+*p = i + *p/2
+</pre>
+
+<p>
+That is, it must not rewrite the program into this one:
+</p>
+
+<pre>
+*p /= 2
+*p += i
+</pre>
+
+<p>
+If <code>i</code> and <code>*p</code> start equal to 2,
+the original code does <code>*p = 3</code>,
+so a racing thread can read only 2 or 3 from <code>*p</code>.
+The rewritten code does <code>*p = 1</code> and then <code>*p = 3</code>,
+allowing a racing thread to read 1 as well.
+</p>
+
+<p>
+Note that all these optimizations are permitted in C/C++ compilers:
+a Go compiler sharing a back end with a C/C++ compiler must take care
+to disable optimizations that are invalid for Go.
+</p>
+
+<p>
+Note that the prohibition on introducing data races
+does not apply if the compiler can prove that the races
+do not affect correct execution on the target platform.
+For example, on essentially all CPUs, it is valid to rewrite
+</p>
+
+<pre>
+n := 0
+for i := 0; i < m; i++ {
+	n += *shared
+}
+</pre>
+
+into:
+
+<pre>
+n := 0
+local := *shared
+for i := 0; i < m; i++ {
+	n += local
+}
+</pre>
+
+<p>
+provided it can be proved that <code>*shared</code> will not fault on access,
+because the potential added read will not affect any existing concurrent reads or writes.
+On the other hand, the rewrite would not be valid in a source-to-source translator.
+</p>
+
+<h2 id="conclusion">Conclusion</h2>
+
+<p>
+Go programmers writing data-race-free programs can rely on
+sequentially consistent execution of those programs,
+just as in essentially all other modern programming languages.
+</p>
+
+<p>
+When it comes to programs with races,
+both programmers and compilers should remember the advice:
+don't be clever.
+</p>
diff --git a/doc/go_spec.html b/doc/go_spec.html
index ad12fcf..29109b6 100644
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,6 +1,6 @@
 <!--{
 	"Title": "The Go Programming Language Specification",
-	"Subtitle": "Version of March 10, 2022",
+	"Subtitle": "Version of June 29, 2022",
 	"Path": "/ref/spec"
 }-->
 
@@ -22,20 +22,23 @@
 </p>
 
 <p>
-The grammar is compact and simple to parse, allowing for easy analysis
+The syntax is compact and simple to parse, allowing for easy analysis
 by automatic tools such as integrated development environments.
 </p>
 
 <h2 id="Notation">Notation</h2>
 <p>
-The syntax is specified using Extended Backus-Naur Form (EBNF):
+The syntax is specified using a
+<a href="https://en.wikipedia.org/wiki/Wirth_syntax_notation">variant</a>
+of Extended Backus-Naur Form (EBNF):
 </p>
 
 <pre class="grammar">
+Syntax      = { Production } .
 Production  = production_name "=" [ Expression ] "." .
-Expression  = Alternative { "|" Alternative } .
-Alternative = Term { Term } .
-Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
+Expression  = Term { "|" Term } .
+Term        = Factor { Factor } .
+Factor      = production_name | token [ "…" token ] | Group | Option | Repetition .
 Group       = "(" Expression ")" .
 Option      = "[" Expression "]" .
 Repetition  = "{" Expression "}" .
@@ -53,7 +56,7 @@
 </pre>
 
 <p>
-Lower-case production names are used to identify lexical tokens.
+Lowercase production names are used to identify lexical (terminal) tokens.
 Non-terminals are in CamelCase. Lexical tokens are enclosed in
 double quotes <code>""</code> or back quotes <code>``</code>.
 </p>
@@ -79,7 +82,7 @@
 in the source text.
 </p>
 <p>
-Each code point is distinct; for instance, upper and lower case letters
+Each code point is distinct; for instance, uppercase and lowercase letters
 are different characters.
 </p>
 <p>
@@ -96,13 +99,13 @@
 <h3 id="Characters">Characters</h3>
 
 <p>
-The following terms are used to denote specific Unicode character classes:
+The following terms are used to denote specific Unicode character categories:
 </p>
 <pre class="ebnf">
 newline        = /* the Unicode code point U+000A */ .
 unicode_char   = /* an arbitrary Unicode code point except newline */ .
-unicode_letter = /* a Unicode code point classified as "Letter" */ .
-unicode_digit  = /* a Unicode code point classified as "Number, decimal digit" */ .
+unicode_letter = /* a Unicode code point categorized as "Letter" */ .
+unicode_digit  = /* a Unicode code point categorized as "Number, decimal digit" */ .
 </pre>
 
 <p>
@@ -115,7 +118,7 @@
 <h3 id="Letters_and_digits">Letters and digits</h3>
 
 <p>
-The underscore character <code>_</code> (U+005F) is considered a letter.
+The underscore character <code>_</code> (U+005F) is considered a lowercase letter.
 </p>
 <pre class="ebnf">
 letter        = unicode_letter | "_" .
@@ -170,7 +173,7 @@
 <h3 id="Semicolons">Semicolons</h3>
 
 <p>
-The formal grammar uses semicolons <code>";"</code> as terminators in
+The formal syntax uses semicolons <code>";"</code> as terminators in
 a number of productions. Go programs may omit most of these semicolons
 using the following two rules:
 </p>
@@ -260,7 +263,7 @@
 
 <p>
 The following character sequences represent <a href="#Operators">operators</a>
-(including <a href="#Assignments">assignment operators</a>) and punctuation:
+(including <a href="#Assignment_statements">assignment operators</a>) and punctuation:
 </p>
 <pre class="grammar">
 +    &amp;     +=    &amp;=     &amp;&amp;    ==    !=    (    )
@@ -406,7 +409,7 @@
 <a href="#Constants">complex constant</a>.
 It consists of an <a href="#Integer_literals">integer</a> or
 <a href="#Floating-point_literals">floating-point</a> literal
-followed by the lower-case letter <code>i</code>.
+followed by the lowercase letter <code>i</code>.
 The value of an imaginary literal is the value of the respective
 integer or floating-point literal multiplied by the imaginary unit <i>i</i>.
 </p>
@@ -499,8 +502,9 @@
 </pre>
 
 <p>
-All other sequences starting with a backslash are illegal inside rune literals.
+An unrecognized character following a backslash in a rune literal is illegal.
 </p>
+
 <pre class="ebnf">
 rune_lit         = "'" ( unicode_value | byte_value ) "'" .
 unicode_value    = unicode_char | little_u_value | big_u_value | escaped_char .
@@ -527,8 +531,10 @@
 '\U00101234'
 '\''         // rune literal containing single quote character
 'aa'         // illegal: too many characters
+'\k'         // illegal: k is not recognized after a backslash
 '\xa'        // illegal: too few hexadecimal digits
 '\0'         // illegal: too few octal digits
+'\400'       // illegal: octal value over 255
 '\uDFFF'     // illegal: surrogate half
 '\U00110000' // illegal: invalid Unicode code point
 </pre>
@@ -670,7 +676,7 @@
 A constant may be given a type explicitly by a <a href="#Constant_declarations">constant declaration</a>
 or <a href="#Conversions">conversion</a>, or implicitly when used in a
 <a href="#Variable_declarations">variable declaration</a> or an
-<a href="#Assignments">assignment</a> or as an
+<a href="#Assignment_statements">assignment statement</a> or as an
 operand in an <a href="#Expressions">expression</a>.
 It is an error if the constant value
 cannot be <a href="#Representability">represented</a> as a value of the respective type.
@@ -774,7 +780,7 @@
 <p>
 A variable's value is retrieved by referring to the variable in an
 <a href="#Expressions">expression</a>; it is the most recent value
-<a href="#Assignments">assigned</a> to the variable.
+<a href="#Assignment_statements">assigned</a> to the variable.
 If a variable has not yet been assigned a value, its value is the
 <a href="#The_zero_value">zero value</a> for its type.
 </p>
@@ -796,7 +802,7 @@
 TypeArgs  = "[" TypeList [ "," ] "]" .
 TypeList  = Type { "," Type } .
 TypeLit   = ArrayType | StructType | PointerType | FunctionType | InterfaceType |
-	    SliceType | MapType | ChannelType .
+            SliceType | MapType | ChannelType .
 </pre>
 
 <p>
@@ -1021,7 +1027,7 @@
 <pre class="ebnf">
 StructType    = "struct" "{" { FieldDecl ";" } "}" .
 FieldDecl     = (IdentifierList Type | EmbeddedField) [ Tag ] .
-EmbeddedField = [ "*" ] TypeName .
+EmbeddedField = [ "*" ] TypeName [ TypeArgs ] .
 Tag           = string_lit .
 </pre>
 
@@ -1085,7 +1091,7 @@
 </p>
 
 <p>
-Given a struct type <code>S</code> and a <a href="#Type_definitions">defined type</a>
+Given a struct type <code>S</code> and a <a href="#Types">named type</a>
 <code>T</code>, promoted methods are included in the method set of the struct as follows:
 </p>
 <ul>
@@ -1277,7 +1283,8 @@
 <p>
 Every type that is a member of the type set of an interface implements that interface.
 Any given type may implement several distinct interfaces.
-For instance, all types implement the <i>empty interface</i> which stands for the set of all types:
+For instance, all types implement the <i>empty interface</i> which stands for the set
+of all (non-interface) types:
 </p>
 
 <pre>
@@ -1379,7 +1386,7 @@
 		of its interface elements.
 	</li>
 
-	<li>The type set of a method specification is the set of types
+	<li>The type set of a method specification is the set of all non-interface types
 		whose method sets include that method.
 	</li>
 
@@ -1388,7 +1395,7 @@
 	</li>
 
 	<li>The type set of a term of the form <code>~T</code>
-		is the set of types whose underlying type is <code>T</code>.
+		is the set of all types whose underlying type is <code>T</code>.
 	</li>
 
 	<li>The type set of a <i>union</i> of terms
@@ -1398,6 +1405,15 @@
 </ul>
 
 <p>
+The quantification "the set of all non-interface types" refers not just to all (non-interface)
+types declared in the program at hand, but all possible types in all possible programs, and
+hence is infinite.
+Similarly, given the set of all non-interface types that implement a particular method, the
+intersection of the method sets of those types will contain exactly that method, even if all
+types in the program at hand always pair that method with another method.
+</p>
+
+<p>
 By construction, an interface's type set never contains an interface type.
 </p>
 
@@ -1454,7 +1470,8 @@
 </pre>
 
 <p>
-In a union, a term cannot be a <a href="#Type_parameter_declarations">type parameter</a>, and the type sets of all
+The type <code>T</code> in a term of the form <code>T</code> or <code>~T</code> cannot
+be a <a href="#Type_parameter_declarations">type parameter</a>, and the type sets of all
 non-interface terms must be pairwise disjoint (the pairwise intersection of the type sets must be empty).
 Given a type parameter <code>P</code>:
 </p>
@@ -1462,7 +1479,7 @@
 <pre>
 interface {
 	P                // illegal: P is a type parameter
-	int | P          // illegal: P is a type parameter
+	int | ~P         // illegal: P is a type parameter
 	~int | MyInt     // illegal: the type sets for ~int and MyInt are not disjoint (~int includes MyInt)
 	float32 | Float  // overlapping type sets but Float is an interface
 }
@@ -1574,7 +1591,7 @@
 For a map <code>m</code>, it can be discovered using the
 built-in function <a href="#Length_and_capacity"><code>len</code></a>
 and may change during execution. Elements may be added during execution
-using <a href="#Assignments">assignments</a> and retrieved with
+using <a href="#Assignment_statements">assignments</a> and retrieved with
 <a href="#Index_expressions">index expressions</a>; they may be removed with the
 <a href="#Deletion_of_map_elements"><code>delete</code></a> built-in function.
 </p>
@@ -1617,7 +1634,7 @@
 <i>send</i> or <i>receive</i>. If a direction is given, the channel is <i>directional</i>,
 otherwise it is <i>bidirectional</i>.
 A channel may be constrained only to send or only to receive by
-<a href="#Assignments">assignment</a> or
+<a href="#Assignment_statements">assignment</a> or
 explicit <a href="#Conversions">conversion</a>.
 </p>
 
@@ -1794,6 +1811,31 @@
 interface{ &lt;-chan int | chan&lt;- int }      // directional channels have different directions
 </pre>
 
+<p>
+Some operations (<a href="#Slice_expressions">slice expressions</a>,
+<a href="#Appending_and_copying_slices"><code>append</code> and <code>copy</code></a>)
+rely on a slightly more loose form of core types which accept byte slices and strings.
+Specifically, if there are exactly two types, <code>[]byte</code> and <code>string</code>,
+which are the underlying types of all types in the type set of interface <code>T</code>,
+the core type of <code>T</code> is called <code>bytestring</code>.
+</p>
+
+<p>
+Examples of interfaces with <code>bytestring</code> core types:
+</p>
+
+<pre>
+interface{ int }                          // int (same as ordinary core type)
+interface{ []byte | string }              // bytestring
+interface{ ~[]byte | myString }           // bytestring
+</pre>
+
+<p>
+Note that <code>bytestring</code> is not a real type; it cannot be used to declare
+variables are compose other types. It exists solely to describe the behavior of some
+operations that read from a sequence of bytes, which may be a byte slice or a string.
+</p>
+
 <h3 id="Type_identity">Type identity</h3>
 
 <p>
@@ -1878,7 +1920,7 @@
 B0 and C0
 D0[int, string] and E0
 []int and []int
-struct{ a, b *T5 } and struct{ a, b *T5 }
+struct{ a, b *B5 } and struct{ a, b *B5 }
 func(x int, y float64) *[]string, func(int, float64) (result *[]string), and A5
 </pre>
 
@@ -1908,7 +1950,8 @@
 </li>
 <li>
 <code>V</code> and <code>T</code> have identical
-<a href="#Underlying_types">underlying types</a> and at least one of <code>V</code>
+<a href="#Underlying_types">underlying types</a>
+but are not type parameters and at least one of <code>V</code>
 or <code>T</code> is not a <a href="#Types">named type</a>.
 </li>
 <li>
@@ -2146,9 +2189,8 @@
 	    or result variable is the function body.</li>
 
 	<li>The scope of an identifier denoting a type parameter of a function
-	    or declared by a method receiver is the function body and all parameter lists of the
-	    function.
-	</li>
+	    or declared by a method receiver begins after the name of the function
+	    and ends at the end of the function body.</li>
 
 	<li>The scope of an identifier denoting a type parameter of a type
 	    begins after the name of the type and ends at the end
@@ -2199,7 +2241,7 @@
 The <i>blank identifier</i> is represented by the underscore character <code>_</code>.
 It serves as an anonymous placeholder instead of a regular (non-blank)
 identifier and has special meaning in <a href="#Declarations_and_scope">declarations</a>,
-as an <a href="#Operands">operand</a>, and in <a href="#Assignments">assignments</a>.
+as an <a href="#Operands">operand</a>, and in <a href="#Assignment_statements">assignment statements</a>.
 </p>
 
 
@@ -2234,8 +2276,8 @@
 An identifier is exported if both:
 </p>
 <ol>
-	<li>the first character of the identifier's name is a Unicode upper case
-	letter (Unicode class "Lu"); and</li>
+	<li>the first character of the identifier's name is a Unicode uppercase
+	letter (Unicode character category Lu); and</li>
 	<li>the identifier is declared in the <a href="#Blocks">package block</a>
 	or it is a <a href="#Struct_types">field name</a> or
 	<a href="#MethodName">method name</a>.</li>
@@ -2706,7 +2748,7 @@
 
 <p>
 If a list of expressions is given, the variables are initialized
-with the expressions following the rules for <a href="#Assignments">assignments</a>.
+with the expressions following the rules for <a href="#Assignment_statements">assignment statements</a>.
 Otherwise, each variable is initialized to its <a href="#The_zero_value">zero value</a>.
 </p>
 
@@ -2750,7 +2792,7 @@
 </p>
 
 <pre class="grammar">
-"var" IdentifierList = ExpressionList .
+"var" IdentifierList "=" ExpressionList .
 </pre>
 
 <pre>
@@ -2768,12 +2810,14 @@
 and at least one of the non-<a href="#Blank_identifier">blank</a> variables is new.
 As a consequence, redeclaration can only appear in a multi-variable short declaration.
 Redeclaration does not introduce a new variable; it just assigns a new value to the original.
+The non-blank variable names on the left side of <code>:=</code>
+must be <a href="#Uniqueness_of_identifiers">unique</a>.
 </p>
 
 <pre>
 field1, offset := nextField(str, 0)
 field2, offset := nextField(str, offset)  // redeclares offset
-a, a := 1, 2                              // illegal: double declaration of a or no new variable if a was declared elsewhere
+x, y, x := 1, 2, 3                        // illegal: x repeated on left side of :=
 </pre>
 
 <p>
@@ -2967,7 +3011,7 @@
 
 <p>
 The <a href="#Blank_identifier">blank identifier</a> may appear as an
-operand only on the left-hand side of an <a href="#Assignments">assignment</a>.
+operand only on the left-hand side of an <a href="#Assignment_statements">assignment statement</a>.
 </p>
 
 <p>
@@ -2998,7 +3042,7 @@
 </p>
 
 <pre>
-math.Sin	// denotes the Sin function in package math
+math.Sin // denotes the Sin function in package math
 </pre>
 
 <h3 id="Composite_literals">Composite literals</h3>
@@ -3012,7 +3056,7 @@
 <pre class="ebnf">
 CompositeLit  = LiteralType LiteralValue .
 LiteralType   = StructType | ArrayType | "[" "..." "]" ElementType |
-                SliceType | MapType | TypeName .
+                SliceType | MapType | TypeName [ TypeArgs ] .
 LiteralValue  = "{" [ ElementList [ "," ] ] "}" .
 ElementList   = KeyedElement { "," KeyedElement } .
 KeyedElement  = [ Key ":" ] Element .
@@ -3024,7 +3068,7 @@
 <p>
 The LiteralType's <a href="#Core_types">core type</a> <code>T</code>
 must be a struct, array, slice, or map type
-(the grammar enforces this constraint except when the type is given
+(the syntax enforces this constraint except when the type is given
 as a TypeName).
 The types of the elements and keys must be <a href="#Assignability">assignable</a>
 to the respective field, element, and key types of type <code>T</code>;
@@ -3777,7 +3821,7 @@
 
 <p>
 An index expression on a map <code>a</code> of type <code>map[K]V</code>
-used in an <a href="#Assignments">assignment</a> or initialization of the special form
+used in an <a href="#Assignment_statements">assignment statement</a> or initialization of the special form
 </p>
 
 <pre>
@@ -3818,7 +3862,8 @@
 
 <p>
 constructs a substring or slice. The <a href="#Core_types">core type</a> of
-<code>a</code> must be a string, array, pointer to array, or slice.
+<code>a</code> must be a string, array, pointer to array, slice, or a
+<a href="#Core_types"><code>bytestring</code></a>.
 The <i>indices</i> <code>low</code> and
 <code>high</code> select which elements of operand <code>a</code> appear
 in the result. The result has indices starting at 0 and length equal to
@@ -3992,7 +4037,7 @@
 </pre>
 
 <p>
-A type assertion used in an <a href="#Assignments">assignment</a> or initialization of the special form
+A type assertion used in an <a href="#Assignment_statements">assignment statement</a> or initialization of the special form
 </p>
 
 <pre>
@@ -4195,7 +4240,7 @@
 <p>
 For a generic function, type arguments may be provided explicitly, or they
 may be partially or completely <a href="#Type_inference">inferred</a>.
-A generic function that is is <i>not</i> <a href="#Calls">called</a> requires a
+A generic function that is <i>not</i> <a href="#Calls">called</a> requires a
 type argument list for instantiation; if the list is partial, all
 remaining type arguments must be inferrable.
 A generic function that is called may provide a (possibly partial) type
@@ -4824,7 +4869,7 @@
 </p>
 
 <pre>
-			 x, q
+                         x, q
 int8                     -128
 int16                  -32768
 int32             -2147483648
@@ -5149,7 +5194,7 @@
 </pre>
 
 <p>
-A receive expression used in an <a href="#Assignments">assignment</a> or initialization of the special form
+A receive expression used in an <a href="#Assignment_statements">assignment statement</a> or initialization of the special form
 </p>
 
 <pre>
@@ -5228,7 +5273,7 @@
 float64(-1e-1000)        // 0.0 of type float64
 string('x')              // "x" of type string
 string(0x266c)           // "♬" of type string
-MyString("foo" + "bar")  // "foobar" of type MyString
+myString("foo" + "bar")  // "foobar" of type myString
 string([]byte{'a'})      // not a constant: []byte{'a'} is not a constant
 (*int)(nil)              // not a constant: nil is not a constant, *int is not a boolean, numeric, or string type
 int(1.2)                 // illegal: 1.2 cannot be represented as an int
@@ -5411,8 +5456,9 @@
 string('a')       // "a"
 string(-1)        // "\ufffd" == "\xef\xbf\xbd"
 string(0xf8)      // "\u00f8" == "ø" == "\xc3\xb8"
-type MyString string
-MyString(0x65e5)  // "\u65e5" == "日" == "\xe6\x97\xa5"
+
+type myString string
+myString(0x65e5)  // "\u65e5" == "日" == "\xe6\x97\xa5"
 </pre>
 </li>
 
@@ -5425,8 +5471,12 @@
 string([]byte{})                                     // ""
 string([]byte(nil))                                  // ""
 
-type MyBytes []byte
-string(MyBytes{'h', 'e', 'l', 'l', '\xc3', '\xb8'})  // "hellø"
+type bytes []byte
+string(bytes{'h', 'e', 'l', 'l', '\xc3', '\xb8'})    // "hellø"
+
+type myByte byte
+string([]myByte{'w', 'o', 'r', 'l', 'd', '!'})       // "world!"
+myString([]myByte{'\xf0', '\x9f', '\x8c', '\x8d'})   // "🌍"
 </pre>
 </li>
 
@@ -5440,8 +5490,12 @@
 string([]rune{})                         // ""
 string([]rune(nil))                      // ""
 
-type MyRunes []rune
-string(MyRunes{0x767d, 0x9d6c, 0x7fd4})  // "\u767d\u9d6c\u7fd4" == "白鵬翔"
+type runes []rune
+string(runes{0x767d, 0x9d6c, 0x7fd4})    // "\u767d\u9d6c\u7fd4" == "白鵬翔"
+
+type myRune rune
+string([]myRune{0x266b, 0x266c})         // "\u266b\u266c" == "♫♬"
+myString([]myRune{0x1f30e})              // "\U0001f30e" == "🌎"
 </pre>
 </li>
 
@@ -5450,10 +5504,13 @@
 yields a slice whose successive elements are the bytes of the string.
 
 <pre>
-[]byte("hellø")   // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
-[]byte("")        // []byte{}
+[]byte("hellø")             // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
+[]byte("")                  // []byte{}
 
-MyBytes("hellø")  // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
+bytes("hellø")              // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
+
+[]myByte("world!")          // []myByte{'w', 'o', 'r', 'l', 'd', '!'}
+[]myByte(myString("🌏"))    // []myByte{'\xf0', '\x9f', '\x8c', '\x8f'}
 </pre>
 </li>
 
@@ -5462,10 +5519,13 @@
 yields a slice containing the individual Unicode code points of the string.
 
 <pre>
-[]rune(MyString("白鵬翔"))  // []rune{0x767d, 0x9d6c, 0x7fd4}
-[]rune("")                 // []rune{}
+[]rune(myString("白鵬翔"))   // []rune{0x767d, 0x9d6c, 0x7fd4}
+[]rune("")                  // []rune{}
 
-MyRunes("白鵬翔")           // []rune{0x767d, 0x9d6c, 0x7fd4}
+runes("白鵬翔")              // []rune{0x767d, 0x9d6c, 0x7fd4}
+
+[]myRune("♫♬")              // []myRune{0x266b, 0x266c}
+[]myRune(myString("🌐"))    // []myRune{0x1f310}
 </pre>
 </li>
 </ol>
@@ -5882,7 +5942,7 @@
 </pre>
 
 <p>
-The following <a href="#Assignments">assignment statements</a> are semantically
+The following <a href="#Assignment_statements">assignment statements</a> are semantically
 equivalent:
 </p>
 
@@ -5893,7 +5953,14 @@
 </pre>
 
 
-<h3 id="Assignments">Assignments</h3>
+<h3 id="Assignment_statements">Assignment statements</h3>
+
+<p>
+An <i>assignment</i> replaces the current value stored in a <a href="#Variables">variable</a>
+with a new value specified by an <a href="#Expressions">expression</a>.
+An assignment statement may assign a single value to a single variable, or multiple values to a
+matching number of variables.
+</p>
 
 <pre class="ebnf">
 Assignment = ExpressionList assign_op ExpressionList .
@@ -6462,7 +6529,7 @@
 
 <p>
 The iteration values are assigned to the respective
-iteration variables as in an <a href="#Assignments">assignment statement</a>.
+iteration variables as in an <a href="#Assignment_statements">assignment statement</a>.
 </p>
 
 <p>
@@ -6797,7 +6864,8 @@
 
 <p>
 A "continue" statement begins the next iteration of the
-innermost <a href="#For_statements">"for" loop</a> at its post statement.
+innermost enclosing <a href="#For_statements">"for" loop</a>
+by advancing control to the end of the loop block.
 The "for" loop must be within the same function.
 </p>
 
@@ -7123,7 +7191,7 @@
 by a value of type <code>int</code>; if it is an untyped constant it is given type <code>int</code>.
 If both <code>n</code> and <code>m</code> are provided and are constant, then
 <code>n</code> must be no larger than <code>m</code>.
-If <code>n</code> is negative or larger than <code>m</code> at run time,
+For slices and channels, if <code>n</code> is negative or larger than <code>m</code> at run time,
 a <a href="#Run_time_panics">run-time panic</a> occurs.
 </p>
 
@@ -7162,8 +7230,9 @@
 and the respective <a href="#Passing_arguments_to_..._parameters">parameter
 passing rules</a> apply.
 As a special case, if the core type of <code>s</code> is <code>[]byte</code>,
-<code>append</code> also accepts a second argument with core type <code>string</code>
-followed by <code>...</code>. This form appends the bytes of the string.
+<code>append</code> also accepts a second argument with core type
+<a href="#Core_types"><code>bytestring</code></a> followed by <code>...</code>.
+This form appends the bytes of the byte slice or string.
 </p>
 
 <pre class="grammar">
@@ -7200,8 +7269,9 @@
 The number of elements copied is the minimum of
 <code>len(src)</code> and <code>len(dst)</code>.
 As a special case, if the destination's core type is <code>[]byte</code>,
-<code>copy</code> also accepts a source argument with core type <code>string</code>.
-This form copies the bytes from the string into the byte slice.
+<code>copy</code> also accepts a source argument with core type
+</a> <a href="#Core_types"><code>bytestring</code></a>.
+This form copies the bytes from the byte slice or string into the byte slice.
 </p>
 
 <pre class="grammar">
@@ -7515,7 +7585,7 @@
 </p>
 
 <p>
-Assume we have compiled a package containing the package clause
+Consider a compiled a package containing the package clause
 <code>package math</code>, which exports function <code>Sin</code>, and
 installed the compiled package in the file identified by
 <code>"lib/math"</code>.
diff --git a/lib/time/update.bash b/lib/time/update.bash
index feb95e2..54b924a 100755
--- a/lib/time/update.bash
+++ b/lib/time/update.bash
@@ -8,8 +8,8 @@
 # Consult https://www.iana.org/time-zones for the latest versions.
 
 # Versions to use.
-CODE=2021e
-DATA=2021e
+CODE=2022a
+DATA=2022a
 
 set -e
 rm -rf work
diff --git a/lib/time/zoneinfo.zip b/lib/time/zoneinfo.zip
index a859b41..767e45b 100644
--- a/lib/time/zoneinfo.zip
+++ b/lib/time/zoneinfo.zip
Binary files differ
diff --git a/misc/cgo/errors/errors_test.go b/misc/cgo/errors/errors_test.go
index e90ed1e..9718b7f 100644
--- a/misc/cgo/errors/errors_test.go
+++ b/misc/cgo/errors/errors_test.go
@@ -112,6 +112,7 @@
 		"issue18889.go",
 		"issue28721.go",
 		"issue33061.go",
+		"issue50710.go",
 	} {
 		check(t, file)
 	}
diff --git a/misc/cgo/errors/testdata/issue50710.go b/misc/cgo/errors/testdata/issue50710.go
new file mode 100644
index 0000000..dffea22
--- /dev/null
+++ b/misc/cgo/errors/testdata/issue50710.go
@@ -0,0 +1,14 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// size_t StrLen(_GoString_ s) {
+// 	return _GoStringLen(s);
+// }
+import "C"
+
+func main() {
+	C.StrLen1() // ERROR HERE
+}
diff --git a/misc/cgo/gmp/gmp.go b/misc/cgo/gmp/gmp.go
index 971a10a..0835fdc 100644
--- a/misc/cgo/gmp/gmp.go
+++ b/misc/cgo/gmp/gmp.go
@@ -333,10 +333,9 @@
 
 // CmpInt compares x and y. The result is
 //
-//   -1 if x <  y
-//    0 if x == y
-//   +1 if x >  y
-//
+//	-1 if x <  y
+//	 0 if x == y
+//	+1 if x >  y
 func CmpInt(x, y *Int) int {
 	x.doinit()
 	y.doinit()
diff --git a/misc/cgo/test/callback_c.c b/misc/cgo/test/callback_c.c
index 8921b73..8ecf70f 100644
--- a/misc/cgo/test/callback_c.c
+++ b/misc/cgo/test/callback_c.c
@@ -3,8 +3,7 @@
 // license that can be found in the LICENSE file.
 
 #include <string.h>
-#include <sys/types.h>
-#include <unistd.h>
+
 #include "_cgo_export.h"
 
 void
@@ -31,32 +30,10 @@
 	BackIntoGo();
 }
 
-#ifdef WIN32
-#include <windows.h>
-long long
-mysleep(int seconds) {
-	long long st = GetTickCount();
-	Sleep(1000 * seconds);
-	return st;
-}
-#else
-#include <sys/time.h>
-long long
-mysleep(int seconds) {
-	long long st;
-	struct timeval tv;
-	gettimeofday(&tv, NULL);
-	st = tv.tv_sec * 1000 + tv.tv_usec / 1000;
-	sleep(seconds);
-	return st;
-}
-#endif
-
-long long
-twoSleep(int n)
+void
+Issue1560InC(void)
 {
-	BackgroundSleep(n);
-	return mysleep(n);
+	Issue1560FromC();
 }
 
 void
diff --git a/misc/cgo/test/cgo_linux_test.go b/misc/cgo/test/cgo_linux_test.go
index a9746b5..7c4628c 100644
--- a/misc/cgo/test/cgo_linux_test.go
+++ b/misc/cgo/test/cgo_linux_test.go
@@ -15,6 +15,14 @@
 	}
 	testSetgid(t)
 }
+
+func TestSetgidStress(t *testing.T) {
+	if runtime.GOOS == "android" {
+		t.Skip("unsupported on Android")
+	}
+	testSetgidStress(t)
+}
+
 func Test1435(t *testing.T)    { test1435(t) }
 func Test6997(t *testing.T)    { test6997(t) }
 func TestBuildID(t *testing.T) { testBuildID(t) }
diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go
index 774277e..dee6164 100644
--- a/misc/cgo/test/cgo_test.go
+++ b/misc/cgo/test/cgo_test.go
@@ -11,6 +11,7 @@
 // These wrappers are here for gotest to find.
 
 func Test1328(t *testing.T)                  { test1328(t) }
+func Test1560(t *testing.T)                  { test1560(t) }
 func Test1635(t *testing.T)                  { test1635(t) }
 func Test3250(t *testing.T)                  { test3250(t) }
 func Test3729(t *testing.T)                  { test3729(t) }
@@ -89,7 +90,6 @@
 func TestMultipleAssign(t *testing.T)        { testMultipleAssign(t) }
 func TestNaming(t *testing.T)                { testNaming(t) }
 func TestPanicFromC(t *testing.T)            { testPanicFromC(t) }
-func TestParallelSleep(t *testing.T)         { testParallelSleep(t) }
 func TestPrintf(t *testing.T)                { testPrintf(t) }
 func TestReturnAfterGrow(t *testing.T)       { testReturnAfterGrow(t) }
 func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) }
diff --git a/misc/cgo/test/setgid2_linux.go b/misc/cgo/test/setgid2_linux.go
new file mode 100644
index 0000000..438f5ae
--- /dev/null
+++ b/misc/cgo/test/setgid2_linux.go
@@ -0,0 +1,35 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Stress test setgid and thread creation. A thread
+// can get a SIGSETXID signal early on at thread
+// initialization, causing crash. See issue 53374.
+
+package cgotest
+
+/*
+#include <sys/types.h>
+#include <unistd.h>
+*/
+import "C"
+
+import (
+	"runtime"
+	"testing"
+)
+
+func testSetgidStress(t *testing.T) {
+	const N = 50
+	ch := make(chan int, N)
+	for i := 0; i < N; i++ {
+		go func() {
+			C.setgid(0)
+			ch <- 1
+			runtime.LockOSThread() // so every goroutine uses a new thread
+		}()
+	}
+	for i := 0; i < N; i++ {
+		<-ch
+	}
+}
diff --git a/misc/cgo/test/testdata/issue52611.go b/misc/cgo/test/testdata/issue52611.go
new file mode 100644
index 0000000..32d2240
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611.go
@@ -0,0 +1,13 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 52611: inconsistent compiler behaviour when compiling a C.struct.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import (
+	_ "cgotest/issue52611a"
+	_ "cgotest/issue52611b"
+)
diff --git a/misc/cgo/test/testdata/issue52611a/a.go b/misc/cgo/test/testdata/issue52611a/a.go
new file mode 100644
index 0000000..0764688
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611a/a.go
@@ -0,0 +1,16 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue52611a
+
+/*
+typedef struct Foo {
+    int X;
+} Foo;
+*/
+import "C"
+
+func GetX1(foo *C.struct_Foo) int32 {
+	return int32(foo.X)
+}
diff --git a/misc/cgo/test/testdata/issue52611a/b.go b/misc/cgo/test/testdata/issue52611a/b.go
new file mode 100644
index 0000000..74a50c5
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611a/b.go
@@ -0,0 +1,11 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue52611a
+
+import "C"
+
+func GetX2(foo *C.struct_Foo) int32 {
+	return int32(foo.X)
+}
diff --git a/misc/cgo/test/testdata/issue52611b/a.go b/misc/cgo/test/testdata/issue52611b/a.go
new file mode 100644
index 0000000..730b52f5
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611b/a.go
@@ -0,0 +1,11 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue52611b
+
+import "C"
+
+func GetX1(bar *C.struct_Bar) int32 {
+	return int32(bar.X)
+}
diff --git a/misc/cgo/test/testdata/issue52611b/b.go b/misc/cgo/test/testdata/issue52611b/b.go
new file mode 100644
index 0000000..d304175
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611b/b.go
@@ -0,0 +1,16 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package issue52611b
+
+/*
+typedef struct Bar {
+    int X;
+} Bar;
+*/
+import "C"
+
+func GetX2(bar *C.struct_Bar) int32 {
+	return int32(bar.X)
+}
diff --git a/misc/cgo/test/testdata/issue9400/asm_loong64.s b/misc/cgo/test/testdata/issue9400/asm_loong64.s
new file mode 100644
index 0000000..c242fc6
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_loong64.s
@@ -0,0 +1,28 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+	// Rewind stack pointer so anything that happens on the stack
+	// will clobber the test pattern created by the caller
+	ADDV	$(1024*8), R3
+
+	// Ask signaller to setgid
+	MOVW	$1, R12
+	DBAR
+	MOVW	R12, ·Baton(SB)
+	DBAR
+
+	// Wait for setgid completion
+loop:
+	DBAR
+	MOVW	·Baton(SB), R12
+	OR	R13, R13, R13	// hint that we're in a spin loop
+	BNE	R12, loop
+	DBAR
+
+	// Restore stack
+	ADDV	$(-1024*8), R3
+	RET
diff --git a/misc/cgo/test/testx.go b/misc/cgo/test/testx.go
index 8ec84a8..6a8e97d 100644
--- a/misc/cgo/test/testx.go
+++ b/misc/cgo/test/testx.go
@@ -18,7 +18,6 @@
 	"sync"
 	"sync/atomic"
 	"testing"
-	"time"
 	"unsafe"
 )
 
@@ -30,8 +29,7 @@
 void IntoC(void);
 
 // issue 1560
-// mysleep returns the absolute start time in ms.
-long long mysleep(int seconds);
+extern void Issue1560InC(void);
 
 // twoSleep returns the absolute start time of the first sleep
 // in ms.
@@ -183,35 +181,40 @@
 }
 
 // issue 1560
+// Test that C functions and Go functions run in parallel.
 
-var sleepDone = make(chan int64)
+var (
+	issue1560 int32
 
-// parallelSleep returns the absolute difference between the start time
-// of the two sleeps.
-func parallelSleep(n int) int64 {
-	t := int64(C.twoSleep(C.int(n))) - <-sleepDone
-	if t < 0 {
-		return -t
+	issue1560Ch = make(chan bool, 2)
+)
+
+//export Issue1560FromC
+func Issue1560FromC() {
+	for atomic.LoadInt32(&issue1560) != 1 {
+		runtime.Gosched()
 	}
-	return t
+	atomic.AddInt32(&issue1560, 1)
+	for atomic.LoadInt32(&issue1560) != 3 {
+		runtime.Gosched()
+	}
+	issue1560Ch <- true
 }
 
-//export BackgroundSleep
-func BackgroundSleep(n int32) {
-	go func() {
-		sleepDone <- int64(C.mysleep(C.int(n)))
-	}()
+func Issue1560FromGo() {
+	atomic.AddInt32(&issue1560, 1)
+	for atomic.LoadInt32(&issue1560) != 2 {
+		runtime.Gosched()
+	}
+	atomic.AddInt32(&issue1560, 1)
+	issue1560Ch <- true
 }
 
-func testParallelSleep(t *testing.T) {
-	sleepSec := 1
-	dt := time.Duration(parallelSleep(sleepSec)) * time.Millisecond
-	t.Logf("difference in start time for two sleep(%d) is %v", sleepSec, dt)
-	// bug used to run sleeps in serial, producing a 2*sleepSec-second delay.
-	// we detect if the start times of those sleeps are > 0.5*sleepSec-second.
-	if dt >= time.Duration(sleepSec)*time.Second/2 {
-		t.Fatalf("parallel %d-second sleeps slept for %f seconds", sleepSec, dt.Seconds())
-	}
+func test1560(t *testing.T) {
+	go Issue1560FromGo()
+	go C.Issue1560InC()
+	<-issue1560Ch
+	<-issue1560Ch
 }
 
 // issue 2462
diff --git a/misc/cgo/testcarchive/carchive_test.go b/misc/cgo/testcarchive/carchive_test.go
index d36b97b..c409c31 100644
--- a/misc/cgo/testcarchive/carchive_test.go
+++ b/misc/cgo/testcarchive/carchive_test.go
@@ -205,6 +205,7 @@
 func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) {
 	t.Helper()
 	cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
+	cmd.Env = append(cmd.Environ(), "GO111MODULE=off") // 'go install' only works in GOPATH mode
 	t.Log(buildcmd)
 	if out, err := cmd.CombinedOutput(); err != nil {
 		t.Logf("%s", out)
@@ -238,7 +239,7 @@
 	binArgs := append(cmdToRun(exe), "arg1", "arg2")
 	cmd = exec.Command(binArgs[0], binArgs[1:]...)
 	if runtime.Compiler == "gccgo" {
-		cmd.Env = append(os.Environ(), "GCCGO=1")
+		cmd.Env = append(cmd.Environ(), "GCCGO=1")
 	}
 	if out, err := cmd.CombinedOutput(); err != nil {
 		t.Logf("%s", out)
@@ -822,9 +823,15 @@
 		t.Skipf("skipping PIE test on %s", GOOS)
 	}
 
+	libgoa := "libgo.a"
+	if runtime.Compiler == "gccgo" {
+		libgoa = "liblibgo.a"
+	}
+
 	if !testWork {
 		defer func() {
 			os.Remove("testp" + exeSuffix)
+			os.Remove(libgoa)
 			os.RemoveAll(filepath.Join(GOPATH, "pkg"))
 		}()
 	}
@@ -837,18 +844,13 @@
 	// be running this test in a GOROOT owned by root.)
 	genHeader(t, "p.h", "./p")
 
-	cmd := exec.Command("go", "install", "-buildmode=c-archive", "./libgo")
+	cmd := exec.Command("go", "build", "-buildmode=c-archive", "./libgo")
 	if out, err := cmd.CombinedOutput(); err != nil {
 		t.Logf("%s", out)
 		t.Fatal(err)
 	}
 
-	libgoa := "libgo.a"
-	if runtime.Compiler == "gccgo" {
-		libgoa = "liblibgo.a"
-	}
-
-	ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", filepath.Join(libgodir, libgoa))
+	ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", libgoa)
 	if runtime.Compiler == "gccgo" {
 		ccArgs = append(ccArgs, "-lgo")
 	}
@@ -1035,6 +1037,7 @@
 	buildcmd := []string{"go", "install", "-buildmode=c-archive", "./libgo"}
 
 	cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
+	cmd.Env = append(cmd.Environ(), "GO111MODULE=off") // 'go install' only works in GOPATH mode
 	t.Log(buildcmd)
 	if out, err := cmd.CombinedOutput(); err != nil {
 		t.Logf("%s", out)
@@ -1050,6 +1053,7 @@
 	}
 
 	cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
+	cmd.Env = append(cmd.Environ(), "GO111MODULE=off")
 	t.Log(buildcmd)
 	if out, err := cmd.CombinedOutput(); err != nil {
 		t.Logf("%s", out)
diff --git a/misc/cgo/testcshared/cshared_test.go b/misc/cgo/testcshared/cshared_test.go
index c9e9e5f..7fbcff2 100644
--- a/misc/cgo/testcshared/cshared_test.go
+++ b/misc/cgo/testcshared/cshared_test.go
@@ -5,6 +5,7 @@
 package cshared_test
 
 import (
+	"bufio"
 	"bytes"
 	"debug/elf"
 	"debug/pe"
@@ -150,16 +151,22 @@
 	// The installation directory format varies depending on the platform.
 	output, err := exec.Command("go", "list",
 		"-buildmode=c-shared",
-		"-installsuffix", "testcshared",
 		"-f", "{{.Target}}",
-		"./libgo").CombinedOutput()
+		"runtime/cgo").CombinedOutput()
 	if err != nil {
 		log.Panicf("go list failed: %v\n%s", err, output)
 	}
-	target := string(bytes.TrimSpace(output))
-	libgoname = filepath.Base(target)
-	installdir = filepath.Dir(target)
-	libSuffix = strings.TrimPrefix(filepath.Ext(target), ".")
+	runtimeCgoTarget := string(bytes.TrimSpace(output))
+	libSuffix = strings.TrimPrefix(filepath.Ext(runtimeCgoTarget), ".")
+
+	defer func() {
+		if installdir != "" {
+			err := os.RemoveAll(installdir)
+			if err != nil {
+				log.Panic(err)
+			}
+		}
+	}()
 
 	return m.Run()
 }
@@ -283,8 +290,13 @@
 	}
 
 	// Generate a C header file for libgo itself.
-	args = []string{"go", "install", "-buildmode=c-shared",
-		"-installsuffix", "testcshared", "./libgo"}
+	installdir, err = os.MkdirTemp("", "testcshared")
+	if err != nil {
+		return err
+	}
+	libgoname = "libgo." + libSuffix
+
+	args = []string{"go", "build", "-buildmode=c-shared", "-o", filepath.Join(installdir, libgoname), "./libgo"}
 	cmd = exec.Command(args[0], args[1:]...)
 	out, err = cmd.CombinedOutput()
 	if err != nil {
@@ -372,6 +384,7 @@
 		headersErr = createHeaders()
 	})
 	if headersErr != nil {
+		t.Helper()
 		t.Fatal(headersErr)
 	}
 }
@@ -704,12 +717,15 @@
 	copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "libgo", "libgo.go"), filepath.Join("libgo", "libgo.go"))
 	copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "p", "p.go"), filepath.Join("p", "p.go"))
 
-	env := append(os.Environ(), "GOPATH="+tmpdir, "GOBIN="+filepath.Join(tmpdir, "bin"))
-
 	buildcmd := []string{"go", "install", "-x", "-buildmode=c-shared", "-installsuffix", "testcshared", "./libgo"}
 
 	cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
 	cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
+	env := append(cmd.Environ(),
+		"GOPATH="+tmpdir,
+		"GOBIN="+filepath.Join(tmpdir, "bin"),
+		"GO111MODULE=off", // 'go install' only works in GOPATH mode
+	)
 	cmd.Env = env
 	t.Log(buildcmd)
 	out, err := cmd.CombinedOutput()
@@ -838,3 +854,51 @@
 	run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m2")
 	runExe(t, runenv, bin)
 }
+
+func TestIssue36233(t *testing.T) {
+	t.Parallel()
+
+	// Test that the export header uses GoComplex64 and GoComplex128
+	// for complex types.
+
+	tmpdir, err := os.MkdirTemp("", "cshared-TestIssue36233")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer os.RemoveAll(tmpdir)
+
+	const exportHeader = "issue36233.h"
+
+	run(t, nil, "go", "tool", "cgo", "-exportheader", exportHeader, "-objdir", tmpdir, "./issue36233/issue36233.go")
+	data, err := os.ReadFile(exportHeader)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	funcs := []struct{ name, signature string }{
+		{"exportComplex64", "GoComplex64 exportComplex64(GoComplex64 v)"},
+		{"exportComplex128", "GoComplex128 exportComplex128(GoComplex128 v)"},
+		{"exportComplexfloat", "GoComplex64 exportComplexfloat(GoComplex64 v)"},
+		{"exportComplexdouble", "GoComplex128 exportComplexdouble(GoComplex128 v)"},
+	}
+
+	scanner := bufio.NewScanner(bytes.NewReader(data))
+	var found int
+	for scanner.Scan() {
+		b := scanner.Bytes()
+		for _, fn := range funcs {
+			if bytes.Contains(b, []byte(fn.name)) {
+				found++
+				if !bytes.Contains(b, []byte(fn.signature)) {
+					t.Errorf("function signature mismatch; got %q, want %q", b, fn.signature)
+				}
+			}
+		}
+	}
+	if err = scanner.Err(); err != nil {
+		t.Errorf("scanner encountered error: %v", err)
+	}
+	if found != len(funcs) {
+		t.Error("missing functions")
+	}
+}
diff --git a/misc/cgo/testcshared/testdata/issue36233/issue36233.go b/misc/cgo/testcshared/testdata/issue36233/issue36233.go
new file mode 100644
index 0000000..d0d1e5d
--- /dev/null
+++ b/misc/cgo/testcshared/testdata/issue36233/issue36233.go
@@ -0,0 +1,29 @@
+// Copyright 2022 The Go Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style

+// license that can be found in the LICENSE file.

+package main

+

+// #include <complex.h>

+import "C"

+

+//export exportComplex64

+func exportComplex64(v complex64) complex64 {

+	return v

+}

+

+//export exportComplex128

+func exportComplex128(v complex128) complex128 {

+	return v

+}

+

+//export exportComplexfloat

+func exportComplexfloat(v C.complexfloat) C.complexfloat {

+	return v

+}

+

+//export exportComplexdouble

+func exportComplexdouble(v C.complexdouble) C.complexdouble {

+	return v

+}

+

+func main() {}

diff --git a/misc/cgo/testgodefs/testgodefs_test.go b/misc/cgo/testgodefs/testgodefs_test.go
index 7628ffc..d03769e 100644
--- a/misc/cgo/testgodefs/testgodefs_test.go
+++ b/misc/cgo/testgodefs/testgodefs_test.go
@@ -9,6 +9,7 @@
 	"os"
 	"os/exec"
 	"path/filepath"
+	"runtime"
 	"strings"
 	"testing"
 )
@@ -58,9 +59,32 @@
 			t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
 		}
 
-		if err := os.WriteFile(filepath.Join(dir, fp+"_defs.go"), out, 0644); err != nil {
+		fn := fp + "_defs.go"
+		if err := os.WriteFile(filepath.Join(dir, fn), out, 0644); err != nil {
 			t.Fatal(err)
 		}
+
+		// Verify that command line arguments are not rewritten in the generated comment,
+		// see go.dev/issue/52063
+		hasGeneratedByComment := false
+		for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") {
+			cgoExe := "cgo"
+			if runtime.GOOS == "windows" {
+				cgoExe = "cgo.exe"
+			}
+			if !strings.HasPrefix(line, "// "+cgoExe+" -godefs") {
+				continue
+			}
+			if want := "// " + cgoExe + " " + strings.Join(cmd.Args[3:], " "); line != want {
+				t.Errorf("%s: got generated comment %q, want %q", fn, line, want)
+			}
+			hasGeneratedByComment = true
+			break
+		}
+
+		if !hasGeneratedByComment {
+			t.Errorf("%s: comment with generating cgo -godefs command not found", fn)
+		}
 	}
 
 	main, err := os.ReadFile(filepath.Join("testdata", "main.go"))
diff --git a/misc/cgo/testplugin/plugin_test.go b/misc/cgo/testplugin/plugin_test.go
index 53e79a4..2856810 100644
--- a/misc/cgo/testplugin/plugin_test.go
+++ b/misc/cgo/testplugin/plugin_test.go
@@ -19,6 +19,7 @@
 )
 
 var gcflags string = os.Getenv("GO_GCFLAGS")
+var goroot string
 
 func TestMain(m *testing.M) {
 	flag.Parse()
@@ -43,6 +44,12 @@
 }
 
 func testMain(m *testing.M) int {
+	cwd, err := os.Getwd()
+	if err != nil {
+		log.Fatal(err)
+	}
+	goroot = filepath.Join(cwd, "../../..")
+
 	// Copy testdata into GOPATH/src/testplugin, along with a go.mod file
 	// declaring the same path.
 
@@ -113,7 +120,7 @@
 	if t != nil {
 		t.Helper()
 	}
-	run(t, "go", append([]string{op, "-gcflags", gcflags}, args...)...)
+	run(t, filepath.Join(goroot, "bin", "go"), append([]string{op, "-gcflags", gcflags}, args...)...)
 }
 
 // escape converts a string to something suitable for a shell command line.
@@ -211,7 +218,7 @@
 
 func TestIssue19534(t *testing.T) {
 	// Test that we can load a plugin built in a path with non-alpha characters.
-	goCmd(t, "build", "-buildmode=plugin", "-ldflags='-pluginpath=issue.19534'", "-o", "plugin.so", "./issue19534/plugin.go")
+	goCmd(t, "build", "-buildmode=plugin", "-gcflags=-p=issue.19534", "-ldflags=-pluginpath=issue.19534", "-o", "plugin.so", "./issue19534/plugin.go")
 	goCmd(t, "build", "-o", "issue19534.exe", "./issue19534/main.go")
 	run(t, "./issue19534.exe")
 }
@@ -296,6 +303,16 @@
 	run(t, "./issue44956.exe")
 }
 
+func TestIssue52937(t *testing.T) {
+	goCmd(t, "build", "-buildmode=plugin", "-o", "issue52937.so", "./issue52937/main.go")
+}
+
+func TestIssue53989(t *testing.T) {
+	goCmd(t, "build", "-buildmode=plugin", "-o", "issue53989.so", "./issue53989/plugin.go")
+	goCmd(t, "build", "-o", "issue53989.exe", "./issue53989/main.go")
+	run(t, "./issue53989.exe")
+}
+
 func TestForkExec(t *testing.T) {
 	// Issue 38824: importing the plugin package causes it hang in forkExec on darwin.
 
diff --git a/misc/cgo/testplugin/testdata/issue52937/main.go b/misc/cgo/testplugin/testdata/issue52937/main.go
new file mode 100644
index 0000000..66f09ef
--- /dev/null
+++ b/misc/cgo/testplugin/testdata/issue52937/main.go
@@ -0,0 +1,9 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+func main()      {}
+func F[T any]()  {}
+func G[T any](T) {}
diff --git a/misc/cgo/testplugin/testdata/issue53989/main.go b/misc/cgo/testplugin/testdata/issue53989/main.go
new file mode 100644
index 0000000..6907dfd
--- /dev/null
+++ b/misc/cgo/testplugin/testdata/issue53989/main.go
@@ -0,0 +1,32 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 53989: the use of jump table caused a function
+// from the plugin jumps in the middle of the function
+// to the function with the same name in the main
+// executable. As these two functions may be compiled
+// differently as plugin needs to be PIC, this causes
+// crash.
+
+package main
+
+import (
+	"plugin"
+
+	"testplugin/issue53989/p"
+)
+
+func main() {
+	p.Square(7) // call the function in main executable
+
+	p, err := plugin.Open("issue53989.so")
+	if err != nil {
+		panic(err)
+	}
+	f, err := p.Lookup("Square")
+	if err != nil {
+		panic(err)
+	}
+	f.(func(int))(7) // call the plugin one
+}
diff --git a/misc/cgo/testplugin/testdata/issue53989/p/p.go b/misc/cgo/testplugin/testdata/issue53989/p/p.go
new file mode 100644
index 0000000..02567c1
--- /dev/null
+++ b/misc/cgo/testplugin/testdata/issue53989/p/p.go
@@ -0,0 +1,52 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+import (
+	"fmt"
+	"runtime"
+)
+
+var y int
+
+//go:noinline
+func Square(x int) {
+	var pc0, pc1 [1]uintptr
+	runtime.Callers(1, pc0[:]) // get PC at entry
+
+	// a switch using jump table
+	switch x {
+	case 1:
+		y = 1
+	case 2:
+		y = 4
+	case 3:
+		y = 9
+	case 4:
+		y = 16
+	case 5:
+		y = 25
+	case 6:
+		y = 36
+	case 7:
+		y = 49
+	case 8:
+		y = 64
+	default:
+		panic("too large")
+	}
+
+	// check PC is in the same function
+	runtime.Callers(1, pc1[:])
+	if pc1[0] < pc0[0] || pc1[0] > pc0[0]+1000000 {
+		fmt.Printf("jump across DSO boundary. pc0=%x, pc1=%x\n", pc0[0], pc1[0])
+		panic("FAIL")
+	}
+
+	if y != x*x {
+		fmt.Printf("x=%d y=%d!=%d\n", x, y, x*x)
+		panic("FAIL")
+	}
+}
diff --git a/misc/cgo/testplugin/testdata/issue53989/plugin.go b/misc/cgo/testplugin/testdata/issue53989/plugin.go
new file mode 100644
index 0000000..a753ee4
--- /dev/null
+++ b/misc/cgo/testplugin/testdata/issue53989/plugin.go
@@ -0,0 +1,13 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "testplugin/issue53989/p"
+
+func Square(x int) { // export Square for plugin
+	p.Square(x)
+}
+
+func main() {}
diff --git a/misc/cgo/testsanitizers/asan_test.go b/misc/cgo/testsanitizers/asan_test.go
index 22dcf23..dc1b5a1 100644
--- a/misc/cgo/testsanitizers/asan_test.go
+++ b/misc/cgo/testsanitizers/asan_test.go
@@ -22,6 +22,14 @@
 	if !aSanSupported(goos, goarch) {
 		t.Skipf("skipping on %s/%s; -asan option is not supported.", goos, goarch)
 	}
+	// The current implementation is only compatible with the ASan library from version
+	// v7 to v9 (See the description in src/runtime/asan/asan.go). Therefore, using the
+	// -asan option must use a compatible version of ASan library, which requires that
+	// the gcc version is not less than 7 and the clang version is not less than 9,
+	// otherwise a segmentation fault will occur.
+	if !compilerRequiredAsanVersion() {
+		t.Skipf("skipping: too old version of compiler")
+	}
 
 	t.Parallel()
 	requireOvercommit(t)
@@ -41,6 +49,14 @@
 		{src: "asan4_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan4_fail.go:13"},
 		{src: "asan5_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan5_fail.go:18"},
 		{src: "asan_useAfterReturn.go"},
+		{src: "asan_unsafe_fail1.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail1.go:25"},
+		{src: "asan_unsafe_fail2.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail2.go:25"},
+		{src: "asan_unsafe_fail3.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail3.go:18"},
+		{src: "asan_global1_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global1_fail.go:12"},
+		{src: "asan_global2_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global2_fail.go:19"},
+		{src: "asan_global3_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global3_fail.go:13"},
+		{src: "asan_global4_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global4_fail.go:21"},
+		{src: "asan_global5.go"},
 	}
 	for _, tc := range cases {
 		tc := tc
diff --git a/misc/cgo/testsanitizers/cc_test.go b/misc/cgo/testsanitizers/cc_test.go
index 05b7793..4f0252a 100644
--- a/misc/cgo/testsanitizers/cc_test.go
+++ b/misc/cgo/testsanitizers/cc_test.go
@@ -20,6 +20,7 @@
 	"sync"
 	"syscall"
 	"testing"
+	"time"
 	"unicode"
 )
 
@@ -90,9 +91,26 @@
 // mustRun executes t and fails cmd with a well-formatted message if it fails.
 func mustRun(t *testing.T, cmd *exec.Cmd) {
 	t.Helper()
-	out, err := cmd.CombinedOutput()
+	out := new(strings.Builder)
+	cmd.Stdout = out
+	cmd.Stderr = out
+
+	err := cmd.Start()
 	if err != nil {
-		t.Fatalf("%#q exited with %v\n%s", strings.Join(cmd.Args, " "), err, out)
+		t.Fatalf("%v: %v", cmd, err)
+	}
+
+	if deadline, ok := t.Deadline(); ok {
+		timeout := time.Until(deadline)
+		timeout -= timeout / 10 // Leave 10% headroom for logging and cleanup.
+		timer := time.AfterFunc(timeout, func() {
+			cmd.Process.Signal(syscall.SIGQUIT)
+		})
+		defer timer.Stop()
+	}
+
+	if err := cmd.Wait(); err != nil {
+		t.Fatalf("%v exited with %v\n%s", cmd, err, out)
 	}
 }
 
@@ -184,17 +202,16 @@
 			var match [][]byte
 			if bytes.HasPrefix(out, []byte("gcc")) {
 				compiler.name = "gcc"
-
-				cmd, err := cc("-dumpversion")
+				cmd, err := cc("-v")
 				if err != nil {
 					return err
 				}
-				out, err := cmd.Output()
+				out, err := cmd.CombinedOutput()
 				if err != nil {
-					// gcc, but does not support gcc's "-dumpversion" flag?!
+					// gcc, but does not support gcc's "-v" flag?!
 					return err
 				}
-				gccRE := regexp.MustCompile(`(\d+)\.(\d+)`)
+				gccRE := regexp.MustCompile(`gcc version (\d+)\.(\d+)`)
 				match = gccRE.FindSubmatch(out)
 			} else {
 				clangRE := regexp.MustCompile(`clang version (\d+)\.(\d+)`)
@@ -235,6 +252,22 @@
 	}
 }
 
+// compilerRequiredAsanVersion reports whether the compiler is the version required by Asan.
+func compilerRequiredAsanVersion() bool {
+	compiler, err := compilerVersion()
+	if err != nil {
+		return false
+	}
+	switch compiler.name {
+	case "gcc":
+		return compiler.major >= 7
+	case "clang":
+		return compiler.major >= 9
+	default:
+		return false
+	}
+}
+
 type compilerCheck struct {
 	once sync.Once
 	err  error
@@ -478,7 +511,7 @@
 func aSanSupported(goos, goarch string) bool {
 	switch goos {
 	case "linux":
-		return goarch == "amd64" || goarch == "arm64"
+		return goarch == "amd64" || goarch == "arm64" || goarch == "riscv64"
 	default:
 		return false
 	}
diff --git a/misc/cgo/testsanitizers/testdata/asan_global1_fail.go b/misc/cgo/testsanitizers/testdata/asan_global1_fail.go
new file mode 100644
index 0000000..6cfc0b7
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_global1_fail.go
@@ -0,0 +1,25 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <stdlib.h>
+#include <stdio.h>
+
+int test(int *a) {
+	a[2] = 300;  // BOOM
+	return a[2];
+}
+*/
+import "C"
+
+import "fmt"
+
+var cIntArray [2]C.int
+
+func main() {
+	r := C.test(&cIntArray[0])
+	fmt.Println("r value = ", r)
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_global2_fail.go b/misc/cgo/testsanitizers/testdata/asan_global2_fail.go
new file mode 100644
index 0000000..1932633
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_global2_fail.go
@@ -0,0 +1,31 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <stdlib.h>
+#include <stdio.h>
+
+struct ss {
+	int *p;
+	int len;
+	int cap;
+};
+
+int test(struct ss *a) {
+	struct ss *t = a + 1;
+	t->len = 100;          // BOOM
+	return t->len;
+}
+*/
+import "C"
+import "fmt"
+
+var tt C.struct_ss
+
+func main() {
+	r := C.test(&tt)
+	fmt.Println("r value = ", r)
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_global3_fail.go b/misc/cgo/testsanitizers/testdata/asan_global3_fail.go
new file mode 100644
index 0000000..9ab026c
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_global3_fail.go
@@ -0,0 +1,28 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <stdlib.h>
+#include <stdio.h>
+
+int test(int *a) {
+	int* p = a+1;
+	*p = 10;          // BOOM
+	return *p;
+}
+*/
+import "C"
+import (
+	"fmt"
+	"unsafe"
+)
+
+var cIntV C.int
+
+func main() {
+	r := C.test((*C.int)(unsafe.Pointer(&cIntV)))
+	fmt.Printf("r value is %d", r)
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_global4_fail.go b/misc/cgo/testsanitizers/testdata/asan_global4_fail.go
new file mode 100644
index 0000000..d593598
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_global4_fail.go
@@ -0,0 +1,25 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"fmt"
+	"unsafe"
+)
+
+var intGlo int
+
+func main() {
+	r := bar(&intGlo)
+	fmt.Printf("r value is %d", r)
+}
+
+func bar(a *int) int {
+	p := (*int)(unsafe.Add(unsafe.Pointer(a), 1*unsafe.Sizeof(int(1))))
+	if *p == 10 { // BOOM
+		fmt.Println("its value is 10")
+	}
+	return *p
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_global5.go b/misc/cgo/testsanitizers/testdata/asan_global5.go
new file mode 100644
index 0000000..0ed103d
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_global5.go
@@ -0,0 +1,22 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"fmt"
+)
+
+type Any struct {
+	s string
+	b int64
+}
+
+var Sg = []interface{}{
+	Any{"a", 10},
+}
+
+func main() {
+	fmt.Println(Sg[0])
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_unsafe_fail1.go b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail1.go
new file mode 100644
index 0000000..ec54a66
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail1.go
@@ -0,0 +1,27 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"fmt"
+	"unsafe"
+)
+
+func main() {
+	a := 1
+	b := 2
+	c := add(a, b)
+	d := a + b
+	fmt.Println(c, d)
+}
+
+//go:noinline
+func add(a1, b1 int) int {
+	// The arguments.
+	// When -asan is enabled, unsafe.Pointer(&a1) conversion is escaping.
+	var p *int = (*int)(unsafe.Add(unsafe.Pointer(&a1), 1*unsafe.Sizeof(int(1))))
+	*p = 10 // BOOM
+	return a1 + b1
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_unsafe_fail2.go b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail2.go
new file mode 100644
index 0000000..70f2127
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail2.go
@@ -0,0 +1,28 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"fmt"
+	"unsafe"
+)
+
+func main() {
+	a := 1
+	b := 2
+	c := add(a, b)
+	d := a + b
+	fmt.Println(c, d)
+}
+
+//go:noinline
+func add(a1, b1 int) (ret int) {
+	// The return value
+	// When -asan is enabled, the unsafe.Pointer(&ret) conversion is escaping.
+	var p *int = (*int)(unsafe.Add(unsafe.Pointer(&ret), 1*unsafe.Sizeof(int(1))))
+	*p = 123 // BOOM
+	ret = a1 + b1
+	return
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_unsafe_fail3.go b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail3.go
new file mode 100644
index 0000000..47a8a07
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail3.go
@@ -0,0 +1,21 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"fmt"
+	"unsafe"
+)
+
+func main() {
+	a := 1
+	b := 2
+	// The local variables.
+	// When -asan is enabled, the unsafe.Pointer(&a) conversion is escaping.
+	var p *int = (*int)(unsafe.Add(unsafe.Pointer(&a), 1*unsafe.Sizeof(int(1))))
+	*p = 20 // BOOM
+	d := a + b
+	fmt.Println(d)
+}
diff --git a/misc/cgo/testshared/shared_test.go b/misc/cgo/testshared/shared_test.go
index b78083b..756c4ba 100644
--- a/misc/cgo/testshared/shared_test.go
+++ b/misc/cgo/testshared/shared_test.go
@@ -27,6 +27,7 @@
 )
 
 var gopathInstallDir, gorootInstallDir string
+var oldGOROOT string
 
 // This is the smallest set of packages we can link into a shared
 // library (runtime/cgo is built implicitly).
@@ -57,10 +58,10 @@
 func goCmd(t *testing.T, args ...string) string {
 	newargs := []string{args[0]}
 	if *testX && args[0] != "env" {
-		newargs = append(newargs, "-x")
+		newargs = append(newargs, "-x", "-ldflags=-v")
 	}
 	newargs = append(newargs, args[1:]...)
-	c := exec.Command("go", newargs...)
+	c := exec.Command(filepath.Join(oldGOROOT, "bin", "go"), newargs...)
 	stderr := new(strings.Builder)
 	c.Stderr = stderr
 
@@ -90,6 +91,12 @@
 
 // TestMain calls testMain so that the latter can use defer (TestMain exits with os.Exit).
 func testMain(m *testing.M) (int, error) {
+	cwd, err := os.Getwd()
+	if err != nil {
+		log.Fatal(err)
+	}
+	oldGOROOT = filepath.Join(cwd, "../../..")
+
 	workDir, err := os.MkdirTemp("", "shared_test")
 	if err != nil {
 		return 0, err
@@ -101,6 +108,15 @@
 		defer os.RemoveAll(workDir)
 	}
 
+	// -buildmode=shared fundamentally does not work in module mode.
+	// (It tries to share package dependencies across builds, but in module mode
+	// each module has its own distinct set of dependency versions.)
+	// We would like to eliminate it (see https://go.dev/issue/47788),
+	// but first need to figure out a replacement that covers the small subset
+	// of use-cases where -buildmode=shared still works today.
+	// For now, run the tests in GOPATH mode only.
+	os.Setenv("GO111MODULE", "off")
+
 	// Some tests need to edit the source in GOPATH, so copy this directory to a
 	// temporary directory and chdir to that.
 	gopath := filepath.Join(workDir, "gopath")
@@ -187,11 +203,6 @@
 // GOROOT/pkg relevant to this test into the given directory.
 // It must be run from within the testdata module.
 func cloneGOROOTDeps(goroot string) error {
-	oldGOROOT := strings.TrimSpace(goCmd(nil, "env", "GOROOT"))
-	if oldGOROOT == "" {
-		return fmt.Errorf("go env GOROOT returned an empty string")
-	}
-
 	// Before we clone GOROOT, figure out which packages we need to copy over.
 	listArgs := []string{
 		"list",
diff --git a/misc/ios/go_ios_exec.go b/misc/ios/go_ios_exec.go
index 34a734c..c275dd3 100644
--- a/misc/ios/go_ios_exec.go
+++ b/misc/ios/go_ios_exec.go
@@ -13,9 +13,11 @@
 // binary.
 //
 // This script requires that three environment variables be set:
-// 	GOIOS_DEV_ID: The codesigning developer id or certificate identifier
-// 	GOIOS_APP_ID: The provisioning app id prefix. Must support wildcard app ids.
-// 	GOIOS_TEAM_ID: The team id that owns the app id prefix.
+//
+//	GOIOS_DEV_ID: The codesigning developer id or certificate identifier
+//	GOIOS_APP_ID: The provisioning app id prefix. Must support wildcard app ids.
+//	GOIOS_TEAM_ID: The team id that owns the app id prefix.
+//
 // $GOROOT/misc/ios contains a script, detect.go, that attempts to autodetect these.
 package main
 
diff --git a/misc/trace/README.md b/misc/trace/README.md
deleted file mode 100644
index 218d728..0000000
--- a/misc/trace/README.md
+++ /dev/null
@@ -1,105 +0,0 @@
-## Resources for Go's trace viewer
-
-Go execution trace UI (`go tool trace`) embeds
-Chrome's trace viewer (Catapult) following the 
-[instructions](
-https://chromium.googlesource.com/catapult/+/refs/heads/master/tracing/docs/embedding-trace-viewer.md). This directory contains
-the helper files to embed Chrome's trace viewer.
-
-The current resources were generated/copied from
-[`Catapult@9508452e18f130c98499cb4c4f1e1efaedee8962`](
-https://chromium.googlesource.com/catapult/+/9508452e18f130c98499cb4c4f1e1efaedee8962).
-
-### Updating `trace_viewer_full.html`
-
-The file was generated by catapult's `vulcanize_trace_viewer` command.
-```
-$ git clone https://chromium.googlesource.com/catapult
-$ cd catapult
-$ ./tracing/bin/vulcanize_trace_viewer --config=full
-$ cp tracing/bin/trace_viewer_full.html $GOROOT/misc/trace/trace_viewer_full.html
-```
-
-We are supposed to use --config=lean (produces smaller html),
-but it is broken at the moment:
-https://github.com/catapult-project/catapult/issues/2247
-
-### Updating `webcomponents.min.js`
-
-`webcomponents.min.js` is necessary to let the trace viewer page
-to import the `trace_viewer_full.html`.
-This is copied from the catapult repo.
-
-```
-$ cp third_party/polymer/components/webcomponentsjs/webcomponents.min.js $GOROOT/misc/trace/webcomponents.min.js
-```
-
-## Licenses
-
-The license for trace-viewer is as follows:
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-The license for webcomponents.min.js is as follows:
-
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// Copyright (c) 2014 The Polymer Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/src/all.bat b/src/all.bat
index ae835d9..dfc83c8 100644
--- a/src/all.bat
+++ b/src/all.bat
@@ -13,9 +13,9 @@
 :ok

 

 set OLDPATH=%PATH%

-call make.bat --no-banner --no-local

+call .\make.bat --no-banner --no-local

 if %GOBUILDFAIL%==1 goto end

-call run.bat --no-rebuild --no-local

+call .\run.bat --no-rebuild --no-local

 if %GOBUILDFAIL%==1 goto end

 :: we must restore %PATH% before running "dist banner" so that the latter

 :: can get the original %PATH% and give suggestion to add %GOROOT%/bin

diff --git a/src/archive/tar/common.go b/src/archive/tar/common.go
index c99b5c1..f6d701d 100644
--- a/src/archive/tar/common.go
+++ b/src/archive/tar/common.go
@@ -221,9 +221,11 @@
 // that the file has no data in it, which is rather odd.
 //
 // As an example, if the underlying raw file contains the 10-byte data:
+//
 //	var compactFile = "abcdefgh"
 //
 // And the sparse map has the following entries:
+//
 //	var spd sparseDatas = []sparseEntry{
 //		{Offset: 2,  Length: 5},  // Data fragment for 2..6
 //		{Offset: 18, Length: 3},  // Data fragment for 18..20
@@ -235,6 +237,7 @@
 //	}
 //
 // Then the content of the resulting sparse file with a Header.Size of 25 is:
+//
 //	var sparseFile = "\x00"*2 + "abcde" + "\x00"*11 + "fgh" + "\x00"*4
 type (
 	sparseDatas []sparseEntry
@@ -293,9 +296,9 @@
 // The input must have been already validated.
 //
 // This function mutates src and returns a normalized map where:
-//	* adjacent fragments are coalesced together
-//	* only the last fragment may be empty
-//	* the endOffset of the last fragment is the total size
+//   - adjacent fragments are coalesced together
+//   - only the last fragment may be empty
+//   - the endOffset of the last fragment is the total size
 func invertSparseEntries(src []sparseEntry, size int64) []sparseEntry {
 	dst := src[:0]
 	var pre sparseEntry
diff --git a/src/archive/tar/reader.go b/src/archive/tar/reader.go
index 4b11909..f1b35c3 100644
--- a/src/archive/tar/reader.go
+++ b/src/archive/tar/reader.go
@@ -336,9 +336,9 @@
 // header in case further processing is required.
 //
 // The err will be set to io.EOF only when one of the following occurs:
-//	* Exactly 0 bytes are read and EOF is hit.
-//	* Exactly 1 block of zeros is read and EOF is hit.
-//	* At least 2 blocks of zeros are read.
+//   - Exactly 0 bytes are read and EOF is hit.
+//   - Exactly 1 block of zeros is read and EOF is hit.
+//   - At least 2 blocks of zeros are read.
 func (tr *Reader) readHeader() (*Header, *block, error) {
 	// Two blocks of zero bytes marks the end of the archive.
 	if _, err := io.ReadFull(tr.r, tr.blk[:]); err != nil {
diff --git a/src/archive/tar/stat_unix.go b/src/archive/tar/stat_unix.go
index 717a0b3..0f3428b 100644
--- a/src/archive/tar/stat_unix.go
+++ b/src/archive/tar/stat_unix.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build aix || linux || darwin || dragonfly || freebsd || openbsd || netbsd || solaris
+//go:build unix
 
 package tar
 
diff --git a/src/archive/tar/strconv.go b/src/archive/tar/strconv.go
index 275db6f..ac31963 100644
--- a/src/archive/tar/strconv.go
+++ b/src/archive/tar/strconv.go
@@ -306,6 +306,7 @@
 
 // validPAXRecord reports whether the key-value pair is valid where each
 // record is formatted as:
+//
 //	"%d %s=%s\n" % (size, key, value)
 //
 // Keys and values should be UTF-8, but the number of bad writers out there
diff --git a/src/archive/zip/reader.go b/src/archive/zip/reader.go
index 92fd6f6..d7fcff2 100644
--- a/src/archive/zip/reader.go
+++ b/src/archive/zip/reader.go
@@ -33,6 +33,10 @@
 	Comment       string
 	decompressors map[uint16]Decompressor
 
+	// Some JAR files are zip files with a prefix that is a bash script.
+	// The baseOffset field is the start of the zip file proper.
+	baseOffset int64
+
 	// fileList is a list of files sorted by ename,
 	// for use by the Open method.
 	fileListOnce sync.Once
@@ -52,9 +56,8 @@
 	FileHeader
 	zip          *Reader
 	zipr         io.ReaderAt
-	headerOffset int64
+	headerOffset int64 // includes overall ZIP archive baseOffset
 	zip64        bool  // zip64 extended information extra field presence
-	descErr      error // error reading the data descriptor during init
 }
 
 // OpenReader will open the Zip file specified by name and return a ReadCloser.
@@ -91,11 +94,12 @@
 }
 
 func (z *Reader) init(r io.ReaderAt, size int64) error {
-	end, err := readDirectoryEnd(r, size)
+	end, baseOffset, err := readDirectoryEnd(r, size)
 	if err != nil {
 		return err
 	}
 	z.r = r
+	z.baseOffset = baseOffset
 	// Since the number of directory records is not validated, it is not
 	// safe to preallocate z.File without first checking that the specified
 	// number of files is reasonable, since a malformed archive may
@@ -107,7 +111,7 @@
 	}
 	z.Comment = end.comment
 	rs := io.NewSectionReader(r, 0, size)
-	if _, err = rs.Seek(int64(end.directoryOffset), io.SeekStart); err != nil {
+	if _, err = rs.Seek(z.baseOffset+int64(end.directoryOffset), io.SeekStart); err != nil {
 		return err
 	}
 	buf := bufio.NewReader(rs)
@@ -119,12 +123,27 @@
 	for {
 		f := &File{zip: z, zipr: r}
 		err = readDirectoryHeader(f, buf)
+
+		// For compatibility with other zip programs,
+		// if we have a non-zero base offset and can't read
+		// the first directory header, try again with a zero
+		// base offset.
+		if err == ErrFormat && z.baseOffset != 0 && len(z.File) == 0 {
+			z.baseOffset = 0
+			if _, err = rs.Seek(int64(end.directoryOffset), io.SeekStart); err != nil {
+				return err
+			}
+			buf.Reset(rs)
+			continue
+		}
+
 		if err == ErrFormat || err == io.ErrUnexpectedEOF {
 			break
 		}
 		if err != nil {
 			return err
 		}
+		f.headerOffset += z.baseOffset
 		z.File = append(z.File, f)
 	}
 	if uint16(len(z.File)) != uint16(end.directoryRecords) { // only compare 16 bits here
@@ -229,6 +248,9 @@
 	n, err = r.rc.Read(b)
 	r.hash.Write(b[:n])
 	r.nread += uint64(n)
+	if r.nread > r.f.UncompressedSize64 {
+		return 0, ErrFormat
+	}
 	if err == nil {
 		return
 	}
@@ -492,7 +514,7 @@
 	return nil
 }
 
-func readDirectoryEnd(r io.ReaderAt, size int64) (dir *directoryEnd, err error) {
+func readDirectoryEnd(r io.ReaderAt, size int64) (dir *directoryEnd, baseOffset int64, err error) {
 	// look for directoryEndSignature in the last 1k, then in the last 65k
 	var buf []byte
 	var directoryEndOffset int64
@@ -502,7 +524,7 @@
 		}
 		buf = make([]byte, int(bLen))
 		if _, err := r.ReadAt(buf, size-bLen); err != nil && err != io.EOF {
-			return nil, err
+			return nil, 0, err
 		}
 		if p := findSignatureInBlock(buf); p >= 0 {
 			buf = buf[p:]
@@ -510,7 +532,7 @@
 			break
 		}
 		if i == 1 || bLen == size {
-			return nil, ErrFormat
+			return nil, 0, ErrFormat
 		}
 	}
 
@@ -527,7 +549,7 @@
 	}
 	l := int(d.commentLen)
 	if l > len(b) {
-		return nil, errors.New("zip: invalid comment length")
+		return nil, 0, errors.New("zip: invalid comment length")
 	}
 	d.comment = string(b[:l])
 
@@ -535,17 +557,21 @@
 	if d.directoryRecords == 0xffff || d.directorySize == 0xffff || d.directoryOffset == 0xffffffff {
 		p, err := findDirectory64End(r, directoryEndOffset)
 		if err == nil && p >= 0 {
+			directoryEndOffset = p
 			err = readDirectory64End(r, p, d)
 		}
 		if err != nil {
-			return nil, err
+			return nil, 0, err
 		}
 	}
+
+	baseOffset = directoryEndOffset - int64(d.directorySize) - int64(d.directoryOffset)
+
 	// Make sure directoryOffset points to somewhere in our file.
-	if o := int64(d.directoryOffset); o < 0 || o >= size {
-		return nil, ErrFormat
+	if o := baseOffset + int64(d.directoryOffset); o < 0 || o >= size {
+		return nil, 0, ErrFormat
 	}
-	return d, nil
+	return d, baseOffset, nil
 }
 
 // findDirectory64End tries to read the zip64 locator just before the
@@ -650,6 +676,7 @@
 	name  string
 	file  *File
 	isDir bool
+	isDup bool
 }
 
 type fileInfoDirEntry interface {
@@ -657,11 +684,14 @@
 	fs.DirEntry
 }
 
-func (e *fileListEntry) stat() fileInfoDirEntry {
-	if !e.isDir {
-		return headerFileInfo{&e.file.FileHeader}
+func (e *fileListEntry) stat() (fileInfoDirEntry, error) {
+	if e.isDup {
+		return nil, errors.New(e.name + ": duplicate entries in zip file")
 	}
-	return e
+	if !e.isDir {
+		return headerFileInfo{&e.file.FileHeader}, nil
+	}
+	return e, nil
 }
 
 // Only used for directories.
@@ -696,17 +726,37 @@
 
 func (r *Reader) initFileList() {
 	r.fileListOnce.Do(func() {
+		// files and knownDirs map from a file/directory name
+		// to an index into the r.fileList entry that we are
+		// building. They are used to mark duplicate entries.
+		files := make(map[string]int)
+		knownDirs := make(map[string]int)
+
+		// dirs[name] is true if name is known to be a directory,
+		// because it appears as a prefix in a path.
 		dirs := make(map[string]bool)
-		knownDirs := make(map[string]bool)
+
 		for _, file := range r.File {
 			isDir := len(file.Name) > 0 && file.Name[len(file.Name)-1] == '/'
 			name := toValidName(file.Name)
 			if name == "" {
 				continue
 			}
+
+			if idx, ok := files[name]; ok {
+				r.fileList[idx].isDup = true
+				continue
+			}
+			if idx, ok := knownDirs[name]; ok {
+				r.fileList[idx].isDup = true
+				continue
+			}
+
 			for dir := path.Dir(name); dir != "."; dir = path.Dir(dir) {
 				dirs[dir] = true
 			}
+
+			idx := len(r.fileList)
 			entry := fileListEntry{
 				name:  name,
 				file:  file,
@@ -714,17 +764,23 @@
 			}
 			r.fileList = append(r.fileList, entry)
 			if isDir {
-				knownDirs[name] = true
+				knownDirs[name] = idx
+			} else {
+				files[name] = idx
 			}
 		}
 		for dir := range dirs {
-			if !knownDirs[dir] {
-				entry := fileListEntry{
-					name:  dir,
-					file:  nil,
-					isDir: true,
+			if _, ok := knownDirs[dir]; !ok {
+				if idx, ok := files[dir]; ok {
+					r.fileList[idx].isDup = true
+				} else {
+					entry := fileListEntry{
+						name:  dir,
+						file:  nil,
+						isDir: true,
+					}
+					r.fileList = append(r.fileList, entry)
 				}
-				r.fileList = append(r.fileList, entry)
 			}
 		}
 
@@ -819,7 +875,7 @@
 }
 
 func (d *openDir) Close() error               { return nil }
-func (d *openDir) Stat() (fs.FileInfo, error) { return d.e.stat(), nil }
+func (d *openDir) Stat() (fs.FileInfo, error) { return d.e.stat() }
 
 func (d *openDir) Read([]byte) (int, error) {
 	return 0, &fs.PathError{Op: "read", Path: d.e.name, Err: errors.New("is a directory")}
@@ -838,7 +894,11 @@
 	}
 	list := make([]fs.DirEntry, n)
 	for i := range list {
-		list[i] = d.files[d.offset+i].stat()
+		s, err := d.files[d.offset+i].stat()
+		if err != nil {
+			return nil, err
+		}
+		list[i] = s
 	}
 	d.offset += n
 	return list, nil
diff --git a/src/archive/zip/reader_test.go b/src/archive/zip/reader_test.go
index d1a9bdd..84742c7 100644
--- a/src/archive/zip/reader_test.go
+++ b/src/archive/zip/reader_test.go
@@ -91,6 +91,42 @@
 		},
 	},
 	{
+		Name:    "test-prefix.zip",
+		Comment: "This is a zipfile comment.",
+		File: []ZipTestFile{
+			{
+				Name:     "test.txt",
+				Content:  []byte("This is a test text file.\n"),
+				Modified: time.Date(2010, 9, 5, 12, 12, 1, 0, timeZone(+10*time.Hour)),
+				Mode:     0644,
+			},
+			{
+				Name:     "gophercolor16x16.png",
+				File:     "gophercolor16x16.png",
+				Modified: time.Date(2010, 9, 5, 15, 52, 58, 0, timeZone(+10*time.Hour)),
+				Mode:     0644,
+			},
+		},
+	},
+	{
+		Name:    "test-baddirsz.zip",
+		Comment: "This is a zipfile comment.",
+		File: []ZipTestFile{
+			{
+				Name:     "test.txt",
+				Content:  []byte("This is a test text file.\n"),
+				Modified: time.Date(2010, 9, 5, 12, 12, 1, 0, timeZone(+10*time.Hour)),
+				Mode:     0644,
+			},
+			{
+				Name:     "gophercolor16x16.png",
+				File:     "gophercolor16x16.png",
+				Modified: time.Date(2010, 9, 5, 15, 52, 58, 0, timeZone(+10*time.Hour)),
+				Mode:     0644,
+			},
+		},
+	},
+	{
 		Name:   "r.zip",
 		Source: returnRecursiveZip,
 		File: []ZipTestFile{
@@ -487,6 +523,35 @@
 			},
 		},
 	},
+	{
+		Name: "dupdir.zip",
+		File: []ZipTestFile{
+			{
+				Name:     "a/",
+				Content:  []byte{},
+				Mode:     fs.ModeDir | 0666,
+				Modified: time.Date(2021, 12, 29, 0, 0, 0, 0, timeZone(0)),
+			},
+			{
+				Name:     "a/b",
+				Content:  []byte{},
+				Mode:     0666,
+				Modified: time.Date(2021, 12, 29, 0, 0, 0, 0, timeZone(0)),
+			},
+			{
+				Name:     "a/b/",
+				Content:  []byte{},
+				Mode:     fs.ModeDir | 0666,
+				Modified: time.Date(2021, 12, 29, 0, 0, 0, 0, timeZone(0)),
+			},
+			{
+				Name:     "a/b/c",
+				Content:  []byte{},
+				Mode:     0666,
+				Modified: time.Date(2021, 12, 29, 0, 0, 0, 0, timeZone(0)),
+			},
+		},
+	},
 }
 
 func TestReader(t *testing.T) {
@@ -865,7 +930,6 @@
 //
 // It's here in hex for the same reason as rZipBytes above: to avoid
 // problems with on-disk virus scanners or other zip processors.
-//
 func biggestZipBytes() []byte {
 	s := `
 0000000 50 4b 03 04 14 00 08 00 08 00 00 00 00 00 00 00
@@ -1012,7 +1076,7 @@
 		"\x00\x00\x00\x00\x0000000000\x00\x00\x00\x00000" +
 		"00000000PK\x01\x0200000000" +
 		"0000000000000000\v\x00\x00\x00" +
-		"\x00\x0000PK\x05\x06000000\x05\x000000" +
+		"\x00\x0000PK\x05\x06000000\x05\x00\xfd\x00\x00\x00" +
 		"\v\x00\x00\x00\x00\x00")
 	z, err := NewReader(bytes.NewReader(data), int64(len(data)))
 	if err != nil {
@@ -1057,7 +1121,7 @@
 		"0000000000000000PK\x01\x02" +
 		"0000\b0\b\x00000000000000" +
 		"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000000PK\x05\x06\x00\x00" +
-		"\x00\x0000\x01\x0000008\x00\x00\x00\x00\x00")
+		"\x00\x0000\x01\x00\x26\x00\x00\x008\x00\x00\x00\x00\x00")
 	z, err := NewReader(bytes.NewReader(data), int64(len(data)))
 	if err != nil {
 		t.Fatal(err)
@@ -1124,6 +1188,7 @@
 			[]string{"a/b/c"},
 		},
 	} {
+		test := test
 		t.Run(test.file, func(t *testing.T) {
 			t.Parallel()
 			z, err := OpenReader(test.file)
@@ -1138,6 +1203,60 @@
 	}
 }
 
+func TestFSWalk(t *testing.T) {
+	for _, test := range []struct {
+		file    string
+		want    []string
+		wantErr bool
+	}{
+		{
+			file: "testdata/unix.zip",
+			want: []string{".", "dir", "dir/bar", "dir/empty", "hello", "readonly"},
+		},
+		{
+			file: "testdata/subdir.zip",
+			want: []string{".", "a", "a/b", "a/b/c"},
+		},
+		{
+			file:    "testdata/dupdir.zip",
+			wantErr: true,
+		},
+	} {
+		test := test
+		t.Run(test.file, func(t *testing.T) {
+			t.Parallel()
+			z, err := OpenReader(test.file)
+			if err != nil {
+				t.Fatal(err)
+			}
+			var files []string
+			sawErr := false
+			err = fs.WalkDir(z, ".", func(path string, d fs.DirEntry, err error) error {
+				if err != nil {
+					if !test.wantErr {
+						t.Errorf("%s: %v", path, err)
+					}
+					sawErr = true
+					return nil
+				}
+				files = append(files, path)
+				return nil
+			})
+			if err != nil {
+				t.Errorf("fs.WalkDir error: %v", err)
+			}
+			if test.wantErr && !sawErr {
+				t.Error("succeeded but want error")
+			} else if !test.wantErr && sawErr {
+				t.Error("unexpected error")
+			}
+			if test.want != nil && !reflect.DeepEqual(files, test.want) {
+				t.Errorf("got %v want %v", files, test.want)
+			}
+		})
+	}
+}
+
 func TestFSModTime(t *testing.T) {
 	t.Parallel()
 	z, err := OpenReader("testdata/subdir.zip")
@@ -1408,3 +1527,30 @@
 		t.Errorf("Inconsistent name in info entry: %v", name)
 	}
 }
+
+func TestUnderSize(t *testing.T) {
+	z, err := OpenReader("testdata/readme.zip")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer z.Close()
+
+	for _, f := range z.File {
+		f.UncompressedSize64 = 1
+	}
+
+	for _, f := range z.File {
+		t.Run(f.Name, func(t *testing.T) {
+			rd, err := f.Open()
+			if err != nil {
+				t.Fatal(err)
+			}
+			defer rd.Close()
+
+			_, err = io.Copy(io.Discard, rd)
+			if err != ErrFormat {
+				t.Fatalf("Error mismatch\n\tGot:  %v\n\tWant: %v", err, ErrFormat)
+			}
+		})
+	}
+}
diff --git a/src/archive/zip/testdata/dupdir.zip b/src/archive/zip/testdata/dupdir.zip
new file mode 100644
index 0000000..292720b
--- /dev/null
+++ b/src/archive/zip/testdata/dupdir.zip
Binary files differ
diff --git a/src/archive/zip/testdata/readme.notzip b/src/archive/zip/testdata/readme.notzip
index 8173727..79b1cb6 100644
--- a/src/archive/zip/testdata/readme.notzip
+++ b/src/archive/zip/testdata/readme.notzip
Binary files differ
diff --git a/src/archive/zip/testdata/test-baddirsz.zip b/src/archive/zip/testdata/test-baddirsz.zip
new file mode 100644
index 0000000..45b3314
--- /dev/null
+++ b/src/archive/zip/testdata/test-baddirsz.zip
Binary files differ
diff --git a/src/archive/zip/testdata/test-prefix.zip b/src/archive/zip/testdata/test-prefix.zip
new file mode 100644
index 0000000..1eabb48
--- /dev/null
+++ b/src/archive/zip/testdata/test-prefix.zip
Binary files differ
diff --git a/src/bootstrap.bash b/src/bootstrap.bash
index 88c080a..4038eaf 100755
--- a/src/bootstrap.bash
+++ b/src/bootstrap.bash
@@ -96,7 +96,7 @@
 	echo "Preparing to generate build system's ${OUTGZ}; cleaning ..."
 	rm -rf bin/gofmt
 	rm -rf src/runtime/race/race_*.syso
-	rm -rf api test doc misc/cgo/test misc/trace
+	rm -rf api test doc misc/cgo/test
 	rm -rf pkg/tool/*_*/{addr2line,api,cgo,cover,doc,fix,nm,objdump,pack,pprof,test2json,trace,vet}
 	rm -rf pkg/*_*/{image,database,cmd}
 	rm -rf $(find . -type d -name testdata)
diff --git a/src/bufio/bufio.go b/src/bufio/bufio.go
index 7483946..1da8ffa 100644
--- a/src/bufio/bufio.go
+++ b/src/bufio/bufio.go
@@ -203,7 +203,8 @@
 // The bytes are taken from at most one Read on the underlying Reader,
 // hence n may be less than len(p).
 // To read exactly len(p) bytes, use io.ReadFull(b, p).
-// At EOF, the count will be zero and err will be io.EOF.
+// If the underlying Reader can return a non-zero count with io.EOF,
+// then this Read method can do so as well; see the [io.Reader] docs.
 func (b *Reader) Read(p []byte) (n int, err error) {
 	n = len(p)
 	if n == 0 {
@@ -731,13 +732,28 @@
 // If the count is less than len(s), it also returns an error explaining
 // why the write is short.
 func (b *Writer) WriteString(s string) (int, error) {
+	var sw io.StringWriter
+	tryStringWriter := true
+
 	nn := 0
 	for len(s) > b.Available() && b.err == nil {
-		n := copy(b.buf[b.n:], s)
-		b.n += n
+		var n int
+		if b.Buffered() == 0 && sw == nil && tryStringWriter {
+			// Check at most once whether b.wr is a StringWriter.
+			sw, tryStringWriter = b.wr.(io.StringWriter)
+		}
+		if b.Buffered() == 0 && tryStringWriter {
+			// Large write, empty buffer, and the underlying writer supports
+			// WriteString: forward the write to the underlying StringWriter.
+			// This avoids an extra copy.
+			n, b.err = sw.WriteString(s)
+		} else {
+			n = copy(b.buf[b.n:], s)
+			b.n += n
+			b.Flush()
+		}
 		nn += n
 		s = s[n:]
-		b.Flush()
 	}
 	if b.err != nil {
 		return nn, b.err
diff --git a/src/bufio/bufio_test.go b/src/bufio/bufio_test.go
index ff3396e..b3456d2 100644
--- a/src/bufio/bufio_test.go
+++ b/src/bufio/bufio_test.go
@@ -762,6 +762,67 @@
 	}
 }
 
+func TestWriteStringStringWriter(t *testing.T) {
+	const BufSize = 8
+	{
+		tw := &teststringwriter{}
+		b := NewWriterSize(tw, BufSize)
+		b.WriteString("1234")
+		tw.check(t, "", "")
+		b.WriteString("56789012")   // longer than BufSize
+		tw.check(t, "12345678", "") // but not enough (after filling the partially-filled buffer)
+		b.Flush()
+		tw.check(t, "123456789012", "")
+	}
+	{
+		tw := &teststringwriter{}
+		b := NewWriterSize(tw, BufSize)
+		b.WriteString("123456789")   // long string, empty buffer:
+		tw.check(t, "", "123456789") // use WriteString
+	}
+	{
+		tw := &teststringwriter{}
+		b := NewWriterSize(tw, BufSize)
+		b.WriteString("abc")
+		tw.check(t, "", "")
+		b.WriteString("123456789012345")      // long string, non-empty buffer
+		tw.check(t, "abc12345", "6789012345") // use Write and then WriteString since the remaining part is still longer than BufSize
+	}
+	{
+		tw := &teststringwriter{}
+		b := NewWriterSize(tw, BufSize)
+		b.Write([]byte("abc")) // same as above, but use Write instead of WriteString
+		tw.check(t, "", "")
+		b.WriteString("123456789012345")
+		tw.check(t, "abc12345", "6789012345") // same as above
+	}
+}
+
+type teststringwriter struct {
+	write       string
+	writeString string
+}
+
+func (w *teststringwriter) Write(b []byte) (int, error) {
+	w.write += string(b)
+	return len(b), nil
+}
+
+func (w *teststringwriter) WriteString(s string) (int, error) {
+	w.writeString += s
+	return len(s), nil
+}
+
+func (w *teststringwriter) check(t *testing.T, write, writeString string) {
+	t.Helper()
+	if w.write != write {
+		t.Errorf("write: expected %q, got %q", write, w.write)
+	}
+	if w.writeString != writeString {
+		t.Errorf("writeString: expected %q, got %q", writeString, w.writeString)
+	}
+}
+
 func TestBufferFull(t *testing.T) {
 	const longString = "And now, hello, world! It is the time for all good men to come to the aid of their party"
 	buf := NewReaderSize(strings.NewReader(longString), minReadBufferSize)
diff --git a/src/bufio/scan.go b/src/bufio/scan.go
index 4846d4f..e247cbc 100644
--- a/src/bufio/scan.go
+++ b/src/bufio/scan.go
@@ -26,7 +26,6 @@
 // advanced arbitrarily far past the last token. Programs that need more
 // control over error handling or large tokens, or must run sequential scans
 // on a reader, should use bufio.Reader instead.
-//
 type Scanner struct {
 	r            io.Reader // The reader provided by the client.
 	split        SplitFunc // The function to split the tokens.
diff --git a/src/builtin/builtin.go b/src/builtin/builtin.go
index 5657be4..7feb209 100644
--- a/src/builtin/builtin.go
+++ b/src/builtin/builtin.go
@@ -3,10 +3,10 @@
 // license that can be found in the LICENSE file.
 
 /*
-	Package builtin provides documentation for Go's predeclared identifiers.
-	The items documented here are not actually in package builtin
-	but their descriptions here allow godoc to present documentation
-	for the language's special identifiers.
+Package builtin provides documentation for Go's predeclared identifiers.
+The items documented here are not actually in package builtin
+but their descriptions here allow godoc to present documentation
+for the language's special identifiers.
 */
 package builtin
 
@@ -137,9 +137,12 @@
 // new elements. If it does not, a new underlying array will be allocated.
 // Append returns the updated slice. It is therefore necessary to store the
 // result of append, often in the variable holding the slice itself:
+//
 //	slice = append(slice, elem1, elem2)
 //	slice = append(slice, anotherSlice...)
+//
 // As a special case, it is legal to append a string to a byte slice, like this:
+//
 //	slice = append([]byte("hello "), "world"...)
 func append(slice []Type, elems ...Type) []Type
 
@@ -156,24 +159,28 @@
 func delete(m map[Type]Type1, key Type)
 
 // The len built-in function returns the length of v, according to its type:
+//
 //	Array: the number of elements in v.
 //	Pointer to array: the number of elements in *v (even if v is nil).
 //	Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
 //	String: the number of bytes in v.
 //	Channel: the number of elements queued (unread) in the channel buffer;
 //	         if v is nil, len(v) is zero.
+//
 // For some arguments, such as a string literal or a simple array expression, the
 // result can be a constant. See the Go language specification's "Length and
 // capacity" section for details.
 func len(v Type) int
 
 // The cap built-in function returns the capacity of v, according to its type:
+//
 //	Array: the number of elements in v (same as len(v)).
 //	Pointer to array: the number of elements in *v (same as len(v)).
 //	Slice: the maximum length the slice can reach when resliced;
 //	if v is nil, cap(v) is zero.
 //	Channel: the channel buffer capacity, in units of elements;
 //	if v is nil, cap(v) is zero.
+//
 // For some arguments, such as a simple array expression, the result can be a
 // constant. See the Go language specification's "Length and capacity" section for
 // details.
@@ -184,6 +191,7 @@
 // value. Unlike new, make's return type is the same as the type of its
 // argument, not a pointer to it. The specification of the result depends on
 // the type:
+//
 //	Slice: The size specifies the length. The capacity of the slice is
 //	equal to its length. A second integer argument may be provided to
 //	specify a different capacity; it must be no smaller than the
@@ -225,8 +233,10 @@
 // the last sent value is received. After the last value has been received
 // from a closed channel c, any receive from c will succeed without
 // blocking, returning the zero value for the channel element. The form
+//
 //	x, ok := <-c
-// will also set ok to false for a closed channel.
+//
+// will also set ok to false for a closed and empty channel.
 func close(c chan<- Type)
 
 // The panic built-in function stops normal execution of the current
diff --git a/src/bytes/buffer.go b/src/bytes/buffer.go
index 549b077..0bacbda 100644
--- a/src/bytes/buffer.go
+++ b/src/bytes/buffer.go
@@ -138,10 +138,8 @@
 	} else if c > maxInt-c-n {
 		panic(ErrTooLarge)
 	} else {
-		// Not enough space anywhere, we need to allocate.
-		buf := makeSlice(2*c + n)
-		copy(buf, b.buf[b.off:])
-		b.buf = buf
+		// Add b.off to account for b.buf[:b.off] being sliced off the front.
+		b.buf = growSlice(b.buf[b.off:], b.off+n)
 	}
 	// Restore b.off and len(b.buf).
 	b.off = 0
@@ -217,16 +215,31 @@
 	}
 }
 
-// makeSlice allocates a slice of size n. If the allocation fails, it panics
-// with ErrTooLarge.
-func makeSlice(n int) []byte {
-	// If the make fails, give a known error.
+// growSlice grows b by n, preserving the original content of b.
+// If the allocation fails, it panics with ErrTooLarge.
+func growSlice(b []byte, n int) []byte {
 	defer func() {
 		if recover() != nil {
 			panic(ErrTooLarge)
 		}
 	}()
-	return make([]byte, n)
+	// TODO(http://golang.org/issue/51462): We should rely on the append-make
+	// pattern so that the compiler can call runtime.growslice. For example:
+	//	return append(b, make([]byte, n)...)
+	// This avoids unnecessary zero-ing of the first len(b) bytes of the
+	// allocated slice, but this pattern causes b to escape onto the heap.
+	//
+	// Instead use the append-make pattern with a nil slice to ensure that
+	// we allocate buffers rounded up to the closest size class.
+	c := len(b) + n // ensure enough space for n elements
+	if c < 2*cap(b) {
+		// The growth rate has historically always been 2x. In the future,
+		// we could rely purely on append to determine the growth rate.
+		c = 2 * cap(b)
+	}
+	b2 := append([]byte(nil), make([]byte, c)...)
+	copy(b2, b)
+	return b2[:len(b)]
 }
 
 // WriteTo writes data to w until the buffer is drained or an error occurs.
diff --git a/src/bytes/buffer_test.go b/src/bytes/buffer_test.go
index 9c9b744..c085500 100644
--- a/src/bytes/buffer_test.go
+++ b/src/bytes/buffer_test.go
@@ -672,3 +672,18 @@
 		}
 	}
 }
+
+func BenchmarkBufferWriteBlock(b *testing.B) {
+	block := make([]byte, 1024)
+	for _, n := range []int{1 << 12, 1 << 16, 1 << 20} {
+		b.Run(fmt.Sprintf("N%d", n), func(b *testing.B) {
+			b.ReportAllocs()
+			for i := 0; i < b.N; i++ {
+				var bb Buffer
+				for bb.Len() < n {
+					bb.Write(block)
+				}
+			}
+		})
+	}
+}
diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go
index e3dab4d..659a82b 100644
--- a/src/bytes/bytes.go
+++ b/src/bytes/bytes.go
@@ -30,7 +30,7 @@
 // explode splits s into a slice of UTF-8 sequences, one per Unicode code point (still slices of bytes),
 // up to a maximum of n byte slices. Invalid UTF-8 sequences are chopped into individual bytes.
 func explode(s []byte, n int) [][]byte {
-	if n <= 0 {
+	if n <= 0 || n > len(s) {
 		n = len(s)
 	}
 	a := make([][]byte, n)
@@ -348,6 +348,9 @@
 	if n < 0 {
 		n = Count(s, sep) + 1
 	}
+	if n > len(s)+1 {
+		n = len(s) + 1
+	}
 
 	a := make([][]byte, n)
 	n--
@@ -369,9 +372,10 @@
 // the subslices between those separators.
 // If sep is empty, SplitN splits after each UTF-8 sequence.
 // The count determines the number of subslices to return:
-//   n > 0: at most n subslices; the last subslice will be the unsplit remainder.
-//   n == 0: the result is nil (zero subslices)
-//   n < 0: all subslices
+//
+//	n > 0: at most n subslices; the last subslice will be the unsplit remainder.
+//	n == 0: the result is nil (zero subslices)
+//	n < 0: all subslices
 //
 // To split around the first instance of a separator, see Cut.
 func SplitN(s, sep []byte, n int) [][]byte { return genSplit(s, sep, 0, n) }
@@ -380,9 +384,10 @@
 // returns a slice of those subslices.
 // If sep is empty, SplitAfterN splits after each UTF-8 sequence.
 // The count determines the number of subslices to return:
-//   n > 0: at most n subslices; the last subslice will be the unsplit remainder.
-//   n == 0: the result is nil (zero subslices)
-//   n < 0: all subslices
+//
+//	n > 0: at most n subslices; the last subslice will be the unsplit remainder.
+//	n == 0: the result is nil (zero subslices)
+//	n < 0: all subslices
 func SplitAfterN(s, sep []byte, n int) [][]byte {
 	return genSplit(s, sep, len(sep), n)
 }
@@ -1139,7 +1144,7 @@
 }
 
 // EqualFold reports whether s and t, interpreted as UTF-8 strings,
-// are equal under Unicode case-folding, which is a more general
+// are equal under simple Unicode case-folding, which is a more general
 // form of case-insensitivity.
 func EqualFold(s, t []byte) bool {
 	for len(s) != 0 && len(t) != 0 {
diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go
index 2e6ab31..985aa0b 100644
--- a/src/bytes/bytes_test.go
+++ b/src/bytes/bytes_test.go
@@ -8,6 +8,7 @@
 	. "bytes"
 	"fmt"
 	"internal/testenv"
+	"math"
 	"math/rand"
 	"reflect"
 	"strings"
@@ -139,6 +140,36 @@
 	{"abc", "c", 2},
 	{"abc", "x", -1},
 	{"barfoobarfooyyyzzzyyyzzzyyyzzzyyyxxxzzzyyy", "x", 33},
+	{"fofofofooofoboo", "oo", 7},
+	{"fofofofofofoboo", "ob", 11},
+	{"fofofofofofoboo", "boo", 12},
+	{"fofofofofofoboo", "oboo", 11},
+	{"fofofofofoooboo", "fooo", 8},
+	{"fofofofofofoboo", "foboo", 10},
+	{"fofofofofofoboo", "fofob", 8},
+	{"fofofofofofofoffofoobarfoo", "foffof", 12},
+	{"fofofofofoofofoffofoobarfoo", "foffof", 13},
+	{"fofofofofofofoffofoobarfoo", "foffofo", 12},
+	{"fofofofofoofofoffofoobarfoo", "foffofo", 13},
+	{"fofofofofoofofoffofoobarfoo", "foffofoo", 13},
+	{"fofofofofofofoffofoobarfoo", "foffofoo", 12},
+	{"fofofofofoofofoffofoobarfoo", "foffofoob", 13},
+	{"fofofofofofofoffofoobarfoo", "foffofoob", 12},
+	{"fofofofofoofofoffofoobarfoo", "foffofooba", 13},
+	{"fofofofofofofoffofoobarfoo", "foffofooba", 12},
+	{"fofofofofoofofoffofoobarfoo", "foffofoobar", 13},
+	{"fofofofofofofoffofoobarfoo", "foffofoobar", 12},
+	{"fofofofofoofofoffofoobarfoo", "foffofoobarf", 13},
+	{"fofofofofofofoffofoobarfoo", "foffofoobarf", 12},
+	{"fofofofofoofofoffofoobarfoo", "foffofoobarfo", 13},
+	{"fofofofofofofoffofoobarfoo", "foffofoobarfo", 12},
+	{"fofofofofoofofoffofoobarfoo", "foffofoobarfoo", 13},
+	{"fofofofofofofoffofoobarfoo", "foffofoobarfoo", 12},
+	{"fofofofofoofofoffofoobarfoo", "ofoffofoobarfoo", 12},
+	{"fofofofofofofoffofoobarfoo", "ofoffofoobarfoo", 11},
+	{"fofofofofoofofoffofoobarfoo", "fofoffofoobarfoo", 11},
+	{"fofofofofofofoffofoobarfoo", "fofoffofoobarfoo", 10},
+	{"fofofofofoofofoffofoobarfoo", "foobars", -1},
 	{"foofyfoobarfoobar", "y", 4},
 	{"oooooooooooooooooooooo", "r", -1},
 	{"oxoxoxoxoxoxoxoxoxoxoxoy", "oy", 22},
@@ -723,6 +754,7 @@
 	{"1 2", " ", 3, []string{"1", "2"}},
 	{"123", "", 2, []string{"1", "23"}},
 	{"123", "", 17, []string{"1", "2", "3"}},
+	{"bT", "T", math.MaxInt / 4, []string{"b", ""}},
 }
 
 func TestSplit(t *testing.T) {
diff --git a/src/bytes/reader.go b/src/bytes/reader.go
index 5946cf9..81c22aa 100644
--- a/src/bytes/reader.go
+++ b/src/bytes/reader.go
@@ -32,8 +32,7 @@
 
 // Size returns the original length of the underlying byte slice.
 // Size is the number of bytes available for reading via ReadAt.
-// The returned value is always the same and is not affected by calls
-// to any other method.
+// The result is unaffected by any method calls except Reset.
 func (r *Reader) Size() int64 { return int64(len(r.s)) }
 
 // Read implements the io.Reader interface.
diff --git a/src/clean.bat b/src/clean.bat
index c957353..6688b41 100644
--- a/src/clean.bat
+++ b/src/clean.bat
@@ -10,7 +10,7 @@
 

 go tool dist env -w -p >env.bat

 if errorlevel 1 goto fail

-call env.bat

+call .\env.bat

 del env.bat

 echo.

 

diff --git a/src/cmd/addr2line/main.go b/src/cmd/addr2line/main.go
index 0188029..6e005a8 100644
--- a/src/cmd/addr2line/main.go
+++ b/src/cmd/addr2line/main.go
@@ -6,6 +6,7 @@
 // just enough to support pprof.
 //
 // Usage:
+//
 //	go tool addr2line binary
 //
 // Addr2line reads hexadecimal addresses, one per line and with optional 0x prefix,
diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go
index 5ae059e..e6bf62d 100644
--- a/src/cmd/api/goapi.go
+++ b/src/cmd/api/goapi.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Binary api computes the exported API of a set of Go packages.
+// Api computes the exported API of a set of Go packages.
 package main
 
 import (
@@ -16,14 +16,15 @@
 	"go/parser"
 	"go/token"
 	"go/types"
-	exec "internal/execabs"
 	"io"
 	"log"
 	"os"
+	"os/exec"
 	"path/filepath"
 	"regexp"
 	"runtime"
 	"sort"
+	"strconv"
 	"strings"
 	"sync"
 )
@@ -33,21 +34,24 @@
 	if runtime.GOOS == "windows" {
 		exeSuffix = ".exe"
 	}
-	path := filepath.Join(runtime.GOROOT(), "bin", "go"+exeSuffix)
-	if _, err := os.Stat(path); err == nil {
-		return path
+	if goroot := build.Default.GOROOT; goroot != "" {
+		path := filepath.Join(goroot, "bin", "go"+exeSuffix)
+		if _, err := os.Stat(path); err == nil {
+			return path
+		}
 	}
 	return "go"
 }
 
 // Flags
 var (
-	checkFile  = flag.String("c", "", "optional comma-separated filename(s) to check API against")
-	allowNew   = flag.Bool("allow_new", true, "allow API additions")
-	exceptFile = flag.String("except", "", "optional filename of packages that are allowed to change without triggering a failure in the tool")
-	nextFile   = flag.String("next", "", "optional filename of tentative upcoming API features for the next release. This file can be lazily maintained. It only affects the delta warnings from the -c file printed on success.")
-	verbose    = flag.Bool("v", false, "verbose debugging")
-	forceCtx   = flag.String("contexts", "", "optional comma-separated list of <goos>-<goarch>[-cgo] to override default contexts.")
+	checkFiles      = flag.String("c", "", "optional comma-separated filename(s) to check API against")
+	requireApproval = flag.String("approval", "", "require approvals in comma-separated list of `files`")
+	allowNew        = flag.Bool("allow_new", true, "allow API additions")
+	exceptFile      = flag.String("except", "", "optional filename of packages that are allowed to change without triggering a failure in the tool")
+	nextFiles       = flag.String("next", "", "comma-separated list of `files` for upcoming API features for the next release. These files can be lazily maintained. They only affects the delta warnings from the -c file printed on success.")
+	verbose         = flag.Bool("v", false, "verbose debugging")
+	forceCtx        = flag.String("contexts", "", "optional comma-separated list of <goos>-<goarch>[-cgo] to override default contexts.")
 )
 
 // contexts are the default contexts which are scanned, unless
@@ -125,10 +129,14 @@
 func main() {
 	flag.Parse()
 
+	if build.Default.GOROOT == "" {
+		log.Fatalf("GOROOT not found. (If binary was built with -trimpath, $GOROOT must be set.)")
+	}
+
 	if !strings.Contains(runtime.Version(), "weekly") && !strings.Contains(runtime.Version(), "devel") {
-		if *nextFile != "" {
-			fmt.Printf("Go version is %q, ignoring -next %s\n", runtime.Version(), *nextFile)
-			*nextFile = ""
+		if *nextFiles != "" {
+			fmt.Printf("Go version is %q, ignoring -next %s\n", runtime.Version(), *nextFiles)
+			*nextFiles = ""
 		}
 	}
 
@@ -201,7 +209,7 @@
 	bw := bufio.NewWriter(os.Stdout)
 	defer bw.Flush()
 
-	if *checkFile == "" {
+	if *checkFiles == "" {
 		sort.Strings(features)
 		for _, f := range features {
 			fmt.Fprintln(bw, f)
@@ -210,10 +218,15 @@
 	}
 
 	var required []string
-	for _, file := range strings.Split(*checkFile, ",") {
+	for _, file := range strings.Split(*checkFiles, ",") {
 		required = append(required, fileFeatures(file)...)
 	}
-	optional := fileFeatures(*nextFile)
+	var optional []string
+	if *nextFiles != "" {
+		for _, file := range strings.Split(*nextFiles, ",") {
+			optional = append(optional, fileFeatures(file)...)
+		}
+	}
 	exception := fileFeatures(*exceptFile)
 	fail = !compareAPI(bw, features, required, optional, exception, *allowNew)
 }
@@ -340,6 +353,13 @@
 	if filename == "" {
 		return nil
 	}
+	needApproval := false
+	for _, name := range strings.Split(*requireApproval, ",") {
+		if filename == name {
+			needApproval = true
+			break
+		}
+	}
 	bs, err := os.ReadFile(filename)
 	if err != nil {
 		log.Fatalf("Error reading file %s: %v", filename, err)
@@ -348,11 +368,23 @@
 	s = aliasReplacer.Replace(s)
 	lines := strings.Split(s, "\n")
 	var nonblank []string
-	for _, line := range lines {
+	for i, line := range lines {
 		line = strings.TrimSpace(line)
-		if line != "" && !strings.HasPrefix(line, "#") {
-			nonblank = append(nonblank, line)
+		if line == "" || strings.HasPrefix(line, "#") {
+			continue
 		}
+		if needApproval {
+			feature, approval, ok := strings.Cut(line, "#")
+			if !ok {
+				log.Fatalf("%s:%d: missing proposal approval\n", filename, i+1)
+			}
+			_, err := strconv.Atoi(approval)
+			if err != nil {
+				log.Fatalf("%s:%d: malformed proposal approval #%s\n", filename, i+1, approval)
+			}
+			line = strings.TrimSpace(feature)
+		}
+		nonblank = append(nonblank, line)
 	}
 	return nonblank
 }
diff --git a/src/cmd/api/goapi_boring_test.go b/src/cmd/api/goapi_boring_test.go
new file mode 100644
index 0000000..f0e3575
--- /dev/null
+++ b/src/cmd/api/goapi_boring_test.go
@@ -0,0 +1,17 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build boringcrypto
+
+package main
+
+import (
+	"fmt"
+	"os"
+)
+
+func init() {
+	fmt.Printf("SKIP with boringcrypto enabled\n")
+	os.Exit(0)
+}
diff --git a/src/cmd/api/goapi_test.go b/src/cmd/api/goapi_test.go
index 16e0058..862ab18 100644
--- a/src/cmd/api/goapi_test.go
+++ b/src/cmd/api/goapi_test.go
@@ -9,6 +9,7 @@
 	"flag"
 	"fmt"
 	"go/build"
+	"internal/testenv"
 	"os"
 	"path/filepath"
 	"sort"
@@ -22,6 +23,7 @@
 	for _, c := range contexts {
 		c.Compiler = build.Default.Compiler
 	}
+	build.Default.GOROOT = testenv.GOROOT(nil)
 
 	// Warm up the import cache in parallel.
 	var wg sync.WaitGroup
diff --git a/src/cmd/api/run.go b/src/cmd/api/run.go
index 903f157..89d1bf2 100644
--- a/src/cmd/api/run.go
+++ b/src/cmd/api/run.go
@@ -11,13 +11,14 @@
 import (
 	"errors"
 	"fmt"
-	exec "internal/execabs"
 	"internal/goversion"
 	"io/fs"
 	"log"
 	"os"
+	"os/exec"
 	"path/filepath"
 	"runtime"
+	"strconv"
 	"strings"
 )
 
@@ -41,51 +42,69 @@
 	if goroot == "" {
 		log.Fatal("No $GOROOT set.")
 	}
+	if err := os.Chdir(filepath.Join(goroot, "api")); err != nil {
+		log.Fatal(err)
+	}
 
-	apiDir := filepath.Join(goroot, "api")
-	out, err := exec.Command(goCmd(), "tool", "api",
-		"-c", findAPIDirFiles(apiDir),
-		allowNew(apiDir),
-		"-next", filepath.Join(apiDir, "next.txt"),
-		"-except", filepath.Join(apiDir, "except.txt")).CombinedOutput()
+	files, err := filepath.Glob("go1*.txt")
+	if err != nil {
+		log.Fatal(err)
+	}
+	files = append(files, "fuchsia.txt")
+	next, err := filepath.Glob(filepath.Join("next", "*.txt"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	cmd := exec.Command(goCmd(), "tool", "api",
+		"-c", strings.Join(files, ","),
+		"-approval", strings.Join(append(approvalNeeded(files), next...), ","),
+		allowNew(),
+		"-next", strings.Join(next, ","),
+		"-except", "except.txt",
+	)
+	out, err := cmd.CombinedOutput()
 	if err != nil {
 		log.Fatalf("Error running API checker: %v\n%s", err, out)
 	}
 	fmt.Print(string(out))
 }
 
-// findAPIDirFiles returns a comma-separated list of Go API files
-// (go1.txt, go1.1.txt, etc.) located in apiDir.
-func findAPIDirFiles(apiDir string) string {
-	dir, err := os.Open(apiDir)
-	if err != nil {
-		log.Fatal(err)
-	}
-	defer dir.Close()
-	fs, err := dir.Readdirnames(-1)
-	if err != nil {
-		log.Fatal(err)
-	}
-	var apiFiles []string
-	for _, fn := range fs {
-		if strings.HasPrefix(fn, "go1") || strings.HasPrefix(fn, "fuchsia") {
-			apiFiles = append(apiFiles, filepath.Join(apiDir, fn))
+func approvalNeeded(files []string) []string {
+	var out []string
+	for _, f := range files {
+		name := filepath.Base(f)
+		if name == "go1.txt" {
+			continue
+		}
+		if name == "fuchsia.txt" {
+			continue
+		}
+		minor := strings.TrimSuffix(strings.TrimPrefix(name, "go1."), ".txt")
+		n, err := strconv.Atoi(minor)
+		if err != nil {
+			log.Fatalf("unexpected api file: %v", f)
+		}
+		if n >= 19 { // approvals started being tracked in Go 1.19
+			out = append(out, f)
 		}
 	}
-	return strings.Join(apiFiles, ",")
+	return out
 }
 
 // allowNew returns the -allow_new flag to use for the 'go tool api' invocation.
-func allowNew(apiDir string) string {
+func allowNew() string {
+	// Experiment for Go 1.19: always require api file updates.
+	return "-allow_new=false"
+
 	// Verify that the api/go1.n.txt for previous Go version exists.
 	// It definitely should, otherwise it's a signal that the logic below may be outdated.
-	if _, err := os.Stat(filepath.Join(apiDir, fmt.Sprintf("go1.%d.txt", goversion.Version-1))); err != nil {
+	if _, err := os.Stat(fmt.Sprintf("go1.%d.txt", goversion.Version-1)); err != nil {
 		log.Fatalln("Problem with api file for previous release:", err)
 	}
 
 	// See whether the api/go1.n.txt for this Go version has been created.
 	// (As of April 2021, it gets created during the release of the first Beta.)
-	_, err := os.Stat(filepath.Join(apiDir, fmt.Sprintf("go1.%d.txt", goversion.Version)))
+	_, err := os.Stat(fmt.Sprintf("go1.%d.txt", goversion.Version))
 	if errors.Is(err, fs.ErrNotExist) {
 		// It doesn't exist, so we're in development or before Beta 1.
 		// At this stage, unmentioned API additions are deemed okay.
diff --git a/src/cmd/asm/doc.go b/src/cmd/asm/doc.go
index 4a0c785..098f063 100644
--- a/src/cmd/asm/doc.go
+++ b/src/cmd/asm/doc.go
@@ -3,11 +3,11 @@
 // license that can be found in the LICENSE file.
 
 /*
-Asm, typically invoked as ``go tool asm'', assembles the source file into an object
+Asm, typically invoked as “go tool asm”, assembles the source file into an object
 file named for the basename of the argument source file with a .o suffix. The
 object file can then be combined with other objects into a package archive.
 
-Command Line
+# Command Line
 
 Usage:
 
diff --git a/src/cmd/asm/internal/arch/arch.go b/src/cmd/asm/internal/arch/arch.go
index 4d374cb..a724a3b 100644
--- a/src/cmd/asm/internal/arch/arch.go
+++ b/src/cmd/asm/internal/arch/arch.go
@@ -9,6 +9,7 @@
 	"cmd/internal/obj"
 	"cmd/internal/obj/arm"
 	"cmd/internal/obj/arm64"
+	"cmd/internal/obj/loong64"
 	"cmd/internal/obj/mips"
 	"cmd/internal/obj/ppc64"
 	"cmd/internal/obj/riscv"
@@ -60,6 +61,8 @@
 		return archArm()
 	case "arm64":
 		return archArm64()
+	case "loong64":
+		return archLoong64(&loong64.Linkloong64)
 	case "mips":
 		return archMips(&mips.Linkmips)
 	case "mipsle":
@@ -278,46 +281,7 @@
 	}
 
 	register["LR"] = arm64.REGLINK
-	register["DAIFSet"] = arm64.REG_DAIFSet
-	register["DAIFClr"] = arm64.REG_DAIFClr
-	register["PLDL1KEEP"] = arm64.REG_PLDL1KEEP
-	register["PLDL1STRM"] = arm64.REG_PLDL1STRM
-	register["PLDL2KEEP"] = arm64.REG_PLDL2KEEP
-	register["PLDL2STRM"] = arm64.REG_PLDL2STRM
-	register["PLDL3KEEP"] = arm64.REG_PLDL3KEEP
-	register["PLDL3STRM"] = arm64.REG_PLDL3STRM
-	register["PLIL1KEEP"] = arm64.REG_PLIL1KEEP
-	register["PLIL1STRM"] = arm64.REG_PLIL1STRM
-	register["PLIL2KEEP"] = arm64.REG_PLIL2KEEP
-	register["PLIL2STRM"] = arm64.REG_PLIL2STRM
-	register["PLIL3KEEP"] = arm64.REG_PLIL3KEEP
-	register["PLIL3STRM"] = arm64.REG_PLIL3STRM
-	register["PSTL1KEEP"] = arm64.REG_PSTL1KEEP
-	register["PSTL1STRM"] = arm64.REG_PSTL1STRM
-	register["PSTL2KEEP"] = arm64.REG_PSTL2KEEP
-	register["PSTL2STRM"] = arm64.REG_PSTL2STRM
-	register["PSTL3KEEP"] = arm64.REG_PSTL3KEEP
-	register["PSTL3STRM"] = arm64.REG_PSTL3STRM
 
-	// Conditional operators, like EQ, NE, etc.
-	register["EQ"] = arm64.COND_EQ
-	register["NE"] = arm64.COND_NE
-	register["HS"] = arm64.COND_HS
-	register["CS"] = arm64.COND_HS
-	register["LO"] = arm64.COND_LO
-	register["CC"] = arm64.COND_LO
-	register["MI"] = arm64.COND_MI
-	register["PL"] = arm64.COND_PL
-	register["VS"] = arm64.COND_VS
-	register["VC"] = arm64.COND_VC
-	register["HI"] = arm64.COND_HI
-	register["LS"] = arm64.COND_LS
-	register["GE"] = arm64.COND_GE
-	register["LT"] = arm64.COND_LT
-	register["GT"] = arm64.COND_GT
-	register["LE"] = arm64.COND_LE
-	register["AL"] = arm64.COND_AL
-	register["NV"] = arm64.COND_NV
 	// Pseudo-registers.
 	register["SB"] = RSB
 	register["FP"] = RFP
@@ -541,6 +505,59 @@
 	}
 }
 
+func archLoong64(linkArch *obj.LinkArch) *Arch {
+	register := make(map[string]int16)
+	// Create maps for easy lookup of instruction names etc.
+	// Note that there is no list of names as there is for x86.
+	for i := loong64.REG_R0; i <= loong64.REG_R31; i++ {
+		register[obj.Rconv(i)] = int16(i)
+	}
+	for i := loong64.REG_F0; i <= loong64.REG_F31; i++ {
+		register[obj.Rconv(i)] = int16(i)
+	}
+	for i := loong64.REG_FCSR0; i <= loong64.REG_FCSR31; i++ {
+		register[obj.Rconv(i)] = int16(i)
+	}
+	for i := loong64.REG_FCC0; i <= loong64.REG_FCC31; i++ {
+		register[obj.Rconv(i)] = int16(i)
+	}
+	// Pseudo-registers.
+	register["SB"] = RSB
+	register["FP"] = RFP
+	register["PC"] = RPC
+	// Avoid unintentionally clobbering g using R22.
+	delete(register, "R22")
+	register["g"] = loong64.REG_R22
+	register["RSB"] = loong64.REG_R31
+	registerPrefix := map[string]bool{
+		"F":    true,
+		"FCSR": true,
+		"FCC":  true,
+		"R":    true,
+	}
+
+	instructions := make(map[string]obj.As)
+	for i, s := range obj.Anames {
+		instructions[s] = obj.As(i)
+	}
+	for i, s := range loong64.Anames {
+		if obj.As(i) >= obj.A_ARCHSPECIFIC {
+			instructions[s] = obj.As(i) + obj.ABaseLoong64
+		}
+	}
+	// Annoying alias.
+	instructions["JAL"] = loong64.AJAL
+
+	return &Arch{
+		LinkArch:       linkArch,
+		Instructions:   instructions,
+		Register:       register,
+		RegisterPrefix: registerPrefix,
+		RegisterNumber: loong64RegisterNumber,
+		IsJump:         jumpLoong64,
+	}
+}
+
 func archRISCV64(shared bool) *Arch {
 	register := make(map[string]int16)
 
diff --git a/src/cmd/asm/internal/arch/arm64.go b/src/cmd/asm/internal/arch/arm64.go
index 24689c5..936b894 100644
--- a/src/cmd/asm/internal/arch/arm64.go
+++ b/src/cmd/asm/internal/arch/arm64.go
@@ -12,6 +12,7 @@
 	"cmd/internal/obj"
 	"cmd/internal/obj/arm64"
 	"errors"
+	"fmt"
 )
 
 var arm64LS = map[string]uint8{
@@ -46,13 +47,56 @@
 	"JMP":   true,
 	"TBNZ":  true,
 	"TBZ":   true,
+
+	// ADR isn't really a jump, but it takes a PC or label reference,
+	// which needs to patched like a jump.
+	"ADR":  true,
+	"ADRP": true,
 }
 
 func jumpArm64(word string) bool {
 	return arm64Jump[word]
 }
 
-// IsARM64CMP reports whether the op (as defined by an arm.A* constant) is
+var arm64SpecialOperand map[string]arm64.SpecialOperand
+
+// GetARM64SpecialOperand returns the internal representation of a special operand.
+func GetARM64SpecialOperand(name string) arm64.SpecialOperand {
+	if arm64SpecialOperand == nil {
+		// Generate the mapping automatically when the first time the function is called.
+		arm64SpecialOperand = map[string]arm64.SpecialOperand{}
+		for opd := arm64.SPOP_BEGIN; opd < arm64.SPOP_END; opd++ {
+			s := fmt.Sprintf("%s", opd)
+			arm64SpecialOperand[s] = opd
+		}
+
+		// Handle some special cases.
+		specialMapping := map[string]arm64.SpecialOperand{
+			// The internal representation of CS(CC) and HS(LO) are the same.
+			"CS": arm64.SPOP_HS,
+			"CC": arm64.SPOP_LO,
+		}
+		for s, opd := range specialMapping {
+			arm64SpecialOperand[s] = opd
+		}
+	}
+	if opd, ok := arm64SpecialOperand[name]; ok {
+		return opd
+	}
+	return arm64.SPOP_END
+}
+
+// IsARM64ADR reports whether the op (as defined by an arm64.A* constant) is
+// one of the comparison instructions that require special handling.
+func IsARM64ADR(op obj.As) bool {
+	switch op {
+	case arm64.AADR, arm64.AADRP:
+		return true
+	}
+	return false
+}
+
+// IsARM64CMP reports whether the op (as defined by an arm64.A* constant) is
 // one of the comparison instructions that require special handling.
 func IsARM64CMP(op obj.As) bool {
 	switch op {
diff --git a/src/cmd/asm/internal/arch/loong64.go b/src/cmd/asm/internal/arch/loong64.go
new file mode 100644
index 0000000..ebf842c
--- /dev/null
+++ b/src/cmd/asm/internal/arch/loong64.go
@@ -0,0 +1,67 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file encapsulates some of the odd characteristics of the
+// Loong64 (LoongArch64) instruction set, to minimize its interaction
+// with the core of the assembler.
+
+package arch
+
+import (
+	"cmd/internal/obj"
+	"cmd/internal/obj/loong64"
+)
+
+func jumpLoong64(word string) bool {
+	switch word {
+	case "BEQ", "BFPF", "BFPT", "BLTZ", "BGEZ", "BLEZ", "BGTZ", "BLT", "BLTU", "JIRL", "BNE", "BGE", "BGEU", "JMP", "JAL", "CALL":
+		return true
+	}
+	return false
+}
+
+// IsLoong64CMP reports whether the op (as defined by an loong64.A* constant) is
+// one of the CMP instructions that require special handling.
+func IsLoong64CMP(op obj.As) bool {
+	switch op {
+	case loong64.ACMPEQF, loong64.ACMPEQD, loong64.ACMPGEF, loong64.ACMPGED,
+		loong64.ACMPGTF, loong64.ACMPGTD:
+		return true
+	}
+	return false
+}
+
+// IsLoong64MUL reports whether the op (as defined by an loong64.A* constant) is
+// one of the MUL/DIV/REM instructions that require special handling.
+func IsLoong64MUL(op obj.As) bool {
+	switch op {
+	case loong64.AMUL, loong64.AMULU, loong64.AMULV, loong64.AMULVU,
+		loong64.ADIV, loong64.ADIVU, loong64.ADIVV, loong64.ADIVVU,
+		loong64.AREM, loong64.AREMU, loong64.AREMV, loong64.AREMVU:
+		return true
+	}
+	return false
+}
+
+func loong64RegisterNumber(name string, n int16) (int16, bool) {
+	switch name {
+	case "F":
+		if 0 <= n && n <= 31 {
+			return loong64.REG_F0 + n, true
+		}
+	case "FCSR":
+		if 0 <= n && n <= 31 {
+			return loong64.REG_FCSR0 + n, true
+		}
+	case "FCC":
+		if 0 <= n && n <= 31 {
+			return loong64.REG_FCC0 + n, true
+		}
+	case "R":
+		if 0 <= n && n <= 31 {
+			return loong64.REG_R0 + n, true
+		}
+	}
+	return 0, false
+}
diff --git a/src/cmd/asm/internal/arch/ppc64.go b/src/cmd/asm/internal/arch/ppc64.go
index 3139665..616e189 100644
--- a/src/cmd/asm/internal/arch/ppc64.go
+++ b/src/cmd/asm/internal/arch/ppc64.go
@@ -15,7 +15,7 @@
 
 func jumpPPC64(word string) bool {
 	switch word {
-	case "BC", "BCL", "BEQ", "BGE", "BGT", "BL", "BLE", "BLT", "BNE", "BR", "BVC", "BVS", "CALL", "JMP":
+	case "BC", "BCL", "BEQ", "BGE", "BGT", "BL", "BLE", "BLT", "BNE", "BR", "BVC", "BVS", "BDNZ", "BDZ", "CALL", "JMP":
 		return true
 	}
 	return false
diff --git a/src/cmd/asm/internal/asm/asm.go b/src/cmd/asm/internal/asm/asm.go
index d0cb632..cfd1f4c 100644
--- a/src/cmd/asm/internal/asm/asm.go
+++ b/src/cmd/asm/internal/asm/asm.go
@@ -14,6 +14,7 @@
 	"cmd/asm/internal/flags"
 	"cmd/asm/internal/lex"
 	"cmd/internal/obj"
+	"cmd/internal/obj/ppc64"
 	"cmd/internal/obj/x86"
 	"cmd/internal/objabi"
 	"cmd/internal/sys"
@@ -393,6 +394,7 @@
 		Pos:  p.pos(),
 		As:   op,
 	}
+	targetAddr := &prog.To
 	switch len(a) {
 	case 0:
 		if p.arch.Family == sys.Wasm {
@@ -405,24 +407,57 @@
 		target = &a[0]
 	case 2:
 		// Special 2-operand jumps.
-		target = &a[1]
-		prog.From = a[0]
+		if p.arch.Family == sys.ARM64 && arch.IsARM64ADR(op) {
+			// ADR label, R. Label is in From.
+			target = &a[0]
+			prog.To = a[1]
+			targetAddr = &prog.From
+		} else {
+			target = &a[1]
+			prog.From = a[0]
+		}
 	case 3:
 		if p.arch.Family == sys.PPC64 {
 			// Special 3-operand jumps.
-			// First two must be constants; a[1] is a register number.
+			// a[1] is a register number expressed as a constant or register value
 			target = &a[2]
-			prog.From = obj.Addr{
-				Type:   obj.TYPE_CONST,
-				Offset: p.getConstant(prog, op, &a[0]),
+			prog.From = a[0]
+			if a[0].Type != obj.TYPE_CONST {
+				// Legacy code may use a plain constant, accept it, and coerce
+				// into a constant. E.g:
+				//   BC 4,...
+				// into
+				//   BC $4,...
+				prog.From = obj.Addr{
+					Type:   obj.TYPE_CONST,
+					Offset: p.getConstant(prog, op, &a[0]),
+				}
+
 			}
-			reg := int16(p.getConstant(prog, op, &a[1]))
-			reg, ok := p.arch.RegisterNumber("R", reg)
-			if !ok {
-				p.errorf("bad register number %d", reg)
-				return
+
+			// Likewise, fixup usage like:
+			//   BC x,LT,...
+			//   BC x,foo+2,...
+			//   BC x,4
+			//   BC x,$5
+			// into
+			//   BC x,CR0LT,...
+			//   BC x,CR0EQ,...
+			//   BC x,CR1LT,...
+			//   BC x,CR1GT,...
+			// The first and second case demonstrate a symbol name which is
+			// effectively discarded. In these cases, the offset determines
+			// the CR bit.
+			prog.Reg = a[1].Reg
+			if a[1].Type != obj.TYPE_REG {
+				// The CR bit is represented as a constant 0-31. Convert it to a Reg.
+				c := p.getConstant(prog, op, &a[1])
+				reg, success := ppc64.ConstantToCRbit(c)
+				if !success {
+					p.errorf("invalid CR bit register number %d", c)
+				}
+				prog.Reg = reg
 			}
-			prog.Reg = reg
 			break
 		}
 		if p.arch.Family == sys.MIPS || p.arch.Family == sys.MIPS64 || p.arch.Family == sys.RISCV64 {
@@ -433,6 +468,14 @@
 			prog.Reg = p.getRegister(prog, op, &a[1])
 			break
 		}
+		if p.arch.Family == sys.Loong64 {
+			// 3-operand jumps.
+			// First two must be registers
+			target = &a[2]
+			prog.From = a[0]
+			prog.Reg = p.getRegister(prog, op, &a[1])
+			break
+		}
 		if p.arch.Family == sys.S390X {
 			// 3-operand jumps.
 			target = &a[2]
@@ -461,7 +504,7 @@
 		p.errorf("wrong number of arguments to %s instruction", op)
 		return
 	case 4:
-		if p.arch.Family == sys.S390X {
+		if p.arch.Family == sys.S390X || p.arch.Family == sys.PPC64 {
 			// 4-operand compare-and-branch.
 			prog.From = a[0]
 			prog.Reg = p.getRegister(prog, op, &a[1])
@@ -478,20 +521,20 @@
 	switch {
 	case target.Type == obj.TYPE_BRANCH:
 		// JMP 4(PC)
-		prog.To = obj.Addr{
+		*targetAddr = obj.Addr{
 			Type:   obj.TYPE_BRANCH,
 			Offset: p.pc + 1 + target.Offset, // +1 because p.pc is incremented in append, below.
 		}
 	case target.Type == obj.TYPE_REG:
 		// JMP R1
-		prog.To = *target
+		*targetAddr = *target
 	case target.Type == obj.TYPE_MEM && (target.Name == obj.NAME_EXTERN || target.Name == obj.NAME_STATIC):
 		// JMP main·morestack(SB)
-		prog.To = *target
+		*targetAddr = *target
 	case target.Type == obj.TYPE_INDIR && (target.Name == obj.NAME_EXTERN || target.Name == obj.NAME_STATIC):
 		// JMP *main·morestack(SB)
-		prog.To = *target
-		prog.To.Type = obj.TYPE_INDIR
+		*targetAddr = *target
+		targetAddr.Type = obj.TYPE_INDIR
 	case target.Type == obj.TYPE_MEM && target.Reg == 0 && target.Offset == 0:
 		// JMP exit
 		if target.Sym == nil {
@@ -500,20 +543,20 @@
 		}
 		targetProg := p.labels[target.Sym.Name]
 		if targetProg == nil {
-			p.toPatch = append(p.toPatch, Patch{prog, target.Sym.Name})
+			p.toPatch = append(p.toPatch, Patch{targetAddr, target.Sym.Name})
 		} else {
-			p.branch(prog, targetProg)
+			p.branch(targetAddr, targetProg)
 		}
 	case target.Type == obj.TYPE_MEM && target.Name == obj.NAME_NONE:
 		// JMP 4(R0)
-		prog.To = *target
+		*targetAddr = *target
 		// On the ppc64, 9a encodes BR (CTR) as BR CTR. We do the same.
 		if p.arch.Family == sys.PPC64 && target.Offset == 0 {
-			prog.To.Type = obj.TYPE_REG
+			targetAddr.Type = obj.TYPE_REG
 		}
 	case target.Type == obj.TYPE_CONST:
 		// JMP $4
-		prog.To = a[0]
+		*targetAddr = a[0]
 	case target.Type == obj.TYPE_NONE:
 		// JMP
 	default:
@@ -531,17 +574,17 @@
 			p.errorf("undefined label %s", patch.label)
 			return
 		}
-		p.branch(patch.prog, targetProg)
+		p.branch(patch.addr, targetProg)
 	}
 	p.toPatch = p.toPatch[:0]
 }
 
-func (p *Parser) branch(jmp, target *obj.Prog) {
-	jmp.To = obj.Addr{
+func (p *Parser) branch(addr *obj.Addr, target *obj.Prog) {
+	*addr = obj.Addr{
 		Type:  obj.TYPE_BRANCH,
 		Index: 0,
 	}
-	jmp.To.Val = target
+	addr.Val = target
 }
 
 // asmInstruction assembles an instruction.
@@ -593,6 +636,12 @@
 				prog.Reg = p.getRegister(prog, op, &a[1])
 				break
 			}
+		} else if p.arch.Family == sys.Loong64 {
+			if arch.IsLoong64CMP(op) {
+				prog.From = a[0]
+				prog.Reg = p.getRegister(prog, op, &a[1])
+				break
+			}
 		}
 		prog.From = a[0]
 		prog.To = a[1]
@@ -602,6 +651,10 @@
 			prog.From = a[0]
 			prog.Reg = p.getRegister(prog, op, &a[1])
 			prog.To = a[2]
+		case sys.Loong64:
+			prog.From = a[0]
+			prog.Reg = p.getRegister(prog, op, &a[1])
+			prog.To = a[2]
 		case sys.ARM:
 			// Special cases.
 			if arch.IsARMSTREX(op) {
diff --git a/src/cmd/asm/internal/asm/endtoend_test.go b/src/cmd/asm/internal/asm/endtoend_test.go
index ead8b27..33a4465 100644
--- a/src/cmd/asm/internal/asm/endtoend_test.go
+++ b/src/cmd/asm/internal/asm/endtoend_test.go
@@ -447,6 +447,13 @@
 	testEndToEnd(t, "mips64", "mips64")
 }
 
+func TestLOONG64Encoder(t *testing.T) {
+	testEndToEnd(t, "loong64", "loong64enc1")
+	testEndToEnd(t, "loong64", "loong64enc2")
+	testEndToEnd(t, "loong64", "loong64enc3")
+	testEndToEnd(t, "loong64", "loong64")
+}
+
 func TestPPC64EndToEnd(t *testing.T) {
 	testEndToEnd(t, "ppc64", "ppc64")
 }
diff --git a/src/cmd/asm/internal/asm/operand_test.go b/src/cmd/asm/internal/asm/operand_test.go
index c1295a0..b47c7e1 100644
--- a/src/cmd/asm/internal/asm/operand_test.go
+++ b/src/cmd/asm/internal/asm/operand_test.go
@@ -125,6 +125,11 @@
 	testOperandParser(t, parser, mips64OperandTests)
 }
 
+func TestLOONG64OperandParser(t *testing.T) {
+	parser := newParser("loong64")
+	testOperandParser(t, parser, loong64OperandTests)
+}
+
 func TestS390XOperandParser(t *testing.T) {
 	parser := newParser("s390x")
 	testOperandParser(t, parser, s390xOperandTests)
@@ -143,6 +148,7 @@
 		{"ppc64", ppc64OperandTests},
 		{"mips", mipsOperandTests},
 		{"mips64", mips64OperandTests},
+		{"loong64", loong64OperandTests},
 		{"s390x", s390xOperandTests},
 	} {
 		t.Run(sub.arch, func(t *testing.T) {
@@ -845,6 +851,88 @@
 	{"[):[o-FP", ""}, // Issue 12469 - asm hung parsing the o-FP range on non ARM platforms.
 }
 
+var loong64OperandTests = []operandTest{
+	{"$((1<<63)-1)", "$9223372036854775807"},
+	{"$(-64*1024)", "$-65536"},
+	{"$(1024 * 8)", "$8192"},
+	{"$-1", "$-1"},
+	{"$-24(R4)", "$-24(R4)"},
+	{"$0", "$0"},
+	{"$0(R1)", "$(R1)"},
+	{"$0.5", "$(0.5)"},
+	{"$0x7000", "$28672"},
+	{"$0x88888eef", "$2290650863"},
+	{"$1", "$1"},
+	{"$_main<>(SB)", "$_main<>(SB)"},
+	{"$argframe(FP)", "$argframe(FP)"},
+	{"$~3", "$-4"},
+	{"(-288-3*8)(R1)", "-312(R1)"},
+	{"(16)(R7)", "16(R7)"},
+	{"(8)(g)", "8(g)"},
+	{"(R0)", "(R0)"},
+	{"(R3)", "(R3)"},
+	{"(R4)", "(R4)"},
+	{"(R5)", "(R5)"},
+	{"-1(R4)", "-1(R4)"},
+	{"-1(R5)", "-1(R5)"},
+	{"6(PC)", "6(PC)"},
+	{"F14", "F14"},
+	{"F15", "F15"},
+	{"F16", "F16"},
+	{"F17", "F17"},
+	{"F18", "F18"},
+	{"F19", "F19"},
+	{"F20", "F20"},
+	{"F21", "F21"},
+	{"F22", "F22"},
+	{"F23", "F23"},
+	{"F24", "F24"},
+	{"F25", "F25"},
+	{"F26", "F26"},
+	{"F27", "F27"},
+	{"F28", "F28"},
+	{"F29", "F29"},
+	{"F30", "F30"},
+	{"F31", "F31"},
+	{"R0", "R0"},
+	{"R1", "R1"},
+	{"R11", "R11"},
+	{"R12", "R12"},
+	{"R13", "R13"},
+	{"R14", "R14"},
+	{"R15", "R15"},
+	{"R16", "R16"},
+	{"R17", "R17"},
+	{"R18", "R18"},
+	{"R19", "R19"},
+	{"R2", "R2"},
+	{"R20", "R20"},
+	{"R21", "R21"},
+	{"R23", "R23"},
+	{"R24", "R24"},
+	{"R25", "R25"},
+	{"R26", "R26"},
+	{"R27", "R27"},
+	{"R28", "R28"},
+	{"R29", "R29"},
+	{"R30", "R30"},
+	{"R3", "R3"},
+	{"R4", "R4"},
+	{"R5", "R5"},
+	{"R6", "R6"},
+	{"R7", "R7"},
+	{"R8", "R8"},
+	{"R9", "R9"},
+	{"a(FP)", "a(FP)"},
+	{"g", "g"},
+	{"RSB", "R31"},
+	{"ret+8(FP)", "ret+8(FP)"},
+	{"runtime·abort(SB)", "runtime.abort(SB)"},
+	{"·AddUint32(SB)", "\"\".AddUint32(SB)"},
+	{"·trunc(SB)", "\"\".trunc(SB)"},
+	{"[):[o-FP", ""}, // Issue 12469 - asm hung parsing the o-FP range on non ARM platforms.
+}
+
 var s390xOperandTests = []operandTest{
 	{"$((1<<63)-1)", "$9223372036854775807"},
 	{"$(-64*1024)", "$-65536"},
diff --git a/src/cmd/asm/internal/asm/parse.go b/src/cmd/asm/internal/asm/parse.go
index 4cddcf4..6445e01 100644
--- a/src/cmd/asm/internal/asm/parse.go
+++ b/src/cmd/asm/internal/asm/parse.go
@@ -19,6 +19,7 @@
 	"cmd/asm/internal/flags"
 	"cmd/asm/internal/lex"
 	"cmd/internal/obj"
+	"cmd/internal/obj/arm64"
 	"cmd/internal/obj/x86"
 	"cmd/internal/src"
 	"cmd/internal/sys"
@@ -48,7 +49,7 @@
 }
 
 type Patch struct {
-	prog  *obj.Prog
+	addr  *obj.Addr
 	label string
 }
 
@@ -161,7 +162,7 @@
 
 // line consumes a single assembly line from p.lex of the form
 //
-//   {label:} WORD[.cond] [ arg {, arg} ] (';' | '\n')
+//	{label:} WORD[.cond] [ arg {, arg} ] (';' | '\n')
 //
 // It adds any labels to p.pendingLabels and returns the word, cond,
 // operand list, and true. If there is an error or EOF, it returns
@@ -389,8 +390,19 @@
 	tok := p.next()
 	name := tok.String()
 	if tok.ScanToken == scanner.Ident && !p.atStartOfRegister(name) {
-		// We have a symbol. Parse $sym±offset(symkind)
-		p.symbolReference(a, name, prefix)
+		switch p.arch.Family {
+		case sys.ARM64:
+			// arm64 special operands.
+			if opd := arch.GetARM64SpecialOperand(name); opd != arm64.SPOP_END {
+				a.Type = obj.TYPE_SPECIAL
+				a.Offset = int64(opd)
+				break
+			}
+			fallthrough
+		default:
+			// We have a symbol. Parse $sym±offset(symkind)
+			p.symbolReference(a, name, prefix)
+		}
 		// fmt.Printf("SYM %s\n", obj.Dconv(&emptyProg, 0, a))
 		if p.peek() == scanner.EOF {
 			return
@@ -843,7 +855,6 @@
 //
 // Anything else beginning with "<" logs an error if issueError is
 // true, otherwise returns (false, obj.ABI0).
-//
 func (p *Parser) symRefAttrs(name string, issueError bool) (bool, obj.ABI) {
 	abi := obj.ABI0
 	isStatic := false
@@ -880,7 +891,7 @@
 // constrained form of the operand syntax that's always SB-based,
 // non-static, and has at most a simple integer offset:
 //
-//    [$|*]sym[<abi>][+Int](SB)
+//	[$|*]sym[<abi>][+Int](SB)
 func (p *Parser) funcAddress() (string, obj.ABI, bool) {
 	switch p.peek() {
 	case '$', '*':
@@ -1030,9 +1041,13 @@
 //
 // For 386/AMD64 register list specifies 4VNNIW-style multi-source operand.
 // For range of 4 elements, Intel manual uses "+3" notation, for example:
+//
 //	VP4DPWSSDS zmm1{k1}{z}, zmm2+3, m128
+//
 // Given asm line:
+//
 //	VP4DPWSSDS Z5, [Z10-Z13], (AX)
+//
 // zmm2 is Z10, and Z13 is the only valid value for it (Z10+3).
 // Only simple ranges are accepted, like [Z0-Z3].
 //
diff --git a/src/cmd/asm/internal/asm/testdata/arm.s b/src/cmd/asm/internal/asm/testdata/arm.s
index cc8e25e..2ba22c7 100644
--- a/src/cmd/asm/internal/asm/testdata/arm.s
+++ b/src/cmd/asm/internal/asm/testdata/arm.s
@@ -1042,7 +1042,7 @@
 	BFI	$29, $2, R8                              // 1881dee7
 	BFI	$16, $8, R1, R2 // BFI $16, R1, $8, R2   // 1124d7e7
 
-// synthetic arithmatic
+// synthetic arithmetic
 	ADD	$0xffffffaa, R2, R3 // ADD $4294967210, R2, R3   // 55b0e0e30b3082e0
 	ADD	$0xffffff55, R5     // ADD $4294967125, R5       // aab0e0e30b5085e0
 	ADD.S	$0xffffffab, R2, R3 // ADD.S $4294967211, R2, R3 // 54b0e0e30b3092e0
diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s
index a4b56b0..4451338 100644
--- a/src/cmd/asm/internal/asm/testdata/arm64.s
+++ b/src/cmd/asm/internal/asm/testdata/arm64.s
@@ -10,7 +10,6 @@
 
 TEXT	foo(SB), DUPOK|NOSPLIT, $-8
 
-
 // arithmetic operations
 	ADDW	$1, R2, R3
 	ADDW	R1, R2, R3
@@ -241,6 +240,10 @@
 	FADDS	F2, F3, F4                      // 6428221e
 	FADDD	F1, F2                          // 4228611e
 	VDUP	V19.S[0], V17.S4                // 7106044e
+	VTRN1	V3.D2, V2.D2, V20.D2            // 5428c34e
+	VTRN2	V3.D2, V2.D2, V21.D2            // 5568c34e
+	VTRN1	V5.D2, V4.D2, V22.D2            // 9628c54e
+	VTRN2	V5.D2, V4.D2, V23.D2            // 9768c54e
 
 
 // special
@@ -624,7 +627,8 @@
 	CSELW	LT, R2, R3, R4	// 44b0831a
 	CSINC	GT, R1, ZR, R3	// 23c49f9a
 	CSNEG	MI, R1, R2, R3	// 234482da
-	CSINV	CS, R1, R2, R3	// CSINV HS, R1, R2, R3 // 232082da
+	CSINV	CS, R1, R2, R3	// CSINV	HS, R1, R2, R3 // 232082da
+	CSINV	HS, R1, R2, R3	// 232082da
 	CSINVW	MI, R2, ZR, R2	// 42409f5a
 	CINC	EQ, R4, R9	// 8914849a
 	CINCW	PL, R2, ZR	// 5f44821a
@@ -846,6 +850,11 @@
 	JMP	foo(SB)
 	CALL	foo(SB)
 
+// ADR
+	ADR	next, R11     // ADR R11 // 2b000010
+next:
+	NOP
+
 // LDP/STP
 	LDP	(R0), (R0, R1)      // 000440a9
 	LDP	(R0), (R1, R2)      // 010840a9
@@ -1623,4 +1632,116 @@
 	MSR	R13, ZCR_EL1                       // 0d1218d5
 	MRS	ZCR_EL1, R23                       // 171238d5
 	MSR	R17, ZCR_EL1                       // 111218d5
+	SYS	$32768, R1                         // 018008d5
+	SYS	$32768                             // 1f8008d5
+
+// TLBI instruction
+	TLBI	VMALLE1IS                          // 1f8308d5
+	TLBI	VMALLE1                            // 1f8708d5
+	TLBI	ALLE2IS                            // 1f830cd5
+	TLBI	ALLE1IS                            // 9f830cd5
+	TLBI	VMALLS12E1IS                       // df830cd5
+	TLBI	ALLE2                              // 1f870cd5
+	TLBI	ALLE1                              // 9f870cd5
+	TLBI	VMALLS12E1                         // df870cd5
+	TLBI	ALLE3IS                            // 1f830ed5
+	TLBI	ALLE3                              // 1f870ed5
+	TLBI	VMALLE1OS                          // 1f8108d5
+	TLBI	ALLE2OS                            // 1f810cd5
+	TLBI	ALLE1OS                            // 9f810cd5
+	TLBI	VMALLS12E1OS                       // df810cd5
+	TLBI	ALLE3OS                            // 1f810ed5
+	TLBI	VAE1IS, R0                         // 208308d5
+	TLBI	ASIDE1IS, R1                       // 418308d5
+	TLBI	VAAE1IS, R2                        // 628308d5
+	TLBI	VALE1IS, R3                        // a38308d5
+	TLBI	VAALE1IS, R4                       // e48308d5
+	TLBI	VAE1, R5                           // 258708d5
+	TLBI	ASIDE1, R6                         // 468708d5
+	TLBI	VAAE1, R7                          // 678708d5
+	TLBI	VALE1, R8                          // a88708d5
+	TLBI	VAALE1, R9                         // e98708d5
+	TLBI	IPAS2E1IS, R10                     // 2a800cd5
+	TLBI	IPAS2LE1IS, R11                    // ab800cd5
+	TLBI	VAE2IS, R12                        // 2c830cd5
+	TLBI	VALE2IS, R13                       // ad830cd5
+	TLBI	IPAS2E1, R14                       // 2e840cd5
+	TLBI	IPAS2LE1, R15                      // af840cd5
+	TLBI	VAE2, R16                          // 30870cd5
+	TLBI	VALE2, R17                         // b1870cd5
+	TLBI	VAE3IS, ZR                         // 3f830ed5
+	TLBI	VALE3IS, R19                       // b3830ed5
+	TLBI	VAE3, R20                          // 34870ed5
+	TLBI	VALE3, R21                         // b5870ed5
+	TLBI	VAE1OS, R22                        // 368108d5
+	TLBI	ASIDE1OS, R23                      // 578108d5
+	TLBI	VAAE1OS, R24                       // 788108d5
+	TLBI	VALE1OS, R25                       // b98108d5
+	TLBI	VAALE1OS, R26                      // fa8108d5
+	TLBI	RVAE1IS, R27                       // 3b8208d5
+	TLBI	RVAAE1IS, ZR                       // 7f8208d5
+	TLBI	RVALE1IS, R29                      // bd8208d5
+	TLBI	RVAALE1IS, R30                     // fe8208d5
+	TLBI	RVAE1OS, ZR                        // 3f8508d5
+	TLBI	RVAAE1OS, R0                       // 608508d5
+	TLBI	RVALE1OS, R1                       // a18508d5
+	TLBI	RVAALE1OS, R2                      // e28508d5
+	TLBI	RVAE1, R3                          // 238608d5
+	TLBI	RVAAE1, R4                         // 648608d5
+	TLBI	RVALE1, R5                         // a58608d5
+	TLBI	RVAALE1, R6                        // e68608d5
+	TLBI	RIPAS2E1IS, R7                     // 47800cd5
+	TLBI	RIPAS2LE1IS, R8                    // c8800cd5
+	TLBI	VAE2OS, R9                         // 29810cd5
+	TLBI	VALE2OS, R10                       // aa810cd5
+	TLBI	RVAE2IS, R11                       // 2b820cd5
+	TLBI	RVALE2IS, R12                      // ac820cd5
+	TLBI	IPAS2E1OS, R13                     // 0d840cd5
+	TLBI	RIPAS2E1, R14                      // 4e840cd5
+	TLBI	RIPAS2E1OS, R15                    // 6f840cd5
+	TLBI	IPAS2LE1OS, R16                    // 90840cd5
+	TLBI	RIPAS2LE1, R17                     // d1840cd5
+	TLBI	RIPAS2LE1OS, ZR                    // ff840cd5
+	TLBI	RVAE2OS, R19                       // 33850cd5
+	TLBI	RVALE2OS, R20                      // b4850cd5
+	TLBI	RVAE2, R21                         // 35860cd5
+	TLBI	RVALE2, R22                        // b6860cd5
+	TLBI	VAE3OS, R23                        // 37810ed5
+	TLBI	VALE3OS, R24                       // b8810ed5
+	TLBI	RVAE3IS, R25                       // 39820ed5
+	TLBI	RVALE3IS, R26                      // ba820ed5
+	TLBI	RVAE3OS, R27                       // 3b850ed5
+	TLBI	RVALE3OS, ZR                       // bf850ed5
+	TLBI	RVAE3, R29                         // 3d860ed5
+	TLBI	RVALE3, R30                        // be860ed5
+
+// DC instruction
+	DC	IVAC, R0                           // 207608d5
+	DC	ISW, R1                            // 417608d5
+	DC	CSW, R2                            // 427a08d5
+	DC	CISW, R3                           // 437e08d5
+	DC	ZVA, R4                            // 24740bd5
+	DC	CVAC, R5                           // 257a0bd5
+	DC	CVAU, R6                           // 267b0bd5
+	DC	CIVAC, R7                          // 277e0bd5
+	DC	IGVAC, R8                          // 687608d5
+	DC	IGSW, R9                           // 897608d5
+	DC	IGDVAC, R10                        // aa7608d5
+	DC	IGDSW, R11                         // cb7608d5
+	DC	CGSW, R12                          // 8c7a08d5
+	DC	CGDSW, R13                         // cd7a08d5
+	DC	CIGSW, R14                         // 8e7e08d5
+	DC	CIGDSW, R15                        // cf7e08d5
+	DC	GVA, R16                           // 70740bd5
+	DC	GZVA, R17                          // 91740bd5
+	DC	CGVAC, ZR                          // 7f7a0bd5
+	DC	CGDVAC, R19                        // b37a0bd5
+	DC	CGVAP, R20                         // 747c0bd5
+	DC	CGDVAP, R21                        // b57c0bd5
+	DC	CGVADP, R22                        // 767d0bd5
+	DC	CGDVADP, R23                       // b77d0bd5
+	DC	CIGVAC, R24                        // 787e0bd5
+	DC	CIGDVAC, R25                       // b97e0bd5
+	DC	CVAP, R26                          // 3a7c0bd5
+	DC	CVADP, R27                         // 3b7d0bd5
 	END
diff --git a/src/cmd/asm/internal/asm/testdata/arm64enc.s b/src/cmd/asm/internal/asm/testdata/arm64enc.s
index a298628..eff48ae 100644
--- a/src/cmd/asm/internal/asm/testdata/arm64enc.s
+++ b/src/cmd/asm/internal/asm/testdata/arm64enc.s
@@ -134,7 +134,7 @@
    CSINV LO, R2, R11, R14                     // 4e308bda
    CSNEGW HS, R16, R29, R10                   // 0a269d5a
    CSNEG NE, R21, R19, R11                    // ab1693da
-   //TODO DC
+   DC IVAC, R1                                // 217608d5
    DCPS1 $11378                               // 418ea5d4
    DCPS2 $10699                               // 6239a5d4
    DCPS3 $24415                               // e3ebabd4
@@ -397,7 +397,7 @@
    SXTH R17, R25                              // 393e4093
    SXTW R0, R27                               // 1b7c4093
    SYSL $285440, R12                          // 0c5b2cd5
-   //TODO TLBI
+   TLBI VAE1IS, R1                            // 218308d5
    TSTW $0x80000007, R9                       // TSTW $2147483655, R9          // 3f0d0172
    TST $0xfffffff0, LR                        // TST $4294967280, R30          // df6f7cf2
    TSTW R10@>21, R2                           // 5f54ca6a
diff --git a/src/cmd/asm/internal/asm/testdata/arm64error.s b/src/cmd/asm/internal/asm/testdata/arm64error.s
index 3d3de1d..52f01e1 100644
--- a/src/cmd/asm/internal/asm/testdata/arm64error.s
+++ b/src/cmd/asm/internal/asm/testdata/arm64error.s
@@ -417,8 +417,8 @@
 	CASPD	(R2, R4), (R2), (R8, R9)                         // ERROR "source register pair must be contiguous"
 	CASPD	(R2, R3), (R2), (R8, R10)                        // ERROR "destination register pair must be contiguous"
 	ADD	R1>>2, RSP, R3                                   // ERROR "illegal combination"
-	ADDS	R2<<3, R3, RSP                                   // ERROR "unexpected SP reference"
-	CMP	R1<<5, RSP                                       // ERROR "the left shift amount out of range 0 to 4"
+	ADDS	R2<<3, R3, RSP                                   // ERROR "illegal destination register"
+	CMP	R1<<5, RSP                                       // ERROR "shift amount out of range 0 to 4"
 	MOVD.P	y+8(FP), R1                                      // ERROR "illegal combination"
 	MOVD.W	x-8(SP), R1                                      // ERROR "illegal combination"
 	LDP.P	x+8(FP), (R0, R1)                                // ERROR "illegal combination"
@@ -432,4 +432,14 @@
 	STP	(R26, R27), 700(R2)                              // ERROR "cannot use REGTMP as source"
 	MOVK	$0, R10                                          // ERROR "zero shifts cannot be handled correctly"
 	MOVK	$(0<<32), R10                                    // ERROR "zero shifts cannot be handled correctly"
+	TLBI	PLDL1KEEP                                        // ERROR "illegal argument"
+	TLBI	VMALLE1IS, R0                                    // ERROR "extraneous register at operand 2"
+	TLBI	ALLE3OS, ZR                                      // ERROR "extraneous register at operand 2"
+	TLBI	VAE1IS                                           // ERROR "missing register at operand 2"
+	TLBI	RVALE3                                           // ERROR "missing register at operand 2"
+	DC	PLDL1KEEP                                        // ERROR "illegal argument"
+	DC	VMALLE1IS                                        // ERROR "illegal argument"
+	DC	VAE1IS                                           // ERROR "illegal argument"
+	DC	VAE1IS, R0                                       // ERROR "illegal argument"
+	DC	IVAC                                             // ERROR "missing register at operand 2"
 	RET
diff --git a/src/cmd/asm/internal/asm/testdata/loong64.s b/src/cmd/asm/internal/asm/testdata/loong64.s
new file mode 100644
index 0000000..133cf48
--- /dev/null
+++ b/src/cmd/asm/internal/asm/testdata/loong64.s
@@ -0,0 +1,11 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "../../../../../runtime/textflag.h"
+// TODO: cover more instruction
+
+TEXT foo(SB),DUPOK|NOSPLIT,$0
+	JAL	1(PC)	//CALL 1(PC)	//000c0054
+	JAL	(R4)	//CALL (R4)	//8100004c
+	JAL	foo(SB)	//CALL foo(SB)	//00100054
diff --git a/src/cmd/asm/internal/asm/testdata/loong64enc1.s b/src/cmd/asm/internal/asm/testdata/loong64enc1.s
new file mode 100644
index 0000000..56eb244
--- /dev/null
+++ b/src/cmd/asm/internal/asm/testdata/loong64enc1.s
@@ -0,0 +1,209 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "../../../../../runtime/textflag.h"
+
+TEXT asmtest(SB),DUPOK|NOSPLIT,$0
+lable1:
+	BFPT	1(PC)			// 00050048
+	BFPT	lable1	// BFPT 2	//1ffdff4b
+
+lable2:
+	BFPF	1(PC)			// 00040048
+	BFPF	lable2	// BFPF 4 	// 1ffcff4b
+
+	JMP	foo(SB)			// 00100050
+	JMP	(R4)			// 8000004c
+	JMP	1(PC)			// 00040058
+	MOVW	$65536, R4		// 04020014
+	MOVW	$4096, R4		// 24000014
+	MOVV	$65536, R4		// 04020014
+	MOVV	$4096, R4		// 24000014
+	MOVW	R4, R5			// 85001700
+	MOVV	R4, R5			// 85001500
+	MOVBU	R4, R5			// 85fc4303
+	SUB	R4, R5, R6		// a6101100
+	SUBV	R4, R5, R6		// a6901100
+	ADD	R4, R5, R6		// a6101000
+	ADDV	R4, R5, R6		// a6901000
+	AND	R4, R5, R6		// a6901400
+	SUB	R4, R5			// a5101100
+	SUBV	R4, R5			// a5901100
+	ADD	R4, R5			// a5101000
+	ADDV	R4, R5			// a5901000
+	AND	R4, R5			// a5901400
+	NEGW	R4, R5			// 05101100
+	NEGV	R4, R5			// 05901100
+	SLL	R4, R5			// a5101700
+	SLL	R4, R5, R6		// a6101700
+	SRL	R4, R5			// a5901700
+	SRL	R4, R5, R6	 	// a6901700
+	SRA	R4, R5			// a5101800
+	SRA	R4, R5, R6	 	// a6101800
+	SLLV	R4, R5			// a5901800
+	SLLV	R4, R5, R6		// a6901800
+	CLO	R4, R5			// 85100000
+	CLZ	R4, R5			// 85140000
+	ADDF	F4, F5			// a5900001
+	ADDF	F4, R5, F6		// a6900001
+	CMPEQF	F4, R5			// a010120c
+	ABSF	F4, F5			// 85041401
+	MOVVF	F4, F5			// 85181d01
+	MOVF	F4, F5			// 85941401
+	MOVD	F4, F5			// 85981401
+	MOVW	R4, result+16(FP)	// 64608029
+	MOVWU	R4, result+16(FP)	// 64608029
+	MOVV	R4, result+16(FP)	// 6460c029
+	MOVB	R4, result+16(FP)	// 64600029
+	MOVBU	R4, result+16(FP)	// 64600029
+	MOVWL	R4, result+16(FP)	// 6460002f
+	MOVVL	R4, result+16(FP)	// 6460802f
+	MOVW	R4, 1(R5)		// a4048029
+	MOVWU	R4, 1(R5)		// a4048029
+	MOVV	R4, 1(R5)		// a404c029
+	MOVB	R4, 1(R5)		// a4040029
+	MOVBU	R4, 1(R5)		// a4040029
+	MOVWL	R4, 1(R5)		// a404002f
+	MOVVL	R4, 1(R5)		// a404802f
+	SC	R4, 1(R5)		// a4040021
+	SCV	R4, 1(R5)		// a4040023
+	MOVW	y+8(FP), R4		// 64408028
+	MOVWU	y+8(FP), R4		// 6440802a
+	MOVV	y+8(FP), R4		// 6440c028
+	MOVB	y+8(FP), R4		// 64400028
+	MOVBU	y+8(FP), R4		// 6440002a
+	MOVWL	y+8(FP), R4		// 6440002e
+	MOVVL	y+8(FP), R4		// 6440802e
+	MOVW	1(R5), R4		// a4048028
+	MOVWU	1(R5), R4		// a404802a
+	MOVV	1(R5), R4		// a404c028
+	MOVB	1(R5), R4		// a4040028
+	MOVBU	1(R5), R4		// a404002a
+	MOVWL	1(R5), R4		// a404002e
+	MOVVL	1(R5), R4		// a404802e
+	LL	1(R5), R4		// a4040020
+	LLV	1(R5), R4		// a4040022
+	MOVW	$4(R4), R5		// 8510c002
+	MOVV	$4(R4), R5		// 8510c002
+	MOVW	$-1, R4			// 04fcff02
+	MOVV	$-1, R4			// 04fcff02
+	MOVW	$1, R4			// 0404c002
+	MOVV	$1, R4			// 0404c002
+	ADD	$-1, R4, R5		// 85fcbf02
+	ADD	$-1, R4			// 84fcbf02
+	ADDV	$-1, R4, R5		// 85fcff02
+	ADDV	$-1, R4			// 84fcff02
+	AND	$1, R4, R5		// 85044003
+	AND	$1, R4			// 84044003
+	SLL	$4, R4, R5		// 85904000
+	SLL	$4, R4			// 84904000
+	SRL	$4, R4, R5		// 85904400
+	SRL	$4, R4			// 84904400
+	SRA	$4, R4, R5		// 85904800
+	SRA	$4, R4			// 84904800
+	SLLV	$4, R4, R5		// 85104100
+	SLLV	$4, R4			// 84104100
+	SYSCALL				// 00002b00
+	BEQ	R4, R5, 1(PC)		// 85040058
+	BEQ	R4, 1(PC)		// 80040058
+	BLTU	R4, 1(PC)		// 80040068
+	MOVW	y+8(FP), F4		// 6440002b
+	MOVF	y+8(FP), F4		// 6440002b
+	MOVD	y+8(FP), F4		// 6440802b
+	MOVW	1(F5), F4		// a404002b
+	MOVF	1(F5), F4		// a404002b
+	MOVD	1(F5), F4		// a404802b
+	MOVW	F4, result+16(FP)	// 6460402b
+	MOVF	F4, result+16(FP)	// 6460402b
+	MOVD	F4, result+16(FP)	// 6460c02b
+	MOVW	F4, 1(F5)		// a404402b
+	MOVF	F4, 1(F5)		// a404402b
+	MOVD	F4, 1(F5)		// a404c02b
+	MOVW	R4, F5			// 85a41401
+	MOVW	F4, R5			// 85b41401
+	MOVV	R4, F5			// 85a81401
+	MOVV	F4, R5			// 85b81401
+	WORD	$74565			// 45230100
+	BREAK	R4, result+16(FP)	// 64600006
+	BREAK	R4, 1(R5)		// a4040006
+	BREAK				// 00002a00
+	UNDEF				// 00002a00
+
+	// mul
+	MUL	R4, R5	  		// a5101c00
+	MUL	R4, R5, R6	  	// a6101c00
+	MULV	R4, R5	   		// a5901d00
+	MULV	R4, R5, R6	   	// a6901d00
+	MULVU	R4, R5			// a5901d00
+	MULVU	R4, R5, R6		// a6901d00
+	MULHV	R4, R5			// a5101e00
+	MULHV	R4, R5, R6		// a6101e00
+	MULHVU	R4, R5			// a5901e00
+	MULHVU	R4, R5, R6	 	// a6901e00
+	REMV	R4, R5	   		// a5902200
+	REMV	R4, R5, R6	   	// a6902200
+	REMVU	R4, R5			// a5902300
+	REMVU	R4, R5, R6		// a6902300
+	DIVV	R4, R5			// a5102200
+	DIVV	R4, R5, R6	   	// a6102200
+	DIVVU	R4, R5	 		// a5102300
+	DIVVU	R4, R5, R6		// a6102300
+
+	MOVH	R4, result+16(FP)	// 64604029
+	MOVH	R4, 1(R5)		// a4044029
+	MOVH	y+8(FP), R4		// 64404028
+	MOVH	1(R5), R4		// a4044028
+	MOVHU	R4, R5			// 8500cf00
+	MOVHU	R4, result+16(FP)	// 64604029
+	MOVHU	R4, 1(R5)		// a4044029
+	MOVHU	y+8(FP), R4		// 6440402a
+	MOVHU	1(R5), R4		// a404402a
+	MULU	R4, R5	   		// a5101c00
+	MULU	R4, R5, R6		// a6101c00
+	MULH	R4, R5	   		// a5901c00
+	MULH	R4, R5, R6	   	// a6901c00
+	MULHU	R4, R5			// a5101d00
+	MULHU	R4, R5, R6		// a6101d00
+	REM	R4, R5	  		// a5902000
+	REM	R4, R5, R6	  	// a6902000
+	REMU	R4, R5	   		// a5902100
+	REMU	R4, R5, R6	   	// a6902100
+	DIV	R4, R5	  		// a5102000
+	DIV	R4, R5, R6	  	// a6102000
+	DIVU	R4, R5	   		// a5102100
+	DIVU	R4, R5, R6	   	// a6102100
+	SRLV	R4, R5 			// a5101900
+	SRLV	R4, R5, R6 		// a6101900
+	SRLV	$4, R4, R5		// 85104500
+	SRLV	$4, R4			// 84104500
+	SRLV	$32, R4, R5 		// 85804500
+	SRLV	$32, R4			// 84804500
+
+	MOVFD	F4, F5			// 85241901
+	MOVDF	F4, F5			// 85181901
+	MOVWF	F4, F5			// 85101d01
+	MOVFW	F4, F5			// 85041b01
+	MOVWD	F4, F5			// 85201d01
+	MOVDW	F4, F5			// 85081b01
+	NEGF	F4, F5			// 85141401
+	NEGD	F4, F5			// 85181401
+	ABSD	F4, F5			// 85081401
+	TRUNCDW	F4, F5			// 85881a01
+	TRUNCFW	F4, F5			// 85841a01
+	SQRTF	F4, F5			// 85441401
+	SQRTD	F4, F5			// 85481401
+
+	DBAR	 			// 00007238
+	NOOP	 			// 00004003
+
+	MOVWR	R4, result+16(FP) 	// 6460402f
+	MOVWR	R4, 1(R5) 		// a404402f
+	MOVWR	y+8(FP), R4 		// 6440402e
+	MOVWR	1(R5), R4 		// a404402e
+
+	CMPGTF	F4, R5 			// a090110c
+	CMPGTD	F4, R5 			// a090210c
+	CMPGEF	F4, R5			// a090130c
+	CMPGED	F4, R5			// a090230c
+	CMPEQD	F4, R5			// a010220c
diff --git a/src/cmd/asm/internal/asm/testdata/loong64enc2.s b/src/cmd/asm/internal/asm/testdata/loong64enc2.s
new file mode 100644
index 0000000..3b5e3cb
--- /dev/null
+++ b/src/cmd/asm/internal/asm/testdata/loong64enc2.s
@@ -0,0 +1,82 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "../../../../../runtime/textflag.h"
+
+TEXT asmtest(SB),DUPOK|NOSPLIT,$0
+	MOVB	R4, R5			// 85e04000a5e04800
+	MOVWU	R4, R5			// 85804100a5804500
+	MOVW	$74565, R4		// 4402001484148d03
+	MOVW	$4097, R4		// 2400001484048003
+	MOVV	$74565, R4		// 4402001484148d03
+	MOVV	$4097, R4		// 2400001484048003
+	AND	$-1, R4, R5		// 1efcbf0285f81400
+	AND	$-1, R4			// 1efcbf0284f81400
+	MOVW	$-1, F4			// 1efcbf02c4a71401
+	MOVW	$1, F4			// 1e048002c4a71401
+	TEQ	$4, R4, R5		// 8508005c04002a00
+	TEQ	$4, R4			// 0408005c04002a00
+	TNE	$4, R4, R5		// 8508005804002a00
+	TNE	$4, R4			// 0408005804002a00
+	ADD	$65536, R4, R5		// 1e02001485781000
+	ADD	$4096, R4, R5		// 3e00001485781000
+	ADD	$65536, R4		// 1e02001484781000
+	ADD	$4096, R4		// 3e00001484781000
+	ADDV	$65536, R4, R5		// 1e02001485f81000
+	ADDV	$4096, R4, R5		// 3e00001485f81000
+	ADDV	$65536, R4		// 1e02001484f81000
+	ADDV	$4096, R4		// 3e00001484f81000
+	AND	$65536, R4, R5		// 1e02001485f81400
+	AND	$4096, R4, R5		// 3e00001485f81400
+	AND	$65536, R4		// 1e02001484f81400
+	AND	$4096, R4		// 3e00001484f81400
+	SGT	$65536, R4, R5		// 1e02001485781200
+	SGT	$4096, R4, R5		// 3e00001485781200
+	SGT	$65536, R4		// 1e02001484781200
+	SGT	$4096, R4		// 3e00001484781200
+	SGTU	$65536, R4, R5		// 1e02001485f81200
+	SGTU	$4096, R4, R5		// 3e00001485f81200
+	SGTU	$65536, R4		// 1e02001484f81200
+	SGTU	$4096, R4		// 3e00001484f81200
+	ADDU	$65536, R4, R5		// 1e02001485781000
+	ADDU	$4096, R4, R5		// 3e00001485781000
+	ADDU	$65536, R4		// 1e02001484781000
+	ADDU	$4096, R4		// 3e00001484781000
+	ADDVU	$65536, R4, R5		// 1e02001485f81000
+	ADDVU	$4096, R4, R5		// 3e00001485f81000
+	ADDVU	$65536, R4		// 1e02001484f81000
+	ADDVU	$4096, R4		// 3e00001484f81000
+	OR	$65536, R4, R5		// 1e02001485781500
+	OR	$4096, R4, R5		// 3e00001485781500
+	OR	$65536, R4		// 1e02001484781500
+	OR	$4096, R4		// 3e00001484781500
+	OR	$-1, R4, R5		// 1efcbf0285781500
+	OR	$-1, R4			// 1efcbf0284781500
+	XOR	$65536, R4, R5		// 1e02001485f81500
+	XOR	$4096, R4, R5		// 3e00001485f81500
+	XOR	$65536, R4		// 1e02001484f81500
+	XOR	$4096, R4		// 3e00001484f81500
+	XOR	$-1, R4, R5		// 1efcbf0285f81500
+	XOR	$-1, R4			// 1efcbf0284f81500
+	MOVH	R4, R5			// 85c04000a5c04800
+
+	// relocation	instructions
+	MOVW	R4, name(SB)		// 1e00001cc4038029
+	MOVWU	R4, name(SB)		// 1e00001cc4038029
+	MOVV	R4, name(SB)		// 1e00001cc403c029
+	MOVB	R4, name(SB)		// 1e00001cc4030029
+	MOVBU	R4, name(SB)		// 1e00001cc4030029
+	MOVF	F4, name(SB)		// 1e00001cc403402b
+	MOVD	F4, name(SB)		// 1e00001cc403c02b
+	MOVW	name(SB), R4		// 1e00001cc4038028
+	MOVWU	name(SB), R4		// 1e00001cc403802a
+	MOVV	name(SB), R4		// 1e00001cc403c028
+	MOVB	name(SB), R4		// 1e00001cc4030028
+	MOVBU	name(SB), R4		// 1e00001cc403002a
+	MOVF	name(SB), F4		// 1e00001cc403002b
+	MOVD	name(SB), F4		// 1e00001cc403802b
+	MOVH	R4, name(SB)		// 1e00001cc4034029
+	MOVH	name(SB), R4		// 1e00001cc4034028
+	MOVHU	R4, name(SB)		// 1e00001cc4034029
+	MOVHU	name(SB), R4		// 1e00001cc403402a
diff --git a/src/cmd/asm/internal/asm/testdata/loong64enc3.s b/src/cmd/asm/internal/asm/testdata/loong64enc3.s
new file mode 100644
index 0000000..eceb0d7
--- /dev/null
+++ b/src/cmd/asm/internal/asm/testdata/loong64enc3.s
@@ -0,0 +1,131 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "../../../../../runtime/textflag.h"
+
+TEXT asmtest(SB),DUPOK|NOSPLIT,$0
+	MOVW	$65536(R4), R5			// 1e020014de03800385f81000
+	MOVW	$4096(R4), R5 			// 3e000014de03800385f81000
+	MOVV	$65536(R4), R5			// 1e020014de03800385f81000
+	MOVV	$4096(R4), R5			// 3e000014de03800385f81000
+	ADD	$74565, R4			// 5e020014de178d0384781000
+	ADD	$4097, R4  			// 3e000014de07800384781000
+	ADDV	$74565, R4			// 5e020014de178d0384f81000
+	ADDV	$4097, R4 			// 3e000014de07800384f81000
+	AND	$74565, R4			// 5e020014de178d0384f81400
+	AND	$4097, R4 		 	// 3e000014de07800384f81400
+	ADD	$74565, R4, R5			// 5e020014de178d0385781000
+	ADD	$4097, R4, R5  			// 3e000014de07800385781000
+	ADDV	$74565, R4, R5			// 5e020014de178d0385f81000
+	ADDV	$4097, R4, R5 			// 3e000014de07800385f81000
+	AND	$74565, R4, R5			// 5e020014de178d0385f81400
+	AND	$4097, R4, R5			// 3e000014de07800385f81400
+
+	MOVW	R4, result+65540(FP)		// 1e020014de8f1000c4338029
+	MOVW	R4, result+4097(FP)   		// 3e000014de8f1000c4278029
+	MOVWU	R4, result+65540(FP)		// 1e020014de8f1000c4338029
+	MOVWU	R4, result+4097(FP)  		// 3e000014de8f1000c4278029
+	MOVV	R4, result+65540(FP)		// 1e020014de8f1000c433c029
+	MOVV	R4, result+4097(FP)   		// 3e000014de8f1000c427c029
+	MOVB	R4, result+65540(FP)		// 1e020014de8f1000c4330029
+	MOVB	R4, result+4097(FP)   		// 3e000014de8f1000c4270029
+	MOVBU	R4, result+65540(FP)		// 1e020014de8f1000c4330029
+	MOVBU	R4, result+4097(FP)		// 3e000014de8f1000c4270029
+	MOVW	R4, 65536(R5)			// 1e020014de971000c4038029
+	MOVW	R4, 4096(R5)  			// 3e000014de971000c4038029
+	MOVWU	R4, 65536(R5)			// 1e020014de971000c4038029
+	MOVWU	R4, 4096(R5)			// 3e000014de971000c4038029
+	MOVV	R4, 65536(R5)			// 1e020014de971000c403c029
+	MOVV	R4, 4096(R5)			// 3e000014de971000c403c029
+	MOVB	R4, 65536(R5)			// 1e020014de971000c4030029
+	MOVB	R4, 4096(R5)			// 3e000014de971000c4030029
+	MOVBU	R4, 65536(R5)			// 1e020014de971000c4030029
+	MOVBU	R4, 4096(R5)			// 3e000014de971000c4030029
+	SC	R4, 65536(R5)			// 1e020014de971000c4030021
+	SC	R4, 4096(R5)	   		// 3e000014de971000c4030021
+	MOVW	y+65540(FP), R4			// 1e020014de8f1000c4338028
+	MOVWU	y+65540(FP), R4			// 1e020014de8f1000c433802a
+	MOVV	y+65540(FP), R4			// 1e020014de8f1000c433c028
+	MOVB	y+65540(FP), R4			// 1e020014de8f1000c4330028
+	MOVBU	y+65540(FP), R4			// 1e020014de8f1000c433002a
+	MOVW	y+4097(FP), R4			// 3e000014de8f1000c4278028
+	MOVWU	y+4097(FP), R4			// 3e000014de8f1000c427802a
+	MOVV	y+4097(FP), R4			// 3e000014de8f1000c427c028
+	MOVB	y+4097(FP), R4			// 3e000014de8f1000c4270028
+	MOVBU	y+4097(FP), R4			// 3e000014de8f1000c427002a
+	MOVW	65536(R5), R4			// 1e020014de971000c4038028
+	MOVWU	65536(R5), R4			// 1e020014de971000c403802a
+	MOVV	65536(R5), R4			// 1e020014de971000c403c028
+	MOVB	65536(R5), R4			// 1e020014de971000c4030028
+	MOVBU	65536(R5), R4			// 1e020014de971000c403002a
+	MOVW	4096(R5), R4			// 3e000014de971000c4038028
+	MOVWU	4096(R5), R4			// 3e000014de971000c403802a
+	MOVV	4096(R5), R4			// 3e000014de971000c403c028
+	MOVB	4096(R5), R4			// 3e000014de971000c4030028
+	MOVBU	4096(R5), R4			// 3e000014de971000c403002a
+	MOVW	y+65540(FP), F4			// 1e020014de8f1000c433002b
+	MOVF	y+65540(FP), F4			// 1e020014de8f1000c433002b
+	MOVD	y+65540(FP), F4			// 1e020014de8f1000c433802b
+	MOVW	y+4097(FP), F4			// 3e000014de8f1000c427002b
+	MOVF	y+4097(FP), F4			// 3e000014de8f1000c427002b
+	MOVD	y+4097(FP), F4			// 3e000014de8f1000c427802b
+	MOVW	65536(R5), F4			// 1e020014de971000c403002b
+	MOVF	65536(R5), F4			// 1e020014de971000c403002b
+	MOVD	65536(R5), F4			// 1e020014de971000c403802b
+	MOVW	4096(R5), F4			// 3e000014de971000c403002b
+	MOVF	4096(R5), F4			// 3e000014de971000c403002b
+	MOVD	4096(R5), F4			// 3e000014de971000c403802b
+	MOVW	F4, result+65540(FP)		// 1e020014de8f1000c433402b
+	MOVF	F4, result+65540(FP)		// 1e020014de8f1000c433402b
+	MOVD	F4, result+65540(FP)		// 1e020014de8f1000c433c02b
+	MOVW	F4, result+4097(FP)		// 3e000014de8f1000c427402b
+	MOVF	F4, result+4097(FP)		// 3e000014de8f1000c427402b
+	MOVD	F4, result+4097(FP)		// 3e000014de8f1000c427c02b
+	MOVW	F4, 65536(R5)			// 1e020014de971000c403402b
+	MOVF	F4, 65536(R5)			// 1e020014de971000c403402b
+	MOVD	F4, 65536(R5)			// 1e020014de971000c403c02b
+	MOVW	F4, 4096(R5)			// 3e000014de971000c403402b
+	MOVF	F4, 4096(R5)			// 3e000014de971000c403402b
+	MOVD	F4, 4096(R5)			// 3e000014de971000c403c02b
+
+	MOVH	R4, result+65540(FP)		// 1e020014de8f1000c4334029
+	MOVH	R4, 65536(R5)			// 1e020014de971000c4034029
+	MOVH	y+65540(FP), R4			// 1e020014de8f1000c4334028
+	MOVH	65536(R5), R4			// 1e020014de971000c4034028
+	MOVH	R4, result+4097(FP)		// 3e000014de8f1000c4274029
+	MOVH	R4, 4096(R5)			// 3e000014de971000c4034029
+	MOVH	y+4097(FP), R4			// 3e000014de8f1000c4274028
+	MOVH	4096(R5), R4			// 3e000014de971000c4034028
+	MOVHU	R4, result+65540(FP)		// 1e020014de8f1000c4334029
+	MOVHU	R4, 65536(R5)			// 1e020014de971000c4034029
+	MOVHU	y+65540(FP), R4			// 1e020014de8f1000c433402a
+	MOVHU	65536(R5), R4			// 1e020014de971000c403402a
+	MOVHU	R4, result+4097(FP)		// 3e000014de8f1000c4274029
+	MOVHU	R4, 4096(R5)			// 3e000014de971000c4034029
+	MOVHU	y+4097(FP), R4 			// 3e000014de8f1000c427402a
+	MOVHU	4096(R5), R4			// 3e000014de971000c403402a
+	SGT	$74565, R4 			// 5e020014de178d0384781200
+	SGT	$74565, R4, R5 			// 5e020014de178d0385781200
+	SGT	$4097, R4 			// 3e000014de07800384781200
+	SGT	$4097, R4, R5 			// 3e000014de07800385781200
+	SGTU	$74565, R4 			// 5e020014de178d0384f81200
+	SGTU	$74565, R4, R5 			// 5e020014de178d0385f81200
+	SGTU	$4097, R4 			// 3e000014de07800384f81200
+	SGTU	$4097, R4, R5 			// 3e000014de07800385f81200
+	ADDU	$74565, R4 			// 5e020014de178d0384781000
+	ADDU	$74565, R4, R5 			// 5e020014de178d0385781000
+	ADDU	$4097, R4 			// 3e000014de07800384781000
+	ADDU	$4097, R4, R5 			// 3e000014de07800385781000
+	ADDVU	$4097, R4			// 3e000014de07800384f81000
+	ADDVU	$4097, R4, R5 			// 3e000014de07800385f81000
+	ADDVU	$74565, R4			// 5e020014de178d0384f81000
+	ADDVU	$74565, R4, R5			// 5e020014de178d0385f81000
+	OR	$74565, R4			// 5e020014de178d0384781500
+	OR	$74565, R4, R5			// 5e020014de178d0385781500
+	OR	$4097, R4			// 3e000014de07800384781500
+	OR	$4097, R4, R5			// 3e000014de07800385781500
+	XOR	$74565, R4			// 5e020014de178d0384f81500
+	XOR	$74565, R4, R5			// 5e020014de178d0385f81500
+	XOR	$4097, R4			// 3e000014de07800384f81500
+	XOR	$4097, R4, R5			// 3e000014de07800385f81500
diff --git a/src/cmd/asm/internal/asm/testdata/mips64.s b/src/cmd/asm/internal/asm/testdata/mips64.s
index 99044d8..8f628e2 100644
--- a/src/cmd/asm/internal/asm/testdata/mips64.s
+++ b/src/cmd/asm/internal/asm/testdata/mips64.s
@@ -21,9 +21,9 @@
 	BEQ	R1, 2(PC)
 	JMP	label0+0	// JMP 3	// 1000fffd
 	BEQ	R1, 2(PC)
-	JAL	1(PC)		// CALL 1(PC)	// 0c00000e
+	JAL	1(PC)		// CALL 1(PC)	// 0c00000f
 	BEQ	R1, 2(PC)
-	JAL	label0+0	// CALL 3	// 0c000006
+	JAL	label0+0	// CALL 3	// 0c000007
 
 //	LBRA addr
 //	{
@@ -32,11 +32,11 @@
 	BEQ	R1, 2(PC)
 	JMP	0(R1)		// JMP (R1)	// 00200008
 	BEQ	R1, 2(PC)
-	JMP	foo+0(SB)	// JMP foo(SB)	// 08000018
+	JMP	foo+0(SB)	// JMP foo(SB)	// 08000019
 	BEQ	R1, 2(PC)
 	JAL	0(R1)		// CALL (R1)	// 0020f809
 	BEQ	R1, 2(PC)
-	JAL	foo+0(SB)	// CALL foo(SB)	// 0c000020
+	JAL	foo+0(SB)	// CALL foo(SB)	// 0c000021
 
 //
 // BEQ/BNE
diff --git a/src/cmd/asm/internal/asm/testdata/ppc64.s b/src/cmd/asm/internal/asm/testdata/ppc64.s
index c140fd0..f307db3 100644
--- a/src/cmd/asm/internal/asm/testdata/ppc64.s
+++ b/src/cmd/asm/internal/asm/testdata/ppc64.s
@@ -24,7 +24,7 @@
 	MOVW $-32767, R5                // 38a08001
 	MOVW $-32768, R6                // 38c08000
 	MOVW $1234567, R5               // 6405001260a5d687
-	MOVD 8(R3), R4			// e8830008
+	MOVD 8(R3), R4                  // e8830008
 	MOVD (R3)(R4), R5               // 7ca4182a
 	MOVW 4(R3), R4                  // e8830006
 	MOVW (R3)(R4), R5               // 7ca41aaa
@@ -41,7 +41,7 @@
 	MOVDBR (R3)(R4), R5             // 7ca41c28
 	MOVWBR (R3)(R4), R5             // 7ca41c2c
 	MOVHBR (R3)(R4), R5             // 7ca41e2c
-	MOVD $foo+4009806848(FP), R5    // 3ca1ef0138a5cc20
+	MOVD $foo+4009806848(FP), R5    // 3ca1ef0138a5cc40
 	MOVD $foo(SB), R5               // 3ca0000038a50000
 
 	MOVDU 8(R3), R4                 // e8830009
@@ -79,14 +79,14 @@
 	MOVBU R4, 1(R3)                 // 9c830001
 	MOVBU R5, (R3)(R4)              // 7ca419ee
 
-	MOVB $0, R4			// 38800000
-	MOVBZ $0, R4			// 38800000
-	MOVH $0, R4			// 38800000
-	MOVHZ $0, R4			// 38800000
-	MOVW $0, R4			// 38800000
-	MOVWZ $0, R4			// 38800000
-	MOVD $0, R4			// 38800000
-	MOVD $0, R0			// 38000000
+	MOVB $0, R4                     // 38800000
+	MOVBZ $0, R4                    // 38800000
+	MOVH $0, R4                     // 38800000
+	MOVHZ $0, R4                    // 38800000
+	MOVW $0, R4                     // 38800000
+	MOVWZ $0, R4                    // 38800000
+	MOVD $0, R4                     // 38800000
+	MOVD $0, R0                     // 38000000
 
 	ADD $1, R3                      // 38630001
 	ADD $1, R3, R4                  // 38830001
@@ -351,11 +351,18 @@
 	CRORN CR0GT, CR0EQ, CR0SO       // 4c620b42
 	CRXOR CR0GT, CR0EQ, CR0SO       // 4c620982
 
-	ISEL $1, R3, R4, R5             // 7ca3205e
 	ISEL $0, R3, R4, R5             // 7ca3201e
+	ISEL $1, R3, R4, R5             // 7ca3205e
 	ISEL $2, R3, R4, R5             // 7ca3209e
 	ISEL $3, R3, R4, R5             // 7ca320de
 	ISEL $4, R3, R4, R5             // 7ca3211e
+	ISEL $31, R3, R4, R5            // 7ca327de
+	ISEL CR0LT, R3, R4, R5          // 7ca3201e
+	ISEL CR0GT, R3, R4, R5          // 7ca3205e
+	ISEL CR0EQ, R3, R4, R5          // 7ca3209e
+	ISEL CR0SO, R3, R4, R5          // 7ca320de
+	ISEL CR1LT, R3, R4, R5          // 7ca3211e
+	ISEL CR7SO, R3, R4, R5          // 7ca327de
 	POPCNTB R3, R4                  // 7c6400f4
 	POPCNTW R3, R4                  // 7c6402f4
 	POPCNTD R3, R4                  // 7c6403f4
@@ -751,17 +758,65 @@
 	MOVD XER, R3                    // 7c6102a6
 	MOVFL CR3, CR1                  // 4c8c0000
 
-	MOVW CR0, R1			// 7c380026
-	MOVW CR7, R1			// 7c301026
-	MOVW CR, R1			// 7c200026
+	MOVW CR0, R1                    // 7c380026
+	MOVW CR7, R1                    // 7c301026
+	MOVW CR, R1                     // 7c200026
 
-	MOVW R1, CR			// 7c2ff120
-	MOVFL R1, CR			// 7c2ff120
-	MOVW R1, CR2			// 7c320120
-	MOVFL R1, CR2			// 7c320120
-	MOVFL R1, $255			// 7c2ff120
-	MOVFL R1, $1			// 7c301120
-	MOVFL R1, $128			// 7c380120
-	MOVFL R1, $3			// 7c203120
+	MOVW R1, CR                     // 7c2ff120
+	MOVFL R1, CR                    // 7c2ff120
+	MOVW R1, CR2                    // 7c320120
+	MOVFL R1, CR2                   // 7c320120
+	MOVFL R1, $255                  // 7c2ff120
+	MOVFL R1, $1                    // 7c301120
+	MOVFL R1, $128                  // 7c380120
+	MOVFL R1, $3                    // 7c203120
+
+	// Verify supported bdnz/bdz encodings.
+	BC 16,0,0(PC)                   // BC $16, CR0LT, 0(PC) // 42000000
+	BDNZ 0(PC)                      // 42000000
+	BDZ 0(PC)                       // 42400000
+	BC 18,0,0(PC)                   // BC $18, CR0LT, 0(PC) // 42400000
+
+	// Verify the supported forms of bcclr[l]
+	BC $20,CR0LT,$1,LR              // 4e800820
+	BC $20,CR0LT,$0,LR              // 4e800020
+	BC $20,CR0LT,LR                 // 4e800020
+	BC $20,CR0GT,LR                 // 4e810020
+	BC 20,CR0LT,LR                  // BC $20,CR0LT,LR // 4e800020
+	BC 20,undefined_symbol,LR       // BC $20,CR0LT,LR // 4e800020
+	BC 20,undefined_symbol+1,LR     // BC $20,CR0GT,LR // 4e810020
+	JMP LR                          // 4e800020
+	BR LR                           // JMP LR // 4e800020
+	BCL $20,CR0LT,$1,LR             // 4e800821
+	BCL $20,CR0LT,$0,LR             // 4e800021
+	BCL $20,CR0LT,LR                // 4e800021
+	BCL $20,CR0GT,LR                // 4e810021
+	BCL 20,CR0LT,LR                 // BCL $20,CR0LT,LR // 4e800021
+	BCL 20,undefined_symbol,LR      // BCL $20,CR0LT,LR // 4e800021
+	BCL 20,undefined_symbol+1,LR    // BCL $20,CR0GT,LR // 4e810021
+
+	// Verify the supported forms of bcctr[l]
+	BC $20,CR0LT,CTR                // 4e800420
+	BC $20,CR0GT,CTR                // 4e810420
+	BC 20,CR0LT,CTR                 // BC $20,CR0LT,CTR // 4e800420
+	BC 20,undefined_symbol,CTR      // BC $20,CR0LT,CTR // 4e800420
+	BC 20,undefined_symbol+1,CTR    // BC $20,CR0GT,CTR // 4e810420
+	JMP CTR                         // 4e800420
+	BR CTR                          // JMP CTR // 4e800420
+	BCL $20,CR0LT,CTR               // 4e800421
+	BCL $20,CR0GT,CTR               // 4e810421
+	BCL 20,CR0LT,CTR                // BCL $20,CR0LT,CTR // 4e800421
+	BCL 20,undefined_symbol,CTR     // BCL $20,CR0LT,CTR // 4e800421
+	BCL 20,undefined_symbol+1,CTR   // BCL $20,CR0GT,CTR // 4e810421
+
+	// Verify bc encoding (without pic enabled)
+	BC $16,CR0LT,0(PC)              // 42000000
+	BCL $16,CR0LT,0(PC)             // 42000001
+	BC $18,CR0LT,0(PC)              // 42400000
+
+	MOVD SPR(3), 4(R1)              // 7fe302a6fbe10004
+	MOVD XER, 4(R1)                 // 7fe102a6fbe10004
+	MOVD 4(R1), SPR(3)              // ebe100047fe303a6
+	MOVD 4(R1), XER                 // ebe100047fe103a6
 
 	RET
diff --git a/src/cmd/asm/internal/asm/testdata/riscv64.s b/src/cmd/asm/internal/asm/testdata/riscv64.s
index fe911a7..79d6054 100644
--- a/src/cmd/asm/internal/asm/testdata/riscv64.s
+++ b/src/cmd/asm/internal/asm/testdata/riscv64.s
@@ -145,6 +145,19 @@
 	SRLW	X5, X6, X7				// bb535300
 	SUBW	X5, X6, X7				// bb035340
 	SRAW	X5, X6, X7				// bb535340
+	ADDIW	$1, X6					// 1b031300
+	SLLIW	$1, X6					// 1b131300
+	SRLIW	$1, X6					// 1b531300
+	SRAIW	$1, X6					// 1b531340
+	ADDW	X5, X7					// bb835300
+	SLLW	X5, X7					// bb935300
+	SRLW	X5, X7					// bbd35300
+	SUBW	X5, X7					// bb835340
+	SRAW	X5, X7					// bbd35340
+	ADDW	$1, X6					// 1b031300
+	SLLW	$1, X6					// 1b131300
+	SRLW	$1, X6					// 1b531300
+	SRAW	$1, X6					// 1b531340
 
 	// 5.3: Load and Store Instructions (RV64I)
 	LD	(X5), X6				// 03b30200
diff --git a/src/cmd/asm/internal/asm/testdata/riscv64error.s b/src/cmd/asm/internal/asm/testdata/riscv64error.s
index 2385525..d3e43e7 100644
--- a/src/cmd/asm/internal/asm/testdata/riscv64error.s
+++ b/src/cmd/asm/internal/asm/testdata/riscv64error.s
@@ -22,5 +22,9 @@
 	MOVBU	X5, (X6)			// ERROR "unsupported unsigned store"
 	MOVHU	X5, (X6)			// ERROR "unsupported unsigned store"
 	MOVWU	X5, (X6)			// ERROR "unsupported unsigned store"
+	MOVF	F0, F1, F2			// ERROR "illegal MOV instruction"
+	MOVD	F0, F1, F2			// ERROR "illegal MOV instruction"
+	MOV	X10, X11, X12			// ERROR "illegal MOV instruction"
+	MOVW	X10, X11, X12			// ERROR "illegal MOV instruction"
 
 	RET
diff --git a/src/cmd/asm/internal/flags/flags.go b/src/cmd/asm/internal/flags/flags.go
index 607166e..1c8b908 100644
--- a/src/cmd/asm/internal/flags/flags.go
+++ b/src/cmd/asm/internal/flags/flags.go
@@ -6,6 +6,7 @@
 package flags
 
 import (
+	"cmd/internal/obj"
 	"cmd/internal/objabi"
 	"flag"
 	"fmt"
@@ -23,13 +24,14 @@
 	Linkshared       = flag.Bool("linkshared", false, "generate code that will be linked against Go shared libraries")
 	AllErrors        = flag.Bool("e", false, "no limit on number of errors reported")
 	SymABIs          = flag.Bool("gensymabis", false, "write symbol ABI information to output file, don't assemble")
-	Importpath       = flag.String("p", "", "set expected package import to path")
+	Importpath       = flag.String("p", obj.UnlinkablePkg, "set expected package import to path")
 	Spectre          = flag.String("spectre", "", "enable spectre mitigations in `list` (all, ret)")
 	CompilingRuntime = flag.Bool("compiling-runtime", false, "source to be compiled is part of the Go runtime")
 )
 
 var DebugFlags struct {
 	MayMoreStack string `help:"call named function before all stack growth checks"`
+	PCTab        string `help:"print named pc-value table\nOne of: pctospadj, pctofile, pctoline, pctoinline, pctopcdata"`
 }
 
 var (
diff --git a/src/cmd/asm/internal/lex/input.go b/src/cmd/asm/internal/lex/input.go
index e373ae8..276b4b0 100644
--- a/src/cmd/asm/internal/lex/input.go
+++ b/src/cmd/asm/internal/lex/input.go
@@ -50,7 +50,7 @@
 	// Set macros for GOEXPERIMENTs so we can easily switch
 	// runtime assembly code based on them.
 	if *flags.CompilingRuntime {
-		for _, exp := range buildcfg.EnabledExperiments() {
+		for _, exp := range buildcfg.Experiment.Enabled() {
 			// Define macro.
 			name := "GOEXPERIMENT_" + exp
 			macros[name] = &Macro{
diff --git a/src/cmd/asm/internal/lex/tokenizer.go b/src/cmd/asm/internal/lex/tokenizer.go
index 861a2d4..4db88e2 100644
--- a/src/cmd/asm/internal/lex/tokenizer.go
+++ b/src/cmd/asm/internal/lex/tokenizer.go
@@ -109,7 +109,7 @@
 		}
 		text := s.TokenText()
 		t.line += strings.Count(text, "\n")
-		// TODO: Use constraint.IsGoBuild once it exists.
+		// TODO: Use constraint.IsGoBuild once #44505 fixed.
 		if strings.HasPrefix(text, "//go:build") {
 			t.tok = BuildComment
 			break
diff --git a/src/cmd/asm/main.go b/src/cmd/asm/main.go
index 3683527..6a25fd4 100644
--- a/src/cmd/asm/main.go
+++ b/src/cmd/asm/main.go
@@ -43,6 +43,7 @@
 	ctxt.Flag_linkshared = *flags.Linkshared
 	ctxt.Flag_shared = *flags.Shared || *flags.Dynlink
 	ctxt.Flag_maymorestack = flags.DebugFlags.MayMoreStack
+	ctxt.Debugpcln = flags.DebugFlags.PCTab
 	ctxt.IsAsm = true
 	ctxt.Pkgpath = *flags.Importpath
 	switch *flags.Spectre {
diff --git a/src/cmd/buildid/buildid.go b/src/cmd/buildid/buildid.go
index 8e02a7a..72ad80d 100644
--- a/src/cmd/buildid/buildid.go
+++ b/src/cmd/buildid/buildid.go
@@ -53,6 +53,11 @@
 		log.Fatal(err)
 	}
 
+	// <= go 1.7 doesn't embed the contentID or actionID, so no slash is present
+	if !strings.Contains(id, "/") {
+		log.Fatalf("%s: build ID is a legacy format...binary too old for this tool", file)
+	}
+
 	newID := id[:strings.LastIndex(id, "/")] + "/" + buildid.HashToString(hash)
 	if len(newID) != len(id) {
 		log.Fatalf("%s: build ID length mismatch %q vs %q", file, id, newID)
diff --git a/src/cmd/buildid/doc.go b/src/cmd/buildid/doc.go
index d1ec155..a554d79 100644
--- a/src/cmd/buildid/doc.go
+++ b/src/cmd/buildid/doc.go
@@ -6,6 +6,7 @@
 Buildid displays or updates the build ID stored in a Go package or binary.
 
 Usage:
+
 	go tool buildid [-w] file
 
 By default, buildid prints the build ID found in the named file.
diff --git a/src/cmd/cgo/doc.go b/src/cmd/cgo/doc.go
index a6787f6..7fb6179 100644
--- a/src/cmd/cgo/doc.go
+++ b/src/cmd/cgo/doc.go
@@ -3,10 +3,9 @@
 // license that can be found in the LICENSE file.
 
 /*
-
 Cgo enables the creation of Go packages that call C code.
 
-Using cgo with the go command
+# Using cgo with the go command
 
 To use cgo write normal Go code that imports a pseudo-package "C".
 The Go code can then refer to types such as C.size_t, variables such
@@ -91,11 +90,11 @@
 directory and linked properly.
 For example if package foo is in the directory /go/src/foo:
 
-       // #cgo LDFLAGS: -L${SRCDIR}/libs -lfoo
+	// #cgo LDFLAGS: -L${SRCDIR}/libs -lfoo
 
 Will be expanded to:
 
-       // #cgo LDFLAGS: -L/go/src/foo/libs -lfoo
+	// #cgo LDFLAGS: -L/go/src/foo/libs -lfoo
 
 When the Go tool sees that one or more Go files use the special import
 "C", it will look for other non-Go files in the directory and compile
@@ -139,7 +138,7 @@
 The CXX_FOR_TARGET, CXX_FOR_${GOOS}_${GOARCH}, and CXX
 environment variables work in a similar way for C++ code.
 
-Go references to C
+# Go references to C
 
 Within the Go file, C's struct field names that are keywords in Go
 can be accessed by prefixing them with an underscore: if x points at a C
@@ -291,7 +290,7 @@
 of memory. Because C.malloc cannot fail, it has no two-result form
 that returns errno.
 
-C references to Go
+# C references to Go
 
 Go functions can be exported for use by C code in the following way:
 
@@ -327,7 +326,7 @@
 duplicate symbols and the linker will fail. To avoid this, definitions
 must be placed in preambles in other files, or in C source files.
 
-Passing pointers
+# Passing pointers
 
 Go is a garbage collected language, and the garbage collector needs to
 know the location of every pointer to Go memory. Because of this,
@@ -398,7 +397,7 @@
 store pointer values in it. Zero out the memory in C before passing it
 to Go.
 
-Special cases
+# Special cases
 
 A few special C types which would normally be represented by a pointer
 type in Go are instead represented by a uintptr. Those include:
@@ -449,9 +448,10 @@
 
 	go tool fix -r eglconf <pkg>
 
-Using cgo directly
+# Using cgo directly
 
 Usage:
+
 	go tool cgo [cgo options] [-- compiler options] gofiles...
 
 Cgo transforms the specified input Go source files into several output
@@ -753,6 +753,16 @@
 	_go_.o        # gc-compiled object for _cgo_gotypes.go, _cgo_import.go, *.cgo1.go
 	_all.o        # gcc-compiled object for _cgo_export.c, *.cgo2.c
 
+If there is an error generating the _cgo_import.go file, then, instead
+of adding _cgo_import.go to the package, the go tool adds an empty
+file named dynimportfail. The _cgo_import.go file is only needed when
+using internal linking mode, which is not the default when linking
+programs that use cgo (as described below). If the linker sees a file
+named dynimportfail it reports an error if it has been told to use
+internal linking mode. This approach is taken because generating
+_cgo_import.go requires doing a full C link of the package, which can
+fail for reasons that are irrelevant when using external linking mode.
+
 The final program will be a dynamic executable, so that cmd/link can avoid
 needing to process arbitrary .o files. It only needs to process the .o
 files generated from C files that cgo writes, and those are much more
diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go
index 92d4780..d89bff2 100644
--- a/src/cmd/cgo/gcc.go
+++ b/src/cmd/cgo/gcc.go
@@ -114,12 +114,11 @@
 //
 // For example, the following string:
 //
-//     `a b:"c d" 'e''f'  "g\""`
+//	`a b:"c d" 'e''f'  "g\""`
 //
 // Would be parsed as:
 //
-//     []string{"a", "b:c d", "ef", `g"`}
-//
+//	[]string{"a", "b:c d", "ef", `g"`}
 func splitQuoted(s string) (r []string, err error) {
 	var args []string
 	arg := make([]rune, len(s))
@@ -489,7 +488,7 @@
 		// Check if compiling the preamble by itself causes any errors,
 		// because the messages we've printed out so far aren't helpful
 		// to users debugging preamble mistakes. See issue 8442.
-		preambleErrors := p.gccErrors([]byte(f.Preamble))
+		preambleErrors := p.gccErrors([]byte(builtinProlog + f.Preamble))
 		if len(preambleErrors) > 0 {
 			error_(token.NoPos, "\n%s errors for preamble:\n%s", gccBaseCmd[0], preambleErrors)
 		}
@@ -827,6 +826,7 @@
 
 	params := name.FuncType.Params
 	args := call.Call.Args
+	end := call.Call.End()
 
 	// Avoid a crash if the number of arguments doesn't match
 	// the number of parameters.
@@ -974,7 +974,7 @@
 	if nu {
 		needsUnsafe = true
 	}
-	sb.WriteString(gofmtLine(m))
+	sb.WriteString(gofmtPos(m, end))
 
 	sb.WriteString("(")
 	for i := range params {
@@ -1153,13 +1153,19 @@
 
 // checkIndex checks whether arg has the form &a[i], possibly inside
 // type conversions. If so, then in the general case it writes
-//    _cgoIndexNN := a
-//    _cgoNN := &cgoIndexNN[i] // with type conversions, if any
+//
+//	_cgoIndexNN := a
+//	_cgoNN := &cgoIndexNN[i] // with type conversions, if any
+//
 // to sb, and writes
-//    _cgoCheckPointer(_cgoNN, _cgoIndexNN)
+//
+//	_cgoCheckPointer(_cgoNN, _cgoIndexNN)
+//
 // to sbCheck, and returns true. If a is a simple variable or field reference,
 // it writes
-//    _cgoIndexNN := &a
+//
+//	_cgoIndexNN := &a
+//
 // and dereferences the uses of _cgoIndexNN. Taking the address avoids
 // making a copy of an array.
 //
@@ -1207,10 +1213,14 @@
 
 // checkAddr checks whether arg has the form &x, possibly inside type
 // conversions. If so, it writes
-//    _cgoBaseNN := &x
-//    _cgoNN := _cgoBaseNN // with type conversions, if any
+//
+//	_cgoBaseNN := &x
+//	_cgoNN := _cgoBaseNN // with type conversions, if any
+//
 // to sb, and writes
-//    _cgoCheckPointer(_cgoBaseNN, true)
+//
+//	_cgoCheckPointer(_cgoBaseNN, true)
+//
 // to sbCheck, and returns true. This tells _cgoCheckPointer to check
 // just the contents of the pointer being passed, not any other part
 // of the memory allocation. This is run after checkIndex, which looks
@@ -1628,6 +1638,8 @@
 		} else if gomips == "softfloat" {
 			return []string{"-mabi=32", "-msoft-float"}
 		}
+	case "loong64":
+		return []string{"-mabi=lp64d"}
 	}
 	return nil
 }
@@ -1819,6 +1831,23 @@
 		bo := f.ByteOrder
 		symtab, err := f.Symbols()
 		if err == nil {
+			// Check for use of -fsanitize=hwaddress (issue 53285).
+			removeTag := func(v uint64) uint64 { return v }
+			if goarch == "arm64" {
+				for i := range symtab {
+					if symtab[i].Name == "__hwasan_init" {
+						// -fsanitize=hwaddress on ARM
+						// uses the upper byte of a
+						// memory address as a hardware
+						// tag. Remove it so that
+						// we can find the associated
+						// data.
+						removeTag = func(v uint64) uint64 { return v &^ (0xff << (64 - 8)) }
+						break
+					}
+				}
+			}
+
 			for i := range symtab {
 				s := &symtab[i]
 				switch {
@@ -1826,9 +1855,10 @@
 					// Found it. Now find data section.
 					if i := int(s.Section); 0 <= i && i < len(f.Sections) {
 						sect := f.Sections[i]
-						if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+						val := removeTag(s.Value)
+						if sect.Addr <= val && val < sect.Addr+sect.Size {
 							if sdat, err := sect.Data(); err == nil {
-								data := sdat[s.Value-sect.Addr:]
+								data := sdat[val-sect.Addr:]
 								ints = make([]int64, len(data)/8)
 								for i := range ints {
 									ints[i] = int64(bo.Uint64(data[i*8:]))
@@ -1840,9 +1870,10 @@
 					// Found it. Now find data section.
 					if i := int(s.Section); 0 <= i && i < len(f.Sections) {
 						sect := f.Sections[i]
-						if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+						val := removeTag(s.Value)
+						if sect.Addr <= val && val < sect.Addr+sect.Size {
 							if sdat, err := sect.Data(); err == nil {
-								data := sdat[s.Value-sect.Addr:]
+								data := sdat[val-sect.Addr:]
 								floats = make([]float64, len(data)/8)
 								for i := range floats {
 									floats[i] = math.Float64frombits(bo.Uint64(data[i*8:]))
@@ -1855,9 +1886,10 @@
 						// Found it. Now find data section.
 						if i := int(s.Section); 0 <= i && i < len(f.Sections) {
 							sect := f.Sections[i]
-							if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+							val := removeTag(s.Value)
+							if sect.Addr <= val && val < sect.Addr+sect.Size {
 								if sdat, err := sect.Data(); err == nil {
-									data := sdat[s.Value-sect.Addr:]
+									data := sdat[val-sect.Addr:]
 									strdata[n] = string(data)
 								}
 							}
@@ -1868,9 +1900,10 @@
 						// Found it. Now find data section.
 						if i := int(s.Section); 0 <= i && i < len(f.Sections) {
 							sect := f.Sections[i]
-							if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+							val := removeTag(s.Value)
+							if sect.Addr <= val && val < sect.Addr+sect.Size {
 								if sdat, err := sect.Data(); err == nil {
-									data := sdat[s.Value-sect.Addr:]
+									data := sdat[val-sect.Addr:]
 									strlen := bo.Uint64(data[:8])
 									if strlen > (1<<(uint(p.IntSize*8)-1) - 1) { // greater than MaxInt?
 										fatalf("string literal too big")
@@ -2230,6 +2263,8 @@
 	"long long unsigned int": "ulonglong",
 	"signed char":            "schar",
 	"unsigned char":          "uchar",
+	"unsigned long":          "ulong",     // Used by Clang 14; issue 53013.
+	"unsigned long long":     "ulonglong", // Used by Clang 14; issue 53013.
 }
 
 const signedDelta = 64
@@ -2516,6 +2551,11 @@
 		t.Go = name // publish before recursive calls
 		goIdent[name.Name] = name
 		if dt.ByteSize < 0 {
+			// Don't override old type
+			if _, ok := typedef[name.Name]; ok {
+				break
+			}
+
 			// Size calculation in c.Struct/c.Opaque will die with size=-1 (unknown),
 			// so execute the basic things that the struct case would do
 			// other than try to determine a Go representation.
diff --git a/src/cmd/cgo/godefs.go b/src/cmd/cgo/godefs.go
index c0d59ae..3a27b31 100644
--- a/src/cmd/cgo/godefs.go
+++ b/src/cmd/cgo/godefs.go
@@ -16,11 +16,11 @@
 )
 
 // godefs returns the output for -godefs mode.
-func (p *Package) godefs(f *File) string {
+func (p *Package) godefs(f *File, args []string) string {
 	var buf bytes.Buffer
 
 	fmt.Fprintf(&buf, "// Code generated by cmd/cgo -godefs; DO NOT EDIT.\n")
-	fmt.Fprintf(&buf, "// %s %s\n", filepath.Base(os.Args[0]), strings.Join(os.Args[1:], " "))
+	fmt.Fprintf(&buf, "// %s %s\n", filepath.Base(args[0]), strings.Join(args[1:], " "))
 	fmt.Fprintf(&buf, "\n")
 
 	override := make(map[string]string)
diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go
index 14642b7..e343459 100644
--- a/src/cmd/cgo/main.go
+++ b/src/cmd/cgo/main.go
@@ -11,7 +11,6 @@
 package main
 
 import (
-	"crypto/md5"
 	"flag"
 	"fmt"
 	"go/ast"
@@ -28,6 +27,7 @@
 	"strings"
 
 	"cmd/internal/edit"
+	"cmd/internal/notsha256"
 	"cmd/internal/objabi"
 )
 
@@ -175,6 +175,7 @@
 	"amd64":    8,
 	"arm":      4,
 	"arm64":    8,
+	"loong64":  8,
 	"m68k":     4,
 	"mips":     4,
 	"mipsle":   4,
@@ -200,6 +201,7 @@
 	"amd64":    8,
 	"arm":      4,
 	"arm64":    8,
+	"loong64":  8,
 	"m68k":     4,
 	"mips":     4,
 	"mipsle":   4,
@@ -291,6 +293,10 @@
 		usage()
 	}
 
+	// Save original command line arguments for the godefs generated comment. Relative file
+	// paths in os.Args will be rewritten to absolute file paths in the loop below.
+	osArgs := make([]string, len(os.Args))
+	copy(osArgs, os.Args[:])
 	goFiles := args[i:]
 
 	for _, arg := range args[:i] {
@@ -325,8 +331,8 @@
 	// we use to coordinate between gcc and ourselves.
 	// We already put _cgo_ at the beginning, so the main
 	// concern is other cgo wrappers for the same functions.
-	// Use the beginning of the md5 of the input to disambiguate.
-	h := md5.New()
+	// Use the beginning of the notsha256 of the input to disambiguate.
+	h := notsha256.New()
 	io.WriteString(h, *importPath)
 	fs := make([]*File, len(goFiles))
 	for i, input := range goFiles {
@@ -390,7 +396,7 @@
 		p.PackagePath = f.Package
 		p.Record(f)
 		if *godefs {
-			os.Stdout.WriteString(p.godefs(f))
+			os.Stdout.WriteString(p.godefs(f, osArgs))
 		} else {
 			p.writeOutput(f, input)
 		}
diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go
index 4968f70..119eca2 100644
--- a/src/cmd/cgo/out.go
+++ b/src/cmd/cgo/out.go
@@ -14,10 +14,10 @@
 	"go/ast"
 	"go/printer"
 	"go/token"
-	exec "internal/execabs"
 	"internal/xcoff"
 	"io"
 	"os"
+	"os/exec"
 	"path/filepath"
 	"regexp"
 	"sort"
@@ -57,18 +57,19 @@
 	fflg.Close()
 
 	// Write C main file for using gcc to resolve imports.
+	fmt.Fprintf(fm, "#include <stddef.h>\n") // For size_t below.
 	fmt.Fprintf(fm, "int main() { return 0; }\n")
 	if *importRuntimeCgo {
-		fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*) __attribute__((unused)), void *a __attribute__((unused)), int c __attribute__((unused)), __SIZE_TYPE__ ctxt __attribute__((unused))) { }\n")
-		fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done(void) { return 0; }\n")
-		fmt.Fprintf(fm, "void _cgo_release_context(__SIZE_TYPE__ ctxt __attribute__((unused))) { }\n")
+		fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*) __attribute__((unused)), void *a __attribute__((unused)), int c __attribute__((unused)), size_t ctxt __attribute__((unused))) { }\n")
+		fmt.Fprintf(fm, "size_t _cgo_wait_runtime_init_done(void) { return 0; }\n")
+		fmt.Fprintf(fm, "void _cgo_release_context(size_t ctxt __attribute__((unused))) { }\n")
 		fmt.Fprintf(fm, "char* _cgo_topofstack(void) { return (char*)0; }\n")
 	} else {
 		// If we're not importing runtime/cgo, we *are* runtime/cgo,
 		// which provides these functions. We just need a prototype.
-		fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*), void *a, int c, __SIZE_TYPE__ ctxt);\n")
-		fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done(void);\n")
-		fmt.Fprintf(fm, "void _cgo_release_context(__SIZE_TYPE__);\n")
+		fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*), void *a, int c, size_t ctxt);\n")
+		fmt.Fprintf(fm, "size_t _cgo_wait_runtime_init_done(void);\n")
+		fmt.Fprintf(fm, "void _cgo_release_context(size_t);\n")
 	}
 	fmt.Fprintf(fm, "void _cgo_allocate(void *a __attribute__((unused)), int c __attribute__((unused))) { }\n")
 	fmt.Fprintf(fm, "void _cgo_panic(void *a __attribute__((unused)), int c __attribute__((unused))) { }\n")
@@ -173,7 +174,7 @@
 				// the external linker will add DT_NEEDED
 				// entries as needed on ELF systems.
 				// Treat function variables differently
-				// to avoid type confict errors from LTO
+				// to avoid type conflict errors from LTO
 				// (Link Time Optimization).
 				if n.Kind == "fpvar" {
 					fmt.Fprintf(fm, "extern void %s();\n", n.C)
@@ -886,9 +887,9 @@
 	fmt.Fprintf(fgcc, "#pragma GCC diagnostic ignored \"-Wpragmas\"\n")
 	fmt.Fprintf(fgcc, "#pragma GCC diagnostic ignored \"-Waddress-of-packed-member\"\n")
 
-	fmt.Fprintf(fgcc, "extern void crosscall2(void (*fn)(void *), void *, int, __SIZE_TYPE__);\n")
-	fmt.Fprintf(fgcc, "extern __SIZE_TYPE__ _cgo_wait_runtime_init_done(void);\n")
-	fmt.Fprintf(fgcc, "extern void _cgo_release_context(__SIZE_TYPE__);\n\n")
+	fmt.Fprintf(fgcc, "extern void crosscall2(void (*fn)(void *), void *, int, size_t);\n")
+	fmt.Fprintf(fgcc, "extern size_t _cgo_wait_runtime_init_done(void);\n")
+	fmt.Fprintf(fgcc, "extern void _cgo_release_context(size_t);\n\n")
 	fmt.Fprintf(fgcc, "extern char* _cgo_topofstack(void);")
 	fmt.Fprintf(fgcc, "%s\n", tsanProlog)
 	fmt.Fprintf(fgcc, "%s\n", msanProlog)
@@ -992,7 +993,7 @@
 		fmt.Fprintf(fgcc, "\nCGO_NO_SANITIZE_THREAD")
 		fmt.Fprintf(fgcc, "\n%s\n", s)
 		fmt.Fprintf(fgcc, "{\n")
-		fmt.Fprintf(fgcc, "\t__SIZE_TYPE__ _cgo_ctxt = _cgo_wait_runtime_init_done();\n")
+		fmt.Fprintf(fgcc, "\tsize_t _cgo_ctxt = _cgo_wait_runtime_init_done();\n")
 		// The results part of the argument structure must be
 		// initialized to 0 so the write barriers generated by
 		// the assignments to these fields in Go are safe.
@@ -1398,6 +1399,19 @@
 	case *ast.ChanType:
 		return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("GoChan")}
 	case *ast.Ident:
+		goTypesFixup := func(r *Type) *Type {
+			if r.Size == 0 { // int or uint
+				rr := new(Type)
+				*rr = *r
+				rr.Size = p.IntSize
+				rr.Align = p.IntSize
+				r = rr
+			}
+			if r.Align > p.PtrSize {
+				r.Align = p.PtrSize
+			}
+			return r
+		}
 		// Look up the type in the top level declarations.
 		// TODO: Handle types defined within a function.
 		for _, d := range p.Decl {
@@ -1416,6 +1430,17 @@
 			}
 		}
 		if def := typedef[t.Name]; def != nil {
+			if defgo, ok := def.Go.(*ast.Ident); ok {
+				switch defgo.Name {
+				case "complex64", "complex128":
+					// MSVC does not support the _Complex keyword
+					// nor the complex macro.
+					// Use GoComplex64 and GoComplex128 instead,
+					// which are typedef-ed to a compatible type.
+					// See go.dev/issues/36233.
+					return goTypesFixup(goTypes[defgo.Name])
+				}
+			}
 			return def
 		}
 		if t.Name == "uintptr" {
@@ -1429,17 +1454,7 @@
 			return &Type{Size: 2 * p.PtrSize, Align: p.PtrSize, C: c("GoInterface")}
 		}
 		if r, ok := goTypes[t.Name]; ok {
-			if r.Size == 0 { // int or uint
-				rr := new(Type)
-				*rr = *r
-				rr.Size = p.IntSize
-				rr.Align = p.IntSize
-				r = rr
-			}
-			if r.Align > p.PtrSize {
-				r.Align = p.PtrSize
-			}
-			return r
+			return goTypesFixup(r)
 		}
 		error_(e.Pos(), "unrecognized Go type %s", t.Name)
 		return &Type{Size: 4, Align: 4, C: c("int")}
@@ -1561,7 +1576,7 @@
 
 const builtinProlog = `
 #line 1 "cgo-builtin-prolog"
-#include <stddef.h> /* for ptrdiff_t and size_t below */
+#include <stddef.h>
 
 /* Define intgo when compiling with GCC.  */
 typedef ptrdiff_t intgo;
@@ -1604,6 +1619,7 @@
 //go:linkname _cgo_runtime_gostring runtime.gostring
 func _cgo_runtime_gostring(*_Ctype_char) string
 
+// GoString converts the C string p into a Go string.
 func _Cfunc_GoString(p *_Ctype_char) string {
 	return _cgo_runtime_gostring(p)
 }
@@ -1613,6 +1629,7 @@
 //go:linkname _cgo_runtime_gostringn runtime.gostringn
 func _cgo_runtime_gostringn(*_Ctype_char, int) string
 
+// GoStringN converts the C data p with explicit length l to a Go string.
 func _Cfunc_GoStringN(p *_Ctype_char, l _Ctype_int) string {
 	return _cgo_runtime_gostringn(p, int(l))
 }
@@ -1622,26 +1639,52 @@
 //go:linkname _cgo_runtime_gobytes runtime.gobytes
 func _cgo_runtime_gobytes(unsafe.Pointer, int) []byte
 
+// GoBytes converts the C data p with explicit length l to a Go []byte.
 func _Cfunc_GoBytes(p unsafe.Pointer, l _Ctype_int) []byte {
 	return _cgo_runtime_gobytes(p, int(l))
 }
 `
 
 const cStringDef = `
+// CString converts the Go string s to a C string.
+//
+// The C string is allocated in the C heap using malloc.
+// It is the caller's responsibility to arrange for it to be
+// freed, such as by calling C.free (be sure to include stdlib.h
+// if C.free is needed).
 func _Cfunc_CString(s string) *_Ctype_char {
+	if len(s)+1 <= 0 {
+		panic("string too large")
+	}
 	p := _cgo_cmalloc(uint64(len(s)+1))
-	pp := (*[1<<30]byte)(p)
-	copy(pp[:], s)
-	pp[len(s)] = 0
+	sliceHeader := struct {
+		p   unsafe.Pointer
+		len int
+		cap int
+	}{p, len(s)+1, len(s)+1}
+	b := *(*[]byte)(unsafe.Pointer(&sliceHeader))
+	copy(b, s)
+	b[len(s)] = 0
 	return (*_Ctype_char)(p)
 }
 `
 
 const cBytesDef = `
+// CBytes converts the Go []byte slice b to a C array.
+//
+// The C array is allocated in the C heap using malloc.
+// It is the caller's responsibility to arrange for it to be
+// freed, such as by calling C.free (be sure to include stdlib.h
+// if C.free is needed).
 func _Cfunc_CBytes(b []byte) unsafe.Pointer {
 	p := _cgo_cmalloc(uint64(len(b)))
-	pp := (*[1<<30]byte)(p)
-	copy(pp[:], b)
+	sliceHeader := struct {
+		p   unsafe.Pointer
+		len int
+		cap int
+	}{p, len(b), len(b)}
+	s := *(*[]byte)(unsafe.Pointer(&sliceHeader))
+	copy(s, b)
 	return p
 }
 `
@@ -1830,7 +1873,7 @@
 const builtinExportProlog = `
 #line 1 "cgo-builtin-export-prolog"
 
-#include <stddef.h> /* for ptrdiff_t below */
+#include <stddef.h>
 
 #ifndef GO_CGO_EXPORT_PROLOGUE_H
 #define GO_CGO_EXPORT_PROLOGUE_H
@@ -1876,11 +1919,17 @@
 typedef unsigned long long GoUint64;
 typedef GoIntGOINTBITS GoInt;
 typedef GoUintGOINTBITS GoUint;
-typedef __SIZE_TYPE__ GoUintptr;
+typedef size_t GoUintptr;
 typedef float GoFloat32;
 typedef double GoFloat64;
+#ifdef _MSC_VER
+#include <complex.h>
+typedef _Fcomplex GoComplex64;
+typedef _Dcomplex GoComplex128;
+#else
 typedef float _Complex GoComplex64;
 typedef double _Complex GoComplex128;
+#endif
 
 /*
   static assertion to make sure the file is being used on architecture
@@ -1926,5 +1975,5 @@
 		runtime_iscgo = 1;
 }
 
-extern __SIZE_TYPE__ _cgo_wait_runtime_init_done(void) __attribute__ ((weak));
+extern size_t _cgo_wait_runtime_init_done(void) __attribute__ ((weak));
 `
diff --git a/src/cmd/cgo/util.go b/src/cmd/cgo/util.go
index 00d931b..779f7be 100644
--- a/src/cmd/cgo/util.go
+++ b/src/cmd/cgo/util.go
@@ -8,9 +8,9 @@
 	"bytes"
 	"fmt"
 	"go/token"
-	exec "internal/execabs"
 	"io/ioutil"
 	"os"
+	"os/exec"
 )
 
 // run runs the command argv, feeding in stdin on standard input.
diff --git a/src/cmd/compile/README.md b/src/cmd/compile/README.md
index 25fa818..9c4eeeb 100644
--- a/src/cmd/compile/README.md
+++ b/src/cmd/compile/README.md
@@ -15,10 +15,12 @@
 phases we are going to list here. A third term, "middle-end", often refers to
 much of the work that happens in the second phase.
 
-Note that the `go/*` family of packages, such as `go/parser` and `go/types`,
-have no relation to the compiler. Since the compiler was initially written in C,
-the `go/*` packages were developed to enable writing tools working with Go code,
-such as `gofmt` and `vet`.
+Note that the `go/*` family of packages, such as `go/parser` and
+`go/types`, are mostly unused by the compiler. Since the compiler was
+initially written in C, the `go/*` packages were developed to enable
+writing tools working with Go code, such as `gofmt` and `vet`.
+However, over time the compiler's internal APIs have slowly evolved to
+be more familiar to users of the `go/*` packages.
 
 It should be clarified that the name "gc" stands for "Go compiler", and has
 little to do with uppercase "GC", which stands for garbage collection.
@@ -36,33 +38,71 @@
 declarations, and statements. The syntax tree also includes position information
 which is used for error reporting and the creation of debugging information.
 
-### 2. Type-checking and AST transformations
+### 2. Type checking
 
-* `cmd/compile/internal/gc` (create compiler AST, type checking, AST transformations)
+* `cmd/compile/internal/types2` (type checking)
 
-The gc package includes its own AST definition carried over from when it was written
-in C. All of its code is written in terms of this AST, so the first thing that the gc
-package must do is convert the syntax package's syntax tree to the compiler's
-AST representation. This extra step may be refactored away in the future.
+The types2 package is a port of `go/types` to use the syntax package's
+AST instead of `go/ast`.
 
-The gc AST is then type-checked. The first steps are name resolution and type
-inference, which determine which object belongs to which identifier, and what
-type each expression has. Type-checking includes certain extra checks, such as
-"declared and not used" as well as determining whether or not a function
-terminates.
+### 3. IR construction ("noding")
 
-Certain transformations are also done on the AST. Some nodes are refined based
-on type information, such as string additions being split from the arithmetic
-addition node type. Some other examples are dead code elimination, function call
+* `cmd/compile/internal/types` (compiler types)
+* `cmd/compile/internal/ir` (compiler AST)
+* `cmd/compile/internal/typecheck` (AST transformations)
+* `cmd/compile/internal/noder` (create compiler AST)
+
+The compiler middle end uses its own AST definition and representation of Go
+types carried over from when it was written in C. All of its code is written in
+terms of these, so the next step after type checking is to convert the syntax
+and types2 representations to ir and types. This process is referred to as
+"noding."
+
+There are currently two noding implementations:
+
+1. irgen (aka "-G=3" or sometimes "noder2") is the implementation used starting
+   with Go 1.18, and
+
+2. Unified IR is another, in-development implementation (enabled with
+   `GOEXPERIMENT=unified`), which also implements import/export and inlining.
+
+Up through Go 1.18, there was a third noding implementation (just
+"noder" or "-G=0"), which directly converted the pre-type-checked
+syntax representation into IR and then invoked package typecheck's
+type checker. This implementation was removed after Go 1.18, so now
+package typecheck is only used for IR transformations.
+
+### 4. Middle end
+
+* `cmd/compile/internal/deadcode` (dead code elimination)
+* `cmd/compile/internal/inline` (function call inlining)
+* `cmd/compile/internal/devirtualize` (devirtualization of known interface method calls)
+* `cmd/compile/internal/escape` (escape analysis)
+
+Several optimization passes are performed on the IR representation:
+dead code elimination, (early) devirtualization, function call
 inlining, and escape analysis.
 
-### 3. Generic SSA
+### 5. Walk
 
-* `cmd/compile/internal/gc` (converting to SSA)
+* `cmd/compile/internal/walk` (order of evaluation, desugaring)
+
+The final pass over the IR representation is "walk," which serves two purposes:
+
+1. It decomposes complex statements into individual, simpler statements,
+   introducing temporary variables and respecting order of evaluation. This step
+   is also referred to as "order."
+
+2. It desugars higher-level Go constructs into more primitive ones. For example,
+   `switch` statements are turned into binary search or jump tables, and
+   operations on maps and channels are replaced with runtime calls.
+
+### 6. Generic SSA
+
 * `cmd/compile/internal/ssa` (SSA passes and rules)
+* `cmd/compile/internal/ssagen` (converting IR to SSA)
 
-
-In this phase, the AST is converted into Static Single Assignment (SSA) form, a
+In this phase, IR is converted into Static Single Assignment (SSA) form, a
 lower-level intermediate representation with specific properties that make it
 easier to implement optimizations and to eventually generate machine code from
 it.
@@ -84,7 +124,7 @@
 mainly concern expressions, such as replacing some expressions with constant
 values, and optimizing multiplications and float operations.
 
-### 4. Generating machine code
+### 7. Generating machine code
 
 * `cmd/compile/internal/ssa` (SSA lowering and arch-specific passes)
 * `cmd/internal/obj` (machine code generation)
diff --git a/src/cmd/compile/abi-internal.md b/src/cmd/compile/abi-internal.md
index 53eaa84..14464ed 100644
--- a/src/cmd/compile/abi-internal.md
+++ b/src/cmd/compile/abi-internal.md
@@ -1,5 +1,7 @@
 # Go internal ABI specification
 
+Self-link: [go.dev/s/regabi](https://go.dev/s/regabi)
+
 This document describes Go’s internal application binary interface
 (ABI), known as ABIInternal.
 Go's ABI defines the layout of data in memory and the conventions for
@@ -30,19 +32,19 @@
 Those that aren't guaranteed may change in future versions of Go (for
 example, we've considered changing the alignment of int64 on 32-bit).
 
-| Type | 64-bit |       | 32-bit |       |
-| ---  | ---    | ---   | ---    | ---   |
-|      | Size   | Align | Size   | Align |
-| bool, uint8, int8  | 1  | 1 | 1  | 1 |
-| uint16, int16      | 2  | 2 | 2  | 2 |
-| uint32, int32      | 4  | 4 | 4  | 4 |
-| uint64, int64      | 8  | 8 | 8  | 4 |
-| int, uint          | 8  | 8 | 4  | 4 |
-| float32            | 4  | 4 | 4  | 4 |
-| float64            | 8  | 8 | 8  | 4 |
-| complex64          | 8  | 4 | 8  | 4 |
-| complex128         | 16 | 8 | 16 | 4 |
-| uintptr, *T, unsafe.Pointer | 8 | 8 | 4 | 4 |
+| Type                        | 64-bit |       | 32-bit |       |
+|-----------------------------|--------|-------|--------|-------|
+|                             | Size   | Align | Size   | Align |
+| bool, uint8, int8           | 1      | 1     | 1      | 1     |
+| uint16, int16               | 2      | 2     | 2      | 2     |
+| uint32, int32               | 4      | 4     | 4      | 4     |
+| uint64, int64               | 8      | 8     | 8      | 4     |
+| int, uint                   | 8      | 8     | 4      | 4     |
+| float32                     | 4      | 4     | 4      | 4     |
+| float64                     | 8      | 8     | 8      | 4     |
+| complex64                   | 8      | 4     | 8      | 4     |
+| complex128                  | 16     | 8     | 16     | 4     |
+| uintptr, *T, unsafe.Pointer | 8      | 8     | 4      | 4     |
 
 The types `byte` and `rune` are aliases for `uint8` and `int32`,
 respectively, and hence have the same size and alignment as these
@@ -730,6 +732,57 @@
 to 0 by the kernel at startup of the Go program and not changed by
 the Go generated code.
 
+### riscv64 architecture
+
+The riscv64 architecture uses X10 – X17, X8, X9, X18 – X23 for integer arguments
+and results.
+
+It uses F10 – F17, F8, F9, F18 – F23 for floating-point arguments and results.
+
+Special-purpose registers used within Go generated code and Go
+assembly code are as follows:
+
+| Register | Call meaning | Return meaning | Body meaning |
+| --- | --- | --- | --- |
+| X0  | Zero value | Same | Same |
+| X1  | Link register | Link register | Scratch |
+| X2  | Stack pointer | Same | Same |
+| X3  | Global pointer | Same | Used by dynamic linker |
+| X4  | TLS (thread pointer) | TLS | Scratch |
+| X24,X25 | Scratch | Scratch | Used by duffcopy, duffzero |
+| X26 | Closure context pointer | Scratch | Scratch |
+| X27 | Current goroutine | Same | Same |
+| X31 | Scratch | Scratch | Scratch |
+
+*Rationale*: These register meanings are compatible with Go’s
+stack-based calling convention. Context register X20 will change to X26,
+duffcopy, duffzero register will change to X24, X25 before this register ABI been adopted.
+X10 – X17, X8, X9, X18 – X23, is the same order as A0 – A7, S0 – S7 in platform ABI.
+F10 – F17, F8, F9, F18 – F23, is the same order as FA0 – FA7, FS0 – FS7 in platform ABI.
+X8 – X23, F8 – F15 are used for compressed instruction (RVC) which will benefit code size in the future.
+
+#### Stack layout
+
+The stack pointer, X2, grows down and is aligned to 8 bytes.
+
+A function's stack frame, after the frame is created, is laid out as
+follows:
+
+    +------------------------------+
+    | ... locals ...               |
+    | ... outgoing arguments ...   |
+    | return PC                    | ← X2 points to
+    +------------------------------+ ↓ lower addresses
+
+The "return PC" is loaded to the link register, X1, as part of the
+riscv64 `CALL` operation.
+
+#### Flags
+
+The riscv64 has Zicsr extension for control and status register (CSR) and
+treated as scratch register.
+All bits in CSR are system flags and are not modified by Go.
+
 ## Future directions
 
 ### Spill path improvements
diff --git a/src/cmd/compile/doc.go b/src/cmd/compile/doc.go
index ef7fa86..60e1263 100644
--- a/src/cmd/compile/doc.go
+++ b/src/cmd/compile/doc.go
@@ -68,9 +68,6 @@
 	-importcfg file
 		Read import configuration from file.
 		In the file, set importmap, packagefile to specify import resolution.
-	-importmap old=new
-		Interpret import "old" as import "new" during compilation.
-		The option may be repeated to add multiple mappings.
 	-installsuffix suffix
 		Look for packages in $GOROOT/pkg/$GOOS_$GOARCH_suffix
 		instead of $GOROOT/pkg/$GOOS_$GOARCH.
@@ -219,11 +216,13 @@
 	//go:uintptrescapes
 
 The //go:uintptrescapes directive must be followed by a function declaration.
-It specifies that the function's uintptr arguments may be pointer values
-that have been converted to uintptr and must be treated as such by the
-garbage collector. The conversion from pointer to uintptr must appear in
-the argument list of any call to this function. This directive is necessary
-for some low-level system call implementations and should be avoided otherwise.
+It specifies that the function's uintptr arguments may be pointer values that
+have been converted to uintptr and must be on the heap and kept alive for the
+duration of the call, even though from the types alone it would appear that the
+object is no longer needed during the call. The conversion from pointer to
+uintptr must appear in the argument list of any call to this function. This
+directive is necessary for some low-level system call implementations and
+should be avoided otherwise.
 
 	//go:noinline
 
diff --git a/src/cmd/compile/internal/abi/abiutils.go b/src/cmd/compile/internal/abi/abiutils.go
index 529150a..aa5063f 100644
--- a/src/cmd/compile/internal/abi/abiutils.go
+++ b/src/cmd/compile/internal/abi/abiutils.go
@@ -258,7 +258,7 @@
 // by the ABI rules for parameter passing and result returning.
 type ABIConfig struct {
 	// Do we need anything more than this?
-	offsetForLocals  int64 // e.g., obj.(*Link).FixedFrameSize() -- extra linkage information on some architectures.
+	offsetForLocals  int64 // e.g., obj.(*Link).Arch.FixedFrameSize -- extra linkage information on some architectures.
 	regAmounts       RegAmounts
 	regsForTypeCache map[*types.Type]int
 }
@@ -788,12 +788,12 @@
 // field. For things that are not structs (or structs without padding)
 // it returns a list of zeros. Example:
 //
-// type small struct {
-//   x uint16
-//   y uint8
-//   z int32
-//   w int32
-// }
+//	type small struct {
+//		x uint16
+//		y uint8
+//		z int32
+//		w int32
+//	}
 //
 // For this struct we would return a list [0, 1, 0, 0], meaning that
 // we have one byte of padding after the second field, and no bytes of
diff --git a/src/cmd/compile/internal/abt/avlint32.go b/src/cmd/compile/internal/abt/avlint32.go
new file mode 100644
index 0000000..00bbccf
--- /dev/null
+++ b/src/cmd/compile/internal/abt/avlint32.go
@@ -0,0 +1,849 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package abt
+
+import (
+	"fmt"
+	"strconv"
+)
+
+const (
+	LEAF_HEIGHT = 1
+	ZERO_HEIGHT = 0
+	NOT_KEY32   = int32(-0x80000000)
+)
+
+// T is the exported applicative balanced tree data type.
+// A T can be used as a value; updates to one copy of the value
+// do not change other copies.
+type T struct {
+	root *node32
+	size int
+}
+
+// node32 is the internal tree node data type
+type node32 struct {
+	// Standard conventions hold for left = smaller, right = larger
+	left, right *node32
+	data        interface{}
+	key         int32
+	height_     int8
+}
+
+func makeNode(key int32) *node32 {
+	return &node32{key: key, height_: LEAF_HEIGHT}
+}
+
+// IsSingle returns true iff t is empty.
+func (t *T) IsEmpty() bool {
+	return t.root == nil
+}
+
+// IsSingle returns true iff t is a singleton (leaf).
+func (t *T) IsSingle() bool {
+	return t.root != nil && t.root.isLeaf()
+}
+
+// VisitInOrder applies f to the key and data pairs in t,
+// with keys ordered from smallest to largest.
+func (t *T) VisitInOrder(f func(int32, interface{})) {
+	if t.root == nil {
+		return
+	}
+	t.root.visitInOrder(f)
+}
+
+func (n *node32) nilOrData() interface{} {
+	if n == nil {
+		return nil
+	}
+	return n.data
+}
+
+func (n *node32) nilOrKeyAndData() (k int32, d interface{}) {
+	if n == nil {
+		k = NOT_KEY32
+		d = nil
+	} else {
+		k = n.key
+		d = n.data
+	}
+	return
+}
+
+func (n *node32) height() int8 {
+	if n == nil {
+		return 0
+	}
+	return n.height_
+}
+
+// Find returns the data associated with x in the tree, or
+// nil if x is not in the tree.
+func (t *T) Find(x int32) interface{} {
+	return t.root.find(x).nilOrData()
+}
+
+// Insert either adds x to the tree if x was not previously
+// a key in the tree, or updates the data for x in the tree if
+// x was already a key in the tree.  The previous data associated
+// with x is returned, and is nil if x was not previously a
+// key in the tree.
+func (t *T) Insert(x int32, data interface{}) interface{} {
+	if x == NOT_KEY32 {
+		panic("Cannot use sentinel value -0x80000000 as key")
+	}
+	n := t.root
+	var newroot *node32
+	var o *node32
+	if n == nil {
+		n = makeNode(x)
+		newroot = n
+	} else {
+		newroot, n, o = n.aInsert(x)
+	}
+	var r interface{}
+	if o != nil {
+		r = o.data
+	} else {
+		t.size++
+	}
+	n.data = data
+	t.root = newroot
+	return r
+}
+
+func (t *T) Copy() *T {
+	u := *t
+	return &u
+}
+
+func (t *T) Delete(x int32) interface{} {
+	n := t.root
+	if n == nil {
+		return nil
+	}
+	d, s := n.aDelete(x)
+	if d == nil {
+		return nil
+	}
+	t.root = s
+	t.size--
+	return d.data
+}
+
+func (t *T) DeleteMin() (int32, interface{}) {
+	n := t.root
+	if n == nil {
+		return NOT_KEY32, nil
+	}
+	d, s := n.aDeleteMin()
+	if d == nil {
+		return NOT_KEY32, nil
+	}
+	t.root = s
+	t.size--
+	return d.key, d.data
+}
+
+func (t *T) DeleteMax() (int32, interface{}) {
+	n := t.root
+	if n == nil {
+		return NOT_KEY32, nil
+	}
+	d, s := n.aDeleteMax()
+	if d == nil {
+		return NOT_KEY32, nil
+	}
+	t.root = s
+	t.size--
+	return d.key, d.data
+}
+
+func (t *T) Size() int {
+	return t.size
+}
+
+// Intersection returns the intersection of t and u, where the result
+// data for any common keys is given by f(t's data, u's data) -- f need
+// not be symmetric.  If f returns nil, then the key and data are not
+// added to the result.  If f itself is nil, then whatever value was
+// already present in the smaller set is used.
+func (t *T) Intersection(u *T, f func(x, y interface{}) interface{}) *T {
+	if t.Size() == 0 || u.Size() == 0 {
+		return &T{}
+	}
+
+	// For faster execution and less allocation, prefer t smaller, iterate over t.
+	if t.Size() <= u.Size() {
+		v := t.Copy()
+		for it := t.Iterator(); !it.Done(); {
+			k, d := it.Next()
+			e := u.Find(k)
+			if e == nil {
+				v.Delete(k)
+				continue
+			}
+			if f == nil {
+				continue
+			}
+			if c := f(d, e); c != d {
+				if c == nil {
+					v.Delete(k)
+				} else {
+					v.Insert(k, c)
+				}
+			}
+		}
+		return v
+	}
+	v := u.Copy()
+	for it := u.Iterator(); !it.Done(); {
+		k, e := it.Next()
+		d := t.Find(k)
+		if d == nil {
+			v.Delete(k)
+			continue
+		}
+		if f == nil {
+			continue
+		}
+		if c := f(d, e); c != d {
+			if c == nil {
+				v.Delete(k)
+			} else {
+				v.Insert(k, c)
+			}
+		}
+	}
+
+	return v
+}
+
+// Union returns the union of t and u, where the result data for any common keys
+// is given by f(t's data, u's data) -- f need not be symmetric.  If f returns nil,
+// then the key and data are not added to the result.  If f itself is nil, then
+// whatever value was already present in the larger set is used.
+func (t *T) Union(u *T, f func(x, y interface{}) interface{}) *T {
+	if t.Size() == 0 {
+		return u
+	}
+	if u.Size() == 0 {
+		return t
+	}
+
+	if t.Size() >= u.Size() {
+		v := t.Copy()
+		for it := u.Iterator(); !it.Done(); {
+			k, e := it.Next()
+			d := t.Find(k)
+			if d == nil {
+				v.Insert(k, e)
+				continue
+			}
+			if f == nil {
+				continue
+			}
+			if c := f(d, e); c != d {
+				if c == nil {
+					v.Delete(k)
+				} else {
+					v.Insert(k, c)
+				}
+			}
+		}
+		return v
+	}
+
+	v := u.Copy()
+	for it := t.Iterator(); !it.Done(); {
+		k, d := it.Next()
+		e := u.Find(k)
+		if e == nil {
+			v.Insert(k, d)
+			continue
+		}
+		if f == nil {
+			continue
+		}
+		if c := f(d, e); c != d {
+			if c == nil {
+				v.Delete(k)
+			} else {
+				v.Insert(k, c)
+			}
+		}
+	}
+	return v
+}
+
+// Difference returns the difference of t and u, subject to the result
+// of f applied to data corresponding to equal keys.  If f returns nil
+// (or if f is nil) then the key+data are excluded, as usual.  If f
+// returns not-nil, then that key+data pair is inserted. instead.
+func (t *T) Difference(u *T, f func(x, y interface{}) interface{}) *T {
+	if t.Size() == 0 {
+		return &T{}
+	}
+	if u.Size() == 0 {
+		return t
+	}
+	v := t.Copy()
+	for it := t.Iterator(); !it.Done(); {
+		k, d := it.Next()
+		e := u.Find(k)
+		if e != nil {
+			if f == nil {
+				v.Delete(k)
+				continue
+			}
+			c := f(d, e)
+			if c == nil {
+				v.Delete(k)
+				continue
+			}
+			if c != d {
+				v.Insert(k, c)
+			}
+		}
+	}
+	return v
+}
+
+func (t *T) Iterator() Iterator {
+	return Iterator{it: t.root.iterator()}
+}
+
+func (t *T) Equals(u *T) bool {
+	if t == u {
+		return true
+	}
+	if t.Size() != u.Size() {
+		return false
+	}
+	return t.root.equals(u.root)
+}
+
+// This doesn't build with go1.4, sigh
+// func (t *T) String() string {
+// 	var b strings.Builder
+// 	first := true
+// 	for it := t.Iterator(); !it.IsEmpty(); {
+// 		k, v := it.Next()
+// 		if first {
+// 			first = false
+// 		} else {
+// 			b.WriteString("; ")
+// 		}
+// 		b.WriteString(strconv.FormatInt(int64(k), 10))
+// 		b.WriteString(":")
+// 		b.WriteString(v.String())
+// 	}
+// 	return b.String()
+// }
+
+func (t *T) String() string {
+	var b string
+	first := true
+	for it := t.Iterator(); !it.Done(); {
+		k, v := it.Next()
+		if first {
+			first = false
+		} else {
+			b += ("; ")
+		}
+		b += (strconv.FormatInt(int64(k), 10))
+		b += (":")
+		b += fmt.Sprint(v)
+	}
+	return b
+}
+
+func (t *node32) equals(u *node32) bool {
+	if t == u {
+		return true
+	}
+	it, iu := t.iterator(), u.iterator()
+	for !it.done() && !iu.done() {
+		nt := it.next()
+		nu := iu.next()
+		if nt == nu {
+			continue
+		}
+		if nt.key != nu.key {
+			return false
+		}
+		if nt.data != nu.data {
+			return false
+		}
+	}
+	return it.done() == iu.done()
+}
+
+func (t *T) Equiv(u *T, eqv func(x, y interface{}) bool) bool {
+	if t == u {
+		return true
+	}
+	if t.Size() != u.Size() {
+		return false
+	}
+	return t.root.equiv(u.root, eqv)
+}
+
+func (t *node32) equiv(u *node32, eqv func(x, y interface{}) bool) bool {
+	if t == u {
+		return true
+	}
+	it, iu := t.iterator(), u.iterator()
+	for !it.done() && !iu.done() {
+		nt := it.next()
+		nu := iu.next()
+		if nt == nu {
+			continue
+		}
+		if nt.key != nu.key {
+			return false
+		}
+		if !eqv(nt.data, nu.data) {
+			return false
+		}
+	}
+	return it.done() == iu.done()
+}
+
+type iterator struct {
+	parents []*node32
+}
+
+type Iterator struct {
+	it iterator
+}
+
+func (it *Iterator) Next() (int32, interface{}) {
+	x := it.it.next()
+	if x == nil {
+		return NOT_KEY32, nil
+	}
+	return x.key, x.data
+}
+
+func (it *Iterator) Done() bool {
+	return len(it.it.parents) == 0
+}
+
+func (t *node32) iterator() iterator {
+	if t == nil {
+		return iterator{}
+	}
+	it := iterator{parents: make([]*node32, 0, int(t.height()))}
+	it.leftmost(t)
+	return it
+}
+
+func (it *iterator) leftmost(t *node32) {
+	for t != nil {
+		it.parents = append(it.parents, t)
+		t = t.left
+	}
+}
+
+func (it *iterator) done() bool {
+	return len(it.parents) == 0
+}
+
+func (it *iterator) next() *node32 {
+	l := len(it.parents)
+	if l == 0 {
+		return nil
+	}
+	x := it.parents[l-1] // return value
+	if x.right != nil {
+		it.leftmost(x.right)
+		return x
+	}
+	// discard visited top of parents
+	l--
+	it.parents = it.parents[:l]
+	y := x // y is known visited/returned
+	for l > 0 && y == it.parents[l-1].right {
+		y = it.parents[l-1]
+		l--
+		it.parents = it.parents[:l]
+	}
+
+	return x
+}
+
+// Min returns the minimum element of t.
+// If t is empty, then (NOT_KEY32, nil) is returned.
+func (t *T) Min() (k int32, d interface{}) {
+	return t.root.min().nilOrKeyAndData()
+}
+
+// Max returns the maximum element of t.
+// If t is empty, then (NOT_KEY32, nil) is returned.
+func (t *T) Max() (k int32, d interface{}) {
+	return t.root.max().nilOrKeyAndData()
+}
+
+// Glb returns the greatest-lower-bound-exclusive of x and the associated
+// data.  If x has no glb in the tree, then (NOT_KEY32, nil) is returned.
+func (t *T) Glb(x int32) (k int32, d interface{}) {
+	return t.root.glb(x, false).nilOrKeyAndData()
+}
+
+// GlbEq returns the greatest-lower-bound-inclusive of x and the associated
+// data.  If x has no glbEQ in the tree, then (NOT_KEY32, nil) is returned.
+func (t *T) GlbEq(x int32) (k int32, d interface{}) {
+	return t.root.glb(x, true).nilOrKeyAndData()
+}
+
+// Lub returns the least-upper-bound-exclusive of x and the associated
+// data.  If x has no lub in the tree, then (NOT_KEY32, nil) is returned.
+func (t *T) Lub(x int32) (k int32, d interface{}) {
+	return t.root.lub(x, false).nilOrKeyAndData()
+}
+
+// LubEq returns the least-upper-bound-inclusive of x and the associated
+// data.  If x has no lubEq in the tree, then (NOT_KEY32, nil) is returned.
+func (t *T) LubEq(x int32) (k int32, d interface{}) {
+	return t.root.lub(x, true).nilOrKeyAndData()
+}
+
+func (t *node32) isLeaf() bool {
+	return t.left == nil && t.right == nil && t.height_ == LEAF_HEIGHT
+}
+
+func (t *node32) visitInOrder(f func(int32, interface{})) {
+	if t.left != nil {
+		t.left.visitInOrder(f)
+	}
+	f(t.key, t.data)
+	if t.right != nil {
+		t.right.visitInOrder(f)
+	}
+}
+
+func (t *node32) find(key int32) *node32 {
+	for t != nil {
+		if key < t.key {
+			t = t.left
+		} else if key > t.key {
+			t = t.right
+		} else {
+			return t
+		}
+	}
+	return nil
+}
+
+func (t *node32) min() *node32 {
+	if t == nil {
+		return t
+	}
+	for t.left != nil {
+		t = t.left
+	}
+	return t
+}
+
+func (t *node32) max() *node32 {
+	if t == nil {
+		return t
+	}
+	for t.right != nil {
+		t = t.right
+	}
+	return t
+}
+
+func (t *node32) glb(key int32, allow_eq bool) *node32 {
+	var best *node32 = nil
+	for t != nil {
+		if key <= t.key {
+			if allow_eq && key == t.key {
+				return t
+			}
+			// t is too big, glb is to left.
+			t = t.left
+		} else {
+			// t is a lower bound, record it and seek a better one.
+			best = t
+			t = t.right
+		}
+	}
+	return best
+}
+
+func (t *node32) lub(key int32, allow_eq bool) *node32 {
+	var best *node32 = nil
+	for t != nil {
+		if key >= t.key {
+			if allow_eq && key == t.key {
+				return t
+			}
+			// t is too small, lub is to right.
+			t = t.right
+		} else {
+			// t is a upper bound, record it and seek a better one.
+			best = t
+			t = t.left
+		}
+	}
+	return best
+}
+
+func (t *node32) aInsert(x int32) (newroot, newnode, oldnode *node32) {
+	// oldnode default of nil is good, others should be assigned.
+	if x == t.key {
+		oldnode = t
+		newt := *t
+		newnode = &newt
+		newroot = newnode
+		return
+	}
+	if x < t.key {
+		if t.left == nil {
+			t = t.copy()
+			n := makeNode(x)
+			t.left = n
+			newnode = n
+			newroot = t
+			t.height_ = 2 // was balanced w/ 0, sibling is height 0 or 1
+			return
+		}
+		var new_l *node32
+		new_l, newnode, oldnode = t.left.aInsert(x)
+		t = t.copy()
+		t.left = new_l
+		if new_l.height() > 1+t.right.height() {
+			newroot = t.aLeftIsHigh(newnode)
+		} else {
+			t.height_ = 1 + max(t.left.height(), t.right.height())
+			newroot = t
+		}
+	} else { // x > t.key
+		if t.right == nil {
+			t = t.copy()
+			n := makeNode(x)
+			t.right = n
+			newnode = n
+			newroot = t
+			t.height_ = 2 // was balanced w/ 0, sibling is height 0 or 1
+			return
+		}
+		var new_r *node32
+		new_r, newnode, oldnode = t.right.aInsert(x)
+		t = t.copy()
+		t.right = new_r
+		if new_r.height() > 1+t.left.height() {
+			newroot = t.aRightIsHigh(newnode)
+		} else {
+			t.height_ = 1 + max(t.left.height(), t.right.height())
+			newroot = t
+		}
+	}
+	return
+}
+
+func (t *node32) aDelete(key int32) (deleted, newSubTree *node32) {
+	if t == nil {
+		return nil, nil
+	}
+
+	if key < t.key {
+		oh := t.left.height()
+		d, tleft := t.left.aDelete(key)
+		if tleft == t.left {
+			return d, t
+		}
+		return d, t.copy().aRebalanceAfterLeftDeletion(oh, tleft)
+	} else if key > t.key {
+		oh := t.right.height()
+		d, tright := t.right.aDelete(key)
+		if tright == t.right {
+			return d, t
+		}
+		return d, t.copy().aRebalanceAfterRightDeletion(oh, tright)
+	}
+
+	if t.height() == LEAF_HEIGHT {
+		return t, nil
+	}
+
+	// Interior delete by removing left.Max or right.Min,
+	// then swapping contents
+	if t.left.height() > t.right.height() {
+		oh := t.left.height()
+		d, tleft := t.left.aDeleteMax()
+		r := t
+		t = t.copy()
+		t.data, t.key = d.data, d.key
+		return r, t.aRebalanceAfterLeftDeletion(oh, tleft)
+	}
+
+	oh := t.right.height()
+	d, tright := t.right.aDeleteMin()
+	r := t
+	t = t.copy()
+	t.data, t.key = d.data, d.key
+	return r, t.aRebalanceAfterRightDeletion(oh, tright)
+}
+
+func (t *node32) aDeleteMin() (deleted, newSubTree *node32) {
+	if t == nil {
+		return nil, nil
+	}
+	if t.left == nil { // leaf or left-most
+		return t, t.right
+	}
+	oh := t.left.height()
+	d, tleft := t.left.aDeleteMin()
+	if tleft == t.left {
+		return d, t
+	}
+	return d, t.copy().aRebalanceAfterLeftDeletion(oh, tleft)
+}
+
+func (t *node32) aDeleteMax() (deleted, newSubTree *node32) {
+	if t == nil {
+		return nil, nil
+	}
+
+	if t.right == nil { // leaf or right-most
+		return t, t.left
+	}
+
+	oh := t.right.height()
+	d, tright := t.right.aDeleteMax()
+	if tright == t.right {
+		return d, t
+	}
+	return d, t.copy().aRebalanceAfterRightDeletion(oh, tright)
+}
+
+func (t *node32) aRebalanceAfterLeftDeletion(oldLeftHeight int8, tleft *node32) *node32 {
+	t.left = tleft
+
+	if oldLeftHeight == tleft.height() || oldLeftHeight == t.right.height() {
+		// this node is still balanced and its height is unchanged
+		return t
+	}
+
+	if oldLeftHeight > t.right.height() {
+		// left was larger
+		t.height_--
+		return t
+	}
+
+	// left height fell by 1 and it was already less than right height
+	t.right = t.right.copy()
+	return t.aRightIsHigh(nil)
+}
+
+func (t *node32) aRebalanceAfterRightDeletion(oldRightHeight int8, tright *node32) *node32 {
+	t.right = tright
+
+	if oldRightHeight == tright.height() || oldRightHeight == t.left.height() {
+		// this node is still balanced and its height is unchanged
+		return t
+	}
+
+	if oldRightHeight > t.left.height() {
+		// left was larger
+		t.height_--
+		return t
+	}
+
+	// right height fell by 1 and it was already less than left height
+	t.left = t.left.copy()
+	return t.aLeftIsHigh(nil)
+}
+
+// aRightIsHigh does rotations necessary to fix a high right child